Vorgehen bei einem Command Interpreter



  • hallo Leute!

    Bei mir geht es momentan darum, dass ich eine Anwendung habe in der Kommandos interpretiert, überprüft und ausgeführt werden müssen. Die Kommandos kommen z.B. über Funk und sollen eine bestimmte Reaktion im Programm auslösen (zum Beispiel eine Lampe anschalten oder einen Motor mit einer bestimmten Geschwindigkeiten laufen lassen).

    Ich frage mich nun wie man sowas am Besten angeht, es gibt zwar viel zu lesen über shell-like Command Line interpreter, mir gehts aber weniger um eine lexikalische Verarbeitung von eingetippten Zeilen sondern darum wie ich die Auswertung und die ausführung der Reaktionen gestalten kann. Mir fällt da spontan ein switch Block ein, allerdings gibts ne ganze Menge Kommandos, und da wird sowas unübersichtlich.

    Weiß einer wo man sich da Informationen holen kann?



  • Du solltest dir erst mal Gedanken machen, wie die Schnittstelle aussieht. "Funk" kann alles mögliche sein. In der Regel hast du dann eine API (z.B. Sockets?), die dir entsprechende Funktionen bereitstellt, Daten zu empfangen.

    Wenn du dann weißt, wie die I/O funktioniert, kannst du dir Gedanken über das Kommunikationsprotokoll machen (ASCII-Format? Oder ein Binärprotokoll, oder ein bereits bestehendes Protokoll oder ...).

    Wie dein Code am Ende dann aussieht, hängt also von all den Faktoren ab. Kläre erst mal das bzw. kläre uns darüber auf.



  • Jodocus schrieb:

    Du solltest dir erst mal Gedanken machen, wie die Schnittstelle aussieht. "Funk" kann alles mögliche sein. In der Regel hast du dann eine API (z.B. Sockets?), die dir entsprechende Funktionen bereitstellt, Daten zu empfangen.

    Wenn du dann weißt, wie die I/O funktioniert, kannst du dir Gedanken über das Kommunikationsprotokoll machen (ASCII-Format? Oder ein Binärprotokoll, oder ein bereits bestehendes Protokoll oder ...).

    Wie dein Code am Ende dann aussieht, hängt also von all den Faktoren ab. Kläre erst mal das bzw. kläre uns darüber auf.

    Es gibt ein protokoll im binärformat. Es gibt eine API allerdings keine Sockets. Läuft alles auf einem embedded system, mit Echtzeit Betriebssystem. Ein Protokoll wird es geben. Grundstruktur gibt es bereits, entwickelt sich allerdings weiter. Es gibt ein Header und ein Datenfeld. Objektorientierung ist möglich. APIs wie boost oder Qt oder ähnliches ist nicht möglich.

    Für ein Beispiel siehe bitte (LLC Frameaufbau): http://www.mikrocontroller.net/articles/RFM12_Protokoll_Stack

    Es geht mir darum wie man dafür sorgt, dass je nachdem was in den einzelnen Feldern steht, die richtigen Funktionen aufgerufen werden. Möglichst nicht mit if/else oder switch blöcken.



  • DAnn schreib dir eine Parsing Funktionalität, die solange Daten einliest bis entschieden werden kann, was für ein Objekt dahinter kommt und dieses dann erzeugt, damit es sich selbst um das Lesen kümmert.



  • Die m.E. beste Parsertechnik dafür ist die Registrierung mittels Funktionen (so daß intern z.B. eine Map von Funktionspointer verwendet werden kann), z.B.

    typedef void (*ParserFunc)(/* parameters */);
    void RegisterParser(Command command, ParserFunc f);
    
    void CallParser(Command command); // <- diese wird dann intern vom Parser aufgerufen
    

    (oder noch besser std::function benutzen)

    So hat der eigentliche Parser nichts mit der Auswertung zu tun.
    Die Registrierung kann dann entweder zentral an einer Stelle passieren oder auch von verschiedenen Stellen aus (z.B. falls unterschiedliche Funktionalität gefordert wird).

    PS. Dies entspricht dem Observer-Pattern (ich setze das in C# z.B. direkt mit Events um).



  • Freddy_Kay schrieb:

    APIs wie boost oder Qt oder ähnliches ist nicht möglich.

    Das sind keine APIs sondern libraries. Diese haben APIs.


Anmelden zum Antworten