浏览代码

1、增加led和beep配置开关,默认关
2、根据规则修改led和beep报警参数
3、更新web,解决泄漏传感器没配置选项

guohui 1 年之前
父节点
当前提交
2301acd9c3

文件差异内容过多而无法显示
+ 1 - 1
cust_data/web/unique/css/chunk-58b4ce12.b5f5895d.css


文件差异内容过多而无法显示
+ 1 - 1
cust_data/web/unique/js/app.606ab11d.js


文件差异内容过多而无法显示
+ 0 - 1
cust_data/web/unique/js/chunk-58b4ce12.709de4bb.js


文件差异内容过多而无法显示
+ 1 - 0
cust_data/web/unique/js/chunk-e1cdaf06.8777f66d.js


+ 3 - 1
pro/src/common.h

@@ -373,7 +373,9 @@ typedef struct {
 
 typedef struct {
     int         watchdog;
-    int         flip_time;              //1:总检测 2:分监分控 3:分监不控
+    int         flip_time;
+    int         led;
+    int         beep;
 }MiscInfo_t;
 
 

+ 2 - 0
pro/src/dflt.c

@@ -67,6 +67,8 @@ GlobalDeviceInfo DFLT_PARAS={
         .misc = {
             .watchdog = 0,
             .flip_time = 5,
+            .led = 0,
+            .beep = 0,
         },
 };
 

+ 51 - 0
pro/src/paras.c

@@ -835,6 +835,16 @@ static int proc_misc(dictionary *dic, int op, MiscInfo_t *misc)
             LOGE("___ check misc, flip_time is invalid, must greater than 0\n");
             r = -1; 
         }
+
+        if(misc->led<0 || misc->led>1) {
+            LOGE("___ check misc, led is invalid, correct value is 0/1\n");
+            r = -1; 
+        }
+
+        if(misc->beep<0 || misc->beep>1) {
+            LOGE("___ check misc, beep is invalid, correct value is 0/1\n");
+            r = -1; 
+        }
     }
     else if (op==PARAS_CREATE) {
 
@@ -884,6 +894,44 @@ static int proc_misc(dictionary *dic, int op, MiscInfo_t *misc)
         }
     }
 
+    token = "misc:led";
+    if(op==PARAS_READ) {
+        r = iniparser_getint(dic, token, -1);
+        if(r==-1) {
+            LOGE("___ iniparser_getint %s failed\n", token);
+            return -1;
+        } else {
+            misc->led = r;
+        }
+    }
+    else {
+        sprintf(temp, "%d", misc->led);
+        r = iniparser_set(dic, token, temp);
+        if(r) {
+            LOGE("___ iniparser_set %s failed\n", token);
+            return -1;
+        }
+    }
+
+    token = "misc:beep";
+    if(op==PARAS_READ) {
+        r = iniparser_getint(dic, token, -1);
+        if(r==-1) {
+            LOGE("___ iniparser_getint %s failed\n", token);
+            return -1;
+        } else {
+            misc->beep = r;
+        }
+    }
+    else {
+        sprintf(temp, "%d", misc->beep);
+        r = iniparser_set(dic, token, temp);
+        if(r) {
+            LOGE("___ iniparser_set %s failed\n", token);
+            return -1;
+        }
+    }
+
     r = 0;
     if(op==PARAS_READ) {
         r = proc_misc(dic, PARAS_CHECK, misc);
@@ -3316,6 +3364,9 @@ static int ini_reset(paras_handle_t *h)
     fprintf(fp, "[misc]\n");
     fprintf(fp, "watchdog    = \"%d\"\n", info->misc.watchdog);
     fprintf(fp, "fliptime    = \"%d\"\n", info->misc.flip_time);
+    fprintf(fp, "led         = \"%d\"\n", info->misc.led);
+    fprintf(fp, "beep        = \"%d\"\n", info->misc.beep);
+
     fprintf(fp, "\n");
 
     fclose(fp);

+ 1 - 1
pro/src/sys.c

@@ -1534,7 +1534,7 @@ int sys_init(void)
     sys_chmod();
     init_hash_table();
     
-    ui_init();
+    //ui_init();
     net_init();
     thread_start(THREAD_ID_POLLING, polling_thread, NULL);
 

+ 17 - 1
pro/ui/beep.c

@@ -19,10 +19,19 @@
 #define BEEP_OFF_LEVEL          0
 
 static beep_para_t beep_para[BEEP_MODE_MAX]={
-    {1000, 1000, 5},        //BEEP_MODE_WARN
+#if 0
+    {1000, 1000, 5},        //BEEP_MODE_WARN1
+    {1000, 1000, 5},        //BEEP_MODE_WARN1
     {500,  500,  10},       //BEEP_MODE_ERROR
     {200,  200,  25},       //BEEP_MODE_FAULT
     {50,   50,   -1},       //BEEP_MODE_FATAL
+#else
+    {500, 500,   300},      //BEEP_MODE_WARN1
+    {333, 333,   450},      //BEEP_MODE_WARN2
+    {500,  500,  10},       //BEEP_MODE_ERROR
+    {200,  200,  25},       //BEEP_MODE_FAULT
+    {50,   50,   -1},       //BEEP_MODE_FATAL
+#endif
 };
 typedef struct {
     int             io;
@@ -125,5 +134,12 @@ int beep_set_ex(beep_para_t *para)
 }
 
 
+int beep_reset(void)
+{
+    beep_handle_t *h=&bpHandle;
 
+    timer_stop(h->tmr);
+    gpio_set(h->io, BEEP_OFF_LEVEL);
+    return 0;
+}
 

+ 3 - 2
pro/ui/beep.h

@@ -2,7 +2,8 @@
 #define __BEEP_Hx__
 
 enum {
-    BEEP_MODE_WARN=0,
+    BEEP_MODE_WARN1=0,
+    BEEP_MODE_WARN2,
     BEEP_MODE_ERROR,
     BEEP_MODE_FAULT,
     BEEP_MODE_FATAL,
@@ -20,5 +21,5 @@ int beep_init(void);
 int beep_deinit(void);
 int beep_set(int mode);
 int beep_set_ex(beep_para_t *para);
-
+int beep_reset(void);
 #endif

+ 26 - 8
pro/ui/led.c

@@ -38,13 +38,23 @@ typedef struct {
 }led_handle_t;
 
 static led_para_t led_para[LED_MODE_MAX]={
-    {LED_ID_GREEN,  1000,1000, -1, 0},      //LED_MODE_NORMAL
-    {LED_ID_GREEN,  300, 300,  -1, 0},      //LED_MODE_UPGRADING
-    {LED_ID_RED,    1000,1000, 5,  0},      //LED_MODE_WARN,
-    {LED_ID_RED,    500, 500,  10, 0},      //LED_MODE_ERROR,
-    {LED_ID_RED,    200, 200,  25, 0},      //LED_MODE_FAULT
-    {LED_ID_RED,    50,  50,   -1, 0},      //LED_MODE_FATAL
-
+#if 0
+    {LED_ID_GREEN,  1000,0,     -1,   0},     //LED_MODE_NORMAL
+    {LED_ID_GREEN,  300, 300,   -1,   0},     //LED_MODE_UPGRADING
+    {LED_ID_RED,    1000, 1000,  5,   0},     //LED_MODE_WARN1,
+    {LED_ID_RED,    1000, 1000,  10,  0},     //LED_MODE_WARN2,
+    {LED_ID_RED,    500, 500,    10,  0},     //LED_MODE_ERROR,
+    {LED_ID_RED,    200, 200,    25,  0},     //LED_MODE_FAULT
+    {LED_ID_RED,    50,  50,     -1,  0},     //LED_MODE_FATAL
+#else
+    {LED_ID_RED,   0,   1000, -1, 0},      //LED_MODE_NORMAL
+    {LED_ID_RED,   300, 1000,  -1, 0},      //LED_MODE_UPGRADING
+    {LED_ID_RED,   500, 500,  300,  0},    //LED_MODE_WARN1,
+    {LED_ID_RED,   333, 333,  450,  0},    //LED_MODE_WARN2,
+    {LED_ID_RED,   500, 500,  10, 0},      //LED_MODE_ERROR,
+    {LED_ID_RED,   200, 200,  25, 0},      //LED_MODE_FAULT
+    {LED_ID_RED,   50,  50,   -1, 0},      //LED_MODE_FATAL
+#endif
 };
 static led_handle_t ledHandle={0};
 
@@ -124,7 +134,6 @@ int led_set_ex(led_para_t *para)
     if(!para || (para->on_ms<=0 && para->off_ms<=0) || para->times==0) {
         return -1;
     }
-
     led_data_t *ld=&h->data[para->led_id];
     
     ld->cnt = 0;
@@ -153,4 +162,13 @@ int led_set_ex(led_para_t *para)
 }
 
 
+int led_reset(void)
+{
+    led_handle_t *h=&ledHandle;
+
+    timer_stop(h->tmr);
+    gpio_set(h->data[LED_ID_RED].io, led_info[LED_ID_RED].off_level);
+    return 0;
+}
+
 

+ 3 - 1
pro/ui/led.h

@@ -12,7 +12,8 @@ enum {
 enum {
     LED_MODE_NORMAL=0,
     LED_MODE_UPGRADING,
-    LED_MODE_WARN,
+    LED_MODE_WARN1,
+    LED_MODE_WARN2,
     LED_MODE_ERROR,
     LED_MODE_FAULT,
     LED_MODE_FATAL,
@@ -32,5 +33,6 @@ int led_init(void);
 int led_deinit(void);
 int led_set(int mode);
 int led_set_ex(led_para_t *para);
+int led_reset(void);
 
 #endif

+ 158 - 106
pro/ui/menu.c

@@ -62,6 +62,10 @@ typedef struct {
     int         tmr;
     int         lang;
 
+    int         ph_in;
+    int         ph_out;
+    int         ch_out;
+    int         ch_max;
     menu_data_t menu;
     
     uint64_t    ms;
@@ -83,49 +87,22 @@ static uint64_t get_ms(void)
     gettimeofday(&tv, NULL);
     return (uint64_t)(tv.tv_sec)*1000 + (uint64_t)(tv.tv_usec)/1000;
 }
-static void refresh_handler(void *arg, int last)
+static int get_ch_max(void)
 {
-    menu_handle_t *h=(menu_handle_t*)arg;
-    h->uflag |= UFLAG_TIMER;
+    int ch=0;
+    GlobalPowerManger *tmp;
+    GlobalDeviceManager *dm=get_dm();
     
-    if(last) {
-        timer_stop(h->tmr);
+    if(list_empty(&dm->_globalPowerManger.list)) {
+        return 0;
     }
-}
-static void tmr_start(menu_handle_t *h, int ms)
-{
-    if(h->tmr!=-1) {
-        timer_stop(h->tmr);
+    list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
+    {
+        ch++;
     }
-    timer_start(h->tmr, ms, -1, refresh_handler, h);
-}
-static void tmr_stop(menu_handle_t *h)
-{
-    timer_stop(h->tmr);
-    h->tmr = -1;
-}
-
-static void menu_system_paint(menu_handle_t *h, int font1, int font2, int item_h)
-{
-    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);
-
-    sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_VER), VERSION);
-    lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-
-    get_curtime_str2(time, sizeof(time));
-    sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_TIME), time);
-    lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-
-    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();
+    return ch;
 }
-
-static int is_pwrin_3(GlobalDeviceManager *dm)
+static int is_ph3_in(GlobalDeviceManager *dm)
 {
     if ((dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree ||
          dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One  ||
@@ -134,20 +111,19 @@ static int is_pwrin_3(GlobalDeviceManager *dm)
     }
     return 0;
 }
-static int is_pwrout_3(GlobalDeviceManager *dm)
+static int is_ph3_out(GlobalDeviceManager *dm)
 {
     if (dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree) {
         return 1;
     }
     return 0;
 }
-
 static int get_input(GlobalDeviceManager *dm, int ph, PowerInfo *info)
 {
     int i=0;
     GlobalTreeACManager *tmp3=NULL;
 
-    if (is_pwrin_3(dm)) {
+    if (is_ph3_in(dm)) {
         if(list_empty(&dm->_globalPowerManger.list_Tree_AC)) {
             return -1;
         }
@@ -166,7 +142,6 @@ static int get_input(GlobalDeviceManager *dm, int ph, PowerInfo *info)
     }
     return 0;
 }
-
 static int get_output(GlobalDeviceManager *dm, int ch, int ph, PowerInfo *info)
 {
     int i=0,j=0;
@@ -177,7 +152,7 @@ static int get_output(GlobalDeviceManager *dm, int ch, int ph, PowerInfo *info)
     {
         i++;
         if (i==ch) {
-            if (is_pwrout_3(dm)) {
+            if (is_ph3_out(dm)) {
                 list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC)
                 {
                     j++;
@@ -195,90 +170,150 @@ static int get_output(GlobalDeviceManager *dm, int ch, int ph, PowerInfo *info)
 
     return -1;
 }
-static void menu_input_paint(menu_handle_t *h, int font1, int font2, int item_h)
+static void refresh_handler(void *arg, int last)
 {
-    int r;
-    char tmp[100];
-    PowerInfo *pwr,info;
-    GlobalDeviceManager *dm=get_dm();
-
-    r = get_input(dm, 0, &info);
-    if(r) {
-        return;
+    menu_handle_t *h=(menu_handle_t*)arg;
+    h->uflag |= UFLAG_TIMER;
+    
+    if(last) {
+        timer_stop(h->tmr);
+    }
+}
+static void tmr_start(menu_handle_t *h, int ms)
+{
+    if(h->tmr!=-1) {
+        timer_stop(h->tmr);
     }
-    pwr = &info;
+    timer_start(h->tmr, ms, -1, refresh_handler, h);
+}
+static void tmr_stop(menu_handle_t *h)
+{
+    timer_stop(h->tmr);
+    h->tmr = -1;
+}
 
+static void menu_system_paint(menu_handle_t *h, int font1, int font2, int item_h)
+{
+    char time[60],tmp[100];
+            
     lcd_fill(0);
-    sprintf(tmp, "%s", lang_get_str(h->lang, STR_ID_INPUT));
+    sprintf(tmp, "SmartPDU");
     lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
 
-#ifdef TEXT_ALIGN
-    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_VOLTAGE), pwr->voltage);
-    lcd_draw_string(0, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
-    lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-
-    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), pwr->power);
-    lcd_draw_string(0, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
-    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.2f%s:%0.2f", lang_get_str(h->lang, STR_ID_VOLTAGE), pwr->voltage, lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
+    sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_VER), VERSION);
     lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
-    sprintf(tmp, "%s:%0.2f%s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), pwr->power, lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
+    get_curtime_str2(time, sizeof(time));
+    sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_TIME), time);
     lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-#endif
-    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), pwr->consumption);
-    lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
 
+    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_output_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)
 {
     int r;
     char tmp[100];
     PowerInfo *pwr,info;
     GlobalDeviceManager *dm=get_dm();
 
-    r = get_output(dm, 0, 0, &info);
-    if(r) {
-        return;
-    }
-    pwr = &info;
-
-    lcd_fill(0);
-    sprintf(tmp, "%s CH3", lang_get_str(h->lang, STR_ID_OUTPUT));
-    lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
-
-    char *pon=((pwr->status)?lang_get_str(h->lang, STR_ID_ON):lang_get_str(h->lang, STR_ID_OFF));
-#ifdef TEXT_ALIGN
-    sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_SWITCH), pon);
-    lcd_draw_string(0, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
-    lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    r = get_input(dm, h->ph_in, &info);
+    if(r==0) {
+        pwr = &info;
+        if(is_ph3_in(dm)) {
+            h->ph_in = (h->ph_in+1)%3;
+        }
 
-    sprintf(tmp, "%s:%0.2f ", lang_get_str(h->lang, STR_ID_POWER), pwr->power);
-    lcd_draw_string(0, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
-    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:%s %s:%0.2f", lang_get_str(h->lang, STR_ID_SWITCH), pon, lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
-    lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+        lcd_fill(0);
+        sprintf(tmp, "%s", lang_get_str(h->lang, STR_ID_INPUT));
+        lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
+
+    #ifdef TEXT_ALIGN
+        sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_VOLTAGE), pwr->voltage);
+        lcd_draw_string(0, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+        sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
+        lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+        sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), pwr->power);
+        lcd_draw_string(0, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+        sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
+        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.2f%s:%0.2f", lang_get_str(h->lang, STR_ID_VOLTAGE), pwr->voltage, lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
+        lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+        sprintf(tmp, "%s:%0.2f%s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), pwr->power, lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
+        lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    #endif
+        sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), pwr->consumption);
+        lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+        lcd_refresh();
+    }
+    else {
+        h->ph_in = 0;
+        if(h->menu.menu_lv==0 && h->uflag&UFLAG_FLIP) {
+            h->menu.menu_id++;
+        }
+    }
+}
+static void menu_output_paint(menu_handle_t *h, int font1, int font2, int item_h)
+{
+    int r;
+    char tmp[100];
+    PowerInfo *pwr,info;
+    GlobalDeviceManager *dm=get_dm();
 
-    sprintf(tmp, "%s:%0.2f%s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), pwr->power, lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
-    lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-#endif
-    sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), pwr->consumption);
-    lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    r = get_output(dm, h->ch_out, h->ph_out, &info);
+    if(r==0) {
+        pwr = &info;
+        h->ch_out = (h->ch_out+1)%h->ch_max;
+        if(is_ph3_out(dm)) {
+            h->ph_out = (h->ph_out+1)%3;
+        }
 
-    lcd_refresh();
+        lcd_fill(0);
+        sprintf(tmp, "%s CH3", lang_get_str(h->lang, STR_ID_OUTPUT));
+        lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
+
+        char *pon=((pwr->status)?lang_get_str(h->lang, STR_ID_ON):lang_get_str(h->lang, STR_ID_OFF));
+    #ifdef TEXT_ALIGN
+        sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_SWITCH), pon);
+        lcd_draw_string(0, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+        sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
+        lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+        sprintf(tmp, "%s:%0.2f ", lang_get_str(h->lang, STR_ID_POWER), pwr->power);
+        lcd_draw_string(0, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+        sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
+        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:%s %s:%0.2f", lang_get_str(h->lang, STR_ID_SWITCH), pon, lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
+        lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+        sprintf(tmp, "%s:%0.2f%s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), pwr->power, lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
+        lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    #endif
+        sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), pwr->consumption);
+        lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+        lcd_refresh();
+    }
+    else {
+        h->ch_out = 0;
+        if(h->menu.menu_lv==0 && h->uflag&UFLAG_FLIP) {
+            h->menu.menu_id++;
+        }
+    }
 }
 static void menu_sensor_paint(menu_handle_t *h, int font1, int font2, int item_h)
 {
     char tmp[100];
-    PowerInfo ttt;
-    PowerInfo *pwr=&ttt;
     GlobalDeviceManager *dm=get_dm();
 
     lcd_fill(0);
@@ -304,6 +339,10 @@ static void menu_sensor_paint(menu_handle_t *h, int font1, int font2, int item_h
 #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)
 {
@@ -377,7 +416,7 @@ static int menu_modbus_handle(menu_handle_t *h, ModbusInfo_t *pmb, key_val_t *kv
                 }
                 else {
                     h->menu.menu_lv = 2;
-                    tmr_start(h, 300);
+                    tmr_start(h, 500);
                 }
             }
             else {
@@ -475,6 +514,10 @@ 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;
+    }
 }
 /////////////////////////////////////////////////
 
@@ -490,6 +533,9 @@ int menu_init(void)
     h->uflag = 1;
     h->fliptime = get_dm()->_globalDevInfo.misc.flip_time*1000;
 
+    h->ph_in = 0;
+    h->ph_out = 0;
+    h->ch_out = 0;
     h->menu.menu_id = 0;
     h->menu.menu_lv = 0;
     for(i=0; i<MENU_MAX; i++) {
@@ -535,10 +581,10 @@ int menu_handle(void)
             if(kv.type==TYPE_SHORT) {
                 if(h->menu.menu_lv==0) {
                     if(lcd_get_angle()==ANGLE_0) {
-                        lcd_rotate(ANGLE_180);
+                        //lcd_rotate(ANGLE_180);
                     }
                     else {
-                        lcd_rotate(ANGLE_0);
+                        //lcd_rotate(ANGLE_0);
                     }
                 }
             }
@@ -555,6 +601,8 @@ int menu_handle(void)
 
         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--;
@@ -569,6 +617,7 @@ int menu_handle(void)
 
         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++;
@@ -588,6 +637,7 @@ int menu_handle(void)
                 if(h->menu.menu_lv==0) {
                     if((get_ms()-h->ms)>=h->fliptime) {
                         if(h->menu.menu_id<MENU_MAX-1) {
+                            if() {
                             h->menu.menu_id++;
                         }
                         else {
@@ -617,19 +667,21 @@ int menu_handle(void)
 
         case MENU_INPUT:
         {
-            //GlobalPowerInManger
+            h->menu.menu_id++;
             menu_input_paint(h, font1, font2, item_h);
         }
         break;
 
         case MENU_OUTPUT:
         {
+            h->menu.menu_id++;
             menu_output_paint(h, font1, font2, item_h);
         }
         break;
 
         case MENU_SENSOR:
         {
+            h->menu.menu_id++;
             menu_sensor_paint(h, font1, font2, item_h);
         }
         break;