📄 rabbit_catv.c
字号:
/*******************************************************************************
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 + -