blob: 88dea9b91706072e60ac7489c6ee5104985215c8 [file] [log] [blame]
#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)
{
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)
{
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_manual_login(sp_pos_t* pos)
{
uint16 ret;
uint32 tick;
sp_protocol_response_t resp;
MEMCLEAR(&resp, sizeof(resp));
disp_hint_info_two(pos,"ÕýÔڵǼ","ÇëÉÔµÈ...",0);
sp_async_equipment_login(pos);
tick = sp_get_ticker();
while(sp_get_ticker() - tick < DELAY_TIME3s*2)
{
MEMCLEAR(&resp, sizeof(resp));
usart_read((u8*)&resp, sizeof(resp));
if(resp.excmd == SP_CMD_LOGIN)
{
ret = sp_confirm_login(&resp, pos);
break;
}
else
{
ret = RC_DEV_LOGIN_FAIL;
}
}
if(ret)
{
char msg[32];
sprintf(msg,"´íÎóÂë=%d",ret);
disp_hint_info_two(pos,"Ç©µ½Ê§°Ü",msg,DELAY_TIME3s);
}
else
{
disp_hint_info(pos,"Ç©µ½³É¹¦",DELAY_TIME3s);
}
}
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)
{
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)
{
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_valve_control();
kcode = sp_get_key();
if(kcode != SP_KEY_NONE)
{
if(kcode == SP_KEY_CLEAR)
{
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);
}
}
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 = 0;
uint8 keycode;
uint8 page;
uint8 max_cnt;
uint8 key_press = 1;
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;
ticker = sp_get_ticker();
while(sp_get_ticker()-ticker <= DELAY_TIME60s*5)
{
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);
}
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 = 0;
uint8 keycode;
uint8 page;
uint8 max_cnt;
uint8 key_press = 1;
menu_t menus[] =
{
{"1.²é¿´²ÎÊý", sp_show_syspara},
{"2.¹¤³§²âÊÔ", test_factory_options},
{"3.ÉèÖÃʱ¼ä", sp_set_devtime},
{"4.ÊÖ¶¯µÇ¼", sp_manual_login},
{"5.ÉèÖÃÎïÀíid", sp_set_devphyid},
{"6.ÉèÖûúºÅ", sp_set_deviceno},
{"7.Çå¿ÕÁ÷Ë®", clear_transdtl},
{"8.ÔÚÏßÉý¼¶", manual_upgrade},
{"9.»Ö¸´³ö³§", reset_factory}
};
max_cnt = (sizeof(menus)/sizeof(menu_t) -1)/3 + 1;
page = 0;
ticker = sp_get_ticker();
while(sp_get_ticker()-ticker <= DELAY_TIME60s*5)
{
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);
}
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();
}
}
}