Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #ifndef UserInteface_H
- #define UserInteface_H
- #include <Arduino.h>
- #include "definitions.h"
- #include <Wire.h>
- #include "U8glib.h"
- #include "M2tk.h"
- #include "utility/m2ghu8g.h"
- #include "Bellringer.h"
- extern Bellringer ring;
- //=====================================================================================================================
- // U8g setup
- U8GLIB_SSD1306_128X64_2X u8g(U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST);
- //=====================================================================================================================
- // DECLARE KEY PINS
- uint8_t uiKeyUpPin = A8;
- uint8_t uiKeyDownPin = A9;
- uint8_t uiKeySelectPin = A10;
- uint8_t uiKeyExitPin = A11;
- //=====================================================================================================================
- char exitStr[] = "Exit";
- //=====================================================================================================================
- // Declare main menu
- M2_EXTERN_ALIGN(top_el_main_menu);
- // M2tk init
- 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
- //=====================================================================================================================
- // HAMMER STRIKING MENU
- // this procedure is called by the button
- void manstrike_fn_activate1(m2_el_fnarg_p fnarg) {
- ring.strikeBell(4);
- }
- void manstrike_fn_activate2(m2_el_fnarg_p fnarg) {
- ring.strikeBell(3);
- }
- void manstrike_fn_activate3(m2_el_fnarg_p fnarg) {
- ring.strikeBell(2);
- }
- void manstrike_fn_activate4(m2_el_fnarg_p fnarg) {
- ring.strikeBell(1);
- }
- void manstrike_fn_activate5(m2_el_fnarg_p fnarg) {
- ring.strikeBell(0);
- }
- M2_LABEL(el_manual_strike_menu_label, NULL, "Strike hammers");
- M2_BUTTON(el_manual_strike_menu_b1, "f4", "1", manstrike_fn_activate1);
- M2_BUTTON(el_manual_strike_menu_b2, "f4", "2", manstrike_fn_activate2);
- M2_BUTTON(el_manual_strike_menu_b3, "f4", "3", manstrike_fn_activate3);
- M2_BUTTON(el_manual_strike_menu_b4, "f4", "4", manstrike_fn_activate4);
- M2_BUTTON(el_manual_strike_menu_b5, "f4", "5", manstrike_fn_activate5);
- // cancel: do not store user values, go back directly
- M2_ROOT(el_manual_strike_menu_cancel, "f4", exitStr, &top_el_main_menu);
- M2_LIST(list_manual_strike_menu_buttons1) = {
- &el_manual_strike_menu_b1,
- &el_manual_strike_menu_b2,
- &el_manual_strike_menu_b3,
- &el_manual_strike_menu_b4,
- &el_manual_strike_menu_b5
- };
- M2_HLIST(el_manual_strike_menu_buttons1_hlist, NULL, list_manual_strike_menu_buttons1);
- M2_LIST(list_manual_strike_menu_buttons2) = {
- &el_manual_strike_menu_label,
- &el_manual_strike_menu_buttons1_hlist,
- &el_manual_strike_menu_cancel
- };
- M2_VLIST(el_manual_strike_menu_vlist, NULL, list_manual_strike_menu_buttons2);
- // center the menu on the display
- M2_ALIGN(top_el_manual_strike_menu, "-1|1W64H64", &el_manual_strike_menu_vlist);
- //=====================================================================================================================
- // MELLODY SELECTION SUBMENU CONFIGURATION
- uint8_t mellody_menu_first = 0;
- uint8_t mellody_menu_cnt = 11;
- const char* mellody_menu_labels[11] = { "432", "234", "321", "123", "4321", "1234", "4231", "1324", "4312", "3421", "NONE" };
- uint8_t mellody_index_to_mellody(uint8_t value) {
- switch (value) {
- case 0: return MEL_THR_FAL_432;
- case 1: return MEL_THR_RAI_234;
- case 2: return MEL_THR_FAL_321;
- case 3: return MEL_THR_RAI_123;
- case 4: return MEL_FOU_FAL_LIN;
- case 5: return MEL_FOU_RAI_LIN;
- case 6: return MEL_FOU_FAL_CRS;
- case 7: return MEL_FOU_RAI_CRS;
- case 8: return MEL_4312;
- case 9: return MEL_3421;
- case 10: return MEL_NONE;
- }
- return MEL_FOU_FAL_LIN;
- }
- // callback procedure for the STRLIST element
- const char *mellody_menu_cb(uint8_t idx, uint8_t msg) {
- if (msg == M2_STRLIST_MSG_SELECT) {
- // the user has selected an item
- ring.setMellody(mellody_index_to_mellody(idx));
- m2.setRoot(&top_el_main_menu); // Return to main menu
- }
- return mellody_menu_labels[idx];
- }
- M2_LABEL(el_mellody_menu_label, NULL, "Select mellody");
- M2_STRLIST(el_mellody_menu_strlist, "l3W56", &mellody_menu_first, &mellody_menu_cnt, mellody_menu_cb);
- M2_SPACE(el_mellody_menu_space, "W1h1");
- M2_VSB(el_mellody_menu_vsb, "l3W4r1", &mellody_menu_first, &mellody_menu_cnt);
- M2_LIST(list_mellody_menu) = {
- &el_mellody_menu_strlist,
- &el_mellody_menu_space,
- &el_mellody_menu_vsb
- };
- M2_HLIST(el_mellody_menu_hlist, NULL, list_mellody_menu);
- M2_LIST(list_mellody_menu2) = {
- &el_mellody_menu_label,
- &el_mellody_menu_hlist
- };
- M2_VLIST(el_mellody_menu_vlist, NULL, list_mellody_menu2);
- M2_ALIGN(top_el_mellody_menu, "-1|1W64H64", &el_mellody_menu_vlist);
- //=====================================================================================================================
- // RING SUBMENU CONFIGURATION
- // this procedure is called by the button
- void ring_fn_toggle1(m2_el_fnarg_p fnarg) {
- ring.manualBellTrigger(3);
- }
- void ring_fn_toggle2(m2_el_fnarg_p fnarg) {
- ring.manualBellTrigger(2);
- }
- void ring_fn_toggle3(m2_el_fnarg_p fnarg) {
- ring.manualBellTrigger(1);
- }
- void ring_fn_toggle4(m2_el_fnarg_p fnarg) {
- ring.manualBellTrigger(0);
- }
- void ring_fn_on(m2_el_fnarg_p fnarg) {
- ring.manualModeTrigger(true);
- }
- void ring_fn_off(m2_el_fnarg_p fnarg) {
- ring.manualModeTrigger(false);
- }
- M2_LABEL(el_ring_menu_label, NULL, "Ring bells");
- M2_BUTTON(el_ring_menu_b1, "f4", "1", ring_fn_toggle1);
- M2_BUTTON(el_ring_menu_b2, "f4", "2", ring_fn_toggle2);
- M2_BUTTON(el_ring_menu_b3, "f4", "3", ring_fn_toggle3);
- M2_BUTTON(el_ring_menu_b4, "f4", "4", ring_fn_toggle4);
- M2_LABEL(el_ring_menu_man_label, NULL, "Manual");
- M2_BUTTON(el_ring_menu_on, "f4", "on", ring_fn_on);
- M2_BUTTON(el_ring_menu_off, "f4", "off", ring_fn_off);
- M2_LIST(list_ring_menu_buttons_man) = {
- &el_ring_menu_man_label,
- &el_ring_menu_on,
- &el_ring_menu_off
- };
- M2_HLIST(el_ring_menu_man_hlist, NULL, list_ring_menu_buttons_man);
- // cancel: do not store user values, go back directly
- M2_ROOT(el_ring_menu_cancel, "f4", exitStr, &top_el_main_menu);
- // the following grid-list will arrange the elements on the display
- M2_LIST(list_ring_buttons) = {
- &el_ring_menu_b1,
- &el_ring_menu_b2,
- &el_ring_menu_b3,
- &el_ring_menu_b4
- };
- M2_HLIST(el_ring_menu_buttons_hlist, NULL, list_ring_buttons);
- M2_LIST(list_ring_menu) = {
- &el_ring_menu_label,
- &el_ring_menu_buttons_hlist,
- &el_ring_menu_man_hlist,
- &el_ring_menu_cancel
- };
- M2_VLIST(el_ring_menu_vlist, NULL, list_ring_menu);
- // center the menu on the display
- M2_ALIGN(top_el_ring_menu, "-1|1W64H64", &el_ring_menu_vlist);
- //=====================================================================================================================
- // MAIN MENU CONFIGURATION
- const char* main_menu_labels[] = { "Set mellody", "Ring bells", "Strike hammers" };
- uint8_t main_menu_first = 0;
- uint8_t main_menu_cnt = 3;
- // callback procedure for the STRLIST element
- const char *main_menu_cb(uint8_t idx, uint8_t msg) {
- if (msg == M2_STRLIST_MSG_SELECT) {
- // the user has selected an item, prepare sub menu
- // give control to the sub dialog
- switch (idx)
- {
- case 0:
- m2.setRoot(&top_el_mellody_menu);
- break;
- case 1:
- m2.setRoot(&top_el_ring_menu);
- break;
- case 2:
- m2.setRoot(&top_el_manual_strike_menu);
- break;
- }
- }
- return main_menu_labels[idx];
- }
- M2_LABEL(el_main_menu_label, NULL, "Main menu");
- M2_STRLIST(el_main_menu_strlist, "l3W56", &main_menu_first, &main_menu_cnt, main_menu_cb);
- M2_SPACE(el_main_menu_space, "W1h1");
- M2_VSB(el_main_menu_vsb, "l3W4r1", &main_menu_first, &main_menu_cnt);
- M2_LIST(list_main_menu) = { &el_main_menu_strlist, &el_main_menu_space, &el_main_menu_vsb };
- M2_HLIST(el_main_menu_hlist, NULL, list_main_menu);
- M2_LIST(list_main_menu2) = { &el_main_menu_label, &el_main_menu_hlist };
- M2_VLIST(el_main_menu_vlist, NULL, list_main_menu2);
- M2_ALIGN(top_el_main_menu, "-1|1W64H64", &el_main_menu_vlist);
- //=====================================================================================================================
- // u8glib
- void draw(void)
- {
- m2.draw(); // m2tklib
- }
- void updateUI()
- {
- // menu management
- m2.checkKey(); // Check for user input (debounces buttons)
- if (m2.handleKey() != 0) // Executes action tied to the button
- {
- // redraw the screen
- u8g.firstPage();
- do
- {
- draw();
- } while (u8g.nextPage());
- }
- }
- void setupUI()
- {
- pinMode(uiKeyUpPin, INPUT_PULLUP);
- pinMode(uiKeyDownPin, INPUT_PULLUP);
- pinMode(uiKeySelectPin, INPUT_PULLUP);
- pinMode(uiKeyExitPin, INPUT_PULLUP);
- /* connect u8glib with m2tklib */
- m2_SetU8g(u8g.getU8g(), m2_u8g_box_icon);
- /* assign u8g font to index 0 */
- m2.setFont(0, u8g_font_6x13r);
- // Setup keys
- m2.setPin(M2_KEY_SELECT, uiKeySelectPin);
- m2.setPin(M2_KEY_PREV, uiKeyUpPin);
- m2.setPin(M2_KEY_NEXT, uiKeyDownPin);
- m2.setPin(M2_KEY_EXIT, uiKeyExitPin);
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement