menu.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. #include <string.h>
  2. #include <unistd.h>
  3. #include "menu.h"
  4. #include "lcd.h"
  5. #include "led.h"
  6. #include "beep.h"
  7. #include "paras.h"
  8. #include "cascade.h"
  9. #include "elog.h"
  10. #include "thread.h"
  11. #include "common.h"
  12. #include "lang.h"
  13. #include "timer.h"
  14. #include "cfg.h"
  15. //#define TEXT_ALIGN
  16. #if 1
  17. #define LOGD log_d
  18. #define LOGE log_e
  19. #else
  20. #define LOGD printf
  21. #define LOGE printf
  22. #endif
  23. enum {
  24. MENU_SYSTEM=0,
  25. MENU_INPUT,
  26. MENU_OUTPUT,
  27. MENU_SENSOR,
  28. MENU_MODBUS,
  29. MENU_MAX
  30. };
  31. enum {
  32. MODBUS_ITEM_ADDR=0,
  33. MODBUS_ITEM_MODE,
  34. MODBUS_ITEM_SAVE,
  35. MODBUS_ITEM_QUIT,
  36. MODBUS_ITEM_MAX
  37. };
  38. enum {
  39. UFLAG_KEY=(1<<0),
  40. UFLAG_FLIP=(1<<1),
  41. UFLAG_TIMER=(1<<2),
  42. };
  43. typedef struct {
  44. int menu_id;
  45. int item_id;
  46. int item_max;
  47. }page_data_t;
  48. typedef struct {
  49. int menu_id;
  50. int menu_lv; //level
  51. page_data_t page[MENU_MAX];
  52. }menu_data_t;
  53. typedef struct {
  54. int fd;
  55. int tmr;
  56. int lang;
  57. int ph_in;
  58. int ph_out;
  59. int ch_out;
  60. int ch_out_max;
  61. menu_data_t menu;
  62. uint64_t ms;
  63. uint16_t uflag;
  64. int fliptime;
  65. }menu_handle_t;
  66. static int lang_id=LANG_ID_CHINESE;
  67. //static int lang_id=LANG_ID_ENGLISH;
  68. static menu_handle_t mnHandle={0};
  69. static inline GlobalDeviceManager* get_dm(void)
  70. {
  71. return &__globalDeviceManage;
  72. }
  73. static uint64_t get_ms(void)
  74. {
  75. struct timeval tv;
  76. gettimeofday(&tv, NULL);
  77. return (uint64_t)(tv.tv_sec)*1000 + (uint64_t)(tv.tv_usec)/1000;
  78. }
  79. static int get_ch_out_max(void)
  80. {
  81. int ch=0;
  82. GlobalPowerManger *tmp;
  83. GlobalDeviceManager *dm=get_dm();
  84. if(!thread_is_running(THREAD_ID_POWER)) {
  85. printf("777\n");
  86. return 0;
  87. }
  88. if(list_empty(&dm->_globalPowerManger.list)) {
  89. printf("8888\n");
  90. return 0;
  91. }
  92. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list) {
  93. ch++;
  94. }
  95. return ch;
  96. }
  97. static int is_ph3_in(GlobalDeviceManager *dm)
  98. {
  99. if ((dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree ||
  100. dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One ||
  101. dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One_B)) {
  102. return 1;
  103. }
  104. return 0;
  105. }
  106. static int is_ph3_out(GlobalDeviceManager *dm)
  107. {
  108. if (dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree) {
  109. return 1;
  110. }
  111. return 0;
  112. }
  113. static int get_input(GlobalDeviceManager *dm, int ph, PowerInfo *info)
  114. {
  115. int i=-1;
  116. GlobalTreeACManager *tmp3=NULL;
  117. if (is_ph3_in(dm)) {
  118. if(list_empty(&dm->_globalPowerManger.list_Tree_AC)) {
  119. return -1;
  120. }
  121. list_for_each_entry(tmp3, &dm->_globalPowerManger.list_Tree_AC, list_Tree_AC) {
  122. i++;
  123. if (i==ph)
  124. break;
  125. }
  126. if (tmp3) {
  127. *info = tmp3->_PowerInfo;
  128. }
  129. }
  130. else {
  131. *info = dm->_globalPowerManger._PowerInfo;
  132. }
  133. return 0;
  134. }
  135. static int get_output(GlobalDeviceManager *dm, int ch, int ph, PowerInfo *info)
  136. {
  137. int i=-1,j=-1;
  138. GlobalPowerManger *tmp;
  139. GlobalTreeACManager *tmp3 = NULL;
  140. list_for_each_entry(tmp, &dm->_globalPowerManger.list, list)
  141. {
  142. i++;
  143. if (i==ch) {
  144. if (is_ph3_out(dm)) {
  145. list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC)
  146. {
  147. j++;
  148. if(j==ph) {
  149. *info = tmp3->_PowerInfo;
  150. }
  151. }
  152. }
  153. else {
  154. *info = tmp->_PowerInfo;
  155. }
  156. return 0;
  157. }
  158. }
  159. return -1;
  160. }
  161. static void refresh_handler(void *arg, int last)
  162. {
  163. menu_handle_t *h=(menu_handle_t*)arg;
  164. h->uflag |= UFLAG_TIMER;
  165. if(last) {
  166. timer_stop(h->tmr);
  167. }
  168. }
  169. static void tmr_start(menu_handle_t *h, int ms)
  170. {
  171. if(h->tmr!=-1) {
  172. timer_stop(h->tmr);
  173. }
  174. timer_start(h->tmr, ms, -1, refresh_handler, h);
  175. }
  176. static void tmr_stop(menu_handle_t *h)
  177. {
  178. timer_stop(h->tmr);
  179. h->tmr = -1;
  180. }
  181. static void menu_system_paint(menu_handle_t *h, int font1, int font2, int item_h)
  182. {
  183. char time[60],tmp[100];
  184. lcd_fill(0);
  185. sprintf(tmp, "SmartPDU");
  186. lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
  187. sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_VER), VERSION);
  188. lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  189. get_curtime_str2(time, sizeof(time));
  190. sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_TIME), time);
  191. lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  192. sprintf(tmp, "IP:%s", getLocalIpAddress("eth0"));
  193. lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  194. lcd_refresh();
  195. if(h->menu.menu_lv==0 && h->uflag&UFLAG_FLIP) {
  196. h->menu.menu_id++;
  197. }
  198. }
  199. static void menu_input_paint(menu_handle_t *h, int font1, int font2, int item_h)
  200. {
  201. int r;
  202. char tmp[100];
  203. PowerInfo *pwr,info={0};
  204. GlobalDeviceManager *dm=get_dm();
  205. int ph3_in=is_ph3_in(dm);
  206. pwr = &info;
  207. sprintf(tmp, "%s", lang_get_str(h->lang, STR_ID_INPUT));
  208. r = get_input(dm, h->ph_in, &info);
  209. if(r==0) {
  210. if(ph3_in) {
  211. h->ph_in++;
  212. sprintf(tmp, "%s L%d", lang_get_str(h->lang, STR_ID_INPUT), h->ph_in);
  213. }
  214. }
  215. lcd_fill(0);
  216. lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
  217. #ifdef TEXT_ALIGN
  218. sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_VOLTAGE), pwr->voltage);
  219. lcd_draw_string(0, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  220. sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
  221. lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  222. sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_POWER), pwr->power);
  223. lcd_draw_string(0, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  224. sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
  225. lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  226. #else
  227. 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);
  228. lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  229. 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);
  230. lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  231. #endif
  232. sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), pwr->consumption);
  233. lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  234. lcd_refresh();
  235. if(ph3_in) {
  236. if(h->ph_in==3) {
  237. h->ph_in = 0;
  238. h->menu.menu_id++;
  239. }
  240. }
  241. else {
  242. h->menu.menu_id++;
  243. }
  244. }
  245. static void menu_output_paint(menu_handle_t *h, int font1, int font2, int item_h)
  246. {
  247. int r;
  248. char tmp[100];
  249. PowerInfo *pwr,info={0};
  250. GlobalDeviceManager *dm=get_dm();
  251. pwr = &info;
  252. h->ch_out_max = get_ch_out_max();
  253. sprintf(tmp, "%s", lang_get_str(h->lang, STR_ID_OUTPUT));
  254. r = get_output(dm, h->ch_out, h->ph_out, &info);
  255. if(r==0) {
  256. h->ch_out++;
  257. if(h->ch_out_max>0) {
  258. sprintf(tmp, "%s CH%d", lang_get_str(h->lang, STR_ID_OUTPUT), h->ch_out+1);
  259. }
  260. }
  261. lcd_fill(0);
  262. lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
  263. char *pon=((pwr->status)?lang_get_str(h->lang, STR_ID_ON):lang_get_str(h->lang, STR_ID_OFF));
  264. #ifdef TEXT_ALIGN
  265. sprintf(tmp, "%s:%s", lang_get_str(h->lang, STR_ID_SWITCH), pon);
  266. lcd_draw_string(0, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  267. sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CURRENT), pwr->current);
  268. lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  269. sprintf(tmp, "%s:%0.2f ", lang_get_str(h->lang, STR_ID_POWER), pwr->power);
  270. lcd_draw_string(0, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  271. sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_FACTOR), pwr->factor);
  272. lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  273. #else
  274. 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);
  275. lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  276. 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);
  277. lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  278. #endif
  279. sprintf(tmp, "%s:%0.2f", lang_get_str(h->lang, STR_ID_CONSUMP), pwr->consumption);
  280. lcd_draw_string(0, item_h*3, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  281. lcd_refresh();
  282. if(h->ch_out==h->ch_out_max) {
  283. h->ch_out = 0;
  284. h->menu.menu_id++;
  285. }
  286. }
  287. static void menu_sensor_paint(menu_handle_t *h, int font1, int font2, int item_h)
  288. {
  289. char tmp[100];
  290. GlobalDeviceManager *dm=get_dm();
  291. lcd_fill(0);
  292. sprintf(tmp, "%s/%s", lang_get_str(h->lang, STR_ID_TEMP), lang_get_str(h->lang, STR_ID_HUMI));
  293. lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
  294. #ifdef TEXT_ALIGN
  295. sprintf(tmp, "%s:", lang_get_str(h->lang, STR_ID_TEMP));
  296. lcd_draw_string(0, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  297. sprintf(tmp, "%0.1f", dm->g_modebus_read.temprature/100.0f);
  298. lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  299. sprintf(tmp, "%s:", lang_get_str(h->lang, STR_ID_HUMI));
  300. lcd_draw_string(0, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  301. sprintf(tmp, "%0.1f", dm->g_modebus_read.humidity/100.0f);
  302. lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  303. #else
  304. sprintf(tmp, " %s: %0.1f", lang_get_str(h->lang, STR_ID_TEMP), dm->g_modebus_read.temprature/100.0f);
  305. lcd_draw_string(0, item_h, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  306. sprintf(tmp, " %s: %0.1f", lang_get_str(h->lang, STR_ID_HUMI), dm->g_modebus_read.humidity/100.0f);
  307. lcd_draw_string(0, item_h*2, LCD_WIDTH, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  308. #endif
  309. lcd_refresh();
  310. if(h->menu.menu_lv==0 && h->uflag&UFLAG_FLIP) {
  311. h->menu.menu_id++;
  312. }
  313. }
  314. static int menu_modbus_handle(menu_handle_t *h, ModbusInfo_t *pmb, key_val_t *kv)
  315. {
  316. int r=-1;
  317. switch(kv->key) {
  318. case KEY_UP:
  319. {
  320. if(h->menu.menu_lv==1) {
  321. if(h->menu.page[h->menu.menu_id].item_id>0) {
  322. h->menu.page[h->menu.menu_id].item_id--;
  323. }
  324. else {
  325. h->menu.page[h->menu.menu_id].item_id = MODBUS_ITEM_QUIT;
  326. }
  327. }
  328. else if(h->menu.menu_lv==2) {
  329. if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_ADDR) { //addr
  330. if(pmb->addr<CASCADE_MAX) {
  331. pmb->addr++;
  332. }
  333. else {
  334. pmb->addr = 1;
  335. }
  336. }
  337. else if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_MODE) { //mode
  338. pmb->mode = !pmb->mode;
  339. }
  340. }
  341. }
  342. break;
  343. case KEY_DOWN:
  344. {
  345. if(h->menu.menu_lv==1) {
  346. if(h->menu.page[h->menu.menu_id].item_id<MODBUS_ITEM_QUIT) {
  347. h->menu.page[h->menu.menu_id].item_id++;
  348. }
  349. else {
  350. h->menu.page[h->menu.menu_id].item_id = 0;
  351. }
  352. }
  353. else if(h->menu.menu_lv==2) {
  354. if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_ADDR) { //addr
  355. if(pmb->addr) {
  356. pmb->addr--;
  357. }
  358. else {
  359. pmb->addr = CASCADE_MAX;
  360. }
  361. }
  362. else if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_MODE) { //mode
  363. pmb->mode = !pmb->mode;
  364. }
  365. }
  366. }
  367. break;
  368. case KEY_OK:
  369. {
  370. if(h->menu.menu_lv==1) {
  371. if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_SAVE || h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_QUIT) { //save
  372. if(h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_SAVE) {
  373. r = cascade_set_modbus(pmb);
  374. if(r==0) {
  375. r = paras_save();
  376. }
  377. }
  378. h->menu.page[h->menu.menu_id].item_id = 0;
  379. h->menu.menu_lv = 0;
  380. tmr_stop(h);
  381. }
  382. else {
  383. h->menu.menu_lv = 2;
  384. tmr_start(h, 500);
  385. }
  386. }
  387. else if(h->menu.menu_lv==2) {
  388. h->menu.menu_lv = 1;
  389. }
  390. else {
  391. if(kv->type==TYPE_LONG) {
  392. h->menu.menu_lv = 1;
  393. }
  394. }
  395. }
  396. break;
  397. }
  398. return r;
  399. }
  400. static void menu_modbus_paint(menu_handle_t *h, int font1, int font2, int item_h, key_val_t *kv)
  401. {
  402. int r,font_color;
  403. char tmp[100];
  404. static uint8_t flash_cnt=0;
  405. GlobalDeviceManager *dm=get_dm();
  406. static ModbusInfo_t *pmb,mb_cas;
  407. GlobalDeviceInfo *dev=&dm->_globalDevInfo;
  408. if(h->menu.menu_lv) {
  409. pmb = &mb_cas;
  410. }
  411. else {
  412. mb_cas = dev->cascade;
  413. pmb = &dev->cascade;
  414. }
  415. r = menu_modbus_handle(h, pmb, kv);
  416. if(r==0) {
  417. dev->cascade = mb_cas;
  418. }
  419. if(kv->key==-1) {
  420. flash_cnt++;
  421. }
  422. lcd_fill(0);
  423. sprintf(tmp, "MODBUS %s", lang_get_str(h->lang, STR_ID_SETT));
  424. lcd_draw_string(0, 0, LCD_WIDTH, item_h, tmp, font1, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
  425. font_color = COLOR_WHITE;
  426. if(h->menu.menu_lv && h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_ADDR) {
  427. if(h->menu.menu_lv==2) {
  428. font_color = (flash_cnt%2)?COLOR_WHITE:COLOR_BLACK;
  429. }
  430. sprintf(tmp, ">%s:", lang_get_str(h->lang, STR_ID_ADDR));
  431. }
  432. else {
  433. sprintf(tmp, " %s:", lang_get_str(h->lang, STR_ID_ADDR));
  434. }
  435. lcd_draw_string(0, item_h, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  436. sprintf(tmp, "%d", pmb->addr);
  437. lcd_draw_string(LCD_WIDTH/2, item_h, LCD_WIDTH/2, item_h, tmp, font2, font_color, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  438. font_color = COLOR_WHITE;
  439. if(h->menu.menu_lv && h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_MODE) {
  440. if(h->menu.menu_lv==2) {
  441. font_color = (flash_cnt%2)?COLOR_WHITE:COLOR_BLACK;
  442. }
  443. sprintf(tmp, ">%s:", lang_get_str(h->lang, STR_ID_MODE));
  444. }
  445. else {
  446. sprintf(tmp, " %s:", lang_get_str(h->lang, STR_ID_MODE));
  447. }
  448. lcd_draw_string(0, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  449. sprintf(tmp, "%s", (pmb->mode==MODBUS_MASTER)?lang_get_str(h->lang, STR_ID_MASTER):lang_get_str(h->lang, STR_ID_SLAVE));
  450. lcd_draw_string(LCD_WIDTH/2, item_h*2, LCD_WIDTH/2, item_h, tmp, font2, font_color, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
  451. font_color = COLOR_WHITE;
  452. if(h->menu.menu_lv && h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_SAVE) {
  453. if(h->menu.menu_lv==2) {
  454. font_color = (flash_cnt%2)?COLOR_WHITE:COLOR_BLACK;
  455. }
  456. sprintf(tmp, ">%s", lang_get_str(h->lang, STR_ID_SAVE));
  457. }
  458. else {
  459. sprintf(tmp, " %s", lang_get_str(h->lang, STR_ID_SAVE));
  460. }
  461. lcd_draw_string(0, item_h*3, LCD_WIDTH/2, item_h, tmp, font2, font_color, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
  462. font_color = COLOR_WHITE;
  463. if(h->menu.menu_lv && h->menu.page[h->menu.menu_id].item_id==MODBUS_ITEM_QUIT) {
  464. if(h->menu.menu_lv==2) {
  465. font_color = (flash_cnt%2)?COLOR_WHITE:COLOR_BLACK;
  466. }
  467. sprintf(tmp, ">%s", lang_get_str(h->lang, STR_ID_QUIT));
  468. }
  469. else {
  470. sprintf(tmp, " %s", lang_get_str(h->lang, STR_ID_QUIT));
  471. }
  472. lcd_draw_string(LCD_WIDTH/2, item_h*3, LCD_WIDTH/2, item_h, tmp, font2, font_color, COLOR_BLACK, HORIZONTAL_CENTER, VERTICAL_CENTER);
  473. lcd_refresh();
  474. if(h->menu.menu_lv==0 && h->uflag&UFLAG_FLIP) {
  475. h->menu.menu_id = MENU_SYSTEM;
  476. }
  477. }
  478. /////////////////////////////////////////////////
  479. int menu_init(void)
  480. {
  481. int i;
  482. menu_handle_t *h=&mnHandle;
  483. MiscInfo_t *misc=&get_dm()->_globalDevInfo.misc;
  484. memset(h, 0, sizeof(menu_handle_t));
  485. h->lang = lang_id;
  486. h->tmr = timer_init();
  487. h->ms = get_ms();
  488. h->uflag = 1;
  489. h->fliptime = misc->flip_time*1000;
  490. h->ph_in = 0;
  491. h->ph_out = 0;
  492. h->ch_out = 0;
  493. h->ch_out_max = 0;
  494. h->menu.menu_id = 0;
  495. h->menu.menu_lv = 0;
  496. for(i=0; i<MENU_MAX; i++) {
  497. h->menu.page[i].menu_id = i;
  498. h->menu.page[i].item_id = 0;
  499. h->menu.page[i].item_max = 0;
  500. }
  501. key_init();
  502. led_init();
  503. beep_init();
  504. lcd_init(LCD_WIDTH,LCD_HEIGHT,LCD_COLOR);
  505. lcd_rotate(misc->rotate);
  506. return 0;
  507. }
  508. int menu_deinit(void)
  509. {
  510. menu_handle_t *h=&mnHandle;
  511. timer_deinit(h->tmr);
  512. lcd_deinit();
  513. key_deinit();
  514. led_deinit();
  515. beep_deinit();
  516. return 0;
  517. }
  518. static void key_remap(key_val_t *kv, int rotate)
  519. {
  520. key_print(kv);
  521. if(rotate==180) {
  522. if(kv->key==KEY_UP) {
  523. kv->key = KEY_DOWN;
  524. }
  525. else if(kv->key==KEY_DOWN) {
  526. kv->key = KEY_UP;
  527. }
  528. }
  529. }
  530. int menu_handle(void)
  531. {
  532. int r;
  533. key_val_t kv;
  534. int rotate=lcd_get_rotate();
  535. int item_h=LCD_HEIGHT/4;
  536. int font1=FONT_12,font2=FONT_12;
  537. menu_handle_t *h=&mnHandle;
  538. r = key_get(&kv); key_remap(&kv, rotate);
  539. switch(kv.key) {
  540. case KEY_OK:
  541. {
  542. if(kv.type==TYPE_SHORT) {
  543. if(h->menu.menu_lv==0) {
  544. #if 0
  545. if(rotate==0) {
  546. lcd_rotate(180);
  547. }
  548. else {
  549. lcd_rotate(0);
  550. }
  551. #endif
  552. }
  553. }
  554. h->uflag |= UFLAG_KEY;
  555. }
  556. break;
  557. case KEY_UP:
  558. {
  559. led_reset(); beep_reset();
  560. if(h->menu.menu_lv==0 && kv.type==TYPE_SHORT) {
  561. if(h->menu.menu_id>0) {
  562. h->menu.menu_id--;
  563. }
  564. else {
  565. h->menu.menu_id = MENU_MAX-1;
  566. }
  567. }
  568. h->uflag |= UFLAG_KEY;
  569. }
  570. break;
  571. case KEY_DOWN:
  572. {
  573. led_reset(); beep_reset();
  574. if(h->menu.menu_lv==0 && kv.type==TYPE_SHORT) {
  575. if(h->menu.menu_id<MENU_MAX-1) {
  576. h->menu.menu_id++;
  577. }
  578. else {
  579. h->menu.menu_id = 0;
  580. }
  581. }
  582. h->uflag |= UFLAG_KEY;
  583. }
  584. break;
  585. default:
  586. {
  587. #if 1
  588. if(h->fliptime>0) {
  589. if(h->menu.menu_lv==0) {
  590. if((get_ms()-h->ms)>=h->fliptime) {
  591. h->uflag = UFLAG_FLIP;
  592. h->ms = get_ms();
  593. }
  594. }
  595. else {
  596. h->ms = get_ms();
  597. }
  598. }
  599. #endif
  600. }
  601. }
  602. if(h->uflag==0) {
  603. return -1;
  604. }
  605. switch(h->menu.menu_id) {
  606. case MENU_SYSTEM:
  607. {
  608. menu_system_paint(h, font1, font2, item_h);
  609. }
  610. break;
  611. case MENU_INPUT:
  612. {
  613. menu_input_paint(h, font1, font2, item_h);
  614. }
  615. break;
  616. case MENU_OUTPUT:
  617. {
  618. menu_output_paint(h, font1, font2, item_h);
  619. }
  620. break;
  621. case MENU_SENSOR:
  622. {
  623. menu_sensor_paint(h, font1, font2, item_h);
  624. }
  625. break;
  626. case MENU_MODBUS:
  627. {
  628. menu_modbus_paint(h, font1, font2, item_h, &kv);
  629. }
  630. break;
  631. }
  632. h->uflag = 0;
  633. return 0;
  634. }