blob: 3ea33cfae4ad471f07ad450c39c1fff6f2338f2e [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.zhang39f669b2019-12-17 10:11:14 +080039 memset(pos->errmsg,0,32);
40 pos->errmsglen = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080041 while(1)
42 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +080043
44 len = usart_read((u8*)temp,sizeof temp);
45 if(len > 0)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080046 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +080047 MEMCPY(rxBuf +rxBufLen, temp,len);
48 rxBufLen += len;
49 datalen = get_2byte_int_le(rxBuf);
50 if((datalen+2) <= rxBufLen)
51 {
52 MEMCLEAR(resp, sizeof(sp_protocol_response_t));
53 MEMCPY((uint8*)resp,rxBuf,rxBufLen);
54 MEMCLEAR(rxBuf,sizeof rxBuf);
55 rxBufLen = 0;
56 if(pos->last_comm_status.command == resp->excmd)
57 {
58 sp_protocol_crc((uint8*)resp +2,datalen -2, crc);
59 if(MEMCMP((uint8*)resp +datalen,crc,2) == 0)
60 {
61 MEMCLEAR(&(pos->last_comm_status), sizeof(sp_comm_status_t));
zongqiang.zhang39f669b2019-12-17 10:11:14 +080062 if(resp->retcode)
63 {
64 MEMCPY(pos->errmsg,resp->data,32);
65 pos->errmsglen = resp->datalen;
66 }
zongqiang.zhang10678fd2019-11-25 13:37:03 +080067 return resp->retcode;
68 }
69 }
70 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080071 }
72 if((sp_get_ticker() - tick) >= timeout_ms)
73 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +080074 return RC_COMM_TIMEOUT;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080075 }
76 }
77}
zongqiang.zhang10678fd2019-11-25 13:37:03 +080078
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080079uint8 sp_comm_call(sp_pos_t* pos, sp_protocol_request_t* req,
zongqiang.zhang10678fd2019-11-25 13:37:03 +080080 sp_protocol_response_t* resp, uint32 timeout_ms)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080081{
82 sp_usart_send(pos, req);
83 return sp_usart_recv(pos, resp, timeout_ms);
84}
85
86void sp_protocol_req_init(sp_protocol_request_t* req, uint8 command)
87{
88 MEMCLEAR(req,sizeof(sp_protocol_request_t));
89 req->command = PROTOCOL_COMMAND_V2;
90 req->excmd = command;
91 req->flag = PROTOCOL_FLAG_PACK(req->flag);
92 req->flag = PROTOCOL_WITHOUT_MAC(req->flag);
93 req->datalen = 3;
94}
95
96static uint16 sp_confirm_card_authentication(sp_pos_t* pos, sp_card_t* card)
97{
98 uint8 size;
99 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800100 cw_unpack_context unpack;
101 unpack_field_t field;
102 sp_protocol_response_t resp;
103
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800104 disp_hint_info_two(pos,"Éí·ÝÈ·ÈÏÖÐ","ÇëÉÔµÈ...",0);
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800105 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800106 if(ret)
107 {
zongqiang.zhangd0017d72019-12-06 09:26:32 +0800108 return RC_CARD_AUTHENTICATION;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800109 }
110
111 sp_unpack_init(&unpack,resp.data,resp.datalen);
112 size = sp_unpack_map_size(&unpack);
113 while(size-- > 0)
114 {
115 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800116 if(IS_KEY(PK_INT_PERMIT, field.key))
117 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800118 card->permit = (uint8)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800119 }
120 else if(IS_KEY(PK_STR_LIMITMSG, field.key))
121 {
zongqiang.zhang4e427a12019-12-06 14:58:12 +0800122 MEMCLEAR(card->limitmsg,sizeof card->limitmsg);
123 MEMCPY(card->limitmsg,field.val.strval, field.strlen);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800124 }
125 else if(IS_KEY(PK_INT_WATERLIMIT,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800126 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800127 card->waterlimit = (uint16)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800128 }
guangcheng.qin00668842019-08-19 09:45:25 +0800129 else if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800130 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800131 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800132 }
133 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
134 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800135 card->feepara.fee_amt = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800136 }
137 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
138 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800139 card->feepara.fee_unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800140 }
141 else if(IS_KEY(PK_INT_FEESTART, field.key))
142 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800143 card->feepara.fee_start = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800144 }
zongqiang.zhangdb84c852019-12-09 10:18:01 +0800145 else if(IS_KEY(PK_INT_AMOUNT_LIMIT,field.key))
146 {
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800147 card->amountlimit = (uint32)field.val.intval*10;
zongqiang.zhangdb84c852019-12-09 10:18:01 +0800148 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800149 }
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800150 //disp_hint_info(pos,"Éí·ÝÈÏÖ¤³É¹¦",DELAY_TIME1s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800151 return 0;
152}
153
154//ºǫ́¶Ô¿¨µÄÉí·ÝÈÏÖ¤
155uint16 sp_card_authentication(sp_pos_t* pos, sp_card_t* card)
156{
157 uint8 ctime[6];
158 sp_protocol_request_t req;
159 cw_pack_context pack;
160 MEMCLEAR(&req, sizeof(req));
161 MEMCLEAR(&pack, sizeof(req));
162 MEMCLEAR(ctime, sizeof ctime);
163
164 sp_get_bcdtime(ctime);
165 sp_protocol_req_init(&req, SP_CMD_CARD_AUTHENTICATION);
166 sp_pack_init(&pack, req.data, sizeof(req.data));
167 cw_pack_map_size(&pack,4);
168
169 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, card->cardphyid, 4);
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800170 sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, card->citizen_cardno, 4);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800171 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
172 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
173
174 req.datalen += sp_pack_length(&pack);
175 sp_usart_send(pos, &req);
176 return sp_confirm_card_authentication(pos, card);
177}
178
179//É豸ǩµ½
180uint16 sp_async_equipment_login(sp_pos_t* pos)
181{
182 sp_protocol_request_t req;
183 cw_pack_context pack;
184 uint8 ctime[6];
185 MEMCLEAR(ctime, sizeof(ctime));
186 pos->heartbeat.heart_status = HEART_SEND;
187
188 sp_get_bcdtime(ctime);
189 sp_protocol_req_init(&req, SP_CMD_LOGIN);
190 sp_pack_init(&pack, req.data, sizeof(req.data));
191 cw_pack_map_size(&pack, 5);
192
193 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
194 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
195 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
196 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
197 sp_pack_put_bin(&pack, PK_BIN_DEVICEKEY, (pos->sysconf.deviceKey), 8);
198
199 req.datalen += sp_pack_length(&pack);
200 sp_usart_send(pos, &req);
201 return 0;
202}
203
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800204void sp_login(sp_pos_t* pos)
205{
206 uint16 ret;
207 char msg[20];
208 sp_protocol_response_t resp;
209 disp_hint_info_two(pos,"ÕýÔڵǼ","ÇëÉÔµÈ...",0);
210 ret = sp_async_equipment_login(pos);
211 if(ret)
212 {
213 sprintf(msg,"´íÎóÂë=%d",ret);
214 disp_hint_info_two(pos,"µÇ¼ʧ°Ü",msg,DELAY_TIME3s);
215 return;
216 }
217 MEMCLEAR(&resp,sizeof resp);
zongqiang.zhang4e427a12019-12-06 14:58:12 +0800218 ret = sp_usart_recv(pos,&resp,COMM_WAIT_TIME);
219 if(ret)
220 {
221 disp_hint_info_two(pos,"µÇ¼ʧ°Ü","µÇ¼³¬Ê±",DELAY_TIME3s);
222 return;
223 }
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800224 ret = sp_confirm_login(&resp,pos);
225 if(ret)
226 {
227 disp_server_errmsg(pos,"µÇ¼ʧ°Ü",resp.data,resp.datalen);
228 return;
229 }
230 disp_hint_info(pos,"µÇ¼³É¹¦",DELAY_TIME3s);
231}
232
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800233//ÐÄÌøÈ·ÈÏ£¬¼ì²âÍøÂçÊÇ·ñÕý³£
234uint16 sp_async_heartbeat(sp_pos_t* pos)
235{
236 uint8 ctime[6];
237 uint8 unconfirm_transnum = 0;
238 sp_protocol_request_t req;
239 cw_pack_context pack;
240
241 pos->heartbeat.heart_status = HEART_SEND;
242 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
243 {
244 unconfirm_transnum = ((pos->last_transdtl.transaddr - pos->unconfirm_transdtl.transaddr) /
245 sizeof(sp_transdtl_t)) + 1;
246 }
247 else
248 {
249 unconfirm_transnum = 0;
250 }
251 sp_protocol_req_init(&req, SP_CMD_HEARTBEAT);
252 sp_pack_init(&pack, req.data, sizeof(req.data));
253 cw_pack_map_size(&pack, 6);
254
255 sp_get_bcdtime(ctime);
256 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
257 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
258 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
259 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
260 sp_pack_put_int(&pack, PK_INT_UNTRANSCONST, unconfirm_transnum);
261 sp_pack_put_int(&pack, PK_INT_WORKMODE, pos->sysconf.work_mode);
262
263 req.datalen += sp_pack_length(&pack);
264 sp_usart_send(pos, &req);
265 return 0;
266}
267
268static uint16 sp_confirm_qrcode_init(sp_pos_t* pos, sp_card_t* card)
269{
270 uint8 size;
271 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800272 cw_unpack_context unpack;
273 unpack_field_t field;
274 sp_protocol_response_t resp;
275
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800276 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800277 if(ret)
278 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800279 return RC_QRCODE_FAILURE;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800280 }
281
282 sp_unpack_init(&unpack,resp.data,resp.datalen);
283 size = sp_unpack_map_size(&unpack);
284 while(size-- > 0)
285 {
286 sp_unpack_value(&unpack,&field);
287 if(IS_KEY(PK_STR_SHORT_URL, field.key))
288 {
zongqiang.zhang4e427a12019-12-06 14:58:12 +0800289 MEMCLEAR(card->qrcode.qrcode_url,sizeof card->qrcode.qrcode_url);
290 MEMCPY(card->qrcode.qrcode_url, field.val.strval, field.strlen);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800291 }
guangcheng.qin00668842019-08-19 09:45:25 +0800292 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800293 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800294 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800295 }
296 else if(IS_KEY(PK_INT_VAILDTIME, field.key))
297 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800298 card->qrcode.validtime = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800299 }
300 }
301 card->qrcode.starttime = sp_get_ticker();
302 return 0;
303}
304
305//¶þάÂë»ñÈ¡
306uint16 sp_qrcode_init(sp_pos_t* pos, sp_card_t* card)
307{
308 uint8 ctime[6];
309 sp_protocol_request_t req;
310 cw_pack_context pack;
311
312 sp_get_bcdtime(ctime);
313 sp_protocol_req_init(&req, SP_CMD_SHORTURL);
314 sp_pack_init(&pack, req.data, sizeof(req.data));
315 cw_pack_map_size(&pack, 2);
316
317 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
318 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
319
320 req.datalen += sp_pack_length(&pack);
321 sp_usart_send(pos, &req);
322 return sp_confirm_qrcode_init(pos, card);
323}
324
325//¶þάÂëÈ·ÈÏ£¬»ñȡ֧¸¶×´Ì¬
326static uint16 sp_confirm_qrcode_query(sp_pos_t* pos, sp_card_t* card)
327{
328 uint8 size;
329 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800330 cw_unpack_context unpack;
331 unpack_field_t field;
332 sp_protocol_response_t resp;
333
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800334 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800335 if(ret)
336 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800337 return RC_QRCODE_QUERY_FAIL;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800338 }
339
340 sp_unpack_init(&unpack,resp.data,resp.datalen);
341 size = sp_unpack_map_size(&unpack);
342 while(size-- > 0)
343 {
344 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800345 if(IS_KEY(PK_INT_PERMIT, field.key))
346 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800347 card->permit = (uint8)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800348 }
349 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800350 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800351 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800352 }
353 else if(IS_KEY(PK_INT_AUTHSTATUS, field.key))
354 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800355 card->qrcode.authstatus = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800356 }
357 else if(IS_KEY(PK_INT_PAYSTATUS, field.key))
358 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800359 card->qrcode.paystatus = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800360 }
361 else if(IS_KEY(PK_INT_PAYAMT, field.key))
362 {
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800363 card->qrcode.paidAmount = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800364 }
365 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
366 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800367 card->feepara.fee_amt = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800368 }
369 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
370 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800371 card->feepara.fee_unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800372 }
zongqiang.zhangb65f1242019-12-10 16:08:16 +0800373 else if(IS_KEY(PK_INT_FEESTART,field.key))
374 {
375 card->feepara.fee_start = (uint8)field.val.intval;
376 }
377 else if(IS_KEY(PK_INT_WAITTIME,field.key))
378 {
379 card->qrcode.waittime = (uint32)field.val.intval;
380 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800381 else if(IS_KEY(PK_INT_WATERLIMIT, field.key))
382 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800383 card->waterlimit = (uint16)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800384 }
zongqiang.zhangb65f1242019-12-10 16:08:16 +0800385 else if(IS_KEY(PK_INT_AMOUNT_LIMIT,field.key))
386 {
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800387 card->amountlimit = (uint32)field.val.intval*10;
zongqiang.zhangb65f1242019-12-10 16:08:16 +0800388 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800389 }
390 return resp.retcode;
391}
392
393uint16 sp_qrcode_query(sp_pos_t* pos, sp_card_t* card)
394{
395 uint8 ctime[6];
396 sp_protocol_request_t req;
397 cw_pack_context pack;
398
399 sp_get_bcdtime(ctime);
400 sp_protocol_req_init(&req, SP_CMD_QRCODE_PAY_QUERY);
401 sp_pack_init(&pack, req.data, sizeof(req.data));
402 cw_pack_map_size(&pack, 2);
403
404 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
guangcheng.qin00668842019-08-19 09:45:25 +0800405 sp_pack_put_int(&pack, PK_INT_COBILLNO, card->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800406
407 req.datalen += sp_pack_length(&pack);
408 sp_usart_send(pos, &req);
409 return sp_confirm_qrcode_query(pos, card);
410}
411
412//Á÷Ë®ÉÏ´«
guangcheng.qin00668842019-08-19 09:45:25 +0800413static uint32 transdtl_account_cobilLno = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800414static uint16 sp_async_upload_transdtl(sp_pos_t* pos, sp_transdtl_t* transdtl)
415{
416 uint8 crc[2];
417 cw_pack_context pack;
418 sp_protocol_request_t req;
419
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800420 pos->heartbeat.heart_status = HEART_SEND;
421
guangcheng.qin00668842019-08-19 09:45:25 +0800422 transdtl_account_cobilLno = transdtl->cobillno;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800423 sp_protocol_req_init(&req, SP_CMD_TRANSDTL_ACCOUNT);
424 sp_pack_init(&pack,req.data,sizeof(req.data));
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800425 cw_pack_map_size(&pack,11);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800426
427 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, transdtl->devphyid,4);
428 sp_pack_put_bin(&pack, PK_BIN_TRANSDATE, transdtl->transdate,3);
429 sp_pack_put_bin(&pack, PK_BIN_TRANSTIME, transdtl->transtime,3);
guangcheng.qin00668842019-08-19 09:45:25 +0800430 sp_pack_put_int(&pack, PK_INT_COBILLNO, transdtl->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800431 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, transdtl->cardphyid,
432 sizeof(transdtl->cardphyid));
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800433 sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, transdtl->cardno, 4);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800434 sp_pack_put_int(&pack, PK_INT_TRANSWAY, transdtl->transway);
435 sp_pack_put_int(&pack, PK_INT_AMOUNT, transdtl->amount);
436 sp_pack_put_int(&pack, PK_INT_PAYAMT, transdtl->paidAmount);
437 sp_pack_put_int(&pack, PK_INT_FLOWSENSORS, transdtl->flowsensors);
438 sp_pack_put_int(&pack, PK_INT_FLAG, transdtl->transtatus);
439
440 sp_protocol_crc((uint8*)transdtl, sizeof(sp_transdtl_t)-2,crc);
441 req.datalen += sp_pack_length(&pack);
442 sp_usart_send(pos, &req);
443 return 0;
444}
445
446//È·ÈÏÁ÷ˮ״̬
447static uint8 sp_confirm_transdtl_account(sp_protocol_response_t* resp, sp_pos_t* pos)
448{
449 uint8 size;
450 cw_unpack_context unpack;
451 unpack_field_t field;
452
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800453 if(resp->retcode)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800454 {
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800455 return resp->retcode;
456 }
457 pos->heartbeat.heart_status = HEART_RECV;
458 sp_unpack_init(&unpack, resp->data, resp->datalen);
459 size = sp_unpack_map_size(&unpack);
460 while(size-- > 0)
461 {
462 sp_unpack_value(&unpack,&field);
463 if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800464 {
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800465 if(field.val.intval == transdtl_account_cobilLno)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800466 {
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800467 pos->unconfirm_transdtl.transaddr+= sizeof(sp_transdtl_t);
468 if(ADDR_TRANSDTL_END <= pos->unconfirm_transdtl.transaddr)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800469 {
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800470 pos->unconfirm_transdtl.transaddr= ADDR_TRANSDTL_BEGIN;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800471 }
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800472 return sp_write_unconfirm_record(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800473 }
474 }
475 }
476 return resp->retcode;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800477}
478
479static uint8 sp_confirm_heartbeat(sp_protocol_response_t* resp, sp_pos_t* pos)
480{
481 uint8 size;
482 uint8 ctime[6];
483 uint8 systime[7];
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800484 uint8 login_flag;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800485 cw_unpack_context unpack;
486 unpack_field_t field;
487
488 if(resp->retcode)
489 {
490 return resp->retcode;
491 }
492 pos->heartbeat.heart_status = HEART_RECV;
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800493 login_flag = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800494 sp_unpack_init(&unpack,resp->data,resp->datalen);
495 size = sp_unpack_map_size(&unpack);
496 while(size-- > 0)
497 {
498 sp_unpack_value(&unpack,&field);
499 if(IS_KEY(PK_BIN_SYSTIME, field.key))
500 {
501 if(field.strlen == 7)
502 {
503 MEMCPY(systime,field.val.binval,7);
504 sp_get_bcdtime(ctime);
505 if(MEMCMP(ctime,systime +1,5) != 0)
506 {
507 if(!sp_check_time_valid(systime +1))
508 {
509 sp_set_bcdtime(systime +1);
510 }
511 }
512 }
513 }
514 else if(IS_KEY(PK_STR_STATUS, field.key))
515 {
516 if(MEMCMP(field.val.strval, "normal", field.strlen) == 0)
517 {
518 login_flag = 1;
519 }
520 else if(MEMCMP(field.val.strval, "logout", field.strlen) == 0)
521 {
522 login_flag = 0;
523 }
524 else if(MEMCMP(field.val.strval, "closed", field.strlen) == 0)
525 {
526 login_flag = 2;
527 }
528 }
guangcheng.qin55f3fa62019-08-07 16:14:46 +0800529 else if(IS_KEY(PK_STR_UPGRADE, field.key))
530 {
531 if(MEMCMP("true",field.val.strval,4) == 0)
532 {
533 sp_manual_upgrade(pos);
534 }
535 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800536 }
537 sp_save_heartbeat_info(pos, login_flag);
538 return resp->retcode;
539}
540
541uint8 sp_confirm_login(sp_protocol_response_t* resp, sp_pos_t* pos)
542{
543 uint8 size;
544 uint8 ctime[6];
545 uint8 systime[7];
546 uint8 login_flag = 0;
547 uint8 unit = 0;
548 uint8 offline_maxhour = 0;
549 cw_unpack_context unpack;
550 unpack_field_t field;
551
552 MEMCLEAR(ctime, sizeof(ctime));
553 MEMCLEAR(systime, sizeof(systime));
554 if(resp->retcode)
555 {
556 return resp->retcode;
557 }
558 pos->heartbeat.heart_status = HEART_RECV;
559
560 sp_unpack_init(&unpack,resp->data,resp->datalen);
561 size = sp_unpack_map_size(&unpack);
562 while(size-- > 0)
563 {
564 sp_unpack_value(&unpack,&field);
565 if(IS_KEY(PK_INT_OFFLINEMAXHOUR, field.key))
566 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800567 offline_maxhour = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800568 }
569 else if(IS_KEY(PK_INT_PULSEINHML, field.key))
570 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800571 unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800572 }
573 else if(IS_KEY(PK_BIN_SYSTIME, field.key))
574 {
575 if(field.strlen == 7)
576 {
577 MEMCPY(systime,field.val.binval,7);
578 sp_get_bcdtime(ctime);
579 if(MEMCMP(ctime,systime +1,5) != 0)
580 {
581 if(!sp_check_time_valid(systime +1))
582 {
583 sp_set_bcdtime(systime +1);
584 }
585 }
586 }
587 }
588 }
589
590 login_flag = 1;
591 sp_save_login_info(pos, login_flag, unit, offline_maxhour);
592 return resp->retcode;
593}
594
595static protocol_cmd_t protocol_cmds[] =
596{
597 {SP_CMD_TRANSDTL_ACCOUNT, sp_confirm_transdtl_account},
598 {SP_CMD_HEARTBEAT, sp_confirm_heartbeat},
599 {SP_CMD_LOGIN, sp_confirm_login},
600 {0, NULL}
601};
602
603static uint16 sp_async_confirm_process(sp_pos_t* pos)
604{
605 uint8 ret = 0;
606 uint8 i = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800607 sp_protocol_response_t resp;
608
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800609 ret = sp_usart_recv(pos, &resp, 100);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800610 if(ret)
611 {
612 return ret;
613 }
614 while(protocol_cmds[i].func != NULL && protocol_cmds[i].cmd != 0)
615 {
616 if(protocol_cmds[i].cmd == resp.excmd)
617 {
618 return protocol_cmds[i].func(&resp, pos);
619 }
620 ++i;
621 }
622 return 1;
623}
624
625//¼ì²âÉ豸ͨѶ״̬£¬¿ÕÏÐʱ¼ä½øÐÐÁ÷Ë®´¦ÀíµÈ¹¤×÷
626static void sp_check_and_switch_linkstat(sp_pos_t* pos)
627{
628 if(pos->heartbeat.heart_status == HEART_SEND)
629 {
630 //ÒÑ·¢ËÍÐÄÌø£¬Î´ÊÕµ½Ó¦´ð
631 pos->link_stat = 0;
632 pos->heartbeat.heart_status = HEART_INIT;
633 }
634 else if(pos->heartbeat.heart_status == HEART_RECV)
635 {
636 //ÒÑ·¢ËÍÐÄÌø£¬ÊÕµ½Ó¦´ð
637 pos->link_stat = 1;
638 pos->heartbeat.heart_status = HEART_INIT;
639 }
640}
641
642void sp_communicate(sp_pos_t* pos)
643{
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800644 uint16 ret;
645 uint32 ticker;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800646 sp_transdtl_t transdtl;
647
648 if(pos->deviceno == 0)
649 {
650 return;
651 }
652 ticker = sp_get_ticker();
653 if(ticker - pos->last_comm_status.sendtime > COMM_WAIT_TIME)
654 {
655 if(pos->devlogin.last_login_ticker == 0 || pos->devlogin.login_flag == 0
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800656 || ticker - pos->devlogin.last_login_ticker > DELAY_TIME60s*30)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800657 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800658 pos->devlogin.last_login_ticker = ticker;
659 sp_async_equipment_login(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800660 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800661 if(pos->heartbeat.last_heartbeat_ticker == 0
662 || ticker - pos->heartbeat.last_heartbeat_ticker > DELAY_TIME60s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800663 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800664 pos->heartbeat.last_heartbeat_ticker = ticker;
665 sp_async_heartbeat(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800666 }
667 else
668 {
669 sp_check_and_switch_linkstat(pos);
670 if(pos->link_stat)
671 {
672 //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
673 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
674 {
675 ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&transdtl,
676 sizeof(transdtl));
677 if(!ret)
678 {
679 if(!pos->sysconf.work_mode)
680 {
681 pos->heartbeat.last_heartbeat_ticker = ticker;
682 sp_async_upload_transdtl(pos, &transdtl);
683 }
684 }
685 }
686 }
687 }
688 }
689
690 sp_async_confirm_process(pos);
691}