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

📄 comm.c

📁 51单片机驱动320*234彩显的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//name:comm.c
//author:Liweihua
//date:2004.11.27

#include "upsd3200.h"     
#include "timers.h"
#include "lcd.h"
#include "key.h"
#include "config.h"
#include "comm.h"
#include "flash.h"
#include "isr.h"
#include "upsd_hardware.h"

GPS_FRAME xdata gps_frame;
struct COMMPACK_LINK_NODE xdata recv_commpack_node[COMMPACKNODENUM];
struct COMMPACK_LINK_NODE xdata*recv_commpack_freestartp=0;
struct COMMPACK_LINK_NODE xdata*recv_commpack_fullstartp=0;
struct ACKPACK_LINK_NODE xdata recv_ackpack_node[ACKPACKNODENUM];
struct ACKPACK_LINK_NODE xdata*recv_ackpack_freestartp=0;
struct ACKPACK_LINK_NODE xdata*recv_ackpack_fullstartp=0;
COMMPACK xdata commpack_send;
COMMPACK xdata commpack_send_bakup;
ACKPACK   xdata ackpack_send;
PPCB xdata ppcb;

extern FLASHCB xdata flashcb;
extern KEYCB xdata keycb;
extern LCDCB xdata lcdcb;
extern TIMECB xdata timecb;

static char code telephone_num[8]={'8','4','7','2','3','1','1','8'};

void comm_init(void)
{
	unsigned char h;
	ppcb.send_unacked=0;
	ppcb.send_next=0;
	ppcb.msg_ack_flag=0;
	ppcb.seqno_peer_old=0xFF;

	h=get_timer();
	init_timer(h,0);
	ppcb.dispatch_ack_timerh=h;
	
	h=get_timer();
	init_timer(h,0);
	ppcb.retransmit_timerh=h;
	
	ppcb.retries_left=0;
	
	return;
}

unsigned short calc(unsigned short c) 
{
	char i; 				// Just a loop index
	c &= 0xFF; 				// Only calculate CRC on low byte
	for (i=0;i<8;i++) 
	{ 						// Loop eight times, once for each bit
		if (c&1) 			// Is bit high?
		{ 		
			c /= 2; 		// Position for next bit
			c ^= 0x8408; 	// Toggle the feedback bits
		} 
		else 
			c /= 2; 		// Just position for next bit
	} 						// This routine would be best optimized in assembly
	return c; 				// Return the 16 bit checksum
}

void serial_buf_send(unsigned char * send_data,unsigned short data_len)
{
	unsigned char c=0;
	unsigned short send_ptr=0;
	unsigned char n=0;
	EA = 0;	
	TI = 1;
	while(1)
	{
		while(!TI);
		TI = 0;
		c = send_data[send_ptr++]; 	// get character from buffer
		if (send_ptr==data_len)		// was it the last character
		{ 
			SBUF = c; 		// Put character in transmitter
			while(!TI);
			TI = 0;
			EA = 1;
			break;
		} 
		SBUF = c; 		// Put character in transmitter
	}
	return;
}

void process_commpack_in(void)
{
	signed short i,j;
	unsigned char section_num,c;
	unsigned char *p,*p1;
	unsigned short checksum;

	watchdog_reset();
	
	//calculate CRC checksum,if not ok, not send ack pack,and return 0;
	p=(unsigned char *)&recv_commpack_fullstartp->commpack_recv.seq_no;
	
	checksum = 0xFFFF;
	
	for(i=0; i<(recv_commpack_fullstartp->commpack_recv.len+3); i++)
		checksum = calc(p[i] ^ checksum) ^ (checksum/256);
	
	if(checksum!=0xF0B8)
	{
		recv_commpack_fullstartp->state=FREE;
		return;
	}
		
	//or send ack pack
	process_ackpack_out();
	
	//this pack has been handled last time!!!
	if(recv_commpack_fullstartp->commpack_recv.seq_no==ppcb.seqno_peer_old)
	{
		recv_commpack_fullstartp->state=FREE;
		return;
	}
	
	ppcb.seqno_peer_old=recv_commpack_fullstartp->commpack_recv.seq_no;
	
	//then according to the type and value of the pack,do corresponding action
	switch(recv_commpack_fullstartp->commpack_recv.type)
	{
		case DISPATCH_MESSAGE:	
		case WATERLEVEL_ADJUST_MESSAGE:
			if(recv_commpack_fullstartp->commpack_recv.type==DISPATCH_MESSAGE)
			{
				flashcb.buf_wr[0]=0;
				ppcb.msg_ack_flag|=DISPATCH_MSG_ON;
				keycb.msg_ack_flag|=DISPATCH_MSG_ON;
				lcdcb.msg_type=0;
			}
			
			if(recv_commpack_fullstartp->commpack_recv.type==WATERLEVEL_ADJUST_MESSAGE)
			{
				flashcb.buf_wr[0]=1;
				ppcb.msg_ack_flag|=WATERLEVEL_AJUST_MSG_ON;
				keycb.msg_ack_flag|=WATERLEVEL_AJUST_MSG_ON;
				lcdcb.msg_type=1;
			}
			
			for(i=0;i<OPERATOR_ID_LEN;i++)
				ppcb.operator_id[i]=recv_commpack_fullstartp->commpack_recv.buf[i];
			
			for(i=0;i<OPERATION_ID_LEN;i++)
				ppcb.operation_id[i]=recv_commpack_fullstartp->commpack_recv.buf[i+OPERATOR_ID_LEN];
			
			lcdcb.msg_len=recv_commpack_fullstartp->commpack_recv.len-15;//-6:operator id//-4:operation id//-1:sevice pack id//-2:sevice pack len
			flashcb.len_wr_msg=lcdcb.msg_len+4;
						
			for(i=0;i<lcdcb.msg_len;i++)
				flashcb.buf_wr[i+4]=recv_commpack_fullstartp->commpack_recv.buf[i+13];
					
			flashcb.buf_wr[1]=timecb.hour;
			flashcb.buf_wr[2]=timecb.minute;
			flashcb.buf_wr[3]=timecb.second;
			flashcb.event_notice=FLASH_EV_WRITE_ONE_RECODE;

			i=0;
			j=0;
			p=&recv_commpack_fullstartp->commpack_recv.buf[13];
			while(j<lcdcb.msg_len)
			{
				if( ( *p>=0xA1) && (i%2 == 0) )
				{//汉字,从偶地址开始
					lcdcb.msg_buf[i] = *p++;
					i++;
					lcdcb.msg_buf[i] = *p++;
					i++;
					j += 2;
				}
				else if(*p<0xA1)
				{//半宽字符
					lcdcb.msg_buf[i]= *p++;
					i++;
					j++;
				}
				else
				{//汉字从奇地址开始
					lcdcb.msg_buf[i] = 0x20;
					i++;
				}		
			}
			lcdcb.msg_len=i;
			
			keycb.enter_next_level=1;
			lcdcb.event_notice=SCR_EVENT_DISP_RTMSG;
			init_timer(ppcb.dispatch_ack_timerh,DISPATCH_ACK_TOUT*TIMERTIC);
		break;
		
		case WEATHER_FORECAST_MESSAGE:
		case HYDROLOGY_BROADCAST_MESSAGE:
		case CHARGE_NOTICE_MESSAGE:
		case POLICE_ANNOUCE_MESSAGE:
			if(recv_commpack_fullstartp->commpack_recv.type==WEATHER_FORECAST_MESSAGE)
			{
				flashcb.buf_wr[0]=2;
				lcdcb.msg_type=2;
			}
			
			if(recv_commpack_fullstartp->commpack_recv.type==HYDROLOGY_BROADCAST_MESSAGE)
			{
				flashcb.buf_wr[0]=3;
				lcdcb.msg_type=3;
			}
			
			if(recv_commpack_fullstartp->commpack_recv.type==CHARGE_NOTICE_MESSAGE)
			{
				flashcb.buf_wr[0]=4;
				lcdcb.msg_type=4;
			}
			
			if(recv_commpack_fullstartp->commpack_recv.type==POLICE_ANNOUCE_MESSAGE)
			{
				flashcb.buf_wr[0]=5;
				lcdcb.msg_type=5;
			}

			ppcb.msg_ack_flag|=BROADCAST_MSG_ON;
			
			lcdcb.msg_len=recv_commpack_fullstartp->commpack_recv.len-2;
			flashcb.len_wr_msg=lcdcb.msg_len+4;
			
			for(i=0;i<lcdcb.msg_len;i++)
				flashcb.buf_wr[4+i]=recv_commpack_fullstartp->commpack_recv.buf[i];
						
			flashcb.buf_wr[1]=timecb.hour;
			flashcb.buf_wr[2]=timecb.minute;
			flashcb.buf_wr[3]=timecb.second;
			flashcb.event_notice=FLASH_EV_WRITE_ONE_RECODE;

			i=0;
			j=0;
			p=recv_commpack_fullstartp->commpack_recv.buf;
			while(j<lcdcb.msg_len)
			{
				if( ( *p>=0xA1) && (i%2 == 0) )
				{//汉字,从偶地址开始
					lcdcb.msg_buf[i] = *p++;
					i++;
					lcdcb.msg_buf[i] = *p++;
					i++;
					j += 2;
				}
				else if(*p<0xA1)
				{//半宽字符
					lcdcb.msg_buf[i]= *p++;
					i++;
					j++;
				}
				else
				{//汉字从奇地址开始
					lcdcb.msg_buf[i] = 0x20;
					i++;
				}		
			}
			lcdcb.msg_len=i;	
			
			//keycb.enter_next_level=1;
			lcdcb.event_notice=SCR_EVENT_DISP_RTMSG;
		break;
		
 		case AUDIO_CALL_REQUEST:
			ppcb.msg_ack_flag|=AUDIO_CALL_IN;
			keycb.msg_ack_flag|=AUDIO_CALL_IN;
			lcdcb.event_notice=SCR_EVENT_RECV_CALL;
		break;
			
 		case AUDIO_CALL_ACK_HOST:	
			switch(recv_commpack_fullstartp->commpack_recv.buf[0])
			{
				case 0:
					if(ppcb.msg_ack_flag&AUDIO_CALL_OUT)
					{
						lcdcb.event_notice=SCR_EVENT_TALKING;
					}
				break;
				
				case 1:
					if(ppcb.msg_ack_flag&AUDIO_CALL_OUT)
					{
						ppcb.msg_ack_flag&=~AUDIO_CALL_OUT;
						keycb.msg_ack_flag&=~AUDIO_CALL_OUT;
						lcdcb.event_notice=SCR_EVENT_PEER_TOUT;
					}
					else if(ppcb.msg_ack_flag&AUDIO_CALL_IN)
					{
						ppcb.msg_ack_flag&=~AUDIO_CALL_IN;
						keycb.msg_ack_flag&=~AUDIO_CALL_IN;
						lcdcb.event_notice=SCR_EVENT_IGNORED_CALLIN;
					}
				break;

				case 2:
					if(ppcb.msg_ack_flag&AUDIO_CALL_IN)
					{
						ppcb.msg_ack_flag&=~AUDIO_CALL_IN;
						keycb.msg_ack_flag&=~AUDIO_CALL_IN;
						lcdcb.event_notice=SCR_EVENT_PEER_HANGUP;
					}
					if(ppcb.msg_ack_flag&AUDIO_CALL_OUT)
					{
						ppcb.msg_ack_flag&=~AUDIO_CALL_OUT;
						keycb.msg_ack_flag&=~AUDIO_CALL_OUT;
						lcdcb.event_notice=SCR_EVENT_PEER_HANGUP;
					}
				break;

				default:
				break;
			}
		break;
		
 		case SHIPPING_LOGIN_SUCCESS:
			lcdcb.shipping_logined=1;
			lcdcb.event_notice=SCR_EVENT_SHIPPING_LOGINOK;
		break;
		
 		case SAILOR_LOGIN_STATE:
			if(recv_commpack_fullstartp->commpack_recv.buf[0]==0xFF)

⌨️ 快捷键说明

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