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