A light Command Dispatcher Library with commands linked to your functions.

Dependents:   Rocket

You can register your commands and the functions linked.
On each execution of a command (char array), it will parse the array and send all the parameters to the functions.

Here is a quick example :

#include "mbed.h"
#include "CommandDispatcher.h"
    
Serial pc(USBTX, USBRX);

void echoCommand(unsigned int argc, char* argv[], char* result);
    
int main() {
    CommandDispatcher disp = CommandDispatcher();
    char buffer[50];
    char result[50];
    int i=0;
    
    // register a command
    disp.addCommand("echo", echoCommand);
    pc.printf("Example Command Dispatcher\n\n");

    while(true) {
        // get a complete line from serial
        buffer[i++] = pc.getc();
        if (buffer[i-1]=='\n') {
            buffer[i-1]='\0';
            i=0;
        
            // send it to the dispatcher and print result
            if (disp.executeCommand(buffer, result)) {
                pc.printf("%s\n", result); 
            } else {
                pc.printf("Command not found.\n");  
            }
        }
    }
}

// the actual function called
void echoCommand(unsigned int argc, char* argv[], char* result) {
    int i;
    sprintf(result, "");
    for (i=1; i<argc; i++) {
        sprintf(result, "%s %s", result, argv[i]);
    }
    sprintf(result, "%s\n", result);
}
Revision:
1:855efbf6d7ae
Child:
2:695d21706b72
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CommandDispatcher.h	Wed Sep 03 09:50:45 2014 +0000
@@ -0,0 +1,95 @@
+#include "mbed.h"
+
+#define MAX_ARG_SIZE 20
+#define DEFAULT_BUFFER_SIZE 50
+
+/** A  light Command Dispatcher Library \n
+    You can link commands to functions. \n
+    On each execution of a command (char array), it will parse the array and send all the parameters to the functions. \n
+    Here is an quick example class that to show the purpose of this library.
+    @code
+    #include "mbed.h"
+    #include "CommandDispatcher.h"
+    
+    Serial pc(USBTX, USBRX);
+
+    void echoCommand(unsigned int argc, char* argv[], char* result);
+    
+    int main() {
+        CommandDispatcher disp = CommandDispatcher();
+        char buffer[50];
+        char result[50];
+        int i=0;
+    
+        disp.addCommand("echo", echoCommand);
+        pc.printf("Example Command Dispatcher\n\n");
+
+        while(true) {  
+            buffer[i++] = pc.getc();
+            if (buffer[i-1]=='\n') {
+                buffer[i-1]='\0';
+                i=0;
+            
+                if (disp.executeCommand(buffer, result)) {
+                    pc.printf("%s\n", result); 
+                } else {
+                    pc.printf("Command not found.\n");  
+                }
+            }
+        }
+    }
+    
+    void echoCommand(unsigned int argc, char* argv[], char* result) {
+        int i;
+        sprintf(result, "");
+        for (i=1; i<argc; i++) {
+            sprintf(result, "%s %s", result, argv[i]);
+        }
+        sprintf(result, "%s\n", result);
+    }
+    @endcode
+*/
+class CommandDispatcher {
+private:
+    class Command {
+    private:
+        char _name[MAX_ARG_SIZE];
+        void(*_function)(unsigned int argc, char* argv[], char* result);
+        Command* _next;
+
+        friend class CommandDispatcher;
+    };
+    
+    CommandDispatcher::Command* _first_command;
+    
+    int parse_buffer(char* buffer, char*** argv);
+    
+public:
+    /** Constructor of the Command Dispatcher  
+    */
+    CommandDispatcher();
+    
+    /** Add a command to the Dispatcher.
+        @param commandName the name of the command. Not case sensitive.
+        @param commandFunction the pointer to the function called when function is executed. \n
+            The 2 first parameters are liked a C code main (number and value of arguments). \n
+            The last (result) is got on command execution and transport a potential result to the executor. \n
+    */
+    void addCommand(char* commandName, void(*commandFunction)(unsigned int argc, char* argv[], char* result));
+    /** Clean all the commands (free memory allocated).
+    */
+    void cleanCommands();
+    
+    /** Execute a command. It will check each registered command with its name.
+        @param command the command with the arguments in a single char array.
+        @param result a char array alocated by the user and sent to the function for feedback use.
+    */
+    bool executeCommand(char* command, char* result);
+
+    /** A Utility function to transform a char array to lower case (useful for argument checks). \n
+            WARNING : This function modifies the word.
+        @param word the word to modify.
+        
+    */
+    static void toLowerCase(char* word);
+};
\ No newline at end of file