blob: 4447d52b2f0d20404eccb9b44f44711dde783d3e [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[9][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++], "¼ÇÕËÏû·Ñ");
max_cnt = sizeof(syspara)/sizeof(syspara[0])/2;
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 uint8 sp_link_test(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)
{
if(sp_check_time_valid(resp.data +2))
{
disp_hint_info_two(pos, "Á´Â·¼ì²â³É¹¦","ʱÖÓ²»ºÏ·¨", DELAY_TIME3s);
return ret;
}
sp_set_bcdtime(resp.data +2);
disp_hint_info_two(pos, "Á´Â·¼ì²â³É¹¦","ÒÑͬ²½Ê±ÖÓ", DELAY_TIME3s);
return ret;
}
disp_hint_info_two(pos, "Á´Â·¼ì²âʧ°Ü","ÊÕµ½´íÎó°ü", DELAY_TIME3s);
return 1;
}
disp_hint_info_two(pos, "Á´Â·¼ì²âʧ°Ü","Çë¼ì²âÏß·", DELAY_TIME3s);
return ret;
}
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 uint8 sp_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 1;
}
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 0;
}
break;
default:
break;
}
}
}
return 1;
}
static void sp_factory_check(sp_pos_t* pos)
{
sp_link_test(pos);
sp_keyboard_test(pos);
}
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);
}
}
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.¹¤³§²âÊÔ", sp_factory_check},
{"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)/3;
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();
}
}
}