Hallo,
ich arbeite gerade an einer Uart-Schnittstelle.
Meine Strings habe ich wie folgt in mein Programm gepackt:
1 | const char f_str_0[] PROGMEM = "/?";
|
2 | const char f_str_1[] PROGMEM = "HELP";
|
3 | ....
|
4 | const char * const all[] PROGMEM = { f_str_0, f_str_1, ...};
|
So kann ich über "all" iterieren und alle unterstützten Befehle
ausgeben.
Je nach Befehl möchte ich eine andere Funktion anspringen.
Alle Funktionen sind zur Compile-Zeit bekannt.
Aktuell habe ich es so gelöst:
1 | //Return PIN-Control
|
2 | if( !compare( 4)) { //Das ist der Index im Array "all"
|
3 | AllIO.ReturnControl(); //Diese Funktion möchte ich anspringen
|
4 | uart_puts_P( ">>OK\n\r");
|
5 | return;
|
6 | }
|
Das ist natürlich sehr unschön! Da dachte ich machst dir eine Klasse,
die den String und einen Funktionspointer im Flash enthält.
Dann mach ich mir ein const-Array aller Klasseninstanzen und schupps
kann ich einfach neue Befehle hinzufügen.
Leider reichen meine C++Kentnisse nicht aus! :-(
Versucht habe ich das:
1 | struct PROGMEM UartCommand0P
|
2 | {
|
3 | const char * const _ptr_text;
|
4 | const uint8_t (*FunctionToCall)();
|
5 | };
|
6 |
|
7 | const UartCommand0P b = { "1", nullptr};
|
Hier landet der String aber im RAM. :(
1 | const UartCommand0P c = { PSTR("blaasdfadsfasdf"), nullptr};
|
So hätte ich es intuitiv gemacht, jedoch bekomme ich folgenden
compile-Error:
"statement-expressions are not allowed outside functions nor in
template-argument lists"
Könnt ihr mir vielleicht sagen, ich ich alles in den Flash packen kann?
Danke für eure Hilfe!