blob: 7b961832aec9d902cfcaf529d057ecf8dfd702a9 [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.zhang10678fd2019-11-25 13:37:03 +080016 uint8 buf[264];
17 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;
93 int32 timeout_ms = COMM_WAIT_TIME;
94 cw_unpack_context unpack;
95 unpack_field_t field;
96 sp_protocol_response_t resp;
97
98 disp_hint_info(pos,"ÕýÔÚÉí·ÝÈÏÖ¤ÖÐ",DELAY_TIME2s);
99 ret = sp_usart_recv(pos, &resp, timeout_ms);
100 if(ret)
101 {
102 ret = RC_CARD_AUTHENTICATION;
103 return ret;
104 }
105
106 sp_unpack_init(&unpack,resp.data,resp.datalen);
107 size = sp_unpack_map_size(&unpack);
108 while(size-- > 0)
109 {
110 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800111 if(IS_KEY(PK_INT_PERMIT, field.key))
112 {
113 card->permit = field.val.intval;
114 }
115 else if(IS_KEY(PK_STR_LIMITMSG, field.key))
116 {
117 MEMCPY(card->limitmsg, field.val.strval, field.strlen);
118 }
119 else if(IS_KEY(PK_INT_WATERLIMIT,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800120 {
121 card->waterlimit = field.val.intval;
122 }
guangcheng.qin00668842019-08-19 09:45:25 +0800123 else if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800124 {
guangcheng.qin00668842019-08-19 09:45:25 +0800125 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800126 }
127 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
128 {
129 card->feepara.fee_amt = field.val.intval;
130 }
131 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
132 {
133 card->feepara.fee_unit = field.val.intval;
134 }
135 else if(IS_KEY(PK_INT_FEESTART, field.key))
136 {
137 card->feepara.fee_start = field.val.intval;
138 }
139 }
140 disp_hint_info(pos,"Éí·ÝÈÏÖ¤³É¹¦",DELAY_TIME1s);
141 return 0;
142}
143
144//ºǫ́¶Ô¿¨µÄÉí·ÝÈÏÖ¤
145uint16 sp_card_authentication(sp_pos_t* pos, sp_card_t* card)
146{
147 uint8 ctime[6];
148 sp_protocol_request_t req;
149 cw_pack_context pack;
150 MEMCLEAR(&req, sizeof(req));
151 MEMCLEAR(&pack, sizeof(req));
152 MEMCLEAR(ctime, sizeof ctime);
153
154 sp_get_bcdtime(ctime);
155 sp_protocol_req_init(&req, SP_CMD_CARD_AUTHENTICATION);
156 sp_pack_init(&pack, req.data, sizeof(req.data));
157 cw_pack_map_size(&pack,4);
158
159 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, card->cardphyid, 4);
guangcheng.qin0b456a32019-08-08 16:53:12 +0800160 sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, card->citizen_cardno+8, 4);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800161 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
162 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
163
164 req.datalen += sp_pack_length(&pack);
165 sp_usart_send(pos, &req);
166 return sp_confirm_card_authentication(pos, card);
167}
168
169//É豸ǩµ½
170uint16 sp_async_equipment_login(sp_pos_t* pos)
171{
172 sp_protocol_request_t req;
173 cw_pack_context pack;
174 uint8 ctime[6];
175 MEMCLEAR(ctime, sizeof(ctime));
176 pos->heartbeat.heart_status = HEART_SEND;
177
178 sp_get_bcdtime(ctime);
179 sp_protocol_req_init(&req, SP_CMD_LOGIN);
180 sp_pack_init(&pack, req.data, sizeof(req.data));
181 cw_pack_map_size(&pack, 5);
182
183 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
184 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
185 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
186 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
187 sp_pack_put_bin(&pack, PK_BIN_DEVICEKEY, (pos->sysconf.deviceKey), 8);
188
189 req.datalen += sp_pack_length(&pack);
190 sp_usart_send(pos, &req);
191 return 0;
192}
193
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800194void sp_login(sp_pos_t* pos)
195{
196 uint16 ret;
197 char msg[20];
198 sp_protocol_response_t resp;
199 disp_hint_info_two(pos,"ÕýÔڵǼ","ÇëÉÔµÈ...",0);
200 ret = sp_async_equipment_login(pos);
201 if(ret)
202 {
203 sprintf(msg,"´íÎóÂë=%d",ret);
204 disp_hint_info_two(pos,"µÇ¼ʧ°Ü",msg,DELAY_TIME3s);
205 return;
206 }
207 MEMCLEAR(&resp,sizeof resp);
208 sp_usart_recv(pos,&resp,COMM_WAIT_TIME);
209 ret = sp_confirm_login(&resp,pos);
210 if(ret)
211 {
212 disp_server_errmsg(pos,"µÇ¼ʧ°Ü",resp.data,resp.datalen);
213 return;
214 }
215 disp_hint_info(pos,"µÇ¼³É¹¦",DELAY_TIME3s);
216}
217
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800218//ÐÄÌøÈ·ÈÏ£¬¼ì²âÍøÂçÊÇ·ñÕý³£
219uint16 sp_async_heartbeat(sp_pos_t* pos)
220{
221 uint8 ctime[6];
222 uint8 unconfirm_transnum = 0;
223 sp_protocol_request_t req;
224 cw_pack_context pack;
225
226 pos->heartbeat.heart_status = HEART_SEND;
227 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
228 {
229 unconfirm_transnum = ((pos->last_transdtl.transaddr - pos->unconfirm_transdtl.transaddr) /
230 sizeof(sp_transdtl_t)) + 1;
231 }
232 else
233 {
234 unconfirm_transnum = 0;
235 }
236 sp_protocol_req_init(&req, SP_CMD_HEARTBEAT);
237 sp_pack_init(&pack, req.data, sizeof(req.data));
238 cw_pack_map_size(&pack, 6);
239
240 sp_get_bcdtime(ctime);
241 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
242 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
243 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
244 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
245 sp_pack_put_int(&pack, PK_INT_UNTRANSCONST, unconfirm_transnum);
246 sp_pack_put_int(&pack, PK_INT_WORKMODE, pos->sysconf.work_mode);
247
248 req.datalen += sp_pack_length(&pack);
249 sp_usart_send(pos, &req);
250 return 0;
251}
252
253static uint16 sp_confirm_qrcode_init(sp_pos_t* pos, sp_card_t* card)
254{
255 uint8 size;
256 uint16 ret;
257 int32 timeout_ms = COMM_WAIT_TIME;
258 cw_unpack_context unpack;
259 unpack_field_t field;
260 sp_protocol_response_t resp;
261
262 ret = sp_usart_recv(pos, &resp, timeout_ms);
263 if(ret)
264 {
265 ret = RC_QRCODE_FAILURE;
266 return ret;
267 }
268
269 sp_unpack_init(&unpack,resp.data,resp.datalen);
270 size = sp_unpack_map_size(&unpack);
271 while(size-- > 0)
272 {
273 sp_unpack_value(&unpack,&field);
274 if(IS_KEY(PK_STR_SHORT_URL, field.key))
275 {
276 MEMCPY(card->qrcode.qrcode_url, field.val.strval, field.strlen);
277 }
guangcheng.qin00668842019-08-19 09:45:25 +0800278 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800279 {
guangcheng.qin00668842019-08-19 09:45:25 +0800280 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800281 }
282 else if(IS_KEY(PK_INT_VAILDTIME, field.key))
283 {
284 card->qrcode.validtime = field.val.intval;
285 }
286 }
287 card->qrcode.starttime = sp_get_ticker();
288 return 0;
289}
290
291//¶þάÂë»ñÈ¡
292uint16 sp_qrcode_init(sp_pos_t* pos, sp_card_t* card)
293{
294 uint8 ctime[6];
295 sp_protocol_request_t req;
296 cw_pack_context pack;
297
298 sp_get_bcdtime(ctime);
299 sp_protocol_req_init(&req, SP_CMD_SHORTURL);
300 sp_pack_init(&pack, req.data, sizeof(req.data));
301 cw_pack_map_size(&pack, 2);
302
303 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
304 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
305
306 req.datalen += sp_pack_length(&pack);
307 sp_usart_send(pos, &req);
308 return sp_confirm_qrcode_init(pos, card);
309}
310
311//¶þάÂëÈ·ÈÏ£¬»ñȡ֧¸¶×´Ì¬
312static uint16 sp_confirm_qrcode_query(sp_pos_t* pos, sp_card_t* card)
313{
314 uint8 size;
315 uint16 ret;
316 int32 timeout_ms = COMM_WAIT_TIME;
317 cw_unpack_context unpack;
318 unpack_field_t field;
319 sp_protocol_response_t resp;
320
321 ret = sp_usart_recv(pos, &resp, timeout_ms);
322 if(ret)
323 {
324 ret = RC_QRCODE_QUERY_FAIL;
325 return ret;
326 }
327
328 sp_unpack_init(&unpack,resp.data,resp.datalen);
329 size = sp_unpack_map_size(&unpack);
330 while(size-- > 0)
331 {
332 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800333 if(IS_KEY(PK_INT_PERMIT, field.key))
334 {
335 card->permit = field.val.intval;
336 }
337 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800338 {
guangcheng.qin00668842019-08-19 09:45:25 +0800339 card->cobillno = field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800340 }
341 else if(IS_KEY(PK_INT_AUTHSTATUS, field.key))
342 {
343 card->qrcode.authstatus = field.val.intval;
344 }
345 else if(IS_KEY(PK_INT_PAYSTATUS, field.key))
346 {
347 card->qrcode.paystatus = field.val.intval;
348 }
349 else if(IS_KEY(PK_INT_PAYAMT, field.key))
350 {
351 card->qrcode.paidAmount = field.val.intval;
352 }
353 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
354 {
355 card->feepara.fee_amt = field.val.intval;
356 }
357 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
358 {
359 card->feepara.fee_unit = field.val.intval;
360 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800361 else if(IS_KEY(PK_INT_WATERLIMIT, field.key))
362 {
363 card->waterlimit = field.val.intval;
364 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800365 }
366 return resp.retcode;
367}
368
369uint16 sp_qrcode_query(sp_pos_t* pos, sp_card_t* card)
370{
371 uint8 ctime[6];
372 sp_protocol_request_t req;
373 cw_pack_context pack;
374
375 sp_get_bcdtime(ctime);
376 sp_protocol_req_init(&req, SP_CMD_QRCODE_PAY_QUERY);
377 sp_pack_init(&pack, req.data, sizeof(req.data));
378 cw_pack_map_size(&pack, 2);
379
380 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
guangcheng.qin00668842019-08-19 09:45:25 +0800381 sp_pack_put_int(&pack, PK_INT_COBILLNO, card->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800382
383 req.datalen += sp_pack_length(&pack);
384 sp_usart_send(pos, &req);
385 return sp_confirm_qrcode_query(pos, card);
386}
387
388//Á÷Ë®ÉÏ´«
guangcheng.qin00668842019-08-19 09:45:25 +0800389static uint32 transdtl_account_cobilLno = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800390static uint16 sp_async_upload_transdtl(sp_pos_t* pos, sp_transdtl_t* transdtl)
391{
392 uint8 crc[2];
393 cw_pack_context pack;
394 sp_protocol_request_t req;
395
guangcheng.qin00668842019-08-19 09:45:25 +0800396 transdtl_account_cobilLno = transdtl->cobillno;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800397 sp_protocol_req_init(&req, SP_CMD_TRANSDTL_ACCOUNT);
398 sp_pack_init(&pack,req.data,sizeof(req.data));
399 cw_pack_map_size(&pack,10);
400
401 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, transdtl->devphyid,4);
402 sp_pack_put_bin(&pack, PK_BIN_TRANSDATE, transdtl->transdate,3);
403 sp_pack_put_bin(&pack, PK_BIN_TRANSTIME, transdtl->transtime,3);
guangcheng.qin00668842019-08-19 09:45:25 +0800404 sp_pack_put_int(&pack, PK_INT_COBILLNO, transdtl->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800405 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, transdtl->cardphyid,
406 sizeof(transdtl->cardphyid));
407 sp_pack_put_int(&pack, PK_INT_TRANSWAY, transdtl->transway);
408 sp_pack_put_int(&pack, PK_INT_AMOUNT, transdtl->amount);
409 sp_pack_put_int(&pack, PK_INT_PAYAMT, transdtl->paidAmount);
410 sp_pack_put_int(&pack, PK_INT_FLOWSENSORS, transdtl->flowsensors);
411 sp_pack_put_int(&pack, PK_INT_FLAG, transdtl->transtatus);
412
413 sp_protocol_crc((uint8*)transdtl, sizeof(sp_transdtl_t)-2,crc);
414 req.datalen += sp_pack_length(&pack);
415 sp_usart_send(pos, &req);
416 return 0;
417}
418
419//È·ÈÏÁ÷ˮ״̬
420static uint8 sp_confirm_transdtl_account(sp_protocol_response_t* resp, sp_pos_t* pos)
421{
422 uint8 size;
423 cw_unpack_context unpack;
424 unpack_field_t field;
425
426 if(!resp->retcode)
427 {
428 sp_unpack_init(&unpack, resp->data, resp->datalen);
429 size = sp_unpack_map_size(&unpack);
430 while(size-- > 0)
431 {
432 sp_unpack_value(&unpack,&field);
guangcheng.qin00668842019-08-19 09:45:25 +0800433 if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800434 {
guangcheng.qin00668842019-08-19 09:45:25 +0800435 if(field.val.intval == transdtl_account_cobilLno)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800436 {
437 pos->unconfirm_transdtl.transaddr+= sizeof(sp_transdtl_t);
438 if(ADDR_TRANSDTL_END <= pos->unconfirm_transdtl.transaddr)
439 {
440 pos->unconfirm_transdtl.transaddr= ADDR_TRANSDTL_BEGIN;
441 }
442 return sp_write_unconfirm_record(pos);
443 }
444 }
445 }
446 }
447 return resp->retcode;
448
449}
450
451static uint8 sp_confirm_heartbeat(sp_protocol_response_t* resp, sp_pos_t* pos)
452{
453 uint8 size;
454 uint8 ctime[6];
455 uint8 systime[7];
456 uint8 login_flag = 0;
457 cw_unpack_context unpack;
458 unpack_field_t field;
459
460 if(resp->retcode)
461 {
462 return resp->retcode;
463 }
464 pos->heartbeat.heart_status = HEART_RECV;
465
466 sp_unpack_init(&unpack,resp->data,resp->datalen);
467 size = sp_unpack_map_size(&unpack);
468 while(size-- > 0)
469 {
470 sp_unpack_value(&unpack,&field);
471 if(IS_KEY(PK_BIN_SYSTIME, field.key))
472 {
473 if(field.strlen == 7)
474 {
475 MEMCPY(systime,field.val.binval,7);
476 sp_get_bcdtime(ctime);
477 if(MEMCMP(ctime,systime +1,5) != 0)
478 {
479 if(!sp_check_time_valid(systime +1))
480 {
481 sp_set_bcdtime(systime +1);
482 }
483 }
484 }
485 }
486 else if(IS_KEY(PK_STR_STATUS, field.key))
487 {
488 if(MEMCMP(field.val.strval, "normal", field.strlen) == 0)
489 {
490 login_flag = 1;
491 }
492 else if(MEMCMP(field.val.strval, "logout", field.strlen) == 0)
493 {
494 login_flag = 0;
495 }
496 else if(MEMCMP(field.val.strval, "closed", field.strlen) == 0)
497 {
498 login_flag = 2;
499 }
500 }
guangcheng.qin55f3fa62019-08-07 16:14:46 +0800501 else if(IS_KEY(PK_STR_UPGRADE, field.key))
502 {
503 if(MEMCMP("true",field.val.strval,4) == 0)
504 {
505 sp_manual_upgrade(pos);
506 }
507 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800508 }
509 sp_save_heartbeat_info(pos, login_flag);
510 return resp->retcode;
511}
512
513uint8 sp_confirm_login(sp_protocol_response_t* resp, sp_pos_t* pos)
514{
515 uint8 size;
516 uint8 ctime[6];
517 uint8 systime[7];
518 uint8 login_flag = 0;
519 uint8 unit = 0;
520 uint8 offline_maxhour = 0;
521 cw_unpack_context unpack;
522 unpack_field_t field;
523
524 MEMCLEAR(ctime, sizeof(ctime));
525 MEMCLEAR(systime, sizeof(systime));
526 if(resp->retcode)
527 {
528 return resp->retcode;
529 }
530 pos->heartbeat.heart_status = HEART_RECV;
531
532 sp_unpack_init(&unpack,resp->data,resp->datalen);
533 size = sp_unpack_map_size(&unpack);
534 while(size-- > 0)
535 {
536 sp_unpack_value(&unpack,&field);
537 if(IS_KEY(PK_INT_OFFLINEMAXHOUR, field.key))
538 {
539 offline_maxhour = field.val.intval;
540 }
541 else if(IS_KEY(PK_INT_PULSEINHML, field.key))
542 {
543 unit = field.val.intval;
544 }
545 else if(IS_KEY(PK_BIN_SYSTIME, field.key))
546 {
547 if(field.strlen == 7)
548 {
549 MEMCPY(systime,field.val.binval,7);
550 sp_get_bcdtime(ctime);
551 if(MEMCMP(ctime,systime +1,5) != 0)
552 {
553 if(!sp_check_time_valid(systime +1))
554 {
555 sp_set_bcdtime(systime +1);
556 }
557 }
558 }
559 }
560 }
561
562 login_flag = 1;
563 sp_save_login_info(pos, login_flag, unit, offline_maxhour);
564 return resp->retcode;
565}
566
567static protocol_cmd_t protocol_cmds[] =
568{
569 {SP_CMD_TRANSDTL_ACCOUNT, sp_confirm_transdtl_account},
570 {SP_CMD_HEARTBEAT, sp_confirm_heartbeat},
571 {SP_CMD_LOGIN, sp_confirm_login},
572 {0, NULL}
573};
574
575static uint16 sp_async_confirm_process(sp_pos_t* pos)
576{
577 uint8 ret = 0;
578 uint8 i = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800579 sp_protocol_response_t resp;
580
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800581 ret = sp_usart_recv(pos, &resp, 100);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800582 if(ret)
583 {
584 return ret;
585 }
586 while(protocol_cmds[i].func != NULL && protocol_cmds[i].cmd != 0)
587 {
588 if(protocol_cmds[i].cmd == resp.excmd)
589 {
590 return protocol_cmds[i].func(&resp, pos);
591 }
592 ++i;
593 }
594 return 1;
595}
596
597//¼ì²âÉ豸ͨѶ״̬£¬¿ÕÏÐʱ¼ä½øÐÐÁ÷Ë®´¦ÀíµÈ¹¤×÷
598static void sp_check_and_switch_linkstat(sp_pos_t* pos)
599{
600 if(pos->heartbeat.heart_status == HEART_SEND)
601 {
602 //ÒÑ·¢ËÍÐÄÌø£¬Î´ÊÕµ½Ó¦´ð
603 pos->link_stat = 0;
604 pos->heartbeat.heart_status = HEART_INIT;
605 }
606 else if(pos->heartbeat.heart_status == HEART_RECV)
607 {
608 //ÒÑ·¢ËÍÐÄÌø£¬ÊÕµ½Ó¦´ð
609 pos->link_stat = 1;
610 pos->heartbeat.heart_status = HEART_INIT;
611 }
612}
613
614void sp_communicate(sp_pos_t* pos)
615{
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800616 uint16 ret;
617 uint32 ticker;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800618 sp_transdtl_t transdtl;
619
620 if(pos->deviceno == 0)
621 {
622 return;
623 }
624 ticker = sp_get_ticker();
625 if(ticker - pos->last_comm_status.sendtime > COMM_WAIT_TIME)
626 {
627 if(pos->devlogin.last_login_ticker == 0 || pos->devlogin.login_flag == 0
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800628 || ticker - pos->devlogin.last_login_ticker > DELAY_TIME60s*30)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800629 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800630 pos->devlogin.last_login_ticker = ticker;
631 sp_async_equipment_login(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800632 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800633 if(pos->heartbeat.last_heartbeat_ticker == 0
634 || ticker - pos->heartbeat.last_heartbeat_ticker > DELAY_TIME60s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800635 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800636 pos->heartbeat.last_heartbeat_ticker = ticker;
637 sp_async_heartbeat(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800638 }
639 else
640 {
641 sp_check_and_switch_linkstat(pos);
642 if(pos->link_stat)
643 {
644 //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
645 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
646 {
647 ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&transdtl,
648 sizeof(transdtl));
649 if(!ret)
650 {
651 if(!pos->sysconf.work_mode)
652 {
653 pos->heartbeat.last_heartbeat_ticker = ticker;
654 sp_async_upload_transdtl(pos, &transdtl);
655 }
656 }
657 }
658 }
659 }
660 }
661
662 sp_async_confirm_process(pos);
663}