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