blob: 7ed34f97a7dbdb72645fcb6d236ba13a071ec984 [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,
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +080030 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 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800111 card->permit = (uint8)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800112 }
113 else if(IS_KEY(PK_STR_LIMITMSG, field.key))
114 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800115 snprintf(card->limitmsg,,sizeof(card->limitmsg),"%s", field.val.strval, field.strlen);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800116 }
117 else if(IS_KEY(PK_INT_WATERLIMIT,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800118 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800119 card->waterlimit = (uint16)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800120 }
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 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800123 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800124 }
125 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
126 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800127 card->feepara.fee_amt = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800128 }
129 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
130 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800131 card->feepara.fee_unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800132 }
133 else if(IS_KEY(PK_INT_FEESTART, field.key))
134 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800135 card->feepara.fee_start = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800136 }
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 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800262 return RC_QRCODE_FAILURE;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800263 }
264
265 sp_unpack_init(&unpack,resp.data,resp.datalen);
266 size = sp_unpack_map_size(&unpack);
267 while(size-- > 0)
268 {
269 sp_unpack_value(&unpack,&field);
270 if(IS_KEY(PK_STR_SHORT_URL, field.key))
271 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800272 snprintf(card->qrcode.qrcode_url,sizeof(card->qrcode.qrcode_url),"%s", field.val.strval, field.strlen);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800273 }
guangcheng.qin00668842019-08-19 09:45:25 +0800274 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800275 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800276 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800277 }
278 else if(IS_KEY(PK_INT_VAILDTIME, field.key))
279 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800280 card->qrcode.validtime = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800281 }
282 }
283 card->qrcode.starttime = sp_get_ticker();
284 return 0;
285}
286
287//¶þάÂë»ñÈ¡
288uint16 sp_qrcode_init(sp_pos_t* pos, sp_card_t* card)
289{
290 uint8 ctime[6];
291 sp_protocol_request_t req;
292 cw_pack_context pack;
293
294 sp_get_bcdtime(ctime);
295 sp_protocol_req_init(&req, SP_CMD_SHORTURL);
296 sp_pack_init(&pack, req.data, sizeof(req.data));
297 cw_pack_map_size(&pack, 2);
298
299 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
300 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
301
302 req.datalen += sp_pack_length(&pack);
303 sp_usart_send(pos, &req);
304 return sp_confirm_qrcode_init(pos, card);
305}
306
307//¶þάÂëÈ·ÈÏ£¬»ñȡ֧¸¶×´Ì¬
308static uint16 sp_confirm_qrcode_query(sp_pos_t* pos, sp_card_t* card)
309{
310 uint8 size;
311 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800312 cw_unpack_context unpack;
313 unpack_field_t field;
314 sp_protocol_response_t resp;
315
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800316 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800317 if(ret)
318 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800319 return RC_QRCODE_QUERY_FAIL;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800320 }
321
322 sp_unpack_init(&unpack,resp.data,resp.datalen);
323 size = sp_unpack_map_size(&unpack);
324 while(size-- > 0)
325 {
326 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800327 if(IS_KEY(PK_INT_PERMIT, field.key))
328 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800329 card->permit = (uint8)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800330 }
331 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800332 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800333 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800334 }
335 else if(IS_KEY(PK_INT_AUTHSTATUS, field.key))
336 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800337 card->qrcode.authstatus = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800338 }
339 else if(IS_KEY(PK_INT_PAYSTATUS, field.key))
340 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800341 card->qrcode.paystatus = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800342 }
343 else if(IS_KEY(PK_INT_PAYAMT, field.key))
344 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800345 card->qrcode.paidAmount = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800346 }
347 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
348 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800349 card->feepara.fee_amt = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800350 }
351 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
352 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800353 card->feepara.fee_unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800354 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800355 else if(IS_KEY(PK_INT_WATERLIMIT, field.key))
356 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800357 card->waterlimit = (uint16)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800358 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800359 }
360 return resp.retcode;
361}
362
363uint16 sp_qrcode_query(sp_pos_t* pos, sp_card_t* card)
364{
365 uint8 ctime[6];
366 sp_protocol_request_t req;
367 cw_pack_context pack;
368
369 sp_get_bcdtime(ctime);
370 sp_protocol_req_init(&req, SP_CMD_QRCODE_PAY_QUERY);
371 sp_pack_init(&pack, req.data, sizeof(req.data));
372 cw_pack_map_size(&pack, 2);
373
374 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
guangcheng.qin00668842019-08-19 09:45:25 +0800375 sp_pack_put_int(&pack, PK_INT_COBILLNO, card->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800376
377 req.datalen += sp_pack_length(&pack);
378 sp_usart_send(pos, &req);
379 return sp_confirm_qrcode_query(pos, card);
380}
381
382//Á÷Ë®ÉÏ´«
guangcheng.qin00668842019-08-19 09:45:25 +0800383static uint32 transdtl_account_cobilLno = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800384static uint16 sp_async_upload_transdtl(sp_pos_t* pos, sp_transdtl_t* transdtl)
385{
386 uint8 crc[2];
387 cw_pack_context pack;
388 sp_protocol_request_t req;
389
guangcheng.qin00668842019-08-19 09:45:25 +0800390 transdtl_account_cobilLno = transdtl->cobillno;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800391 sp_protocol_req_init(&req, SP_CMD_TRANSDTL_ACCOUNT);
392 sp_pack_init(&pack,req.data,sizeof(req.data));
393 cw_pack_map_size(&pack,10);
394
395 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, transdtl->devphyid,4);
396 sp_pack_put_bin(&pack, PK_BIN_TRANSDATE, transdtl->transdate,3);
397 sp_pack_put_bin(&pack, PK_BIN_TRANSTIME, transdtl->transtime,3);
guangcheng.qin00668842019-08-19 09:45:25 +0800398 sp_pack_put_int(&pack, PK_INT_COBILLNO, transdtl->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800399 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, transdtl->cardphyid,
400 sizeof(transdtl->cardphyid));
401 sp_pack_put_int(&pack, PK_INT_TRANSWAY, transdtl->transway);
402 sp_pack_put_int(&pack, PK_INT_AMOUNT, transdtl->amount);
403 sp_pack_put_int(&pack, PK_INT_PAYAMT, transdtl->paidAmount);
404 sp_pack_put_int(&pack, PK_INT_FLOWSENSORS, transdtl->flowsensors);
405 sp_pack_put_int(&pack, PK_INT_FLAG, transdtl->transtatus);
406
407 sp_protocol_crc((uint8*)transdtl, sizeof(sp_transdtl_t)-2,crc);
408 req.datalen += sp_pack_length(&pack);
409 sp_usart_send(pos, &req);
410 return 0;
411}
412
413//È·ÈÏÁ÷ˮ״̬
414static uint8 sp_confirm_transdtl_account(sp_protocol_response_t* resp, sp_pos_t* pos)
415{
416 uint8 size;
417 cw_unpack_context unpack;
418 unpack_field_t field;
419
420 if(!resp->retcode)
421 {
422 sp_unpack_init(&unpack, resp->data, resp->datalen);
423 size = sp_unpack_map_size(&unpack);
424 while(size-- > 0)
425 {
426 sp_unpack_value(&unpack,&field);
guangcheng.qin00668842019-08-19 09:45:25 +0800427 if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800428 {
guangcheng.qin00668842019-08-19 09:45:25 +0800429 if(field.val.intval == transdtl_account_cobilLno)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800430 {
431 pos->unconfirm_transdtl.transaddr+= sizeof(sp_transdtl_t);
432 if(ADDR_TRANSDTL_END <= pos->unconfirm_transdtl.transaddr)
433 {
434 pos->unconfirm_transdtl.transaddr= ADDR_TRANSDTL_BEGIN;
435 }
436 return sp_write_unconfirm_record(pos);
437 }
438 }
439 }
440 }
441 return resp->retcode;
442
443}
444
445static uint8 sp_confirm_heartbeat(sp_protocol_response_t* resp, sp_pos_t* pos)
446{
447 uint8 size;
448 uint8 ctime[6];
449 uint8 systime[7];
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800450 uint8 login_flag;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800451 cw_unpack_context unpack;
452 unpack_field_t field;
453
454 if(resp->retcode)
455 {
456 return resp->retcode;
457 }
458 pos->heartbeat.heart_status = HEART_RECV;
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800459 login_flag = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800460 sp_unpack_init(&unpack,resp->data,resp->datalen);
461 size = sp_unpack_map_size(&unpack);
462 while(size-- > 0)
463 {
464 sp_unpack_value(&unpack,&field);
465 if(IS_KEY(PK_BIN_SYSTIME, field.key))
466 {
467 if(field.strlen == 7)
468 {
469 MEMCPY(systime,field.val.binval,7);
470 sp_get_bcdtime(ctime);
471 if(MEMCMP(ctime,systime +1,5) != 0)
472 {
473 if(!sp_check_time_valid(systime +1))
474 {
475 sp_set_bcdtime(systime +1);
476 }
477 }
478 }
479 }
480 else if(IS_KEY(PK_STR_STATUS, field.key))
481 {
482 if(MEMCMP(field.val.strval, "normal", field.strlen) == 0)
483 {
484 login_flag = 1;
485 }
486 else if(MEMCMP(field.val.strval, "logout", field.strlen) == 0)
487 {
488 login_flag = 0;
489 }
490 else if(MEMCMP(field.val.strval, "closed", field.strlen) == 0)
491 {
492 login_flag = 2;
493 }
494 }
guangcheng.qin55f3fa62019-08-07 16:14:46 +0800495 else if(IS_KEY(PK_STR_UPGRADE, field.key))
496 {
497 if(MEMCMP("true",field.val.strval,4) == 0)
498 {
499 sp_manual_upgrade(pos);
500 }
501 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800502 }
503 sp_save_heartbeat_info(pos, login_flag);
504 return resp->retcode;
505}
506
507uint8 sp_confirm_login(sp_protocol_response_t* resp, sp_pos_t* pos)
508{
509 uint8 size;
510 uint8 ctime[6];
511 uint8 systime[7];
512 uint8 login_flag = 0;
513 uint8 unit = 0;
514 uint8 offline_maxhour = 0;
515 cw_unpack_context unpack;
516 unpack_field_t field;
517
518 MEMCLEAR(ctime, sizeof(ctime));
519 MEMCLEAR(systime, sizeof(systime));
520 if(resp->retcode)
521 {
522 return resp->retcode;
523 }
524 pos->heartbeat.heart_status = HEART_RECV;
525
526 sp_unpack_init(&unpack,resp->data,resp->datalen);
527 size = sp_unpack_map_size(&unpack);
528 while(size-- > 0)
529 {
530 sp_unpack_value(&unpack,&field);
531 if(IS_KEY(PK_INT_OFFLINEMAXHOUR, field.key))
532 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800533 offline_maxhour = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800534 }
535 else if(IS_KEY(PK_INT_PULSEINHML, field.key))
536 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800537 unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800538 }
539 else if(IS_KEY(PK_BIN_SYSTIME, field.key))
540 {
541 if(field.strlen == 7)
542 {
543 MEMCPY(systime,field.val.binval,7);
544 sp_get_bcdtime(ctime);
545 if(MEMCMP(ctime,systime +1,5) != 0)
546 {
547 if(!sp_check_time_valid(systime +1))
548 {
549 sp_set_bcdtime(systime +1);
550 }
551 }
552 }
553 }
554 }
555
556 login_flag = 1;
557 sp_save_login_info(pos, login_flag, unit, offline_maxhour);
558 return resp->retcode;
559}
560
561static protocol_cmd_t protocol_cmds[] =
562{
563 {SP_CMD_TRANSDTL_ACCOUNT, sp_confirm_transdtl_account},
564 {SP_CMD_HEARTBEAT, sp_confirm_heartbeat},
565 {SP_CMD_LOGIN, sp_confirm_login},
566 {0, NULL}
567};
568
569static uint16 sp_async_confirm_process(sp_pos_t* pos)
570{
571 uint8 ret = 0;
572 uint8 i = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800573 sp_protocol_response_t resp;
574
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800575 ret = sp_usart_recv(pos, &resp, 100);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800576 if(ret)
577 {
578 return ret;
579 }
580 while(protocol_cmds[i].func != NULL && protocol_cmds[i].cmd != 0)
581 {
582 if(protocol_cmds[i].cmd == resp.excmd)
583 {
584 return protocol_cmds[i].func(&resp, pos);
585 }
586 ++i;
587 }
588 return 1;
589}
590
591//¼ì²âÉ豸ͨѶ״̬£¬¿ÕÏÐʱ¼ä½øÐÐÁ÷Ë®´¦ÀíµÈ¹¤×÷
592static void sp_check_and_switch_linkstat(sp_pos_t* pos)
593{
594 if(pos->heartbeat.heart_status == HEART_SEND)
595 {
596 //ÒÑ·¢ËÍÐÄÌø£¬Î´ÊÕµ½Ó¦´ð
597 pos->link_stat = 0;
598 pos->heartbeat.heart_status = HEART_INIT;
599 }
600 else if(pos->heartbeat.heart_status == HEART_RECV)
601 {
602 //ÒÑ·¢ËÍÐÄÌø£¬ÊÕµ½Ó¦´ð
603 pos->link_stat = 1;
604 pos->heartbeat.heart_status = HEART_INIT;
605 }
606}
607
608void sp_communicate(sp_pos_t* pos)
609{
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800610 uint16 ret;
611 uint32 ticker;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800612 sp_transdtl_t transdtl;
613
614 if(pos->deviceno == 0)
615 {
616 return;
617 }
618 ticker = sp_get_ticker();
619 if(ticker - pos->last_comm_status.sendtime > COMM_WAIT_TIME)
620 {
621 if(pos->devlogin.last_login_ticker == 0 || pos->devlogin.login_flag == 0
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800622 || ticker - pos->devlogin.last_login_ticker > DELAY_TIME60s*30)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800623 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800624 pos->devlogin.last_login_ticker = ticker;
625 sp_async_equipment_login(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800626 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800627 if(pos->heartbeat.last_heartbeat_ticker == 0
628 || ticker - pos->heartbeat.last_heartbeat_ticker > DELAY_TIME60s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800629 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800630 pos->heartbeat.last_heartbeat_ticker = ticker;
631 sp_async_heartbeat(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800632 }
633 else
634 {
635 sp_check_and_switch_linkstat(pos);
636 if(pos->link_stat)
637 {
638 //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
639 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
640 {
641 ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&transdtl,
642 sizeof(transdtl));
643 if(!ret)
644 {
645 if(!pos->sysconf.work_mode)
646 {
647 pos->heartbeat.last_heartbeat_ticker = ticker;
648 sp_async_upload_transdtl(pos, &transdtl);
649 }
650 }
651 }
652 }
653 }
654 }
655
656 sp_async_confirm_process(pos);
657}