Keisuke Sehara
/
STM32_Whisking
fast-feedback virtual target task code on STM Nucleo
Diff: config.cpp
- Revision:
- 6:13d180af7501
- Parent:
- 5:849446d19406
- Child:
- 8:973dcd190672
--- a/config.cpp Thu May 24 14:47:48 2018 +0000 +++ b/config.cpp Thu May 24 15:34:58 2018 +0000 @@ -25,7 +25,7 @@ } }; - HelpResponder help_; + HelpResponder* help_ = 0; struct CallbackHandler { @@ -42,6 +42,7 @@ command(command), responder(resp), prev(0), next(0) { } static void append(CallbackHandler** list, CallbackHandler* item) { + if ((*list) == 0) { // no content (*list) = item; @@ -50,16 +51,19 @@ } else { // search the end of the list - while((*list)->next != 0) { - *list = (*list)->next; + CallbackHandler* current = *list; + while(current->next != 0) { + current = current->next; } - (*list)->next = item; - item->prev = (*list); + current->next = item; + item->prev = current; + item->next = 0; } } static void drop(CallbackHandler** head, CallbackHandler* item) { + if (item == 0) { return; } @@ -98,19 +102,31 @@ } static CallbackHandler* helpCommand(const char& command) { - return new CallbackHandler(command, &help_); + return new CallbackHandler(command, help_); } }; - CallbackHandler* handlers_ = CallbackHandler::helpCommand(CMD_CHAR_HELP); + + CallbackHandler* handlers_ = 0; + + void initialize_() { + help_ = new HelpResponder(); + CallbackHandler::append(&handlers_, CMD_CHAR_HELP, help_); + } void addCommand(const char& command, CommandResponder* resp) { + if (handlers_ == 0) { + initialize_(); + } CallbackHandler::append(&handlers_, command, resp); } void removeCommand(const char& command) { + if (handlers_ == 0) { + initialize_(); + } CallbackHandler::drop(&handlers_, command); } @@ -124,10 +140,12 @@ CallbackHandler* current = handlers_; while(current != 0) { + if ( current->responder->parse(in) ) { // the handler accepted the input character break; } + current = current->next; } if (current != 0) {