Pages: 1 [2] 3 4   Go Down
Author Topic: Projektvorstellung: Library für das Erstellen von Menus für LCD Displays  (Read 14474 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3005
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So habe jetzt meine
Code:
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...
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3005
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Germany
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3005
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Einsame Klasse - so gehts!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 33
IT-Systemelektroniker Azubi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 33
IT-Systemelektroniker Azubi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-grin. 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 smiley-wink
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 33
IT-Systemelektroniker Azubi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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();
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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


// Privater Zeiger
const __FlashStringHelper* _Text;

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

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?

 
Logged

Pages: 1 [2] 3 4   Go Up
Jump to: