blob: 080a61d63c126071b89c892b724590d03b4a6b11 [file] [log] [blame]
zongqiang.zhang0c6a0882019-08-07 14:48:21 +08001#include "sp_communicate.h"
2#include "sp_util.h"
3#include "sp_flash.h"
4#include "sp_constant.h"
5#include "sp_data.h"
6#include "sp_msgpack.h"
7#include "sp_display.h"
guangcheng.qin55f3fa62019-08-07 16:14:46 +08008#include "sp_upgrade.h"
zongqiang.zhang0c6a0882019-08-07 14:48:21 +08009#include "../sys_hw/drv_usart.h"
10
zongqiang.zhang10678fd2019-11-25 13:37:03 +080011static uint8 rxBuf[512] = {0};
12static uint16 rxBufLen = 0;
13
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080014static void sp_usart_send(sp_pos_t* pos, sp_protocol_request_t* req)
15{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +080016 uint8 buf[sizeof(sp_protocol_request_t)];
zongqiang.zhang10678fd2019-11-25 13:37:03 +080017 MEMCLEAR(buf, sizeof(buf));
18 sp_protocol_crc((uint8*)req +2, req->datalen, (uint8*)req +2 +req->datalen);
19 req->datalen += 2;
20 MEMCPY(buf, req, req->datalen+2);
21 usart_send(buf, req->datalen+2);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080022
23 pos->last_comm_status.command = req->excmd;
24 pos->last_comm_status.sendtime = sp_get_ticker();
zongqiang.zhang10678fd2019-11-25 13:37:03 +080025 MEMCLEAR(rxBuf,sizeof rxBuf);
26 rxBufLen = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080027}
28
zongqiang.zhang10678fd2019-11-25 13:37:03 +080029static uint8 sp_usart_recv(sp_pos_t* pos, sp_protocol_response_t* resp,
30 uint32 timeout_ms)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080031{
zongqiang.zhang10678fd2019-11-25 13:37:03 +080032 uint32 tick;
33 uint16 len;
34 int16 datalen;
35 uint8 crc[2];
36 uint8 temp[sizeof(sp_protocol_response_t)];
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080037 tick = sp_get_ticker();
zongqiang.zhang10678fd2019-11-25 13:37:03 +080038 MEMCLEAR(temp,sizeof temp);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080039 while(1)
40 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +080041
42 len = usart_read((u8*)temp,sizeof temp);
43 if(len > 0)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080044 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +080045 MEMCPY(rxBuf +rxBufLen, temp,len);
46 rxBufLen += len;
47 datalen = get_2byte_int_le(rxBuf);
48 if((datalen+2) <= rxBufLen)
49 {
50 MEMCLEAR(resp, sizeof(sp_protocol_response_t));
51 MEMCPY((uint8*)resp,rxBuf,rxBufLen);
52 MEMCLEAR(rxBuf,sizeof rxBuf);
53 rxBufLen = 0;
54 if(pos->last_comm_status.command == resp->excmd)
55 {
56 sp_protocol_crc((uint8*)resp +2,datalen -2, crc);
57 if(MEMCMP((uint8*)resp +datalen,crc,2) == 0)
58 {
59 MEMCLEAR(&(pos->last_comm_status), sizeof(sp_comm_status_t));
60 return resp->retcode;
61 }
62 }
63 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080064 }
65 if((sp_get_ticker() - tick) >= timeout_ms)
66 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +080067 return RC_COMM_TIMEOUT;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080068 }
69 }
70}
zongqiang.zhang10678fd2019-11-25 13:37:03 +080071
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080072uint8 sp_comm_call(sp_pos_t* pos, sp_protocol_request_t* req,
zongqiang.zhang10678fd2019-11-25 13:37:03 +080073 sp_protocol_response_t* resp, uint32 timeout_ms)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080074{
75 sp_usart_send(pos, req);
76 return sp_usart_recv(pos, resp, timeout_ms);
77}
78
79void sp_protocol_req_init(sp_protocol_request_t* req, uint8 command)
80{
81 MEMCLEAR(req,sizeof(sp_protocol_request_t));
82 req->command = PROTOCOL_COMMAND_V2;
83 req->excmd = command;
84 req->flag = PROTOCOL_FLAG_PACK(req->flag);
85 req->flag = PROTOCOL_WITHOUT_MAC(req->flag);
86 req->datalen = 3;
87}
88
89static uint16 sp_confirm_card_authentication(sp_pos_t* pos, sp_card_t* card)
90{
91 uint8 size;
92 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080093 cw_unpack_context unpack;
94 unpack_field_t field;
95 sp_protocol_response_t resp;
96
zongqiang.zhangcb1f2692019-11-26 17:17:14 +080097 disp_hint_info_two(pos,"Éí·ÝÈ·ÈÏÖÐ","ÇëÉÔµÈ...",0);
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +080098 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080099 if(ret)
100 {
zongqiang.zhangd0017d72019-12-06 09:26:32 +0800101 return RC_CARD_AUTHENTICATION;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800102 }
103
104 sp_unpack_init(&unpack,resp.data,resp.datalen);
105 size = sp_unpack_map_size(&unpack);
106 while(size-- > 0)
107 {
108 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800109 if(IS_KEY(PK_INT_PERMIT, field.key))
110 {
111 card->permit = field.val.intval;
112 }
113 else if(IS_KEY(PK_STR_LIMITMSG, field.key))
114 {
115 MEMCPY(card->limitmsg, field.val.strval, field.strlen);
116 }
117 else if(IS_KEY(PK_INT_WATERLIMIT,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800118 {
119 card->waterlimit = field.val.intval;
120 }
guangcheng.qin00668842019-08-19 09:45:25 +0800121 else if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800122 {
guangcheng.qin00668842019-08-19 09:45:25 +0800123 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800124 }
125 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
126 {
127 card->feepara.fee_amt = field.val.intval;
128 }
129 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
130 {
131 card->feepara.fee_unit = field.val.intval;
132 }
133 else if(IS_KEY(PK_INT_FEESTART, field.key))
134 {
135 card->feepara.fee_start = field.val.intval;
136 }
137 }
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800138 //disp_hint_info(pos,"Éí·ÝÈÏÖ¤³É¹¦",DELAY_TIME1s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800139 return 0;
140}
141
142//ºǫ́¶Ô¿¨µÄÉí·ÝÈÏÖ¤
143uint16 sp_card_authentication(sp_pos_t* pos, sp_card_t* card)
144{
145 uint8 ctime[6];
146 sp_protocol_request_t req;
147 cw_pack_context pack;
148 MEMCLEAR(&req, sizeof(req));
149 MEMCLEAR(&pack, sizeof(req));
150 MEMCLEAR(ctime, sizeof ctime);
151
152 sp_get_bcdtime(ctime);
153 sp_protocol_req_init(&req, SP_CMD_CARD_AUTHENTICATION);
154 sp_pack_init(&pack, req.data, sizeof(req.data));
155 cw_pack_map_size(&pack,4);
156
157 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, card->cardphyid, 4);
guangcheng.qin0b456a32019-08-08 16:53:12 +0800158 sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, card->citizen_cardno+8, 4);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800159 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
160 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
161
162 req.datalen += sp_pack_length(&pack);
163 sp_usart_send(pos, &req);
164 return sp_confirm_card_authentication(pos, card);
165}
166
167//É豸ǩµ½
168uint16 sp_async_equipment_login(sp_pos_t* pos)
169{
170 sp_protocol_request_t req;
171 cw_pack_context pack;
172 uint8 ctime[6];
173 MEMCLEAR(ctime, sizeof(ctime));
174 pos->heartbeat.heart_status = HEART_SEND;
175
176 sp_get_bcdtime(ctime);
177 sp_protocol_req_init(&req, SP_CMD_LOGIN);
178 sp_pack_init(&pack, req.data, sizeof(req.data));
179 cw_pack_map_size(&pack, 5);
180
181 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
182 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
183 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
184 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
185 sp_pack_put_bin(&pack, PK_BIN_DEVICEKEY, (pos->sysconf.deviceKey), 8);
186
187 req.datalen += sp_pack_length(&pack);
188 sp_usart_send(pos, &req);
189 return 0;
190}
191
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800192void sp_login(sp_pos_t* pos)
193{
194 uint16 ret;
195 char msg[20];
196 sp_protocol_response_t resp;
197 disp_hint_info_two(pos,"ÕýÔڵǼ","ÇëÉÔµÈ...",0);
198 ret = sp_async_equipment_login(pos);
199 if(ret)
200 {
201 sprintf(msg,"´íÎóÂë=%d",ret);
202 disp_hint_info_two(pos,"µÇ¼ʧ°Ü",msg,DELAY_TIME3s);
203 return;
204 }
205 MEMCLEAR(&resp,sizeof resp);
206 sp_usart_recv(pos,&resp,COMM_WAIT_TIME);
207 ret = sp_confirm_login(&resp,pos);
208 if(ret)
209 {
210 disp_server_errmsg(pos,"µÇ¼ʧ°Ü",resp.data,resp.datalen);
211 return;
212 }
213 disp_hint_info(pos,"µÇ¼³É¹¦",DELAY_TIME3s);
214}
215
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800216//ÐÄÌøÈ·ÈÏ£¬¼ì²âÍøÂçÊÇ·ñÕý³£
217uint16 sp_async_heartbeat(sp_pos_t* pos)
218{
219 uint8 ctime[6];
220 uint8 unconfirm_transnum = 0;
221 sp_protocol_request_t req;
222 cw_pack_context pack;
223
224 pos->heartbeat.heart_status = HEART_SEND;
225 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
226 {
227 unconfirm_transnum = ((pos->last_transdtl.transaddr - pos->unconfirm_transdtl.transaddr) /
228 sizeof(sp_transdtl_t)) + 1;
229 }
230 else
231 {
232 unconfirm_transnum = 0;
233 }
234 sp_protocol_req_init(&req, SP_CMD_HEARTBEAT);
235 sp_pack_init(&pack, req.data, sizeof(req.data));
236 cw_pack_map_size(&pack, 6);
237
238 sp_get_bcdtime(ctime);
239 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
240 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
241 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
242 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
243 sp_pack_put_int(&pack, PK_INT_UNTRANSCONST, unconfirm_transnum);
244 sp_pack_put_int(&pack, PK_INT_WORKMODE, pos->sysconf.work_mode);
245
246 req.datalen += sp_pack_length(&pack);
247 sp_usart_send(pos, &req);
248 return 0;
249}
250
251static uint16 sp_confirm_qrcode_init(sp_pos_t* pos, sp_card_t* card)
252{
253 uint8 size;
254 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800255 cw_unpack_context unpack;
256 unpack_field_t field;
257 sp_protocol_response_t resp;
258
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800259 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800260 if(ret)
261 {
262 ret = RC_QRCODE_FAILURE;
263 return ret;
264 }
265
266 sp_unpack_init(&unpack,resp.data,resp.datalen);
267 size = sp_unpack_map_size(&unpack);
268 while(size-- > 0)
269 {
270 sp_unpack_value(&unpack,&field);
271 if(IS_KEY(PK_STR_SHORT_URL, field.key))
272 {
273 MEMCPY(card->qrcode.qrcode_url, field.val.strval, field.strlen);
274 }
guangcheng.qin00668842019-08-19 09:45:25 +0800275 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800276 {
guangcheng.qin00668842019-08-19 09:45:25 +0800277 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800278 }
279 else if(IS_KEY(PK_INT_VAILDTIME, field.key))
280 {
281 card->qrcode.validtime = field.val.intval;
282 }
283 }
284 card->qrcode.starttime = sp_get_ticker();
285 return 0;
286}
287
288//¶þάÂë»ñÈ¡
289uint16 sp_qrcode_init(sp_pos_t* pos, sp_card_t* card)
290{
291 uint8 ctime[6];
292 sp_protocol_request_t req;
293 cw_pack_context pack;
294
295 sp_get_bcdtime(ctime);
296 sp_protocol_req_init(&req, SP_CMD_SHORTURL);
297 sp_pack_init(&pack, req.data, sizeof(req.data));
298 cw_pack_map_size(&pack, 2);
299
300 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
301 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
302
303 req.datalen += sp_pack_length(&pack);
304 sp_usart_send(pos, &req);
305 return sp_confirm_qrcode_init(pos, card);
306}
307
308//¶þάÂëÈ·ÈÏ£¬»ñȡ֧¸¶×´Ì¬
309static uint16 sp_confirm_qrcode_query(sp_pos_t* pos, sp_card_t* card)
310{
311 uint8 size;
312 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800313 cw_unpack_context unpack;
314 unpack_field_t field;
315 sp_protocol_response_t resp;
316
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800317 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800318 if(ret)
319 {
320 ret = RC_QRCODE_QUERY_FAIL;
321 return ret;
322 }
323
324 sp_unpack_init(&unpack,resp.data,resp.datalen);
325 size = sp_unpack_map_size(&unpack);
326 while(size-- > 0)
327 {
328 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800329 if(IS_KEY(PK_INT_PERMIT, field.key))
330 {
331 card->permit = field.val.intval;
332 }
333 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800334 {
guangcheng.qin00668842019-08-19 09:45:25 +0800335 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800336 }
337 else if(IS_KEY(PK_INT_AUTHSTATUS, field.key))
338 {
339 card->qrcode.authstatus = field.val.intval;
340 }
341 else if(IS_KEY(PK_INT_PAYSTATUS, field.key))
342 {
343 card->qrcode.paystatus = field.val.intval;
344 }
345 else if(IS_KEY(PK_INT_PAYAMT, field.key))
346 {
347 card->qrcode.paidAmount = field.val.intval;
348 }
349 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
350 {
351 card->feepara.fee_amt = field.val.intval;
352 }
353 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
354 {
355 card->feepara.fee_unit = field.val.intval;
356 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800357 else if(IS_KEY(PK_INT_WATERLIMIT, field.key))
358 {
359 card->waterlimit = field.val.intval;
360 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800361 }
362 return resp.retcode;
363}
364
365uint16 sp_qrcode_query(sp_pos_t* pos, sp_card_t* card)
366{
367 uint8 ctime[6];
368 sp_protocol_request_t req;
369 cw_pack_context pack;
370
371 sp_get_bcdtime(ctime);
372 sp_protocol_req_init(&req, SP_CMD_QRCODE_PAY_QUERY);
373 sp_pack_init(&pack, req.data, sizeof(req.data));
374 cw_pack_map_size(&pack, 2);
375
376 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
guangcheng.qin00668842019-08-19 09:45:25 +0800377 sp_pack_put_int(&pack, PK_INT_COBILLNO, card->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800378
379 req.datalen += sp_pack_length(&pack);
380 sp_usart_send(pos, &req);
381 return sp_confirm_qrcode_query(pos, card);
382}
383
384//Á÷Ë®ÉÏ´«
guangcheng.qin00668842019-08-19 09:45:25 +0800385static uint32 transdtl_account_cobilLno = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800386static uint16 sp_async_upload_transdtl(sp_pos_t* pos, sp_transdtl_t* transdtl)
387{
388 uint8 crc[2];
389 cw_pack_context pack;
390 sp_protocol_request_t req;
391
guangcheng.qin00668842019-08-19 09:45:25 +0800392 transdtl_account_cobilLno = transdtl->cobillno;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800393 sp_protocol_req_init(&req, SP_CMD_TRANSDTL_ACCOUNT);
394 sp_pack_init(&pack,req.data,sizeof(req.data));
395 cw_pack_map_size(&pack,10);
396
397 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, transdtl->devphyid,4);
398 sp_pack_put_bin(&pack, PK_BIN_TRANSDATE, transdtl->transdate,3);
399 sp_pack_put_bin(&pack, PK_BIN_TRANSTIME, transdtl->transtime,3);
guangcheng.qin00668842019-08-19 09:45:25 +0800400 sp_pack_put_int(&pack, PK_INT_COBILLNO, transdtl->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800401 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, transdtl->cardphyid,
402 sizeof(transdtl->cardphyid));
403 sp_pack_put_int(&pack, PK_INT_TRANSWAY, transdtl->transway);
404 sp_pack_put_int(&pack, PK_INT_AMOUNT, transdtl->amount);
405 sp_pack_put_int(&pack, PK_INT_PAYAMT, transdtl->paidAmount);
406 sp_pack_put_int(&pack, PK_INT_FLOWSENSORS, transdtl->flowsensors);
407 sp_pack_put_int(&pack, PK_INT_FLAG, transdtl->transtatus);
408
409 sp_protocol_crc((uint8*)transdtl, sizeof(sp_transdtl_t)-2,crc);
410 req.datalen += sp_pack_length(&pack);
411 sp_usart_send(pos, &req);
412 return 0;
413}
414
415//È·ÈÏÁ÷ˮ״̬
416static uint8 sp_confirm_transdtl_account(sp_protocol_response_t* resp, sp_pos_t* pos)
417{
418 uint8 size;
419 cw_unpack_context unpack;
420 unpack_field_t field;
421
422 if(!resp->retcode)
423 {
424 sp_unpack_init(&unpack, resp->data, resp->datalen);
425 size = sp_unpack_map_size(&unpack);
426 while(size-- > 0)
427 {
428 sp_unpack_value(&unpack,&field);
guangcheng.qin00668842019-08-19 09:45:25 +0800429 if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800430 {
guangcheng.qin00668842019-08-19 09:45:25 +0800431 if(field.val.intval == transdtl_account_cobilLno)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800432 {
433 pos->unconfirm_transdtl.transaddr+= sizeof(sp_transdtl_t);
434 if(ADDR_TRANSDTL_END <= pos->unconfirm_transdtl.transaddr)
435 {
436 pos->unconfirm_transdtl.transaddr= ADDR_TRANSDTL_BEGIN;
437 }
438 return sp_write_unconfirm_record(pos);
439 }
440 }
441 }
442 }
443 return resp->retcode;
444
445}
446
447static uint8 sp_confirm_heartbeat(sp_protocol_response_t* resp, sp_pos_t* pos)
448{
449 uint8 size;
450 uint8 ctime[6];
451 uint8 systime[7];
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800452 uint8 login_flag;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800453 cw_unpack_context unpack;
454 unpack_field_t field;
455
456 if(resp->retcode)
457 {
458 return resp->retcode;
459 }
460 pos->heartbeat.heart_status = HEART_RECV;
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800461 login_flag = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800462 sp_unpack_init(&unpack,resp->data,resp->datalen);
463 size = sp_unpack_map_size(&unpack);
464 while(size-- > 0)
465 {
466 sp_unpack_value(&unpack,&field);
467 if(IS_KEY(PK_BIN_SYSTIME, field.key))
468 {
469 if(field.strlen == 7)
470 {
471 MEMCPY(systime,field.val.binval,7);
472 sp_get_bcdtime(ctime);
473 if(MEMCMP(ctime,systime +1,5) != 0)
474 {
475 if(!sp_check_time_valid(systime +1))
476 {
477 sp_set_bcdtime(systime +1);
478 }
479 }
480 }
481 }
482 else if(IS_KEY(PK_STR_STATUS, field.key))
483 {
484 if(MEMCMP(field.val.strval, "normal", field.strlen) == 0)
485 {
486 login_flag = 1;
487 }
488 else if(MEMCMP(field.val.strval, "logout", field.strlen) == 0)
489 {
490 login_flag = 0;
491 }
492 else if(MEMCMP(field.val.strval, "closed", field.strlen) == 0)
493 {
494 login_flag = 2;
495 }
496 }
guangcheng.qin55f3fa62019-08-07 16:14:46 +0800497 else if(IS_KEY(PK_STR_UPGRADE, field.key))
498 {
499 if(MEMCMP("true",field.val.strval,4) == 0)
500 {
501 sp_manual_upgrade(pos);
502 }
503 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800504 }
505 sp_save_heartbeat_info(pos, login_flag);
506 return resp->retcode;
507}
508
509uint8 sp_confirm_login(sp_protocol_response_t* resp, sp_pos_t* pos)
510{
511 uint8 size;
512 uint8 ctime[6];
513 uint8 systime[7];
514 uint8 login_flag = 0;
515 uint8 unit = 0;
516 uint8 offline_maxhour = 0;
517 cw_unpack_context unpack;
518 unpack_field_t field;
519
520 MEMCLEAR(ctime, sizeof(ctime));
521 MEMCLEAR(systime, sizeof(systime));
522 if(resp->retcode)
523 {
524 return resp->retcode;
525 }
526 pos->heartbeat.heart_status = HEART_RECV;
527
528 sp_unpack_init(&unpack,resp->data,resp->datalen);
529 size = sp_unpack_map_size(&unpack);
530 while(size-- > 0)
531 {
532 sp_unpack_value(&unpack,&field);
533 if(IS_KEY(PK_INT_OFFLINEMAXHOUR, field.key))
534 {
535 offline_maxhour = field.val.intval;
536 }
537 else if(IS_KEY(PK_INT_PULSEINHML, field.key))
538 {
539 unit = field.val.intval;
540 }
541 else if(IS_KEY(PK_BIN_SYSTIME, field.key))
542 {
543 if(field.strlen == 7)
544 {
545 MEMCPY(systime,field.val.binval,7);
546 sp_get_bcdtime(ctime);
547 if(MEMCMP(ctime,systime +1,5) != 0)
548 {
549 if(!sp_check_time_valid(systime +1))
550 {
551 sp_set_bcdtime(systime +1);
552 }
553 }
554 }
555 }
556 }
557
558 login_flag = 1;
559 sp_save_login_info(pos, login_flag, unit, offline_maxhour);
560 return resp->retcode;
561}
562
563static protocol_cmd_t protocol_cmds[] =
564{
565 {SP_CMD_TRANSDTL_ACCOUNT, sp_confirm_transdtl_account},
566 {SP_CMD_HEARTBEAT, sp_confirm_heartbeat},
567 {SP_CMD_LOGIN, sp_confirm_login},
568 {0, NULL}
569};
570
571static uint16 sp_async_confirm_process(sp_pos_t* pos)
572{
573 uint8 ret = 0;
574 uint8 i = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800575 sp_protocol_response_t resp;
576
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800577 ret = sp_usart_recv(pos, &resp, 100);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800578 if(ret)
579 {
580 return ret;
581 }
582 while(protocol_cmds[i].func != NULL && protocol_cmds[i].cmd != 0)
583 {
584 if(protocol_cmds[i].cmd == resp.excmd)
585 {
586 return protocol_cmds[i].func(&resp, pos);
587 }
588 ++i;
589 }
590 return 1;
591}
592
593//¼ì²âÉ豸ͨѶ״̬£¬¿ÕÏÐʱ¼ä½øÐÐÁ÷Ë®´¦ÀíµÈ¹¤×÷
594static void sp_check_and_switch_linkstat(sp_pos_t* pos)
595{
596 if(pos->heartbeat.heart_status == HEART_SEND)
597 {
598 //ÒÑ·¢ËÍÐÄÌø£¬Î´ÊÕµ½Ó¦´ð
599 pos->link_stat = 0;
600 pos->heartbeat.heart_status = HEART_INIT;
601 }
602 else if(pos->heartbeat.heart_status == HEART_RECV)
603 {
604 //ÒÑ·¢ËÍÐÄÌø£¬ÊÕµ½Ó¦´ð
605 pos->link_stat = 1;
606 pos->heartbeat.heart_status = HEART_INIT;
607 }
608}
609
610void sp_communicate(sp_pos_t* pos)
611{
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800612 uint16 ret;
613 uint32 ticker;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800614 sp_transdtl_t transdtl;
615
616 if(pos->deviceno == 0)
617 {
618 return;
619 }
620 ticker = sp_get_ticker();
621 if(ticker - pos->last_comm_status.sendtime > COMM_WAIT_TIME)
622 {
623 if(pos->devlogin.last_login_ticker == 0 || pos->devlogin.login_flag == 0
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800624 || ticker - pos->devlogin.last_login_ticker > DELAY_TIME60s*30)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800625 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800626 pos->devlogin.last_login_ticker = ticker;
627 sp_async_equipment_login(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800628 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800629 if(pos->heartbeat.last_heartbeat_ticker == 0
630 || ticker - pos->heartbeat.last_heartbeat_ticker > DELAY_TIME60s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800631 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800632 pos->heartbeat.last_heartbeat_ticker = ticker;
633 sp_async_heartbeat(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800634 }
635 else
636 {
637 sp_check_and_switch_linkstat(pos);
638 if(pos->link_stat)
639 {
640 //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
641 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
642 {
643 ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&transdtl,
644 sizeof(transdtl));
645 if(!ret)
646 {
647 if(!pos->sysconf.work_mode)
648 {
649 pos->heartbeat.last_heartbeat_ticker = ticker;
650 sp_async_upload_transdtl(pos, &transdtl);
651 }
652 }
653 }
654 }
655 }
656 }
657
658 sp_async_confirm_process(pos);
659}