blob: ee067c4f4c5b51c246db0388d4c82dcda5af8c7d [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 }
138 }
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800139 //disp_hint_info(pos,"Éí·ÝÈÏÖ¤³É¹¦",DELAY_TIME1s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800140 return 0;
141}
142
143//ºǫ́¶Ô¿¨µÄÉí·ÝÈÏÖ¤
144uint16 sp_card_authentication(sp_pos_t* pos, sp_card_t* card)
145{
146 uint8 ctime[6];
147 sp_protocol_request_t req;
148 cw_pack_context pack;
149 MEMCLEAR(&req, sizeof(req));
150 MEMCLEAR(&pack, sizeof(req));
151 MEMCLEAR(ctime, sizeof ctime);
152
153 sp_get_bcdtime(ctime);
154 sp_protocol_req_init(&req, SP_CMD_CARD_AUTHENTICATION);
155 sp_pack_init(&pack, req.data, sizeof(req.data));
156 cw_pack_map_size(&pack,4);
157
158 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, card->cardphyid, 4);
guangcheng.qin0b456a32019-08-08 16:53:12 +0800159 sp_pack_put_bin(&pack, PK_BIN_CITIZEN_CARDNO, card->citizen_cardno+8, 4);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800160 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
161 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
162
163 req.datalen += sp_pack_length(&pack);
164 sp_usart_send(pos, &req);
165 return sp_confirm_card_authentication(pos, card);
166}
167
168//É豸ǩµ½
169uint16 sp_async_equipment_login(sp_pos_t* pos)
170{
171 sp_protocol_request_t req;
172 cw_pack_context pack;
173 uint8 ctime[6];
174 MEMCLEAR(ctime, sizeof(ctime));
175 pos->heartbeat.heart_status = HEART_SEND;
176
177 sp_get_bcdtime(ctime);
178 sp_protocol_req_init(&req, SP_CMD_LOGIN);
179 sp_pack_init(&pack, req.data, sizeof(req.data));
180 cw_pack_map_size(&pack, 5);
181
182 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
183 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
184 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
185 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
186 sp_pack_put_bin(&pack, PK_BIN_DEVICEKEY, (pos->sysconf.deviceKey), 8);
187
188 req.datalen += sp_pack_length(&pack);
189 sp_usart_send(pos, &req);
190 return 0;
191}
192
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800193void sp_login(sp_pos_t* pos)
194{
195 uint16 ret;
196 char msg[20];
197 sp_protocol_response_t resp;
198 disp_hint_info_two(pos,"ÕýÔڵǼ","ÇëÉÔµÈ...",0);
199 ret = sp_async_equipment_login(pos);
200 if(ret)
201 {
202 sprintf(msg,"´íÎóÂë=%d",ret);
203 disp_hint_info_two(pos,"µÇ¼ʧ°Ü",msg,DELAY_TIME3s);
204 return;
205 }
206 MEMCLEAR(&resp,sizeof resp);
zongqiang.zhang4e427a12019-12-06 14:58:12 +0800207 ret = sp_usart_recv(pos,&resp,COMM_WAIT_TIME);
208 if(ret)
209 {
210 disp_hint_info_two(pos,"µÇ¼ʧ°Ü","µÇ¼³¬Ê±",DELAY_TIME3s);
211 return;
212 }
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800213 ret = sp_confirm_login(&resp,pos);
214 if(ret)
215 {
216 disp_server_errmsg(pos,"µÇ¼ʧ°Ü",resp.data,resp.datalen);
217 return;
218 }
219 disp_hint_info(pos,"µÇ¼³É¹¦",DELAY_TIME3s);
220}
221
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800222//ÐÄÌøÈ·ÈÏ£¬¼ì²âÍøÂçÊÇ·ñÕý³£
223uint16 sp_async_heartbeat(sp_pos_t* pos)
224{
225 uint8 ctime[6];
226 uint8 unconfirm_transnum = 0;
227 sp_protocol_request_t req;
228 cw_pack_context pack;
229
230 pos->heartbeat.heart_status = HEART_SEND;
231 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
232 {
233 unconfirm_transnum = ((pos->last_transdtl.transaddr - pos->unconfirm_transdtl.transaddr) /
234 sizeof(sp_transdtl_t)) + 1;
235 }
236 else
237 {
238 unconfirm_transnum = 0;
239 }
240 sp_protocol_req_init(&req, SP_CMD_HEARTBEAT);
241 sp_pack_init(&pack, req.data, sizeof(req.data));
242 cw_pack_map_size(&pack, 6);
243
244 sp_get_bcdtime(ctime);
245 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
246 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
247 sp_pack_put_str(&pack, PK_STR_DEVTYPE, DEV_TYPE);
248 sp_pack_put_str(&pack, PK_STR_VERSION, PRO_VERSION);
249 sp_pack_put_int(&pack, PK_INT_UNTRANSCONST, unconfirm_transnum);
250 sp_pack_put_int(&pack, PK_INT_WORKMODE, pos->sysconf.work_mode);
251
252 req.datalen += sp_pack_length(&pack);
253 sp_usart_send(pos, &req);
254 return 0;
255}
256
257static uint16 sp_confirm_qrcode_init(sp_pos_t* pos, sp_card_t* card)
258{
259 uint8 size;
260 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800261 cw_unpack_context unpack;
262 unpack_field_t field;
263 sp_protocol_response_t resp;
264
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800265 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800266 if(ret)
267 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800268 return RC_QRCODE_FAILURE;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800269 }
270
271 sp_unpack_init(&unpack,resp.data,resp.datalen);
272 size = sp_unpack_map_size(&unpack);
273 while(size-- > 0)
274 {
275 sp_unpack_value(&unpack,&field);
276 if(IS_KEY(PK_STR_SHORT_URL, field.key))
277 {
zongqiang.zhang4e427a12019-12-06 14:58:12 +0800278 MEMCLEAR(card->qrcode.qrcode_url,sizeof card->qrcode.qrcode_url);
279 MEMCPY(card->qrcode.qrcode_url, field.val.strval, field.strlen);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800280 }
guangcheng.qin00668842019-08-19 09:45:25 +0800281 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800282 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800283 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800284 }
285 else if(IS_KEY(PK_INT_VAILDTIME, field.key))
286 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800287 card->qrcode.validtime = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800288 }
289 }
290 card->qrcode.starttime = sp_get_ticker();
291 return 0;
292}
293
294//¶þάÂë»ñÈ¡
295uint16 sp_qrcode_init(sp_pos_t* pos, sp_card_t* card)
296{
297 uint8 ctime[6];
298 sp_protocol_request_t req;
299 cw_pack_context pack;
300
301 sp_get_bcdtime(ctime);
302 sp_protocol_req_init(&req, SP_CMD_SHORTURL);
303 sp_pack_init(&pack, req.data, sizeof(req.data));
304 cw_pack_map_size(&pack, 2);
305
306 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
307 sp_pack_put_bin(&pack, PK_BIN_DEVTIME, ctime, 6);
308
309 req.datalen += sp_pack_length(&pack);
310 sp_usart_send(pos, &req);
311 return sp_confirm_qrcode_init(pos, card);
312}
313
314//¶þάÂëÈ·ÈÏ£¬»ñȡ֧¸¶×´Ì¬
315static uint16 sp_confirm_qrcode_query(sp_pos_t* pos, sp_card_t* card)
316{
317 uint8 size;
318 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800319 cw_unpack_context unpack;
320 unpack_field_t field;
321 sp_protocol_response_t resp;
322
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800323 ret = sp_usart_recv(pos, &resp, COMM_WAIT_TIME);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800324 if(ret)
325 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800326 return RC_QRCODE_QUERY_FAIL;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800327 }
328
329 sp_unpack_init(&unpack,resp.data,resp.datalen);
330 size = sp_unpack_map_size(&unpack);
331 while(size-- > 0)
332 {
333 sp_unpack_value(&unpack,&field);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800334 if(IS_KEY(PK_INT_PERMIT, field.key))
335 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800336 card->permit = (uint8)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800337 }
338 else if(IS_KEY(PK_INT_COBILLNO, field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800339 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800340 card->cobillno = (uint32)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800341 }
342 else if(IS_KEY(PK_INT_AUTHSTATUS, field.key))
343 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800344 card->qrcode.authstatus = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800345 }
346 else if(IS_KEY(PK_INT_PAYSTATUS, field.key))
347 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800348 card->qrcode.paystatus = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800349 }
350 else if(IS_KEY(PK_INT_PAYAMT, field.key))
351 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800352 card->qrcode.paidAmount = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800353 }
354 else if(IS_KEY(PK_INT_FEEAMOUNT,field.key))
355 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800356 card->feepara.fee_amt = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800357 }
358 else if(IS_KEY(PK_INT_FEEUNIT, field.key))
359 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800360 card->feepara.fee_unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800361 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800362 else if(IS_KEY(PK_INT_WATERLIMIT, field.key))
363 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800364 card->waterlimit = (uint16)field.val.intval;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800365 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800366 }
367 return resp.retcode;
368}
369
370uint16 sp_qrcode_query(sp_pos_t* pos, sp_card_t* card)
371{
372 uint8 ctime[6];
373 sp_protocol_request_t req;
374 cw_pack_context pack;
375
376 sp_get_bcdtime(ctime);
377 sp_protocol_req_init(&req, SP_CMD_QRCODE_PAY_QUERY);
378 sp_pack_init(&pack, req.data, sizeof(req.data));
379 cw_pack_map_size(&pack, 2);
380
381 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, pos->devphyid, 4);
guangcheng.qin00668842019-08-19 09:45:25 +0800382 sp_pack_put_int(&pack, PK_INT_COBILLNO, card->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800383
384 req.datalen += sp_pack_length(&pack);
385 sp_usart_send(pos, &req);
386 return sp_confirm_qrcode_query(pos, card);
387}
388
389//Á÷Ë®ÉÏ´«
guangcheng.qin00668842019-08-19 09:45:25 +0800390static uint32 transdtl_account_cobilLno = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800391static uint16 sp_async_upload_transdtl(sp_pos_t* pos, sp_transdtl_t* transdtl)
392{
393 uint8 crc[2];
394 cw_pack_context pack;
395 sp_protocol_request_t req;
396
guangcheng.qin00668842019-08-19 09:45:25 +0800397 transdtl_account_cobilLno = transdtl->cobillno;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800398 sp_protocol_req_init(&req, SP_CMD_TRANSDTL_ACCOUNT);
399 sp_pack_init(&pack,req.data,sizeof(req.data));
400 cw_pack_map_size(&pack,10);
401
402 sp_pack_put_bin(&pack, PK_BIN_DEVPHYID, transdtl->devphyid,4);
403 sp_pack_put_bin(&pack, PK_BIN_TRANSDATE, transdtl->transdate,3);
404 sp_pack_put_bin(&pack, PK_BIN_TRANSTIME, transdtl->transtime,3);
guangcheng.qin00668842019-08-19 09:45:25 +0800405 sp_pack_put_int(&pack, PK_INT_COBILLNO, transdtl->cobillno);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800406 sp_pack_put_bin(&pack, PK_BIN_CARDPHYID, transdtl->cardphyid,
407 sizeof(transdtl->cardphyid));
408 sp_pack_put_int(&pack, PK_INT_TRANSWAY, transdtl->transway);
409 sp_pack_put_int(&pack, PK_INT_AMOUNT, transdtl->amount);
410 sp_pack_put_int(&pack, PK_INT_PAYAMT, transdtl->paidAmount);
411 sp_pack_put_int(&pack, PK_INT_FLOWSENSORS, transdtl->flowsensors);
412 sp_pack_put_int(&pack, PK_INT_FLAG, transdtl->transtatus);
413
414 sp_protocol_crc((uint8*)transdtl, sizeof(sp_transdtl_t)-2,crc);
415 req.datalen += sp_pack_length(&pack);
416 sp_usart_send(pos, &req);
417 return 0;
418}
419
420//È·ÈÏÁ÷ˮ״̬
421static uint8 sp_confirm_transdtl_account(sp_protocol_response_t* resp, sp_pos_t* pos)
422{
423 uint8 size;
424 cw_unpack_context unpack;
425 unpack_field_t field;
426
427 if(!resp->retcode)
428 {
429 sp_unpack_init(&unpack, resp->data, resp->datalen);
430 size = sp_unpack_map_size(&unpack);
431 while(size-- > 0)
432 {
433 sp_unpack_value(&unpack,&field);
guangcheng.qin00668842019-08-19 09:45:25 +0800434 if(IS_KEY(PK_INT_COBILLNO,field.key))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800435 {
guangcheng.qin00668842019-08-19 09:45:25 +0800436 if(field.val.intval == transdtl_account_cobilLno)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800437 {
438 pos->unconfirm_transdtl.transaddr+= sizeof(sp_transdtl_t);
439 if(ADDR_TRANSDTL_END <= pos->unconfirm_transdtl.transaddr)
440 {
441 pos->unconfirm_transdtl.transaddr= ADDR_TRANSDTL_BEGIN;
442 }
443 return sp_write_unconfirm_record(pos);
444 }
445 }
446 }
447 }
448 return resp->retcode;
449
450}
451
452static uint8 sp_confirm_heartbeat(sp_protocol_response_t* resp, sp_pos_t* pos)
453{
454 uint8 size;
455 uint8 ctime[6];
456 uint8 systime[7];
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800457 uint8 login_flag;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800458 cw_unpack_context unpack;
459 unpack_field_t field;
460
461 if(resp->retcode)
462 {
463 return resp->retcode;
464 }
465 pos->heartbeat.heart_status = HEART_RECV;
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800466 login_flag = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800467 sp_unpack_init(&unpack,resp->data,resp->datalen);
468 size = sp_unpack_map_size(&unpack);
469 while(size-- > 0)
470 {
471 sp_unpack_value(&unpack,&field);
472 if(IS_KEY(PK_BIN_SYSTIME, field.key))
473 {
474 if(field.strlen == 7)
475 {
476 MEMCPY(systime,field.val.binval,7);
477 sp_get_bcdtime(ctime);
478 if(MEMCMP(ctime,systime +1,5) != 0)
479 {
480 if(!sp_check_time_valid(systime +1))
481 {
482 sp_set_bcdtime(systime +1);
483 }
484 }
485 }
486 }
487 else if(IS_KEY(PK_STR_STATUS, field.key))
488 {
489 if(MEMCMP(field.val.strval, "normal", field.strlen) == 0)
490 {
491 login_flag = 1;
492 }
493 else if(MEMCMP(field.val.strval, "logout", field.strlen) == 0)
494 {
495 login_flag = 0;
496 }
497 else if(MEMCMP(field.val.strval, "closed", field.strlen) == 0)
498 {
499 login_flag = 2;
500 }
501 }
guangcheng.qin55f3fa62019-08-07 16:14:46 +0800502 else if(IS_KEY(PK_STR_UPGRADE, field.key))
503 {
504 if(MEMCMP("true",field.val.strval,4) == 0)
505 {
506 sp_manual_upgrade(pos);
507 }
508 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800509 }
510 sp_save_heartbeat_info(pos, login_flag);
511 return resp->retcode;
512}
513
514uint8 sp_confirm_login(sp_protocol_response_t* resp, sp_pos_t* pos)
515{
516 uint8 size;
517 uint8 ctime[6];
518 uint8 systime[7];
519 uint8 login_flag = 0;
520 uint8 unit = 0;
521 uint8 offline_maxhour = 0;
522 cw_unpack_context unpack;
523 unpack_field_t field;
524
525 MEMCLEAR(ctime, sizeof(ctime));
526 MEMCLEAR(systime, sizeof(systime));
527 if(resp->retcode)
528 {
529 return resp->retcode;
530 }
531 pos->heartbeat.heart_status = HEART_RECV;
532
533 sp_unpack_init(&unpack,resp->data,resp->datalen);
534 size = sp_unpack_map_size(&unpack);
535 while(size-- > 0)
536 {
537 sp_unpack_value(&unpack,&field);
538 if(IS_KEY(PK_INT_OFFLINEMAXHOUR, field.key))
539 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800540 offline_maxhour = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800541 }
542 else if(IS_KEY(PK_INT_PULSEINHML, field.key))
543 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800544 unit = (uint8)field.val.intval;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800545 }
546 else if(IS_KEY(PK_BIN_SYSTIME, field.key))
547 {
548 if(field.strlen == 7)
549 {
550 MEMCPY(systime,field.val.binval,7);
551 sp_get_bcdtime(ctime);
552 if(MEMCMP(ctime,systime +1,5) != 0)
553 {
554 if(!sp_check_time_valid(systime +1))
555 {
556 sp_set_bcdtime(systime +1);
557 }
558 }
559 }
560 }
561 }
562
563 login_flag = 1;
564 sp_save_login_info(pos, login_flag, unit, offline_maxhour);
565 return resp->retcode;
566}
567
568static protocol_cmd_t protocol_cmds[] =
569{
570 {SP_CMD_TRANSDTL_ACCOUNT, sp_confirm_transdtl_account},
571 {SP_CMD_HEARTBEAT, sp_confirm_heartbeat},
572 {SP_CMD_LOGIN, sp_confirm_login},
573 {0, NULL}
574};
575
576static uint16 sp_async_confirm_process(sp_pos_t* pos)
577{
578 uint8 ret = 0;
579 uint8 i = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800580 sp_protocol_response_t resp;
581
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800582 ret = sp_usart_recv(pos, &resp, 100);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800583 if(ret)
584 {
585 return ret;
586 }
587 while(protocol_cmds[i].func != NULL && protocol_cmds[i].cmd != 0)
588 {
589 if(protocol_cmds[i].cmd == resp.excmd)
590 {
591 return protocol_cmds[i].func(&resp, pos);
592 }
593 ++i;
594 }
595 return 1;
596}
597
598//¼ì²âÉ豸ͨѶ״̬£¬¿ÕÏÐʱ¼ä½øÐÐÁ÷Ë®´¦ÀíµÈ¹¤×÷
599static void sp_check_and_switch_linkstat(sp_pos_t* pos)
600{
601 if(pos->heartbeat.heart_status == HEART_SEND)
602 {
603 //ÒÑ·¢ËÍÐÄÌø£¬Î´ÊÕµ½Ó¦´ð
604 pos->link_stat = 0;
605 pos->heartbeat.heart_status = HEART_INIT;
606 }
607 else if(pos->heartbeat.heart_status == HEART_RECV)
608 {
609 //ÒÑ·¢ËÍÐÄÌø£¬ÊÕµ½Ó¦´ð
610 pos->link_stat = 1;
611 pos->heartbeat.heart_status = HEART_INIT;
612 }
613}
614
615void sp_communicate(sp_pos_t* pos)
616{
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800617 uint16 ret;
618 uint32 ticker;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800619 sp_transdtl_t transdtl;
620
621 if(pos->deviceno == 0)
622 {
623 return;
624 }
625 ticker = sp_get_ticker();
626 if(ticker - pos->last_comm_status.sendtime > COMM_WAIT_TIME)
627 {
628 if(pos->devlogin.last_login_ticker == 0 || pos->devlogin.login_flag == 0
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800629 || ticker - pos->devlogin.last_login_ticker > DELAY_TIME60s*30)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800630 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800631 pos->devlogin.last_login_ticker = ticker;
632 sp_async_equipment_login(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800633 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800634 if(pos->heartbeat.last_heartbeat_ticker == 0
635 || ticker - pos->heartbeat.last_heartbeat_ticker > DELAY_TIME60s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800636 {
zongqiang.zhang10678fd2019-11-25 13:37:03 +0800637 pos->heartbeat.last_heartbeat_ticker = ticker;
638 sp_async_heartbeat(pos);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800639 }
640 else
641 {
642 sp_check_and_switch_linkstat(pos);
643 if(pos->link_stat)
644 {
645 //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
646 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
647 {
648 ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&transdtl,
649 sizeof(transdtl));
650 if(!ret)
651 {
652 if(!pos->sysconf.work_mode)
653 {
654 pos->heartbeat.last_heartbeat_ticker = ticker;
655 sp_async_upload_transdtl(pos, &transdtl);
656 }
657 }
658 }
659 }
660 }
661 }
662
663 sp_async_confirm_process(pos);
664}