fast-feedback virtual target task code on STM Nucleo

Dependencies:   mbed

Committer:
gwappa
Date:
Thu Dec 13 07:18:43 2018 +0000
Revision:
32:1416e015016c
Parent:
26:b4421d1ee57a
change to use the Staged state

Who changed what in which revision?

UserRevisionLine numberNew 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 8:973dcd190672 199 // IO::result("done");
gwappa 5:849446d19406 200 }