blob: d14f728f0618077d7ffb2a4db3260b1cc4af4215 [file] [log] [blame]
zongqiang.zhang0c6a0882019-08-07 14:48:21 +08001#include "sp_util.h"
2#include "sp_constant.h"
3#include "sp_display.h"
4#include "sp_flash.h"
5#include "sp_card.h"
6#include "sp_des.h"
7#include "sp_msgpack.h"
8#include "sp_menu.h"
9#include "sp_data.h"
10#include "sp_consume.h"
11#include "sp_communicate.h"
12
zongqiang.zhang91d35d42019-11-21 16:37:24 +080013static uint8 menu_cnt = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080014static uint16 sp_calc_payamt_by_flowsensor(sp_pos_t* pos, sp_card_t* card)
15{
16 uint32 usedcount = 0;
17
18 if(pos->purchase.paid_num < 1)
19 {
20 //Ê×ÏÈÔ¤¿ÛÒ»±Ê
21 if(card->feepara.fee_start > 0)
22 {
23 //ǰnË®Ãâ·Ñ
24 pos->purchase.prepaid_num = card->feepara.fee_start;
25 pos->purchase.prepaid_amt = 0;
26 }
27 else
28 {
29 pos->purchase.prepaid_num = card->feepara.fee_unit;
30 pos->purchase.prepaid_amt = card->feepara.fee_amt;
31 }
32 pos->purchase.used_num = 0;
33 return 0;
34 }
guangcheng.qin00668842019-08-19 09:45:25 +080035 usedcount = sp_flowsensor_get_count()/pos->sysconf.flowsensor_unit;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080036 if(usedcount < pos->purchase.paid_num)
37 {
38 //ûÓдﵽ¿Û·ÑÁ÷Á¿
39 return 0;
40 }
41 pos->purchase.used_num = pos->purchase.paid_num;
42 pos->purchase.prepaid_num = card->feepara.fee_unit;
43 pos->purchase.prepaid_amt = card->feepara.fee_amt;
44 return 0;
45}
46
47//¼ÇÕËģʽÏû·Ñ
48uint16 sp_account_purchase(uint16 amount)
49{
50 return 0;
51}
52
53static uint8 gPICC_SNR[4]; /* ¿¨Æ¬SNºÅ */
54
55void sp_test_card_state(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState, uint32 tick)
56{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +080057 uint8 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080058 sp_card_t cardpcd;
59 switch(pos->cardState.cur_state)
60 {
61 case STATE_NONE:
62 MEMCLEAR(&cardpcd, sizeof(cardpcd));
63 if(sp_card_request(&cardpcd) == 0)
64 {
65 MEMCPY(pos->cardState.snr, cardpcd.cardphyid, sizeof(cardpcd.cardphyid));
66 MEMCPY(gPICC_SNR, cardpcd.cardphyid, sizeof(cardpcd.cardphyid));
67 pos->cardState.tag_type = cardpcd.cardtype;
68 pos->cardState.cur_state = STATE_EXIST;
69 pos->cardState.firsttick = tick;
70 pos->cardState.lasttick = tick;
71 }
72 else
73 {
74 cardWorkState->errcode = RC_CARD_INVALID;
75 }
76 break;
77 case STATE_EXIST:
78 //¼ì²â¿¨ÊÇ·ñ¼ÌÐø´æÔÚ
79 if(pos->cardState.tag_type == TAG_TYPE_CPU)
80 {
81 ret = sp_check_cpu_exist();
82 if(ret)
83 {
84 pos->cardState.cur_state = STATE_NONE;
85 break;
86 }
87 else
88 {
89 memcpy(pos->cardState.snr, gPICC_SNR, 8);
90 pos->cardState.lasttick = tick;
91 }
92 }
93 break;
94 default:
95 pos->cardState.cur_state = STATE_NONE;
96 break;
97 }
98}
99
100static uint16 sp_dev_config_check(const sp_pos_t* pos)
101{
102 uint8 devphyid[4];
103 MEMCLEAR(devphyid, sizeof(devphyid));
104 if(MEMCMP(pos->devphyid, devphyid, sizeof(devphyid)) == 0)
105 {
106 return RC_DEVPHYID_NOTSET;
107 }
108 if(pos->devlogin.login_flag != 1)
109 {
110 return RC_DEV_NOT_LOGIN;
111 }
112 if(pos->sysconf.work_mode == 9)
113 {
114 return RC_DEV_FAULT;
115 }
116 if(pos->sysconf.flowsensor_unit == 0)
117 {
118 return RC_DEV_NOSET_FLOWSENSOR_UNIT;
119 }
120 return 0;
121}
122
123//¶ÁÈ¡µÚÒ»±ÊδÉÏ´«Á÷Ë®Ïû·ÑÈÕÆÚʱ¼ä
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800124static uint8 sp_read_unconfirm_first_record(const sp_pos_t* pos,uint8 termtime[6])
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800125{
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800126 sp_transdtl_t record;
127 uint16 ret;
128 uint8 crc[2];
129 //¼ì²âµ±Ç°ÊÇ·ñÓÐδÉÏ´«µÄÁ÷Ë®
130 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
131 {
132 ret = sp_flash_read((uint32)pos->unconfirm_transdtl.transaddr, (uint8*)&record,
133 sizeof(record));
134 if(!ret)
135 {
136 sp_protocol_crc((uint8*)&record, sizeof(record)-2,crc);
137 if(MEMCMP(record.crc,crc, 2) == 0)
138 {
139 MEMCPY(termtime,record.transdate, 3);
140 MEMCPY(termtime +3,record.transtime,3);
141 return 0;
142 }
143 }
144 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800145 return 1;
146}
147
148static uint16 sp_dev_offline_check(const sp_pos_t* pos)
149{
150 uint8 ret;
151 uint8 record_termtime[6];
152 uint8 ctime[6];
153 int32 nowtime;
154 int32 dtltime;
155
156 if(pos->sysconf.dev_offline_maxhour == 0)
157 {
158 return 0;
159 }
160 memset(record_termtime,0,sizeof(record_termtime));
zongqiang.zhang4e427a12019-12-06 14:58:12 +0800161 ret = sp_read_unconfirm_first_record(pos,record_termtime);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800162 if(ret)
163 {
164 return 0;
165 }
166 sp_get_bcdtime(ctime);
167 nowtime = format_time_covert_secs(ctime);
168 dtltime = format_time_covert_secs(record_termtime);
169
170 /**
171 *Á÷ˮʱ¼ä´óÓÚÉ豸ʱÖÓÇÒ³¬¹ý24Сʱ
172 **/
173 if((dtltime > nowtime) &&
174 ((dtltime - nowtime) > (24*60*DELAY_TIME60s)))
175 {
176 if(sp_valve_state())
177 {
178 sp_valve_off();
179 }
180 return RC_DEV_OFFLINE_ERROR;
181 }
182 /**
183 *Á÷ˮʱ¼äСÓÚÉ豸ʱÖÓÇÒ³¬¹ýãÐÖµ
184 **/
185 if((dtltime < nowtime) &&
186 ((nowtime - dtltime) > (pos->sysconf.dev_offline_maxhour*3600)))
187 {
188 if(sp_valve_state())
189 {
190 sp_valve_off();
191 }
192 return RC_DEV_OFFLINE_ERROR;
193 }
194 return 0;
195}
196
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800197static uint16 sp_check_dev(const sp_pos_t* pos)
198{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800199 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800200 uint8 ctime[6];
201 MEMCLEAR(ctime, sizeof(ctime));
202 sp_get_bcdtime(ctime);
203 if(pos->load_para_status)
204 {
205 return pos->load_para_status;
206 }
207 ret = sp_dev_config_check(pos);
208 if(ret)
209 {
210 return ret;
211 }
212 ret = sp_dev_offline_check(pos);
213 if(ret)
214 {
215 return ret;
216 }
217
218 return 0;
219}
220
221static uint16 do_idle(sp_pos_t* pos)
222{
223 uint8 ctime[6];
224 MEMCLEAR(ctime, sizeof(ctime));
225 sp_get_bcdtime(ctime);
226 show_home(pos);
227 return 0;
228}
229
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800230static uint16 do_card_check(sp_pos_t* pos,sp_card_t* card)
231{
232 if(card->permit == 1)
233 {
234 return RC_LIMIT_CONSUMPTION;
235 }
236 return 0;
237}
238
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800239static uint16 do_new(sp_pos_t* pos, sp_card_t* card)
240{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800241 uint16 ret;
zongqiang.zhangdb84c852019-12-09 10:18:01 +0800242 MEMCLEAR(card,sizeof(sp_card_t));
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800243 card->cardtype = pos->cardState.tag_type;
244 MEMCPY(card->cardphyid, pos->cardState.snr, 4);
245 ret = sp_card_read(card);
246 if(ret)
247 {
zongqiang.zhangd0017d72019-12-06 09:26:32 +0800248 return RC_CARD_INVALID;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800249 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800250 if(pos->load_para_status)
251 {
252 return pos->load_para_status;
253 }
254 ret = sp_dev_config_check(pos);
255 if(ret)
256 {
257 return ret;
258 }
259 ret = sp_dev_offline_check(pos);
260 if(ret)
261 {
262 return ret;
263 }
264
guangcheng.qin0b456a32019-08-08 16:53:12 +0800265 ret = sp_card_authentication(pos, card);
266 if(ret)
267 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800268 return ret;
269 }
270 ret = do_card_check(pos,card);
271 if(ret)
272 {
273 return ret;
guangcheng.qin0b456a32019-08-08 16:53:12 +0800274 }
zongqiang.zhang9f86cf12019-12-09 10:32:57 +0800275 ret = sp_prepare_behalf_transdtl(pos, card);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800276 if(ret)
277 {
278 return ret;
279 }
280 pos->sysconf.work_mode = 1;
281 pos->paymode = PAYMODE_CARD;
282 return 0;
283}
284
285static uint16 do_start(sp_pos_t* pos)
286{
287 MEMCLEAR(&pos->purchase,sizeof(sp_purchase_t));
288 sp_flowsensor_count_clear();
289 sp_get_bcdtime(pos->purchase.starttime);
290 sp_valve_on();
291 show_money(pos, pos->purchase.paid_sum);
292 return 0;
293}
294
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800295static uint16 do_work(sp_pos_t* pos, sp_card_t* card)
296{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800297 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800298 //¼ÆËãÏû·Ñ½ð¶î
299 ret = sp_calc_payamt_by_flowsensor(pos, card);
300 if(ret)
301 {
302 return ret;
303 }
304 if(pos->purchase.prepaid_amt > 0)
305 {
306 //ĬÈϼÇÕËģʽ
307 ret = sp_account_purchase(pos->purchase.prepaid_amt);
308 if(ret)
309 {
310 return ret;
311 }
312 }
313
314 if(pos->purchase.prepaid_num > 0)
315 {
zongqiang.zhangbccfdad2020-08-04 18:07:22 +0800316 if((pos->purchase.paid_num +pos->purchase.prepaid_num) >= card->waterlimit)
317 {
318 return RC_WATER_LIMIT_OUT;
319 }
320 else if((pos->purchase.paid_sum +pos->purchase.prepaid_amt) >= card->amountlimit)
321 {
322 return RC_AMOUNT_LIMIT_OUT;
323 }
324
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800325 pos->purchase.paid_num += pos->purchase.prepaid_num;
326 pos->purchase.paid_sum += pos->purchase.prepaid_amt;
327 pos->purchase.prepaid_num = 0;
328 pos->purchase.prepaid_amt = 0;
329 }
330 show_money(pos, pos->purchase.paid_sum);
331 return 0;
332}
333
334static uint16 do_stop(sp_pos_t* pos, sp_card_t* card)
335{
336 uint16 ret;
zongqiang.zhang4c98bf52019-12-06 16:59:17 +0800337 char msg[32];
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800338 sp_valve_off();
339
zongqiang.zhangb65f1242019-12-10 16:08:16 +0800340 /**
341 **ÓÉÓÚÊÇÏȿ۷ѺóʹÓ㬷ÀÖ¹Ö»²å¿¨Ê±¿Û·Ñ
342 **/
zongqiang.zhang3f62d902019-12-10 17:24:46 +0800343 if(pos->purchase.used_num == 0)
zongqiang.zhangb65f1242019-12-10 16:08:16 +0800344 {
345 pos->purchase.paid_num = 0;
346 pos->purchase.paid_sum = 0;
zongqiang.zhang3f62d902019-12-10 17:24:46 +0800347 }
zongqiang.zhang9f86cf12019-12-09 10:32:57 +0800348 ret = sp_prepare_below_transdtl(pos, card);
zongqiang.zhang4c98bf52019-12-06 16:59:17 +0800349 if(ret)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800350 {
zongqiang.zhang4c98bf52019-12-06 16:59:17 +0800351 return ret;
352 }
353 if(pos->purchase.paid_sum > 0)
354 {
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800355 sprintf(msg,"¹²¼Æ %0.3fÔª",pos->purchase.paid_sum/1000.0f);
zongqiang.zhang4c98bf52019-12-06 16:59:17 +0800356 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ",msg,DELAY_TIME2s);
357 }
358 else
359 {
360 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ","Ãâ·ÑʹÓÃ",DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800361 }
362 pos->paymode = PAYMODE_INIT;
363 pos->sysconf.work_mode = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800364 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
365 MEMCLEAR(card, sizeof(sp_card_t));
366 return 0;
367}
368
369static void do_pause(sp_pos_t* pos)
370{
371 char msg[17];
372 MEMCLEAR(msg, sizeof(msg));
373 sp_valve_off();
374 if(pos->purchase.paid_sum > 0)
375 {
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800376 sprintf(msg,"¹²¼Æ %0.3fÔª",pos->purchase.paid_sum/1000.0f);
zongqiang.zhang4c98bf52019-12-06 16:59:17 +0800377 disp_hint_info_two(pos,"ÔÝÍ£¼Æ·Ñ",msg,DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800378 }
379 else
380 {
zongqiang.zhang4c98bf52019-12-06 16:59:17 +0800381 disp_hint_info_two(pos,"ÔÝÍ£¼Æ·Ñ","Ãâ·ÑʹÓÃ",DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800382 }
383}
384
385static void do_error(sp_pos_t* pos, uint16 errcode)
386{
zongqiang.zhang578c6eb2020-08-04 16:16:22 +0800387 sp_valve_off();
388
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800389 if(errcode)
390 {
391 show_error(pos,"²Ù×÷ʧ°Ü:",errcode);
392 pos->paymode = PAYMODE_INIT;
393 pos->sysconf.work_mode = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800394 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
395 }
396}
397
398static uint16 sp_card_exist_handle(sp_pos_t* pos, sp_card_t* card,
399 sp_cardworkstate_t* cardWorkState)
400{
401 uint16 ret = 0;
402 uint16 err = 0;
403 sp_card_t cardpcd;
404 switch(cardWorkState->current_state)
405 {
406 case CARDWORKSTATUS_NONE:
zongqiang.zhang60427fc2020-08-03 18:16:14 +0800407 if(timer_get_ticker() - pos->cardState.firsttick < 500)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800408 {
409 break;
410 }
411 ret = do_new(pos, card);
412 if(ret)
413 {
414 if(0x1018 == ret || 0x2001 == ret||
415 0x1014 == ret || 0x1030 == ret)
416 {
417 if(0 == sp_card_request(&cardpcd))
418 {
419 break;
420 }
421 }
422 cardWorkState->errcode = ret;
423 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
424 break;
425 }
426 cardWorkState->current_state = CARDWORKSTATUS_READY;
427 break;
428 case CARDWORKSTATUS_READY:
429 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
430 {
431 cardWorkState->current_state = CARDWORKSTATUS_NONE;
432 break;
433 }
434 ret = do_start(pos);
435 if(ret)
436 {
437 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
438 break;
439 }
440 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
441 break;
442 case CARDWORKSTATUS_PAUSE:
443 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
444 break;
445 case CARDWORKSTATUS_WORKING:
446 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
447 {
448 ret = RC_NOT_SAME_CARD;
449 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
450 break;
451 }
452 cardWorkState->pause_status = 0;
453 ret = do_work(pos, card);
zongqiang.zhangbccfdad2020-08-04 18:07:22 +0800454 if(RC_WATER_LIMIT_OUT == ret)
455 {
456 sp_valve_off();
457 disp_hint_info_two(pos, "Í£Ö¹³öË®","ÒÑ´ïµ¥´Î³öË®ÉÏÏÞ", DELAY_TIME2s);
458 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
459 break;
460 }
461 else if(RC_AMOUNT_LIMIT_OUT == ret)
462 {
463 sp_valve_off();
464 disp_hint_info_two(pos, "Í£Ö¹³öË®","ÒÑ´ïµ¥´Î½ð¶îÉÏÏÞ", DELAY_TIME2s);
465 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
466 break;
467 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800468 if(ret)
469 {
zongqiang.zhangbccfdad2020-08-04 18:07:22 +0800470 sp_valve_off();
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800471 show_error(pos,"Ïû·Ñʧ°Ü",ret);
472 err = do_stop(pos, card);
473 if(err != 0)
474 {
475 ret = err;
476 }
477 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
478 break;
479 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800480 cardWorkState->pause_tick = timer_get_ticker();
481 break;
482 case CARDWORKSTATUS_STOPPING:
483 ret = do_stop(pos, card);
484 if(ret)
485 {
486 cardWorkState->errcode = ret;
487 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
488 break;
489 }
490 cardWorkState->current_state = CARDWORKSTATUS_STOPPED;
491 break;
492 case CARDWORKSTATUS_STOPPED:
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800493 disp_hint_info_two(pos,"Í£Ö¹³öË®", "ÇëÄÃ×ß¿¨", DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800494 break;
495 case CARDWORKSTATUS_FEECARD_WORKING:
496 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
497 {
498 cardWorkState->current_state = CARDWORKSTATUS_NONE;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800499 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800500 break;
501 case CARDWORKSTATUS_ERROR:
502 do_error(pos, cardWorkState->errcode);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800503 break;
504 default:
505 Delay_ms(DELAY_TIME200ms);
506 cardWorkState->current_state = CARDWORKSTATUS_NONE;
507 break;
508 }
509 cardWorkState->errcode = ret;
510 return ret;
511}
512
513static uint16 sp_card_noexist_handle(sp_pos_t* pos, sp_card_t* card,
514 sp_cardworkstate_t* cardWorkState)
515{
516 //Óп¨µ½ÎÞ¿¨
517 uint16 ret = 0;
518 switch(cardWorkState->current_state)
519 {
520 case CARDWORKSTATUS_NONE:
521 do_idle(pos);
522 break;
523 case CARDWORKSTATUS_READY:
524 cardWorkState->current_state = CARDWORKSTATUS_NONE;
525 break;
526 case CARDWORKSTATUS_WORKING:
zongqiang.zhang4c98bf52019-12-06 16:59:17 +0800527 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800528 break;
529 case CARDWORKSTATUS_PAUSE:
530 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) == 0)
531 {
532 //¿¨ÄÃ×ßÒ»·ÖÖÓÖ®ÄÚĬÈÏÔÝͣʹÓÃ
533 if((timer_get_ticker() - cardWorkState->pause_tick) <= DELAY_TIME60s)
534 {
535 if(!cardWorkState->pause_status)
536 {
537 do_pause(pos);
538 show_home(pos);
539 }
540 show_home(pos);
541 cardWorkState->pause_status = 1;
542 }
543 else
544 {
545 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
546 cardWorkState->pause_status = 0;
547 }
548 }
549 else
550 {
551 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
552 cardWorkState->pause_status = 0;
553 }
554 cardWorkState->last_state = CARDWORKSTATUS_PAUSE;
555 break;
556 case CARDWORKSTATUS_STOPPING:
557 ret = do_stop(pos, card);
558 if(ret)
559 {
560 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
561 break;
562 }
zongqiang.zhang4c98bf52019-12-06 16:59:17 +0800563 cardWorkState->current_state = CARDWORKSTATUS_NONE;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800564 cardWorkState->tick = timer_get_ticker();
565 break;
566 case CARDWORKSTATUS_STOPPED:
567 if(timer_get_ticker() - cardWorkState->tick > DELAY_TIME3s)
568 {
569 cardWorkState->current_state = CARDWORKSTATUS_NONE;
570 cardWorkState->last_state = cardWorkState->current_state;
571 cardWorkState->tick = 0;
572 }
573 break;
574 case CARDWORKSTATUS_SET_DEV:
575 if(sp_check_passwd(pos, "É豸¹ÜÀíÃÜÂë", "\x9\x1\x4\x3\x8\x7") == 0)
576 {
577 sp_menu_options(pos);
578 }
579 cardWorkState->current_state = CARDWORKSTATUS_NONE;
580 break;
581 case CARDWORKSTATUS_ERROR:
582 do_error(pos,cardWorkState->errcode);
583 cardWorkState->current_state = CARDWORKSTATUS_NONE;
584 break;
585 default:
586 Delay_ms(DELAY_TIME200ms);
587 cardWorkState->current_state = CARDWORKSTATUS_NONE;
588 break;
589 }
590 cardWorkState->errcode = ret;
591 return ret;
592}
593
594static sp_card_t CARD;
595void sp_card_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
596{
597 if(pos->cardState.cur_state)
598 {
599 sp_card_exist_handle(pos, &CARD, cardWorkState);
600 }
601 else
602 {
603 sp_card_noexist_handle(pos, &CARD, cardWorkState);
604 }
605}
606
607void sp_confirm_paymode(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
608{
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800609 uint8 keycode;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800610 keycode = sp_get_key();
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800611 if(keycode != SP_KEY_NONE)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800612 {
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800613 //°´0¼ü½øÈëÉ豸²Ù×÷½çÃæ
614 if((keycode == SP_KEY_0) && (pos->paymode == PAYMODE_INIT))
615 {
616 menu_cnt++;
617 if(menu_cnt > 6)
618 {
619 menu_cnt = 0;
620 cardWorkState->current_state = CARDWORKSTATUS_SET_DEV;
621 }
622 return;
623 }
624 menu_cnt = 0;
625
626 //ÔÚ¿¨Ïû·ÑÔÝÍ£Çé¿öϰ´ÈÎÒâ¼üΪ½áÊøµ±Ç°Ïû·Ñ״̬
627 if((pos->cardState.cur_state == STATE_NONE)
628 && (cardWorkState->current_state == CARDWORKSTATUS_PAUSE)
629 && (pos->paymode == PAYMODE_CARD))
630 {
631 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
632 return;
633 }
634 //Ïû·Ñģʽ³õʼ»¯×´Ì¬Ï°´È·ÈϼüÑ¡Ôñ¶þάÂëÏû·Ñ
635 if((keycode == SP_KEY_ENTER) && (pos->paymode == PAYMODE_INIT))
636 {
637 cardWorkState->current_state = CARDWORKSTATUS_NONE;
638 pos->paymode = PAYMODE_QRCODE;
639 return;
640 }
641 //¶þάÂëģʽϰ´È¡Ïû¼üΪֹͣ¹¤×÷
642 if((keycode == SP_KEY_CLEAR) && (pos->paymode == PAYMODE_QRCODE))
643 {
644 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
645 return;
646 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800647 }
648}
649
650//¶þάÂëÏû·Ñ´¦Àí
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800651static uint32 tick = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800652void sp_qrcode_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
653{
654 uint16 ret = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800655 switch(cardWorkState->current_state)
656 {
657 case CARDWORKSTATUS_NONE:
658 ret = sp_check_dev(pos);
659 if(ret)
660 {
661 cardWorkState->errcode = ret;
662 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
663 break;
664 }
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800665 disp_hint_info_two(pos, "ÇëÇó¶þάÂë","ÇëÉÔµÈ...",0);
zongqiang.zhangb65f1242019-12-10 16:08:16 +0800666 MEMCLEAR(&CARD,sizeof(sp_card_t));
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800667 ret = sp_qrcode_init(pos, &CARD);
668 if(ret)
669 {
670 cardWorkState->errcode = ret;
671 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
672 break;
673 }
zongqiang.zhanga1f6a4e2019-12-09 10:27:28 +0800674 ret = sp_prepare_behalf_transdtl(pos, &CARD);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800675 if(ret)
676 {
zongqiang.zhang39f669b2019-12-17 10:11:14 +0800677 cardWorkState->errcode = ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800678 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
679 break;
680 }
681 pos->sysconf.work_mode = 1;
682 CARD.qrcode.starttime = sp_get_ticker();
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800683 //disp_hint_info(pos, "Éú³É¶þάÂë", 0);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800684 cardWorkState->last_state = cardWorkState->current_state;
685 cardWorkState->current_state = CARDWORKSTATUS_READY;
686 break;
687 case CARDWORKSTATUS_READY:
688 CARD.qrcode.nowtime = sp_get_ticker();
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800689 if((CARD.qrcode.nowtime - CARD.qrcode.starttime) < CARD.qrcode.validtime*DELAY_TIME1s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800690 {
zongqiang.zhangfef30f22019-12-04 15:25:43 +0800691 show_home_qrcode(pos,CARD.qrcode.qrcode_url);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800692 if(CARD.qrcode.nowtime - tick > DELAY_TIME2s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800693 {
694 tick = CARD.qrcode.nowtime;
695 ret = sp_qrcode_query(pos, &CARD);
696 if(!ret && CARD.qrcode.authstatus)
697 {
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800698 if(CARD.permit)
699 {
700 cardWorkState->errcode = RC_LIMIT_CONSUMPTION;
701 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
702 }
703 else
704 {
705 do_start(pos);
zongqiang.zhangb65f1242019-12-10 16:08:16 +0800706 CARD.qrcode.starttime = CARD.qrcode.nowtime;
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800707 cardWorkState->last_state = cardWorkState->current_state;
708 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
709 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800710 }
711 }
712 }
713 else
714 {
715 cardWorkState->errcode = RC_QRCODE_TIMEOUT;
716 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
717 }
718 break;
719 case CARDWORKSTATUS_WORKING:
720 ret = do_work(pos, &CARD);
zongqiang.zhangbccfdad2020-08-04 18:07:22 +0800721 if(RC_WATER_LIMIT_OUT == ret)
722 {
723 sp_valve_off();
724 disp_hint_info_two(pos, "Í£Ö¹³öË®","ÒÑ´ïµ¥´Î³öË®ÉÏÏÞ", DELAY_TIME2s);
725 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
726 break;
727 }
728 else if(RC_AMOUNT_LIMIT_OUT == ret)
729 {
730 sp_valve_off();
731 disp_hint_info_two(pos, "Í£Ö¹³öË®","ÒÑ´ïµ¥´Î½ð¶îÉÏÏÞ", DELAY_TIME2s);
732 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
733 break;
734 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800735 if(ret)
736 {
zongqiang.zhangbccfdad2020-08-04 18:07:22 +0800737 sp_valve_off();
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800738 show_error(pos,"Ïû·Ñʧ°Ü",ret);
739 ret = do_stop(pos, &CARD);
740 if(ret)
741 {
742 cardWorkState->errcode = ret;
743 }
744 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
745 break;
746 }
zongqiang.zhangb65f1242019-12-10 16:08:16 +0800747 /**È·ÈϳöË®ºó³¬¹ýµÈ´ýʱ¼äδ³öˮֹͣ³öË®**/
748 CARD.qrcode.nowtime = sp_get_ticker();
zongqiang.zhang578c6eb2020-08-04 16:16:22 +0800749 if((CARD.qrcode.nowtime - CARD.qrcode.starttime) >= CARD.qrcode.waittime*DELAY_TIME1s)
zongqiang.zhangb65f1242019-12-10 16:08:16 +0800750 {
751 if(pos->purchase.used_num == 0)
752 {
753 disp_hint_info_two(pos, "Í£Ö¹³öË®","δ¼ì²âµ½³öË®", DELAY_TIME2s);
754 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
755 }
756 }
757
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800758 cardWorkState->last_state = cardWorkState->current_state;
759 cardWorkState->pause_tick = sp_get_ticker();
760 break;
761 case CARDWORKSTATUS_STOPPING:
zongqiang.zhang0b7de692019-12-10 16:35:53 +0800762#if 0
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800763 if(cardWorkState->last_state == CARDWORKSTATUS_NONE
764 || cardWorkState->last_state == CARDWORKSTATUS_READY)
765 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800766 disp_hint_info_two(pos,"Í£Ö¹³öË®","È¡ÏûË¢Âë!", DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800767 pos->paymode = PAYMODE_INIT;
768 pos->sysconf.work_mode = 0;
769 }
770 else
771 {
772 if(cardWorkState->last_state != CARDWORKSTATUS_PAUSE)
773 do_pause(pos);
774 ret = do_stop(pos, &CARD);
775 if(ret)
776 {
777 cardWorkState->errcode = ret;
778 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
779 break;
780 }
781 }
782 cardWorkState->current_state = CARDWORKSTATUS_NONE;
783 cardWorkState->last_state = cardWorkState->current_state;
zongqiang.zhang0b7de692019-12-10 16:35:53 +0800784#endif
785
786 ret = do_stop(pos, &CARD);
787 if(ret)
788 {
789 cardWorkState->errcode = ret;
790 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
791 break;
792 }
793 cardWorkState->current_state = CARDWORKSTATUS_NONE;
794 cardWorkState->last_state = cardWorkState->current_state;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800795 break;
796 case CARDWORKSTATUS_ERROR:
797 do_error(pos,cardWorkState->errcode);
798 cardWorkState->current_state = CARDWORKSTATUS_NONE;
799 cardWorkState->last_state = cardWorkState->current_state;
800 break;
801 default:
802 Delay_ms(DELAY_TIME200ms);
803 break;
804 }
805}