blob: 4052bfdd8ed028ff759316c023c79b29c7c62aa9 [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
289static uint16 do_work_check(const sp_pos_t* pos)
290{
291 //ÅжÏÏû·Ñ½ð¶îÈç¹û´óÓÚ20»òÕßÁ¬ÐøÏû·Ñ³¬¹ý2Сʱ£¬ÔòÍ£Ö¹³öË®
292 if(pos->purchase.used_num >= 1000 || pos->purchase.paid_sum >= 1000)
293 {
294 return RC_CARD_TIMEOUT;
295 }
296 return 0;
297}
298
299static uint16 do_work(sp_pos_t* pos, sp_card_t* card)
300{
301 uint16 ret = 0;
302 sp_valve_on();
303 ret = do_work_check(pos);
304 if(ret)
305 {
306 return ret;
307 }
308 //¼ÆËãÏû·Ñ½ð¶î
309 ret = sp_calc_payamt_by_flowsensor(pos, card);
310 if(ret)
311 {
312 return ret;
313 }
314 if(pos->purchase.prepaid_amt > 0)
315 {
316 //ĬÈϼÇÕËģʽ
317 ret = sp_account_purchase(pos->purchase.prepaid_amt);
318 if(ret)
319 {
320 return ret;
321 }
322 }
323
324 if(pos->purchase.prepaid_num > 0)
325 {
326 pos->purchase.paid_num += pos->purchase.prepaid_num;
327 pos->purchase.paid_sum += pos->purchase.prepaid_amt;
328 pos->purchase.prepaid_num = 0;
329 pos->purchase.prepaid_amt = 0;
330 }
331 show_money(pos, pos->purchase.paid_sum);
332 return 0;
333}
334
335static uint16 do_stop(sp_pos_t* pos, sp_card_t* card)
336{
337 uint16 ret;
338 sp_transdtl_t record;
339 sp_valve_off();
340
341 if(pos->purchase.paid_num > 0)
342 {
343 MEMCLEAR(&record, sizeof(record));
344 ret = sp_prepare_below_transdtl(pos, card, &record);
345 if(ret)
346 {
347 return ret;
348 }
349 }
350 pos->paymode = PAYMODE_INIT;
351 pos->sysconf.work_mode = 0;
352 count = 0;
353 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
354 MEMCLEAR(card, sizeof(sp_card_t));
355 return 0;
356}
357
358static void do_pause(sp_pos_t* pos)
359{
360 char msg[17];
361 MEMCLEAR(msg, sizeof(msg));
362 sp_valve_off();
363 if(pos->purchase.paid_sum > 0)
364 {
365 sprintf(msg,"¹²¼Æ %0.2fÔª",pos->purchase.paid_sum/100.0f);
366 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ",msg,DELAY_TIME2s);
367 }
368 else
369 {
370 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ","Ãâ·ÑʹÓÃ",DELAY_TIME2s);
371 }
372}
373
374static void do_error(sp_pos_t* pos, uint16 errcode)
375{
376 if(errcode)
377 {
378 show_error(pos,"²Ù×÷ʧ°Ü:",errcode);
379 pos->paymode = PAYMODE_INIT;
380 pos->sysconf.work_mode = 0;
381 count = 0;
382 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
383 }
384}
385
386static uint16 sp_card_exist_handle(sp_pos_t* pos, sp_card_t* card,
387 sp_cardworkstate_t* cardWorkState)
388{
389 uint16 ret = 0;
390 uint16 err = 0;
391 sp_card_t cardpcd;
392 switch(cardWorkState->current_state)
393 {
394 case CARDWORKSTATUS_NONE:
395 if(timer_get_ticker() - pos->cardState.firsttick < 1500)
396 {
397 break;
398 }
399 ret = do_new(pos, card);
400 if(ret)
401 {
402 if(0x1018 == ret || 0x2001 == ret||
403 0x1014 == ret || 0x1030 == ret)
404 {
405 if(0 == sp_card_request(&cardpcd))
406 {
407 break;
408 }
409 }
410 cardWorkState->errcode = ret;
411 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
412 break;
413 }
414 cardWorkState->current_state = CARDWORKSTATUS_READY;
415 break;
416 case CARDWORKSTATUS_READY:
417 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
418 {
419 cardWorkState->current_state = CARDWORKSTATUS_NONE;
420 break;
421 }
422 ret = do_start(pos);
423 if(ret)
424 {
425 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
426 break;
427 }
428 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
429 break;
430 case CARDWORKSTATUS_PAUSE:
431 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
432 break;
433 case CARDWORKSTATUS_WORKING:
434 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
435 {
436 ret = RC_NOT_SAME_CARD;
437 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
438 break;
439 }
440 cardWorkState->pause_status = 0;
441 ret = do_work(pos, card);
442 if(ret)
443 {
444 show_error(pos,"Ïû·Ñʧ°Ü",ret);
445 err = do_stop(pos, card);
446 if(err != 0)
447 {
448 ret = err;
449 }
450 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
451 break;
452 }
453 if(pos->purchase.paid_num > card->waterlimit)
454 {
455 disp_hint_info(pos,"ÒÑ´ïµ¥´Î³öË®ÉÏÏÞ",DELAY_TIME2s);
456 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
457 }
458 cardWorkState->pause_tick = timer_get_ticker();
459 break;
460 case CARDWORKSTATUS_STOPPING:
461 ret = do_stop(pos, card);
462 if(ret)
463 {
464 cardWorkState->errcode = ret;
465 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
466 break;
467 }
468 cardWorkState->current_state = CARDWORKSTATUS_STOPPED;
469 break;
470 case CARDWORKSTATUS_STOPPED:
471 cardWorkState->current_state = CARDWORKSTATUS_NONE;
472 break;
473 case CARDWORKSTATUS_FEECARD_WORKING:
474 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
475 {
476 cardWorkState->current_state = CARDWORKSTATUS_NONE;
477 break;
478 }
479 //show_menu_options();
480 break;
481 case CARDWORKSTATUS_ERROR:
482 do_error(pos, cardWorkState->errcode);
483 cardWorkState->current_state = CARDWORKSTATUS_NONE;
484 break;
485 default:
486 Delay_ms(DELAY_TIME200ms);
487 cardWorkState->current_state = CARDWORKSTATUS_NONE;
488 break;
489 }
490 cardWorkState->errcode = ret;
491 return ret;
492}
493
494static uint16 sp_card_noexist_handle(sp_pos_t* pos, sp_card_t* card,
495 sp_cardworkstate_t* cardWorkState)
496{
497 //Óп¨µ½ÎÞ¿¨
498 uint16 ret = 0;
499 switch(cardWorkState->current_state)
500 {
501 case CARDWORKSTATUS_NONE:
502 do_idle(pos);
503 break;
504 case CARDWORKSTATUS_READY:
505 cardWorkState->current_state = CARDWORKSTATUS_NONE;
506 break;
507 case CARDWORKSTATUS_WORKING:
508 cardWorkState->current_state = CARDWORKSTATUS_PAUSE;
509 break;
510 case CARDWORKSTATUS_PAUSE:
511 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) == 0)
512 {
513 //¿¨ÄÃ×ßÒ»·ÖÖÓÖ®ÄÚĬÈÏÔÝͣʹÓÃ
514 if((timer_get_ticker() - cardWorkState->pause_tick) <= DELAY_TIME60s)
515 {
516 if(!cardWorkState->pause_status)
517 {
518 do_pause(pos);
519 show_home(pos);
520 }
521 show_home(pos);
522 cardWorkState->pause_status = 1;
523 }
524 else
525 {
526 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
527 cardWorkState->pause_status = 0;
528 }
529 }
530 else
531 {
532 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
533 cardWorkState->pause_status = 0;
534 }
535 cardWorkState->last_state = CARDWORKSTATUS_PAUSE;
536 break;
537 case CARDWORKSTATUS_STOPPING:
538 ret = do_stop(pos, card);
539 if(ret)
540 {
541 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
542 break;
543 }
544 cardWorkState->current_state = CARDWORKSTATUS_STOPPED;
545 cardWorkState->tick = timer_get_ticker();
546 break;
547 case CARDWORKSTATUS_STOPPED:
548 if(timer_get_ticker() - cardWorkState->tick > DELAY_TIME3s)
549 {
550 cardWorkState->current_state = CARDWORKSTATUS_NONE;
551 cardWorkState->last_state = cardWorkState->current_state;
552 cardWorkState->tick = 0;
553 }
554 break;
555 case CARDWORKSTATUS_SET_DEV:
556 if(sp_check_passwd(pos, "É豸¹ÜÀíÃÜÂë", "\x9\x1\x4\x3\x8\x7") == 0)
557 {
558 sp_menu_options(pos);
559 }
560 cardWorkState->current_state = CARDWORKSTATUS_NONE;
561 break;
562 case CARDWORKSTATUS_ERROR:
563 do_error(pos,cardWorkState->errcode);
564 cardWorkState->current_state = CARDWORKSTATUS_NONE;
565 break;
566 default:
567 Delay_ms(DELAY_TIME200ms);
568 cardWorkState->current_state = CARDWORKSTATUS_NONE;
569 break;
570 }
571 cardWorkState->errcode = ret;
572 return ret;
573}
574
575static sp_card_t CARD;
576void sp_card_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
577{
578 if(pos->cardState.cur_state)
579 {
580 sp_card_exist_handle(pos, &CARD, cardWorkState);
581 }
582 else
583 {
584 sp_card_noexist_handle(pos, &CARD, cardWorkState);
585 }
586}
587
588void sp_confirm_paymode(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
589{
590 uint8 keycode = SP_KEY_NONE;
591 keycode = sp_get_key();
592 //ÔÚ¿¨Ïû·ÑÔÝÍ£Çé¿öϰ´ÈÎÒâ¼üΪ½áÊøµ±Ç°Ïû·Ñ״̬
guangcheng.qin0b456a32019-08-08 16:53:12 +0800593 if(keycode >= SP_KEY_0 && keycode <= SP_KEY_ENTER
594 && pos->cardState.cur_state == STATE_NONE
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800595 && cardWorkState->current_state == CARDWORKSTATUS_PAUSE && pos->paymode == PAYMODE_CARD)
596 {
guangcheng.qin0b456a32019-08-08 16:53:12 +0800597 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
598 return;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800599 }
600 //Ïû·Ñģʽ³õʼ»¯×´Ì¬Ï°´È·ÈϼüÑ¡Ôñ¶þάÂëÏû·Ñ
601 if((keycode == SP_KEY_ENTER) && (pos->paymode == PAYMODE_INIT))
602 {
603 cardWorkState->current_state = CARDWORKSTATUS_NONE;
604 pos->paymode = PAYMODE_QRCODE;
guangcheng.qin0b456a32019-08-08 16:53:12 +0800605 return;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800606 }
607 //¶þάÂëģʽϰ´È¡Ïû¼üΪֹͣ¹¤×÷
608 if((pos->paymode == PAYMODE_QRCODE) && (keycode == SP_KEY_CLEAR))
609 {
610 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
guangcheng.qin0b456a32019-08-08 16:53:12 +0800611 return;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800612 }
613 //°´0¼ü½øÈëÉ豸²Ù×÷½çÃæ
614 if(keycode == SP_KEY_0 && (pos->paymode == PAYMODE_INIT))
615 {
616 cardWorkState->current_state = CARDWORKSTATUS_SET_DEV;
guangcheng.qin0b456a32019-08-08 16:53:12 +0800617 return;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800618 }
619}
620
621//¶þάÂëÏû·Ñ´¦Àí
622uint32 tick = 0;
623void sp_qrcode_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
624{
625 uint16 ret = 0;
626 sp_transdtl_t record;
627 MEMCLEAR(&record, sizeof(record));
628 switch(cardWorkState->current_state)
629 {
630 case CARDWORKSTATUS_NONE:
631 ret = sp_check_dev(pos);
632 if(ret)
633 {
634 cardWorkState->errcode = ret;
635 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
636 break;
637 }
638 ret = sp_qrcode_init(pos, &CARD);
639 if(ret)
640 {
641 cardWorkState->errcode = ret;
642 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
643 break;
644 }
645 ret = sp_prepare_behalf_transdtl(pos, &CARD, &record);
646 if(ret)
647 {
648 cardWorkState->errcode = RC_QRCODE_TIMEOUT;
649 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
650 break;
651 }
652 pos->sysconf.work_mode = 1;
653 CARD.qrcode.starttime = sp_get_ticker();
654 disp_hint_info(pos, "ÕýÔÚÉú³É¶þάÂë", DELAY_TIME2s);
655 cardWorkState->last_state = cardWorkState->current_state;
656 cardWorkState->current_state = CARDWORKSTATUS_READY;
657 break;
658 case CARDWORKSTATUS_READY:
659 CARD.qrcode.nowtime = sp_get_ticker();
660 if((CARD.qrcode.nowtime - CARD.qrcode.starttime) > CARD.qrcode.validtime)
661 {
662 show_home(pos);
663 show_home_qrcode(CARD.qrcode.qrcode_url);
664 if(CARD.qrcode.nowtime - tick > DELAY_TIME3s)
665 {
666 tick = CARD.qrcode.nowtime;
667 ret = sp_qrcode_query(pos, &CARD);
668 if(!ret && CARD.qrcode.authstatus)
669 {
670 do_start(pos);
671 cardWorkState->last_state = cardWorkState->current_state;
672 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
673 }
674 }
675 }
676 else
677 {
678 cardWorkState->errcode = RC_QRCODE_TIMEOUT;
679 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
680 }
681 break;
682 case CARDWORKSTATUS_WORKING:
683 ret = do_work(pos, &CARD);
684 if(ret)
685 {
686 show_error(pos,"Ïû·Ñʧ°Ü",ret);
687 ret = do_stop(pos, &CARD);
688 if(ret)
689 {
690 cardWorkState->errcode = ret;
691 }
692 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
693 break;
694 }
695 cardWorkState->last_state = cardWorkState->current_state;
696 cardWorkState->pause_tick = sp_get_ticker();
697 break;
698 case CARDWORKSTATUS_STOPPING:
699 if(cardWorkState->last_state == CARDWORKSTATUS_NONE
700 || cardWorkState->last_state == CARDWORKSTATUS_READY)
701 {
702 disp_hint_info(pos,"È¡ÏûË¢Âë!", DELAY_TIME2s);
703 pos->paymode = PAYMODE_INIT;
704 pos->sysconf.work_mode = 0;
705 }
706 else
707 {
708 if(cardWorkState->last_state != CARDWORKSTATUS_PAUSE)
709 do_pause(pos);
710 ret = do_stop(pos, &CARD);
711 if(ret)
712 {
713 cardWorkState->errcode = ret;
714 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
715 break;
716 }
717 }
718 cardWorkState->current_state = CARDWORKSTATUS_NONE;
719 cardWorkState->last_state = cardWorkState->current_state;
720 break;
721 case CARDWORKSTATUS_ERROR:
722 do_error(pos,cardWorkState->errcode);
723 cardWorkState->current_state = CARDWORKSTATUS_NONE;
724 cardWorkState->last_state = cardWorkState->current_state;
725 break;
726 default:
727 Delay_ms(DELAY_TIME200ms);
728 break;
729 }
730}