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