Pages: [1]   Go Down
Author Topic: MenuBackend und LCD 20x4  (Read 1025 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo, ich bin dabei mir ein Menü per MenuBackend Lib zu erstellen.
Nun habe ich das Problem, das mein Menü mehr als 3 Unterpunkte pro Hauptpunkt haben soll. Im moment kann es nur Hauptpunkt + 3 Unterpunkte anzeigen, danach soll es aber wenn man ganz unten im LCD angekommen ist das Menü durchscrollen also so:
_________________________
Überschrift
 Punkt 1
 Punkt 2
>Punkt 3
_________________________

und wenn man nun Punkt 4 auswählt...

_________________________
Überschrift
 Punkt 2
 Punkt 3
>Punkt 4
_________________________

Ich komm nicht dahinter, wie ich es lösen kann.
Desweiteren würde ich es gerne so lösen, das ich das Menü nicht selber für die Anzeige erstellen muss sondern das es sich selbst erstellt.
Momentan gebe ich ja die Zeilen vor "MenuItem* line101 = menu.getRoot().getAfter();"

Hier mal der Code:
Code:
#include <LiquidCrystal.h>
#include <MenuBackend.h>
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);


MenuItem* lcd1 = 0;    //Test
MenuItem* lcd2 = 0;    //Test
MenuItem* lcd3 = 0;    //Test
MenuItem* lcd4 = 0;    //Test
//this controls the menu backend and the event generation
MenuBackend menu = MenuBackend(menuUseEvent,menuChangeEvent);
//beneath is list of menu items needed to build the menu
MenuItem miLine100 = MenuItem("Ueberschrift 1");
MenuItem miLine101 = MenuItem("Line 1,1");
MenuItem miLine102 = MenuItem("Line 1,2");
MenuItem miLine103 = MenuItem("Line 1,3");
MenuItem miLine104 = MenuItem("Line 1.4",'T');
MenuItem miLine105 = MenuItem("Line 1.5");
MenuItem miLine200 = MenuItem("Ueberschrift 2");
MenuItem miLine201 = MenuItem("Line 2.1");
MenuItem miLine202 = MenuItem("Line 2.2");
//this function builds the menu and connects the correct items together
void menuSetup()
{
  Serial.println("Setting up menu...");
  lcd.begin(20, 4);
  menu.getRoot().add(miLine100);
  miLine100.add(miLine101).add(miLine102).add(miLine103).add(miLine104).add(miLine105);
  miLine100.addRight(miLine200).add(miLine201).add(miLine202);
  miLine200.addRight(miLine100);
}

/*
This is an important function
  Here all use events are handled
 
  This is where you define a behaviour for a menu item
 */
void menuUseEvent(MenuUseEvent used)
{
  Serial.print("Menu use ");
  Serial.println(used.item.getName());
  if (used.item == miLine100) //comparison agains a known item
  {
    Serial.println("Menu Line 100");
  }
}

/*
This is an important function
  Here we get a notification whenever the user changes the menu
  That is, when the menu is navigated
 */

void menuChangeEvent(MenuChangeEvent changed)
{   
  Serial.print("Menu change: ");
  Serial.print("->");
  Serial.println(changed.to.getName());
  MenuItem* line101 = menu.getRoot().getAfter();
  MenuItem* line102 = menu.getRoot().getAfter()->getAfter();
  MenuItem* line103 = menu.getRoot().getAfter()->getAfter()->getAfter();
  MenuItem* line104 = menu.getRoot().getAfter()->getAfter()->getAfter()->getAfter();

  MenuItem* line201 = menu.getRoot().getAfter()->getRight(); 
  MenuItem* line202 = menu.getRoot().getAfter()->getRight()->getAfter();
  MenuItem* line203 = menu.getRoot().getAfter()->getRight()->getAfter()->getAfter();
  MenuItem* line204 = menu.getRoot().getAfter()->getRight()->getAfter()->getAfter()->getAfter();
 
  if (changed.to.getName() == line101->getName()){
    Serial.println("Seite 1");
    lcd1 = line101;
    lcd2 = line102;
    lcd3 = line103;
    lcd4 = line104;
  }
  if (changed.to.getName() == line201->getName()){
    Serial.println("Seite 2");
    lcd1 = line201;
    lcd2 = line202;
    lcd3 = line203;
    lcd4 = line204;
  }

  lcd.clear();


  lcd.setCursor(0, 0);
  lcd.print(lcd1->getName());
  //lcd.print(changed.to.getName());


  lcd2->getName();
  if(lcd2 != NULL){
    if (changed.to.getName() == lcd2->getName()){
      lcd.setCursor(0, 1);
      lcd.print(">");
    }
    lcd.setCursor(1, 1);
    lcd.print(lcd2->getName());
  }

  lcd3->getName();
  if(lcd3 != NULL){
    if (changed.to.getName() == lcd3->getName()){
      lcd.setCursor(0, 2);
      lcd.print(">");
    }
    lcd.setCursor(1, 2);
    lcd.print(lcd3->getName());
  }

  lcd4->getName();
  if(lcd4 != NULL){
    if (changed.to.getName() == lcd4->getName()){
      lcd.setCursor(0, 3);
      lcd.print(">");
    }
    lcd.setCursor(1, 3);
    lcd.print(lcd4->getName());
  }
}




void setup()
{
  Serial.begin(9600);

  menuSetup();
  Serial.println("Starting navigation:\r\nUp: w   Down: s   Left: a   Right: d   Use: e");
}

void loop()
{
  if (Serial.available()) {
    byte read = Serial.read();
    switch (read) {
    case 'w':
      menu.moveUp();
      break;
    case 's':
      menu.moveDown();
      break;
    case 'd':
      menu.moveRight();
      break;
    case 'a':
      menu.moveLeft();
      break;
    case 'e':
      menu.use();
      break;
    case 'q':
      menu.use('Z');
      break;
    case 'r':
      menu.toRoot();
      break;
    }
  }
}

Ich hoffe ihr versteht was ich meine und könnt mir etwas helfen.
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 108
Posts: 5144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Hallo, ich bin dabei mir ein Menü per MenuBackend Lib zu erstellen.

Dann wäre es nicht schlecht, uns einen Link auf die Lib zur Verfügung zu stellen.

Quote
Desweiteren würde ich es gerne so lösen, das ich das Menü nicht selber für die Anzeige erstellen muss sondern das es sich selbst erstellt.

Das dürfte nicht gehen, denn das Menü weiss ja nicht, wie es aussehen soll, bevor es von Dir erstellt wurde.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich schätze, dass man damit was anfangen kann http://jasonfball.blogspot.de/2010/11/implementing-menus-on-arduino.html

http://arduino.cc/forum/index.php/topic,38053.0.html

Gruß Gerd
Logged

Germany
Offline Offline
Edison Member
*
Karma: 133
Posts: 1447
If you believe something is right, you won't see what's wrong (David Straker).
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, leicht off topic: Ich habe von der MenuBackend keine Ahnung, aber
M2tklib (http://code.google.com/p/m2tklib/)
- kann Menü-einträge scrollen (wie anfangs angefragt, mittels M2_STRLIST)
- benutzt statische Menüs, die nicht erst erstellt werden müssen, sondern sofort nach dem startup da sind...

Grüße,
Oliver

Logged

Pages: [1]   Go Up
Jump to: