Keisuke Sehara
/
STM32_Whisking
fast-feedback virtual target task code on STM Nucleo
config.cpp@6:13d180af7501, 2018-05-24 (annotated)
- Committer:
- gwappa
- Date:
- Thu May 24 15:34:58 2018 +0000
- Revision:
- 6:13d180af7501
- Parent:
- 5:849446d19406
- Child:
- 8:973dcd190672
add simpler configuration functionality
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gwappa | 5:849446d19406 | 1 | #include "config.h" |
gwappa | 5:849446d19406 | 2 | #include "IO.h" |
gwappa | 5:849446d19406 | 3 | |
gwappa | 5:849446d19406 | 4 | namespace config { |
gwappa | 5:849446d19406 | 5 | |
gwappa | 5:849446d19406 | 6 | struct HelpResponder: public CommandResponder |
gwappa | 5:849446d19406 | 7 | { |
gwappa | 5:849446d19406 | 8 | virtual ~HelpResponder() { } |
gwappa | 5:849446d19406 | 9 | |
gwappa | 5:849446d19406 | 10 | virtual bool parse(const char& c) |
gwappa | 5:849446d19406 | 11 | { |
gwappa | 5:849446d19406 | 12 | if (c != CMD_CHAR_HELP) { |
gwappa | 5:849446d19406 | 13 | return false; |
gwappa | 5:849446d19406 | 14 | } |
gwappa | 5:849446d19406 | 15 | writeSettingsToSerial(); |
gwappa | 5:849446d19406 | 16 | return true; |
gwappa | 5:849446d19406 | 17 | } |
gwappa | 5:849446d19406 | 18 | |
gwappa | 5:849446d19406 | 19 | virtual bool writeSettings() { |
gwappa | 5:849446d19406 | 20 | return false; |
gwappa | 5:849446d19406 | 21 | } |
gwappa | 5:849446d19406 | 22 | |
gwappa | 5:849446d19406 | 23 | virtual void echoback() { |
gwappa | 5:849446d19406 | 24 | // do nothing |
gwappa | 5:849446d19406 | 25 | } |
gwappa | 5:849446d19406 | 26 | }; |
gwappa | 5:849446d19406 | 27 | |
gwappa | 6:13d180af7501 | 28 | HelpResponder* help_ = 0; |
gwappa | 5:849446d19406 | 29 | |
gwappa | 5:849446d19406 | 30 | struct CallbackHandler |
gwappa | 5:849446d19406 | 31 | { |
gwappa | 5:849446d19406 | 32 | char command; |
gwappa | 5:849446d19406 | 33 | CommandResponder* responder; |
gwappa | 5:849446d19406 | 34 | |
gwappa | 5:849446d19406 | 35 | CallbackHandler* prev; |
gwappa | 5:849446d19406 | 36 | CallbackHandler* next; |
gwappa | 5:849446d19406 | 37 | |
gwappa | 5:849446d19406 | 38 | |
gwappa | 5:849446d19406 | 39 | private: |
gwappa | 5:849446d19406 | 40 | |
gwappa | 5:849446d19406 | 41 | CallbackHandler(const char& command, CommandResponder* resp): |
gwappa | 5:849446d19406 | 42 | command(command), responder(resp), prev(0), next(0) { } |
gwappa | 5:849446d19406 | 43 | |
gwappa | 5:849446d19406 | 44 | static void append(CallbackHandler** list, CallbackHandler* item) { |
gwappa | 6:13d180af7501 | 45 | |
gwappa | 5:849446d19406 | 46 | if ((*list) == 0) { |
gwappa | 5:849446d19406 | 47 | // no content |
gwappa | 5:849446d19406 | 48 | (*list) = item; |
gwappa | 5:849446d19406 | 49 | item->prev = 0; |
gwappa | 5:849446d19406 | 50 | item->next = 0; |
gwappa | 5:849446d19406 | 51 | |
gwappa | 5:849446d19406 | 52 | } else { |
gwappa | 5:849446d19406 | 53 | // search the end of the list |
gwappa | 6:13d180af7501 | 54 | CallbackHandler* current = *list; |
gwappa | 6:13d180af7501 | 55 | while(current->next != 0) { |
gwappa | 6:13d180af7501 | 56 | current = current->next; |
gwappa | 5:849446d19406 | 57 | } |
gwappa | 5:849446d19406 | 58 | |
gwappa | 6:13d180af7501 | 59 | current->next = item; |
gwappa | 6:13d180af7501 | 60 | item->prev = current; |
gwappa | 6:13d180af7501 | 61 | item->next = 0; |
gwappa | 5:849446d19406 | 62 | } |
gwappa | 5:849446d19406 | 63 | } |
gwappa | 5:849446d19406 | 64 | |
gwappa | 5:849446d19406 | 65 | static void drop(CallbackHandler** head, CallbackHandler* item) { |
gwappa | 6:13d180af7501 | 66 | |
gwappa | 5:849446d19406 | 67 | if (item == 0) { |
gwappa | 5:849446d19406 | 68 | return; |
gwappa | 5:849446d19406 | 69 | } |
gwappa | 5:849446d19406 | 70 | |
gwappa | 5:849446d19406 | 71 | if (item == *head) { |
gwappa | 5:849446d19406 | 72 | *head = item->next; |
gwappa | 5:849446d19406 | 73 | } else { |
gwappa | 5:849446d19406 | 74 | item->prev->next = item->next; |
gwappa | 5:849446d19406 | 75 | } |
gwappa | 5:849446d19406 | 76 | if (item->next != 0) { |
gwappa | 5:849446d19406 | 77 | item->next->prev = item->prev; |
gwappa | 5:849446d19406 | 78 | } |
gwappa | 5:849446d19406 | 79 | |
gwappa | 5:849446d19406 | 80 | delete item; |
gwappa | 5:849446d19406 | 81 | } |
gwappa | 5:849446d19406 | 82 | |
gwappa | 5:849446d19406 | 83 | public: |
gwappa | 5:849446d19406 | 84 | |
gwappa | 5:849446d19406 | 85 | static void append(CallbackHandler** list, const char& command, CommandResponder* resp) { |
gwappa | 5:849446d19406 | 86 | append(list, new CallbackHandler(command, resp)); |
gwappa | 5:849446d19406 | 87 | } |
gwappa | 5:849446d19406 | 88 | |
gwappa | 5:849446d19406 | 89 | static void drop(CallbackHandler** head, const char& command) { |
gwappa | 5:849446d19406 | 90 | CallbackHandler* current = *head; |
gwappa | 5:849446d19406 | 91 | |
gwappa | 5:849446d19406 | 92 | // check for `command` from the head to the tail |
gwappa | 5:849446d19406 | 93 | while( current != 0 ){ |
gwappa | 5:849446d19406 | 94 | if (current->command == command) { |
gwappa | 5:849446d19406 | 95 | // drop this |
gwappa | 5:849446d19406 | 96 | drop(head, current); |
gwappa | 5:849446d19406 | 97 | return; |
gwappa | 5:849446d19406 | 98 | } |
gwappa | 5:849446d19406 | 99 | |
gwappa | 5:849446d19406 | 100 | current = current->next; |
gwappa | 5:849446d19406 | 101 | } |
gwappa | 5:849446d19406 | 102 | } |
gwappa | 5:849446d19406 | 103 | |
gwappa | 5:849446d19406 | 104 | static CallbackHandler* helpCommand(const char& command) { |
gwappa | 6:13d180af7501 | 105 | return new CallbackHandler(command, help_); |
gwappa | 5:849446d19406 | 106 | } |
gwappa | 5:849446d19406 | 107 | }; |
gwappa | 5:849446d19406 | 108 | |
gwappa | 6:13d180af7501 | 109 | |
gwappa | 6:13d180af7501 | 110 | CallbackHandler* handlers_ = 0; |
gwappa | 6:13d180af7501 | 111 | |
gwappa | 6:13d180af7501 | 112 | void initialize_() { |
gwappa | 6:13d180af7501 | 113 | help_ = new HelpResponder(); |
gwappa | 6:13d180af7501 | 114 | CallbackHandler::append(&handlers_, CMD_CHAR_HELP, help_); |
gwappa | 6:13d180af7501 | 115 | } |
gwappa | 5:849446d19406 | 116 | |
gwappa | 5:849446d19406 | 117 | void addCommand(const char& command, CommandResponder* resp) |
gwappa | 5:849446d19406 | 118 | { |
gwappa | 6:13d180af7501 | 119 | if (handlers_ == 0) { |
gwappa | 6:13d180af7501 | 120 | initialize_(); |
gwappa | 6:13d180af7501 | 121 | } |
gwappa | 5:849446d19406 | 122 | CallbackHandler::append(&handlers_, command, resp); |
gwappa | 5:849446d19406 | 123 | } |
gwappa | 5:849446d19406 | 124 | |
gwappa | 5:849446d19406 | 125 | void removeCommand(const char& command) |
gwappa | 5:849446d19406 | 126 | { |
gwappa | 6:13d180af7501 | 127 | if (handlers_ == 0) { |
gwappa | 6:13d180af7501 | 128 | initialize_(); |
gwappa | 6:13d180af7501 | 129 | } |
gwappa | 5:849446d19406 | 130 | CallbackHandler::drop(&handlers_, command); |
gwappa | 5:849446d19406 | 131 | } |
gwappa | 5:849446d19406 | 132 | |
gwappa | 5:849446d19406 | 133 | void handleSerial() |
gwappa | 5:849446d19406 | 134 | { |
gwappa | 5:849446d19406 | 135 | char in = IO::getc(); |
gwappa | 5:849446d19406 | 136 | |
gwappa | 5:849446d19406 | 137 | if (isWhitespace(in)) { |
gwappa | 5:849446d19406 | 138 | return; |
gwappa | 5:849446d19406 | 139 | } |
gwappa | 5:849446d19406 | 140 | |
gwappa | 5:849446d19406 | 141 | CallbackHandler* current = handlers_; |
gwappa | 5:849446d19406 | 142 | while(current != 0) { |
gwappa | 6:13d180af7501 | 143 | |
gwappa | 5:849446d19406 | 144 | if ( current->responder->parse(in) ) { |
gwappa | 5:849446d19406 | 145 | // the handler accepted the input character |
gwappa | 5:849446d19406 | 146 | break; |
gwappa | 5:849446d19406 | 147 | } |
gwappa | 6:13d180af7501 | 148 | current = current->next; |
gwappa | 5:849446d19406 | 149 | } |
gwappa | 5:849446d19406 | 150 | |
gwappa | 5:849446d19406 | 151 | if (current != 0) { |
gwappa | 5:849446d19406 | 152 | current->responder->echoback(); |
gwappa | 5:849446d19406 | 153 | |
gwappa | 5:849446d19406 | 154 | } else { |
gwappa | 5:849446d19406 | 155 | // no matched handler |
gwappa | 5:849446d19406 | 156 | IO::error("%c",in); |
gwappa | 5:849446d19406 | 157 | } |
gwappa | 5:849446d19406 | 158 | } |
gwappa | 5:849446d19406 | 159 | |
gwappa | 5:849446d19406 | 160 | void writeSettingsToSerial() { |
gwappa | 5:849446d19406 | 161 | IO::write(IO::CONFIG_HEADER); |
gwappa | 5:849446d19406 | 162 | |
gwappa | 5:849446d19406 | 163 | CallbackHandler* current = handlers_; |
gwappa | 5:849446d19406 | 164 | |
gwappa | 5:849446d19406 | 165 | while (current != 0) { |
gwappa | 5:849446d19406 | 166 | if (current->responder->writeSettings()) { |
gwappa | 5:849446d19406 | 167 | // some output occurred |
gwappa | 5:849446d19406 | 168 | IO::write(STR_DELIMITER); |
gwappa | 5:849446d19406 | 169 | } |
gwappa | 5:849446d19406 | 170 | current = current->next; |
gwappa | 5:849446d19406 | 171 | } |
gwappa | 5:849446d19406 | 172 | IO::write(STR_NEWLINE); |
gwappa | 5:849446d19406 | 173 | } |
gwappa | 5:849446d19406 | 174 | } |
gwappa | 5:849446d19406 | 175 | |
gwappa | 5:849446d19406 | 176 | Action::Action(const char& command, Callback<void()> f): |
gwappa | 5:849446d19406 | 177 | command_(command), handler_(f) |
gwappa | 5:849446d19406 | 178 | { |
gwappa | 5:849446d19406 | 179 | config::addCommand(command_, this); |
gwappa | 5:849446d19406 | 180 | } |
gwappa | 5:849446d19406 | 181 | |
gwappa | 5:849446d19406 | 182 | Action::~Action() |
gwappa | 5:849446d19406 | 183 | { |
gwappa | 5:849446d19406 | 184 | config::removeCommand(command_); |
gwappa | 5:849446d19406 | 185 | } |
gwappa | 5:849446d19406 | 186 | |
gwappa | 5:849446d19406 | 187 | bool Action::parse(const char& c) |
gwappa | 5:849446d19406 | 188 | { |
gwappa | 5:849446d19406 | 189 | if (c != command_) { |
gwappa | 5:849446d19406 | 190 | return false; |
gwappa | 5:849446d19406 | 191 | } |
gwappa | 5:849446d19406 | 192 | handler_(); |
gwappa | 5:849446d19406 | 193 | return true; |
gwappa | 5:849446d19406 | 194 | } |
gwappa | 5:849446d19406 | 195 | |
gwappa | 5:849446d19406 | 196 | bool Action::writeSettings() { return false; } |
gwappa | 5:849446d19406 | 197 | |
gwappa | 5:849446d19406 | 198 | void Action::echoback() { |
gwappa | 5:849446d19406 | 199 | IO::result("done"); |
gwappa | 5:849446d19406 | 200 | } |