A light Command Dispatcher Library with commands linked to your functions.
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); }
Diff: CommandServer.cpp
- Revision:
- 1:855efbf6d7ae
- Parent:
- 0:1bfd6f4c0dbb
- Child:
- 3:8784fbd35d29
--- a/CommandServer.cpp Tue Sep 02 22:07:18 2014 +0000 +++ b/CommandServer.cpp Wed Sep 03 09:50:45 2014 +0000 @@ -1,31 +1,29 @@ #include "mbed.h" -#include "CommandServer.h" +#include "CommandDispatcher.h" -extern Serial pc; - -CommandServer::CommandServer() : _first_command(NULL) { +CommandDispatcher::CommandDispatcher() : _first_command(NULL) { } -void CommandServer::addCommand(char* commandName, void(*command_function)(int argc, char* argv[], char* result)) { - CommandServer::Command* com = new CommandServer::Command(); +void CommandDispatcher::addCommand(char* commandName, void(*command_function)(unsigned int argc, char* argv[], char* result)) { + CommandDispatcher::Command* com = new CommandDispatcher::Command(); strcpy(com->_name, commandName); com->_function = command_function; com->_next = _first_command; _first_command = com; } -void CommandServer::cleanCommands() { - CommandServer::Command* com = _first_command; +void CommandDispatcher::cleanCommands() { + CommandDispatcher::Command* com = _first_command; while (com!=NULL) { _first_command = com->_next; delete com; } } -bool CommandServer::executeCommand(char* command, char* result) { - CommandServer::Command* command_ptr; +bool CommandDispatcher::executeCommand(char* command, char* result) { + CommandDispatcher::Command* command_ptr; bool function_return = false; - int argc; + unsigned int argc; char** argv; char* buffer; @@ -48,39 +46,39 @@ return function_return; } -int CommandServer::parse_buffer(char* buffer, char*** argv) { - int i; - int word_count; - int letter_found; - int buffer_size = strlen(buffer); - int argc; +int CommandDispatcher::parse_buffer(char* buffer, char*** argv) { + unsigned int i; + unsigned int word_count; + bool letter_found; + unsigned int buffer_size = strlen(buffer); + unsigned int argc; char** argv_tab; // 1st cycle, counting the number of words - letter_found = 0; + letter_found = false; word_count = 0; for (i=0; i<buffer_size; i++) { if (buffer[i]==' ' && letter_found) { word_count++; - letter_found=0; - } else letter_found=1; + letter_found=false; + } else letter_found=true; } - if (letter_found!=0) word_count++; // to get last word + if (letter_found) word_count++; // to get last word // create the array of words argv_tab = new char*[word_count]; argc = word_count; // 2nd cycle, putting words into the array - letter_found = 0; + letter_found = false; word_count = 0; for (i=0; i<buffer_size; i++) { if (buffer[i]==' ') { buffer[i] = '\0'; - letter_found = 0; + letter_found = false; } else if (!letter_found) { argv_tab[word_count++]=&buffer[i]; - letter_found=1; + letter_found=true; } } @@ -88,7 +86,7 @@ return argc; } -void CommandServer::toLowerCase(char* word) { +void CommandDispatcher::toLowerCase(char* word) { int i; for (i=0; i<strlen(word); i++) { if (word[i]>=65 && word[i]<=90) { // if between A-Z