Po długim grzebaniu w sieci znalazłem kod "startowy" do zrobienia sobie nawigacji menu. Jako że nie jestem programistą chciałem poprzerabiać sobie kod aby uzyskać następującą strukturę:
sam kod był praktycznie bez komentarza więc nie mogę ogarnąć tematu co za co odpowiada i jak i gdzie go rozbudować. Pierwszy poziom (główny) generalnie się wyświetla i na początek jest OK.
Kod jest następujący:
Moje pytania:
- gdzie buduje się (i jak) dodawać kolejne pod poziomy MENU,
- jak zmienić podświetlanie linii w zwykły wskaźnik np: ->,
- co i jak ustawić aby menu wyświetlało się w następujący sposób:
Kod:
// ------------------- SCHEMAT NAWIGACJI MENU -------------------------------
MENU:
ZEGAR: - > GODZINA 00:00
KONIEC
TWARDOŚĆ KH: - > 0 - 20 (do wyboru z zakresu)
KONIEC
LAMPA: - > GODZINA START 00:00
GODZINA STOP 00:00
MANUAL: (0-255) bezpośrednie rozjaśnianie i ściemnianie lampy
KONIEC
WIATRAK: - > TEMPERATURA 20-30
HISTEREZA 0.0-1.0 (w kroku co 0.1)
KONIEC
WYJŚCIE (z menu do panelu głównego)
Kod jest następujący:
Kod:
#include "U8glib.h"
U8GLIB_ST7920_128X64_1X u8g(13, 12, 11); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
#define KEY_NONE 0
#define KEY_PREV 1
#define KEY_NEXT 2
#define KEY_SELECT 3
#define KEY_BACK 4
uint8_t uiKeyPrev = 7;
uint8_t uiKeyNext = 8;
uint8_t uiKeySelect = 9;
uint8_t uiKeyBack = 4;
uint8_t uiKeyCodeFirst = KEY_NONE;
uint8_t uiKeyCodeSecond = KEY_NONE;
uint8_t uiKeyCode = KEY_NONE;
void uiSetup(void) {
pinMode(uiKeyPrev, INPUT_PULLUP); // ustawienie pinu pullup
pinMode(uiKeyNext, INPUT_PULLUP); // ustawienie pinu pullup
pinMode(uiKeySelect, INPUT_PULLUP); // ustawienie pinu pullup
pinMode(uiKeyBack, INPUT_PULLUP); // ustawienie pinu pullup
}
void uiStep(void) {
uiKeyCodeSecond = uiKeyCodeFirst;
if ( digitalRead(uiKeyPrev) == LOW )
uiKeyCodeFirst = KEY_PREV;
else if ( digitalRead(uiKeyNext) == LOW )
uiKeyCodeFirst = KEY_NEXT;
else if ( digitalRead(uiKeySelect) == LOW )
uiKeyCodeFirst = KEY_SELECT;
else if ( digitalRead(uiKeyBack) == LOW )
uiKeyCodeFirst = KEY_BACK;
else
uiKeyCodeFirst = KEY_NONE;
if ( uiKeyCodeSecond == uiKeyCodeFirst )
uiKeyCode = uiKeyCodeFirst;
else
uiKeyCode = KEY_NONE;
}
#define MENU_ITEMS 5
const char *menu_strings[MENU_ITEMS] = { "ZEGAR", "TWARDOSC HK", "LAMPA", "WIATRAK", "WYJSCIE" };
uint8_t menu_current = 0;
uint8_t menu_redraw_required = 0;
uint8_t last_key_code = KEY_NONE;
void drawMenu(void) {
uint8_t i, h;
u8g_uint_t w, d;
u8g.setFont(u8g_font_6x13);
u8g.setFontRefHeightText();
u8g.setFontPosTop();
h = u8g.getFontAscent()-u8g.getFontDescent();
w = u8g.getWidth();
for( i = 0; i < MENU_ITEMS; i++ ) {
d = (w-u8g.getStrWidth(menu_strings[i]))/2;
u8g.setDefaultForegroundColor();
if ( i == menu_current ) {
u8g.drawBox(0, i*h+1, w, h);
u8g.setDefaultBackgroundColor();
}
u8g.drawStr(d, i*h, menu_strings[i]);
}
}
void updateMenu(void) {
if ( uiKeyCode != KEY_NONE && last_key_code == uiKeyCode ) {
return;
}
last_key_code = uiKeyCode;
switch ( uiKeyCode ) {
case KEY_NEXT:
menu_current++;
if ( menu_current >= MENU_ITEMS )
menu_current = 0;
menu_redraw_required = 1;
break;
case KEY_PREV:
if ( menu_current == 0 )
menu_current = MENU_ITEMS;
menu_current--;
menu_redraw_required = 1;
break;
}
}
void setup() {
// rotate screen, if required
// u8g.setRot180();
uiSetup(); // setup key detection and debounce algorithm
menu_redraw_required = 1; // force initial redraw
}
void loop() {
uiStep(); // check for key press
if ( menu_redraw_required != 0 ) {
u8g.firstPage();
do {
drawMenu();
} while( u8g.nextPage() );
menu_redraw_required = 0;
}
updateMenu(); // update menu bar
}
- gdzie buduje się (i jak) dodawać kolejne pod poziomy MENU,
- jak zmienić podświetlanie linii w zwykły wskaźnik np: ->,
- co i jak ustawić aby menu wyświetlało się w następujący sposób:
Kod:
MENU:
------------------------------------------
ZEGAR
TWARDOSC KH
-> LAMPA
WIATRAK
WYJSCIE
po wyborze pozycja np. LAMPA ekran:
LAMPA:
--------------------------------------
-> GODZINA START
GODZINA STOP
MANUAL
KONIEC