blob: 579a3aff7259a792d844b5cc8a5355fd19384789 [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 uint32 count = 0;
14static uint8 menu_cnt = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080015static uint16 sp_calc_payamt_by_flowsensor(sp_pos_t* pos, sp_card_t* card)
16{
17 uint32 usedcount = 0;
18
19 if(pos->purchase.paid_num < 1)
20 {
21 //Ê×ÏÈÔ¤¿ÛÒ»±Ê
22 if(card->feepara.fee_start > 0)
23 {
24 //ǰnË®Ãâ·Ñ
25 pos->purchase.prepaid_num = card->feepara.fee_start;
26 pos->purchase.prepaid_amt = 0;
27 }
28 else
29 {
30 pos->purchase.prepaid_num = card->feepara.fee_unit;
31 pos->purchase.prepaid_amt = card->feepara.fee_amt;
32 }
33 pos->purchase.used_num = 0;
34 return 0;
35 }
guangcheng.qin00668842019-08-19 09:45:25 +080036 usedcount = sp_flowsensor_get_count()/pos->sysconf.flowsensor_unit;
37 //usedcount = count/pos->sysconf.flowsensor_unit;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080038 count++;
39 if(usedcount < pos->purchase.paid_num)
40 {
41 //ûÓдﵽ¿Û·ÑÁ÷Á¿
42 return 0;
43 }
44 pos->purchase.used_num = pos->purchase.paid_num;
45 pos->purchase.prepaid_num = card->feepara.fee_unit;
46 pos->purchase.prepaid_amt = card->feepara.fee_amt;
47 return 0;
48}
49
50//¼ÇÕËģʽÏû·Ñ
51uint16 sp_account_purchase(uint16 amount)
52{
53 return 0;
54}
55
56static uint8 gPICC_SNR[4]; /* ¿¨Æ¬SNºÅ */
57
58void sp_test_card_state(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState, uint32 tick)
59{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +080060 uint8 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080061 sp_card_t cardpcd;
62 switch(pos->cardState.cur_state)
63 {
64 case STATE_NONE:
65 MEMCLEAR(&cardpcd, sizeof(cardpcd));
66 if(sp_card_request(&cardpcd) == 0)
67 {
68 MEMCPY(pos->cardState.snr, cardpcd.cardphyid, sizeof(cardpcd.cardphyid));
69 MEMCPY(gPICC_SNR, cardpcd.cardphyid, sizeof(cardpcd.cardphyid));
70 pos->cardState.tag_type = cardpcd.cardtype;
71 pos->cardState.cur_state = STATE_EXIST;
72 pos->cardState.firsttick = tick;
73 pos->cardState.lasttick = tick;
74 }
75 else
76 {
77 cardWorkState->errcode = RC_CARD_INVALID;
78 }
79 break;
80 case STATE_EXIST:
81 //¼ì²â¿¨ÊÇ·ñ¼ÌÐø´æÔÚ
82 if(pos->cardState.tag_type == TAG_TYPE_CPU)
83 {
84 ret = sp_check_cpu_exist();
85 if(ret)
86 {
87 pos->cardState.cur_state = STATE_NONE;
88 break;
89 }
90 else
91 {
92 memcpy(pos->cardState.snr, gPICC_SNR, 8);
93 pos->cardState.lasttick = tick;
94 }
95 }
96 break;
97 default:
98 pos->cardState.cur_state = STATE_NONE;
99 break;
100 }
101}
102
103static uint16 sp_dev_config_check(const sp_pos_t* pos)
104{
105 uint8 devphyid[4];
106 MEMCLEAR(devphyid, sizeof(devphyid));
107 if(MEMCMP(pos->devphyid, devphyid, sizeof(devphyid)) == 0)
108 {
109 return RC_DEVPHYID_NOTSET;
110 }
111 if(pos->devlogin.login_flag != 1)
112 {
113 return RC_DEV_NOT_LOGIN;
114 }
115 if(pos->sysconf.work_mode == 9)
116 {
117 return RC_DEV_FAULT;
118 }
119 if(pos->sysconf.flowsensor_unit == 0)
120 {
121 return RC_DEV_NOSET_FLOWSENSOR_UNIT;
122 }
123 return 0;
124}
125
126//¶ÁÈ¡µÚÒ»±ÊδÉÏ´«Á÷Ë®Ïû·ÑÈÕÆÚʱ¼ä
127static uint8 sp_read_unconfirm_first_record(uint8 termtime[6])
128{
129 return 1;
130}
131
132static uint16 sp_dev_offline_check(const sp_pos_t* pos)
133{
134 uint8 ret;
135 uint8 record_termtime[6];
136 uint8 ctime[6];
137 int32 nowtime;
138 int32 dtltime;
139
140 if(pos->sysconf.dev_offline_maxhour == 0)
141 {
142 return 0;
143 }
144 memset(record_termtime,0,sizeof(record_termtime));
145 ret = sp_read_unconfirm_first_record(record_termtime);
146 if(ret)
147 {
148 return 0;
149 }
150 sp_get_bcdtime(ctime);
151 nowtime = format_time_covert_secs(ctime);
152 dtltime = format_time_covert_secs(record_termtime);
153
154 /**
155 *Á÷ˮʱ¼ä´óÓÚÉ豸ʱÖÓÇÒ³¬¹ý24Сʱ
156 **/
157 if((dtltime > nowtime) &&
158 ((dtltime - nowtime) > (24*60*DELAY_TIME60s)))
159 {
160 if(sp_valve_state())
161 {
162 sp_valve_off();
163 }
164 return RC_DEV_OFFLINE_ERROR;
165 }
166 /**
167 *Á÷ˮʱ¼äСÓÚÉ豸ʱÖÓÇÒ³¬¹ýãÐÖµ
168 **/
169 if((dtltime < nowtime) &&
170 ((nowtime - dtltime) > (pos->sysconf.dev_offline_maxhour*3600)))
171 {
172 if(sp_valve_state())
173 {
174 sp_valve_off();
175 }
176 return RC_DEV_OFFLINE_ERROR;
177 }
178 return 0;
179}
180
181static uint16 sp_card_valid_check(const sp_card_t* card)
182{
183 uint8 ctime[6];
184 /*
185 if(card->cardno < 1)
186 {
187 return RC_CARDNO_EXCEPT;
188 }
189 */
190 sp_get_bcdtime(ctime);
191 if(memcmp(card->expiredate +1, ctime, 3) < 0)
192 {
193 return RC_CARD_EXPIRED;
194 }
195 return 0;
196}
197
198static uint16 sp_check_dev(const sp_pos_t* pos)
199{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800200 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800201 uint8 ctime[6];
202 MEMCLEAR(ctime, sizeof(ctime));
203 sp_get_bcdtime(ctime);
204 if(pos->load_para_status)
205 {
206 return pos->load_para_status;
207 }
208 ret = sp_dev_config_check(pos);
209 if(ret)
210 {
211 return ret;
212 }
213 ret = sp_dev_offline_check(pos);
214 if(ret)
215 {
216 return ret;
217 }
218
219 return 0;
220}
221
222static uint16 do_idle(sp_pos_t* pos)
223{
224 uint8 ctime[6];
225 MEMCLEAR(ctime, sizeof(ctime));
226 sp_get_bcdtime(ctime);
227 show_home(pos);
228 return 0;
229}
230
231static uint16 do_new(sp_pos_t* pos, sp_card_t* card)
232{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800233 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800234 sp_transdtl_t record;
235 MEMCLEAR(&record, sizeof(record));
236 card->cardtype = pos->cardState.tag_type;
237 MEMCPY(card->cardphyid, pos->cardState.snr, 4);
238 ret = sp_card_read(card);
239 if(ret)
240 {
241 ret = RC_CARD_INVALID;
242 return ret;
243 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800244 if(pos->load_para_status)
245 {
246 return pos->load_para_status;
247 }
248 ret = sp_dev_config_check(pos);
249 if(ret)
250 {
251 return ret;
252 }
253 ret = sp_dev_offline_check(pos);
254 if(ret)
255 {
256 return ret;
257 }
258
259 ret = sp_card_valid_check(card);
260 if(ret)
261 {
262 return ret;
263 }
guangcheng.qin0b456a32019-08-08 16:53:12 +0800264 ret = sp_card_authentication(pos, card);
265 if(ret)
266 {
267 ret = RC_CARD_AUTHENTICATION;
268 return ret;
269 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800270 ret = sp_prepare_behalf_transdtl(pos, card, &record);
271 if(ret)
272 {
273 return ret;
274 }
275 pos->sysconf.work_mode = 1;
276 pos->paymode = PAYMODE_CARD;
277 return 0;
278}
279
280static uint16 do_start(sp_pos_t* pos)
281{
282 MEMCLEAR(&pos->purchase,sizeof(sp_purchase_t));
283 sp_flowsensor_count_clear();
284 sp_get_bcdtime(pos->purchase.starttime);
285 sp_valve_on();
286 show_money(pos, pos->purchase.paid_sum);
287 return 0;
288}
289
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800290static uint16 do_work(sp_pos_t* pos, sp_card_t* card)
291{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800292 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800293 sp_valve_on();
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800294 //¼ÆËãÏû·Ñ½ð¶î
295 ret = sp_calc_payamt_by_flowsensor(pos, card);
296 if(ret)
297 {
298 return ret;
299 }
300 if(pos->purchase.prepaid_amt > 0)
301 {
302 //ĬÈϼÇÕËģʽ
303 ret = sp_account_purchase(pos->purchase.prepaid_amt);
304 if(ret)
305 {
306 return ret;
307 }
308 }
309
310 if(pos->purchase.prepaid_num > 0)
311 {
312 pos->purchase.paid_num += pos->purchase.prepaid_num;
313 pos->purchase.paid_sum += pos->purchase.prepaid_amt;
314 pos->purchase.prepaid_num = 0;
315 pos->purchase.prepaid_amt = 0;
316 }
317 show_money(pos, pos->purchase.paid_sum);
318 return 0;
319}
320
321static uint16 do_stop(sp_pos_t* pos, sp_card_t* card)
322{
323 uint16 ret;
324 sp_transdtl_t record;
325 sp_valve_off();
326
327 if(pos->purchase.paid_num > 0)
328 {
329 MEMCLEAR(&record, sizeof(record));
330 ret = sp_prepare_below_transdtl(pos, card, &record);
331 if(ret)
332 {
333 return ret;
334 }
335 }
336 pos->paymode = PAYMODE_INIT;
337 pos->sysconf.work_mode = 0;
338 count = 0;
339 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
340 MEMCLEAR(card, sizeof(sp_card_t));
341 return 0;
342}
343
344static void do_pause(sp_pos_t* pos)
345{
346 char msg[17];
347 MEMCLEAR(msg, sizeof(msg));
348 sp_valve_off();
349 if(pos->purchase.paid_sum > 0)
350 {
351 sprintf(msg,"¹²¼Æ %0.2fÔª",pos->purchase.paid_sum/100.0f);
352 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ",msg,DELAY_TIME2s);
353 }
354 else
355 {
356 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ","Ãâ·ÑʹÓÃ",DELAY_TIME2s);
357 }
358}
359
360static void do_error(sp_pos_t* pos, uint16 errcode)
361{
362 if(errcode)
363 {
364 show_error(pos,"²Ù×÷ʧ°Ü:",errcode);
365 pos->paymode = PAYMODE_INIT;
366 pos->sysconf.work_mode = 0;
367 count = 0;
368 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
369 }
370}
371
372static uint16 sp_card_exist_handle(sp_pos_t* pos, sp_card_t* card,
373 sp_cardworkstate_t* cardWorkState)
374{
375 uint16 ret = 0;
376 uint16 err = 0;
377 sp_card_t cardpcd;
378 switch(cardWorkState->current_state)
379 {
380 case CARDWORKSTATUS_NONE:
381 if(timer_get_ticker() - pos->cardState.firsttick < 1500)
382 {
383 break;
384 }
385 ret = do_new(pos, card);
386 if(ret)
387 {
388 if(0x1018 == ret || 0x2001 == ret||
389 0x1014 == ret || 0x1030 == ret)
390 {
391 if(0 == sp_card_request(&cardpcd))
392 {
393 break;
394 }
395 }
396 cardWorkState->errcode = ret;
397 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
398 break;
399 }
400 cardWorkState->current_state = CARDWORKSTATUS_READY;
401 break;
402 case CARDWORKSTATUS_READY:
403 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
404 {
405 cardWorkState->current_state = CARDWORKSTATUS_NONE;
406 break;
407 }
408 ret = do_start(pos);
409 if(ret)
410 {
411 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
412 break;
413 }
414 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
415 break;
416 case CARDWORKSTATUS_PAUSE:
417 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
418 break;
419 case CARDWORKSTATUS_WORKING:
420 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
421 {
422 ret = RC_NOT_SAME_CARD;
423 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
424 break;
425 }
426 cardWorkState->pause_status = 0;
427 ret = do_work(pos, card);
428 if(ret)
429 {
430 show_error(pos,"Ïû·Ñʧ°Ü",ret);
431 err = do_stop(pos, card);
432 if(err != 0)
433 {
434 ret = err;
435 }
436 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
437 break;
438 }
439 if(pos->purchase.paid_num > card->waterlimit)
440 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800441 disp_hint_info_two(pos,"Í£Ö¹³öË®","ÒÑ´ïµ¥´Î³öË®ÉÏÏÞ",DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800442 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
443 }
444 cardWorkState->pause_tick = timer_get_ticker();
445 break;
446 case CARDWORKSTATUS_STOPPING:
447 ret = do_stop(pos, card);
448 if(ret)
449 {
450 cardWorkState->errcode = ret;
451 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
452 break;
453 }
454 cardWorkState->current_state = CARDWORKSTATUS_STOPPED;
455 break;
456 case CARDWORKSTATUS_STOPPED:
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800457 disp_hint_info_two(pos,"Í£Ö¹³öË®", "ÇëÄÃ×ß¿¨", DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800458 break;
459 case CARDWORKSTATUS_FEECARD_WORKING:
460 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
461 {
462 cardWorkState->current_state = CARDWORKSTATUS_NONE;
463 break;
464 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800465 break;
466 case CARDWORKSTATUS_ERROR:
467 do_error(pos, cardWorkState->errcode);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800468 break;
469 default:
470 Delay_ms(DELAY_TIME200ms);
471 cardWorkState->current_state = CARDWORKSTATUS_NONE;
472 break;
473 }
474 cardWorkState->errcode = ret;
475 return ret;
476}
477
478static uint16 sp_card_noexist_handle(sp_pos_t* pos, sp_card_t* card,
479 sp_cardworkstate_t* cardWorkState)
480{
481 //Óп¨µ½ÎÞ¿¨
482 uint16 ret = 0;
483 switch(cardWorkState->current_state)
484 {
485 case CARDWORKSTATUS_NONE:
486 do_idle(pos);
487 break;
488 case CARDWORKSTATUS_READY:
489 cardWorkState->current_state = CARDWORKSTATUS_NONE;
490 break;
491 case CARDWORKSTATUS_WORKING:
492 cardWorkState->current_state = CARDWORKSTATUS_PAUSE;
493 break;
494 case CARDWORKSTATUS_PAUSE:
495 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) == 0)
496 {
497 //¿¨ÄÃ×ßÒ»·ÖÖÓÖ®ÄÚĬÈÏÔÝͣʹÓÃ
498 if((timer_get_ticker() - cardWorkState->pause_tick) <= DELAY_TIME60s)
499 {
500 if(!cardWorkState->pause_status)
501 {
502 do_pause(pos);
503 show_home(pos);
504 }
505 show_home(pos);
506 cardWorkState->pause_status = 1;
507 }
508 else
509 {
510 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
511 cardWorkState->pause_status = 0;
512 }
513 }
514 else
515 {
516 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
517 cardWorkState->pause_status = 0;
518 }
519 cardWorkState->last_state = CARDWORKSTATUS_PAUSE;
520 break;
521 case CARDWORKSTATUS_STOPPING:
522 ret = do_stop(pos, card);
523 if(ret)
524 {
525 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
526 break;
527 }
528 cardWorkState->current_state = CARDWORKSTATUS_STOPPED;
529 cardWorkState->tick = timer_get_ticker();
530 break;
531 case CARDWORKSTATUS_STOPPED:
532 if(timer_get_ticker() - cardWorkState->tick > DELAY_TIME3s)
533 {
534 cardWorkState->current_state = CARDWORKSTATUS_NONE;
535 cardWorkState->last_state = cardWorkState->current_state;
536 cardWorkState->tick = 0;
537 }
538 break;
539 case CARDWORKSTATUS_SET_DEV:
540 if(sp_check_passwd(pos, "É豸¹ÜÀíÃÜÂë", "\x9\x1\x4\x3\x8\x7") == 0)
541 {
542 sp_menu_options(pos);
543 }
544 cardWorkState->current_state = CARDWORKSTATUS_NONE;
545 break;
546 case CARDWORKSTATUS_ERROR:
547 do_error(pos,cardWorkState->errcode);
548 cardWorkState->current_state = CARDWORKSTATUS_NONE;
549 break;
550 default:
551 Delay_ms(DELAY_TIME200ms);
552 cardWorkState->current_state = CARDWORKSTATUS_NONE;
553 break;
554 }
555 cardWorkState->errcode = ret;
556 return ret;
557}
558
559static sp_card_t CARD;
560void sp_card_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
561{
562 if(pos->cardState.cur_state)
563 {
564 sp_card_exist_handle(pos, &CARD, cardWorkState);
565 }
566 else
567 {
568 sp_card_noexist_handle(pos, &CARD, cardWorkState);
569 }
570}
571
572void sp_confirm_paymode(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
573{
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800574 uint8 keycode;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800575 keycode = sp_get_key();
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800576 if(keycode != SP_KEY_NONE)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800577 {
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800578 //°´0¼ü½øÈëÉ豸²Ù×÷½çÃæ
579 if((keycode == SP_KEY_0) && (pos->paymode == PAYMODE_INIT))
580 {
581 menu_cnt++;
582 if(menu_cnt > 6)
583 {
584 menu_cnt = 0;
585 cardWorkState->current_state = CARDWORKSTATUS_SET_DEV;
586 }
587 return;
588 }
589 menu_cnt = 0;
590
591 //ÔÚ¿¨Ïû·ÑÔÝÍ£Çé¿öϰ´ÈÎÒâ¼üΪ½áÊøµ±Ç°Ïû·Ñ״̬
592 if((pos->cardState.cur_state == STATE_NONE)
593 && (cardWorkState->current_state == CARDWORKSTATUS_PAUSE)
594 && (pos->paymode == PAYMODE_CARD))
595 {
596 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
597 return;
598 }
599 //Ïû·Ñģʽ³õʼ»¯×´Ì¬Ï°´È·ÈϼüÑ¡Ôñ¶þάÂëÏû·Ñ
600 if((keycode == SP_KEY_ENTER) && (pos->paymode == PAYMODE_INIT))
601 {
602 cardWorkState->current_state = CARDWORKSTATUS_NONE;
603 pos->paymode = PAYMODE_QRCODE;
604 return;
605 }
606 //¶þάÂëģʽϰ´È¡Ïû¼üΪֹͣ¹¤×÷
607 if((keycode == SP_KEY_CLEAR) && (pos->paymode == PAYMODE_QRCODE))
608 {
609 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
610 return;
611 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800612 }
613}
614
615//¶þάÂëÏû·Ñ´¦Àí
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800616static uint32 tick = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800617void sp_qrcode_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
618{
619 uint16 ret = 0;
620 sp_transdtl_t record;
621 MEMCLEAR(&record, sizeof(record));
622 switch(cardWorkState->current_state)
623 {
624 case CARDWORKSTATUS_NONE:
625 ret = sp_check_dev(pos);
626 if(ret)
627 {
628 cardWorkState->errcode = ret;
629 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
630 break;
631 }
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800632 disp_hint_info_two(pos, "ÇëÇó¶þάÂë","ÇëÉÔµÈ...",0);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800633 ret = sp_qrcode_init(pos, &CARD);
634 if(ret)
635 {
636 cardWorkState->errcode = ret;
637 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
638 break;
639 }
640 ret = sp_prepare_behalf_transdtl(pos, &CARD, &record);
641 if(ret)
642 {
643 cardWorkState->errcode = RC_QRCODE_TIMEOUT;
644 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
645 break;
646 }
647 pos->sysconf.work_mode = 1;
648 CARD.qrcode.starttime = sp_get_ticker();
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800649 //disp_hint_info(pos, "Éú³É¶þάÂë", 0);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800650 cardWorkState->last_state = cardWorkState->current_state;
651 cardWorkState->current_state = CARDWORKSTATUS_READY;
652 break;
653 case CARDWORKSTATUS_READY:
654 CARD.qrcode.nowtime = sp_get_ticker();
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800655 if((CARD.qrcode.nowtime - CARD.qrcode.starttime) < CARD.qrcode.validtime*DELAY_TIME1s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800656 {
657 show_home(pos);
658 show_home_qrcode(CARD.qrcode.qrcode_url);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800659 if(CARD.qrcode.nowtime - tick > DELAY_TIME2s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800660 {
661 tick = CARD.qrcode.nowtime;
662 ret = sp_qrcode_query(pos, &CARD);
663 if(!ret && CARD.qrcode.authstatus)
664 {
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800665 if(CARD.permit)
666 {
667 cardWorkState->errcode = RC_LIMIT_CONSUMPTION;
668 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
669 }
670 else
671 {
672 do_start(pos);
673 cardWorkState->last_state = cardWorkState->current_state;
674 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
675 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800676 }
677 }
678 }
679 else
680 {
681 cardWorkState->errcode = RC_QRCODE_TIMEOUT;
682 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
683 }
684 break;
685 case CARDWORKSTATUS_WORKING:
686 ret = do_work(pos, &CARD);
687 if(ret)
688 {
689 show_error(pos,"Ïû·Ñʧ°Ü",ret);
690 ret = do_stop(pos, &CARD);
691 if(ret)
692 {
693 cardWorkState->errcode = ret;
694 }
695 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
696 break;
697 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800698 if(pos->purchase.paid_num > CARD.waterlimit)
699 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800700 disp_hint_info_two(pos, "Í£Ö¹³öË®","ÒÑ´ïµ¥´Î³öË®ÉÏÏÞ", DELAY_TIME2s);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800701 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
702 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800703 cardWorkState->last_state = cardWorkState->current_state;
704 cardWorkState->pause_tick = sp_get_ticker();
705 break;
706 case CARDWORKSTATUS_STOPPING:
707 if(cardWorkState->last_state == CARDWORKSTATUS_NONE
708 || cardWorkState->last_state == CARDWORKSTATUS_READY)
709 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800710 disp_hint_info_two(pos,"Í£Ö¹³öË®","È¡ÏûË¢Âë!", DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800711 pos->paymode = PAYMODE_INIT;
712 pos->sysconf.work_mode = 0;
713 }
714 else
715 {
716 if(cardWorkState->last_state != CARDWORKSTATUS_PAUSE)
717 do_pause(pos);
718 ret = do_stop(pos, &CARD);
719 if(ret)
720 {
721 cardWorkState->errcode = ret;
722 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
723 break;
724 }
725 }
726 cardWorkState->current_state = CARDWORKSTATUS_NONE;
727 cardWorkState->last_state = cardWorkState->current_state;
728 break;
729 case CARDWORKSTATUS_ERROR:
730 do_error(pos,cardWorkState->errcode);
731 cardWorkState->current_state = CARDWORKSTATUS_NONE;
732 cardWorkState->last_state = cardWorkState->current_state;
733 break;
734 default:
735 Delay_ms(DELAY_TIME200ms);
736 break;
737 }
738}