blob: 4447d52b2f0d20404eccb9b44f44711dde783d3e [file] [log] [blame]
zongqiang.zhang0c6a0882019-08-07 14:48:21 +08001#include "sp_menu.h"
2#include "sp_util.h"
3#include "sp_data.h"
4#include "stdlib.h"
5#include "stdio.h"
6#include "sp_constant.h"
7#include "sp_communicate.h"
8#include "sp_display.h"
9#include "sp_upgrade.h"
10#include "../nec_hardware.h"
11
12typedef void(*menu_func_t)(sp_pos_t* pos);
13typedef struct
14{
15 char* hit;
16 menu_func_t func;
17} menu_t;
18
19static void sp_show_syspara(sp_pos_t* pos)
20{
21 uint32 ticker;
22 uint8 keycode;
23 uint8 key_press = 1;
24 uint8 max_cnt = 0;
25 uint8 offset = 0;
26 uint8 unconfirm_transnum;
27 char syspara[9][17];
28
29 MEMCLEAR(syspara, sizeof(syspara));
30 sprintf(syspara[offset++], "É豸״̬:");
31 if(pos->devlogin.login_flag == 1)
32 {
33 sprintf(syspara[offset++], "ÒÑÇ©µ½");
34 }
35 else if(pos->devlogin.login_flag == 0)
36 {
37 sprintf(syspara[offset++], "δǩµ½");
38 }
39 else if(pos->devlogin.login_flag == 2)
40 {
41 sprintf(syspara[offset++], "ÒÑ×¢Ïú");
42 }
43 sprintf(syspara[offset++], "Á´Â·×´Ì¬:");
44 if(pos->link_stat)
45 {
46 sprintf(syspara[offset++], "ÁªÍø");
47 }
48 else
49 {
50 sprintf(syspara[offset++], "ÖжÏ");
51 }
52 sprintf(syspara[offset++], "δÉÏ´«Á÷Ë®:");
53 if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr)
54 {
55 if(pos->unconfirm_transdtl.transaddr == pos->last_transdtl.transaddr)
56 {
57 unconfirm_transnum = 1;
58 }
59 else
60 {
61 unconfirm_transnum = ((pos->last_transdtl.transaddr -
62 pos->unconfirm_transdtl.transaddr)/sizeof(sp_transdtl_t));
63 }
64 }
65 else
66 {
67 unconfirm_transnum = 0;
68 }
69 sprintf(syspara[offset++], "%d±Ê", unconfirm_transnum);
70 sprintf(syspara[offset++], "Ïû·ÑÀàÐÍ:");
71 sprintf(syspara[offset++], "¼ÇÕËÏû·Ñ");
72
73 max_cnt = sizeof(syspara)/sizeof(syspara[0])/2;
74 offset = 0;
75 ticker = sp_get_ticker();
76 while(sp_get_ticker()-ticker <= DELAY_TIME60s)
77 {
78 keycode = sp_get_key();
79 if(keycode != SP_KEY_NONE)
80 {
81 key_press = 1;
82 switch(keycode)
83 {
84 case SP_KEY_0:
85 if(offset < max_cnt-1)
86 {
87 offset++;
88 }
89 break;
90 case SP_KEY_1:
91 case SP_KEY_2:
92 case SP_KEY_3:
93 case SP_KEY_4:
94 case SP_KEY_5:
95 case SP_KEY_6:
96 case SP_KEY_7:
97 case SP_KEY_8:
98 case SP_KEY_9:
99 offset = keycode -SP_KEY_0;
100 if(offset >= max_cnt)
101 {
102 offset = max_cnt -1;
103 }
104 break;
105 case SP_KEY_CLEAR:
106 return;
107 }
108 }
109 if(key_press)
110 {
111 disp_hint_info_two(pos, syspara[2*offset],syspara[2*offset+1],0);
112 key_press = 0;
113 ticker = sp_get_ticker();
114 }
115 }
116}
117
118static uint8 sp_link_test(sp_pos_t* pos)
119{
120 uint8 ret;
121 sp_protocol_request_t req;
122 sp_protocol_response_t resp;
123 MEMCLEAR(&req, sizeof(req));
124 MEMCLEAR(&resp, sizeof(resp));
125
126 disp_hint_info_two(pos, "ÕýÔÚÁ´Â·¼ì²â", "ÇëÉÔµÈ.....", 0);
127 sp_protocol_req_init(&req, SP_CMD_FACTORY_LINK_TEST);
128 req.data[0] = 0;
129 req.data[1] = 0x55;
130 req.data[2] = 0xAA;
131 req.datalen += 3;
132 ret = sp_comm_call(pos, &req, &resp, DELAY_TIME3s);
133 if(!ret)
134 {
135 if(resp.data[0] == 0x55 && resp.data[1] == 0xAA)
136 {
137 if(sp_check_time_valid(resp.data +2))
138 {
139 disp_hint_info_two(pos, "Á´Â·¼ì²â³É¹¦","ʱÖÓ²»ºÏ·¨", DELAY_TIME3s);
140 return ret;
141 }
142 sp_set_bcdtime(resp.data +2);
143 disp_hint_info_two(pos, "Á´Â·¼ì²â³É¹¦","ÒÑͬ²½Ê±ÖÓ", DELAY_TIME3s);
144 return ret;
145 }
146 disp_hint_info_two(pos, "Á´Â·¼ì²âʧ°Ü","ÊÕµ½´íÎó°ü", DELAY_TIME3s);
147 return 1;
148 }
149 disp_hint_info_two(pos, "Á´Â·¼ì²âʧ°Ü","Çë¼ì²âÏß·", DELAY_TIME3s);
150 return ret;
151}
152
153static void show_keyboard_test(sp_pos_t* pos, uint8 offset)
154{
155 char msg[]= {"0123456789C"};
156 char temp[17];
157 snprintf(temp,offset+1,"%s",msg);
158 disp_hint_info_three(pos, "¼üÅÌÒÀ´ÎÊäÈë","0123456789C",temp,0);
159}
160
161static uint8 sp_keyboard_test(sp_pos_t* pos)
162{
163 uint8 kcode;
164 uint32 tick;
165 uint8 offset = 0;
166 uint8 keybuf[12]= {SP_KEY_0,SP_KEY_1,SP_KEY_2,SP_KEY_3,
167 SP_KEY_4,SP_KEY_5,SP_KEY_6,SP_KEY_7,
168 SP_KEY_8,SP_KEY_9,SP_KEY_CLEAR,SP_KEY_ENTER
169 };
170 show_keyboard_test(pos, offset);
171 tick = sp_get_ticker();
172 while((sp_get_ticker()-tick) < DELAY_TIME60s)
173 {
174 sp_feed_dog();
175 kcode = sp_get_key();
176 if(kcode != SP_KEY_NONE)
177 {
178 tick = sp_get_ticker();
179 switch(kcode)
180 {
181 case SP_KEY_0:
182 if(keybuf[offset] == SP_KEY_0)
183 {
184 ++offset;
185 show_keyboard_test(pos, offset);
186 }
187 break;
188 case SP_KEY_1:
189 if(keybuf[offset] == SP_KEY_1)
190 {
191 ++offset;
192 show_keyboard_test(pos, offset);
193 }
194 break;
195 case SP_KEY_2:
196 if(keybuf[offset] == SP_KEY_2)
197 {
198 ++offset;
199 show_keyboard_test(pos, offset);
200 }
201 break;
202 case SP_KEY_3:
203 if(keybuf[offset] == SP_KEY_3)
204 {
205 ++offset;
206 show_keyboard_test(pos, offset);
207 }
208 break;
209 case SP_KEY_4:
210 if(keybuf[offset] == SP_KEY_4)
211 {
212 ++offset;
213 show_keyboard_test(pos, offset);
214 }
215 break;
216 case SP_KEY_5:
217 if(keybuf[offset] == SP_KEY_5)
218 {
219 ++offset;
220 show_keyboard_test(pos, offset);
221 }
222 break;
223 case SP_KEY_6:
224 if(keybuf[offset] == SP_KEY_6)
225 {
226 ++offset;
227 show_keyboard_test(pos, offset);
228 }
229 break;
230 case SP_KEY_7:
231 if(keybuf[offset] == SP_KEY_7)
232 {
233 ++offset;
234 show_keyboard_test(pos, offset);
235 }
236 break;
237 case SP_KEY_8:
238 if(keybuf[offset] == SP_KEY_8)
239 {
240 ++offset;
241 show_keyboard_test(pos, offset);
242 }
243 break;
244 case SP_KEY_9:
245 if(keybuf[offset] == SP_KEY_9)
246 {
247 ++offset;
248 show_keyboard_test(pos, offset);
249 }
250 break;
251 case SP_KEY_CLEAR:
252 if(offset == 0)
253 {
254 disp_hint_info(pos, "È¡Ïû°´¼ü¼ì²â",DELAY_TIME2s);
255 return 1;
256 }
257 if(keybuf[offset] == SP_KEY_CLEAR)
258 {
259 ++offset;
260 show_keyboard_test(pos, offset);
261 }
262 break;
263 case SP_KEY_ENTER:
264 if(keybuf[offset] == SP_KEY_ENTER)
265 {
266 disp_hint_info_two(pos, "¼üÅ̼ì²âÕýÈ·","¼üÅÌУ׼Õý³£",DELAY_TIME3s);
267 return 0;
268 }
269 break;
270 default:
271 break;
272 }
273 }
274 }
275 return 1;
276
277}
278
279static void sp_factory_check(sp_pos_t* pos)
280{
281 sp_link_test(pos);
282 sp_keyboard_test(pos);
283}
284
285static void sp_set_devtime(sp_pos_t* pos)
286{
287 uint32 ticker;
288 uint8 kcode;
289 uint8 key_press = 1;
290 uint8 ctime[6];
291 uint8 offset;
292 char str[13];
293 char msg[17];
294
295 MEMCLEAR(str,sizeof str);
296 sp_get_bcdtime(ctime);
297 offset = 10;
298 sp_hex_to_str(ctime,5,str);
299 ticker = sp_get_ticker();
300 while(sp_get_ticker() -ticker < DELAY_TIME60s)
301 {
302 kcode = sp_get_key();
303 if(kcode != SP_KEY_NONE)
304 {
305 key_press = 1;
306 switch(kcode)
307 {
308 case SP_KEY_0:
309 case SP_KEY_1:
310 case SP_KEY_2:
311 case SP_KEY_3:
312 case SP_KEY_4:
313 case SP_KEY_5:
314 case SP_KEY_6:
315 case SP_KEY_7:
316 case SP_KEY_8:
317 case SP_KEY_9:
318 if(offset < 10)
319 {
320 str[offset++] = '0' + (kcode- SP_KEY_0);
321 }
322 break;
323 case SP_KEY_ENTER:
324 if(offset >= 10)
325 {
326 MEMCLEAR(ctime,sizeof ctime);
327 sp_str_to_bcd(str,10,ctime);
328 if(sp_check_time_valid(ctime))
329 {
330 disp_hint_info_two(pos,"ÉèÖÃʱ¼äʧ°Ü","ʱ¼ä²»ºÏ·¨", DELAY_TIME3s);
331 }
332 else
333 {
334 sp_set_bcdtime(ctime);
335 disp_hint_info_two(pos,"ÉèÖÃʱ¼ä³É¹¦"," ", DELAY_TIME2s);
336 return;
337 }
338 }
339 break;
340 case SP_KEY_CLEAR:
341 if(offset == 0)
342 {
343 return;
344 }
345 offset--;
346 str[offset] = 0;
347 break;
348 }
349 }
350 if(key_press)
351 {
352 sprintf(msg,"%s",str);
353 disp_hint_info_two(pos,"ÉèÖÃʱ¼ä(ymdHm)",msg,0);
354 ticker = sp_get_ticker();
355 key_press = 0;
356 }
357 }
358}
359
360static void sp_manual_login(sp_pos_t* pos)
361{
362 uint16 ret;
363 uint32 tick;
364 sp_protocol_response_t resp;
365 MEMCLEAR(&resp, sizeof(resp));
366 disp_hint_info_two(pos,"ÕýÔڵǼ","ÇëÉÔµÈ...",0);
367 sp_async_equipment_login(pos);
368 tick = sp_get_ticker();
369 while(sp_get_ticker() - tick < DELAY_TIME3s*2)
370 {
371 MEMCLEAR(&resp, sizeof(resp));
372 usart_read((u8*)&resp, sizeof(resp));
373 if(resp.excmd == SP_CMD_LOGIN)
374 {
375 ret = sp_confirm_login(&resp, pos);
376 break;
377 }
378 else
379 {
380 ret = RC_DEV_LOGIN_FAIL;
381 }
382 }
383 if(ret)
384 {
385 char msg[32];
386 sprintf(msg,"´íÎóÂë=%d",ret);
387 disp_hint_info_two(pos,"Ç©µ½Ê§°Ü",msg,DELAY_TIME3s);
388 }
389 else
390 {
391 disp_hint_info(pos,"Ç©µ½³É¹¦",DELAY_TIME3s);
392 }
393}
394
395static void sp_set_devphyid(sp_pos_t* pos)
396{
397 uint32 ticker;
398 uint8 kcode;
399 uint16 ret = 0;
400 uint8 key_press = 1;
401 char msg[17];
402 uint8 devphyid[4];
403 uint8 offset;
404 char str[9];
405 MEMCPY(devphyid,pos->devphyid,sizeof(pos->devphyid));
406 MEMCLEAR(str,sizeof str);
407
408 ticker = sp_get_ticker();
409 offset = 8;
410 sp_hex_to_str(devphyid,4,str);
411 while(sp_get_ticker() -ticker < DELAY_TIME60s)
412 {
413 kcode = sp_get_key();
414 if(kcode != SP_KEY_NONE)
415 {
416 key_press = 1;
417 switch(kcode)
418 {
419 case SP_KEY_0:
420 case SP_KEY_1:
421 case SP_KEY_2:
422 case SP_KEY_3:
423 case SP_KEY_4:
424 case SP_KEY_5:
425 case SP_KEY_6:
426 case SP_KEY_7:
427 case SP_KEY_8:
428 case SP_KEY_9:
429 if(offset < 8)
430 {
431 str[offset++] = '0' +(kcode -SP_KEY_0);
432 }
433 break;
434 case SP_KEY_ENTER:
435 if(offset >= 8)
436 {
437 sp_str_to_hex(str,8,devphyid);
438 if(0 != MEMCMP(pos->devphyid,devphyid,4))
439 {
440 ret = sp_save_devphyid(pos, devphyid);
441 }
442 if(!ret)
443 {
444 MEMCPY(pos->devphyid,devphyid,4);
445 sprintf(msg,"ID: %02x%02x%02x%02x",devphyid[0],devphyid[1],devphyid[2],devphyid[3]);
446 disp_hint_info_two(pos,"ÉèÖÃÎïÀíID³É¹¦",msg, DELAY_TIME2s);
447 }
448 else
449 {
450 show_error(pos,"±£´æÎïÀíIDʧ°Ü",ret);
451 }
452 return;
453 }
454 break;
455 case SP_KEY_CLEAR:
456 if(offset > 0)
457 {
458 offset--;
459 str[offset] = 0;
460 }
461 else
462 {
463 return;
464 }
465 break;
466 }
467 }
468 if(key_press)
469 {
470 sprintf(msg,"%s",str);
471 disp_hint_info_two(pos,"ÉèÖÃÎïÀíID:",msg,0);
472 ticker = sp_get_ticker();
473 key_press = 0;
474 }
475 }
476 return;
477}
478static void sp_set_deviceno(sp_pos_t* pos)
479{
480 uint32 ticker;
481 uint8 kcode;
482 uint16 ret = 0;
483 uint8 key_press = 1;
484 uint16 tempno;
485 uint8 deviceno = pos->deviceno;
486 char msg[17];
487 char temp[17];
488 ticker = sp_get_ticker();
489 while(sp_get_ticker() -ticker < DELAY_TIME60s)
490 {
491 kcode = sp_get_key();
492 if(kcode != SP_KEY_NONE)
493 {
494 key_press = 1;
495 switch(kcode)
496 {
497 case SP_KEY_0:
498 case SP_KEY_1:
499 case SP_KEY_2:
500 case SP_KEY_3:
501 case SP_KEY_4:
502 case SP_KEY_5:
503 case SP_KEY_6:
504 case SP_KEY_7:
505 case SP_KEY_8:
506 case SP_KEY_9:
507 tempno = (uint16)deviceno;
508 tempno *=10;
509 tempno += (kcode-SP_KEY_0);
510 if(tempno > 0 && tempno < DEV_MAX_DEVICENO)
511 {
512 deviceno = (uint8)tempno;
513 }
514 break;
515 case SP_KEY_ENTER:
516 if(deviceno > 0 && deviceno <= DEV_MAX_DEVICENO)
517 {
518 if(pos->deviceno != deviceno)
519 {
520 ret = sp_save_deviceno(pos,deviceno);
521 }
522 if(!ret)
523 {
524 pos->deviceno = deviceno;
525 sprintf(msg,"»úºÅ: %d",deviceno);
526 disp_hint_info_two(pos,"ÉèÖûúºÅ³É¹¦",msg, DELAY_TIME2s);
527 }
528 else
529 {
530 show_error(pos,"±£´æ»úºÅʧ°Ü",ret);
531 }
532 return;
533 }
534 else
535 {
536 sprintf(msg,"·¶Î§(1-%d)",DEV_MAX_DEVICENO);
537 disp_hint_info_two(pos,"»úºÅ´íÎó",msg, DELAY_TIME3s);
538 }
539 case SP_KEY_CLEAR:
540 if(deviceno == 0)
541 {
542 return;
543 }
544 deviceno = 0;
545 break;
546 }
547 }
548 if(key_press)
549 {
550 sprintf(temp,"ÉèÖûúºÅ(1-%d)",DEV_MAX_DEVICENO);
551 sprintf(msg,"%d",deviceno);
552 disp_hint_info_two(pos,temp,msg,0);
553 ticker = sp_get_ticker();
554 key_press = 0;
555 }
556 }
557 return;
558}
559
560static void clear_transdtl(sp_pos_t* pos)
561{
562 if(0 == sp_check_passwd(pos,"Çå¿ÕÁ÷Ë®ÃÜÂë:","\x9\x1\x4\x3\x8\x7"))
563 {
564 disp_hint_info_two(pos,"Çå¿ÕÁ÷Ë®","ÇëÉÔµÈ...",0);
565 sp_clear_transdtl(pos);
566 }
567}
568
569static void manual_upgrade(sp_pos_t* pos)
570{
571 if(0 == sp_check_passwd(pos, "ÔÚÏßÉý¼¶ÃÜÂë:","\x9\x1\x4\x3\x8\x7"))
572 {
573 sp_manual_upgrade(pos);
574 }
575}
576
577static void reset_factory(sp_pos_t* pos)
578{
579 if(0 == sp_check_passwd(pos, "»Ö¸´³ö³§ÃÜÂë:","\x9\x1\x4\x3\x8\x7"))
580 {
581 sp_reset_factory(pos);
582 }
583}
584
585void sp_menu_options(sp_pos_t* pos)
586{
587 uint32 ticker = 0;
588 uint8 keycode;
589 uint8 page;
590 uint8 max_cnt;
591 uint8 key_press = 1;
592
593 menu_t menus[] =
594 {
595 {"1.²é¿´²ÎÊý", sp_show_syspara},
596 {"2.¹¤³§²âÊÔ", sp_factory_check},
597 {"3.ÉèÖÃʱ¼ä", sp_set_devtime},
598 {"4.ÊÖ¶¯µÇ¼", sp_manual_login},
599 {"5.ÉèÖÃÎïÀíid", sp_set_devphyid},
600 {"6.ÉèÖûúºÅ", sp_set_deviceno},
601 {"7.Çå¿ÕÁ÷Ë®", clear_transdtl},
602 {"8.ÔÚÏßÉý¼¶", manual_upgrade},
603 {"9.»Ö¸´³ö³§", reset_factory}
604 };
605 max_cnt = sizeof(menus)/sizeof(menu_t)/3;
606 page = 0;
607 ticker = sp_get_ticker();
608 while(sp_get_ticker()-ticker <= DELAY_TIME60s*5)
609 {
610 sp_feed_dog();
611 keycode = sp_get_key();
612 if(keycode != SP_KEY_NONE)
613 {
614 key_press = 1;
615 switch(keycode)
616 {
617 case SP_KEY_0:
618 if(page < (max_cnt-1))
619 {
620 page++;
621 }
622 break;
623 case SP_KEY_1:
624 case SP_KEY_2:
625 case SP_KEY_3:
626 case SP_KEY_4:
627 case SP_KEY_5:
628 case SP_KEY_6:
629 case SP_KEY_7:
630 case SP_KEY_8:
631 case SP_KEY_9:
632 if(menus[keycode-SP_KEY_1].func != NULL)
633 {
634 menus[keycode-SP_KEY_1].func(pos);
635 }
636 break;
637 case SP_KEY_CLEAR:
638 if(page == 0)
639 {
640 return;
641 }
642 page--;
643 break;
644 default:
645 break;
646 }
647 }
648 if(key_press)
649 {
650 disp_hint_info_three(pos, menus[page*3].hit, menus[page*3+1].hit, menus[page*3+2].hit, 0);
651 key_press = 0;
652 ticker = sp_get_ticker();
653 }
654 }
655}