📄 rabbit_catv.c
字号:
}
return UDPFIFOSIZE;
}
cofunc int ProcPacket()
{
DWORD m_ip;
word m_port;
unsigned long t0;
int i,len;
char ss[100];
int dd[6];
float m_allvalue1,m_allvalue2;
float m_dy60fz, m_dy60v;
m_allvalue1 = 0;
m_allvalue2 = 0;
if(nUdpFIFOEmpty) //如果队列中没有包,则可成功返回
return 1;
if(!UdpFIFOout(udp_send_buf))
return 0;
memcpy((unsigned char *) &RESPOND_info, udp_send_buf, 15); //把头部读入
memcpy(&m_ip, &udp_send_buf[22], 4);
memcpy(&m_port, &udp_send_buf[26], 2);
/**************先暂时模拟从硬件读数据的过程**************/
if(RESPOND_info.Code == 0) //光发射机
{
if (get_data(dd))
{
start_init();
#ifdef TEST
testmsg("读取数据失败!\n");
#endif
return 0; //处理一个包失败了.
}
// for (i=0;i<6;i++) printf(" %d ,",dd[i]);
RESPOND_info.PARAMS.GFSJ.SCGGL = dd[0];
RESPOND_info.PARAMS.GFSJ.KZDL = dd[1];
RESPOND_info.PARAMS.GFSJ.MKWD = dd[2];
RESPOND_info.PARAMS.GFSJ.ZLDL = dd[3];
RESPOND_info.PARAMS.GFSJ.SRDP = 0; //先把电平设为0;
if( (dd[0] < 225) || (dd[0] > 275) )
WrPortI( PCDR, &PCDRShadow, (PCDRShadow | 0x01) ); //不正常时置高
else
WrPortI( PCDR, &PCDRShadow, (PCDRShadow & 0xfe) ); //正常时置低
}else if(RESPOND_info.Code == 1) //光接收机
{
for( i =0; i<500; i++)
{
if (get_data(dd))
{
#ifdef TEST
testmsg("Failure");
#endif
}
m_allvalue1 += abs(dd[5]-655);
m_allvalue2 += abs(dd6-655);
}
m_dy60fz = m_allvalue1/500;
m_dy60v = m_allvalue2/500;
// for (i=0;i<6;i++) printf(" %d ,",dd[i]);
RESPOND_info.PARAMS.GJSJ.JNDY24 = dd[0];
RESPOND_info.PARAMS.GJSJ.JNDY12 = dd[1];
RESPOND_info.PARAMS.GJSJ.SRGGL = dd[2];
RESPOND_info.PARAMS.GJSJ.JG = dd[3];
RESPOND_info.PARAMS.GJSJ.WDJC = dd[4];
RESPOND_info.PARAMS.GJSJ.DY60FZ = (long)(m_dy60fz);
RESPOND_info.PARAMS.GJSJ.DY60V = (long)(m_dy60v);
}else if(RESPOND_info.Code == 2) //返回频道的频率
{
channle = (int)RESPOND_info.ch;
// channle = 0;
if(query(channle))
{
testmsg("查询频道成功!");
RESPOND_info.PARAMS.GJSJDP.DP = c;
// printf(" %d ", c);
}
else
{
testmsg("查询频道失败!");
return 0; // 处理失败
}
}
/********************************************************/
t0 = SEC_TIMER;
while( !udp_open( &usend, UDP_PORT, m_ip, m_port, NULL) )
{
if( SEC_TIMER - t0 > 2 ) { //如果2秒钟未打开端口,则超时退出
#ifdef TEST
testmsg("2秒钟未打开端口,则超时退出");
#endif
return 0;
};
yield;
}
memcpy( udp_send_buf, (unsigned char *) &RESPOND_info, sizeof(RESPOND) );
len = udp_send(&usend, udp_send_buf, sizeof(RESPOND));
if(len < 0 )
{
#ifdef TEST
testmsg("发送失败!\n");
#endif
return 0;
}
sock_close(&usend);
return 1;
}
#ximport "ws.bin" icinfofile
int readfromflash()
{
auto int i;
auto DWORD ip_gate;
auto char s[18];
auto unsigned char test[100];
i = xmem2root( test, icinfofile + 4, 18);
if( i < 0 ) return i;
memcpy(m_id, test, 6);
memcpy(&m_ip, &test[6], 4);
inet_ntoa(s, m_ip);
sethostid( m_ip );
memcpy(&m_mask, &test[10], 4);
inet_ntoa(s, m_mask);
tcp_config(NETMASK, s);
memcpy(&m_gateway, &test[14], 4);
inet_ntoa(s, m_gateway);
tcp_config(GATEWAY, s);
return 1;
}
int flashtoPC( DWORD m_ip, word m_port)
{
auto int len, i;
auto char flag;
auto DWORD t0;
auto unsigned char buf[30];
t0 = SEC_TIMER;
while( !udp_open( &uflash, UDP_PORT, m_ip, m_port, NULL) )
{
if( SEC_TIMER - t0 > 2 ) { //如果2秒钟未打开端口,则超时退出
#ifdef TEST
testmsg("2秒钟未打开端口,则超时退出");
#endif
return 0;
}
}
xmem2root( buf, icinfofile + 4, FALSHDATALEN);
len = udp_send(&uflash, buf, FALSHDATALEN);
sock_close(&uflash);
return 1;
}
int PCtoflash( DWORD m_ip, word m_port)
{
auto int len, i;
auto char flag;
auto DWORD t0;
auto unsigned char buf[30];
if(WriteFlash(icinfofile + 4, &udp_recv_buf[2], FALSHDATALEN)!= 0)
return 0;
t0 = SEC_TIMER;
while( !udp_open( &uflash, UDP_PORT, m_ip, m_port, NULL) )
{
if( SEC_TIMER - t0 > 2 ) { //如果2秒钟未打开端口,则超时退出
#ifdef TEST
testmsg("2秒钟未打开端口,则超时退出");
#endif
return 0;
}
}
buf[0] = 0x88;
buf[1] = 0x88;
len = udp_send(&uflash, buf, 2);
return 1;
}
int get_data(int DD[]) {
int i,j,cnt,DD_TMP[8];
WrPortI (PDDR, &PDDRShadow, (PDDRShadow | 0x40)); //write EPLD begin , so the MAX192 start working
WrPortI (PDDR, &PDDRShadow, (PDDRShadow & 0xbf)); //write EPLD end
for (cnt=0;cnt<8;cnt++)
{
for (j=0;j<1000;j++)
{
i = ((RdPortI(PBDR)) & 0x01);
if (i==0x01) j=1000; //data is ready for rabbit reading
else
{
if (j>900) //timeout and exit
{
printf("timeout while receive the data from EPLD.\n");
return (1);
}
}
}
DD_TMP[cnt] = (((RdPortI(PDDR) & 0x03) << 8) | ((RdPortI(PADR) & 0xff)));
WrPortI (PDDR, &PDDRShadow, (PDDRShadow | 0x20)); //read EPLD begin , so the MAX192 continue working
WrPortI (PDDR, &PDDRShadow, (PDDRShadow & 0xdf)); // read end
}
DD[0] = DD_TMP[0];
DD[1] = DD_TMP[4];
DD[2] = DD_TMP[1];
DD[3] = DD_TMP[5];
DD[4] = DD_TMP[2];
DD[5] = DD_TMP[6];
dd6 = DD_TMP[3];
return(0);
}
int my_isr()
{
auto unsigned long t0;
// unsigned char c;
WrPortI (PDDR,&PDDRShadow, PDDRShadow & 0xef);
t0 = SEC_TIMER;
while(1)
{
//访问HPIA,置读地址
WrPortE ( 0x4004, NULL, 0x01 );
WrPortE ( 0x4005, NULL, 0x10 );
c = RdPortE(0x400a) & 0xff; // & 0xff; // 0x400a是低位,0x400b是高位
if( c == channle)
break;
if(SEC_TIMER - t0 > 1)
{
WrPortI (PDDR,&PDDRShadow, PDDRShadow | 0x10);
return 0; //不成功
}
}
c = RdPortE(0x400b) & 0xff; // & 0xff; // 0x400a是低位,0x400b是高位
WrPortE( 0x4004, NULL, 0x01 );
WrPortE( 0x4005, NULL, 0x0f );
WrPortE(0x4008, NULL, 0xff);
WrPortE(0x4009, NULL, 0xff);
WrPortI (PDDR,&PDDRShadow, PDDRShadow | 0x10);
return 1; //成功
}
int start_init()
{
auto int i;
// initial the PORTs
WrPortI ( GOCR, &GOCRShadow, (GOCRShadow & 0x3F) ); //系统时钟输出 CLK: 18.432MHz
// WrPortI ( WDTTR, NULL, 0x51 ); //关闭WatchDog (加上看门狗)
// WrPortI ( WDTTR, NULL, 0x54 ); //
WrPortI ( PDDR, &PDDRShadow, 0x00 ); // set PORT D all '0' for output
WrPortI ( PDDDR, NULL, 0xfc); //set PD[7:2] as output, PD[1:0] as input
WrPortI ( PDDR, &PDDRShadow, (PDDRShadow | 0x00)); //set PD2 as '0'
WrPortI ( PDDR, &PDDRShadow, (PDDRShadow | 0x04)); //set PD2 as '1'
WrPortI ( PDDR, &PDDRShadow, (PDDRShadow | 0x80)); //set PD7 as '1', reset EPLD begin
WrPortI ( SPCR, NULL, 0x80 ); //关闭SLAVE PORT,控制 PORT A 为字节输入
WrPortI ( PADR, &PADRShadow, 0x00 );
WrPortI ( PDDR, &PDDRShadow, (PDDRShadow & 0x7f)); //set PD7 as '0', reset EPLD end
WrPortI( PEFR, &PEFRShadow, (PEFRShadow | 0x04) );
WrPortI( IB2CR, &IB2CRShadow, 0xf8 ); //原0xc8,修改日期:2002.07.15
WrPortI( PEDDR, &PEDDRShadow, (PEDDRShadow | 0x04) );
WrPortI( PCDR, &PCDRShadow, (PCDRShadow & 0xfe) ); //正常时置低
return 1;
}
int checkDSPok() //复位DSP
{
int i;
// WrPortI (PDDR,&PDDRShadow, PDDRShadow & 0xef);
WrPortI (PDDR,&PDDRShadow, PDDRShadow & 0xf7);
for (i=0;i<1000;i++);
WrPortI (PDDR,&PDDRShadow, PDDRShadow | 0x08);
// WrPortI (PDDR,&PDDRShadow, PDDRShadow | 0x10);
for (i=0;i<30000;i++); //延时
}
void writetodsp(int channle)
{
int i,c;
WrPortI (PDDR,&PDDRShadow, PDDRShadow & 0xef);
/****************写数据***************************/
WrPortE ( 0x4004, NULL, 0x00 );
WrPortE ( 0x4005, NULL, 0xff );
WrPortE(0x4008, NULL, ((channle>>8) & 0xff));
WrPortE(0x4009, NULL, (channle & 0xff));
WrPortI (PDDR,&PDDRShadow, PDDRShadow | 0x10);
}
int query(int channle)
{
int result;
if( (channle<0) || (channle>94) ) //频道号不合要求
return 0;
writetodsp(channle); //写入频道号1
result = my_isr();
if(result == 0)
checkDSPok();
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -