guohui преди 1 година
родител
ревизия
d889d53725
променени са 20 файла, в които са добавени 1152 реда и са изтрити 339 реда
  1. 5 0
      pro/CMakeLists.txt
  2. 7 0
      pro/src/common.c
  3. 1 0
      pro/src/common.h
  4. 9 10
      pro/ui/beep.c
  5. 245 206
      pro/ui/font.c
  6. 1 0
      pro/ui/font.h
  7. 59 8
      pro/ui/gpio.c
  8. 5 1
      pro/ui/gpio.h
  9. 107 40
      pro/ui/key.c
  10. 13 8
      pro/ui/key.h
  11. 74 0
      pro/ui/lang.c
  12. 34 0
      pro/ui/lang.h
  13. 71 25
      pro/ui/lcd.c
  14. 1 0
      pro/ui/lcd.h
  15. 15 0
      pro/ui/led.c
  16. 382 0
      pro/ui/menu.c
  17. 11 0
      pro/ui/menu.h
  18. 89 0
      pro/ui/timer.c
  19. 15 0
      pro/ui/timer.h
  20. 8 41
      pro/ui/ui.c

+ 5 - 0
pro/CMakeLists.txt

@@ -70,7 +70,12 @@ set(PDU_SRC_LIST
     ${PROJECT_SOURCE_DIR}/qrcode/qrc.c
     
     ${PROJECT_SOURCE_DIR}/ui/font.c
+	${PROJECT_SOURCE_DIR}/ui/lang.c
 	${PROJECT_SOURCE_DIR}/ui/gpio.c
+	${PROJECT_SOURCE_DIR}/ui/beep.c
+	${PROJECT_SOURCE_DIR}/ui/menu.c
+	${PROJECT_SOURCE_DIR}/ui/timer.c
+	${PROJECT_SOURCE_DIR}/ui/key.c
     ${PROJECT_SOURCE_DIR}/ui/lcd.c
     ${PROJECT_SOURCE_DIR}/ui/ui.c
 

+ 7 - 0
pro/src/common.c

@@ -558,6 +558,13 @@ int get_curtime_str(char *s, int len)
     struct tm *tm=localtime(&t);
     return snprintf(s, len, "%04d-%02d-%02d %02d:%02d:%02d", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
 }
+int get_curtime_str2(char *s, int len)
+{
+    time_t t=time(NULL);
+    struct tm *tm=localtime(&t);
+    return snprintf(s, len, "%02d%02d%02d %02d:%02d:%02d", (tm->tm_year+1900)%100,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
+}
+
 
 char* getUserNamebyToken(char* Token)
 {

+ 1 - 0
pro/src/common.h

@@ -1234,6 +1234,7 @@ time_t mktime2(struct tm *t, int zone);
 int get_time_str(char *s, int len, time_t t);
 int get_time_str2(char *s, int len, time_t t);
 int get_curtime_str(char *s, int len);
+int get_curtime_str2(char *s, int len);
 int get_bldtime(char *buf, int len);
 int get_bldtime2(char *dst, char *ori);
 void print_time(char *s, struct tm *tm);

+ 9 - 10
pro/ui/beep.c

@@ -1,6 +1,6 @@
 #include "gpio.h"
 #include "elog.h"
-#include "common.h"
+#include "beep.h"
 
 #if 1
     #define LOGD  log_d
@@ -13,36 +13,35 @@
 #define BEEP_LEVEL          0
 
 static beep_para_t beep_para[BEEP_MODE_MAX]={
-    {},
-    {},
-    {},
-    {},
-    {},
+    //{},
+    //{},
+    //{},
+    //{},
 };
 
 
 
 int beep_init(void)
 {
-    
+    return 0;
 }
 
 
 int beep_start(int mode)
 {
-    
+    return 0;
 }
 
 
 int beep_start_ex(beep_para_t *para)
 {
-    
+    return 0;
 }
 
 
 int beep_stop(void)
 {
-    
+    return 0;
 }
 
 

+ 245 - 206
pro/ui/font.c

@@ -3,7 +3,7 @@
 
 //Arial Helvetica  Verdana
 
-static const uint8_t font_0806[95][6] =
+static const uint8_t font_en_0806[95][6] =
 {
 {0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
 {0x00,0x00,0x00,0x2f,0x00,0x00},/*"!",1*/
@@ -101,203 +101,203 @@ static const uint8_t font_0806[95][6] =
 {0x82,0x82,0xEE,0x10,0x00,0x00},/*"}",93*/
 {0x10,0x08,0x08,0x10,0x18,0x00},/*"~",94*/
 };
-static const uint8_t font_1206[95][12] =
+static const uint8_t font_en_1206[95][12] =
 {
 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
-{0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*"!",1*/
-{0x00,0x0C,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
-{0x90,0xD0,0xBC,0xD0,0xBC,0x90,0x00,0x03,0x00,0x03,0x00,0x00},/*"#",3*/
-{0x18,0x24,0xFE,0x44,0x8C,0x00,0x03,0x02,0x07,0x02,0x01,0x00},/*"$",4*/
-{0x18,0x24,0xD8,0xB0,0x4C,0x80,0x00,0x03,0x00,0x01,0x02,0x01},/*"%",5*/
-{0xC0,0x38,0xE4,0x38,0xE0,0x00,0x01,0x02,0x02,0x01,0x02,0x02},/*"&",6*/
-{0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
-{0x00,0x00,0x00,0xF8,0x04,0x02,0x00,0x00,0x00,0x01,0x02,0x04},/*"(",8*/
-{0x00,0x02,0x04,0xF8,0x00,0x00,0x00,0x04,0x02,0x01,0x00,0x00},/*")",9*/
-{0x90,0x60,0xF8,0x60,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x00},/*"*",10*/
-{0x20,0x20,0xFC,0x20,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00},/*"+",11*/
-{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x00,0x00},/*",",12*/
-{0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
-{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00},/*".",14*/
-{0x00,0x80,0x60,0x1C,0x02,0x00,0x04,0x03,0x00,0x00,0x00,0x00},/*"/",15*/
-{0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"0",16*/
-{0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"1",17*/
-{0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00},/*"2",18*/
-{0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"3",19*/
-{0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00},/*"4",20*/
-{0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"5",21*/
-{0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"6",22*/
-{0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00},/*"7",23*/
-{0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"8",24*/
-{0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00},/*"9",25*/
-{0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*":",26*/
-{0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00},/*";",27*/
-{0x00,0x20,0x50,0x88,0x04,0x02,0x00,0x00,0x00,0x00,0x01,0x02},/*"<",28*/
-{0x90,0x90,0x90,0x90,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
-{0x00,0x02,0x04,0x88,0x50,0x20,0x00,0x02,0x01,0x00,0x00,0x00},/*">",30*/
-{0x18,0x04,0xC4,0x24,0x18,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*"?",31*/
-{0xF8,0x04,0xE4,0x94,0xF8,0x00,0x01,0x02,0x02,0x02,0x02,0x00},/*"@",32*/
-{0x00,0xE0,0x9C,0xF0,0x80,0x00,0x02,0x03,0x00,0x00,0x03,0x02},/*"A",33*/
-{0x04,0xFC,0x24,0x24,0xD8,0x00,0x02,0x03,0x02,0x02,0x01,0x00},/*"B",34*/
-{0xF8,0x04,0x04,0x04,0x0C,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"C",35*/
-{0x04,0xFC,0x04,0x04,0xF8,0x00,0x02,0x03,0x02,0x02,0x01,0x00},/*"D",36*/
-{0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x02,0x03,0x00},/*"E",37*/
-{0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x00,0x00,0x00},/*"F",38*/
-{0xF0,0x08,0x04,0x44,0xCC,0x40,0x00,0x01,0x02,0x02,0x01,0x00},/*"G",39*/
-{0x04,0xFC,0x20,0x20,0xFC,0x04,0x02,0x03,0x00,0x00,0x03,0x02},/*"H",40*/
-{0x04,0x04,0xFC,0x04,0x04,0x00,0x02,0x02,0x03,0x02,0x02,0x00},/*"I",41*/
-{0x00,0x04,0x04,0xFC,0x04,0x04,0x06,0x04,0x04,0x03,0x00,0x00},/*"J",42*/
-{0x04,0xFC,0x24,0xD0,0x0C,0x04,0x02,0x03,0x02,0x00,0x03,0x02},/*"K",43*/
-{0x04,0xFC,0x04,0x00,0x00,0x00,0x02,0x03,0x02,0x02,0x02,0x03},/*"L",44*/
-{0xFC,0x3C,0xC0,0x3C,0xFC,0x00,0x03,0x00,0x03,0x00,0x03,0x00},/*"M",45*/
-{0x04,0xFC,0x30,0xC4,0xFC,0x04,0x02,0x03,0x02,0x00,0x03,0x00},/*"N",46*/
-{0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"O",47*/
-{0x04,0xFC,0x24,0x24,0x18,0x00,0x02,0x03,0x02,0x00,0x00,0x00},/*"P",48*/
-{0xF8,0x84,0x84,0x04,0xF8,0x00,0x01,0x02,0x02,0x07,0x05,0x00},/*"Q",49*/
-{0x04,0xFC,0x24,0x64,0x98,0x00,0x02,0x03,0x02,0x00,0x03,0x02},/*"R",50*/
-{0x18,0x24,0x24,0x44,0x8C,0x00,0x03,0x02,0x02,0x02,0x01,0x00},/*"S",51*/
-{0x0C,0x04,0xFC,0x04,0x0C,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"T",52*/
-{0x04,0xFC,0x00,0x00,0xFC,0x04,0x00,0x01,0x02,0x02,0x01,0x00},/*"U",53*/
-{0x04,0x7C,0x80,0xE0,0x1C,0x04,0x00,0x00,0x03,0x00,0x00,0x00},/*"V",54*/
-{0x1C,0xE0,0x3C,0xE0,0x1C,0x00,0x00,0x03,0x00,0x03,0x00,0x00},/*"W",55*/
-{0x04,0x9C,0x60,0x9C,0x04,0x00,0x02,0x03,0x00,0x03,0x02,0x00},/*"X",56*/
-{0x04,0x1C,0xE0,0x1C,0x04,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"Y",57*/
-{0x0C,0x84,0x64,0x1C,0x04,0x00,0x02,0x03,0x02,0x02,0x03,0x00},/*"Z",58*/
-{0x00,0x00,0xFE,0x02,0x02,0x00,0x00,0x00,0x07,0x04,0x04,0x00},/*"[",59*/
-{0x00,0x0E,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00},/*"\",60*/
-{0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0x04,0x04,0x07,0x00,0x00},/*"]",61*/
-{0x00,0x04,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
-{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08},/*"_",63*/
-{0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
-{0x00,0x40,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x03,0x02},/*"a",65*/
-{0x04,0xFC,0x20,0x20,0xC0,0x00,0x00,0x03,0x02,0x02,0x01,0x00},/*"b",66*/
-{0x00,0xC0,0x20,0x20,0x60,0x00,0x00,0x01,0x02,0x02,0x02,0x00},/*"c",67*/
-{0x00,0xC0,0x20,0x24,0xFC,0x00,0x00,0x01,0x02,0x02,0x03,0x02},/*"d",68*/
-{0x00,0xC0,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x02,0x00},/*"e",69*/
-{0x00,0x20,0xF8,0x24,0x24,0x04,0x00,0x02,0x03,0x02,0x02,0x00},/*"f",70*/
-{0x00,0x40,0xA0,0xA0,0x60,0x20,0x00,0x07,0x0A,0x0A,0x0A,0x04},/*"g",71*/
-{0x04,0xFC,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02},/*"h",72*/
-{0x00,0x20,0xE4,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"i",73*/
-{0x00,0x00,0x20,0xE4,0x00,0x00,0x08,0x08,0x08,0x07,0x00,0x00},/*"j",74*/
-{0x04,0xFC,0x80,0xE0,0x20,0x20,0x02,0x03,0x02,0x00,0x03,0x02},/*"k",75*/
-{0x04,0x04,0xFC,0x00,0x00,0x00,0x02,0x02,0x03,0x02,0x02,0x00},/*"l",76*/
-{0xE0,0x20,0xE0,0x20,0xC0,0x00,0x03,0x00,0x03,0x00,0x03,0x00},/*"m",77*/
-{0x20,0xE0,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02},/*"n",78*/
-{0x00,0xC0,0x20,0x20,0xC0,0x00,0x00,0x01,0x02,0x02,0x01,0x00},/*"o",79*/
-{0x20,0xE0,0x20,0x20,0xC0,0x00,0x08,0x0F,0x0A,0x02,0x01,0x00},/*"p",80*/
-{0x00,0xC0,0x20,0x20,0xE0,0x00,0x00,0x01,0x02,0x0A,0x0F,0x08},/*"q",81*/
-{0x20,0xE0,0x40,0x20,0x20,0x00,0x02,0x03,0x02,0x00,0x00,0x00},/*"r",82*/
-{0x00,0x60,0xA0,0xA0,0x20,0x00,0x00,0x02,0x02,0x02,0x03,0x00},/*"s",83*/
-{0x00,0x20,0xF8,0x20,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x00},/*"t",84*/
-{0x20,0xE0,0x00,0x20,0xE0,0x00,0x00,0x01,0x02,0x02,0x03,0x02},/*"u",85*/
-{0x20,0xE0,0x20,0x80,0x60,0x20,0x00,0x00,0x03,0x01,0x00,0x00},/*"v",86*/
-{0x60,0x80,0xE0,0x80,0x60,0x00,0x00,0x03,0x00,0x03,0x00,0x00},/*"w",87*/
-{0x20,0x60,0x80,0x60,0x20,0x00,0x02,0x03,0x00,0x03,0x02,0x00},/*"x",88*/
-{0x20,0xE0,0x20,0x80,0x60,0x20,0x08,0x08,0x07,0x01,0x00,0x00},/*"y",89*/
-{0x00,0x20,0xA0,0x60,0x20,0x00,0x00,0x02,0x03,0x02,0x02,0x00},/*"z",90*/
-{0x00,0x00,0x20,0xDE,0x02,0x00,0x00,0x00,0x00,0x07,0x04,0x00},/*"{",91*/
-{0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00},/*"|",92*/
-{0x00,0x02,0xDE,0x20,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x00},/*"}",93*/
-{0x02,0x01,0x02,0x04,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
+{0x00,0x00,0x00,0x00,0x7F,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
+{0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00},/*""",2*/
+{0xE0,0x01,0x38,0x00,0xEF,0x01,0x38,0x00,0x2F,0x00,0x08,0x00},/*"#",3*/
+{0x0E,0x01,0x19,0x01,0xFF,0x03,0x31,0x01,0xE1,0x00,0x00,0x00},/*"$",4*/
+{0x0F,0x01,0xC9,0x00,0x3F,0x00,0xF8,0x01,0x26,0x01,0xE1,0x01},/*"%",5*/
+{0xE0,0x00,0x9F,0x01,0x39,0x01,0x47,0x01,0x80,0x01,0x70,0x01},/*"&",6*/
+{0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
+{0x00,0x00,0x00,0x00,0xF8,0x00,0x06,0x03,0x03,0x06,0x01,0x04},/*"(",8*/
+{0x01,0x04,0x02,0x06,0x06,0x03,0xF8,0x00,0x00,0x00,0x00,0x00},/*")",9*/
+{0x02,0x00,0x1C,0x00,0x03,0x00,0x1C,0x00,0x02,0x00,0x00,0x00},/*"*",10*/
+{0x20,0x00,0x20,0x00,0xF8,0x01,0x20,0x00,0x20,0x00,0x00,0x00},/*"+",11*/
+{0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
+{0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00},/*"-",13*/
+{0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00},/*".",14*/
+{0x00,0x04,0x00,0x03,0xE0,0x00,0x38,0x00,0x06,0x00,0x01,0x00},/*"/",15*/
+{0x7C,0x00,0x83,0x01,0x01,0x01,0x83,0x01,0x7C,0x00,0x00,0x00},/*"0",16*/
+{0x02,0x01,0x02,0x01,0xFF,0x01,0x00,0x01,0x00,0x01,0x00,0x00},/*"1",17*/
+{0x00,0x00,0x81,0x01,0x61,0x01,0x11,0x01,0x0E,0x01,0x00,0x00},/*"2",18*/
+{0x00,0x00,0x01,0x01,0x11,0x01,0x11,0x01,0xEE,0x00,0x00,0x00},/*"3",19*/
+{0x60,0x00,0x58,0x00,0x46,0x00,0xFF,0x01,0x40,0x00,0x00,0x00},/*"4",20*/
+{0x00,0x00,0x0F,0x01,0x09,0x01,0x19,0x01,0xF1,0x00,0x00,0x00},/*"5",21*/
+{0xFC,0x00,0x92,0x01,0x09,0x01,0x09,0x01,0xF1,0x00,0x00,0x00},/*"6",22*/
+{0x00,0x00,0x81,0x01,0x71,0x00,0x0D,0x00,0x03,0x00,0x00,0x00},/*"7",23*/
+{0xE6,0x00,0x19,0x01,0x11,0x01,0x39,0x01,0xE6,0x00,0x00,0x00},/*"8",24*/
+{0x1E,0x01,0x21,0x01,0x21,0x01,0x93,0x00,0x7E,0x00,0x00,0x00},/*"9",25*/
+{0x00,0x00,0x00,0x00,0x98,0x01,0x98,0x01,0x00,0x00,0x00,0x00},/*":",26*/
+{0x00,0x00,0x00,0x00,0x98,0x05,0x98,0x03,0x00,0x00,0x00,0x00},/*";",27*/
+{0x00,0x00,0x60,0x00,0x90,0x00,0x90,0x00,0x08,0x01,0x00,0x00},/*"<",28*/
+{0x50,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x50,0x00},/*"=",29*/
+{0x08,0x01,0x90,0x00,0x90,0x00,0x60,0x00,0x00,0x00,0x00,0x00},/*">",30*/
+{0x00,0x00,0x03,0x00,0x61,0x01,0x11,0x00,0x0E,0x00,0x00,0x00},/*"?",31*/
+{0x7C,0x00,0x82,0x00,0x79,0x01,0x45,0x01,0x7E,0x01,0x40,0x00},/*"@",32*/
+{0x80,0x01,0x78,0x00,0x47,0x00,0x4F,0x00,0x70,0x00,0x80,0x01},/*"A",33*/
+{0xFF,0x01,0x11,0x01,0x11,0x01,0x39,0x01,0xEE,0x00,0x00,0x00},/*"B",34*/
+{0x7C,0x00,0x82,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00},/*"C",35*/
+{0xFF,0x01,0x01,0x01,0x01,0x01,0x81,0x01,0xFE,0x00,0x00,0x00},/*"D",36*/
+{0x00,0x00,0xFF,0x01,0x11,0x01,0x11,0x01,0x01,0x01,0x00,0x00},/*"E",37*/
+{0x00,0x00,0xFF,0x01,0x11,0x00,0x11,0x00,0x01,0x00,0x00,0x00},/*"F",38*/
+{0x7C,0x00,0x82,0x00,0x01,0x01,0x21,0x01,0xE1,0x01,0x00,0x00},/*"G",39*/
+{0xFF,0x01,0x10,0x00,0x10,0x00,0x10,0x00,0xFF,0x01,0x00,0x00},/*"H",40*/
+{0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x00,0x00},/*"I",41*/
+{0x00,0x00,0x01,0x01,0x01,0x01,0xFF,0x00,0x00,0x00,0x00,0x00},/*"J",42*/
+{0xFF,0x01,0x18,0x00,0x24,0x00,0xC2,0x00,0x81,0x01,0x00,0x01},/*"K",43*/
+{0x00,0x00,0xFF,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00},/*"L",44*/
+{0xFF,0x01,0x1E,0x00,0x70,0x00,0x0E,0x00,0xFF,0x01,0x00,0x00},/*"M",45*/
+{0xFF,0x01,0x06,0x00,0x38,0x00,0xC0,0x00,0xFF,0x01,0x00,0x00},/*"N",46*/
+{0x7C,0x00,0x83,0x01,0x01,0x01,0x83,0x01,0x7C,0x00,0x00,0x00},/*"O",47*/
+{0xFF,0x01,0x21,0x00,0x21,0x00,0x31,0x00,0x1E,0x00,0x00,0x00},/*"P",48*/
+{0x7C,0x00,0x83,0x01,0x01,0x01,0x83,0x01,0x7C,0x02,0x00,0x04},/*"Q",49*/
+{0xFF,0x01,0x11,0x00,0x31,0x00,0xCE,0x00,0x00,0x01,0x00,0x00},/*"R",50*/
+{0x00,0x00,0x0E,0x01,0x19,0x01,0x11,0x01,0xE1,0x00,0x00,0x00},/*"S",51*/
+{0x01,0x00,0x01,0x00,0xFF,0x01,0x01,0x00,0x01,0x00,0x00,0x00},/*"T",52*/
+{0xFF,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0xFF,0x00,0x00,0x00},/*"U",53*/
+{0x03,0x00,0x7C,0x00,0x80,0x01,0xE0,0x00,0x1C,0x00,0x03,0x00},/*"V",54*/
+{0x7F,0x00,0xC0,0x01,0x3C,0x00,0xE0,0x01,0x1F,0x00,0x00,0x00},/*"W",55*/
+{0x01,0x01,0xC6,0x00,0x28,0x00,0x38,0x00,0xC6,0x00,0x01,0x01},/*"X",56*/
+{0x01,0x00,0x0E,0x00,0xF0,0x01,0x0E,0x00,0x01,0x00,0x00,0x00},/*"Y",57*/
+{0x81,0x01,0x61,0x01,0x11,0x01,0x0D,0x01,0x03,0x01,0x00,0x00},/*"Z",58*/
+{0x00,0x00,0x00,0x00,0xFF,0x07,0x01,0x04,0x01,0x04,0x00,0x00},/*"[",59*/
+{0x01,0x00,0x06,0x00,0x38,0x00,0xC0,0x00,0x00,0x03,0x00,0x04},/*"\",60*/
+{0x00,0x00,0x01,0x04,0x01,0x04,0xFF,0x07,0x00,0x00,0x00,0x00},/*"]",61*/
+{0x60,0x00,0x1C,0x00,0x07,0x00,0x38,0x00,0x40,0x00,0x00,0x00},/*"^",62*/
+{0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02},/*"_",63*/
+{0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
+{0x00,0x00,0xC8,0x01,0x28,0x01,0x28,0x01,0xF0,0x01,0x00,0x01},/*"a",65*/
+{0xFF,0x01,0x10,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00},/*"b",66*/
+{0xF0,0x00,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0x00,0x00},/*"c",67*/
+{0xF0,0x00,0x08,0x01,0x08,0x01,0x88,0x00,0xFF,0x01,0x00,0x00},/*"d",68*/
+{0xF0,0x00,0xA8,0x01,0x28,0x01,0x28,0x01,0x30,0x01,0x00,0x00},/*"e",69*/
+{0x00,0x00,0x08,0x00,0xFF,0x01,0x09,0x00,0x09,0x00,0x00,0x00},/*"f",70*/
+{0xF0,0x00,0x08,0x05,0x08,0x05,0x08,0x05,0xF8,0x03,0x00,0x00},/*"g",71*/
+{0xFF,0x01,0x10,0x00,0x08,0x00,0x08,0x00,0xF8,0x01,0x00,0x00},/*"h",72*/
+{0x00,0x00,0x08,0x00,0x08,0x00,0xF9,0x01,0x00,0x00,0x00,0x00},/*"i",73*/
+{0x00,0x04,0x08,0x04,0x08,0x04,0xF9,0x03,0x00,0x00,0x00,0x00},/*"j",74*/
+{0x00,0x00,0xFF,0x01,0x20,0x00,0xF0,0x00,0x98,0x01,0x08,0x01},/*"k",75*/
+{0x01,0x00,0x01,0x00,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/
+{0xF8,0x01,0x08,0x00,0xF8,0x01,0x08,0x00,0xF8,0x01,0x00,0x00},/*"m",77*/
+{0xF8,0x01,0x10,0x00,0x08,0x00,0x08,0x00,0xF8,0x01,0x00,0x00},/*"n",78*/
+{0xF0,0x00,0x08,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00},/*"o",79*/
+{0xF8,0x07,0x10,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00},/*"p",80*/
+{0xF0,0x00,0x08,0x01,0x08,0x01,0x08,0x01,0xF8,0x07,0x00,0x00},/*"q",81*/
+{0x00,0x00,0xF8,0x01,0x10,0x00,0x08,0x00,0x18,0x00,0x00,0x00},/*"r",82*/
+{0x00,0x00,0x38,0x01,0x28,0x01,0x48,0x01,0xC8,0x00,0x00,0x00},/*"s",83*/
+{0x00,0x00,0x08,0x00,0xFF,0x00,0x08,0x01,0x08,0x01,0x00,0x00},/*"t",84*/
+{0xF8,0x01,0x00,0x01,0x00,0x01,0x80,0x00,0xF8,0x01,0x00,0x00},/*"u",85*/
+{0x18,0x00,0xE0,0x00,0x00,0x01,0xF0,0x00,0x18,0x00,0x00,0x00},/*"v",86*/
+{0x78,0x00,0x80,0x01,0x70,0x00,0x60,0x00,0x80,0x01,0x78,0x00},/*"w",87*/
+{0x08,0x01,0x90,0x00,0x60,0x00,0x90,0x00,0x08,0x01,0x00,0x00},/*"x",88*/
+{0x08,0x04,0x30,0x04,0xC0,0x03,0xC0,0x01,0x30,0x00,0x08,0x00},/*"y",89*/
+{0x08,0x01,0x88,0x01,0x48,0x01,0x28,0x01,0x18,0x01,0x00,0x00},/*"z",90*/
+{0x00,0x00,0x20,0x00,0xDF,0x03,0x01,0x04,0x01,0x04,0x00,0x00},/*"{",91*/
+{0x00,0x00,0x00,0x00,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
+{0x00,0x00,0x01,0x04,0x01,0x04,0xDE,0x07,0x20,0x00,0x00,0x00},/*"}",93*/
+{0x60,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x60,0x00},/*"~",94*/
 };
-static const uint8_t font_1608[95][16] =
+static const uint8_t font_en_1608[95][16] =
 {      
 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
-{0x00,0x00,0x00,0x00,0xF8,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
-{0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
-{0x40,0x02,0x40,0x1E,0xE0,0x03,0x58,0x02,0x40,0x02,0x40,0x1E,0xC0,0x03,0x78,0x02},/*"#",3*/
-{0x00,0x00,0x70,0x0C,0x98,0x18,0x88,0x10,0xFC,0x3F,0x08,0x11,0x08,0x19,0x10,0x0E},/*"$",4*/
-{0x00,0x00,0x70,0x00,0x88,0x00,0x88,0x00,0x88,0x18,0x70,0x06,0x00,0x01,0xC0,0x00},/*"%",5*/
-{0x00,0x00,0x00,0x0E,0x70,0x19,0x88,0x11,0x88,0x11,0x88,0x12,0x70,0x1C,0x00,0x08},/*"&",6*/
-{0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
-{0x00,0x00,0xC0,0x1F,0x30,0x60,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"(",8*/
-{0x00,0x00,0x08,0x80,0x30,0x60,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/
-{0x10,0x00,0x50,0x00,0x38,0x00,0x50,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"*",10*/
-{0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0xE0,0x0F,0x00,0x01,0x00,0x01,0x00,0x01},/*"+",11*/
-{0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
-{0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
-{0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
-{0x00,0x18,0x00,0x07,0xE0,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"/",15*/
-{0x00,0x00,0xE0,0x07,0x18,0x18,0x08,0x10,0x08,0x10,0x08,0x10,0x18,0x18,0xE0,0x07},/*"0",16*/
-{0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00},/*"1",17*/
-{0x00,0x00,0x10,0x10,0x08,0x18,0x08,0x18,0x08,0x14,0x08,0x12,0x98,0x11,0x70,0x10},/*"2",18*/
-{0x00,0x00,0x10,0x08,0x08,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x70,0x09,0x00,0x07},/*"3",19*/
-{0x00,0x06,0x00,0x05,0x80,0x04,0x40,0x04,0x20,0x04,0x10,0x04,0xF8,0x1F,0x00,0x04},/*"4",20*/
-{0x00,0x00,0xC0,0x09,0xB8,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x08,0x0F},/*"5",21*/
-{0x00,0x00,0xE0,0x07,0x10,0x09,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x10,0x0F},/*"6",22*/
-{0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x1C,0x08,0x03,0xC8,0x00,0x38,0x00,0x08,0x00},/*"7",23*/
-{0x00,0x00,0x70,0x0F,0x90,0x11,0x88,0x10,0x88,0x10,0x88,0x10,0x98,0x19,0x60,0x0F},/*"8",24*/
-{0x00,0x00,0xF0,0x08,0x98,0x11,0x08,0x11,0x08,0x11,0x08,0x11,0x90,0x08,0xE0,0x07},/*"9",25*/
-{0x00,0x00,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
-{0x00,0x00,0x40,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
-{0x00,0x00,0x00,0x01,0x80,0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x40,0x04,0x20,0x08},/*"<",28*/
-{0x00,0x00,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02},/*"=",29*/
-{0x00,0x00,0x20,0x08,0x40,0x04,0x40,0x04,0x40,0x04,0x80,0x02,0x80,0x02,0x00,0x01},/*">",30*/
-{0x00,0x00,0x30,0x00,0x18,0x00,0x08,0x00,0x08,0x16,0x08,0x01,0x98,0x00,0x70,0x00},/*"?",31*/
-{0x00,0x00,0x80,0x0F,0xC0,0x30,0x20,0x40,0x10,0x4F,0x90,0x99,0x88,0x90,0x48,0x90},/*"@",32*/
-{0x00,0x00,0x00,0x18,0x00,0x06,0x80,0x03,0x70,0x02,0x08,0x02,0x70,0x02,0x80,0x03},/*"A",33*/
-{0x00,0x00,0xF8,0x1F,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10},/*"B",34*/
-{0x00,0x00,0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10},/*"C",35*/
-{0x00,0x00,0xF8,0x1F,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10},/*"D",36*/
-{0x00,0x00,0xF8,0x1F,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10},/*"E",37*/
-{0x00,0x00,0xF8,0x1F,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00},/*"F",38*/
-{0x00,0x00,0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x11,0x08,0x11},/*"G",39*/
-{0x00,0x00,0xF8,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00},/*"H",40*/
-{0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/
-{0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0xF8,0x0F,0x00,0x00},/*"J",42*/
-{0x00,0x00,0xF8,0x1F,0x00,0x02,0x00,0x01,0x80,0x00,0xC0,0x01,0x20,0x02,0x10,0x04},/*"K",43*/
-{0x00,0x00,0xF8,0x1F,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10},/*"L",44*/
-{0x00,0x00,0xF8,0x1F,0x10,0x00,0x60,0x00,0x80,0x01,0x00,0x06,0x00,0x18,0x00,0x06},/*"M",45*/
-{0x00,0x00,0xF8,0x1F,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04},/*"N",46*/
-{0x00,0x00,0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10},/*"O",47*/
-{0x00,0x00,0xF8,0x1F,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01},/*"P",48*/
-{0x00,0x00,0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x14,0x08,0x14},/*"Q",49*/
-{0x00,0x00,0xF8,0x1F,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x03,0x08,0x05},/*"R",50*/
-{0x00,0x00,0x70,0x0C,0xD0,0x18,0x88,0x10,0x88,0x10,0x88,0x10,0x08,0x11,0x08,0x11},/*"S",51*/
-{0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0xF8,0x1F,0x08,0x00,0x08,0x00,0x08,0x00},/*"T",52*/
-{0x00,0x00,0xF8,0x07,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10},/*"U",53*/
-{0x00,0x00,0x18,0x00,0x60,0x00,0x80,0x01,0x00,0x06,0x00,0x18,0x00,0x06,0x80,0x01},/*"V",54*/
-{0x18,0x00,0xE0,0x00,0x00,0x0F,0x00,0x18,0x00,0x06,0x80,0x01,0x70,0x00,0x08,0x00},/*"W",55*/
-{0x00,0x10,0x08,0x08,0x10,0x04,0x20,0x02,0x40,0x01,0x80,0x00,0x40,0x01,0x20,0x02},/*"X",56*/
-{0x08,0x00,0x10,0x00,0x60,0x00,0x80,0x00,0x00,0x1F,0x80,0x00,0x60,0x00,0x10,0x00},/*"Y",57*/
-{0x00,0x10,0x08,0x18,0x08,0x14,0x08,0x12,0x88,0x11,0x48,0x10,0x28,0x10,0x18,0x10},/*"Z",58*/
-{0x00,0x00,0xF8,0xFF,0x08,0x80,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"[",59*/
-{0x18,0x00,0xE0,0x00,0x00,0x07,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"\",60*/
-{0x08,0x80,0x08,0x80,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"]",61*/
-{0x00,0x01,0xC0,0x00,0x60,0x00,0x10,0x00,0x60,0x00,0xC0,0x00,0x00,0x01,0x00,0x00},/*"^",62*/
-{0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},/*"_",63*/
-{0x00,0x00,0x08,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
-{0x00,0x00,0x80,0x0C,0x40,0x14,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x0A,0x80,0x1F},/*"a",65*/
-{0x00,0x00,0xF8,0x1F,0x80,0x08,0x80,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0x00,0x07},/*"b",66*/
-{0x00,0x00,0x80,0x0F,0xC0,0x18,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0x00,0x00},/*"c",67*/
-{0x00,0x00,0x00,0x07,0x80,0x08,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0xF8,0x1F},/*"d",68*/
-{0x00,0x00,0x00,0x07,0x80,0x0A,0x40,0x12,0x40,0x12,0x40,0x12,0x80,0x12,0x00,0x0B},/*"e",69*/
-{0x40,0x00,0xF8,0x1F,0x48,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"f",70*/
-{0x00,0x00,0x00,0x47,0x80,0x88,0x40,0x90,0x40,0x90,0x40,0x90,0x80,0xC8,0xC0,0x7F},/*"g",71*/
-{0x00,0x00,0xF8,0x1F,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x1F,0x00,0x00},/*"h",72*/
-{0x00,0x00,0xC8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/
-{0x00,0x80,0xC8,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"j",74*/
-{0x00,0x00,0xF8,0x1F,0x00,0x02,0x00,0x02,0x00,0x03,0x80,0x04,0x80,0x08,0x40,0x10},/*"k",75*/
-{0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/
-{0x00,0x00,0xC0,0x1F,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x1F,0x80,0x00},/*"m",77*/
-{0x00,0x00,0xC0,0x1F,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x1F,0x00,0x00},/*"n",78*/
-{0x00,0x00,0x80,0x0F,0x80,0x08,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0x80,0x0F},/*"o",79*/
-{0x00,0x00,0xC0,0xFF,0x80,0x08,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0x00,0x07},/*"p",80*/
-{0x00,0x00,0x00,0x07,0x80,0x08,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0xC0,0xFF},/*"q",81*/
-{0x00,0x00,0xC0,0x1F,0x80,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"r",82*/
-{0x00,0x00,0x80,0x09,0x40,0x13,0x40,0x12,0x40,0x12,0x40,0x12,0x80,0x0C,0x00,0x00},/*"s",83*/
-{0x40,0x00,0xF0,0x1F,0x40,0x10,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/
-{0x00,0x00,0xC0,0x0F,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x08,0xC0,0x1F,0x00,0x00},/*"u",85*/
-{0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x18,0x00,0x06,0x80,0x01,0x40,0x00,0x00,0x00},/*"v",86*/
-{0xC0,0x00,0x00,0x0F,0x00,0x10,0x00,0x0E,0x80,0x01,0x40,0x00,0x80,0x01,0x00,0x0E},/*"w",87*/
-{0x40,0x10,0x80,0x08,0x00,0x05,0x00,0x02,0x00,0x05,0x80,0x08,0x40,0x10,0x00,0x00},/*"x",88*/
-{0xC0,0x00,0x00,0x83,0x00,0x8C,0x00,0x70,0x00,0x1C,0x80,0x03,0x40,0x00,0x00,0x00},/*"y",89*/
-{0x40,0x10,0x40,0x18,0x40,0x14,0x40,0x12,0x40,0x11,0xC0,0x10,0x40,0x10,0x00,0x00},/*"z",90*/
-{0x00,0x02,0x00,0x02,0xF0,0x7D,0x08,0x80,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"{",91*/
-{0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
-{0x08,0x80,0x08,0x80,0xF0,0x7D,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
-{0x00,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x80,0x00},/*"~",94*/
+{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00},/*"!",1*/
+{0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
+{0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00},/*"#",3*/
+{0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00},/*"$",4*/
+{0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00},/*"%",5*/
+{0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10},/*"&",6*/
+{0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
+{0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},/*"(",8*/
+{0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},/*")",9*/
+{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},/*"*",10*/
+{0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00},/*"+",11*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00},/*",",12*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},/*"-",13*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",14*/
+{0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00},/*"/",15*/
+{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",16*/
+{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"1",17*/
+{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",18*/
+{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},/*"3",19*/
+{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"4",20*/
+{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},/*"5",21*/
+{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"6",22*/
+{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},/*"7",23*/
+{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",24*/
+{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},/*"9",25*/
+{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},/*":",26*/
+{0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00},/*";",27*/
+{0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00},/*"<",28*/
+{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00},/*"=",29*/
+{0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00},/*">",30*/
+{0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00},/*"?",31*/
+{0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00},/*"@",32*/
+{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},/*"A",33*/
+{0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00},/*"B",34*/
+{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},/*"C",35*/
+{0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00},/*"D",36*/
+{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00},/*"E",37*/
+{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00},/*"F",38*/
+{0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00},/*"G",39*/
+{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20},/*"H",40*/
+{0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"I",41*/
+{0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00},/*"J",42*/
+{0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00},/*"K",43*/
+{0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00},/*"L",44*/
+{0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00},/*"M",45*/
+{0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00},/*"N",46*/
+{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00},/*"O",47*/
+{0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00},/*"P",48*/
+{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00},/*"Q",49*/
+{0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20},/*"R",50*/
+{0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00},/*"S",51*/
+{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},/*"T",52*/
+{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},/*"U",53*/
+{0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00},/*"V",54*/
+{0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00},/*"W",55*/
+{0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20},/*"X",56*/
+{0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},/*"Y",57*/
+{0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00},/*"Z",58*/
+{0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00},/*"[",59*/
+{0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00},/*"\",60*/
+{0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00},/*"]",61*/
+{0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},/*"_",63*/
+{0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
+{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20},/*"a",65*/
+{0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"b",66*/
+{0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00},/*"c",67*/
+{0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20},/*"d",68*/
+{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00},/*"e",69*/
+{0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"f",70*/
+{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00},/*"g",71*/
+{0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},/*"h",72*/
+{0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"i",73*/
+{0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00},/*"j",74*/
+{0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00},/*"k",75*/
+{0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"l",76*/
+{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F},/*"m",77*/
+{0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},/*"n",78*/
+{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},/*"o",79*/
+{0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00},/*"p",80*/
+{0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80},/*"q",81*/
+{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00},/*"r",82*/
+{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00},/*"s",83*/
+{0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00},/*"t",84*/
+{0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20},/*"u",85*/
+{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00},/*"v",86*/
+{0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00},/*"w",87*/
+{0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00},/*"x",88*/
+{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00},/*"y",89*/
+{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00},/*"z",90*/
+{0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40},/*"{",91*/
+{0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00},/*"|",92*/
+{0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00},/*"}",93*/
+{0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
 };
-static const uint8_t font_2412[95][36] =
+static const uint8_t font_en_2412[95][36] =
 {
 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
 {0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00},/*"!",1*/
@@ -396,9 +396,9 @@ static const uint8_t font_2412[95][36] =
 {0x00,0x18,0x06,0x02,0x02,0x04,0x08,0x10,0x20,0x20,0x30,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
 };
 
-
-static const char *font_chinese_str="输出入通道状态率耗电压流量功率因素温湿度数据版本日期时间地址模式保存退出";
-static const uint8_t font_chinese_1212[][24] =
+//新宋体
+static const char *font_cn_str="输出入通道状态率耗电压流量功率因素温湿度数据版本日期时间地址模式保存退出取消设置开关主从";
+static const uint8_t font_cn_1212[][24] =
 {
 {0x34,0x01,0x2C,0x01,0xF7,0x0F,0xA4,0x00,0xE8,0x0F,0xA4,0x02,0xEA,0x0F,0x09,0x00,0xCA,0x03,0x04,0x08,0xE8,0x0F,0x00,0x00},/*"输",0*/
 {0x80,0x07,0x1E,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0xFF,0x07,0x10,0x04,0x10,0x04,0x10,0x04,0x1E,0x04,0x80,0x0F,0x00,0x00},/*"出",1*/
@@ -436,8 +436,16 @@ static const uint8_t font_chinese_1212[][24] =
 {0x84,0x00,0x44,0x00,0xF4,0x0F,0x0C,0x00,0x87,0x00,0x94,0x00,0x94,0x08,0xD4,0x0F,0xB4,0x00,0x94,0x00,0x84,0x00,0x00,0x00},/*"存",33*/
 {0x10,0x08,0x11,0x04,0xF2,0x03,0x00,0x04,0xFF,0x0B,0x15,0x09,0xB5,0x08,0x55,0x08,0x95,0x08,0x5F,0x0B,0x20,0x08,0x00,0x00},/*"退",34*/
 {0x80,0x07,0x1E,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0xFF,0x07,0x10,0x04,0x10,0x04,0x10,0x04,0x1E,0x04,0x80,0x0F,0x00,0x00},/*"出",35*/
+{0x02,0x02,0xFE,0x03,0x52,0x02,0x52,0x02,0xFE,0x0F,0x02,0x01,0x04,0x08,0xFC,0x04,0x04,0x03,0xFC,0x04,0x00,0x08,0x00,0x00},/*"取",36*/
+{0x10,0x04,0x22,0x02,0x04,0x01,0x00,0x00,0xF2,0x0F,0x54,0x01,0x50,0x01,0x5F,0x01,0x50,0x01,0x54,0x09,0xF2,0x0F,0x00,0x00},/*"消",37*/
+{0x10,0x00,0x11,0x00,0xF2,0x07,0x00,0x02,0x50,0x08,0xCF,0x08,0x41,0x05,0x41,0x02,0x4F,0x05,0xD0,0x08,0x10,0x08,0x00,0x00},/*"设",38*/
+{0x10,0x08,0x17,0x08,0xD5,0x0F,0x55,0x08,0x57,0x08,0x7D,0x0E,0x57,0x08,0x55,0x08,0xD5,0x0F,0x17,0x08,0x10,0x08,0x00,0x00},/*"置",39*/
+{0x40,0x00,0x42,0x08,0x42,0x06,0xFE,0x01,0x42,0x00,0x42,0x00,0x42,0x00,0xFE,0x0F,0x42,0x00,0x42,0x00,0x40,0x00,0x00,0x00},/*"开",40*/
+{0x40,0x08,0x48,0x08,0x49,0x04,0x4A,0x02,0x48,0x01,0xF8,0x00,0x48,0x01,0x4A,0x02,0x49,0x04,0x48,0x08,0x40,0x08,0x00,0x00},/*"关",41*/
+{0x00,0x08,0x88,0x08,0x88,0x08,0x88,0x08,0x89,0x08,0xFA,0x0F,0x88,0x08,0x88,0x08,0x88,0x08,0x88,0x08,0x00,0x08,0x00,0x00},/*"主",42*/
+{0x00,0x08,0x00,0x06,0xE0,0x01,0x1F,0x00,0xE0,0x09,0x00,0x06,0xC0,0x01,0x3F,0x00,0xC0,0x01,0x00,0x06,0x00,0x08,0x00,0x00},/*"从",43*/
 };
-static const uint8_t font_chinese_1616[][32] =
+static const uint8_t font_cn_1616[][32] =
 {
 {0x88,0x09,0x68,0x19,0x1F,0x09,0xC8,0xFF,0x08,0x05,0x10,0x00,0xC8,0xFF,0x54,0x12,0x52,0x92,0xD1,0xFF,0x12,0x00,0x94,0x5F,0x08,0x80,0xD0,0x7F,0x10,0x00,0x00,0x00},/*"输",0*/
 {0x00,0x00,0x00,0x7C,0x7C,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFC,0x40,0x00,0xFC,0x00,0x00,0x00,0x00},/*"出",1*/
@@ -475,8 +483,16 @@ static const uint8_t font_chinese_1616[][32] =
 {0x04,0x02,0x04,0x01,0x84,0x00,0xE4,0xFF,0x1C,0x00,0x07,0x02,0x24,0x02,0x24,0x42,0x24,0x82,0x24,0x7F,0xA4,0x02,0x64,0x02,0x24,0x02,0x04,0x02,0x04,0x02,0x00,0x00},/*"存",33*/
 {0x40,0x00,0x40,0x40,0x42,0x20,0xCC,0x1F,0x00,0x20,0x00,0x40,0xFF,0x5F,0x49,0x48,0x49,0x44,0xC9,0x40,0x49,0x41,0x49,0x42,0x7F,0x45,0x80,0x58,0x00,0x40,0x00,0x00},/*"退",34*/
 {0x00,0x00,0x00,0x7C,0x7C,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFC,0x40,0x00,0xFC,0x00,0x00,0x00,0x00},/*"出",35*/
+{0x02,0x08,0x02,0x18,0xFE,0x0F,0x92,0x08,0x92,0x08,0x92,0x04,0xFE,0xFF,0x02,0x04,0x06,0x84,0xFC,0x40,0x04,0x27,0x04,0x18,0x04,0x27,0xFC,0x40,0x00,0x80,0x00,0x00},/*"取",36*/
+{0x10,0x04,0x60,0x04,0x02,0x7C,0x0C,0x03,0xC0,0x00,0x00,0x00,0xE2,0xFF,0x2C,0x09,0x20,0x09,0x3F,0x09,0x20,0x49,0x28,0x89,0xE6,0x7F,0x00,0x00,0x00,0x00,0x00,0x00},/*"消",37*/
+{0x40,0x00,0x40,0x00,0x42,0x00,0xCC,0x3F,0x00,0x90,0x40,0x88,0xA0,0x40,0x9E,0x43,0x82,0x2C,0x82,0x10,0x82,0x28,0x9E,0x46,0xA0,0x41,0x20,0x80,0x20,0x80,0x00,0x00},/*"设",38*/
+{0x00,0x40,0x17,0x40,0x15,0x40,0xD5,0x7F,0x55,0x55,0x57,0x55,0x55,0x55,0x7D,0x55,0x55,0x55,0x57,0x55,0x55,0x55,0xD5,0x7F,0x15,0x40,0x17,0x40,0x00,0x40,0x00,0x00},/*"置",39*/
+{0x80,0x00,0x82,0x80,0x82,0x40,0x82,0x30,0xFE,0x0F,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xFE,0xFF,0x82,0x00,0x82,0x00,0x82,0x00,0x80,0x00,0x00,0x00},/*"开",40*/
+{0x00,0x81,0x00,0x81,0x10,0x41,0x11,0x41,0x16,0x21,0x10,0x11,0x10,0x0D,0xF0,0x03,0x10,0x0D,0x10,0x11,0x14,0x21,0x13,0x41,0x10,0x41,0x00,0x81,0x00,0x81,0x00,0x00},/*"关",41*/
+{0x00,0x40,0x08,0x40,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x09,0x41,0xFA,0x7F,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x40,0x00,0x40,0x00,0x00},/*"主",42*/
+{0x00,0x80,0x00,0x40,0x00,0x30,0x00,0x0E,0xFF,0x01,0x00,0x82,0x00,0x4C,0x00,0x20,0x00,0x18,0x00,0x07,0xFF,0x00,0x00,0x07,0x00,0x18,0x00,0x60,0x00,0x80,0x00,0x00},/*"从",43*/
 };
-static const uint8_t font_chinese_2424[][72] =
+static const uint8_t font_cn_2424[][72] =
 {
 {0x00,0x00,0x00,0x20,0x08,0x02,0x20,0x0E,0x02,0xE0,0x0B,0x01,0x7C,0x08,0x01,0x2C,0x09,0x71,0x20,0xFF,0x7F,0x20,0x88,0x00,0x20,0x8A,0x00,0x20,0x01,0x00,0x00,0xFD,0x7F,0x80,0x24,0x01,0x60,0x25,0x21,0x38,0x25,0x61,0x0E,0xFD,0x3F,0x0C,0x01,0x00,0x10,0x01,0x00,0xA0,0xF8,0x07,0x40,0x01,0x20,0x80,0x00,0x60,0x80,0xFD,0x3F,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"输",0*/
 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0x8F,0x3F,0xE0,0x8F,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0xFC,0xFF,0x3F,0xF8,0xFF,0x3F,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0xE0,0x1F,0x20,0x20,0x90,0x7F,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"出",1*/
@@ -514,6 +530,14 @@ static const uint8_t font_chinese_2424[][72] =
 {0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x80,0x00,0x10,0x40,0x00,0x10,0x20,0x00,0x10,0x18,0x00,0x10,0xFE,0x7F,0x10,0x03,0x00,0x90,0x41,0x00,0x70,0x40,0x00,0xBE,0x40,0x00,0x94,0x40,0x00,0x90,0x40,0x20,0x90,0x40,0x20,0x90,0x40,0x60,0x90,0xF8,0x3F,0x90,0x4C,0x00,0x90,0x42,0x00,0x90,0x41,0x00,0x90,0x41,0x00,0x18,0x40,0x00,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"存",33*/
 {0x00,0x00,0x00,0x00,0x02,0x08,0x00,0x02,0x18,0x04,0x02,0x04,0x18,0x02,0x04,0x30,0xFE,0x03,0x00,0x02,0x04,0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x00,0x10,0xF8,0xFF,0x1F,0x48,0x04,0x36,0x48,0x04,0x32,0x48,0x04,0x31,0x48,0x24,0x31,0x48,0x44,0x30,0x48,0x44,0x30,0x48,0xA4,0x30,0xF8,0xA7,0x31,0x08,0x18,0x33,0x00,0x18,0x36,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00},/*"退",34*/
 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0x8F,0x3F,0xE0,0x8F,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0xFC,0xFF,0x3F,0xF8,0xFF,0x3F,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0xE0,0x1F,0x20,0x20,0x90,0x7F,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"出",35*/
+{0x00,0x00,0x00,0x08,0x00,0x02,0x08,0x00,0x06,0x08,0x00,0x06,0xF8,0xFF,0x03,0x88,0x10,0x02,0x88,0x10,0x02,0x88,0x10,0x01,0x88,0x10,0x01,0xF8,0xFF,0x7F,0x08,0x00,0x41,0x2C,0x80,0x20,0x20,0x80,0x10,0xE0,0x01,0x18,0x20,0x1E,0x0C,0x20,0xE0,0x02,0x20,0x80,0x01,0x20,0x70,0x06,0x20,0x1E,0x0C,0xE0,0x03,0x18,0x20,0x00,0x38,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00},/*"取",36*/
+{0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x01,0x00,0x07,0x01,0x0C,0x06,0x3F,0x38,0x80,0x7F,0x30,0x70,0x00,0x00,0x0E,0x00,0xC0,0x01,0x00,0x04,0x00,0x00,0x08,0xFF,0x7F,0x70,0x89,0x00,0x60,0x89,0x00,0x00,0x89,0x00,0x00,0x89,0x00,0xFE,0x89,0x00,0x00,0x89,0x20,0xC0,0x89,0x20,0x20,0x89,0x60,0x18,0xFF,0x3F,0x08,0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"消",37*/
+{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x04,0x02,0x00,0x38,0xFE,0x1F,0x30,0x02,0x18,0x00,0x08,0x44,0x00,0x04,0x42,0x00,0x02,0x21,0x00,0x0B,0x20,0xFC,0x18,0x10,0x3C,0x68,0x10,0x04,0x88,0x09,0x04,0x08,0x0E,0x04,0x08,0x06,0x04,0x08,0x0B,0xFC,0xEB,0x18,0x08,0x7E,0x10,0x00,0x0A,0x30,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x00,0x00,0x00,0x00},/*"设",38*/
+{0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x02,0x20,0xFC,0x02,0x20,0x44,0x02,0x20,0x44,0xFA,0x3F,0x44,0x4A,0x25,0x44,0x4A,0x25,0x7C,0x4A,0x25,0x44,0x4A,0x25,0xC4,0x4F,0x25,0x44,0x4A,0x25,0x44,0x4A,0x25,0x7C,0x4A,0x25,0x44,0x4A,0x25,0x44,0x4A,0x25,0x44,0xFE,0x3F,0x44,0x0A,0x20,0xFC,0x03,0x20,0x00,0x02,0x20,0x00,0x00,0x30,0x00,0x00,0x20,0x00,0x00,0x00},/*"置",39*/
+{0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x40,0x08,0x08,0x20,0x08,0x08,0x10,0x08,0x08,0x18,0x08,0x08,0x0C,0x08,0x88,0x03,0xF8,0xFF,0x00,0x08,0x08,0x00,0x08,0x08,0x00,0x08,0x08,0x00,0x08,0x08,0x00,0x08,0x08,0x00,0x08,0x08,0x00,0xF8,0xFF,0x7F,0x08,0x08,0x00,0x08,0x08,0x00,0x08,0x08,0x00,0x0C,0x08,0x00,0x08,0x0C,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"开",40*/
+{0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x40,0x40,0x10,0x20,0x40,0x10,0x20,0x40,0x10,0x10,0x40,0x10,0x10,0x44,0x10,0x08,0x4C,0x10,0x04,0x78,0x10,0x03,0x40,0xD0,0x01,0xC0,0x7F,0x00,0xC0,0x13,0x00,0x40,0x70,0x00,0x70,0x90,0x01,0x4E,0x10,0x03,0x44,0x10,0x04,0x40,0x10,0x08,0x40,0x10,0x18,0x40,0x10,0x30,0x40,0x18,0x70,0x00,0x10,0x20,0x00,0x00,0x20,0x00,0x00,0x00},/*"关",41*/
+{0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x80,0x00,0x20,0x80,0x00,0x20,0x80,0x40,0x20,0x80,0x40,0x20,0x80,0x40,0x20,0x80,0x40,0x20,0x84,0x40,0x20,0x88,0x40,0x20,0xB8,0xFF,0x3F,0xF0,0xFF,0x3F,0x80,0x40,0x20,0x80,0x40,0x20,0x80,0x40,0x20,0x80,0x40,0x20,0x80,0x40,0x20,0x80,0x60,0x20,0xC0,0x40,0x20,0x80,0x00,0x30,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00},/*"主",42*/
+{0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x06,0x00,0xC0,0x01,0x00,0x7F,0x00,0xFC,0x0F,0x40,0x08,0x10,0x20,0x00,0x60,0x10,0x00,0xC0,0x19,0x00,0x00,0x0C,0x00,0x00,0x03,0x00,0xE0,0x01,0xFC,0x7F,0x00,0xF8,0x03,0x00,0x00,0x3C,0x00,0x00,0xC0,0x01,0x00,0x00,0x07,0x00,0x00,0x0C,0x00,0x00,0x38,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00},/*"从",43*/
 };
 
 static inline int utf8_chrlen(uint8_t *str)
@@ -600,6 +624,21 @@ uint8_t* font_next(uint8_t *str)
 }
 
 
+int font_width_str(int font, uint8_t *str)
+{
+    int w=0;
+    uint8_t *pstr=str;
+    font_data_t fdat;
+    while(*pstr) {
+        fdat = font_data(font, pstr);
+        w += fdat.width;
+        pstr = font_next(pstr);
+    }
+
+    return w;
+}
+
+
 font_data_t font_data(int font, uint8_t* c)
 {
     int idx,chinese=0;
@@ -607,10 +646,10 @@ font_data_t font_data(int font, uint8_t* c)
     
     chinese = is_chinese(c);
     if(chinese) {
-        idx = chinese_index((uint8_t*)font_chinese_str, c);
+        idx = chinese_index((uint8_t*)font_cn_str, c);
     }
     else {
-        idx = c[0];
+        idx = c[0]-32;
     }
 
     switch(font) {
@@ -618,7 +657,7 @@ font_data_t font_data(int font, uint8_t* c)
         case FONT_08:
         {
             if(!chinese) {
-                tmp.data = (uint8_t*)font_0806[idx-32];
+                tmp.data = (uint8_t*)font_en_0806[idx];
                 tmp.dlen = 6;
                 tmp.width = 6;
                 tmp.height = 8;
@@ -629,13 +668,13 @@ font_data_t font_data(int font, uint8_t* c)
         case FONT_12:
         {
             if(chinese) {
-                tmp.data = (uint8_t*)font_chinese_1212[idx];
+                tmp.data = (uint8_t*)font_cn_1212[idx];
                 tmp.dlen = 24;
                 tmp.width = 12;
                 tmp.height = 12;
             }
             else {
-                tmp.data = (uint8_t*)font_1206[idx-32];
+                tmp.data = (uint8_t*)font_en_1206[idx];
                 tmp.dlen = 12;
                 tmp.width = 6;
                 tmp.height = 12;
@@ -646,13 +685,13 @@ font_data_t font_data(int font, uint8_t* c)
         case FONT_16:
         {
             if(chinese) {
-                tmp.data = (uint8_t*)font_chinese_1616[idx];
+                tmp.data = (uint8_t*)font_cn_1616[idx];
                 tmp.dlen = 32;
                 tmp.width = 16;
                 tmp.height = 16;
             }
             else {
-                tmp.data = (uint8_t*)font_1608[idx-32];
+                tmp.data = (uint8_t*)font_en_1608[idx];
                 tmp.dlen = 16;
                 tmp.width = 8;
                 tmp.height = 16;
@@ -663,13 +702,13 @@ font_data_t font_data(int font, uint8_t* c)
         case FONT_24:
         {
             if(chinese) {
-                tmp.data = (uint8_t*)font_chinese_2424[idx];
+                tmp.data = (uint8_t*)font_cn_2424[idx];
                 tmp.dlen = 72;
                 tmp.width = 24;
                 tmp.height = 24;
             }
             else {
-                tmp.data = (uint8_t*)font_2412[idx-32];
+                tmp.data = (uint8_t*)font_en_2412[idx];
                 tmp.dlen = 36;
                 tmp.width = 12;
                 tmp.height = 24;

+ 1 - 0
pro/ui/font.h

@@ -22,6 +22,7 @@ typedef struct {
 
 
 uint8_t* font_next(uint8_t *str);
+int font_width_str(int font, uint8_t *str);
 font_data_t font_data(int font, uint8_t* c);
 
 #endif

+ 59 - 8
pro/ui/gpio.c

@@ -1,6 +1,7 @@
 #include <string.h>
 #include <stdio.h>
 #include <fcntl.h>
+#include <errno.h>
 #include <unistd.h>
 #include "gpio.h"
 #include "elog.h"
@@ -15,9 +16,10 @@
 #endif
 
 
+
 int gpio_init(int gpio, int io)
 {
-    int r,fd;
+    int r,fd,flag;
     char tmp[20],path[100];
     
     sprintf(path,"/sys/class/gpio/export");
@@ -49,8 +51,9 @@ int gpio_init(int gpio, int io)
     }
     close(fd);
     
+    flag = ((io==GPIO_IN)?O_RDONLY:O_WRONLY);
     sprintf(path,"/sys/class/gpio/gpio%d/value", gpio);
-	fd = open(path, O_WRONLY);
+	fd = open(path, flag);
 	if(fd< 0){
 		LOGE("open gpio value failed\n");
 		return -1;
@@ -59,12 +62,14 @@ int gpio_init(int gpio, int io)
     return fd;
 }
 
+
 int gpio_deinit(int fd)
 {
     close(fd);
     return 0;
 }
 
+
 int gpio_set(int fd, int hl)
 {
     int r;
@@ -80,20 +85,66 @@ int gpio_set(int fd, int hl)
 	return 0;
 }
 
-
 int gpio_get(int fd)
 {
     int r;
-    char tmp[20];
+    char tmp[10];
     
     r = read(fd, tmp, sizeof(tmp)-1);  
-    if (r<0) {  
+    if (r<0) {
+        LOGE("gpio_get failed, %d\n", errno);
         return -1;  
     }    
     
     if (tmp[0]=='0'){
-        return 1;
-    } else{
         return 0;
+    } else{
+        return 1;
     }  
-}
+}
+
+
+int gpio_set2(int gpio, int hl)
+{
+    int r,fd;
+    char tmp[10],path[100];
+
+    sprintf(path,"/sys/class/gpio/gpio%d/value", gpio);
+	fd = open(path, O_RDWR);
+	if(fd< 0){
+		LOGE("open gpio value failed\n");
+		return -1;
+	}
+
+    sprintf(tmp, "%d", hl);
+	r = write(fd, tmp, strlen(tmp));
+	if(r<0){
+		LOGE("gpio_set2 failed\n");
+		return -1;
+    }
+    close(fd);
+
+	return 0;
+}
+
+int gpio_get2(int gpio)
+{
+    int r,fd;
+    char tmp[10],path[100];
+
+    sprintf(path,"/sys/class/gpio/gpio%d/value", gpio);
+	fd = open(path, O_RDWR);
+	if(fd< 0){
+		LOGE("open gpio value failed\n");
+		return -1;
+	}
+
+    r = read(fd, tmp, sizeof(tmp)-1);  
+    if (r<0) {
+        LOGE("gpio_get failed, %d\n", errno);
+        return -1;  
+    }
+    close(fd);
+    
+    return tmp[0]-'0';
+}

+ 5 - 1
pro/ui/gpio.h

@@ -8,7 +8,11 @@ enum {
 
 int gpio_init(int gpio, int io);
 int gpio_deinit(int fd);
-int gpio_set(int fd, int hl);
+
 int gpio_get(int fd);
+int gpio_set(int fd, int hl);
+
+int gpio_get2(int gpio);
+int gpio_set2(int gpio, int hl);
 
 #endif

+ 107 - 40
pro/ui/key.c

@@ -1,4 +1,8 @@
-#include "key"
+#include <stdint.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include "key.h"
 #include "gpio.h"
 #include "elog.h"
 
@@ -12,33 +16,39 @@
 #endif
 
 
-#define K1_GPIO             101
-#define K2_GPIO             102
-#define K3_GPIO             103
+#define KEY_NUM             3
+#define KEY_LONG_TIME       500
+#define KEY_PRESS_LEVEL     0
+
+#define K1_GPIO             101     //PD5, K1
+#define K2_GPIO             102     //PD6, K2
+#define K3_GPIO             104     //PD8, K3
+
 
 typedef struct {
     int      gpio;
     uint16_t key;
     uint8_t  active_level;
 }io_info_t;
-static io_info_t io_info[USER_KEY_MAX]={
-    {K1_GPIO, KEY_LEFT,  PRESS_LEVEL},
-    {K2_GPIO, KEY_OK,    PRESS_LEVEL}, 
-    {K3_GPIO, KEY_RIGHT, PRESS_LEVEL};
+static io_info_t io_info[KEY_NUM]={
+    {K1_GPIO, KEY_OK,    KEY_PRESS_LEVEL},      //S2
+    {K2_GPIO, KEY_UP,    KEY_PRESS_LEVEL},      //S1
+    {K3_GPIO, KEY_DOWN,  KEY_PRESS_LEVEL},      //S3
 };
+
 typedef struct {
-    int tp;
-    int key;
-    int up;         //0: release  1: press
-    uint64_t ms;
+    int         key;
+    uint64_t    ms;
 }key_info_t;
 typedef struct {
-    int        fd;
-    key_info_t k1;
-    key_info_t k2;
+    int         fd;
+    key_info_t  k1;
+    key_info_t  k2;
+    int         long_trigged;
 }key_data_t;
 typedef struct {
-    key_data_t key[USER_KEY_MAX];
+    io_info_t   *io;
+    key_data_t  kd[KEY_NUM];
 }key_handle_t;
 static key_handle_t keyHandle={0};
 
@@ -49,42 +59,99 @@ static uint64_t get_ms(void)
     return (uint64_t)(tv.tv_sec)*1000 + (uint64_t)(tv.tv_usec)/1000;
 }
 
-static int key_init(key_handle_t *h)
+///////////////////////////////////////////////////////////////
+
+int key_init(void)
 {
     int i;
-    for(i=0; i<USER_KEY_MAX; i++) {
-        h->key[i].fd = gpio_init(io_info[i].gpio, GPIO_IN);
+    key_handle_t *h=&keyHandle;
+
+    h->io = io_info;
+    for(i=0; i<KEY_NUM; i++) {
+        h->kd[i].fd = gpio_init(io_info[i].gpio, GPIO_IN);
+        h->kd[i].k1.key = -1;
+        h->kd[i].k1.ms = 0;
+
+        h->kd[i].k2 = h->kd[i].k1;
+        h->kd[i].long_trigged = 0;
     }
-    return (h->fd<0)?-1:0;
+    return 0;
 }
-static int key_deinit(key_handle_t *h)
+
+int key_deinit(void)
 {
     int i;
-    for(i=0; i<USER_KEY_MAX; i++) {
-        gpio_deinit(h->key[i].fd);
+    key_handle_t *h=&keyHandle;
+
+    for(i=0; i<KEY_NUM; i++) {
+        gpio_deinit(h->kd[i].fd);
     }
     return 0;
 }
-static int key_get(key_handle_t *h, key_data_t *k)
+
+
+int key_get(key_val_t *kv)
 {
-    int r;
-    struct input_event event;
-    
-    r = read(h->fd, &event, sizeof(event));
-    if(r<0) {
+    int i,r;
+    key_val_t k;
+    uint64_t ms_max=0;
+    key_handle_t *h=&keyHandle;
+
+    if(!kv) {
         return -1;
     }
-    
-    printf("_____ evt.type: %d, value: %d, code: %d\n", event.type, event.value, event.code);
-    switch (event.type) {
-        case EV_KEY:
-        {
-            k->tp = event.type;
-            k->up = (event.value==0)?1:0;
-            k->key = event.code;
+
+    kv->key = -1;
+    for(i=0; i<KEY_NUM; i++) {
+        key_data_t *p=&h->kd[i];
+        key_info_t *p1=&p->k1;
+        key_info_t *p2=&p->k2;
+
+        //r = gpio_get(h->kd[i].fd);
+        r = gpio_get2(h->io[i].gpio);
+        if(r==KEY_PRESS_LEVEL) {            //key pressed
+            if(p1->key==-1) {
+                p1->ms = get_ms();
+                p1->key = h->io[i].key;
+            }
+            else {
+                p2->ms = get_ms();
+                p2->key = h->io[i].key;
+
+#if 0
+                if(!p->long_trigged && p2->ms-p1->ms>=KEY_LONG_TIME) {
+                    *p1 = *p2;
+
+                    kv->type = TYPE_LONG;
+                    kv->key = p2->key;
+                    p->long_trigged = 1;
+                    return 0;
+                }
+#endif
+            }
+        }
+        else {     
+            if(p1->key>=0 && p2->key==-1) {
+                p2->ms = get_ms();
+                p2->key = h->io[i].key;
+            }
+                                     //key replease
+            if(p2->key>=0) {
+                kv->key = p2->key;
+                if(p2->ms-p1->ms<KEY_LONG_TIME) {
+                    kv->type = TYPE_SHORT;
+                }
+                else {
+                    kv->type = TYPE_LONG;
+                }
+                p1->key = p2->key = -1;
+                p->long_trigged = 0;
+                
+                return 0;
+            }
         }
-        break;
     }
     
-    return 0;
-}
+    return -1;
+}
+

+ 13 - 8
pro/ui/key.h

@@ -1,16 +1,21 @@
 #ifndef __KEY_Hx__
 #define __KEY_Hx__
 
-#include <sys/time.h>
 #include <linux/input.h>
 
-#define USER_KEY_MAX        3
-#define KEY_LONG_TIME       500
-#define KEY_PRESS_LEVEL     0
+enum {
+    TYPE_SHORT=0,
+    TYPE_LONG,
+};
 
-int gpio_init(int gpio, int io);
-int gpio_deinit(int fd);
-int gpio_set(int fd, int hl);
-int gpio_get(int fd);
+typedef struct {
+    int type;         //TYPE_SHORT TYPE_LONG
+    int key;
+}key_val_t;
+
+
+int key_init(void);
+int key_deinit(void);
+int key_get(key_val_t *kv);
 
 #endif

+ 74 - 0
pro/ui/lang.c

@@ -0,0 +1,74 @@
+#include "lang.h"
+#include "common.h"
+#include "elog.h"
+
+#if 1
+    #define LOGD  log_d
+    #define LOGE  log_e
+#else
+    #define LOGD  printf
+    #define LOGE  printf
+#endif
+
+const char *lang_str_pool[2][STR_ID_MAX]={
+    {
+        "版本",     //STR_ID_VERSION
+        "时间",     //STR_ID_TIME
+        "地址",     //STR_ID_ADDR
+        "输入",     //STR_ID_INPUT
+        "输出",     //STR_ID_OUTPUT
+        "电压",     //STR_ID_VOLTAGE
+        "电流",     //STR_ID_CURRENT
+        "功率",     //STR_ID_POWER
+        "耗电量",   //STR_ID_CONSUMP
+        "因数",     //STR_ID_FACTOR
+        "开关",     //STR_ID_SWITCH
+        "温度",     //STR_ID_TEMP
+        "湿度",     //STR_ID_HUMI
+        "设置",     //STR_ID_SETT
+        "模式",     //STR_ID_MODE
+        "保存",     //STR_ID_SAVE
+        "退出",     //STR_ID_QUIT
+        "取消",     //STR_ID_CANCLE
+        "开",       //STR_ID_ON
+        "关",       //STR_ID_OFF
+        "主",       //STR_ID_MASTER
+        "从",       //STR_ID_SLAVE
+    },
+    
+    {
+        "Version",  //STR_ID_VERSION
+        "Time",     //STR_ID_TIME
+        "Addr",     //STR_ID_ADDR
+        "INPUT",    //STR_ID_INPUT
+        "OUTPUT",   //STR_ID_OUTPUT
+        "Volt",     //STR_ID_VOLTAGE
+        "Curr",     //STR_ID_CURRENT
+        "Power",    //STR_ID_POWER
+        "Consump",  //STR_ID_CONSUMP
+        "Factor",   //STR_ID_FACTOR
+        "Switch",   //STR_ID_SWITCH
+        "Temp",     //STR_ID_TEMP
+        "Humi",     //STR_ID_HUMI
+        "SETT",     //STR_ID_SETT
+        "Mode",     //STR_ID_MODE
+        "Save",     //STR_ID_SAVE
+        "Quit",     //STR_ID_QUIT
+        "Cancle",   //STR_ID_CANCLE
+        "On",       //STR_ID_ON
+        "Off",      //STR_ID_OFF
+        "Master",   //STR_ID_MASTER
+        "Slave",    //STR_ID_SLAVE
+    },
+};
+
+
+char* lang_get_str(int lang_id, int str_id)
+{
+    if(lang_id>=2 || str_id>=STR_ID_MAX) {
+        return NULL;
+    }
+    
+    return (char*)lang_str_pool[lang_id][str_id];
+}
+

+ 34 - 0
pro/ui/lang.h

@@ -0,0 +1,34 @@
+#ifndef __LANG_Hx__
+#define __LANG_Hx__
+
+enum {
+    STR_ID_VER=0,
+    STR_ID_TIME,
+    STR_ID_ADDR,
+    STR_ID_INPUT,
+    STR_ID_OUTPUT,
+    STR_ID_VOLTAGE,
+    STR_ID_CURRENT,
+    STR_ID_POWER,
+    STR_ID_CONSUMP,
+    STR_ID_FACTOR,
+    STR_ID_SWITCH,
+    STR_ID_TEMP,
+    STR_ID_HUMI,
+    STR_ID_SETT,
+    STR_ID_MODE,
+    STR_ID_SAVE,
+    STR_ID_QUIT,
+    STR_ID_CANCLE,
+    STR_ID_ON,
+    STR_ID_OFF,
+    STR_ID_MASTER,
+    STR_ID_SLAVE,
+    
+    
+    STR_ID_MAX,
+};
+
+char* lang_get_str(int lang_id, int str_id);
+
+#endif

+ 71 - 25
pro/ui/lcd.c

@@ -48,6 +48,7 @@ typedef struct {
     int         width;
     int         height;
     int         color;
+    int         angle;
 
     int         fd;
 #ifdef USE_FB
@@ -220,14 +221,19 @@ static int lcd_hw_deinit(lcd_handle_t *h)
 
 static inline int set_point(lcd_handle_t *h, int x, int y, int data)
 {
+    int pos,bit;
+
+    if(h->angle==ANGLE_180) {
+        x = h->width-1-x;
+        y = h->height-1-y;
+    }
+
 #ifdef USE_FB
     h->buf[y*h->width+x] = (uint16_t)data;
 #else
-    uint8_t pos,bit;
-
-    pos = y / 8;                              /* get y page */
-    bit = y % 8;                               /* get y point */
-    if (data) {                               /* if 1  */
+    pos = y / 8;                                            /* get y page */
+    bit = y % 8;                                            /* get y point */
+    if (data) {                                             /* if 1  */
         h->buf[pos*h->width+x] |= BIT(bit);         		/* set 1 */
     }
     else {
@@ -260,6 +266,7 @@ void lcd_init(int width, int height, int color)
     h->width  = width;
     h->height = height;
     h->color  = color;
+    h->angle = ANGLE_0;
     lcd_hw_init(h);
 }
 
@@ -273,6 +280,17 @@ void lcd_deinit(void)
 void lcd_rotate(int angle)
 {
     lcd_handle_t *h=&lcdHandle;
+
+    if(angle==ANGLE_0 || angle==ANGLE_180) {
+        h->angle = angle;
+    }
+}
+
+
+int lcd_get_angle(void)
+{
+    lcd_handle_t *h=&lcdHandle;
+    return h->angle;
 }
 
 
@@ -408,10 +426,20 @@ int lcd_draw_char(lcd_handle_t *hd, int x, int y, int w, int h, uint8_t *c, int
     int i,j,x0=x,y0=y,x1=x+w,y1=y+h;
     
     fdata = font_data(font, c);
-    for(i=0; i<fdata.dlen; i++)  {  /*遍历打印所有像素点到LCD */
+    if(h>fdata.height) {
+        if(vert==VERTICAL_CENTER) {
+            y0 += (h-fdata.height)/2;
+        }
+        else if (vert==VERTICAL_BOTTOM) {
+            y0 += h-fdata.height;
+        }
+        y = y0;
+    }
+    
+    for(i=0; i<fdata.dlen; i++)  {
         tmp = fdata.data[i];
         for(j=0; j<8; j++)  {
-            //if((x<x1 && x<hd->width) && (y<y1 && y<hd->height)) 
+            if((x<x1 && x<hd->width) && (y<y1 && y<hd->height)) 
             {
                 if(tmp&0x01) {
                     set_point(hd, x, y, color);
@@ -422,21 +450,12 @@ int lcd_draw_char(lcd_handle_t *hd, int x, int y, int w, int h, uint8_t *c, int
             }
             tmp >>= 1;
             y++;
+
+            if((y-y0)>=fdata.height) {
+                y=y0; x++;
+                break;
+            }
         }
-        
-#if 0
-        if((y-y0)>=fdata.height) {
-            x++;
-            y = y0;
-        }
-#else
-        x++;
-        if((font!=FONT_08) && ((x-x0)>=fdata.width)) {
-            x = x0;
-            y0 += 8;
-        }
-        y = y0;
-#endif
     }
 
     return fdata.width;
@@ -445,14 +464,41 @@ int lcd_draw_char(lcd_handle_t *hd, int x, int y, int w, int h, uint8_t *c, int
 
 void lcd_draw_string(int x, int y, int w, int h, char *str, int font, int color, int bgcolor, int hori, int vert)
 {
-    int r,xmax=x+w;
+    int r,sw,xmax=x+w;
+    lcd_rect_t rect;
     uint8_t *pstr=(uint8_t*)str;
     lcd_handle_t *h2=&lcdHandle;
 
-    while(*pstr)  {      /* 判断是不是非法字符! */
+   sw = font_width_str(font, pstr);
+    if(sw>w) {
+        sw = w;
+    }
+    
+    if(hori==HORIZONTAL_LEFT) {
+        rect.x = x;
+    }
+    else if(hori==HORIZONTAL_RIGHT) {
+        rect.x = x+w-sw;
+    }
+    else if(hori==HORIZONTAL_CENTER) {
+        rect.x = x+(w-sw)/2;
+    }
+    else {
+        return;
+    }
+    
+    if(rect.x+sw>=h2->width) {
+        rect.w = h2->width-rect.x;
+    }
+    else {
+        rect.w = sw;
+    }
+    rect.y = y;
+    rect.h = h;
 
-        r = lcd_draw_char(h2, x, y, w, h, pstr, font, color, bgcolor, vert);
-        x += r;
+    while(*pstr)  {
+        r = lcd_draw_char(h2, rect.x, rect.y, rect.w, rect.h, pstr, font, color, bgcolor, vert);
+        rect.x += r;
         pstr = font_next(pstr);
         if(!pstr || x>=xmax) {
             break;

+ 1 - 0
pro/ui/lcd.h

@@ -68,6 +68,7 @@ void lcd_init(int width, int height, int color);
 void lcd_deinit(void);
 
 void lcd_rotate(int angle);
+int lcd_get_angle(void);
 void lcd_set_backlight(int on);
 void lcd_fill(int color);
 void lcd_draw_line(int x1, int y1, int x2, int y2, int color);

+ 15 - 0
pro/ui/led.c

@@ -19,3 +19,18 @@ typedef struct {
 
 
 
+int led_init(void)
+{
+    return 0;
+}
+
+
+int led_deinit(void)
+{
+    return 0;
+}
+
+int led_set(led_para_t *red, led_para_t *green)
+{
+    return 0;
+}

+ 382 - 0
pro/ui/menu.c

@@ -0,0 +1,382 @@
+#include <string.h>
+#include <unistd.h>
+#include "menu.h"
+#include "lcd.h"
+#include "beep.h"
+#include "paras.h"
+#include "cascade.h"
+#include "elog.h"
+#include "thread.h"
+#include "common.h"
+#include "lang.h"
+#include "timer.h"
+#include "cfg.h"
+
+
+//#define TEXT_ALIGN
+
+#if 1
+    #define LOGD  log_d
+    #define LOGE  log_e
+#else
+    #define LOGD  printf
+    #define LOGE  printf
+#endif
+
+
+typedef struct {
+    int fd;
+    int tmr;
+    int lang;
+
+    int menu_id;
+    int item_id;
+    int inedit;
+    
+    int uflag;
+}menu_handle_t;
+static int lang_id=LANG_ID_CHINESE;
+//static int lang_id=LANG_ID_ENGLISH;
+static menu_handle_t mnHandle={0};
+
+
+enum {
+    MENU_SYSTEM=0,
+    MENU_INPUT,
+    MENU_OUTPUT,
+    MENU_SENSOR,
+    MENU_MODBUS,
+
+    MENU_MAX
+};
+
+enum {
+    MODBUS_ITEM_ADDR=0,
+    MODBUS_ITEM_MODE,
+    MODBUS_ITEM_SAVE,
+    MODBUS_ITEM_CANCLE,
+
+    MODBUS_ITEM_MAX
+};
+
+#define LEVEL_MAX  3
+static inline GlobalDeviceManager* get_dm(void)
+{
+    return &__globalDeviceManage;
+}
+
+static void tmr_handler(void *arg)
+{
+    menu_handle_t *h=(menu_handle_t*)arg;
+    h->uflag = 1;
+}
+static void tmr_start(menu_handle_t *h, int ms)
+{
+    if(h->tmr!=-1) {
+        timer_stop(h->tmr);
+    }
+    h->tmr = timer_start(0, ms, 1, tmr_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();
+}
+static void menu_input_paint(menu_handle_t *h, int font1, int font2, int item_h)
+{
+    char tmp[100];
+    GlobalDeviceManager *dm=get_dm();
+
+    lcd_fill(0);
+    sprintf(tmp, "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), 220.0f);
+    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), 10.0f);
+    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), 111.0f);
+    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), 0.99f);
+    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), 220.0f, lang_get_str(h->lang, STR_ID_CURRENT), 10.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.2f%s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), 111.0f, lang_get_str(h->lang, STR_ID_FACTOR), 0.99f);
+    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), 1122.0f);
+    lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+    lcd_refresh();
+}
+static void menu_output_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);
+    sprintf(tmp, "OUTPUT CH3");
+    lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
+
+#ifdef TEXT_ALIGN
+    int on=1;
+    char *pon=on?lang_get_str(h->lang, STR_ID_ON):lang_get_str(h->lang, STR_ID_OFF);
+    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), 10.0f);
+    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), 111.0f);
+    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), 0.99f);
+    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
+    int on=1;
+    char *pon=on?lang_get_str(h->lang, STR_ID_ON):lang_get_str(h->lang, STR_ID_OFF);
+    sprintf(tmp, "%s:%s %s:%0.2f", lang_get_str(h->lang, STR_ID_SWITCH), pon, lang_get_str(h->lang, STR_ID_CURRENT), 10.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.2f%s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), 111.0f, lang_get_str(h->lang, STR_ID_FACTOR), 0.99f);
+    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), 888.88f);
+    lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+    lcd_refresh();
+}
+
+static int menu_modbus_handle(menu_handle_t *h, ModbusInfo_t *pmb, key_val_t *kv)
+{
+    int r=-1;
+    
+    if(h->inedit) {
+        if(kv->key==KEY_UP) {
+            if(h->inedit==1) {
+                if(h->item_id>0) {
+                    h->item_id = MODBUS_ITEM_CANCLE;
+                }
+                else {
+                    h->item_id--;
+                }
+            }
+            else {
+                if(h->item_id==MODBUS_ITEM_ADDR) {         //addr
+                    if(pmb->addr<CASCADE_MAX) {
+                        pmb->addr++;
+                    }
+                    else {
+                        pmb->addr = 1;
+                    }
+                }
+                else if(h->item_id==MODBUS_ITEM_MODE) {    //mode
+                    pmb->mode = !pmb->mode;
+                }
+            }
+        }
+        else if(kv->key==KEY_DOWN) {
+            if(h->inedit==1) {
+                if(h->item_id<MODBUS_ITEM_CANCLE) {
+                    h->item_id++;
+                }
+                else {
+                    h->item_id = MODBUS_ITEM_ADDR;
+                }
+            }
+            else {      //ÊýÖµ±à¼­
+                if(h->item_id==MODBUS_ITEM_ADDR) {         //addr
+                    if(pmb->addr) {
+                        pmb->addr--;
+                    }
+                    else {
+                        pmb->addr = CASCADE_MAX;
+                    }
+                }
+                else if(h->item_id==MODBUS_ITEM_MODE) {    //mode
+                    pmb->mode = !pmb->mode;
+                }
+            }
+        }
+        else if(kv->key==KEY_OK) {
+            if(h->inedit==1) {
+                if(h->item_id==2 || h->item_id==3) {         //save
+                    if(h->item_id==2) {
+                        r = cascade_set_modbus(pmb);
+                        if(r==0) {
+                            r = paras_save();
+                        }
+                    }
+                    h->inedit = 0;
+                    tmr_stop(h);
+                }
+                else {
+                    h->inedit = 2;
+                }
+            }
+            else {
+                h->inedit = 1;
+            }
+        }
+    }
+    
+    return r;
+}
+static void menu_modbus_paint(menu_handle_t *h, int font1, int font2, int item_h, key_val_t *kv)
+{
+    int r;
+    char tmp[100];
+    static uint8_t flash_cnt=0;
+    
+    GlobalDeviceManager *dm=get_dm();
+    static ModbusInfo_t *pmb,mb_cas;
+    GlobalDeviceInfo *dev=&dm->_globalDevInfo;
+
+    if(!h->inedit) {
+        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;
+    }
+    
+    lcd_fill(0);
+    sprintf(tmp, "MODBUS %s", lang_get_str(h->lang, STR_ID_SETT));
+    lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
+
+    sprintf(tmp, "%s:", lang_get_str(h->lang, STR_ID_ADDR));
+    lcd_draw_string(0, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    sprintf(tmp, "%d", pmb->addr);
+    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:", lang_get_str(h->lang, STR_ID_MODE));
+    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", (pmb->mode==MODBUS_MASTER)?lang_get_str(h->lang, STR_ID_MASTER):lang_get_str(h->lang, STR_ID_SLAVE));
+    lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+
+    sprintf(tmp, "%s", lang_get_str(h->lang, STR_ID_SAVE));
+    lcd_draw_string(0, item_h*3, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
+    sprintf(tmp, "%s", lang_get_str(h->lang, STR_ID_QUIT));
+    lcd_draw_string(LCD_WIDTH/2, item_h*3, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
+
+    lcd_refresh();
+}
+/////////////////////////////////////////////////
+
+int menu_init(void)
+{
+    menu_handle_t *h=&mnHandle;
+    
+    memset(h, 0, sizeof(menu_handle_t));
+    h->lang = lang_id;
+    h->tmr = -1;
+    
+    key_init();
+    lcd_init(LCD_WIDTH,LCD_HEIGHT,LCD_COLOR);
+    
+    return 0;
+}
+
+int menu_deinit(void)
+{
+    menu_handle_t *h=&mnHandle;
+    
+    key_deinit();
+    lcd_deinit();
+    
+    return 0;
+}
+
+int menu_handle(void)
+{
+    int r;
+    key_val_t kv;
+    menu_handle_t *h=&mnHandle;
+    int font1=FONT_12,font2=FONT_12;
+    int item_h=LCD_HEIGHT/4;
+    
+    r = key_get(&kv);
+    if(r && !h->inedit) {
+        return -1;
+    }
+    
+    h->menu_id++;
+    if(h->menu_id>=MENU_MAX) {
+        h->menu_id = 0;
+    }
+
+    if(kv.key==KEY_OK) {
+        if(kv.type==TYPE_SHORT) {
+            if(lcd_get_angle()==ANGLE_0) {
+                lcd_rotate(ANGLE_180);
+            }
+            else {
+                lcd_rotate(ANGLE_0);
+            }
+        }
+        else {
+            if(h->menu_id==MENU_MODBUS) {
+                h->inedit = !h->inedit;
+            }
+        }
+    }
+    
+    switch(h->menu_id) {
+        case MENU_SYSTEM:
+        {
+            menu_system_paint(h, font1, font2, item_h);
+        }
+        break;
+
+        case MENU_INPUT:
+        {
+            //GlobalPowerInManger
+            menu_input_paint(h, font1, font2, item_h);
+        }
+        break;
+
+        case MENU_OUTPUT:
+        {
+            menu_output_paint(h, font1, font2, item_h);
+        }
+        break;
+
+        case MENU_MODBUS:
+        {
+            menu_modbus_paint(h, font1, font2, item_h, &kv);
+        }
+        break;
+    }
+    
+    return 0;
+}
+
+

+ 11 - 0
pro/ui/menu.h

@@ -0,0 +1,11 @@
+#ifndef __MENU_Hx__
+#define __MENU_Hx__
+
+#include "key.h"
+
+int menu_init(void);
+int menu_deinit(void);
+int menu_handle(void);
+
+#endif
+

+ 89 - 0
pro/ui/timer.c

@@ -0,0 +1,89 @@
+#include <time.h>
+#include <signal.h>
+#include <stdlib.h>
+#include "timer.h"
+
+typedef struct {
+    timer_t tid;
+    int times;
+    int times_max;
+    
+    timer_fn_t fn;
+    void *arg;
+    int   inited;
+}timer_handle_t;
+
+
+static void timer_callback(sigval_t sv)
+{
+    timer_handle_t *h=(timer_handle_t*)sv.sival_ptr;
+    if(h->fn) {
+        if(h->times_max>0) {
+            if(h->times<h->times_max) {
+                h->fn(h->arg);
+                h->times++;
+            }
+            else {
+                timer_stop((int)h);
+            }
+        }
+    }
+}
+
+int timer_start(int t1, int t2, int times, timer_fn_t fn, void *arg)
+{
+    int r;
+    struct sigevent sev;
+    struct itimerspec it;
+    timer_handle_t *h=(timer_handle_t*)malloc(sizeof(timer_handle_t));
+    
+    if(!h) {
+        return -1;
+    }
+    
+    sev.sigev_notify = SIGEV_THREAD; // 通知类型为线程
+    sev.sigev_notify_function = timer_callback; // 回调函数
+    sev.sigev_notify_attributes = NULL;
+    sev.sigev_value.sival_ptr = h; // 传递给回调函数的数据
+    r = timer_create(CLOCK_REALTIME, &sev, &h->tid);
+    if(r<0) {
+        free(h); return -1;
+    }
+    h->times = 0;
+    h->times_max = times;
+    h->fn  = fn;
+    h->arg = arg;
+    
+    it.it_value.tv_sec  = t1/1000;                 //定时器初始触发时间为5秒
+    it.it_value.tv_nsec = (t1%1000)*1000;          
+    it.it_interval.tv_sec  = t2/1000;              //定时器间隔为0秒,表示只触发一次
+    it.it_interval.tv_nsec = (t2%1000)*1000;
+    r = timer_settime(h->tid, 0, &it, NULL);
+    if(r<0) {
+        timer_delete(h->tid);
+        free(h); return -1;
+    }
+    h->inited = 1;
+    
+    return (int)h;
+}
+
+
+int timer_stop(int h)
+{
+    int r;
+    timer_handle_t *th=(timer_handle_t*)h;
+    
+    if(!th || !th->inited) {
+        return -1;
+    }
+    
+    r = timer_delete(th->tid);
+    th->inited = 0;
+    
+    free(th);
+    return r;
+}
+
+
+

+ 15 - 0
pro/ui/timer.h

@@ -0,0 +1,15 @@
+#ifndef __TIMER_Hx__
+#define __TIMER_Hx__
+
+
+typedef void (*timer_fn_t)(void *arg);
+
+int timer_start(int t1, int t2, int times, timer_fn_t fn, void *arg);
+int timer_stop(int h);
+
+
+#endif
+
+
+
+

+ 8 - 41
pro/ui/ui.c

@@ -1,7 +1,6 @@
 #include "ui.h"
-#include "lcd.h"
-#include "key.h"
-#include "beep.h"
+#include <unistd.h>
+#include "menu.h"
 #include "thread.h"
 
 
@@ -14,7 +13,6 @@
 #endif
 
 
-
 typedef struct {
     int fd;
     
@@ -22,41 +20,9 @@ typedef struct {
 static ui_handle_t uiHandle={0};
 
 
-
-static int menu_init(ui_handle_t *h)
-{ 
-    //key_init(h);
-    lcd_init(LCD_WIDTH,LCD_HEIGHT,LCD_COLOR);
-    
-    lcd_fill(0);
-    //lcd_draw_string(10, 10,  80, 30, "Smart 123456789", FONT_08, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-    lcd_draw_string(10, 10,  80, 30, "输出: 12.0V", FONT_12, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-    //lcd_draw_string(10, 40,  80, 30, "输出入通道: 12.0V", FONT_16, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-    //lcd_draw_string(10, 30, 80, 30, "Voltage: 22.4V", FONT_12, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
-    lcd_refresh();
-    
-    return 0;
-}
-static int menu_deinit(ui_handle_t *h)
+static void msleep(int ms)
 {
-    //key_deinit(h);
-    lcd_deinit();
-    
-    return 0;
-}
-static int menu_handle(ui_handle_t *h)
-{
-    int r;
-    
-    //r = key_get(h, &kd);
-    if(r==0) {
-        //switch(kd.key) {
-        //    case KEY_LEFT:
-        //    break;
-        //}
-    }
-    
-    return 0;
+    usleep(ms*1000);
 }
 static void *ui_thread(void *arg)
 {
@@ -64,11 +30,12 @@ static void *ui_thread(void *arg)
     thread_handle_t *th=(thread_handle_t*)arg;
     ui_handle_t *h=(ui_handle_t*)th->arg;
     
-    menu_init(h);
+    menu_init();
     while(th->quit==0) {
-        menu_handle(h);
+        menu_handle();
+        msleep(50);
     }
-    menu_deinit(h);
+    menu_deinit();
     
     pthread_exit(NULL);
 }