blob: b416a6d8fa50f13e3802ae8f4f08befcf9f31ebe [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));
161 ret = sp_read_unconfirm_first_record(record_termtime);
162 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.zhang0c6a0882019-08-07 14:48:21 +0800242 sp_transdtl_t record;
243 MEMCLEAR(&record, sizeof(record));
244 card->cardtype = pos->cardState.tag_type;
245 MEMCPY(card->cardphyid, pos->cardState.snr, 4);
246 ret = sp_card_read(card);
247 if(ret)
248 {
zongqiang.zhangd0017d72019-12-06 09:26:32 +0800249 return RC_CARD_INVALID;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800250 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800251 if(pos->load_para_status)
252 {
253 return pos->load_para_status;
254 }
255 ret = sp_dev_config_check(pos);
256 if(ret)
257 {
258 return ret;
259 }
260 ret = sp_dev_offline_check(pos);
261 if(ret)
262 {
263 return ret;
264 }
265
guangcheng.qin0b456a32019-08-08 16:53:12 +0800266 ret = sp_card_authentication(pos, card);
267 if(ret)
268 {
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800269 return ret;
270 }
271 ret = do_card_check(pos,card);
272 if(ret)
273 {
274 return ret;
guangcheng.qin0b456a32019-08-08 16:53:12 +0800275 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800276 ret = sp_prepare_behalf_transdtl(pos, card, &record);
277 if(ret)
278 {
279 return ret;
280 }
281 pos->sysconf.work_mode = 1;
282 pos->paymode = PAYMODE_CARD;
283 return 0;
284}
285
286static uint16 do_start(sp_pos_t* pos)
287{
288 MEMCLEAR(&pos->purchase,sizeof(sp_purchase_t));
289 sp_flowsensor_count_clear();
290 sp_get_bcdtime(pos->purchase.starttime);
291 sp_valve_on();
292 show_money(pos, pos->purchase.paid_sum);
293 return 0;
294}
295
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800296static uint16 do_work(sp_pos_t* pos, sp_card_t* card)
297{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800298 uint16 ret;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800299 //¼ÆËãÏû·Ñ½ð¶î
300 ret = sp_calc_payamt_by_flowsensor(pos, card);
301 if(ret)
302 {
303 return ret;
304 }
305 if(pos->purchase.prepaid_amt > 0)
306 {
307 //ĬÈϼÇÕËģʽ
308 ret = sp_account_purchase(pos->purchase.prepaid_amt);
309 if(ret)
310 {
311 return ret;
312 }
313 }
314
315 if(pos->purchase.prepaid_num > 0)
316 {
317 pos->purchase.paid_num += pos->purchase.prepaid_num;
318 pos->purchase.paid_sum += pos->purchase.prepaid_amt;
319 pos->purchase.prepaid_num = 0;
320 pos->purchase.prepaid_amt = 0;
321 }
322 show_money(pos, pos->purchase.paid_sum);
323 return 0;
324}
325
326static uint16 do_stop(sp_pos_t* pos, sp_card_t* card)
327{
328 uint16 ret;
329 sp_transdtl_t record;
330 sp_valve_off();
331
332 if(pos->purchase.paid_num > 0)
333 {
334 MEMCLEAR(&record, sizeof(record));
335 ret = sp_prepare_below_transdtl(pos, card, &record);
336 if(ret)
337 {
338 return ret;
339 }
340 }
341 pos->paymode = PAYMODE_INIT;
342 pos->sysconf.work_mode = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800343 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
344 MEMCLEAR(card, sizeof(sp_card_t));
345 return 0;
346}
347
348static void do_pause(sp_pos_t* pos)
349{
350 char msg[17];
351 MEMCLEAR(msg, sizeof(msg));
352 sp_valve_off();
353 if(pos->purchase.paid_sum > 0)
354 {
355 sprintf(msg,"¹²¼Æ %0.2fÔª",pos->purchase.paid_sum/100.0f);
356 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ",msg,DELAY_TIME2s);
357 }
358 else
359 {
360 disp_hint_info_two(pos,"½áÊø¼Æ·Ñ","Ãâ·ÑʹÓÃ",DELAY_TIME2s);
361 }
362}
363
364static void do_error(sp_pos_t* pos, uint16 errcode)
365{
366 if(errcode)
367 {
368 show_error(pos,"²Ù×÷ʧ°Ü:",errcode);
369 pos->paymode = PAYMODE_INIT;
370 pos->sysconf.work_mode = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800371 MEMCLEAR(&pos->purchase, sizeof(sp_purchase_t));
372 }
373}
374
375static uint16 sp_card_exist_handle(sp_pos_t* pos, sp_card_t* card,
376 sp_cardworkstate_t* cardWorkState)
377{
378 uint16 ret = 0;
379 uint16 err = 0;
380 sp_card_t cardpcd;
381 switch(cardWorkState->current_state)
382 {
383 case CARDWORKSTATUS_NONE:
384 if(timer_get_ticker() - pos->cardState.firsttick < 1500)
385 {
386 break;
387 }
388 ret = do_new(pos, card);
389 if(ret)
390 {
391 if(0x1018 == ret || 0x2001 == ret||
392 0x1014 == ret || 0x1030 == ret)
393 {
394 if(0 == sp_card_request(&cardpcd))
395 {
396 break;
397 }
398 }
399 cardWorkState->errcode = ret;
400 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
401 break;
402 }
403 cardWorkState->current_state = CARDWORKSTATUS_READY;
404 break;
405 case CARDWORKSTATUS_READY:
406 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
407 {
408 cardWorkState->current_state = CARDWORKSTATUS_NONE;
409 break;
410 }
411 ret = do_start(pos);
412 if(ret)
413 {
414 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
415 break;
416 }
417 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
418 break;
419 case CARDWORKSTATUS_PAUSE:
420 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
421 break;
422 case CARDWORKSTATUS_WORKING:
423 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
424 {
425 ret = RC_NOT_SAME_CARD;
426 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
427 break;
428 }
429 cardWorkState->pause_status = 0;
430 ret = do_work(pos, card);
431 if(ret)
432 {
433 show_error(pos,"Ïû·Ñʧ°Ü",ret);
434 err = do_stop(pos, card);
435 if(err != 0)
436 {
437 ret = err;
438 }
439 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
440 break;
441 }
442 if(pos->purchase.paid_num > card->waterlimit)
443 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800444 disp_hint_info_two(pos,"Í£Ö¹³öË®","ÒÑ´ïµ¥´Î³öË®ÉÏÏÞ",DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800445 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
446 }
447 cardWorkState->pause_tick = timer_get_ticker();
448 break;
449 case CARDWORKSTATUS_STOPPING:
450 ret = do_stop(pos, card);
451 if(ret)
452 {
453 cardWorkState->errcode = ret;
454 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
455 break;
456 }
457 cardWorkState->current_state = CARDWORKSTATUS_STOPPED;
458 break;
459 case CARDWORKSTATUS_STOPPED:
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800460 disp_hint_info_two(pos,"Í£Ö¹³öË®", "ÇëÄÃ×ß¿¨", DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800461 break;
462 case CARDWORKSTATUS_FEECARD_WORKING:
463 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) != 0)
464 {
465 cardWorkState->current_state = CARDWORKSTATUS_NONE;
466 break;
467 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800468 break;
469 case CARDWORKSTATUS_ERROR:
470 do_error(pos, cardWorkState->errcode);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800471 break;
472 default:
473 Delay_ms(DELAY_TIME200ms);
474 cardWorkState->current_state = CARDWORKSTATUS_NONE;
475 break;
476 }
477 cardWorkState->errcode = ret;
478 return ret;
479}
480
481static uint16 sp_card_noexist_handle(sp_pos_t* pos, sp_card_t* card,
482 sp_cardworkstate_t* cardWorkState)
483{
484 //Óп¨µ½ÎÞ¿¨
485 uint16 ret = 0;
486 switch(cardWorkState->current_state)
487 {
488 case CARDWORKSTATUS_NONE:
489 do_idle(pos);
490 break;
491 case CARDWORKSTATUS_READY:
492 cardWorkState->current_state = CARDWORKSTATUS_NONE;
493 break;
494 case CARDWORKSTATUS_WORKING:
495 cardWorkState->current_state = CARDWORKSTATUS_PAUSE;
496 break;
497 case CARDWORKSTATUS_PAUSE:
498 if(MEMCMP(pos->cardState.snr, card->cardphyid, 4) == 0)
499 {
500 //¿¨ÄÃ×ßÒ»·ÖÖÓÖ®ÄÚĬÈÏÔÝͣʹÓÃ
501 if((timer_get_ticker() - cardWorkState->pause_tick) <= DELAY_TIME60s)
502 {
503 if(!cardWorkState->pause_status)
504 {
505 do_pause(pos);
506 show_home(pos);
507 }
508 show_home(pos);
509 cardWorkState->pause_status = 1;
510 }
511 else
512 {
513 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
514 cardWorkState->pause_status = 0;
515 }
516 }
517 else
518 {
519 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
520 cardWorkState->pause_status = 0;
521 }
522 cardWorkState->last_state = CARDWORKSTATUS_PAUSE;
523 break;
524 case CARDWORKSTATUS_STOPPING:
525 ret = do_stop(pos, card);
526 if(ret)
527 {
528 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
529 break;
530 }
531 cardWorkState->current_state = CARDWORKSTATUS_STOPPED;
532 cardWorkState->tick = timer_get_ticker();
533 break;
534 case CARDWORKSTATUS_STOPPED:
535 if(timer_get_ticker() - cardWorkState->tick > DELAY_TIME3s)
536 {
537 cardWorkState->current_state = CARDWORKSTATUS_NONE;
538 cardWorkState->last_state = cardWorkState->current_state;
539 cardWorkState->tick = 0;
540 }
541 break;
542 case CARDWORKSTATUS_SET_DEV:
543 if(sp_check_passwd(pos, "É豸¹ÜÀíÃÜÂë", "\x9\x1\x4\x3\x8\x7") == 0)
544 {
545 sp_menu_options(pos);
546 }
547 cardWorkState->current_state = CARDWORKSTATUS_NONE;
548 break;
549 case CARDWORKSTATUS_ERROR:
550 do_error(pos,cardWorkState->errcode);
551 cardWorkState->current_state = CARDWORKSTATUS_NONE;
552 break;
553 default:
554 Delay_ms(DELAY_TIME200ms);
555 cardWorkState->current_state = CARDWORKSTATUS_NONE;
556 break;
557 }
558 cardWorkState->errcode = ret;
559 return ret;
560}
561
562static sp_card_t CARD;
563void sp_card_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
564{
565 if(pos->cardState.cur_state)
566 {
567 sp_card_exist_handle(pos, &CARD, cardWorkState);
568 }
569 else
570 {
571 sp_card_noexist_handle(pos, &CARD, cardWorkState);
572 }
573}
574
575void sp_confirm_paymode(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
576{
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800577 uint8 keycode;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800578 keycode = sp_get_key();
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800579 if(keycode != SP_KEY_NONE)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800580 {
zongqiang.zhang91d35d42019-11-21 16:37:24 +0800581 //°´0¼ü½øÈëÉ豸²Ù×÷½çÃæ
582 if((keycode == SP_KEY_0) && (pos->paymode == PAYMODE_INIT))
583 {
584 menu_cnt++;
585 if(menu_cnt > 6)
586 {
587 menu_cnt = 0;
588 cardWorkState->current_state = CARDWORKSTATUS_SET_DEV;
589 }
590 return;
591 }
592 menu_cnt = 0;
593
594 //ÔÚ¿¨Ïû·ÑÔÝÍ£Çé¿öϰ´ÈÎÒâ¼üΪ½áÊøµ±Ç°Ïû·Ñ״̬
595 if((pos->cardState.cur_state == STATE_NONE)
596 && (cardWorkState->current_state == CARDWORKSTATUS_PAUSE)
597 && (pos->paymode == PAYMODE_CARD))
598 {
599 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
600 return;
601 }
602 //Ïû·Ñģʽ³õʼ»¯×´Ì¬Ï°´È·ÈϼüÑ¡Ôñ¶þάÂëÏû·Ñ
603 if((keycode == SP_KEY_ENTER) && (pos->paymode == PAYMODE_INIT))
604 {
605 cardWorkState->current_state = CARDWORKSTATUS_NONE;
606 pos->paymode = PAYMODE_QRCODE;
607 return;
608 }
609 //¶þάÂëģʽϰ´È¡Ïû¼üΪֹͣ¹¤×÷
610 if((keycode == SP_KEY_CLEAR) && (pos->paymode == PAYMODE_QRCODE))
611 {
612 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
613 return;
614 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800615 }
616}
617
618//¶þάÂëÏû·Ñ´¦Àí
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800619static uint32 tick = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800620void sp_qrcode_handle(sp_pos_t* pos, sp_cardworkstate_t* cardWorkState)
621{
622 uint16 ret = 0;
623 sp_transdtl_t record;
624 MEMCLEAR(&record, sizeof(record));
625 switch(cardWorkState->current_state)
626 {
627 case CARDWORKSTATUS_NONE:
628 ret = sp_check_dev(pos);
629 if(ret)
630 {
631 cardWorkState->errcode = ret;
632 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
633 break;
634 }
zongqiang.zhang7b2b7b22019-12-06 10:52:18 +0800635 disp_hint_info_two(pos, "ÇëÇó¶þάÂë","ÇëÉÔµÈ...",0);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800636 ret = sp_qrcode_init(pos, &CARD);
637 if(ret)
638 {
639 cardWorkState->errcode = ret;
640 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
641 break;
642 }
643 ret = sp_prepare_behalf_transdtl(pos, &CARD, &record);
644 if(ret)
645 {
646 cardWorkState->errcode = RC_QRCODE_TIMEOUT;
647 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
648 break;
649 }
650 pos->sysconf.work_mode = 1;
651 CARD.qrcode.starttime = sp_get_ticker();
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800652 //disp_hint_info(pos, "Éú³É¶þάÂë", 0);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800653 cardWorkState->last_state = cardWorkState->current_state;
654 cardWorkState->current_state = CARDWORKSTATUS_READY;
655 break;
656 case CARDWORKSTATUS_READY:
657 CARD.qrcode.nowtime = sp_get_ticker();
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800658 if((CARD.qrcode.nowtime - CARD.qrcode.starttime) < CARD.qrcode.validtime*DELAY_TIME1s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800659 {
zongqiang.zhangfef30f22019-12-04 15:25:43 +0800660 show_home_qrcode(pos,CARD.qrcode.qrcode_url);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800661 if(CARD.qrcode.nowtime - tick > DELAY_TIME2s)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800662 {
663 tick = CARD.qrcode.nowtime;
664 ret = sp_qrcode_query(pos, &CARD);
665 if(!ret && CARD.qrcode.authstatus)
666 {
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800667 if(CARD.permit)
668 {
669 cardWorkState->errcode = RC_LIMIT_CONSUMPTION;
670 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
671 }
672 else
673 {
674 do_start(pos);
675 cardWorkState->last_state = cardWorkState->current_state;
676 cardWorkState->current_state = CARDWORKSTATUS_WORKING;
677 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800678 }
679 }
680 }
681 else
682 {
683 cardWorkState->errcode = RC_QRCODE_TIMEOUT;
684 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
685 }
686 break;
687 case CARDWORKSTATUS_WORKING:
688 ret = do_work(pos, &CARD);
689 if(ret)
690 {
691 show_error(pos,"Ïû·Ñʧ°Ü",ret);
692 ret = do_stop(pos, &CARD);
693 if(ret)
694 {
695 cardWorkState->errcode = ret;
696 }
697 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
698 break;
699 }
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800700 if(pos->purchase.paid_num > CARD.waterlimit)
701 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800702 disp_hint_info_two(pos, "Í£Ö¹³öË®","ÒÑ´ïµ¥´Î³öË®ÉÏÏÞ", DELAY_TIME2s);
guangcheng.qin2d6738c2019-09-25 17:38:15 +0800703 cardWorkState->current_state = CARDWORKSTATUS_STOPPING;
704 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800705 cardWorkState->last_state = cardWorkState->current_state;
706 cardWorkState->pause_tick = sp_get_ticker();
707 break;
708 case CARDWORKSTATUS_STOPPING:
709 if(cardWorkState->last_state == CARDWORKSTATUS_NONE
710 || cardWorkState->last_state == CARDWORKSTATUS_READY)
711 {
zongqiang.zhangcb1f2692019-11-26 17:17:14 +0800712 disp_hint_info_two(pos,"Í£Ö¹³öË®","È¡ÏûË¢Âë!", DELAY_TIME2s);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800713 pos->paymode = PAYMODE_INIT;
714 pos->sysconf.work_mode = 0;
715 }
716 else
717 {
718 if(cardWorkState->last_state != CARDWORKSTATUS_PAUSE)
719 do_pause(pos);
720 ret = do_stop(pos, &CARD);
721 if(ret)
722 {
723 cardWorkState->errcode = ret;
724 cardWorkState->current_state = CARDWORKSTATUS_ERROR;
725 break;
726 }
727 }
728 cardWorkState->current_state = CARDWORKSTATUS_NONE;
729 cardWorkState->last_state = cardWorkState->current_state;
730 break;
731 case CARDWORKSTATUS_ERROR:
732 do_error(pos,cardWorkState->errcode);
733 cardWorkState->current_state = CARDWORKSTATUS_NONE;
734 cardWorkState->last_state = cardWorkState->current_state;
735 break;
736 default:
737 Delay_ms(DELAY_TIME200ms);
738 break;
739 }
740}