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

📄 comm.c

📁 51单片机驱动320*234彩显的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			{
				lcdcb.sailor_logined=1;
				lcdcb.event_notice=SCR_EVENT_SAILOR_LOGINOK;
			}
			if(recv_commpack_fullstartp->commpack_recv.buf[0]==0x00)
			{
				lcdcb.sailor_logined=0;
				lcdcb.event_notice=SCR_EVENT_SAILOR_LOGOUTOK;
			}
		break;
		
 		case ALARMING_OPERATION_DISP_NOTICE:	
			if(recv_commpack_fullstartp->commpack_recv.buf[0]==0x00)
			{
				lcdcb.event_notice=SCR_EVENT_ALARMING;
			}
			if(recv_commpack_fullstartp->commpack_recv.buf[0]==0xFF)
			{
				lcdcb.event_notice=SCR_EVENT_ALARM_OK;
			}
		break;
		
		case GPRS_SIGNAL_VALUE:
			if(recv_commpack_fullstartp->commpack_recv.buf[0]==99)
				lcdcb.gprs_signal_value=0;
			else
				lcdcb.gprs_signal_value=(recv_commpack_fullstartp->commpack_recv.buf[0]+1)/8;
			lcdcb.event_notice=SCR_EVENT_GPRS_SIGNAL_VALUE;
		break;
			
		case GPRS_DATA_COMMAND_STATE:
			lcdcb.gprs_data_command_state=recv_commpack_fullstartp->commpack_recv.buf[0];
			lcdcb.event_notice=SCR_EVENT_GPRS_STATE;
		break;
		
 		case GPS_DATA:		
			p = gps_frame.timer;
			p1=recv_commpack_fullstartp->commpack_recv.buf;
	
			if(*p1=='V')
			{
				lcdcb.gps_data_validate_flag=0;
				lcdcb.event_notice=SCR_EVENT_GPS_QUERY;
				break;
			}
			
			else if(recv_commpack_fullstartp->commpack_recv.len>1)
			{
				while(1)
				{	
					c=*p1++;
					if(c == ',')
					{
						section_num ++;
						switch (section_num)
						{
							
							case 1: p = gps_frame.latitude;break;	
							case 2: p = gps_frame.longitude;break;
							case 3: p = gps_frame.rate;break;
							case 4: p = gps_frame.azimuth_angel;break;
							default: break;
						}
					}
					else
					{
						* p++ = c;
						//recv the last gps data 
						if(p == &gps_frame.azimuth_angel[3])
							break; //jump out from while(1)
					}
				}

				lcdcb.gps_data_validate_flag=1;
				
				//GPS direction
				lcdcb.gps_arrow_no=((gps_frame.azimuth_angel[0]-0x30)*100+
								    (gps_frame.azimuth_angel[1]-0x30)*10  +
								    (gps_frame.azimuth_angel[2]-0x30)/45)+1;
				if(lcdcb.gps_arrow_no>8)
					lcdcb.gps_arrow_no=1;
				
				//UTC Time	
				timecb.hour=((unsigned char)gps_frame.timer[0]-0x30)*10+(unsigned char)gps_frame.timer[1]-0x30;
				timecb.minute=((unsigned char)gps_frame.timer[2]-0x30)*10+(unsigned char)gps_frame.timer[3]-0x30;
				timecb.second=((unsigned char)gps_frame.timer[4]-0x30)*10+(unsigned char)gps_frame.timer[5]-0x30;

				lcdcb.event_notice=SCR_EVENT_GPS_QUERY;
				break;
			}

			else
				break;
		break;
		
		default:
		break;
	}
	recv_commpack_fullstartp->state=FREE;
	return;
}

void process_commpack_out(unsigned char type)
{
	unsigned char i;
	unsigned char *p,*charp;
	unsigned short result,checksum;

	watchdog_reset();
	
	p=(unsigned char *)&commpack_send;
	
	*p++=COMMPACK_START_CHAR0;
	*p++=COMMPACK_START_CHAR1;
	*p++=ppcb.send_next;
	*p++=type;

	switch(type)
	{
		case SAILOR_LOGIN_REQUEST:		
 		case SAILOR_LOGOUT_REQUEST:
			*p++=SAILOR_ID_LEN+2;//len
			for(i=0;i<SAILOR_ID_LEN;i++)
				*p++=keycb.sailor_id[i];
		break;
		
 		case CALL_OUT_REQUEST:	
			*p++=TELEPHONE_NO_LEN+2;//len
			for(i=0;i<TELEPHONE_NO_LEN;i++)
				*p++=telephone_num[i];
		break;
		
 		case DISPATCH_COMMAND_RESPONSE:
		case WATERLEVEL_ADJUST_RESPONSE:
			*p++=13;//len(6:operator id,4:operation id,1:ack)
			for(i=0;i<OPERATOR_ID_LEN;i++)
				*p++=ppcb.operator_id[i];
			
			for(i=0;i<OPERATION_ID_LEN;i++)
				*p++=ppcb.operation_id[i];

			if(ppcb.msg_ack_flag&AGREE)
			{
				ppcb.msg_ack_flag&=~AGREE;
				*p++=0x7F;
			}
				
			if(ppcb.msg_ack_flag&DISAGREE)
			{
				ppcb.msg_ack_flag&=~DISAGREE;
				*p++=0x00;
			}
		break;
		
		case AUDIO_CALL_ACK_MINE:	
			*p++=3;//len
			if(ppcb.msg_ack_flag&AUDIO_CALL_IN)
			{
				if(ppcb.msg_ack_flag&AGREE)
				{
					ppcb.msg_ack_flag&=~AGREE;
					*p++=0x7F;
				}
				else if(ppcb.msg_ack_flag&DISAGREE)
				{
					ppcb.msg_ack_flag&=~AUDIO_CALL_IN;
					ppcb.msg_ack_flag&=~DISAGREE;
					*p++=0x00;
				}
			}
				
			else if(ppcb.msg_ack_flag&AUDIO_CALL_OUT)
			{
				if(ppcb.msg_ack_flag&DISAGREE)
				{
					ppcb.msg_ack_flag&=~AUDIO_CALL_OUT;
					ppcb.msg_ack_flag&=~DISAGREE;
					*p++=0x00;
				}
			}
		break;
		
		case SET_DATACENTER_IP:
			*p++=6;//len
			for(i=0;i<4;i++)
				*p++=flashcb.short_ip[i];
		break;
		
		case SET_DATACENTER_PORT:
			*p++=4;//len
			for(i=0;i<2;i++)
				*p++=flashcb.short_port[i];
		break;

		default:
		break;
	}
	//calculate CRC checksum 
	charp=&commpack_send.seq_no;
	checksum=0xFFFF;
	for(i=0; i<(commpack_send.len+1); i++)
		checksum=calc(charp[i] ^ checksum) ^ (checksum/256);
	result=~checksum;
	*p++=result & 255;
	*p++=result / 256;
	//add pack end bytes 
	*p++=COMMPACK_END_CHAR0;
	*p++=COMMPACK_END_CHAR1;
	//backup the sent data
	p=(unsigned char *)&commpack_send;
	charp=(unsigned char *)&commpack_send_bakup;
	for(i=0;i<7+commpack_send.len;i++)
		*charp++=*p++;
	//send commpack through serial port!
	serial_buf_send((unsigned char *)&commpack_send,7+commpack_send.len);
	ppcb.send_unacked=ppcb.send_next;
	if(ppcb.send_next==0xFF)
		ppcb.send_next=0;
	else
		ppcb.send_next++;
	init_timer(ppcb.retransmit_timerh,COMMPACK_RETRANSMIT_TOUT*TIMERTIC);
	ppcb.retries_left=COMMPACK_RETRANSMIT_TIMES;	
	return;
}

void commpack_retransmit(void)
{
	serial_buf_send((unsigned char *)&commpack_send_bakup,7+commpack_send_bakup.len);
	return;
}

void process_ackpack_in(void)
{
	watchdog_reset();
	if(((recv_ackpack_fullstartp->ackpack_recv.seq_no|recv_ackpack_fullstartp->ackpack_recv.check_num)!=0xFF)
	||(recv_ackpack_fullstartp->ackpack_recv.seq_no!=ppcb.send_unacked))
		return ;

	ppcb.retries_left=0;
	recv_ackpack_fullstartp->state=FREE;
	return;
}

void process_ackpack_out(void)
{
	unsigned char *p;
	watchdog_reset();
	p=(unsigned char *)&ackpack_send;
	*p++=ACKPACK_START_CHAR0;
	*p++=ACKPACK_START_CHAR1;
	*p++=recv_commpack_fullstartp->commpack_recv.seq_no;
	*p++=~(recv_commpack_fullstartp->commpack_recv.seq_no);
	*p++=ACKPACK_END_CHAR0;
	*p++=ACKPACK_END_CHAR1;
	serial_buf_send((unsigned char *)&ackpack_send,6);
	return;
}

void comm_poll(void)
{	
	watchdog_reset();
	if(check_timer(ppcb.retransmit_timerh)==0)
	{
		if(ppcb.retries_left>0)
		{
			commpack_retransmit();
			init_timer(ppcb.retransmit_timerh,COMMPACK_RETRANSMIT_TOUT*TIMERTIC);
			ppcb.retries_left--;
			if(ppcb.retries_left==0)
				lcdcb.err_msg_on=1;
		}
		else if(lcdcb.err_msg_on==1)
		{
			lcdcb.err_msg_on=0;
			lcdcb.state_msg_on=1;
			lcdcb.event_notice=SCR_EVENT_CHECK_CABLE;
		}
	}

	if(ppcb.msg_ack_flag&DISPATCH_MSG_ON)
	{
		if(check_timer(ppcb.dispatch_ack_timerh)==0)
		{
			keycb.msg_ack_flag&=~DISPATCH_MSG_ON;
			ppcb.msg_ack_flag&=~DISPATCH_MSG_ON;
			ppcb.msg_ack_flag&=DISAGREE;
			process_commpack_out(DISPATCH_COMMAND_RESPONSE);
			keycb.exit_curr_level=1;
			lcdcb.event_notice=SCR_EVENT_INIT_INFO;
		}
			
		else if(ppcb.msg_ack_flag&(AGREE|DISAGREE))
		{
			ppcb.msg_ack_flag&=~DISPATCH_MSG_ON;
			process_commpack_out(DISPATCH_COMMAND_RESPONSE);
		}
	}

	if(ppcb.msg_ack_flag&WATERLEVEL_AJUST_MSG_ON)
	{
		if(check_timer(ppcb.dispatch_ack_timerh)==0)
		{	
			keycb.msg_ack_flag&=~WATERLEVEL_AJUST_MSG_ON;
			ppcb.msg_ack_flag&=~WATERLEVEL_AJUST_MSG_ON;
			ppcb.msg_ack_flag&=DISAGREE;
			process_commpack_out(WATERLEVEL_ADJUST_RESPONSE);
			keycb.exit_curr_level=1;
			lcdcb.event_notice=SCR_EVENT_INIT_INFO;
		}

		else if(ppcb.msg_ack_flag&(AGREE|DISAGREE))
		{
			ppcb.msg_ack_flag&=~WATERLEVEL_AJUST_MSG_ON;
			process_commpack_out(WATERLEVEL_ADJUST_RESPONSE);	
		}
	}

	if(ppcb.msg_ack_flag&AUDIO_CALL_IN)
	{
		if(ppcb.msg_ack_flag&(AGREE|DISAGREE))
			process_commpack_out(AUDIO_CALL_ACK_MINE);
	}

	if(ppcb.msg_ack_flag&AUDIO_CALL_OUT)
	{
		if(ppcb.msg_ack_flag&DISAGREE)
			process_commpack_out(AUDIO_CALL_ACK_MINE);
	}
	return;
}

⌨️ 快捷键说明

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