434 lines
7.0 KiB
C
434 lines
7.0 KiB
C
//#include "stdafx.h"
|
||
#include "sjframe.h"
|
||
#include "rtc_ext.h"
|
||
//#include "frame3762task.h"
|
||
|
||
|
||
|
||
//extern u8 send_buff[512];
|
||
//extern u16 send_buff_len;
|
||
//extern u8 recv_buff[512];
|
||
//extern u16 recv_buff_len;
|
||
|
||
extern u8 * get_uart_send();
|
||
extern u8 * addr_get();
|
||
extern bool sj_frame_recv(u8 * val,u16 vallen);
|
||
|
||
//static u8 send_serial = 0x70;
|
||
|
||
|
||
|
||
|
||
|
||
//舞?<3F>
|
||
unsigned char GetCK(unsigned char * Val, unsigned char Len)
|
||
{
|
||
unsigned char i = 0;
|
||
unsigned char ck = 0;
|
||
|
||
if(NULL == Val) return 0;
|
||
if(0 == Len) return 0;
|
||
|
||
for( i = 0; i < Len; i++)
|
||
{
|
||
ck += Val[i];
|
||
}
|
||
return ck;
|
||
}
|
||
|
||
//?u16?懋??圜 2?懋?。
|
||
void P2From16(unsigned char * P2,unsigned short Val)
|
||
{
|
||
P2[0] = (Val&0xFF);
|
||
P2[1] = ((Val)>>8)&0xFF;
|
||
}
|
||
|
||
//?2?懋???圜 u16?懋。
|
||
unsigned short U16From2(unsigned char * P2)
|
||
{
|
||
return (((P2[1]<<8) &0xFF00) + P2[0]);
|
||
}
|
||
|
||
/*
|
||
static u8 get_sendserial()
|
||
{
|
||
return (send_serial++);
|
||
}
|
||
*/
|
||
|
||
|
||
void sj_frame_rpdata(u8 * val,u16 * len,u16 num,u8 * sendval)
|
||
{
|
||
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
||
//68 20 00 20 00 68 88 03 13 01 00 00 96 60 00 00 01 00 03 00 00 87 21 66 27 38 35 00 62 99 00 F7 16
|
||
|
||
//68 20 00 20 00 68 88 03 13 01 00 00 96 60 00 00 01 00
|
||
|
||
//03 00
|
||
//00 87 21 66 27 38 35
|
||
//00 62 99 00
|
||
//F7 16
|
||
|
||
|
||
//2 + num * 11 + 12
|
||
|
||
u8 * p = val;
|
||
u16 datalen = (2 + num * 11 + 12) * 4 + 1;
|
||
u16 alllen = 2 + num * 11 + 20;
|
||
|
||
u8 * addr = addr_get();
|
||
|
||
p[0] = 0x68;
|
||
p[1] = datalen&0xFF;
|
||
p[2] = (datalen>>8)&0xFF;
|
||
p[3] = datalen&0xFF;
|
||
p[4] = (datalen>>8)&0xFF;
|
||
p[5] = 0x68;
|
||
p[6] = 0x88;
|
||
|
||
//addr
|
||
p[7] = addr[0];
|
||
p[8] = addr[1];
|
||
p[9] = addr[2];
|
||
p[10] = addr[3];
|
||
p[11] = 0;
|
||
|
||
//afn
|
||
p[12] = 0x96;
|
||
|
||
//ser
|
||
p[13] = 0x60;//get_sendserial();
|
||
|
||
//单元标识
|
||
p[14] = 0x00;
|
||
p[15] = 0x00;
|
||
p[16] = 0x01;
|
||
p[17] = 0x00;
|
||
|
||
//
|
||
p[18] = num&0xFF;
|
||
p[19] = (num>>8)&0xFF;
|
||
|
||
memmove(&p[20],sendval,num*11);
|
||
|
||
p[alllen-2] = GetCK(&p[6],2 + num * 11 + 12);
|
||
p[alllen-1] = 0x16;
|
||
|
||
* len = alllen;
|
||
}
|
||
|
||
|
||
void sj_frame_load(u8 * val,u16 * len)
|
||
{
|
||
|
||
//登陆
|
||
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
||
//68 0C 00 0C 00 68 C9 03 13 01 00 00 95 70 00 00 01 00 E6 16
|
||
|
||
u8 * p = val;
|
||
|
||
u8 * addr = addr_get();
|
||
|
||
p[0] = 0x68;
|
||
p[1] = 49;
|
||
p[2] = 0x00;
|
||
p[3] = 49;
|
||
p[4] = 0x00;
|
||
p[5] = 0x68;
|
||
p[6] = 0xC9;
|
||
|
||
//addr
|
||
p[7] = addr[0];
|
||
p[8] = addr[1];
|
||
p[9] = addr[2];
|
||
p[10] = addr[3];
|
||
p[11] = 0;
|
||
|
||
//afn
|
||
p[12] = 0x95;
|
||
|
||
//ser
|
||
p[13] = 0x70;//get_sendserial();
|
||
|
||
//单元标识
|
||
p[14] = 0x00;
|
||
p[15] = 0x00;
|
||
p[16] = 0x01;
|
||
p[17] = 0x00;
|
||
|
||
p[18] = GetCK(&p[6],0x0C);
|
||
p[19] = 0x16;
|
||
|
||
* len = 20;
|
||
|
||
}
|
||
|
||
|
||
void sj_frame_heart(u8 * val,u16 * len)
|
||
{
|
||
|
||
//登陆
|
||
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
||
//68 0C 00 0C 00 68 C9 03 13 01 00 00 95 70 00 00 01 00 E6 16
|
||
|
||
u8 * p = val;
|
||
|
||
u8 * addr = addr_get();
|
||
|
||
p[0] = 0x68;
|
||
p[1] = 0x12*4+1;
|
||
p[2] = 0x00;
|
||
p[3] = 0x12*4+1;
|
||
p[4] = 0x00;
|
||
p[5] = 0x68;
|
||
p[6] = 0xC9;
|
||
|
||
//addr
|
||
p[7] = addr[0];
|
||
p[8] = addr[1];
|
||
p[9] = addr[2];
|
||
p[10] = addr[3];
|
||
p[11] = 0;
|
||
|
||
//afn
|
||
p[12] = 0x94;
|
||
|
||
//ser
|
||
p[13] = 0x70;//get_sendserial();
|
||
|
||
//单元标识
|
||
p[14] = 0x00;
|
||
p[15] = 0x00;
|
||
p[16] = 0x01;
|
||
p[17] = 0x00;
|
||
|
||
|
||
//时间
|
||
p[18] = 0x00;
|
||
p[19] = 0x00;
|
||
p[20] = 0x00;
|
||
p[21] = 0x09;
|
||
p[22] = 0x10;
|
||
p[23] = 0x19;
|
||
|
||
|
||
p[24] = GetCK(&p[6],0x12);
|
||
p[25] = 0x16;
|
||
|
||
* len = 26;
|
||
}
|
||
|
||
|
||
|
||
|
||
u8 send_buff[512];
|
||
u16 send_buff_len = 0;
|
||
u8 recv_buff[512];
|
||
u16 recv_buff_len = 0;
|
||
|
||
|
||
|
||
|
||
u8 * get_uart_recv()
|
||
{
|
||
return recv_buff;
|
||
}
|
||
|
||
u16 get_uart_recv_len()
|
||
{
|
||
return recv_buff_len;
|
||
}
|
||
|
||
u8 * get_uart_send()
|
||
{
|
||
return send_buff;
|
||
}
|
||
|
||
void set_uart_recv(u8 * val,u16 len)
|
||
{
|
||
memmove(recv_buff,val,len);
|
||
recv_buff_len = len;
|
||
|
||
//?锶猊钴唔知?濂郫?嘴
|
||
|
||
// set_recvserial(U16From2(&val[3]));
|
||
}
|
||
|
||
|
||
|
||
|
||
u16 get_uart_send_len()
|
||
{
|
||
return send_buff_len;
|
||
}
|
||
|
||
u16 * get_uart_send_plen()
|
||
{
|
||
return (&send_buff_len);
|
||
}
|
||
|
||
void concent_send_uart(u8 * val,u16 len)
|
||
{
|
||
memmove(send_buff,val,len);
|
||
send_buff_len = len;
|
||
|
||
|
||
// gprs_send_proc_direct(get_uart_send(),get_uart_send_len());
|
||
|
||
gprs_send_flag();
|
||
}
|
||
|
||
|
||
|
||
void concent_send_gprs()
|
||
{
|
||
gprs_send_proc_direct(get_uart_send(),get_uart_send_len());
|
||
}
|
||
|
||
|
||
|
||
|
||
void frame_process(u8 * val,u16 len)
|
||
{
|
||
|
||
memmove(recv_buff,val,len);
|
||
recv_buff_len = len;
|
||
|
||
set_uart_recv(val,len);
|
||
|
||
u8 ck1 = 0;
|
||
u8 ck2 = 0;
|
||
for(int j = 0;j<recv_buff_len;j++)
|
||
{
|
||
//0 1 2 3 4 5
|
||
//68 71 00 71 00 68 40 12 34 56 78 00 93 71 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 59 16
|
||
u16 vallen = U16From2(&val[j+1]);
|
||
vallen = vallen>>2;
|
||
// vallen = vallen - 1;
|
||
vallen = vallen + 8;
|
||
|
||
if(0x68 == val[j] && 0x16 == val[j+vallen-1])
|
||
{
|
||
ck1 = val[j+vallen-2];
|
||
ck2 = GetCK(&val[j+6],vallen-8);
|
||
if(ck1 == ck2)
|
||
{
|
||
|
||
//妪妄<E5A6AA>埚,??扉蛄?锶。
|
||
|
||
gprs_recv_judge_timeset();
|
||
if(0x94 == val[j+12] || 0x95 == val[j+12])
|
||
{
|
||
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
||
//68 51 00 51 00 68 40 07 55 00 08 00 94 60 00 00 01 00 94 00 16 11 15 25 10 19 b7 16
|
||
|
||
if(0x94 == val[j+12])
|
||
{
|
||
st_rtc_ext rtc_dat;
|
||
|
||
rtc_dat.sec = val[j+20];
|
||
rtc_dat.min = val[j+21];
|
||
rtc_dat.hour = val[j+22];
|
||
rtc_dat.day = val[j+23];
|
||
rtc_dat.month = val[j+24];
|
||
rtc_dat.year = val[j+25];
|
||
rtc_dat.week = 1;
|
||
set_rtc_time(rtc_dat);
|
||
}
|
||
|
||
//Time_Set();
|
||
|
||
|
||
}
|
||
else
|
||
{
|
||
sj_frame_recv(&val[j],vallen-j);
|
||
}
|
||
|
||
|
||
//break;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
#if 0
|
||
return;
|
||
|
||
//??诉萋?
|
||
//??槟<>。
|
||
|
||
u16 ck1 = 0;
|
||
u16 ck2 = 0;
|
||
u8 kkk = 0;
|
||
|
||
for(int j = 0;j<recv_buff_len;j++)
|
||
{
|
||
u16 vallen = U16From2(&val[j+1]);
|
||
if(0x68 == val[j] && 0x16 == val[j+vallen-1])
|
||
{
|
||
ck1 = get_crc(&val[j+1],vallen-4);
|
||
ck2 = U16From2(&val[j+vallen-3]);
|
||
if(ck1 == ck2)
|
||
{
|
||
if(kkk==0)
|
||
{
|
||
memmove(recv_buff1,&val[j],vallen);
|
||
recv_buff_len1 = vallen;
|
||
|
||
}
|
||
else if(kkk==1)
|
||
{
|
||
memmove(recv_buff2,&val[j],vallen);
|
||
recv_buff_len2 = vallen;
|
||
kkk++;
|
||
break;
|
||
|
||
}
|
||
kkk++;
|
||
}
|
||
}
|
||
}
|
||
|
||
if(kkk==1)
|
||
{
|
||
set_uart_recv(val,len);
|
||
if(frame_recv())
|
||
{
|
||
//妪妄<E5A6AA>埚,??扉蛄?锶。
|
||
gprs_recv_judge_timeset();
|
||
}
|
||
}
|
||
|
||
if(kkk==2)
|
||
{
|
||
memmove(recv_buff,recv_buff1,recv_buff_len1);
|
||
recv_buff_len = recv_buff_len1;
|
||
|
||
if(!frame_recv_noack())
|
||
{
|
||
memmove(recv_buff,recv_buff1,recv_buff_len1);
|
||
recv_buff_len = recv_buff_len1;
|
||
}
|
||
else
|
||
{
|
||
memmove(recv_buff,recv_buff2,recv_buff_len2);
|
||
recv_buff_len = recv_buff_len2;
|
||
}
|
||
set_uart_recv(recv_buff,recv_buff_len);
|
||
if(frame_recv())
|
||
{
|
||
//妪妄<E5A6AA>埚,??扉蛄?锶。
|
||
gprs_recv_judge_timeset();
|
||
}
|
||
}
|
||
#endif
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|