blob: c86690a2884e79e1e51b168d549850493c06f5c7 [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);
guangcheng.qin2d6738c2019-09-25 17:38:15 +080083 if(IS_KEY(PK_INT_PERMIT, field.key))
84 {
85 card->permit = field.val.intval;
86 }
87 else if(IS_KEY(PK_STR_LIMITMSG, field.key))
88 {
89 MEMCPY(card->limitmsg, field.val.strval, field.strlen);
90 }
91 else if(IS_KEY(PK_INT_WATERLIMIT,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080092 {
93 card->waterlimit = field.val.intval;
94 }
guangcheng.qin00668842019-08-19 09:45:25 +080095 else if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080096 {
guangcheng.qin00668842019-08-19 09:45:25 +080097 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080098 }
99 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
100 {
101 card->feepara.fee_amt = field.val.intval;
102 }
103 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
104 {
105 card->feepara.fee_unit = field.val.intval;
106 }
107 else if(IS_KEY(PK_INT_FEESTART, field.key))
108 {
109 card->feepara.fee_start = field.val.intval;
110 }
111 }
112 disp_hint_info(pos,"Éí·ÝÈÏÖ¤³É¹¦",DELAY_TIME1s);
113 return 0;
114}
115
116//ºǫ́¶Ô¿¨µÄÉí·ÝÈÏÖ¤
117uint16 sp_card_authentication(sp_pos_t* pos, sp_card_t* card)
118{
119 uint8 ctime[6];
120 sp_protocol_request_t req;
121 cw_pack_context pack;
122 MEMCLEAR(&req, sizeof(req));
123 MEMCLEAR(&pack, sizeof(req));
124 MEMCLEAR(ctime, sizeof ctime);
125
126 sp_get_bcdtime(ctime);
127 sp_protocol_req_init(&req, SP_CMD_CARD_AUTHENTICATION);
128 sp_pack_init(&pack, req.data, sizeof(req.data));
129 cw_pack_map_size(&pack,4);
130
131 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, card->cardphyid, 4);
guangcheng.qin0b456a32019-08-08 16:53:12 +0800132 sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, card->citizen_cardno+8, 4);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800133 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
134 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
135
136 req.datalen += sp_pack_length(&pack);
137 sp_usart_send(pos, &req);
138 return sp_confirm_card_authentication(pos, card);
139}
140
141//É豸ǩµ½
142uint16 sp_async_equipment_login(sp_pos_t* pos)
143{
144 sp_protocol_request_t req;
145 cw_pack_context pack;
146 uint8 ctime[6];
147 MEMCLEAR(ctime, sizeof(ctime));
148 pos->heartbeat.heart_status = HEART_SEND;
149
150 sp_get_bcdtime(ctime);
151 sp_protocol_req_init(&req, SP_CMD_LOGIN);
152 sp_pack_init(&pack, req.data, sizeof(req.data));
153 cw_pack_map_size(&pack, 5);
154
155 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
156 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
157 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
158 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
159 sp_pack_put_bin(&pack, PK_BIN_DEVICEKEY, (pos->sysconf.deviceKey), 8);
160
161 req.datalen += sp_pack_length(&pack);
162 sp_usart_send(pos, &req);
163 return 0;
164}
165
166//ÐÄÌøÈ·ÈÏ£¬¼ì²âÍøÂçÊÇ·ñÕý³£
167uint16 sp_async_heartbeat(sp_pos_t* pos)
168{
169 uint8 ctime[6];
170 uint8 unconfirm_transnum = 0;
171 sp_protocol_request_t req;
172 cw_pack_context pack;
173
174 pos->heartbeat.heart_status = HEART_SEND;
175 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
176 {
177 unconfirm_transnum = ((pos->last_transdtl.transaddr - pos->unconfirm_transdtl.transaddr) /
178 sizeof(sp_transdtl_t)) + 1;
179 }
180 else
181 {
182 unconfirm_transnum = 0;
183 }
184 sp_protocol_req_init(&req, SP_CMD_HEARTBEAT);
185 sp_pack_init(&pack, req.data, sizeof(req.data));
186 cw_pack_map_size(&pack, 6);
187
188 sp_get_bcdtime(ctime);
189 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
190 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
191 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
192 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
193 sp_pack_put_int(&pack, PK_INT_UNTRANSCONST, unconfirm_transnum);
194 sp_pack_put_int(&pack, PK_INT_WORKMODE, pos->sysconf.work_mode);
195
196 req.datalen += sp_pack_length(&pack);
197 sp_usart_send(pos, &req);
198 return 0;
199}
200
201static uint16 sp_confirm_qrcode_init(sp_pos_t* pos, sp_card_t* card)
202{
203 uint8 size;
204 uint16 ret;
205 int32 timeout_ms = COMM_WAIT_TIME;
206 cw_unpack_context unpack;
207 unpack_field_t field;
208 sp_protocol_response_t resp;
209
210 ret = sp_usart_recv(pos, &resp, timeout_ms);
211 if(ret)
212 {
213 ret = RC_QRCODE_FAILURE;
214 return ret;
215 }
216
217 sp_unpack_init(&unpack,resp.data,resp.datalen);
218 size = sp_unpack_map_size(&unpack);
219 while(size-- > 0)
220 {
221 sp_unpack_value(&unpack,&field);
222 if(IS_KEY(PK_STR_SHORT_URL, field.key))
223 {
224 MEMCPY(card->qrcode.qrcode_url, field.val.strval, field.strlen);
225 }
guangcheng.qin00668842019-08-19 09:45:25 +0800226 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800227 {
guangcheng.qin00668842019-08-19 09:45:25 +0800228 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800229 }
230 else if(IS_KEY(PK_INT_VAILDTIME, field.key))
231 {
232 card->qrcode.validtime = field.val.intval;
233 }
234 }
235 card->qrcode.starttime = sp_get_ticker();
236 return 0;
237}
238
239//¶þάÂë»ñÈ¡
240uint16 sp_qrcode_init(sp_pos_t* pos, sp_card_t* card)
241{
242 uint8 ctime[6];
243 sp_protocol_request_t req;
244 cw_pack_context pack;
245
246 sp_get_bcdtime(ctime);
247 sp_protocol_req_init(&req, SP_CMD_SHORTURL);
248 sp_pack_init(&pack, req.data, sizeof(req.data));
249 cw_pack_map_size(&pack, 2);
250
251 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
252 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
253
254 req.datalen += sp_pack_length(&pack);
255 sp_usart_send(pos, &req);
256 return sp_confirm_qrcode_init(pos, card);
257}
258
259//¶þάÂëÈ·ÈÏ£¬»ñȡ֧¸¶×´Ì¬
260static uint16 sp_confirm_qrcode_query(sp_pos_t* pos, sp_card_t* card)
261{
262 uint8 size;
263 uint16 ret;
264 int32 timeout_ms = COMM_WAIT_TIME;
265 cw_unpack_context unpack;
266 unpack_field_t field;
267 sp_protocol_response_t resp;
268
269 ret = sp_usart_recv(pos, &resp, timeout_ms);
270 if(ret)
271 {
272 ret = RC_QRCODE_QUERY_FAIL;
273 return ret;
274 }
275
276 sp_unpack_init(&unpack,resp.data,resp.datalen);
277 size = sp_unpack_map_size(&unpack);
278 while(size-- > 0)
279 {
280 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800281 if(IS_KEY(PK_INT_PERMIT, field.key))
282 {
283 card->permit = field.val.intval;
284 }
285 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800286 {
guangcheng.qin00668842019-08-19 09:45:25 +0800287 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800288 }
289 else if(IS_KEY(PK_INT_AUTHSTATUS, field.key))
290 {
291 card->qrcode.authstatus = field.val.intval;
292 }
293 else if(IS_KEY(PK_INT_PAYSTATUS, field.key))
294 {
295 card->qrcode.paystatus = field.val.intval;
296 }
297 else if(IS_KEY(PK_INT_PAYAMT, field.key))
298 {
299 card->qrcode.paidAmount = field.val.intval;
300 }
301 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
302 {
303 card->feepara.fee_amt = field.val.intval;
304 }
305 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
306 {
307 card->feepara.fee_unit = field.val.intval;
308 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800309 else if(IS_KEY(PK_INT_WATERLIMIT, field.key))
310 {
311 card->waterlimit = field.val.intval;
312 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800313 }
314 return resp.retcode;
315}
316
317uint16 sp_qrcode_query(sp_pos_t* pos, sp_card_t* card)
318{
319 uint8 ctime[6];
320 sp_protocol_request_t req;
321 cw_pack_context pack;
322
323 sp_get_bcdtime(ctime);
324 sp_protocol_req_init(&req, SP_CMD_QRCODE_PAY_QUERY);
325 sp_pack_init(&pack, req.data, sizeof(req.data));
326 cw_pack_map_size(&pack, 2);
327
328 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
guangcheng.qin00668842019-08-19 09:45:25 +0800329 sp_pack_put_int(&pack, PK_INT_COBILLNO, card->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800330
331 req.datalen += sp_pack_length(&pack);
332 sp_usart_send(pos, &req);
333 return sp_confirm_qrcode_query(pos, card);
334}
335
336//Á÷Ë®ÉÏ´«
guangcheng.qin00668842019-08-19 09:45:25 +0800337static uint32 transdtl_account_cobilLno = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800338static uint16 sp_async_upload_transdtl(sp_pos_t* pos, sp_transdtl_t* transdtl)
339{
340 uint8 crc[2];
341 cw_pack_context pack;
342 sp_protocol_request_t req;
343
guangcheng.qin00668842019-08-19 09:45:25 +0800344 transdtl_account_cobilLno = transdtl->cobillno;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800345 sp_protocol_req_init(&req, SP_CMD_TRANSDTL_ACCOUNT);
346 sp_pack_init(&pack,req.data,sizeof(req.data));
347 cw_pack_map_size(&pack,10);
348
349 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, transdtl->devphyid,4);
350 sp_pack_put_bin(&pack, PK_BIN_TRANSDATE, transdtl->transdate,3);
351 sp_pack_put_bin(&pack, PK_BIN_TRANSTIME, transdtl->transtime,3);
guangcheng.qin00668842019-08-19 09:45:25 +0800352 sp_pack_put_int(&pack, PK_INT_COBILLNO, transdtl->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800353 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, transdtl->cardphyid,
354 sizeof(transdtl->cardphyid));
355 sp_pack_put_int(&pack, PK_INT_TRANSWAY, transdtl->transway);
356 sp_pack_put_int(&pack, PK_INT_AMOUNT, transdtl->amount);
357 sp_pack_put_int(&pack, PK_INT_PAYAMT, transdtl->paidAmount);
358 sp_pack_put_int(&pack, PK_INT_FLOWSENSORS, transdtl->flowsensors);
359 sp_pack_put_int(&pack, PK_INT_FLAG, transdtl->transtatus);
360
361 sp_protocol_crc((uint8*)transdtl, sizeof(sp_transdtl_t)-2,crc);
362 req.datalen += sp_pack_length(&pack);
363 sp_usart_send(pos, &req);
364 return 0;
365}
366
367//È·ÈÏÁ÷ˮ״̬
368static uint8 sp_confirm_transdtl_account(sp_protocol_response_t* resp, sp_pos_t* pos)
369{
370 uint8 size;
371 cw_unpack_context unpack;
372 unpack_field_t field;
373
374 if(!resp->retcode)
375 {
376 sp_unpack_init(&unpack, resp->data, resp->datalen);
377 size = sp_unpack_map_size(&unpack);
378 while(size-- > 0)
379 {
380 sp_unpack_value(&unpack,&field);
guangcheng.qin00668842019-08-19 09:45:25 +0800381 if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800382 {
guangcheng.qin00668842019-08-19 09:45:25 +0800383 if(field.val.intval == transdtl_account_cobilLno)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800384 {
385 pos->unconfirm_transdtl.transaddr+= sizeof(sp_transdtl_t);
386 if(ADDR_TRANSDTL_END <= pos->unconfirm_transdtl.transaddr)
387 {
388 pos->unconfirm_transdtl.transaddr= ADDR_TRANSDTL_BEGIN;
389 }
390 return sp_write_unconfirm_record(pos);
391 }
392 }
393 }
394 }
395 return resp->retcode;
396
397}
398
399static uint8 sp_confirm_heartbeat(sp_protocol_response_t* resp, sp_pos_t* pos)
400{
401 uint8 size;
402 uint8 ctime[6];
403 uint8 systime[7];
404 uint8 login_flag = 0;
405 cw_unpack_context unpack;
406 unpack_field_t field;
407
408 if(resp->retcode)
409 {
410 return resp->retcode;
411 }
412 pos->heartbeat.heart_status = HEART_RECV;
413
414 sp_unpack_init(&unpack,resp->data,resp->datalen);
415 size = sp_unpack_map_size(&unpack);
416 while(size-- > 0)
417 {
418 sp_unpack_value(&unpack,&field);
419 if(IS_KEY(PK_BIN_SYSTIME, field.key))
420 {
421 if(field.strlen == 7)
422 {
423 MEMCPY(systime,field.val.binval,7);
424 sp_get_bcdtime(ctime);
425 if(MEMCMP(ctime,systime +1,5) != 0)
426 {
427 if(!sp_check_time_valid(systime +1))
428 {
429 sp_set_bcdtime(systime +1);
430 }
431 }
432 }
433 }
434 else if(IS_KEY(PK_STR_STATUS, field.key))
435 {
436 if(MEMCMP(field.val.strval, "normal", field.strlen) == 0)
437 {
438 login_flag = 1;
439 }
440 else if(MEMCMP(field.val.strval, "logout", field.strlen) == 0)
441 {
442 login_flag = 0;
443 }
444 else if(MEMCMP(field.val.strval, "closed", field.strlen) == 0)
445 {
446 login_flag = 2;
447 }
448 }
guangcheng.qin55f3fa62019-08-07 16:14:46 +0800449 else if(IS_KEY(PK_STR_UPGRADE, field.key))
450 {
451 if(MEMCMP("true",field.val.strval,4) == 0)
452 {
453 sp_manual_upgrade(pos);
454 }
455 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800456 }
457 sp_save_heartbeat_info(pos, login_flag);
458 return resp->retcode;
459}
460
461uint8 sp_confirm_login(sp_protocol_response_t* resp, sp_pos_t* pos)
462{
463 uint8 size;
464 uint8 ctime[6];
465 uint8 systime[7];
466 uint8 login_flag = 0;
467 uint8 unit = 0;
468 uint8 offline_maxhour = 0;
469 cw_unpack_context unpack;
470 unpack_field_t field;
471
472 MEMCLEAR(ctime, sizeof(ctime));
473 MEMCLEAR(systime, sizeof(systime));
474 if(resp->retcode)
475 {
476 return resp->retcode;
477 }
478 pos->heartbeat.heart_status = HEART_RECV;
479
480 sp_unpack_init(&unpack,resp->data,resp->datalen);
481 size = sp_unpack_map_size(&unpack);
482 while(size-- > 0)
483 {
484 sp_unpack_value(&unpack,&field);
485 if(IS_KEY(PK_INT_OFFLINEMAXHOUR, field.key))
486 {
487 offline_maxhour = field.val.intval;
488 }
489 else if(IS_KEY(PK_INT_PULSEINHML, field.key))
490 {
491 unit = field.val.intval;
492 }
493 else if(IS_KEY(PK_BIN_SYSTIME, field.key))
494 {
495 if(field.strlen == 7)
496 {
497 MEMCPY(systime,field.val.binval,7);
498 sp_get_bcdtime(ctime);
499 if(MEMCMP(ctime,systime +1,5) != 0)
500 {
501 if(!sp_check_time_valid(systime +1))
502 {
503 sp_set_bcdtime(systime +1);
504 }
505 }
506 }
507 }
508 }
509
510 login_flag = 1;
511 sp_save_login_info(pos, login_flag, unit, offline_maxhour);
512 return resp->retcode;
513}
514
515static protocol_cmd_t protocol_cmds[] =
516{
517 {SP_CMD_TRANSDTL_ACCOUNT, sp_confirm_transdtl_account},
518 {SP_CMD_HEARTBEAT, sp_confirm_heartbeat},
519 {SP_CMD_LOGIN, sp_confirm_login},
520 {0, NULL}
521};
522
523static uint16 sp_async_confirm_process(sp_pos_t* pos)
524{
525 uint8 ret = 0;
526 uint8 i = 0;
527 int32 timeout_ms = COMM_WAIT_TIME;
528 sp_protocol_response_t resp;
529
530 ret = sp_usart_recv(pos, &resp, timeout_ms);
531 if(ret)
532 {
533 return ret;
534 }
535 while(protocol_cmds[i].func != NULL && protocol_cmds[i].cmd != 0)
536 {
537 if(protocol_cmds[i].cmd == resp.excmd)
538 {
539 return protocol_cmds[i].func(&resp, pos);
540 }
541 ++i;
542 }
543 return 1;
544}
545
546//¼ì²âÉ豸ͨѶ״̬£¬¿ÕÏÐʱ¼ä½øÐÐÁ÷Ë®´¦ÀíµÈ¹¤×÷
547static void sp_check_and_switch_linkstat(sp_pos_t* pos)
548{
549 if(pos->heartbeat.heart_status == HEART_SEND)
550 {
551 //ÒÑ·¢ËÍÐÄÌø£¬Î´ÊÕµ½Ó¦´ð
552 pos->link_stat = 0;
553 pos->heartbeat.heart_status = HEART_INIT;
554 }
555 else if(pos->heartbeat.heart_status == HEART_RECV)
556 {
557 //ÒÑ·¢ËÍÐÄÌø£¬ÊÕµ½Ó¦´ð
558 pos->link_stat = 1;
559 pos->heartbeat.heart_status = HEART_INIT;
560 }
561}
562
563void sp_communicate(sp_pos_t* pos)
564{
565 uint16 ret = 0;
566 uint32 ticker = 0;
567 sp_transdtl_t transdtl;
568
569 if(pos->deviceno == 0)
570 {
571 return;
572 }
573 ticker = sp_get_ticker();
574 if(ticker - pos->last_comm_status.sendtime > COMM_WAIT_TIME)
575 {
576 if(pos->devlogin.last_login_ticker == 0 || pos->devlogin.login_flag == 0
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800577 || ticker - pos->devlogin.last_login_ticker > DELAY_TIME60s*30)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800578 {
guangcheng.qin00668842019-08-19 09:45:25 +0800579 pos->devlogin.last_login_ticker = ticker;
580 sp_async_equipment_login(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800581 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800582 if(pos->heartbeat.last_heartbeat_ticker == 0
583 || ticker - pos->heartbeat.last_heartbeat_ticker > DELAY_TIME60s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800584 {
guangcheng.qin00668842019-08-19 09:45:25 +0800585 pos->heartbeat.last_heartbeat_ticker = ticker;
586 sp_async_heartbeat(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800587 }
588 else
589 {
590 sp_check_and_switch_linkstat(pos);
591 if(pos->link_stat)
592 {
593 //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
594 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
595 {
596 ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&transdtl,
597 sizeof(transdtl));
598 if(!ret)
599 {
600 if(!pos->sysconf.work_mode)
601 {
602 pos->heartbeat.last_heartbeat_ticker = ticker;
603 sp_async_upload_transdtl(pos, &transdtl);
604 }
605 }
606 }
607 }
608 }
609 }
610
611 sp_async_confirm_process(pos);
612}