MenuBackend und LCD 20x4

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:

#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.

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.

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.

Ich schätze, dass man damit was anfangen kann Jason F Ball: Implementing Menu's on the Arduino

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

Gruß Gerd

ok, leicht off topic: Ich habe von der MenuBackend keine Ahnung, aber
M2tklib (Google Code Archive - Long-term storage for Google Code Project Hosting.)

  • 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