blob: cfa75b7db6bd96cbbdd138792eeb61ed97e43076 [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//¶ÁÈ¡µÚÒ»±ÊδÉÏ´«Á÷Ë®Ïû·ÑÈÕÆÚʱ¼ä
124static uint8 sp_read_unconfirm_first_record(uint8 termtime[6])
125{
126 return 1;
127}
128
129static uint16 sp_dev_offline_check(const sp_pos_t* pos)
130{
131 uint8 ret;
132 uint8 record_termtime[6];
133 uint8 ctime[6];
134 int32 nowtime;
135 int32 dtltime;
136
137 if(pos->sysconf.dev_offline_maxhour == 0)
138 {
139 return 0;
140 }
141 memset(record_termtime,0,sizeof(record_termtime));
142 ret = sp_read_unconfirm_first_record(record_termtime);
143 if(ret)
144 {
145 return 0;
146 }
147 sp_get_bcdtime(ctime);
148 nowtime = format_time_covert_secs(ctime);
149 dtltime = format_time_covert_secs(record_termtime);
150
151 /**
152 *Á÷ˮʱ¼ä´óÓÚÉ豸ʱÖÓÇÒ³¬¹ý24Сʱ
153 **/
154 if((dtltime > nowtime) &&
155 ((dtltime - nowtime) > (24*60*DELAY_TIME60s)))
156 {
157 if(sp_valve_state())
158 {
159 sp_valve_off();
160 }
161 return RC_DEV_OFFLINE_ERROR;
162 }
163 /**
164 *Á÷ˮʱ¼äСÓÚÉ豸ʱÖÓÇÒ³¬¹ýãÐÖµ
165 **/
166 if((dtltime < nowtime) &&
167 ((nowtime - dtltime) > (pos->sysconf.dev_offline_maxhour*3600)))
168 {
169 if(sp_valve_state())
170 {
171 sp_valve_off();
172 }
173 return RC_DEV_OFFLINE_ERROR;
174 }
175 return 0;
176}
177
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800178static uint16 sp_check_dev(const sp_pos_t* pos)
179{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800180 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800181 uint8 ctime[6];
182 MEMCLEAR(ctime, sizeof(ctime));
183 sp_get_bcdtime(ctime);
184 if(pos->load_para_status)
185 {
186 return pos->load_para_status;
187 }
188 ret = sp_dev_config_check(pos);
189 if(ret)
190 {
191 return ret;
192 }
193 ret = sp_dev_offline_check(pos);
194 if(ret)
195 {
196 return ret;
197 }
198
199 return 0;
200}
201
202static uint16 do_idle(sp_pos_t* pos)
203{
204 uint8 ctime[6];
205 MEMCLEAR(ctime, sizeof(ctime));
206 sp_get_bcdtime(ctime);
207 show_home(pos);
208 return 0;
209}
210
211static uint16 do_new(sp_pos_t* pos, sp_card_t* card)
212{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800213 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800214 sp_transdtl_t record;
215 MEMCLEAR(&record, sizeof(record));
216 card->cardtype = pos->cardState.tag_type;
217 MEMCPY(card->cardphyid, pos->cardState.snr, 4);
218 ret = sp_card_read(card);
219 if(ret)
220 {
zongqiang.zhangd0017d72019-12-06 09:26:32 +0800221 return RC_CARD_INVALID;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800222 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800223 if(pos->load_para_status)
224 {
225 return pos->load_para_status;
226 }
227 ret = sp_dev_config_check(pos);
228 if(ret)
229 {
230 return ret;
231 }
232 ret = sp_dev_offline_check(pos);
233 if(ret)
234 {
235 return ret;
236 }
237
guangcheng.qin0b456a32019-08-08 16:53:12 +0800238 ret = sp_card_authentication(pos, card);
239 if(ret)
240 {
zongqiang.zhangd0017d72019-12-06 09:26:32 +0800241 return RC_CARD_AUTHENTICATION;
guangcheng.qin0b456a32019-08-08 16:53:12 +0800242 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800243 ret = sp_prepare_behalf_transdtl(pos, card, &record);
244 if(ret)
245 {
246 return ret;
247 }
248 pos->sysconf.work_mode = 1;
249 pos->paymode = PAYMODE_CARD;
250 return 0;
251}
252
253static uint16 do_start(sp_pos_t* pos)
254{
255 MEMCLEAR(&pos->purchase,sizeof(sp_purchase_t));
256 sp_flowsensor_count_clear();
257 sp_get_bcdtime(pos->purchase.starttime);
258 sp_valve_on();
259 show_money(pos, pos->purchase.paid_sum);
260 return 0;
261}
262
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800263static uint16 do_work(sp_pos_t* pos, sp_card_t* card)
264{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800265 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800266 //¼ÆËãÏû·Ñ½ð¶î
267 ret = sp_calc_payamt_by_flowsensor(pos, card);
268 if(ret)
269 {
270 return ret;
271 }
272 if(pos->purchase.prepaid_amt > 0)
273 {
274 //ĬÈϼÇÕËģʽ
275 ret = sp_account_purchase(pos->purchase.prepaid_amt);
276 if(ret)
277 {
278 return ret;
279 }
280 }
281
282 if(pos->purchase.prepaid_num > 0)
283 {
284 pos->purchase.paid_num += pos->purchase.prepaid_num;
285 pos->purchase.paid_sum += pos->purchase.prepaid_amt;
286 pos->purchase.prepaid_num = 0;
287 pos->purchase.prepaid_amt = 0;
288 }
289 show_money(pos, pos->purchase.paid_sum);
290 return 0;
291}
292
293static uint16 do_stop(sp_pos_t* pos, sp_card_t* card)
294{
295 uint16 ret;
296 sp_transdtl_t record;
297 sp_valve_off();
298
299 if(pos->purchase.paid_num > 0)
300 {
301 MEMCLEAR(&record, sizeof(record));
302 ret = sp_prepare_below_transdtl(pos, card, &record);
303 if(ret)
304 {
305 return ret;
306 }
307 }
308 pos->paymode = PAYMODE_INIT;
309 pos->sysconf.work_mode = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800310 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
311 MEMCLEAR(card, sizeof(sp_card_t));
312 return 0;
313}
314
315static void do_pause(sp_pos_t* pos)
316{
317 char msg[17];
318 MEMCLEAR(msg, sizeof(msg));
319 sp_valve_off();
320 if(pos->purchase.paid_sum > 0)
321 {
322 sprintf(msg,"¹²¼Æ %0.2fÔª",pos->purchase.paid_sum/100.0f);
323 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ",msg,DELAY_TIME2s);
324 }
325 else
326 {
327 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ","Ãâ·ÑʹÓÃ",DELAY_TIME2s);
328 }
329}
330
331static void do_error(sp_pos_t* pos, uint16 errcode)
332{
333 if(errcode)
334 {
335 show_error(pos,"²Ù×÷ʧ°Ü:",errcode);
336 pos->paymode = PAYMODE_INIT;
337 pos->sysconf.work_mode = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800338 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
339 }
340}
341
342static uint16 sp_card_exist_handle(sp_pos_t* pos, sp_card_t* card,
343 sp_cardworkstate_t* cardWorkState)
344{
345 uint16 ret = 0;
346 uint16 err = 0;
347 sp_card_t cardpcd;
348 switch(cardWorkState->current_state)
349 {
350 case CARDWORKSTATUS_NONE:
351 if(timer_get_ticker() - pos->cardState.firsttick < 1500)
352 {
353 break;
354 }
355 ret = do_new(pos, card);
356 if(ret)
357 {
358 if(0x1018 == ret || 0x2001 == ret||
359 0x1014 == ret || 0x1030 == ret)
360 {
361 if(0 == sp_card_request(&cardpcd))
362 {
363 break;
364 }
365 }
366 cardWorkState->errcode = ret;
367 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
368 break;
369 }
370 cardWorkState->current_state = CARDWORKSTATUS_READY;
371 break;
372 case CARDWORKSTATUS_READY:
373 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
374 {
375 cardWorkState->current_state = CARDWORKSTATUS_NONE;
376 break;
377 }
378 ret = do_start(pos);
379 if(ret)
380 {
381 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
382 break;
383 }
384 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
385 break;
386 case CARDWORKSTATUS_PAUSE:
387 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
388 break;
389 case CARDWORKSTATUS_WORKING:
390 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
391 {
392 ret = RC_NOT_SAME_CARD;
393 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
394 break;
395 }
396 cardWorkState->pause_status = 0;
397 ret = do_work(pos, card);
398 if(ret)
399 {
400 show_error(pos,"Ïû·Ñʧ°Ü",ret);
401 err = do_stop(pos, card);
402 if(err != 0)
403 {
404 ret = err;
405 }
406 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
407 break;
408 }
409 if(pos->purchase.paid_num > card->waterlimit)
410 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800411 disp_hint_info_two(pos,"Í£Ö¹³öË®","ÒÑ´ïµ¥´Î³öË®ÉÏÏÞ",DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800412 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
413 }
414 cardWorkState->pause_tick = timer_get_ticker();
415 break;
416 case CARDWORKSTATUS_STOPPING:
417 ret = do_stop(pos, card);
418 if(ret)
419 {
420 cardWorkState->errcode = ret;
421 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
422 break;
423 }
424 cardWorkState->current_state = CARDWORKSTATUS_STOPPED;
425 break;
426 case CARDWORKSTATUS_STOPPED:
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800427 disp_hint_info_two(pos,"Í£Ö¹³öË®", "ÇëÄÃ×ß¿¨", DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800428 break;
429 case CARDWORKSTATUS_FEECARD_WORKING:
430 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
431 {
432 cardWorkState->current_state = CARDWORKSTATUS_NONE;
433 break;
434 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800435 break;
436 case CARDWORKSTATUS_ERROR:
437 do_error(pos, cardWorkState->errcode);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800438 break;
439 default:
440 Delay_ms(DELAY_TIME200ms);
441 cardWorkState->current_state = CARDWORKSTATUS_NONE;
442 break;
443 }
444 cardWorkState->errcode = ret;
445 return ret;
446}
447
448static uint16 sp_card_noexist_handle(sp_pos_t* pos, sp_card_t* card,
449 sp_cardworkstate_t* cardWorkState)
450{
451 //Óп¨µ½ÎÞ¿¨
452 uint16 ret = 0;
453 switch(cardWorkState->current_state)
454 {
455 case CARDWORKSTATUS_NONE:
456 do_idle(pos);
457 break;
458 case CARDWORKSTATUS_READY:
459 cardWorkState->current_state = CARDWORKSTATUS_NONE;
460 break;
461 case CARDWORKSTATUS_WORKING:
462 cardWorkState->current_state = CARDWORKSTATUS_PAUSE;
463 break;
464 case CARDWORKSTATUS_PAUSE:
465 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) == 0)
466 {
467 //¿¨ÄÃ×ßÒ»·ÖÖÓÖ®ÄÚĬÈÏÔÝͣʹÓÃ
468 if((timer_get_ticker() - cardWorkState->pause_tick) <= DELAY_TIME60s)
469 {
470 if(!cardWorkState->pause_status)
471 {
472 do_pause(pos);
473 show_home(pos);
474 }
475 show_home(pos);
476 cardWorkState->pause_status = 1;
477 }
478 else
479 {
480 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
481 cardWorkState->pause_status = 0;
482 }
483 }
484 else
485 {
486 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
487 cardWorkState->pause_status = 0;
488 }
489 cardWorkState->last_state = CARDWORKSTATUS_PAUSE;
490 break;
491 case CARDWORKSTATUS_STOPPING:
492 ret = do_stop(pos, card);
493 if(ret)
494 {
495 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
496 break;
497 }
498 cardWorkState->current_state = CARDWORKSTATUS_STOPPED;
499 cardWorkState->tick = timer_get_ticker();
500 break;
501 case CARDWORKSTATUS_STOPPED:
502 if(timer_get_ticker() - cardWorkState->tick > DELAY_TIME3s)
503 {
504 cardWorkState->current_state = CARDWORKSTATUS_NONE;
505 cardWorkState->last_state = cardWorkState->current_state;
506 cardWorkState->tick = 0;
507 }
508 break;
509 case CARDWORKSTATUS_SET_DEV:
510 if(sp_check_passwd(pos, "É豸¹ÜÀíÃÜÂë", "\x9\x1\x4\x3\x8\x7") == 0)
511 {
512 sp_menu_options(pos);
513 }
514 cardWorkState->current_state = CARDWORKSTATUS_NONE;
515 break;
516 case CARDWORKSTATUS_ERROR:
517 do_error(pos,cardWorkState->errcode);
518 cardWorkState->current_state = CARDWORKSTATUS_NONE;
519 break;
520 default:
521 Delay_ms(DELAY_TIME200ms);
522 cardWorkState->current_state = CARDWORKSTATUS_NONE;
523 break;
524 }
525 cardWorkState->errcode = ret;
526 return ret;
527}
528
529static sp_card_t CARD;
530void sp_card_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
531{
532 if(pos->cardState.cur_state)
533 {
534 sp_card_exist_handle(pos, &CARD, cardWorkState);
535 }
536 else
537 {
538 sp_card_noexist_handle(pos, &CARD, cardWorkState);
539 }
540}
541
542void sp_confirm_paymode(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
543{
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800544 uint8 keycode;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800545 keycode = sp_get_key();
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800546 if(keycode != SP_KEY_NONE)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800547 {
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800548 //°´0¼ü½øÈëÉ豸²Ù×÷½çÃæ
549 if((keycode == SP_KEY_0) && (pos->paymode == PAYMODE_INIT))
550 {
551 menu_cnt++;
552 if(menu_cnt > 6)
553 {
554 menu_cnt = 0;
555 cardWorkState->current_state = CARDWORKSTATUS_SET_DEV;
556 }
557 return;
558 }
559 menu_cnt = 0;
560
561 //ÔÚ¿¨Ïû·ÑÔÝÍ£Çé¿öϰ´ÈÎÒâ¼üΪ½áÊøµ±Ç°Ïû·Ñ״̬
562 if((pos->cardState.cur_state == STATE_NONE)
563 && (cardWorkState->current_state == CARDWORKSTATUS_PAUSE)
564 && (pos->paymode == PAYMODE_CARD))
565 {
566 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
567 return;
568 }
569 //Ïû·Ñģʽ³õʼ»¯×´Ì¬Ï°´È·ÈϼüÑ¡Ôñ¶þάÂëÏû·Ñ
570 if((keycode == SP_KEY_ENTER) && (pos->paymode == PAYMODE_INIT))
571 {
572 cardWorkState->current_state = CARDWORKSTATUS_NONE;
573 pos->paymode = PAYMODE_QRCODE;
574 return;
575 }
576 //¶þάÂëģʽϰ´È¡Ïû¼üΪֹͣ¹¤×÷
577 if((keycode == SP_KEY_CLEAR) && (pos->paymode == PAYMODE_QRCODE))
578 {
579 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
580 return;
581 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800582 }
583}
584
585//¶þάÂëÏû·Ñ´¦Àí
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800586static uint32 tick = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800587void sp_qrcode_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
588{
589 uint16 ret = 0;
590 sp_transdtl_t record;
591 MEMCLEAR(&record, sizeof(record));
592 switch(cardWorkState->current_state)
593 {
594 case CARDWORKSTATUS_NONE:
595 ret = sp_check_dev(pos);
596 if(ret)
597 {
598 cardWorkState->errcode = ret;
599 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
600 break;
601 }
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800602 disp_hint_info_two(pos, "ÇëÇó¶þάÂë","ÇëÉÔµÈ...",0);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800603 ret = sp_qrcode_init(pos, &CARD);
604 if(ret)
605 {
606 cardWorkState->errcode = ret;
607 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
608 break;
609 }
610 ret = sp_prepare_behalf_transdtl(pos, &CARD, &record);
611 if(ret)
612 {
613 cardWorkState->errcode = RC_QRCODE_TIMEOUT;
614 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
615 break;
616 }
617 pos->sysconf.work_mode = 1;
618 CARD.qrcode.starttime = sp_get_ticker();
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800619 //disp_hint_info(pos, "Éú³É¶þάÂë", 0);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800620 cardWorkState->last_state = cardWorkState->current_state;
621 cardWorkState->current_state = CARDWORKSTATUS_READY;
622 break;
623 case CARDWORKSTATUS_READY:
624 CARD.qrcode.nowtime = sp_get_ticker();
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800625 if((CARD.qrcode.nowtime - CARD.qrcode.starttime) < CARD.qrcode.validtime*DELAY_TIME1s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800626 {
zongqiang.zhangfef30f22019-12-04 15:25:43 +0800627 show_home_qrcode(pos,CARD.qrcode.qrcode_url);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800628 if(CARD.qrcode.nowtime - tick > DELAY_TIME2s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800629 {
630 tick = CARD.qrcode.nowtime;
631 ret = sp_qrcode_query(pos, &CARD);
632 if(!ret && CARD.qrcode.authstatus)
633 {
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800634 if(CARD.permit)
635 {
636 cardWorkState->errcode = RC_LIMIT_CONSUMPTION;
637 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
638 }
639 else
640 {
641 do_start(pos);
642 cardWorkState->last_state = cardWorkState->current_state;
643 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
644 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800645 }
646 }
647 }
648 else
649 {
650 cardWorkState->errcode = RC_QRCODE_TIMEOUT;
651 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
652 }
653 break;
654 case CARDWORKSTATUS_WORKING:
655 ret = do_work(pos, &CARD);
656 if(ret)
657 {
658 show_error(pos,"Ïû·Ñʧ°Ü",ret);
659 ret = do_stop(pos, &CARD);
660 if(ret)
661 {
662 cardWorkState->errcode = ret;
663 }
664 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
665 break;
666 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800667 if(pos->purchase.paid_num > CARD.waterlimit)
668 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800669 disp_hint_info_two(pos, "Í£Ö¹³öË®","ÒÑ´ïµ¥´Î³öË®ÉÏÏÞ", DELAY_TIME2s);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800670 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
671 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800672 cardWorkState->last_state = cardWorkState->current_state;
673 cardWorkState->pause_tick = sp_get_ticker();
674 break;
675 case CARDWORKSTATUS_STOPPING:
676 if(cardWorkState->last_state == CARDWORKSTATUS_NONE
677 || cardWorkState->last_state == CARDWORKSTATUS_READY)
678 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800679 disp_hint_info_two(pos,"Í£Ö¹³öË®","È¡ÏûË¢Âë!", DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800680 pos->paymode = PAYMODE_INIT;
681 pos->sysconf.work_mode = 0;
682 }
683 else
684 {
685 if(cardWorkState->last_state != CARDWORKSTATUS_PAUSE)
686 do_pause(pos);
687 ret = do_stop(pos, &CARD);
688 if(ret)
689 {
690 cardWorkState->errcode = ret;
691 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
692 break;
693 }
694 }
695 cardWorkState->current_state = CARDWORKSTATUS_NONE;
696 cardWorkState->last_state = cardWorkState->current_state;
697 break;
698 case CARDWORKSTATUS_ERROR:
699 do_error(pos,cardWorkState->errcode);
700 cardWorkState->current_state = CARDWORKSTATUS_NONE;
701 cardWorkState->last_state = cardWorkState->current_state;
702 break;
703 default:
704 Delay_ms(DELAY_TIME200ms);
705 break;
706 }
707}