| #include "sp_menu.h" |
| #include "sp_util.h" |
| #include "sp_data.h" |
| #include "stdlib.h" |
| #include "stdio.h" |
| #include "sp_constant.h" |
| #include "sp_communicate.h" |
| #include "sp_display.h" |
| #include "sp_upgrade.h" |
| #include "../nec_hardware.h" |
| |
| typedef void(*menu_func_t)(sp_pos_t* pos); |
| typedef struct |
| { |
| char* hit; |
| menu_func_t func; |
| } menu_t; |
| |
| static void sp_show_syspara(sp_pos_t* pos) |
| { |
| uint32 ticker; |
| uint8 keycode; |
| uint8 key_press = 1; |
| uint8 max_cnt = 0; |
| uint8 offset = 0; |
| uint8 unconfirm_transnum; |
| char syspara[10][17]; |
| |
| MEMCLEAR(syspara, sizeof(syspara)); |
| sprintf(syspara[offset++], "É豸״̬:"); |
| if(pos->devlogin.login_flag == 1) |
| { |
| sprintf(syspara[offset++], "ÒÑÇ©µ½"); |
| } |
| else if(pos->devlogin.login_flag == 0) |
| { |
| sprintf(syspara[offset++], "δǩµ½"); |
| } |
| else if(pos->devlogin.login_flag == 2) |
| { |
| sprintf(syspara[offset++], "ÒÑ×¢Ïú"); |
| } |
| sprintf(syspara[offset++], "Á´Â·×´Ì¬:"); |
| if(pos->link_stat) |
| { |
| sprintf(syspara[offset++], "ÁªÍø"); |
| } |
| else |
| { |
| sprintf(syspara[offset++], "ÖжÏ"); |
| } |
| sprintf(syspara[offset++], "δÉÏ´«Á÷Ë®:"); |
| if(pos->unconfirm_transdtl.transaddr <= pos->last_transdtl.transaddr) |
| { |
| if(pos->unconfirm_transdtl.transaddr == pos->last_transdtl.transaddr) |
| { |
| unconfirm_transnum = 1; |
| } |
| else |
| { |
| unconfirm_transnum = ((pos->last_transdtl.transaddr - |
| pos->unconfirm_transdtl.transaddr)/sizeof(sp_transdtl_t)); |
| } |
| } |
| else |
| { |
| unconfirm_transnum = 0; |
| } |
| sprintf(syspara[offset++], "%d±Ê", unconfirm_transnum); |
| |
| sprintf(syspara[offset++],"Âö³åµ¥Î»¼ÆÊý"); |
| sprintf(syspara[offset++],"%d (´Î/100ml)", |
| ((uint32)pos->sysconf.flowsensor_unit)*1); |
| |
| sprintf(syspara[offset++], "Ïû·ÑÀàÐÍ:"); |
| sprintf(syspara[offset++], "¼ÇÕËÏû·Ñ"); |
| |
| max_cnt = (sizeof(syspara)/sizeof(syspara[0]) -1)/2 +1; |
| offset = 0; |
| ticker = sp_get_ticker(); |
| while(sp_get_ticker()-ticker <= DELAY_TIME60s) |
| { |
| sp_feed_dog(); |
| keycode = sp_get_key(); |
| if(keycode != SP_KEY_NONE) |
| { |
| key_press = 1; |
| switch(keycode) |
| { |
| case SP_KEY_0: |
| if(offset < max_cnt-1) |
| { |
| offset++; |
| } |
| break; |
| case SP_KEY_1: |
| case SP_KEY_2: |
| case SP_KEY_3: |
| case SP_KEY_4: |
| case SP_KEY_5: |
| case SP_KEY_6: |
| case SP_KEY_7: |
| case SP_KEY_8: |
| case SP_KEY_9: |
| offset = keycode -SP_KEY_0; |
| if(offset >= max_cnt) |
| { |
| offset = max_cnt -1; |
| } |
| break; |
| case SP_KEY_CLEAR: |
| return; |
| } |
| } |
| if(key_press) |
| { |
| disp_hint_info_two(pos, syspara[2*offset],syspara[2*offset+1],0); |
| key_press = 0; |
| ticker = sp_get_ticker(); |
| } |
| } |
| } |
| |
| static void test_link(sp_pos_t* pos) |
| { |
| uint8 ret; |
| sp_protocol_request_t req; |
| sp_protocol_response_t resp; |
| MEMCLEAR(&req, sizeof(req)); |
| MEMCLEAR(&resp, sizeof(resp)); |
| |
| disp_hint_info_two(pos, "ÕýÔÚÁ´Â·¼ì²â", "ÇëÉÔµÈ.....", 0); |
| sp_protocol_req_init(&req, SP_CMD_FACTORY_LINK_TEST); |
| req.data[0] = 0; |
| req.data[1] = 0x55; |
| req.data[2] = 0xAA; |
| req.datalen += 3; |
| ret = sp_comm_call(pos, &req, &resp, DELAY_TIME3s); |
| if(!ret) |
| { |
| if(resp.data[0] == 0x55 && resp.data[1] == 0xAA) |
| { |
| disp_hint_info_two(pos, "Á´Â·¼ì²â³É¹¦","ÊÕµ½Ó¦´ð°ü", DELAY_TIME3s); |
| return; |
| } |
| disp_hint_info_two(pos, "Á´Â·¼ì²âʧ°Ü","ÊÕµ½´íÎó°ü", DELAY_TIME3s); |
| return; |
| } |
| disp_hint_info_two(pos, "Á´Â·¼ì²âʧ°Ü","Çë¼ì²âÏß·", DELAY_TIME3s); |
| } |
| |
| static void show_keyboard_test(sp_pos_t* pos, uint8 offset) |
| { |
| char msg[]= {"0123456789C"}; |
| char temp[17]; |
| snprintf(temp,offset+1,"%s",msg); |
| disp_hint_info_three(pos, "¼üÅÌÒÀ´ÎÊäÈë","0123456789C",temp,0); |
| } |
| |
| static void do_keyboard_calibrate(sp_pos_t* pos) |
| { |
| disp_hint_info_two(pos,"УÑé¼üÅÌ","ÇëÉÔµÈ...",0); |
| sp_key_calibrate(); |
| disp_hint_info_two(pos, "¼üÅÌУÑéÍê³É","Çë¼ì²â",DELAY_TIME3s); |
| } |
| |
| static void do_keyboard_test(sp_pos_t* pos) |
| { |
| uint8 kcode; |
| uint32 tick; |
| uint8 offset = 0; |
| uint8 keybuf[12]= {SP_KEY_0,SP_KEY_1,SP_KEY_2,SP_KEY_3, |
| SP_KEY_4,SP_KEY_5,SP_KEY_6,SP_KEY_7, |
| SP_KEY_8,SP_KEY_9,SP_KEY_CLEAR,SP_KEY_ENTER |
| }; |
| show_keyboard_test(pos, offset); |
| tick = sp_get_ticker(); |
| while((sp_get_ticker()-tick) < DELAY_TIME60s) |
| { |
| sp_feed_dog(); |
| kcode = sp_get_key(); |
| if(kcode != SP_KEY_NONE) |
| { |
| tick = sp_get_ticker(); |
| switch(kcode) |
| { |
| case SP_KEY_0: |
| if(keybuf[offset] == SP_KEY_0) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_1: |
| if(keybuf[offset] == SP_KEY_1) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_2: |
| if(keybuf[offset] == SP_KEY_2) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_3: |
| if(keybuf[offset] == SP_KEY_3) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_4: |
| if(keybuf[offset] == SP_KEY_4) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_5: |
| if(keybuf[offset] == SP_KEY_5) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_6: |
| if(keybuf[offset] == SP_KEY_6) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_7: |
| if(keybuf[offset] == SP_KEY_7) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_8: |
| if(keybuf[offset] == SP_KEY_8) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_9: |
| if(keybuf[offset] == SP_KEY_9) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_CLEAR: |
| if(offset == 0) |
| { |
| disp_hint_info(pos, "È¡Ïû°´¼ü¼ì²â",DELAY_TIME2s); |
| return; |
| } |
| if(keybuf[offset] == SP_KEY_CLEAR) |
| { |
| ++offset; |
| show_keyboard_test(pos, offset); |
| } |
| break; |
| case SP_KEY_ENTER: |
| if(keybuf[offset] == SP_KEY_ENTER) |
| { |
| disp_hint_info_two(pos, "¼üÅ̼ì²âÕýÈ·","¼üÅÌУ׼Õý³£",DELAY_TIME3s); |
| return; |
| } |
| break; |
| default: |
| break; |
| } |
| } |
| } |
| } |
| |
| static void sp_set_devtime(sp_pos_t* pos) |
| { |
| uint32 ticker; |
| uint8 kcode; |
| uint8 key_press = 1; |
| uint8 ctime[6]; |
| uint8 offset; |
| char str[13]; |
| char msg[17]; |
| |
| MEMCLEAR(str,sizeof str); |
| sp_get_bcdtime(ctime); |
| offset = 10; |
| sp_hex_to_str(ctime,5,str); |
| ticker = sp_get_ticker(); |
| while(sp_get_ticker() -ticker < DELAY_TIME60s) |
| { |
| sp_feed_dog(); |
| kcode = sp_get_key(); |
| if(kcode != SP_KEY_NONE) |
| { |
| key_press = 1; |
| switch(kcode) |
| { |
| case SP_KEY_0: |
| case SP_KEY_1: |
| case SP_KEY_2: |
| case SP_KEY_3: |
| case SP_KEY_4: |
| case SP_KEY_5: |
| case SP_KEY_6: |
| case SP_KEY_7: |
| case SP_KEY_8: |
| case SP_KEY_9: |
| if(offset < 10) |
| { |
| str[offset++] = '0' + (kcode- SP_KEY_0); |
| } |
| break; |
| case SP_KEY_ENTER: |
| if(offset >= 10) |
| { |
| MEMCLEAR(ctime,sizeof ctime); |
| sp_str_to_bcd(str,10,ctime); |
| if(sp_check_time_valid(ctime)) |
| { |
| disp_hint_info_two(pos,"ÉèÖÃʱ¼äʧ°Ü","ʱ¼ä²»ºÏ·¨", DELAY_TIME3s); |
| } |
| else |
| { |
| sp_set_bcdtime(ctime); |
| disp_hint_info_two(pos,"ÉèÖÃʱ¼ä³É¹¦"," ", DELAY_TIME2s); |
| return; |
| } |
| } |
| break; |
| case SP_KEY_CLEAR: |
| if(offset == 0) |
| { |
| return; |
| } |
| offset--; |
| str[offset] = 0; |
| break; |
| } |
| } |
| if(key_press) |
| { |
| sprintf(msg,"%s",str); |
| disp_hint_info_two(pos,"ÉèÖÃʱ¼ä(ymdHm)",msg,0); |
| ticker = sp_get_ticker(); |
| key_press = 0; |
| } |
| } |
| } |
| |
| static void sp_set_devphyid(sp_pos_t* pos) |
| { |
| uint32 ticker; |
| uint8 kcode; |
| uint16 ret = 0; |
| uint8 key_press = 1; |
| char msg[17]; |
| uint8 devphyid[4]; |
| uint8 offset; |
| char str[9]; |
| MEMCPY(devphyid,pos->devphyid,sizeof(pos->devphyid)); |
| MEMCLEAR(str,sizeof str); |
| |
| ticker = sp_get_ticker(); |
| offset = 8; |
| sp_hex_to_str(devphyid,4,str); |
| while(sp_get_ticker() -ticker < DELAY_TIME60s) |
| { |
| sp_feed_dog(); |
| kcode = sp_get_key(); |
| if(kcode != SP_KEY_NONE) |
| { |
| key_press = 1; |
| switch(kcode) |
| { |
| case SP_KEY_0: |
| case SP_KEY_1: |
| case SP_KEY_2: |
| case SP_KEY_3: |
| case SP_KEY_4: |
| case SP_KEY_5: |
| case SP_KEY_6: |
| case SP_KEY_7: |
| case SP_KEY_8: |
| case SP_KEY_9: |
| if(offset < 8) |
| { |
| str[offset++] = '0' +(kcode -SP_KEY_0); |
| } |
| break; |
| case SP_KEY_ENTER: |
| if(offset >= 8) |
| { |
| sp_str_to_hex(str,8,devphyid); |
| if(0 != MEMCMP(pos->devphyid,devphyid,4)) |
| { |
| ret = sp_save_devphyid(pos, devphyid); |
| } |
| if(!ret) |
| { |
| MEMCPY(pos->devphyid,devphyid,4); |
| sprintf(msg,"ID: %02x%02x%02x%02x",devphyid[0],devphyid[1],devphyid[2],devphyid[3]); |
| disp_hint_info_two(pos,"ÉèÖÃÎïÀíID³É¹¦",msg, DELAY_TIME2s); |
| } |
| else |
| { |
| show_error(pos,"±£´æÎïÀíIDʧ°Ü",ret); |
| } |
| return; |
| } |
| break; |
| case SP_KEY_CLEAR: |
| if(offset > 0) |
| { |
| offset--; |
| str[offset] = 0; |
| } |
| else |
| { |
| return; |
| } |
| break; |
| } |
| } |
| if(key_press) |
| { |
| sprintf(msg,"%s",str); |
| disp_hint_info_two(pos,"ÉèÖÃÎïÀíID:",msg,0); |
| ticker = sp_get_ticker(); |
| key_press = 0; |
| } |
| } |
| return; |
| } |
| static void sp_set_deviceno(sp_pos_t* pos) |
| { |
| uint32 ticker; |
| uint8 kcode; |
| uint16 ret = 0; |
| uint8 key_press = 1; |
| uint16 tempno; |
| uint8 deviceno = pos->deviceno; |
| char msg[17]; |
| char temp[17]; |
| ticker = sp_get_ticker(); |
| while(sp_get_ticker() -ticker < DELAY_TIME60s) |
| { |
| sp_feed_dog(); |
| kcode = sp_get_key(); |
| if(kcode != SP_KEY_NONE) |
| { |
| key_press = 1; |
| switch(kcode) |
| { |
| case SP_KEY_0: |
| case SP_KEY_1: |
| case SP_KEY_2: |
| case SP_KEY_3: |
| case SP_KEY_4: |
| case SP_KEY_5: |
| case SP_KEY_6: |
| case SP_KEY_7: |
| case SP_KEY_8: |
| case SP_KEY_9: |
| tempno = (uint16)deviceno; |
| tempno *=10; |
| tempno += (kcode-SP_KEY_0); |
| if(tempno > 0 && tempno < DEV_MAX_DEVICENO) |
| { |
| deviceno = (uint8)tempno; |
| } |
| break; |
| case SP_KEY_ENTER: |
| if(deviceno > 0 && deviceno <= DEV_MAX_DEVICENO) |
| { |
| if(pos->deviceno != deviceno) |
| { |
| ret = sp_save_deviceno(pos,deviceno); |
| } |
| if(!ret) |
| { |
| pos->deviceno = deviceno; |
| sprintf(msg,"»úºÅ: %d",deviceno); |
| disp_hint_info_two(pos,"ÉèÖûúºÅ³É¹¦",msg, DELAY_TIME2s); |
| } |
| else |
| { |
| show_error(pos,"±£´æ»úºÅʧ°Ü",ret); |
| } |
| return; |
| } |
| else |
| { |
| sprintf(msg,"·¶Î§(1-%d)",DEV_MAX_DEVICENO); |
| disp_hint_info_two(pos,"»úºÅ´íÎó",msg, DELAY_TIME3s); |
| } |
| case SP_KEY_CLEAR: |
| if(deviceno == 0) |
| { |
| return; |
| } |
| deviceno = 0; |
| break; |
| } |
| } |
| if(key_press) |
| { |
| sprintf(temp,"ÉèÖûúºÅ(1-%d)",DEV_MAX_DEVICENO); |
| sprintf(msg,"%d",deviceno); |
| disp_hint_info_two(pos,temp,msg,0); |
| ticker = sp_get_ticker(); |
| key_press = 0; |
| } |
| } |
| return; |
| } |
| |
| static void clear_transdtl(sp_pos_t* pos) |
| { |
| if(0 == sp_check_passwd(pos,"Çå¿ÕÁ÷Ë®ÃÜÂë:","\x9\x1\x4\x3\x8\x7")) |
| { |
| disp_hint_info_two(pos,"Çå¿ÕÁ÷Ë®","ÇëÉÔµÈ...",0); |
| sp_clear_transdtl(pos); |
| } |
| } |
| |
| static void manual_upgrade(sp_pos_t* pos) |
| { |
| if(0 == sp_check_passwd(pos, "ÔÚÏßÉý¼¶ÃÜÂë:","\x9\x1\x4\x3\x8\x7")) |
| { |
| sp_manual_upgrade(pos); |
| } |
| } |
| |
| static void reset_factory(sp_pos_t* pos) |
| { |
| if(0 == sp_check_passwd(pos, "»Ö¸´³ö³§ÃÜÂë:","\x9\x1\x4\x3\x8\x7")) |
| { |
| sp_reset_factory(pos); |
| } |
| } |
| |
| static void test_valve_on(sp_pos_t* pos) |
| { |
| sp_valve_on(); |
| disp_hint_info_two(pos,"·§ÃÅ¿ªÆôÖÐ","ÇëÈ·ÈÏ",DELAY_TIME2s); |
| } |
| |
| static void test_valve_off(sp_pos_t* pos) |
| { |
| sp_valve_off(); |
| disp_hint_info_two(pos,"·§ÃÅÒѹرÕ","ÇëÈ·ÈÏ",DELAY_TIME3s); |
| } |
| static void test_flowsensor(sp_pos_t* pos) |
| { |
| uint32 ticker; |
| uint8 kcode; |
| uint32 count; |
| uint32 temp; |
| char msg[32]; |
| |
| sp_flowsensor_count_clear(); |
| sp_valve_on(); |
| disp_hint_info_two(pos,"Á÷Á¿²âÊÔÖÐ","ÇëÈ·ÈÏ",0); |
| count = 0; |
| ticker = sp_get_ticker(); |
| while(sp_get_ticker() -ticker < DELAY_TIME60s) |
| { |
| sp_feed_dog(); |
| sp_valve_control(); |
| kcode = sp_get_key(); |
| if(kcode != SP_KEY_NONE) |
| { |
| if(kcode == SP_KEY_CLEAR) |
| { |
| sp_valve_off(); |
| return; |
| } |
| ticker = sp_get_ticker(); |
| } |
| temp = sp_flowsensor_get_count(); |
| if(temp != count) |
| { |
| count = temp; |
| sprintf(msg,"Á÷Á¿¼ÆÊý:%d",count); |
| disp_hint_info_two(pos,"Á÷Á¿²âÊÔÖÐ",msg,DELAY_TIME100ms); |
| } |
| } |
| sp_valve_off(); |
| sprintf(msg,"Á÷Á¿¼ÆÊý:%d",sp_flowsensor_get_count()); |
| disp_hint_info_two(pos,"Á÷Á¿²âÊÔ½áÊø",msg,DELAY_TIME3s); |
| } |
| |
| static void test_factory_options(sp_pos_t* pos) |
| { |
| uint32 ticker; |
| uint8 keycode; |
| uint8 page; |
| uint8 max_cnt; |
| uint8 key_press; |
| menu_t menus[] = |
| { |
| {"1.°´¼üУ׼", do_keyboard_calibrate}, |
| {"2.°´¼ü²âÊÔ", do_keyboard_test}, |
| {"3.¿ªÆô·§ÃÅ", test_valve_on}, |
| {"4.¹Ø±Õ·§ÃÅ", test_valve_off}, |
| {"5.Á÷Á¿²âÊÔ", test_flowsensor}, |
| {"6.ͨѶ²âÊÔ", test_link} |
| }; |
| max_cnt = (sizeof(menus)/sizeof(menu_t) -1)/3 + 1; |
| page = 0; |
| key_press = 1; |
| ticker = sp_get_ticker(); |
| while(sp_get_ticker()-ticker <= DELAY_TIME60s) |
| { |
| sp_feed_dog(); |
| keycode = sp_get_key(); |
| if(keycode != SP_KEY_NONE) |
| { |
| key_press = 1; |
| switch(keycode) |
| { |
| case SP_KEY_0: |
| if(page < (max_cnt-1)) |
| { |
| page++; |
| } |
| break; |
| case SP_KEY_1: |
| case SP_KEY_2: |
| case SP_KEY_3: |
| case SP_KEY_4: |
| case SP_KEY_5: |
| case SP_KEY_6: |
| case SP_KEY_7: |
| case SP_KEY_8: |
| case SP_KEY_9: |
| if(menus[keycode-SP_KEY_1].func != NULL) |
| { |
| menus[keycode-SP_KEY_1].func(pos); |
| key_press = 1; |
| } |
| break; |
| case SP_KEY_CLEAR: |
| if(page == 0) |
| { |
| return; |
| } |
| page--; |
| break; |
| default: |
| break; |
| } |
| } |
| if(key_press) |
| { |
| disp_hint_info_three(pos, menus[page*3].hit, menus[page*3+1].hit, menus[page*3+2].hit, 0); |
| key_press = 0; |
| ticker = sp_get_ticker(); |
| } |
| } |
| } |
| |
| void sp_menu_options(sp_pos_t* pos) |
| { |
| uint32 ticker; |
| uint8 keycode; |
| uint8 page; |
| uint8 max_cnt; |
| uint8 key_press; |
| |
| menu_t menus[] = |
| { |
| {"1.²é¿´²ÎÊý", sp_show_syspara}, |
| {"2.¹¤³§²âÊÔ", test_factory_options}, |
| {"3.ÉèÖÃʱ¼ä", sp_set_devtime}, |
| {"4.ÊÖ¶¯µÇ¼", sp_login}, |
| {"5.ÉèÖÃÎïÀíid", sp_set_devphyid}, |
| {"6.ÉèÖûúºÅ", sp_set_deviceno}, |
| {"7.Çå¿ÕÁ÷Ë®", clear_transdtl}, |
| {"8.ÔÚÏßÉý¼¶", manual_upgrade}, |
| {"9.»Ö¸´³ö³§", reset_factory} |
| }; |
| key_press = 1; |
| max_cnt = (sizeof(menus)/sizeof(menu_t) -1)/3 + 1; |
| page = 0; |
| ticker = sp_get_ticker(); |
| while(sp_get_ticker()-ticker <= DELAY_TIME60s) |
| { |
| sp_feed_dog(); |
| keycode = sp_get_key(); |
| if(keycode != SP_KEY_NONE) |
| { |
| key_press = 1; |
| switch(keycode) |
| { |
| case SP_KEY_0: |
| if(page < (max_cnt-1)) |
| { |
| page++; |
| } |
| break; |
| case SP_KEY_1: |
| case SP_KEY_2: |
| case SP_KEY_3: |
| case SP_KEY_4: |
| case SP_KEY_5: |
| case SP_KEY_6: |
| case SP_KEY_7: |
| case SP_KEY_8: |
| case SP_KEY_9: |
| if(menus[keycode-SP_KEY_1].func != NULL) |
| { |
| menus[keycode-SP_KEY_1].func(pos); |
| key_press = 1; |
| } |
| break; |
| case SP_KEY_CLEAR: |
| if(page == 0) |
| { |
| return; |
| } |
| page--; |
| break; |
| default: |
| break; |
| } |
| } |
| if(key_press) |
| { |
| disp_hint_info_three(pos, menus[page*3].hit, menus[page*3+1].hit, menus[page*3+2].hit, 0); |
| key_press = 0; |
| ticker = sp_get_ticker(); |
| } |
| } |
| } |
| |
| |