guohui před 1 rokem
rodič
revize
725b3eee1a
3 změnil soubory, kde provedl 295 přidání a 216 odebrání
  1. 1 1
      pro/src/paras.c
  2. 1 1
      pro/src/sys.c
  3. 293 214
      pro/ui/menu.c

+ 1 - 1
pro/src/paras.c

@@ -232,7 +232,7 @@ static int proc_prod(dictionary *dic, int op, ProductInfo_t *prod)
             LOGE("___ check product.language %d is wrong\n", prod->language);
             r = -1;
         }
-        if(prod->type>=SmartPDU_Tree_AC_One_B) {
+        if(prod->type>SmartPDU_Tree_AC_One_B) {
             LOGE("___ check product.type %d is wrong\n", prod->type);
             r = -1;
         }

+ 1 - 1
pro/src/sys.c

@@ -1535,7 +1535,7 @@ int sys_init(void)
     init_hash_table();
     
     ui_init();
-    net_init();
+    //net_init();
     thread_start(THREAD_ID_POLLING, polling_thread, NULL);
 
     return 0;

+ 293 - 214
pro/ui/menu.c

@@ -71,6 +71,9 @@ typedef struct {
     uint64_t    ms;
     uint16_t    uflag;
     int         fliptime;
+
+    ModbusInfo_t mb;
+    GlobalDeviceManager *dm;
 }menu_handle_t;
 static int lang_id=LANG_ID_CHINESE;
 //static int lang_id=LANG_ID_ENGLISH;
@@ -87,52 +90,59 @@ static uint64_t get_ms(void)
     gettimeofday(&tv, NULL);
     return (uint64_t)(tv.tv_sec)*1000 + (uint64_t)(tv.tv_usec)/1000;
 }
-static int get_ch_out_max(void)
+static ModbusInfo_t*get_pmb(menu_handle_t *h)
+{
+    if(h->menu.menu_lv==0) {
+        return &h->dm->_globalDevInfo.cascade;
+    }
+    else {
+        return &h->mb;
+    }
+}
+
+static int get_ch_out_max(menu_handle_t *h)
 {
     int ch=0;
     GlobalPowerManger *tmp;
-    GlobalDeviceManager *dm=get_dm();
     
     if(!thread_is_running(THREAD_ID_POWER)) {
-        printf("777\n");
         return 0;
     }
-    if(list_empty(&dm->_globalPowerManger.list)) {
-        printf("8888\n");
+    if(list_empty(&h->dm->_globalPowerManger.list)) {
         return 0;
     }
-    list_for_each_entry(tmp, &dm->_globalPowerManger.list, list) {
+    list_for_each_entry(tmp, &h->dm->_globalPowerManger.list, list) {
         ch++;
     }
     return ch;
 }
-static int is_ph3_in(GlobalDeviceManager *dm)
+static int is_ph3_in(menu_handle_t *h)
 {
-    if ((dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree ||
-         dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One  ||
-         dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B)) {
+    if ((h->dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree ||
+         h->dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One  ||
+         h->dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B)) {
         return 1;
     }
     return 0;
 }
-static int is_ph3_out(GlobalDeviceManager *dm)
+static int is_ph3_out(menu_handle_t *h)
 {
-    if (dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree) {
+    if (h->dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree) {
         return 1;
     }
     return 0;
 }
-static int get_input(GlobalDeviceManager *dm, int ph, PowerInfo *info)
+static int get_input(menu_handle_t *h, int ph, PowerInfo *info)
 {
-    int i=-1;
+    int i=0;
     GlobalTreeACManager *tmp3=NULL;
 
-    if (is_ph3_in(dm)) {
-        if(list_empty(&dm->_globalPowerManger.list_Tree_AC)) {
+    if (is_ph3_in(h) && ph>0) {
+        if(list_empty(&h->dm->_globalPowerManger.list_Tree_AC)) {
             return -1;
         }
 
-        list_for_each_entry(tmp3, &dm->_globalPowerManger.list_Tree_AC, list_Tree_AC) {
+        list_for_each_entry(tmp3, &h->dm->_globalPowerManger.list_Tree_AC, list_Tree_AC) {
             i++;
             if (i==ph)
                 break;
@@ -142,21 +152,21 @@ static int get_input(GlobalDeviceManager *dm, int ph, PowerInfo *info)
         }
     }
     else {
-        *info = dm->_globalPowerManger._PowerInfo;
+        *info = h->dm->_globalPowerManger._PowerInfo;
     }
     return 0;
 }
-static int get_output(GlobalDeviceManager *dm, int ch, int ph, PowerInfo *info)
+static int get_output(menu_handle_t *h, int ch, int ph, PowerInfo *info)
 {
-    int i=-1,j=-1;
+    int i=-1,j=0;
     GlobalPowerManger *tmp;
     GlobalTreeACManager *tmp3 = NULL;
     
-    list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
+    list_for_each_entry(tmp, &h->dm->_globalPowerManger.list, list)
     {
         i++;
         if (i==ch) {
-            if (is_ph3_out(dm)) {
+            if (is_ph3_out(h) && ph>0) {
                 list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC)
                 {
                     j++;
@@ -196,10 +206,10 @@ static void tmr_stop(menu_handle_t *h)
     h->tmr = -1;
 }
 
-static void menu_system_paint(menu_handle_t *h, int font1, int font2, int item_h)
+static void menu_system_paint(menu_handle_t *h, int font1, int font2, int item_h, key_val_t *kv)
 {
     char time[60],tmp[100];
-            
+
     lcd_fill(0);
     sprintf(tmp, "SmartPDU");
     lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
@@ -214,28 +224,20 @@ static void menu_system_paint(menu_handle_t *h, int font1, int font2, int item_h
     sprintf(tmp, "IP:%s", getLocalIpAddress("eth0"));
     lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
     lcd_refresh();
-
-    if(h->menu.menu_lv==0 && h->uflag&UFLAG_FLIP) {
-        h->menu.menu_id++;
-    }
 }
-static void menu_input_paint(menu_handle_t *h, int font1, int font2, int item_h)
+static void menu_input_paint(menu_handle_t *h, int font1, int font2, int item_h, key_val_t *kv)
 {
     int r;
     char tmp[100];
-    
     PowerInfo *pwr,info={0};
-    GlobalDeviceManager *dm=get_dm();
-    int ph3_in=is_ph3_in(dm);
 
     pwr = &info;
     sprintf(tmp, "%s", lang_get_str(h->lang, STR_ID_INPUT));
 
-    r = get_input(dm, h->ph_in, &info);
+    r = get_input(h, h->ph_in, &info);
     if(r==0) {
-        if(ph3_in) {
-            h->ph_in++;
-            sprintf(tmp, "%s L%d", lang_get_str(h->lang, STR_ID_INPUT), h->ph_in);
+        if(h->menu.menu_lv==1 && h->ph_in>0) {
+            sprintf(tmp, "%s-L%d", lang_get_str(h->lang, STR_ID_INPUT), h->ph_in);
         }
     }
 
@@ -263,34 +265,20 @@ static void menu_input_paint(menu_handle_t *h, int font1, int font2, int item_h)
     lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
     lcd_refresh();
-
-    if(ph3_in) {
-        if(h->ph_in==3) {
-            h->ph_in = 0;
-            h->menu.menu_id++;
-        }
-    }
-    else {
-        h->menu.menu_id++;
-    }
+    
 }
-static void menu_output_paint(menu_handle_t *h, int font1, int font2, int item_h)
+static void menu_output_paint(menu_handle_t *h, int font1, int font2, int item_h, key_val_t *kv)
 {
     int r;
     char tmp[100];
     PowerInfo *pwr,info={0};
-    GlobalDeviceManager *dm=get_dm();
 
     pwr = &info;
-    h->ch_out_max = get_ch_out_max();
     sprintf(tmp, "%s", lang_get_str(h->lang, STR_ID_OUTPUT));
 
-    r = get_output(dm, h->ch_out, h->ph_out, &info);
-    if(r==0) {
-        h->ch_out++;
-        if(h->ch_out_max>0) {
-            sprintf(tmp, "%s CH%d", lang_get_str(h->lang, STR_ID_OUTPUT), h->ch_out+1);
-        }
+    r = get_output(h, h->ch_out, h->ph_out, &info);
+    if(r==0 && h->ch_out_max>0) {
+        sprintf(tmp, "%s CH%d", lang_get_str(h->lang, STR_ID_OUTPUT), h->ch_out+1);
     }
 
     lcd_fill(0);
@@ -318,16 +306,11 @@ static void menu_output_paint(menu_handle_t *h, int font1, int font2, int item_h
     lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
     lcd_refresh();
-
-    if(h->ch_out==h->ch_out_max) {
-        h->ch_out = 0;
-        h->menu.menu_id++;
-    }
+    
 }
-static void menu_sensor_paint(menu_handle_t *h, int font1, int font2, int item_h)
+static void menu_sensor_paint(menu_handle_t *h, int font1, int font2, int item_h, key_val_t *kv)
 {
     char tmp[100];
-    GlobalDeviceManager *dm=get_dm();
 
     lcd_fill(0);
     sprintf(tmp, "%s/%s", lang_get_str(h->lang, STR_ID_TEMP), lang_get_str(h->lang, STR_ID_HUMI));
@@ -344,131 +327,23 @@ static void menu_sensor_paint(menu_handle_t *h, int font1, int font2, int item_h
     sprintf(tmp, "%0.1f", dm->g_modebus_read.humidity/100.0f);
     lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 #else
-    sprintf(tmp, " %s: %0.1f", lang_get_str(h->lang, STR_ID_TEMP), dm->g_modebus_read.temprature/100.0f);
+    sprintf(tmp, " %s: %0.1f", lang_get_str(h->lang, STR_ID_TEMP), h->dm->g_modebus_read.temprature/100.0f);
     lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
-    sprintf(tmp, " %s: %0.1f", lang_get_str(h->lang, STR_ID_HUMI), dm->g_modebus_read.humidity/100.0f);
+    sprintf(tmp, " %s: %0.1f", lang_get_str(h->lang, STR_ID_HUMI), h->dm->g_modebus_read.humidity/100.0f);
     lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 #endif
 
     lcd_refresh();
-
-    if(h->menu.menu_lv==0 && h->uflag&UFLAG_FLIP) {
-        h->menu.menu_id++;
-    }
-}
-static int menu_modbus_handle(menu_handle_t *h, ModbusInfo_t *pmb, key_val_t *kv)
-{
-    int r=-1;
-    
-    switch(kv->key) {
-        case KEY_UP:
-        {
-            if(h->menu.menu_lv==1) {
-                if(h->menu.page[h->menu.menu_id].item_id>0) {
-                    h->menu.page[h->menu.menu_id].item_id--;
-                }
-                else {
-                    h->menu.page[h->menu.menu_id].item_id = MODBUS_ITEM_QUIT;
-                }
-            }
-            else if(h->menu.menu_lv==2) {
-                if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_ADDR) {         //addr
-                    if(pmb->addr<CASCADE_MAX) {
-                        pmb->addr++;
-                    }
-                    else {
-                        pmb->addr = 1;
-                    }
-                }
-                else if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_MODE) {    //mode
-                    pmb->mode = !pmb->mode;
-                }
-            }
-        }
-        break;
-
-        case KEY_DOWN:
-        {
-            if(h->menu.menu_lv==1) {
-                if(h->menu.page[h->menu.menu_id].item_id<MODBUS_ITEM_QUIT) {
-                    h->menu.page[h->menu.menu_id].item_id++;
-                }
-                else {
-                    h->menu.page[h->menu.menu_id].item_id = 0;
-                }
-            }
-            else if(h->menu.menu_lv==2) {
-                if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_ADDR) {         //addr
-                    if(pmb->addr) {
-                        pmb->addr--;
-                    }
-                    else {
-                        pmb->addr = CASCADE_MAX;
-                    }
-                }
-                else if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_MODE) {    //mode
-                    pmb->mode = !pmb->mode;
-                }
-            }
-        }
-        break;
-
-        case KEY_OK:
-        {
-            if(h->menu.menu_lv==1) {
-                if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_SAVE || h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_QUIT) {         //save
-                    if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_SAVE) {
-                        r = cascade_set_modbus(pmb);
-                        if(r==0) {
-                            r = paras_save();
-                        }
-                    }
-                    h->menu.page[h->menu.menu_id].item_id = 0;
-                    h->menu.menu_lv = 0;
-                    tmr_stop(h);
-                }
-                else {
-                    h->menu.menu_lv = 2;
-                    tmr_start(h, 500);
-                }
-            }
-            else if(h->menu.menu_lv==2) {
-                h->menu.menu_lv = 1;
-            }
-            else {
-                if(kv->type==TYPE_LONG) {
-                    h->menu.menu_lv = 1;
-                }
-            }
-        }
-        break;
-    }
     
-    return r;
 }
 static void menu_modbus_paint(menu_handle_t *h, int font1, int font2, int item_h, key_val_t *kv)
 {
     int r,font_color;
     char tmp[100];
+    ModbusInfo_t *pmb=get_pmb(h);
     static uint8_t flash_cnt=0;
     
-    GlobalDeviceManager *dm=get_dm();
-    static ModbusInfo_t *pmb,mb_cas;
-    GlobalDeviceInfo *dev=&dm->_globalDevInfo;
-
-    if(h->menu.menu_lv) {
-        pmb = &mb_cas;
-    }
-    else {
-        mb_cas = dev->cascade;
-        pmb = &dev->cascade;
-    }
-    r = menu_modbus_handle(h, pmb, kv);
-    if(r==0) {
-        dev->cascade = mb_cas;
-    }
-    
     if(kv->key==-1) {
         flash_cnt++;
     }
@@ -531,10 +406,6 @@ static void menu_modbus_paint(menu_handle_t *h, int font1, int font2, int item_h
     lcd_draw_string(LCD_WIDTH/2, item_h*3, LCD_WIDTH/2, item_h, tmp, font2, font_color, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
 
     lcd_refresh();
-
-    if(h->menu.menu_lv==0 && h->uflag&UFLAG_FLIP) {
-        h->menu.menu_id = MENU_SYSTEM;
-    }
 }
 /////////////////////////////////////////////////
 
@@ -549,8 +420,9 @@ int menu_init(void)
     h->tmr = timer_init();
     h->ms = get_ms();
     h->uflag = 1;
+    h->dm = get_dm();
     h->fliptime = misc->flip_time*1000;
-
+    
     h->ph_in = 0;
     h->ph_out = 0;
     h->ch_out = 0;
@@ -598,6 +470,240 @@ static void key_remap(key_val_t *kv, int rotate)
         }
     }
 }
+static int menu_modbus_key_handle(menu_handle_t *h, key_val_t *kv)
+{
+    int r=-1;
+    
+    if(h->menu.menu_lv==0) {
+        h->mb = h->dm->_globalDevInfo.cascade;
+    }
+
+    switch(kv->key) {
+        case KEY_UP:
+        {
+            if(h->menu.menu_lv==0) {
+                if(kv->type==TYPE_SHORT) {
+                    h->menu.menu_id--;
+                }
+            }
+            else if(h->menu.menu_lv==1) {
+                if(h->menu.page[h->menu.menu_id].item_id>0) {
+                    h->menu.page[h->menu.menu_id].item_id--;
+                }
+                else {
+                    h->menu.page[h->menu.menu_id].item_id = MODBUS_ITEM_QUIT;
+                }
+            }
+            else if(h->menu.menu_lv==2) {
+                ModbusInfo_t *pmb=&h->mb;
+                if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_ADDR) {         //addr
+                    if(pmb->addr<CASCADE_MAX) {
+                        pmb->addr++;
+                    }
+                    else {
+                        pmb->addr = 1;
+                    }
+                }
+                else if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_MODE) {    //mode
+                    pmb->mode = !pmb->mode;
+                }
+            }
+        }
+        break;
+
+        case KEY_DOWN:
+        {
+            if(h->menu.menu_lv==0) {
+                if(kv->type==TYPE_SHORT) {
+                    h->menu.menu_id = MENU_SYSTEM;
+                }
+            }
+            else if(h->menu.menu_lv==1) {
+                if(h->menu.page[h->menu.menu_id].item_id<MODBUS_ITEM_QUIT) {
+                    h->menu.page[h->menu.menu_id].item_id++;
+                }
+                else {
+                    h->menu.page[h->menu.menu_id].item_id = 0;
+                }
+            }
+            else if(h->menu.menu_lv==2) {
+                ModbusInfo_t *pmb=&h->mb;
+                if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_ADDR) {         //addr
+                    if(pmb->addr) {
+                        pmb->addr--;
+                    }
+                    else {
+                        pmb->addr = CASCADE_MAX;
+                    }
+                }
+                else if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_MODE) {    //mode
+                    pmb->mode = !pmb->mode;
+                }
+            }
+        }
+        break;
+
+        case KEY_OK:
+        {
+            if(h->menu.menu_lv==1) {
+                if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_SAVE || h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_QUIT) {         //save
+                    if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_SAVE) {
+                        r = cascade_set_modbus(&h->mb);
+                        if(r==0) {
+                            h->dm->_globalDevInfo.cascade = h->mb;
+                            r = paras_save();
+                        }
+
+                    }
+                    h->menu.page[h->menu.menu_id].item_id = 0;
+                    h->menu.menu_lv = 0;
+                    tmr_stop(h);
+                }
+                else {
+                    h->menu.menu_lv = 2;
+                    tmr_start(h, 500);
+                }
+            }
+            else if(h->menu.menu_lv==2 && kv->type==TYPE_SHORT) {
+                h->menu.menu_lv = 1;
+            }
+            else {
+                if(kv->type==TYPE_LONG) {
+                    h->menu.menu_lv = 1;
+                }
+            }
+        }
+        break;
+
+        default:
+        {
+            if(h->menu.menu_lv==0 && h->uflag&UFLAG_FLIP) {
+                h->menu.menu_id = MENU_SYSTEM;
+            }
+        }
+    }
+    
+    return r;
+}
+static int menu_key_handle(menu_handle_t *h, key_val_t *kv)
+{
+    int r=0;
+
+    h->ch_out_max = get_ch_out_max(h);
+    switch(h->menu.menu_id) {
+        case MENU_SYSTEM:
+        case MENU_SENSOR:
+        {
+            if(h->menu.menu_lv==0) {
+                if(h->uflag&UFLAG_FLIP || ((kv->key==KEY_UP || kv->key==KEY_DOWN) && kv->type==TYPE_SHORT)) {
+                    if(kv->key==KEY_UP) {
+                        h->menu.menu_id = h->menu.menu_id?(h->menu.menu_id-1):MENU_MAX-1;
+                    }
+                    else {
+                        h->menu.menu_id = (h->menu.menu_id==MENU_MAX-1)?0:(h->menu.menu_id+1);
+                    }
+                }
+            }
+        }
+        break;
+
+        case MENU_INPUT:
+        {
+            if(h->menu.menu_lv==0) {
+                if((kv->key==KEY_UP || kv->key==KEY_DOWN) && kv->type==TYPE_SHORT) {
+                    if(kv->key==KEY_UP) {
+                        h->menu.menu_id--;
+                    }
+                    else {
+                        h->menu.menu_id++;
+                    }
+                }
+                else if(kv->key==KEY_OK && kv->type==TYPE_SHORT) {
+                    if(is_ph3_in(h)) {
+                        h->ph_in = 1;
+                        h->menu.menu_lv = 1;
+                    }
+                }
+                else if(h->uflag&UFLAG_FLIP) {
+                    if(is_ph3_in(h)) {
+                        h->ph_in = 1;
+                        h->menu.menu_lv = 1;
+                    }
+                }
+            }
+            else if(h->menu.menu_lv==1) {
+                if((kv->key==KEY_UP || kv->key==KEY_DOWN) && kv->type==TYPE_SHORT) {
+                    if(kv->key==KEY_UP) {
+                        if(h->ph_in>1) {
+                            h->ph_in--;
+                        }
+                        else {
+                            h->ph_in = 3;
+                        }
+                    }
+                    else {
+                        if(h->ph_in<3) {
+                            h->ph_in++;
+                        }
+                        else {
+                            h->ph_in = 1;
+                        }
+                    }
+                }
+                else if(h->uflag&UFLAG_FLIP) {
+                    if(h->ph_in<3) {
+                        h->ph_in++;
+                    }
+                    else {
+                        h->ph_in = 0;
+                        h->menu.menu_lv = 0;
+                        h->menu.menu_id++;
+                    }
+                }
+                else {
+                    h->ph_in = 0;
+                    h->menu.menu_lv = 0;
+                }
+            }
+        }
+        break;
+
+        case MENU_OUTPUT:
+        {
+            if(h->uflag&UFLAG_FLIP || ((kv->key==KEY_UP || kv->key==KEY_DOWN) && kv->type==TYPE_SHORT)) {
+                if(kv->key==KEY_UP) {
+                    if(h->ch_out>0) {
+                        h->ch_out--;
+                    }
+                    else {
+                        h->ch_out = 0;
+                        h->menu.menu_id--;
+                    }
+                }
+                else {
+                    if(h->ch_out<h->ch_out_max-1) {
+                        h->ch_out++;
+                    }
+                    else {
+                        h->ch_out = 0;
+                        h->menu.menu_id++;
+                    }
+                }
+            }
+        }
+        break;
+
+        case MENU_MODBUS:
+        {
+            r = menu_modbus_key_handle(h, kv);
+        }
+        break;
+    }
+
+    return r;
+}
+
+
 int menu_handle(void)
 {
     int r;
@@ -623,37 +729,13 @@ int menu_handle(void)
             #endif
                 }
             }
-            h->uflag |= UFLAG_KEY;
         }
         break;
 
         case KEY_UP:
-        {
-            led_reset(); beep_reset();
-            if(h->menu.menu_lv==0 && kv.type==TYPE_SHORT) {
-                if(h->menu.menu_id>0) {
-                    h->menu.menu_id--;
-                }
-                else {
-                    h->menu.menu_id = MENU_MAX-1;
-                }
-            }
-            h->uflag |= UFLAG_KEY;
-        }
-        break;
-
         case KEY_DOWN:
         {
             led_reset(); beep_reset();
-            if(h->menu.menu_lv==0 && kv.type==TYPE_SHORT) {
-                if(h->menu.menu_id<MENU_MAX-1) {
-                    h->menu.menu_id++;
-                }
-                else {
-                    h->menu.menu_id = 0;
-                }
-            }
-            h->uflag |= UFLAG_KEY;
         }
         break;
 
@@ -661,45 +743,41 @@ int menu_handle(void)
         {
 #if 1
             if(h->fliptime>0) {
-                if(h->menu.menu_lv==0) {
-                    if((get_ms()-h->ms)>=h->fliptime) {
-                        h->uflag = UFLAG_FLIP;
-                        h->ms = get_ms();
-                    }
-                }
-                else {
+                if((get_ms()-h->ms)>=h->fliptime) {
+                    h->uflag |= UFLAG_FLIP;
                     h->ms = get_ms();
                 }
             }
 #endif
         }
     }
-    if(h->uflag==0) {
+    if(h->uflag==0 && kv.key<0) {
         return -1;
     }
 
+    menu_key_handle(h, &kv);
     switch(h->menu.menu_id) {
         case MENU_SYSTEM:
         {
-            menu_system_paint(h, font1, font2, item_h);
+            menu_system_paint(h, font1, font2, item_h, &kv);
         }
         break;
 
         case MENU_INPUT:
         {
-            menu_input_paint(h, font1, font2, item_h);
+            menu_input_paint(h, font1, font2, item_h, &kv);
         }
         break;
 
         case MENU_OUTPUT:
         {
-            menu_output_paint(h, font1, font2, item_h);
+            menu_output_paint(h, font1, font2, item_h, &kv);
         }
         break;
 
         case MENU_SENSOR:
         {
-            menu_sensor_paint(h, font1, font2, item_h);
+            menu_sensor_paint(h, font1, font2, item_h, &kv);
         }
         break;
 
@@ -710,6 +788,7 @@ int menu_handle(void)
         break;
     }
     h->uflag = 0;
+    printf("___ menu_id: %d, menu_lv: %d\n", h->menu.menu_id, h->menu.menu_lv);
     
     return 0;
 }