Go Down

Topic: Projektvorstellung: Library für das Erstellen von Menus für LCD Displays (Read 16899 times) previous topic - next topic

michael_x

Quote
Könnte man evtl. die neue Funktion F("") irgendwie mit benutzen?
Damit wäre die Einbindung leichter.

Na klar, F("text") ist zwar keine Funktion sondern ein Makro in WString.h; der einzige Sinn ist, aus "text" den Pseudo-VariablenTyp   __FlashStringHelper*  zu machen, und als PSTR("text") im Flash abzulegen.

Musst du nur eine Methode   InitText(const __FlashStringHelper* ptext) hinzufügen.
Zum Verwenden auf const prog_char* casten, oder einfach mit print() ausgeben.

mde110

So habe jetzt meine
Code: [Select]
Init(const __FlashStringHelper* Text)
{
_Text3 = Text;
}



jetzt möchte ich den übergebenen Wert in der Klasse abspeichern, komme aber nicht weiter.
Ist das richtig?
const __FlashStringHelper* _Text3;

Ich möchte den Wert später an anderer Stelle wieder verarbeiten:
sprintf(Text, "%s", _Text3);

Brauche nochmals Hilfe, komme nicht weiter...

michael_x

Quote
jetzt möchte ich den übergebenen Wert in der Klasse abspeichern, komme aber nicht weiter.
Ist das richtig?
const __FlashStringHelper* _Text3;

Ja, nur der Name _Text3 ist nicht sehr schön ;)

Quote
Ich möchte den Wert später an anderer Stelle wieder verarbeiten:
sprintf(Text, "%s", _Text3);


sprintf kennt keinen __FlashStringHelper  ( und auch kein PROGMEM )
print(_Text3);  geht direkt, sonst schau nach den Funktionen, mit denen char aus dem PROGMEM geladen oder kopiert werden

mde110

Ja, Text3 auch nur deshalb, weil meine Lib momentan mehrere "Textformate" unterstützt. Wird dann später bereinigt  ;)

Die Fuunktion für PROGMEM ist klar:       strcpy_P(Text, (char*)pgm_read_word(_Text2));

Dann werde ich mal suchen, was den __FlashStringHelper in ein char Array klopfen kann.

michael_x

Quote
den __FlashStringHelper
... gibt es so gar nicht "wirklich".
Von einem Pointer auf einen __Flashstringhelper weiss man, dass print() es drucken kann, und dass man diesen Pointer als einen prog_char* ( oder einen PGM_P ) verwenden kann.

also z.B.   strcpy_P(rambuffer, (prog_char*)Text3 );

--> arduino-1.0.1\hardware\tools\avr\avr\include\avr\pgmspace.h


alhin


Damit man einen definierten Start hat, würde ich ein "root" Element im Menu-Objekt definieren, welches immer den ersten Eintrag liefert. Zusätzlich sollte jedes MenuItem entsprechende Methoden getForward(), getBack(), getUp und getDown() haben, damit man auf die angehängten Elemente zugreifen und damit durch den Baum / Graph navigieren kann.


So ein ROOT Element halte ich auch für wichtig. Da beim Menü sich um eine Baum-Datenstruktur handelt. Und die Baumstruktur braucht immer eine Wurzel.

Siehe hier:
http://de.wikipedia.org/wiki/Datenstruktur#Baum

mkl0815

Allerdings handelt es sich bei der Datensturktur eher um einen gerichteten Graphen, nicht um einen Baum. In einem Baum gibt es keine Schleifen, die aber in der Menustruktur durchaus möglich sind. Z.B. damit ich beim Weiterblättern nach dem letzten Eintrag einer Ebene wieder an deren Anfang heraus komme.

cr0n0s1


So ein ROOT Element halte ich auch für wichtig. Da beim Menü sich um eine Baum-Datenstruktur handelt. Und die Baumstruktur braucht immer eine Wurzel.


Also ich habe einen Einstiegspunkt mit begin(int startElement).


Allerdings handelt es sich bei der Datensturktur eher um einen gerichteten Graphen, nicht um einen Baum. In einem Baum gibt es keine Schleifen, die aber in der Menustruktur durchaus möglich sind. Z.B. damit ich beim Weiterblättern nach dem letzten Eintrag einer Ebene wieder an deren Anfang heraus komme.


Und wie in diesem Post beschrieben ist dies eher kein Baum sondern ein Graph und das macht es auch möglich endlos durch eine Ebene zu laufen (Also wenn man am letzten Element angekommen ist gehts oben wieder weiter). Dies war auch so von mir gewollt. Wobei mich interessieren würde, wo für ein root Element gut sein soll?

mde110

Cronos, du könntest jetzt auch die Texte über den Flash realisieren.
Vorlagen sind ja vorhanden  :smiley-mr-green:

cr0n0s1


Cronos, du könntest jetzt auch die Texte über den Flash realisieren.
Vorlagen sind ja vorhanden  :smiley-mr-green:


Ja hab das hier mit bekommen aber war erst mal ziemlich überfordert oO :D. Meinst du mit Flash den EEPROM? Zudem hab ich es versucht die Strings durch Char Arrays zu erstetzen, aber dadurch das ich diese zwischen den Klassen hin und her reiche und das nicht ganz will, bin ich erst mal bei Strings geblieben.

Ich hätte aber nichts dagegen wenn mir dabei geholfen wird die Lösung mit dem Flash um zusetzen ;)

mde110

Ich habe mir in meiner Lib eine private _GetText Funktion erstellt.
Durch diese kann ich immer auf den Text zugreifen.

Der Flash ist der Programmspeicher (ReadOnly-wird beim Upload "gebrannt"/"geflashed" ^^), nicht das EEPROM.

Ich muss nur noch schauen, wie ich die passende char Buffergröße auswählen soll. Nicht, dass der Text im Flash doch zu groß ist und nacher wird nicht richtig dargestellt...

cr0n0s1


Ich habe mir in meiner Lib eine private _GetText Funktion erstellt.
Durch diese kann ich immer auf den Text zugreifen.

Der Flash ist der Programmspeicher (ReadOnly-wird beim Upload "gebrannt"/"geflashed" ^^), nicht das EEPROM.

Ich muss nur noch schauen, wie ich die passende char Buffergröße auswählen soll. Nicht, dass der Text im Flash doch zu groß ist und nacher wird nicht richtig dargestellt...


Aber mach ich das nicht auch? Auser das ich das ganze mit Strings verwalte. Ansonsten hab ich auch eine private getName();

mde110

Teste es mal in der Art. Oder du stellst deine char Array Lösung mal online...

Code: [Select]

// Die Funktion
void DeElemente::_GetText(char* Text)
{
    strcpy_P(Text, (prog_char*)_Text);
}


// Privater Zeiger
const __FlashStringHelper* _Text;

// Aufruf
char Text[20];
_GetText(Text);

Egal was ich mache, ich bekomme die Meldung "Menu" does not name a type. muss natürlich dazu sagen, das ich nicht viel mache, da ich wenig Ahnung habe.
Kann mir bitte jemand erklären wie ich vorgehen muss, um das Menü auf meines 16x2 Display Shield zu testen?


Go Up