Advertisement
Guest User

UI module

a guest
Jan 19th, 2016
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.93 KB | None | 0 0
  1. #pragma once
  2.  
  3. #ifndef UserInteface_H
  4. #define UserInteface_H
  5.  
  6. #include <Arduino.h>
  7. #include "definitions.h"
  8. #include <Wire.h>
  9. #include "U8glib.h"
  10. #include "M2tk.h"
  11. #include "utility/m2ghu8g.h"
  12. #include "Bellringer.h"
  13.  
  14. extern Bellringer ring;
  15.  
  16. //=====================================================================================================================
  17.  
  18. // U8g setup
  19. U8GLIB_SSD1306_128X64_2X u8g(U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST);
  20.  
  21. //=====================================================================================================================
  22.  
  23. // DECLARE KEY PINS
  24.  
  25. uint8_t uiKeyUpPin = A8;
  26. uint8_t uiKeyDownPin = A9;
  27. uint8_t uiKeySelectPin = A10;
  28. uint8_t uiKeyExitPin = A11;
  29.  
  30. //=====================================================================================================================
  31.  
  32. char exitStr[] = "Exit";
  33.  
  34. //=====================================================================================================================
  35.  
  36. // Declare main menu
  37. M2_EXTERN_ALIGN(top_el_main_menu);
  38.  
  39. // M2tk init
  40. M2tk m2(&top_el_main_menu, m2_es_arduino, m2_eh_4bs, m2_gh_u8g_fb); // a class M2tk, which defines the access to the m2tklib
  41.  
  42. //=====================================================================================================================
  43.  
  44. // HAMMER STRIKING MENU
  45.  
  46. // this procedure is called by the button
  47. void manstrike_fn_activate1(m2_el_fnarg_p fnarg) {
  48.     ring.strikeBell(4);
  49. }
  50.  
  51. void manstrike_fn_activate2(m2_el_fnarg_p fnarg) {
  52.     ring.strikeBell(3);
  53. }
  54.  
  55. void manstrike_fn_activate3(m2_el_fnarg_p fnarg) {
  56.     ring.strikeBell(2);
  57. }
  58.  
  59. void manstrike_fn_activate4(m2_el_fnarg_p fnarg) {
  60.     ring.strikeBell(1);
  61. }
  62.  
  63. void manstrike_fn_activate5(m2_el_fnarg_p fnarg) {
  64.     ring.strikeBell(0);
  65. }
  66.  
  67. M2_LABEL(el_manual_strike_menu_label, NULL, "Strike hammers");
  68.  
  69. M2_BUTTON(el_manual_strike_menu_b1, "f4", "1", manstrike_fn_activate1);
  70. M2_BUTTON(el_manual_strike_menu_b2, "f4", "2", manstrike_fn_activate2);
  71. M2_BUTTON(el_manual_strike_menu_b3, "f4", "3", manstrike_fn_activate3);
  72. M2_BUTTON(el_manual_strike_menu_b4, "f4", "4", manstrike_fn_activate4);
  73. M2_BUTTON(el_manual_strike_menu_b5, "f4", "5", manstrike_fn_activate5);
  74.  
  75. // cancel: do not store user values, go back directly
  76. M2_ROOT(el_manual_strike_menu_cancel, "f4", exitStr, &top_el_main_menu);
  77.  
  78. M2_LIST(list_manual_strike_menu_buttons1) = {
  79.     &el_manual_strike_menu_b1,
  80.     &el_manual_strike_menu_b2,
  81.     &el_manual_strike_menu_b3,
  82.     &el_manual_strike_menu_b4,
  83.     &el_manual_strike_menu_b5
  84. };
  85.  
  86. M2_HLIST(el_manual_strike_menu_buttons1_hlist, NULL, list_manual_strike_menu_buttons1);
  87. M2_LIST(list_manual_strike_menu_buttons2) = {
  88.     &el_manual_strike_menu_label,
  89.     &el_manual_strike_menu_buttons1_hlist,
  90.     &el_manual_strike_menu_cancel
  91. };
  92. M2_VLIST(el_manual_strike_menu_vlist, NULL, list_manual_strike_menu_buttons2);
  93.  
  94. // center the menu on the display
  95. M2_ALIGN(top_el_manual_strike_menu, "-1|1W64H64", &el_manual_strike_menu_vlist);
  96.  
  97. //=====================================================================================================================
  98.  
  99. // MELLODY SELECTION SUBMENU CONFIGURATION
  100.  
  101. uint8_t mellody_menu_first = 0;
  102. uint8_t mellody_menu_cnt = 11;
  103.  
  104. const char* mellody_menu_labels[11] = { "432", "234", "321", "123", "4321", "1234", "4231", "1324", "4312", "3421", "NONE" };
  105.  
  106. uint8_t mellody_index_to_mellody(uint8_t value) {
  107.     switch (value) {
  108.     case 0: return MEL_THR_FAL_432;
  109.     case 1: return MEL_THR_RAI_234;
  110.     case 2: return MEL_THR_FAL_321;
  111.     case 3: return MEL_THR_RAI_123;
  112.     case 4: return MEL_FOU_FAL_LIN;
  113.     case 5: return MEL_FOU_RAI_LIN;
  114.     case 6: return MEL_FOU_FAL_CRS;
  115.     case 7: return MEL_FOU_RAI_CRS;
  116.     case 8: return MEL_4312;
  117.     case 9: return MEL_3421;
  118.     case 10: return MEL_NONE;
  119.     }
  120.     return MEL_FOU_FAL_LIN;
  121. }
  122.  
  123. // callback procedure for the STRLIST element
  124. const char *mellody_menu_cb(uint8_t idx, uint8_t msg) {
  125.     if (msg == M2_STRLIST_MSG_SELECT) {
  126.         // the user has selected an item
  127.  
  128.         ring.setMellody(mellody_index_to_mellody(idx));
  129.         m2.setRoot(&top_el_main_menu); // Return to main menu
  130.     }
  131.     return mellody_menu_labels[idx];
  132. }
  133.  
  134. M2_LABEL(el_mellody_menu_label, NULL, "Select mellody");
  135.  
  136. M2_STRLIST(el_mellody_menu_strlist, "l3W56", &mellody_menu_first, &mellody_menu_cnt, mellody_menu_cb);
  137. M2_SPACE(el_mellody_menu_space, "W1h1");
  138. M2_VSB(el_mellody_menu_vsb, "l3W4r1", &mellody_menu_first, &mellody_menu_cnt);
  139. M2_LIST(list_mellody_menu) = {
  140.     &el_mellody_menu_strlist,
  141.     &el_mellody_menu_space,
  142.     &el_mellody_menu_vsb
  143. };
  144. M2_HLIST(el_mellody_menu_hlist, NULL, list_mellody_menu);
  145.  
  146. M2_LIST(list_mellody_menu2) = {
  147.     &el_mellody_menu_label,
  148.     &el_mellody_menu_hlist
  149. };
  150. M2_VLIST(el_mellody_menu_vlist, NULL, list_mellody_menu2);
  151. M2_ALIGN(top_el_mellody_menu, "-1|1W64H64", &el_mellody_menu_vlist);
  152.  
  153. //=====================================================================================================================
  154.  
  155. // RING SUBMENU CONFIGURATION
  156.  
  157. // this procedure is called by the button
  158. void ring_fn_toggle1(m2_el_fnarg_p fnarg) {
  159.     ring.manualBellTrigger(3);
  160. }
  161.  
  162. void ring_fn_toggle2(m2_el_fnarg_p fnarg) {
  163.     ring.manualBellTrigger(2);
  164. }
  165.  
  166. void ring_fn_toggle3(m2_el_fnarg_p fnarg) {
  167.     ring.manualBellTrigger(1);
  168. }
  169.  
  170. void ring_fn_toggle4(m2_el_fnarg_p fnarg) {
  171.     ring.manualBellTrigger(0);
  172. }
  173.  
  174. void ring_fn_on(m2_el_fnarg_p fnarg) {
  175.     ring.manualModeTrigger(true);
  176. }
  177.  
  178. void ring_fn_off(m2_el_fnarg_p fnarg) {
  179.     ring.manualModeTrigger(false);
  180. }
  181.  
  182. M2_LABEL(el_ring_menu_label, NULL, "Ring bells");
  183.  
  184. M2_BUTTON(el_ring_menu_b1, "f4", "1", ring_fn_toggle1);
  185. M2_BUTTON(el_ring_menu_b2, "f4", "2", ring_fn_toggle2);
  186. M2_BUTTON(el_ring_menu_b3, "f4", "3", ring_fn_toggle3);
  187. M2_BUTTON(el_ring_menu_b4, "f4", "4", ring_fn_toggle4);
  188.  
  189. M2_LABEL(el_ring_menu_man_label, NULL, "Manual");
  190. M2_BUTTON(el_ring_menu_on, "f4", "on", ring_fn_on);
  191. M2_BUTTON(el_ring_menu_off, "f4", "off", ring_fn_off);
  192. M2_LIST(list_ring_menu_buttons_man) = {
  193.     &el_ring_menu_man_label,
  194.     &el_ring_menu_on,
  195.     &el_ring_menu_off
  196. };
  197. M2_HLIST(el_ring_menu_man_hlist, NULL, list_ring_menu_buttons_man);
  198.  
  199. // cancel: do not store user values, go back directly
  200. M2_ROOT(el_ring_menu_cancel, "f4", exitStr, &top_el_main_menu);
  201.  
  202. // the following grid-list will arrange the elements on the display
  203. M2_LIST(list_ring_buttons) = {
  204.     &el_ring_menu_b1,
  205.     &el_ring_menu_b2,
  206.     &el_ring_menu_b3,
  207.     &el_ring_menu_b4
  208. };
  209.  
  210. M2_HLIST(el_ring_menu_buttons_hlist, NULL, list_ring_buttons);
  211. M2_LIST(list_ring_menu) = {
  212.     &el_ring_menu_label,
  213.     &el_ring_menu_buttons_hlist,
  214.     &el_ring_menu_man_hlist,
  215.     &el_ring_menu_cancel
  216. };
  217. M2_VLIST(el_ring_menu_vlist, NULL, list_ring_menu);
  218.  
  219. // center the menu on the display
  220. M2_ALIGN(top_el_ring_menu, "-1|1W64H64", &el_ring_menu_vlist);
  221.  
  222. //=====================================================================================================================
  223.  
  224. // MAIN MENU CONFIGURATION
  225.  
  226. const char* main_menu_labels[] = { "Set mellody", "Ring bells", "Strike hammers" };
  227.  
  228. uint8_t main_menu_first = 0;
  229. uint8_t main_menu_cnt = 3;
  230.  
  231. // callback procedure for the STRLIST element
  232. const char *main_menu_cb(uint8_t idx, uint8_t msg) {
  233.     if (msg == M2_STRLIST_MSG_SELECT) {
  234.         // the user has selected an item, prepare sub menu
  235.  
  236.         // give control to the sub dialog
  237.         switch (idx)
  238.         {
  239.         case 0:
  240.             m2.setRoot(&top_el_mellody_menu);
  241.             break;
  242.         case 1:
  243.             m2.setRoot(&top_el_ring_menu);
  244.             break;
  245.         case 2:
  246.             m2.setRoot(&top_el_manual_strike_menu);
  247.             break;
  248.         }
  249.     }
  250.     return main_menu_labels[idx];
  251. }
  252.  
  253. M2_LABEL(el_main_menu_label, NULL, "Main menu");
  254. M2_STRLIST(el_main_menu_strlist, "l3W56", &main_menu_first, &main_menu_cnt, main_menu_cb);
  255. M2_SPACE(el_main_menu_space, "W1h1");
  256. M2_VSB(el_main_menu_vsb, "l3W4r1", &main_menu_first, &main_menu_cnt);
  257. M2_LIST(list_main_menu) = { &el_main_menu_strlist, &el_main_menu_space, &el_main_menu_vsb };
  258. M2_HLIST(el_main_menu_hlist, NULL, list_main_menu);
  259. M2_LIST(list_main_menu2) = { &el_main_menu_label, &el_main_menu_hlist };
  260. M2_VLIST(el_main_menu_vlist, NULL, list_main_menu2);
  261. M2_ALIGN(top_el_main_menu, "-1|1W64H64", &el_main_menu_vlist);
  262. //=====================================================================================================================
  263.  
  264. // u8glib
  265. void draw(void)
  266. {
  267.     m2.draw(); // m2tklib
  268. }
  269.  
  270. void updateUI()
  271. {
  272.     // menu management
  273.     m2.checkKey(); // Check for user input (debounces buttons)
  274.     if (m2.handleKey() != 0) // Executes action tied to the button
  275.     {
  276.         // redraw the screen
  277.         u8g.firstPage();
  278.         do
  279.         {
  280.             draw();
  281.         } while (u8g.nextPage());
  282.     }
  283. }
  284.  
  285. void setupUI()
  286. {
  287.     pinMode(uiKeyUpPin, INPUT_PULLUP);
  288.     pinMode(uiKeyDownPin, INPUT_PULLUP);
  289.     pinMode(uiKeySelectPin, INPUT_PULLUP);
  290.     pinMode(uiKeyExitPin, INPUT_PULLUP);
  291.  
  292.     /* connect u8glib with m2tklib */
  293.     m2_SetU8g(u8g.getU8g(), m2_u8g_box_icon);
  294.  
  295.     /* assign u8g font to index 0 */
  296.     m2.setFont(0, u8g_font_6x13r);
  297.  
  298.     // Setup keys
  299.     m2.setPin(M2_KEY_SELECT, uiKeySelectPin);
  300.     m2.setPin(M2_KEY_PREV, uiKeyUpPin);
  301.     m2.setPin(M2_KEY_NEXT, uiKeyDownPin);
  302.     m2.setPin(M2_KEY_EXIT, uiKeyExitPin);
  303. }
  304.  
  305. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement