blob: 98d6096ec528ba7e58e005e19f75e411ebc20a35 [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.zhang4e427a12019-12-06 14:58:12 +0800115 MEMCLEAR(card->limitmsg,sizeof card->limitmsg);
116 MEMCPY(card->limitmsg,field.val.strval, field.strlen);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800117 }
118 else if(IS_KEY(PK_INT_WATERLIMIT,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800119 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800120 card->waterlimit = (uint16)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800121 }
guangcheng.qin00668842019-08-19 09:45:25 +0800122 else if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800123 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800124 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800125 }
126 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
127 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800128 card->feepara.fee_amt = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800129 }
130 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
131 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800132 card->feepara.fee_unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800133 }
134 else if(IS_KEY(PK_INT_FEESTART, field.key))
135 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800136 card->feepara.fee_start = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800137 }
zongqiang.zhangdb84c852019-12-09 10:18:01 +0800138 else if(IS_KEY(PK_INT_AMOUNT_LIMIT,field.key))
139 {
140 card->amountlimit = (uint32)field.val.intval;
141 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800142 }
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800143 //disp_hint_info(pos,"Éí·ÝÈÏÖ¤³É¹¦",DELAY_TIME1s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800144 return 0;
145}
146
147//ºǫ́¶Ô¿¨µÄÉí·ÝÈÏÖ¤
148uint16 sp_card_authentication(sp_pos_t* pos, sp_card_t* card)
149{
150 uint8 ctime[6];
151 sp_protocol_request_t req;
152 cw_pack_context pack;
153 MEMCLEAR(&req, sizeof(req));
154 MEMCLEAR(&pack, sizeof(req));
155 MEMCLEAR(ctime, sizeof ctime);
156
157 sp_get_bcdtime(ctime);
158 sp_protocol_req_init(&req, SP_CMD_CARD_AUTHENTICATION);
159 sp_pack_init(&pack, req.data, sizeof(req.data));
160 cw_pack_map_size(&pack,4);
161
162 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, card->cardphyid, 4);
guangcheng.qin0b456a32019-08-08 16:53:12 +0800163 sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, card->citizen_cardno+8, 4);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800164 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
165 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
166
167 req.datalen += sp_pack_length(&pack);
168 sp_usart_send(pos, &req);
169 return sp_confirm_card_authentication(pos, card);
170}
171
172//É豸ǩµ½
173uint16 sp_async_equipment_login(sp_pos_t* pos)
174{
175 sp_protocol_request_t req;
176 cw_pack_context pack;
177 uint8 ctime[6];
178 MEMCLEAR(ctime, sizeof(ctime));
179 pos->heartbeat.heart_status = HEART_SEND;
180
181 sp_get_bcdtime(ctime);
182 sp_protocol_req_init(&req, SP_CMD_LOGIN);
183 sp_pack_init(&pack, req.data, sizeof(req.data));
184 cw_pack_map_size(&pack, 5);
185
186 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
187 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
188 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
189 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
190 sp_pack_put_bin(&pack, PK_BIN_DEVICEKEY, (pos->sysconf.deviceKey), 8);
191
192 req.datalen += sp_pack_length(&pack);
193 sp_usart_send(pos, &req);
194 return 0;
195}
196
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800197void sp_login(sp_pos_t* pos)
198{
199 uint16 ret;
200 char msg[20];
201 sp_protocol_response_t resp;
202 disp_hint_info_two(pos,"ÕýÔڵǼ","ÇëÉÔµÈ...",0);
203 ret = sp_async_equipment_login(pos);
204 if(ret)
205 {
206 sprintf(msg,"´íÎóÂë=%d",ret);
207 disp_hint_info_two(pos,"µÇ¼ʧ°Ü",msg,DELAY_TIME3s);
208 return;
209 }
210 MEMCLEAR(&resp,sizeof resp);
zongqiang.zhang4e427a12019-12-06 14:58:12 +0800211 ret = sp_usart_recv(pos,&resp,COMM_WAIT_TIME);
212 if(ret)
213 {
214 disp_hint_info_two(pos,"µÇ¼ʧ°Ü","µÇ¼³¬Ê±",DELAY_TIME3s);
215 return;
216 }
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800217 ret = sp_confirm_login(&resp,pos);
218 if(ret)
219 {
220 disp_server_errmsg(pos,"µÇ¼ʧ°Ü",resp.data,resp.datalen);
221 return;
222 }
223 disp_hint_info(pos,"µÇ¼³É¹¦",DELAY_TIME3s);
224}
225
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800226//ÐÄÌøÈ·ÈÏ£¬¼ì²âÍøÂçÊÇ·ñÕý³£
227uint16 sp_async_heartbeat(sp_pos_t* pos)
228{
229 uint8 ctime[6];
230 uint8 unconfirm_transnum = 0;
231 sp_protocol_request_t req;
232 cw_pack_context pack;
233
234 pos->heartbeat.heart_status = HEART_SEND;
235 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
236 {
237 unconfirm_transnum = ((pos->last_transdtl.transaddr - pos->unconfirm_transdtl.transaddr) /
238 sizeof(sp_transdtl_t)) + 1;
239 }
240 else
241 {
242 unconfirm_transnum = 0;
243 }
244 sp_protocol_req_init(&req, SP_CMD_HEARTBEAT);
245 sp_pack_init(&pack, req.data, sizeof(req.data));
246 cw_pack_map_size(&pack, 6);
247
248 sp_get_bcdtime(ctime);
249 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
250 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
251 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
252 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
253 sp_pack_put_int(&pack, PK_INT_UNTRANSCONST, unconfirm_transnum);
254 sp_pack_put_int(&pack, PK_INT_WORKMODE, pos->sysconf.work_mode);
255
256 req.datalen += sp_pack_length(&pack);
257 sp_usart_send(pos, &req);
258 return 0;
259}
260
261static uint16 sp_confirm_qrcode_init(sp_pos_t* pos, sp_card_t* card)
262{
263 uint8 size;
264 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800265 cw_unpack_context unpack;
266 unpack_field_t field;
267 sp_protocol_response_t resp;
268
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800269 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800270 if(ret)
271 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800272 return RC_QRCODE_FAILURE;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800273 }
274
275 sp_unpack_init(&unpack,resp.data,resp.datalen);
276 size = sp_unpack_map_size(&unpack);
277 while(size-- > 0)
278 {
279 sp_unpack_value(&unpack,&field);
280 if(IS_KEY(PK_STR_SHORT_URL, field.key))
281 {
zongqiang.zhang4e427a12019-12-06 14:58:12 +0800282 MEMCLEAR(card->qrcode.qrcode_url,sizeof card->qrcode.qrcode_url);
283 MEMCPY(card->qrcode.qrcode_url, field.val.strval, field.strlen);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800284 }
guangcheng.qin00668842019-08-19 09:45:25 +0800285 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800286 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800287 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800288 }
289 else if(IS_KEY(PK_INT_VAILDTIME, field.key))
290 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800291 card->qrcode.validtime = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800292 }
293 }
294 card->qrcode.starttime = sp_get_ticker();
295 return 0;
296}
297
298//¶þάÂë»ñÈ¡
299uint16 sp_qrcode_init(sp_pos_t* pos, sp_card_t* card)
300{
301 uint8 ctime[6];
302 sp_protocol_request_t req;
303 cw_pack_context pack;
304
305 sp_get_bcdtime(ctime);
306 sp_protocol_req_init(&req, SP_CMD_SHORTURL);
307 sp_pack_init(&pack, req.data, sizeof(req.data));
308 cw_pack_map_size(&pack, 2);
309
310 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
311 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
312
313 req.datalen += sp_pack_length(&pack);
314 sp_usart_send(pos, &req);
315 return sp_confirm_qrcode_init(pos, card);
316}
317
318//¶þάÂëÈ·ÈÏ£¬»ñȡ֧¸¶×´Ì¬
319static uint16 sp_confirm_qrcode_query(sp_pos_t* pos, sp_card_t* card)
320{
321 uint8 size;
322 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800323 cw_unpack_context unpack;
324 unpack_field_t field;
325 sp_protocol_response_t resp;
326
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800327 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800328 if(ret)
329 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800330 return RC_QRCODE_QUERY_FAIL;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800331 }
332
333 sp_unpack_init(&unpack,resp.data,resp.datalen);
334 size = sp_unpack_map_size(&unpack);
335 while(size-- > 0)
336 {
337 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800338 if(IS_KEY(PK_INT_PERMIT, field.key))
339 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800340 card->permit = (uint8)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800341 }
342 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800343 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800344 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800345 }
346 else if(IS_KEY(PK_INT_AUTHSTATUS, field.key))
347 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800348 card->qrcode.authstatus = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800349 }
350 else if(IS_KEY(PK_INT_PAYSTATUS, field.key))
351 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800352 card->qrcode.paystatus = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800353 }
354 else if(IS_KEY(PK_INT_PAYAMT, field.key))
355 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800356 card->qrcode.paidAmount = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800357 }
358 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
359 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800360 card->feepara.fee_amt = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800361 }
362 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
363 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800364 card->feepara.fee_unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800365 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800366 else if(IS_KEY(PK_INT_WATERLIMIT, field.key))
367 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800368 card->waterlimit = (uint16)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800369 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800370 }
371 return resp.retcode;
372}
373
374uint16 sp_qrcode_query(sp_pos_t* pos, sp_card_t* card)
375{
376 uint8 ctime[6];
377 sp_protocol_request_t req;
378 cw_pack_context pack;
379
380 sp_get_bcdtime(ctime);
381 sp_protocol_req_init(&req, SP_CMD_QRCODE_PAY_QUERY);
382 sp_pack_init(&pack, req.data, sizeof(req.data));
383 cw_pack_map_size(&pack, 2);
384
385 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
guangcheng.qin00668842019-08-19 09:45:25 +0800386 sp_pack_put_int(&pack, PK_INT_COBILLNO, card->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800387
388 req.datalen += sp_pack_length(&pack);
389 sp_usart_send(pos, &req);
390 return sp_confirm_qrcode_query(pos, card);
391}
392
393//Á÷Ë®ÉÏ´«
guangcheng.qin00668842019-08-19 09:45:25 +0800394static uint32 transdtl_account_cobilLno = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800395static uint16 sp_async_upload_transdtl(sp_pos_t* pos, sp_transdtl_t* transdtl)
396{
397 uint8 crc[2];
398 cw_pack_context pack;
399 sp_protocol_request_t req;
400
guangcheng.qin00668842019-08-19 09:45:25 +0800401 transdtl_account_cobilLno = transdtl->cobillno;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800402 sp_protocol_req_init(&req, SP_CMD_TRANSDTL_ACCOUNT);
403 sp_pack_init(&pack,req.data,sizeof(req.data));
404 cw_pack_map_size(&pack,10);
405
406 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, transdtl->devphyid,4);
407 sp_pack_put_bin(&pack, PK_BIN_TRANSDATE, transdtl->transdate,3);
408 sp_pack_put_bin(&pack, PK_BIN_TRANSTIME, transdtl->transtime,3);
guangcheng.qin00668842019-08-19 09:45:25 +0800409 sp_pack_put_int(&pack, PK_INT_COBILLNO, transdtl->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800410 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, transdtl->cardphyid,
411 sizeof(transdtl->cardphyid));
412 sp_pack_put_int(&pack, PK_INT_TRANSWAY, transdtl->transway);
413 sp_pack_put_int(&pack, PK_INT_AMOUNT, transdtl->amount);
414 sp_pack_put_int(&pack, PK_INT_PAYAMT, transdtl->paidAmount);
415 sp_pack_put_int(&pack, PK_INT_FLOWSENSORS, transdtl->flowsensors);
416 sp_pack_put_int(&pack, PK_INT_FLAG, transdtl->transtatus);
417
418 sp_protocol_crc((uint8*)transdtl, sizeof(sp_transdtl_t)-2,crc);
419 req.datalen += sp_pack_length(&pack);
420 sp_usart_send(pos, &req);
421 return 0;
422}
423
424//È·ÈÏÁ÷ˮ״̬
425static uint8 sp_confirm_transdtl_account(sp_protocol_response_t* resp, sp_pos_t* pos)
426{
427 uint8 size;
428 cw_unpack_context unpack;
429 unpack_field_t field;
430
431 if(!resp->retcode)
432 {
433 sp_unpack_init(&unpack, resp->data, resp->datalen);
434 size = sp_unpack_map_size(&unpack);
435 while(size-- > 0)
436 {
437 sp_unpack_value(&unpack,&field);
guangcheng.qin00668842019-08-19 09:45:25 +0800438 if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800439 {
guangcheng.qin00668842019-08-19 09:45:25 +0800440 if(field.val.intval == transdtl_account_cobilLno)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800441 {
442 pos->unconfirm_transdtl.transaddr+= sizeof(sp_transdtl_t);
443 if(ADDR_TRANSDTL_END <= pos->unconfirm_transdtl.transaddr)
444 {
445 pos->unconfirm_transdtl.transaddr= ADDR_TRANSDTL_BEGIN;
446 }
447 return sp_write_unconfirm_record(pos);
448 }
449 }
450 }
451 }
452 return resp->retcode;
453
454}
455
456static uint8 sp_confirm_heartbeat(sp_protocol_response_t* resp, sp_pos_t* pos)
457{
458 uint8 size;
459 uint8 ctime[6];
460 uint8 systime[7];
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800461 uint8 login_flag;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800462 cw_unpack_context unpack;
463 unpack_field_t field;
464
465 if(resp->retcode)
466 {
467 return resp->retcode;
468 }
469 pos->heartbeat.heart_status = HEART_RECV;
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800470 login_flag = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800471 sp_unpack_init(&unpack,resp->data,resp->datalen);
472 size = sp_unpack_map_size(&unpack);
473 while(size-- > 0)
474 {
475 sp_unpack_value(&unpack,&field);
476 if(IS_KEY(PK_BIN_SYSTIME, field.key))
477 {
478 if(field.strlen == 7)
479 {
480 MEMCPY(systime,field.val.binval,7);
481 sp_get_bcdtime(ctime);
482 if(MEMCMP(ctime,systime +1,5) != 0)
483 {
484 if(!sp_check_time_valid(systime +1))
485 {
486 sp_set_bcdtime(systime +1);
487 }
488 }
489 }
490 }
491 else if(IS_KEY(PK_STR_STATUS, field.key))
492 {
493 if(MEMCMP(field.val.strval, "normal", field.strlen) == 0)
494 {
495 login_flag = 1;
496 }
497 else if(MEMCMP(field.val.strval, "logout", field.strlen) == 0)
498 {
499 login_flag = 0;
500 }
501 else if(MEMCMP(field.val.strval, "closed", field.strlen) == 0)
502 {
503 login_flag = 2;
504 }
505 }
guangcheng.qin55f3fa62019-08-07 16:14:46 +0800506 else if(IS_KEY(PK_STR_UPGRADE, field.key))
507 {
508 if(MEMCMP("true",field.val.strval,4) == 0)
509 {
510 sp_manual_upgrade(pos);
511 }
512 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800513 }
514 sp_save_heartbeat_info(pos, login_flag);
515 return resp->retcode;
516}
517
518uint8 sp_confirm_login(sp_protocol_response_t* resp, sp_pos_t* pos)
519{
520 uint8 size;
521 uint8 ctime[6];
522 uint8 systime[7];
523 uint8 login_flag = 0;
524 uint8 unit = 0;
525 uint8 offline_maxhour = 0;
526 cw_unpack_context unpack;
527 unpack_field_t field;
528
529 MEMCLEAR(ctime, sizeof(ctime));
530 MEMCLEAR(systime, sizeof(systime));
531 if(resp->retcode)
532 {
533 return resp->retcode;
534 }
535 pos->heartbeat.heart_status = HEART_RECV;
536
537 sp_unpack_init(&unpack,resp->data,resp->datalen);
538 size = sp_unpack_map_size(&unpack);
539 while(size-- > 0)
540 {
541 sp_unpack_value(&unpack,&field);
542 if(IS_KEY(PK_INT_OFFLINEMAXHOUR, field.key))
543 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800544 offline_maxhour = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800545 }
546 else if(IS_KEY(PK_INT_PULSEINHML, field.key))
547 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800548 unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800549 }
550 else if(IS_KEY(PK_BIN_SYSTIME, field.key))
551 {
552 if(field.strlen == 7)
553 {
554 MEMCPY(systime,field.val.binval,7);
555 sp_get_bcdtime(ctime);
556 if(MEMCMP(ctime,systime +1,5) != 0)
557 {
558 if(!sp_check_time_valid(systime +1))
559 {
560 sp_set_bcdtime(systime +1);
561 }
562 }
563 }
564 }
565 }
566
567 login_flag = 1;
568 sp_save_login_info(pos, login_flag, unit, offline_maxhour);
569 return resp->retcode;
570}
571
572static protocol_cmd_t protocol_cmds[] =
573{
574 {SP_CMD_TRANSDTL_ACCOUNT, sp_confirm_transdtl_account},
575 {SP_CMD_HEARTBEAT, sp_confirm_heartbeat},
576 {SP_CMD_LOGIN, sp_confirm_login},
577 {0, NULL}
578};
579
580static uint16 sp_async_confirm_process(sp_pos_t* pos)
581{
582 uint8 ret = 0;
583 uint8 i = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800584 sp_protocol_response_t resp;
585
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800586 ret = sp_usart_recv(pos, &resp, 100);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800587 if(ret)
588 {
589 return ret;
590 }
591 while(protocol_cmds[i].func != NULL && protocol_cmds[i].cmd != 0)
592 {
593 if(protocol_cmds[i].cmd == resp.excmd)
594 {
595 return protocol_cmds[i].func(&resp, pos);
596 }
597 ++i;
598 }
599 return 1;
600}
601
602//¼ì²âÉ豸ͨѶ״̬£¬¿ÕÏÐʱ¼ä½øÐÐÁ÷Ë®´¦ÀíµÈ¹¤×÷
603static void sp_check_and_switch_linkstat(sp_pos_t* pos)
604{
605 if(pos->heartbeat.heart_status == HEART_SEND)
606 {
607 //ÒÑ·¢ËÍÐÄÌø£¬Î´ÊÕµ½Ó¦´ð
608 pos->link_stat = 0;
609 pos->heartbeat.heart_status = HEART_INIT;
610 }
611 else if(pos->heartbeat.heart_status == HEART_RECV)
612 {
613 //ÒÑ·¢ËÍÐÄÌø£¬ÊÕµ½Ó¦´ð
614 pos->link_stat = 1;
615 pos->heartbeat.heart_status = HEART_INIT;
616 }
617}
618
619void sp_communicate(sp_pos_t* pos)
620{
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800621 uint16 ret;
622 uint32 ticker;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800623 sp_transdtl_t transdtl;
624
625 if(pos->deviceno == 0)
626 {
627 return;
628 }
629 ticker = sp_get_ticker();
630 if(ticker - pos->last_comm_status.sendtime > COMM_WAIT_TIME)
631 {
632 if(pos->devlogin.last_login_ticker == 0 || pos->devlogin.login_flag == 0
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800633 || ticker - pos->devlogin.last_login_ticker > DELAY_TIME60s*30)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800634 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800635 pos->devlogin.last_login_ticker = ticker;
636 sp_async_equipment_login(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800637 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800638 if(pos->heartbeat.last_heartbeat_ticker == 0
639 || ticker - pos->heartbeat.last_heartbeat_ticker > DELAY_TIME60s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800640 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800641 pos->heartbeat.last_heartbeat_ticker = ticker;
642 sp_async_heartbeat(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800643 }
644 else
645 {
646 sp_check_and_switch_linkstat(pos);
647 if(pos->link_stat)
648 {
649 //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
650 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
651 {
652 ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&transdtl,
653 sizeof(transdtl));
654 if(!ret)
655 {
656 if(!pos->sysconf.work_mode)
657 {
658 pos->heartbeat.last_heartbeat_ticker = ticker;
659 sp_async_upload_transdtl(pos, &transdtl);
660 }
661 }
662 }
663 }
664 }
665 }
666
667 sp_async_confirm_process(pos);
668}