blob: eecd901e26373d43f54c42249b8a7b0c73adc5d0 [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
11static void sp_usart_send(sp_pos_t* pos, sp_protocol_request_t* req)
12{
13 uint8 sendBuff[264];
14 MEMCLEAR(sendBuff, sizeof(sendBuff));
15
16 pos->last_comm_status.command = req->excmd;
17 pos->last_comm_status.sendtime = sp_get_ticker();
18
19 sp_protocol_crc((uint8*)req +2, req->datalen, (uint8*)req +2 +req->datalen);
20 req->datalen += 2;
21 MEMCPY(sendBuff, req, req->datalen+2);
22 usart_send(sendBuff, req->datalen+2);
23}
24
25static uint8 sp_usart_recv(sp_pos_t* pos, sp_protocol_response_t* resp, int32 timeout_ms)
26{
27 uint32 tick = 0;
28 tick = sp_get_ticker();
29 while(1)
30 {
31 MEMCLEAR(resp, sizeof(sp_protocol_response_t));
32 usart_read((u8*)resp, sizeof(sp_protocol_response_t));
33 if(pos->last_comm_status.command == resp->excmd)
34 {
35 MEMCLEAR(&(pos->last_comm_status), sizeof(sp_comm_status_t));
36 return resp->retcode;
37 }
38 if((sp_get_ticker() - tick) >= timeout_ms)
39 {
40 return 1;
41 }
42 }
43}
44uint8 sp_comm_call(sp_pos_t* pos, sp_protocol_request_t* req,
45 sp_protocol_response_t* resp, int32 timeout_ms)
46{
47 sp_usart_send(pos, req);
48 return sp_usart_recv(pos, resp, timeout_ms);
49}
50
51void sp_protocol_req_init(sp_protocol_request_t* req, uint8 command)
52{
53 MEMCLEAR(req,sizeof(sp_protocol_request_t));
54 req->command = PROTOCOL_COMMAND_V2;
55 req->excmd = command;
56 req->flag = PROTOCOL_FLAG_PACK(req->flag);
57 req->flag = PROTOCOL_WITHOUT_MAC(req->flag);
58 req->datalen = 3;
59}
60
61static uint16 sp_confirm_card_authentication(sp_pos_t* pos, sp_card_t* card)
62{
63 uint8 size;
64 uint16 ret;
65 int32 timeout_ms = COMM_WAIT_TIME;
66 cw_unpack_context unpack;
67 unpack_field_t field;
68 sp_protocol_response_t resp;
69
70 disp_hint_info(pos,"ÕýÔÚÉí·ÝÈÏÖ¤ÖÐ",DELAY_TIME2s);
71 ret = sp_usart_recv(pos, &resp, timeout_ms);
72 if(ret)
73 {
74 ret = RC_CARD_AUTHENTICATION;
75 return ret;
76 }
77
78 sp_unpack_init(&unpack,resp.data,resp.datalen);
79 size = sp_unpack_map_size(&unpack);
80 while(size-- > 0)
81 {
82 sp_unpack_value(&unpack,&field);
83 if(IS_KEY(PK_INT_WATERLIMIT,field.key))
84 {
85 card->waterlimit = field.val.intval;
86 }
guangcheng.qin00668842019-08-19 09:45:25 +080087 else if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080088 {
guangcheng.qin00668842019-08-19 09:45:25 +080089 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080090 }
91 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
92 {
93 card->feepara.fee_amt = field.val.intval;
94 }
95 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
96 {
97 card->feepara.fee_unit = field.val.intval;
98 }
99 else if(IS_KEY(PK_INT_FEESTART, field.key))
100 {
101 card->feepara.fee_start = field.val.intval;
102 }
103 }
104 disp_hint_info(pos,"Éí·ÝÈÏÖ¤³É¹¦",DELAY_TIME1s);
105 return 0;
106}
107
108//ºǫ́¶Ô¿¨µÄÉí·ÝÈÏÖ¤
109uint16 sp_card_authentication(sp_pos_t* pos, sp_card_t* card)
110{
111 uint8 ctime[6];
112 sp_protocol_request_t req;
113 cw_pack_context pack;
114 MEMCLEAR(&req, sizeof(req));
115 MEMCLEAR(&pack, sizeof(req));
116 MEMCLEAR(ctime, sizeof ctime);
117
118 sp_get_bcdtime(ctime);
119 sp_protocol_req_init(&req, SP_CMD_CARD_AUTHENTICATION);
120 sp_pack_init(&pack, req.data, sizeof(req.data));
121 cw_pack_map_size(&pack,4);
122
123 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, card->cardphyid, 4);
guangcheng.qin0b456a32019-08-08 16:53:12 +0800124 sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, card->citizen_cardno+8, 4);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800125 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
126 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
127
128 req.datalen += sp_pack_length(&pack);
129 sp_usart_send(pos, &req);
130 return sp_confirm_card_authentication(pos, card);
131}
132
133//É豸ǩµ½
134uint16 sp_async_equipment_login(sp_pos_t* pos)
135{
136 sp_protocol_request_t req;
137 cw_pack_context pack;
138 uint8 ctime[6];
139 MEMCLEAR(ctime, sizeof(ctime));
140 pos->heartbeat.heart_status = HEART_SEND;
141
142 sp_get_bcdtime(ctime);
143 sp_protocol_req_init(&req, SP_CMD_LOGIN);
144 sp_pack_init(&pack, req.data, sizeof(req.data));
145 cw_pack_map_size(&pack, 5);
146
147 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
148 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
149 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
150 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
151 sp_pack_put_bin(&pack, PK_BIN_DEVICEKEY, (pos->sysconf.deviceKey), 8);
152
153 req.datalen += sp_pack_length(&pack);
154 sp_usart_send(pos, &req);
155 return 0;
156}
157
158//ÐÄÌøÈ·ÈÏ£¬¼ì²âÍøÂçÊÇ·ñÕý³£
159uint16 sp_async_heartbeat(sp_pos_t* pos)
160{
161 uint8 ctime[6];
162 uint8 unconfirm_transnum = 0;
163 sp_protocol_request_t req;
164 cw_pack_context pack;
165
166 pos->heartbeat.heart_status = HEART_SEND;
167 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
168 {
169 unconfirm_transnum = ((pos->last_transdtl.transaddr - pos->unconfirm_transdtl.transaddr) /
170 sizeof(sp_transdtl_t)) + 1;
171 }
172 else
173 {
174 unconfirm_transnum = 0;
175 }
176 sp_protocol_req_init(&req, SP_CMD_HEARTBEAT);
177 sp_pack_init(&pack, req.data, sizeof(req.data));
178 cw_pack_map_size(&pack, 6);
179
180 sp_get_bcdtime(ctime);
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_int(&pack, PK_INT_UNTRANSCONST, unconfirm_transnum);
186 sp_pack_put_int(&pack, PK_INT_WORKMODE, pos->sysconf.work_mode);
187
188 req.datalen += sp_pack_length(&pack);
189 sp_usart_send(pos, &req);
190 return 0;
191}
192
193static uint16 sp_confirm_qrcode_init(sp_pos_t* pos, sp_card_t* card)
194{
195 uint8 size;
196 uint16 ret;
197 int32 timeout_ms = COMM_WAIT_TIME;
198 cw_unpack_context unpack;
199 unpack_field_t field;
200 sp_protocol_response_t resp;
201
202 ret = sp_usart_recv(pos, &resp, timeout_ms);
203 if(ret)
204 {
205 ret = RC_QRCODE_FAILURE;
206 return ret;
207 }
208
209 sp_unpack_init(&unpack,resp.data,resp.datalen);
210 size = sp_unpack_map_size(&unpack);
211 while(size-- > 0)
212 {
213 sp_unpack_value(&unpack,&field);
214 if(IS_KEY(PK_STR_SHORT_URL, field.key))
215 {
216 MEMCPY(card->qrcode.qrcode_url, field.val.strval, field.strlen);
217 }
guangcheng.qin00668842019-08-19 09:45:25 +0800218 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800219 {
guangcheng.qin00668842019-08-19 09:45:25 +0800220 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800221 }
222 else if(IS_KEY(PK_INT_VAILDTIME, field.key))
223 {
224 card->qrcode.validtime = field.val.intval;
225 }
226 }
227 card->qrcode.starttime = sp_get_ticker();
228 return 0;
229}
230
231//¶þάÂë»ñÈ¡
232uint16 sp_qrcode_init(sp_pos_t* pos, sp_card_t* card)
233{
234 uint8 ctime[6];
235 sp_protocol_request_t req;
236 cw_pack_context pack;
237
238 sp_get_bcdtime(ctime);
239 sp_protocol_req_init(&req, SP_CMD_SHORTURL);
240 sp_pack_init(&pack, req.data, sizeof(req.data));
241 cw_pack_map_size(&pack, 2);
242
243 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
244 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
245
246 req.datalen += sp_pack_length(&pack);
247 sp_usart_send(pos, &req);
248 return sp_confirm_qrcode_init(pos, card);
249}
250
251//¶þάÂëÈ·ÈÏ£¬»ñȡ֧¸¶×´Ì¬
252static uint16 sp_confirm_qrcode_query(sp_pos_t* pos, sp_card_t* card)
253{
254 uint8 size;
255 uint16 ret;
256 int32 timeout_ms = COMM_WAIT_TIME;
257 cw_unpack_context unpack;
258 unpack_field_t field;
259 sp_protocol_response_t resp;
260
261 ret = sp_usart_recv(pos, &resp, timeout_ms);
262 if(ret)
263 {
264 ret = RC_QRCODE_QUERY_FAIL;
265 return ret;
266 }
267
268 sp_unpack_init(&unpack,resp.data,resp.datalen);
269 size = sp_unpack_map_size(&unpack);
270 while(size-- > 0)
271 {
272 sp_unpack_value(&unpack,&field);
guangcheng.qin00668842019-08-19 09:45:25 +0800273 if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800274 {
guangcheng.qin00668842019-08-19 09:45:25 +0800275 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800276 }
277 else if(IS_KEY(PK_INT_AUTHSTATUS, field.key))
278 {
279 card->qrcode.authstatus = field.val.intval;
280 }
281 else if(IS_KEY(PK_INT_PAYSTATUS, field.key))
282 {
283 card->qrcode.paystatus = field.val.intval;
284 }
285 else if(IS_KEY(PK_INT_PAYAMT, field.key))
286 {
287 card->qrcode.paidAmount = field.val.intval;
288 }
289 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
290 {
291 card->feepara.fee_amt = field.val.intval;
292 }
293 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
294 {
295 card->feepara.fee_unit = field.val.intval;
296 }
297 }
298 return resp.retcode;
299}
300
301uint16 sp_qrcode_query(sp_pos_t* pos, sp_card_t* card)
302{
303 uint8 ctime[6];
304 sp_protocol_request_t req;
305 cw_pack_context pack;
306
307 sp_get_bcdtime(ctime);
308 sp_protocol_req_init(&req, SP_CMD_QRCODE_PAY_QUERY);
309 sp_pack_init(&pack, req.data, sizeof(req.data));
310 cw_pack_map_size(&pack, 2);
311
312 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
guangcheng.qin00668842019-08-19 09:45:25 +0800313 sp_pack_put_int(&pack, PK_INT_COBILLNO, card->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800314
315 req.datalen += sp_pack_length(&pack);
316 sp_usart_send(pos, &req);
317 return sp_confirm_qrcode_query(pos, card);
318}
319
320//Á÷Ë®ÉÏ´«
guangcheng.qin00668842019-08-19 09:45:25 +0800321static uint32 transdtl_account_cobilLno = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800322static uint16 sp_async_upload_transdtl(sp_pos_t* pos, sp_transdtl_t* transdtl)
323{
324 uint8 crc[2];
325 cw_pack_context pack;
326 sp_protocol_request_t req;
327
guangcheng.qin00668842019-08-19 09:45:25 +0800328 transdtl_account_cobilLno = transdtl->cobillno;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800329 sp_protocol_req_init(&req, SP_CMD_TRANSDTL_ACCOUNT);
330 sp_pack_init(&pack,req.data,sizeof(req.data));
331 cw_pack_map_size(&pack,10);
332
333 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, transdtl->devphyid,4);
334 sp_pack_put_bin(&pack, PK_BIN_TRANSDATE, transdtl->transdate,3);
335 sp_pack_put_bin(&pack, PK_BIN_TRANSTIME, transdtl->transtime,3);
guangcheng.qin00668842019-08-19 09:45:25 +0800336 sp_pack_put_int(&pack, PK_INT_COBILLNO, transdtl->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800337 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, transdtl->cardphyid,
338 sizeof(transdtl->cardphyid));
339 sp_pack_put_int(&pack, PK_INT_TRANSWAY, transdtl->transway);
340 sp_pack_put_int(&pack, PK_INT_AMOUNT, transdtl->amount);
341 sp_pack_put_int(&pack, PK_INT_PAYAMT, transdtl->paidAmount);
342 sp_pack_put_int(&pack, PK_INT_FLOWSENSORS, transdtl->flowsensors);
343 sp_pack_put_int(&pack, PK_INT_FLAG, transdtl->transtatus);
344
345 sp_protocol_crc((uint8*)transdtl, sizeof(sp_transdtl_t)-2,crc);
346 req.datalen += sp_pack_length(&pack);
347 sp_usart_send(pos, &req);
348 return 0;
349}
350
351//È·ÈÏÁ÷ˮ״̬
352static uint8 sp_confirm_transdtl_account(sp_protocol_response_t* resp, sp_pos_t* pos)
353{
354 uint8 size;
355 cw_unpack_context unpack;
356 unpack_field_t field;
357
358 if(!resp->retcode)
359 {
360 sp_unpack_init(&unpack, resp->data, resp->datalen);
361 size = sp_unpack_map_size(&unpack);
362 while(size-- > 0)
363 {
364 sp_unpack_value(&unpack,&field);
guangcheng.qin00668842019-08-19 09:45:25 +0800365 if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800366 {
guangcheng.qin00668842019-08-19 09:45:25 +0800367 if(field.val.intval == transdtl_account_cobilLno)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800368 {
369 pos->unconfirm_transdtl.transaddr+= sizeof(sp_transdtl_t);
370 if(ADDR_TRANSDTL_END <= pos->unconfirm_transdtl.transaddr)
371 {
372 pos->unconfirm_transdtl.transaddr= ADDR_TRANSDTL_BEGIN;
373 }
374 return sp_write_unconfirm_record(pos);
375 }
376 }
377 }
378 }
379 return resp->retcode;
380
381}
382
383static uint8 sp_confirm_heartbeat(sp_protocol_response_t* resp, sp_pos_t* pos)
384{
385 uint8 size;
386 uint8 ctime[6];
387 uint8 systime[7];
388 uint8 login_flag = 0;
389 cw_unpack_context unpack;
390 unpack_field_t field;
391
392 if(resp->retcode)
393 {
394 return resp->retcode;
395 }
396 pos->heartbeat.heart_status = HEART_RECV;
397
398 sp_unpack_init(&unpack,resp->data,resp->datalen);
399 size = sp_unpack_map_size(&unpack);
400 while(size-- > 0)
401 {
402 sp_unpack_value(&unpack,&field);
403 if(IS_KEY(PK_BIN_SYSTIME, field.key))
404 {
405 if(field.strlen == 7)
406 {
407 MEMCPY(systime,field.val.binval,7);
408 sp_get_bcdtime(ctime);
409 if(MEMCMP(ctime,systime +1,5) != 0)
410 {
411 if(!sp_check_time_valid(systime +1))
412 {
413 sp_set_bcdtime(systime +1);
414 }
415 }
416 }
417 }
418 else if(IS_KEY(PK_STR_STATUS, field.key))
419 {
420 if(MEMCMP(field.val.strval, "normal", field.strlen) == 0)
421 {
422 login_flag = 1;
423 }
424 else if(MEMCMP(field.val.strval, "logout", field.strlen) == 0)
425 {
426 login_flag = 0;
427 }
428 else if(MEMCMP(field.val.strval, "closed", field.strlen) == 0)
429 {
430 login_flag = 2;
431 }
432 }
guangcheng.qin55f3fa62019-08-07 16:14:46 +0800433 else if(IS_KEY(PK_STR_UPGRADE, field.key))
434 {
435 if(MEMCMP("true",field.val.strval,4) == 0)
436 {
437 sp_manual_upgrade(pos);
438 }
439 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800440 }
441 sp_save_heartbeat_info(pos, login_flag);
442 return resp->retcode;
443}
444
445uint8 sp_confirm_login(sp_protocol_response_t* resp, sp_pos_t* pos)
446{
447 uint8 size;
448 uint8 ctime[6];
449 uint8 systime[7];
450 uint8 login_flag = 0;
451 uint8 unit = 0;
452 uint8 offline_maxhour = 0;
453 cw_unpack_context unpack;
454 unpack_field_t field;
455
456 MEMCLEAR(ctime, sizeof(ctime));
457 MEMCLEAR(systime, sizeof(systime));
458 if(resp->retcode)
459 {
460 return resp->retcode;
461 }
462 pos->heartbeat.heart_status = HEART_RECV;
463
464 sp_unpack_init(&unpack,resp->data,resp->datalen);
465 size = sp_unpack_map_size(&unpack);
466 while(size-- > 0)
467 {
468 sp_unpack_value(&unpack,&field);
469 if(IS_KEY(PK_INT_OFFLINEMAXHOUR, field.key))
470 {
471 offline_maxhour = field.val.intval;
472 }
473 else if(IS_KEY(PK_INT_PULSEINHML, field.key))
474 {
475 unit = field.val.intval;
476 }
477 else if(IS_KEY(PK_BIN_SYSTIME, field.key))
478 {
479 if(field.strlen == 7)
480 {
481 MEMCPY(systime,field.val.binval,7);
482 sp_get_bcdtime(ctime);
483 if(MEMCMP(ctime,systime +1,5) != 0)
484 {
485 if(!sp_check_time_valid(systime +1))
486 {
487 sp_set_bcdtime(systime +1);
488 }
489 }
490 }
491 }
492 }
493
494 login_flag = 1;
495 sp_save_login_info(pos, login_flag, unit, offline_maxhour);
496 return resp->retcode;
497}
498
499static protocol_cmd_t protocol_cmds[] =
500{
501 {SP_CMD_TRANSDTL_ACCOUNT, sp_confirm_transdtl_account},
502 {SP_CMD_HEARTBEAT, sp_confirm_heartbeat},
503 {SP_CMD_LOGIN, sp_confirm_login},
504 {0, NULL}
505};
506
507static uint16 sp_async_confirm_process(sp_pos_t* pos)
508{
509 uint8 ret = 0;
510 uint8 i = 0;
511 int32 timeout_ms = COMM_WAIT_TIME;
512 sp_protocol_response_t resp;
513
514 ret = sp_usart_recv(pos, &resp, timeout_ms);
515 if(ret)
516 {
517 return ret;
518 }
519 while(protocol_cmds[i].func != NULL && protocol_cmds[i].cmd != 0)
520 {
521 if(protocol_cmds[i].cmd == resp.excmd)
522 {
523 return protocol_cmds[i].func(&resp, pos);
524 }
525 ++i;
526 }
527 return 1;
528}
529
530//¼ì²âÉ豸ͨѶ״̬£¬¿ÕÏÐʱ¼ä½øÐÐÁ÷Ë®´¦ÀíµÈ¹¤×÷
531static void sp_check_and_switch_linkstat(sp_pos_t* pos)
532{
533 if(pos->heartbeat.heart_status == HEART_SEND)
534 {
535 //ÒÑ·¢ËÍÐÄÌø£¬Î´ÊÕµ½Ó¦´ð
536 pos->link_stat = 0;
537 pos->heartbeat.heart_status = HEART_INIT;
538 }
539 else if(pos->heartbeat.heart_status == HEART_RECV)
540 {
541 //ÒÑ·¢ËÍÐÄÌø£¬ÊÕµ½Ó¦´ð
542 pos->link_stat = 1;
543 pos->heartbeat.heart_status = HEART_INIT;
544 }
545}
546
547void sp_communicate(sp_pos_t* pos)
548{
549 uint16 ret = 0;
550 uint32 ticker = 0;
551 sp_transdtl_t transdtl;
552
553 if(pos->deviceno == 0)
554 {
555 return;
556 }
557 ticker = sp_get_ticker();
558 if(ticker - pos->last_comm_status.sendtime > COMM_WAIT_TIME)
559 {
560 if(pos->devlogin.last_login_ticker == 0 || pos->devlogin.login_flag == 0
guangcheng.qin00668842019-08-19 09:45:25 +0800561 || ticker - pos->devlogin.last_login_ticker > DELAY_TIME15s*2)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800562 {
guangcheng.qin00668842019-08-19 09:45:25 +0800563 if(ticker - pos->devlogin.last_login_ticker > DELAY_TIME15s*2)
564 {
565 pos->devlogin.last_login_ticker = ticker;
566 sp_async_equipment_login(pos);
567 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800568 }
569 else if(ticker < pos->heartbeat.last_heartbeat_ticker
570 || pos->heartbeat.last_heartbeat_ticker == 0
guangcheng.qin00668842019-08-19 09:45:25 +0800571 || ticker - pos->heartbeat.last_heartbeat_ticker > DELAY_TIME15s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800572 {
guangcheng.qin00668842019-08-19 09:45:25 +0800573 if(ticker - pos->heartbeat.last_heartbeat_ticker > DELAY_TIME15s)
574 {
575 pos->heartbeat.last_heartbeat_ticker = ticker;
576 sp_async_heartbeat(pos);
577 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800578 }
579 else
580 {
581 sp_check_and_switch_linkstat(pos);
582 if(pos->link_stat)
583 {
584 //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
585 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
586 {
587 ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&transdtl,
588 sizeof(transdtl));
589 if(!ret)
590 {
591 if(!pos->sysconf.work_mode)
592 {
593 pos->heartbeat.last_heartbeat_ticker = ticker;
594 sp_async_upload_transdtl(pos, &transdtl);
595 }
596 }
597 }
598 }
599 }
600 }
601
602 sp_async_confirm_process(pos);
603}