Erick / Mbed 2 deprecated ICE_BLE_TEST

Dependencies:   NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed

Fork of ICE by Erick

Committer:
jmarkel44
Date:
Fri Sep 30 21:08:57 2016 +0000
Revision:
166:f165ca3f67cd
Parent:
165:9a19fa706b72
Parent:
163:7b8d4c8b03e4
Child:
170:f9406996ff5b
merging;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmarkel44 0:65cfa4873284 1 /******************************************************************************
jmarkel44 0:65cfa4873284 2 *
jmarkel44 0:65cfa4873284 3 * File: ConfigurationHandler.cpp
jmarkel44 0:65cfa4873284 4 * Desciption: source for the ICE Configuration Handler
jmarkel44 0:65cfa4873284 5 *
jmarkel44 0:65cfa4873284 6 *****************************************************************************/
jmarkel44 3:8ea4db957749 7 #include "ConfigurationHandler.h"
jmarkel44 0:65cfa4873284 8 #include "global.h"
jmarkel44 5:5e77a1db4d45 9 #include "SetpointControl.h"
jmarkel44 12:ea87887ca7ad 10 #include "TimerControl.h"
jmarkel44 156:44f87c5a83ae 11 #include <algorithm>
jmarkel44 12:ea87887ca7ad 12
jmarkel44 156:44f87c5a83ae 13 StringSetpointMap setpointTable; // setpoint control object table
jmarkel44 156:44f87c5a83ae 14 StringVectorTimerMap timerTable; // timer control object table
jmarkel44 156:44f87c5a83ae 15 StringManualMap manualTable; // manual control object table
jmarkel44 5:5e77a1db4d45 16
jmarkel44 5:5e77a1db4d45 17 // local function prototypes
jmarkel44 5:5e77a1db4d45 18 static int loadPersistentControls(void);
jmarkel44 5:5e77a1db4d45 19
jmarkel44 74:03ccf04998b5 20 // local helper functions
jmarkel44 5:5e77a1db4d45 21 static int createControl(const Message_t *msg);
jmarkel44 5:5e77a1db4d45 22 static int modifyControl(const Message_t *msg);
jmarkel44 5:5e77a1db4d45 23 static int destroyControl(const Message_t *msg);
jmarkel44 5:5e77a1db4d45 24
jmarkel44 156:44f87c5a83ae 25 bool compareStartTime(const TimerControl *lhs, const TimerControl *rhs) {
jmarkel44 156:44f87c5a83ae 26 return (lhs->getStartTime() < rhs->getStartTime());
jmarkel44 156:44f87c5a83ae 27 }
jmarkel44 156:44f87c5a83ae 28
jmarkel44 12:ea87887ca7ad 29 /*****************************************************************************
jmarkel44 12:ea87887ca7ad 30 * Function: ConfigurationHandler()
jmarkel44 12:ea87887ca7ad 31 * Description: The ICE Configuration Handler
jmarkel44 12:ea87887ca7ad 32 *
jmarkel44 12:ea87887ca7ad 33 * @param args (unused)
jmarkel44 12:ea87887ca7ad 34 * @return none
jmarkel44 12:ea87887ca7ad 35 *****************************************************************************/
jmarkel44 0:65cfa4873284 36 void ConfigurationHandler(void const *args)
jmarkel44 0:65cfa4873284 37 {
jmarkel44 12:ea87887ca7ad 38 UNUSED(args);
jmarkel44 5:5e77a1db4d45 39 loadPersistentControls();
jmarkel44 75:96512ccc0443 40 osSignalSet(mainThreadId, sig_config_continue);
jmarkel44 5:5e77a1db4d45 41
jmarkel44 3:8ea4db957749 42 while ( true ) {
jmarkel44 5:5e77a1db4d45 43 // wait for an event
jmarkel44 5:5e77a1db4d45 44 osEvent evt = MailBox.get();
jmarkel44 5:5e77a1db4d45 45 if (evt.status == osEventMail) {
jmarkel44 5:5e77a1db4d45 46 Message_t *msg = (Message_t*) evt.value.p;
jmarkel44 5:5e77a1db4d45 47
jmarkel44 37:7e6986b77f01 48 logInfo("\r%s: mes->action = %d\n", __func__, msg->action);
jmarkel44 37:7e6986b77f01 49 logInfo("\r%s: msg->control = %d\n", __func__, msg->control);
jmarkel44 37:7e6986b77f01 50 logInfo("\r%s: msg->controlFile = %s\n", __func__, msg->controlFile);
jmarkel44 5:5e77a1db4d45 51
jmarkel44 5:5e77a1db4d45 52 switch ( msg->action ) {
jmarkel44 5:5e77a1db4d45 53 case ACTION_CREATE: {
jmarkel44 5:5e77a1db4d45 54 (void)createControl(msg);
jmarkel44 5:5e77a1db4d45 55 break;
jmarkel44 5:5e77a1db4d45 56 }
jmarkel44 5:5e77a1db4d45 57 case ACTION_MODIFY: {
jmarkel44 5:5e77a1db4d45 58 (void)modifyControl(msg);
jmarkel44 5:5e77a1db4d45 59 break;
jmarkel44 5:5e77a1db4d45 60 }
jmarkel44 5:5e77a1db4d45 61 case ACTION_DESTROY: {
jmarkel44 5:5e77a1db4d45 62 (void)destroyControl(msg);
jmarkel44 5:5e77a1db4d45 63 break;
jmarkel44 5:5e77a1db4d45 64 }
jmarkel44 5:5e77a1db4d45 65 default:
jmarkel44 5:5e77a1db4d45 66 break;
jmarkel44 5:5e77a1db4d45 67 }
jmarkel44 5:5e77a1db4d45 68
jmarkel44 5:5e77a1db4d45 69 // free the message
jmarkel44 5:5e77a1db4d45 70 MailBox.free(msg);
jmarkel44 5:5e77a1db4d45 71 }
jmarkel44 0:65cfa4873284 72 }
jmarkel44 0:65cfa4873284 73 }
jmarkel44 5:5e77a1db4d45 74
jmarkel44 12:ea87887ca7ad 75 /*****************************************************************************
jmarkel44 12:ea87887ca7ad 76 * Function: ConfigurationHandler_showControls()
jmarkel44 13:c80c283f9db2 77 * Description: show the controls
jmarkel44 12:ea87887ca7ad 78 *
jmarkel44 12:ea87887ca7ad 79 * @param msg
jmarkel44 12:ea87887ca7ad 80 * @return none
jmarkel44 12:ea87887ca7ad 81 *****************************************************************************/
jmarkel44 12:ea87887ca7ad 82 void ConfigurationHandler_showControls(void)
jmarkel44 12:ea87887ca7ad 83 {
jmarkel44 12:ea87887ca7ad 84 if ( !timerTable.empty() ) {
jmarkel44 12:ea87887ca7ad 85 printf("\rTIMER CONTROLS\n");
jmarkel44 156:44f87c5a83ae 86 StringVectorTimerMap::iterator pos;
jmarkel44 46:4cb96ab2d1c8 87 for ( pos = timerTable.begin(); pos != timerTable.end(); ++pos ) {
jmarkel44 156:44f87c5a83ae 88 vector<TimerControl *>::iterator it;
jmarkel44 156:44f87c5a83ae 89 for ( it = pos->second.begin(); it != pos->second.end(); ++it ) {
jmarkel44 156:44f87c5a83ae 90 (*it)->display();
jmarkel44 156:44f87c5a83ae 91 }
jmarkel44 12:ea87887ca7ad 92 }
jmarkel44 12:ea87887ca7ad 93 }
jmarkel44 74:03ccf04998b5 94
jmarkel44 12:ea87887ca7ad 95 if ( !setpointTable.empty() ) {
jmarkel44 12:ea87887ca7ad 96 printf("\rSETPOINT CONTROLS\n");
jmarkel44 12:ea87887ca7ad 97 StringSetpointMap::iterator pos;
jmarkel44 93:1553fb156915 98 for ( pos = setpointTable.begin(); pos != setpointTable.end(); ++pos ) {
jmarkel44 93:1553fb156915 99 pos->second->display();
jmarkel44 12:ea87887ca7ad 100 }
jmarkel44 12:ea87887ca7ad 101 }
jmarkel44 121:650205ffa656 102
jmarkel44 97:5cf6ab71dcd0 103 if ( !manualTable.empty() ) {
jmarkel44 97:5cf6ab71dcd0 104 printf("MANUAL CONTROLS\n");
jmarkel44 97:5cf6ab71dcd0 105 StringManualMap::iterator pos;
jmarkel44 97:5cf6ab71dcd0 106 for ( pos = manualTable.begin(); pos != manualTable.end(); ++pos ) {
jmarkel44 97:5cf6ab71dcd0 107 pos->second->display();
jmarkel44 97:5cf6ab71dcd0 108 }
jmarkel44 97:5cf6ab71dcd0 109 }
jmarkel44 12:ea87887ca7ad 110 }
jmarkel44 12:ea87887ca7ad 111
jmarkel44 12:ea87887ca7ad 112 /*****************************************************************************
jmarkel44 12:ea87887ca7ad 113 * Function: loadPersistentControls()
jmarkel44 12:ea87887ca7ad 114 * Description: load persistent controls from flash
jmarkel44 12:ea87887ca7ad 115 *
jmarkel44 12:ea87887ca7ad 116 * @param none
jmarkel44 12:ea87887ca7ad 117 * @return none
jmarkel44 12:ea87887ca7ad 118 *****************************************************************************/
jmarkel44 12:ea87887ca7ad 119 static int loadPersistentControls(void)
jmarkel44 12:ea87887ca7ad 120 {
jmarkel44 12:ea87887ca7ad 121 static bool loaded = false;
jmarkel44 12:ea87887ca7ad 122
jmarkel44 12:ea87887ca7ad 123 if ( !loaded ) { // lazy protection
jmarkel44 121:650205ffa656 124
jmarkel44 77:43e0a3d9e536 125 printf("\rLoading persistent controls: \n");
jmarkel44 74:03ccf04998b5 126 std::vector<mDot::mdot_file> file_list = GLOBAL_mdot->listUserFiles();
jmarkel44 156:44f87c5a83ae 127
jmarkel44 126:c85ac6a8e9af 128 loaded = true;
jmarkel44 74:03ccf04998b5 129
jmarkel44 74:03ccf04998b5 130 for (std::vector<mDot::mdot_file>::iterator i = file_list.begin(); i != file_list.end(); ++i) {
davidjhoward 162:5e8948b8044d 131 printf("\rFile: %s\r\n",i->name);
jmarkel44 74:03ccf04998b5 132 if( strncmp( i->name, CONTROL_SP_STR, strlen(CONTROL_SP_STR)) == 0 ) {
jmarkel44 77:43e0a3d9e536 133 // create the setpoint control
jmarkel44 74:03ccf04998b5 134 Message_t msg;
jmarkel44 74:03ccf04998b5 135 msg.control = CONTROL_SETPOINT;
jmarkel44 74:03ccf04998b5 136 strncpy(msg.controlFile, i->name, sizeof(msg.controlFile));
jmarkel44 74:03ccf04998b5 137 int rc = createControl(&msg);
jmarkel44 74:03ccf04998b5 138 if ( rc != 0 ) {
jmarkel44 121:650205ffa656 139 logError("%s: failed to load %s", __func__, msg.controlFile);
jmarkel44 74:03ccf04998b5 140 } else {
jmarkel44 74:03ccf04998b5 141 printf("\r control %s loaded.\n", msg.controlFile);
jmarkel44 74:03ccf04998b5 142 }
jmarkel44 74:03ccf04998b5 143 } else if ( strncmp( i->name, CONTROL_TM_STR, strlen(CONTROL_TM_STR)) == 0 ) {
jmarkel44 121:650205ffa656 144 // create the timer control
jmarkel44 74:03ccf04998b5 145 Message_t msg;
jmarkel44 74:03ccf04998b5 146 msg.control = CONTROL_TIMER;
jmarkel44 74:03ccf04998b5 147 strncpy(msg.controlFile, i->name, sizeof(msg.controlFile));
jmarkel44 74:03ccf04998b5 148 int rc = createControl(&msg);
jmarkel44 74:03ccf04998b5 149 if ( rc != 0 ) {
jmarkel44 121:650205ffa656 150 logError("%s: failed to load %s", __func__, msg.controlFile);
jmarkel44 121:650205ffa656 151
jmarkel44 74:03ccf04998b5 152 } else {
jmarkel44 74:03ccf04998b5 153 printf("\r control %s loaded.\n", msg.controlFile);
jmarkel44 74:03ccf04998b5 154 }
jmarkel44 74:03ccf04998b5 155 } else if ( strncmp( i->name, CONTROL_MN_STR, strlen(CONTROL_MN_STR)) == 0 ) {
jmarkel44 126:c85ac6a8e9af 156 // TODO: delete any timed manual control, not continuous...
jmarkel44 126:c85ac6a8e9af 157 GLOBAL_mdot->deleteUserFile(i->name);
jmarkel44 74:03ccf04998b5 158 } else {
davidjhoward 162:5e8948b8044d 159 printf("\rNot A Control File%s\r\n",i->name);
jmarkel44 74:03ccf04998b5 160 // not a control file
jmarkel44 74:03ccf04998b5 161 }
davidjhoward 162:5e8948b8044d 162 printf("\rend of loop:%s\r\n",i->name);
jmarkel44 74:03ccf04998b5 163 }
davidjhoward 162:5e8948b8044d 164 printf("\rOUT OF LOOP\r\n");
jmarkel44 12:ea87887ca7ad 165 }
jmarkel44 12:ea87887ca7ad 166 return 0;
jmarkel44 12:ea87887ca7ad 167 }
jmarkel44 12:ea87887ca7ad 168
jmarkel44 12:ea87887ca7ad 169 /*****************************************************************************
jmarkel44 12:ea87887ca7ad 170 * Function: createControl()
jmarkel44 12:ea87887ca7ad 171 * Description: creates a new control
jmarkel44 12:ea87887ca7ad 172 *
jmarkel44 12:ea87887ca7ad 173 * @param none
jmarkel44 12:ea87887ca7ad 174 * @return none
jmarkel44 12:ea87887ca7ad 175 *****************************************************************************/
jmarkel44 5:5e77a1db4d45 176 static int createControl(const Message_t *msg)
jmarkel44 5:5e77a1db4d45 177 {
jmarkel44 37:7e6986b77f01 178 logInfo("\r%s invoked\n", __func__);
jmarkel44 5:5e77a1db4d45 179
jmarkel44 5:5e77a1db4d45 180 switch (msg->control) {
jmarkel44 5:5e77a1db4d45 181 case CONTROL_SETPOINT: {
jmarkel44 46:4cb96ab2d1c8 182 SetpointControl *setpointControl = new SetpointControl;
jmarkel44 28:c410a61238bb 183 bool rc = setpointControl->load(msg->controlFile);
jmarkel44 19:9bc8fabeddfa 184 if ( rc != true ) {
jmarkel44 19:9bc8fabeddfa 185 logError("%s: failed to load %s\n", __func__, msg->controlFile);
jmarkel44 19:9bc8fabeddfa 186 delete setpointControl;
jmarkel44 19:9bc8fabeddfa 187 } else {
jmarkel44 19:9bc8fabeddfa 188 setpointTable[msg->controlFile] = setpointControl;
jmarkel44 74:03ccf04998b5 189 // start the setpoint control
jmarkel44 74:03ccf04998b5 190 setpointControl->start();
jmarkel44 19:9bc8fabeddfa 191 }
jmarkel44 5:5e77a1db4d45 192 break;
jmarkel44 5:5e77a1db4d45 193 }
jmarkel44 5:5e77a1db4d45 194 case CONTROL_TIMER: {
jmarkel44 46:4cb96ab2d1c8 195 TimerControl *timerControl = new TimerControl;
jmarkel44 28:c410a61238bb 196 bool rc = timerControl->load(msg->controlFile);
jmarkel44 19:9bc8fabeddfa 197 if ( rc != true ) {
jmarkel44 19:9bc8fabeddfa 198 logError("%s: failed to load %s\n", __func__, msg->controlFile);
jmarkel44 19:9bc8fabeddfa 199 delete timerControl;
jmarkel44 19:9bc8fabeddfa 200 } else {
jmarkel44 156:44f87c5a83ae 201 timerTable[timerControl->getOutput()].push_back(timerControl);
jmarkel44 156:44f87c5a83ae 202 sort(timerTable[timerControl->getOutput()].begin(),
jmarkel44 156:44f87c5a83ae 203 timerTable[timerControl->getOutput()].end(),
jmarkel44 156:44f87c5a83ae 204 compareStartTime);
jmarkel44 126:c85ac6a8e9af 205 timerControl->start();
jmarkel44 19:9bc8fabeddfa 206 }
jmarkel44 5:5e77a1db4d45 207 break;
jmarkel44 5:5e77a1db4d45 208 }
jmarkel44 46:4cb96ab2d1c8 209 case CONTROL_MANUAL: {
jmarkel44 46:4cb96ab2d1c8 210 ManualControl *manualControl = new ManualControl;
jmarkel44 46:4cb96ab2d1c8 211 bool rc = manualControl->load(msg->controlFile);
jmarkel44 46:4cb96ab2d1c8 212 if ( rc != true ) {
jmarkel44 46:4cb96ab2d1c8 213 logError("%s: failed to load %s\n", __func__, msg->controlFile);
jmarkel44 46:4cb96ab2d1c8 214 delete manualControl;
jmarkel44 46:4cb96ab2d1c8 215 } else {
jmarkel44 46:4cb96ab2d1c8 216 manualTable[msg->controlFile] = manualControl;
jmarkel44 97:5cf6ab71dcd0 217 // start the manual control
jmarkel44 97:5cf6ab71dcd0 218 manualControl->start();
jmarkel44 46:4cb96ab2d1c8 219 }
jmarkel44 46:4cb96ab2d1c8 220 break;
jmarkel44 46:4cb96ab2d1c8 221 }
jmarkel44 19:9bc8fabeddfa 222 case CONTROL_PID:
jmarkel44 19:9bc8fabeddfa 223 case CONTROL_COMPOSITE:
jmarkel44 5:5e77a1db4d45 224 default:
jmarkel44 46:4cb96ab2d1c8 225 logInfo("\r%s: control type %d not implemented yet...\n",
jmarkel44 46:4cb96ab2d1c8 226 __func__, msg->control);
jmarkel44 5:5e77a1db4d45 227 break;
jmarkel44 5:5e77a1db4d45 228 }
jmarkel44 5:5e77a1db4d45 229 return 0;
jmarkel44 5:5e77a1db4d45 230 }
jmarkel44 12:ea87887ca7ad 231
jmarkel44 12:ea87887ca7ad 232 /*****************************************************************************
jmarkel44 12:ea87887ca7ad 233 * Function: modifyControl()
jmarkel44 12:ea87887ca7ad 234 * Description: modifies a control
jmarkel44 12:ea87887ca7ad 235 *
jmarkel44 12:ea87887ca7ad 236 * @param msg
jmarkel44 12:ea87887ca7ad 237 * @return none
jmarkel44 12:ea87887ca7ad 238 *****************************************************************************/
jmarkel44 5:5e77a1db4d45 239 static int modifyControl(const Message_t *msg)
jmarkel44 5:5e77a1db4d45 240 {
jmarkel44 37:7e6986b77f01 241 logInfo("\r%s invoked\n", __func__);
jmarkel44 46:4cb96ab2d1c8 242
jmarkel44 46:4cb96ab2d1c8 243 // TODO: can we delete the current object and start a new one?
jmarkel44 5:5e77a1db4d45 244 return 0;
jmarkel44 5:5e77a1db4d45 245
jmarkel44 5:5e77a1db4d45 246 }
jmarkel44 12:ea87887ca7ad 247
jmarkel44 12:ea87887ca7ad 248 /*****************************************************************************
jmarkel44 12:ea87887ca7ad 249 * Function: destroyControl()
jmarkel44 12:ea87887ca7ad 250 * Description: destroys a controls
jmarkel44 12:ea87887ca7ad 251 *
jmarkel44 12:ea87887ca7ad 252 * @param msg
jmarkel44 12:ea87887ca7ad 253 * @return none
jmarkel44 12:ea87887ca7ad 254 *****************************************************************************/
jmarkel44 5:5e77a1db4d45 255 static int destroyControl(const Message_t *msg)
jmarkel44 5:5e77a1db4d45 256 {
jmarkel44 37:7e6986b77f01 257 logInfo("\r%s invoked\n", __func__);
jmarkel44 12:ea87887ca7ad 258
jmarkel44 12:ea87887ca7ad 259 switch ( msg->control ) {
jmarkel44 12:ea87887ca7ad 260 case CONTROL_SETPOINT: {
jmarkel44 12:ea87887ca7ad 261 StringSetpointMap::iterator pos;
jmarkel44 12:ea87887ca7ad 262 pos = setpointTable.find(msg->controlFile);
jmarkel44 12:ea87887ca7ad 263 if ( pos != setpointTable.end() ) {
jmarkel44 74:03ccf04998b5 264 pos->second->unregisterControl();
jmarkel44 12:ea87887ca7ad 265 delete (pos->second);
jmarkel44 12:ea87887ca7ad 266 setpointTable.erase(pos);
jmarkel44 12:ea87887ca7ad 267 }
jmarkel44 12:ea87887ca7ad 268 break;
jmarkel44 12:ea87887ca7ad 269 }
jmarkel44 12:ea87887ca7ad 270 case CONTROL_TIMER: {
jmarkel44 164:7cecd731882e 271 StringVectorTimerMap::iterator pos;
jmarkel44 164:7cecd731882e 272 #if 0
jmarkel44 12:ea87887ca7ad 273 pos = timerTable.find(msg->controlFile);
jmarkel44 12:ea87887ca7ad 274 if ( pos != timerTable.end() ) {
jmarkel44 12:ea87887ca7ad 275 delete (pos->second);
jmarkel44 12:ea87887ca7ad 276 timerTable.erase(pos);
jmarkel44 12:ea87887ca7ad 277 }
jmarkel44 164:7cecd731882e 278 #endif
jmarkel44 12:ea87887ca7ad 279 break;
jmarkel44 12:ea87887ca7ad 280 }
jmarkel44 46:4cb96ab2d1c8 281 case CONTROL_MANUAL: {
jmarkel44 46:4cb96ab2d1c8 282 StringManualMap::iterator pos;
jmarkel44 46:4cb96ab2d1c8 283 pos = manualTable.find(msg->controlFile);
jmarkel44 46:4cb96ab2d1c8 284 if ( pos != manualTable.end() ) {
jmarkel44 97:5cf6ab71dcd0 285 pos->second->unregisterControl();
jmarkel44 46:4cb96ab2d1c8 286 delete (pos->second);
jmarkel44 46:4cb96ab2d1c8 287 manualTable.erase(pos);
jmarkel44 46:4cb96ab2d1c8 288 }
jmarkel44 46:4cb96ab2d1c8 289 break;
jmarkel44 46:4cb96ab2d1c8 290 }
jmarkel44 12:ea87887ca7ad 291 default:
jmarkel44 12:ea87887ca7ad 292 break;
jmarkel44 12:ea87887ca7ad 293 }
jmarkel44 12:ea87887ca7ad 294 return 0;
jmarkel44 20:653923c2f37a 295 }