menu.c 24 KB

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