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

📄 rabbit_catv.c

📁 公司开发的CATV网管系统Rabbit2000的源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	}

	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 + -