⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rabbit_catv.c

📁 公司开发的CATV网管系统Rabbit2000的源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
  WATCH_SYSTEM	有线电视监控

  上海复高(Fugle)信息技术有限公司
  编写人:朱明

*******************************************************************************/
#memmap xmem

typedef	unsigned int	WORD;
typedef	unsigned long	DWORD;
typedef	char			BYTE;

#define	TEST
		 
#ifndef TEST
//	#nodebug
#endif

#define	UDP_BUF_SIZE		2048

#define MAX_UDP_SOCKET_BUFFERS		6

#define	MY_IP_ADDRESS		"81.168.0.32"
#define	MYIPADDRESS			(81UL << 24) + (168UL << 16) + (0UL << 8) + 32UL
#define	TESTIP				(81UL << 24) + (81UL << 16) + (81UL << 8) + 87UL

#define	MY_NETMASK			"255.0.0.0"

#define	UDP_TESTPORT		6650				//测试消息(UDP)端口
#define	UDP_PORT			2002				//数据(UDP)端口
#define FLASH_PORT			2003
#define FALSHDATALEN		18

#use dcrtcp.lib
#use BSDNAME.LIB

int testflag;

#define UDPSENDPACKETSIZE 22
#define UDPFIFOSIZE		28
#define FIFOBUFFERSIZE  280

unsigned char udp_send_buf[100];				//发送UDP一包
unsigned char udp_recv_buf[100];				//接收UDP一包

unsigned char UDPFIFO[FIFOBUFFERSIZE];				//存储UDP包的队列缓冲区
int  nUdpFIFOHead, nUdpFIFOTrail, nUdpFIFOEmpty;	//DSP接收队列头、尾、空标志

udp_Socket ulisten, usend, utest, uflash;			//UDP数据包,传送和接收语音, us_send, UDP Test数据包,传送操作消息

typedef struct 
{
	unsigned short			Flag;			//标志符号,0xed08
	unsigned long			PacketID;		//查询包ID号,查询方生成,应答方直接返回
	unsigned long			DeviceID;		//设备ID号
	unsigned long			ch;				//通道号,仅当Code=3时有效
	unsigned char			Code;			//查询参数,0-光发射机,1-光接收机常规参数, 2-光接收机输出电平参数
	char					reserved[7];	//保留
}QUERY;

QUERY QUERY_info;

typedef struct 
{
	unsigned short			Flag;			//标志符号,0xed08
	unsigned long			PacketID;	//查询包ID号,客户方生成,服务方直接返回
	unsigned long			DeviceID;	//设备ID号
	unsigned long			ch;			//通道号,仅当Code=3时有效
	unsigned char			Code;			//查询参数,0-光发射机,1-光接收机常规参数, 2-光接收机输出电平参数

	union
	{
		//光发射机
		struct
		{
			float				SCGGL;		//输出光功率
			float				KZDL;		//控制电流
			float				MKWD;		//模块温度
			float				ZLDL;		//制冷电流
			float				SRDP;		//输入电平
		}GFSJ;
		//光接收机
		struct
		{
			float				JNDY24;		//机内电源+24V
			float				JNDY12;		//机内电源+12V
			float				SRGGL;		//输入光功率
			long				JG;			//机盖
			float				WDJC;			//温度检测
			float				DY60FZ;		//60V负载检测
			float				DY60V;		//60V电源检测

		}GJSJ;
		//光接收机输出电平
		struct
		{
			float				DP;			//输出电平
			char				Reserved[20];
		}GJSJDP;
	}PARAMS;
}RESPOND;

RESPOND RESPOND_info;

//typedef struct {
	char m_id[6];							//监控机ID号
	DWORD m_ip;								//监控机IP地址
	DWORD m_mask;							//监控机掩码地址
	DWORD m_gateway;						//监控机缺省网关
/*
}WS_info;

WS_info *ipp;
*/
/*****************************函数声明********************/
int start_init();
int checkDSPok();						//复位DSP
void writetodsp(int channle);
int my_isr(void);
void testmsg(char *);
cofunc int CommandReceive(udp_Socket *pus);
cofunc int recieveOnePocket(tcp_Socket *pts, char *prec);
int udpFIFOin( char *inFIFO );
int UdpFIFOout( char *outFIFO );
cofunc int ProcPacket();
int readfromflash();
int flashtoPC(DWORD m_ip, word m_port);
int get_data(int DD[]);
/**********************************************************/

CoData Listen;								//监听任务
CoData CollectData;
char bigbuf[8192];
int channle;
unsigned char c;

int dd6;

main()
{
	int wd;
	int i,len;
	char buf[100];
	start_init();

/**************初始化频道扫描**************/
	checkDSPok();
	channle = 1;
	query(channle);

	WrPortI( I0CR, NULL, 0x00 );				// disable external interrupt 0
	WrPortI( I1CR, NULL, 0x00 );				// disable external interrupt 1
/***************************************/
start:

		
	sock_init();

	sock_abort(&ulisten);
	sock_abort(&usend);
	sock_abort(&utest);
	sock_abort(&uflash);

	CoReset(&Listen);
	CoReset(&CollectData);

	nUdpFIFOHead = 0;
	nUdpFIFOTrail = 0;
	nUdpFIFOEmpty = TRUE;


/**********************打开监控口UDP包*********************/
#ifdef TEST		
	if ( !udp_open( &utest, 0, TESTIP, UDP_TESTPORT, NULL) )
	{
		testflag = 0;
	}
	else{
		testflag = 1;
	}
#endif

	readfromflash();
	
/*********************打开监听的UDP端口*******************/

	//打开UDP接收包
	while ( !udp_open(&ulisten, UDP_PORT, -1, UDP_PORT, NULL) ){

	}

/*********************************************************/
#ifdef TEST
	testmsg("开始");
#endif

	CoBegin(&Listen);
	CoBegin(&CollectData);

	wd  = VdGetFreeWd(97);

	while(1)
	{
	
		costate {
			VdHitWd(wd);
		}
		

		costate Listen {
			
			wfd i = CommandReceive(&ulisten);

			if(i == 0)
			{
#ifdef TEST	
				testmsg("一个包接收失败");
#endif
			}

			if(i == 2){
#ifdef TEST	
				testmsg("重新初始化FLASH");
#endif
				goto start;
			}

			CoBegin(&Listen);

		}

		costate CollectData {
			wfd i = ProcPacket();

			if( i == 0)
			{
#ifdef TEST	
				testmsg("一个包处理失败!");
#endif
			}

			CoBegin(&CollectData);
		}

	}

}

cofunc int CommandReceive(udp_Socket *pus )		//收到一个包
{
	int len;
	sockaddr ListenSocket;
	char linkip[16];
	char ss[100];
	longword remip;
	word remport;

	DWORD m_ip;

	sock_mode( pus, UDP_MODE_NOCHK );

	while(1){
		tcp_tick(NULL);

		len = udp_recvfrom(&ulisten, udp_recv_buf, sizeof(udp_recv_buf), &remip, &remport);
		
		if( len >0 )
		{
			if(udp_recv_buf[0] == 0x08 & udp_recv_buf[1] == 0xed & len == 22)
				break;

			if(udp_recv_buf[0] == 0x66 & udp_recv_buf[1] == 0x66 & len == 2)
				flashtoPC(remip, remport);

			if(udp_recv_buf[0] == 0x77 & udp_recv_buf[1] == 0x77 & len == 20)
			{
				if(PCtoflash(remip, remport))
					return 2;
			}
		}
		yield;
	}

	inet_ntoa( linkip, remip );

#ifdef TEST	
	strcpy(ss, "监听到一个网络连接: ");
	strcat(ss, linkip);
	strcat(ss, "\n");
	testmsg(ss);

	sprintf(ss, "端口号是:%u\n", remport);
	testmsg(ss);
#endif

	memcpy(&udp_recv_buf[22], &remip, 4);
	memcpy(&udp_recv_buf[26], &remport, 2);
		
	if(!udpFIFOin( udp_recv_buf ))
		return 0;

	return 1;
}



void testmsg(char *msg)
{
#ifdef TEST
	auto int retval;
	auto struct tm t;
	char sss[200];
	int i;

	tm_rd(&t);

	memcpy(sss, m_id, 6);
	
	sss[6] = '\0';
	
	strcat(sss, ":	");
	strcat(sss, msg);
	strcat(sss,"\n");

//发送
	if ( testflag ){

		retval = udp_send(&utest, sss, strlen(sss));
		if (retval < 0) {
			testflag = 0;
			udp_close( &utest );
		}
	}

#endif
}


int udpFIFOin( char *inFIFO )
{
	auto int i;

	if(!nUdpFIFOEmpty){
		if(nUdpFIFOHead == nUdpFIFOTrail){
			return 0;
		}
	}

	for( i = 0; i < UDPFIFOSIZE; i++){
		UDPFIFO[nUdpFIFOHead + i] = inFIFO[i];
	}

	nUdpFIFOHead += UDPFIFOSIZE;
	if( nUdpFIFOHead >= FIFOBUFFERSIZE - 1 ){
		nUdpFIFOHead = 0;
	}

	nUdpFIFOEmpty = FALSE;

	return 1;
}

int UdpFIFOout( char *outFIFO )					
{
	auto int i;

	if(nUdpFIFOEmpty){
		return 0;
	}
	for( i = 0; i < UDPFIFOSIZE; i++ ){
		outFIFO[i] = UDPFIFO[nUdpFIFOTrail + i];
	}

	nUdpFIFOTrail += UDPFIFOSIZE;

	if(nUdpFIFOTrail >= FIFOBUFFERSIZE-1){
		nUdpFIFOTrail = 0;
	}
	
	if(nUdpFIFOTrail == nUdpFIFOHead){
		nUdpFIFOEmpty = TRUE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -