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 23 20:36:04 2016 +0000
Revision:
128:534bf29132f8
Parent:
122:4db48b933115
Child:
130:c932494f05b8
better logging via the output task;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmarkel44 70:7427f4959201 1 /******************************************************************************
jmarkel44 70:7427f4959201 2 *
jmarkel44 70:7427f4959201 3 * File: OutputTask.cpp
jmarkel44 70:7427f4959201 4 * Desciption: source for the ICE Output task
jmarkel44 70:7427f4959201 5 *
jmarkel44 70:7427f4959201 6 *****************************************************************************/
jmarkel44 67:49f266601d83 7 #include "OutputTask.h"
jmarkel44 48:1c7861d80d16 8 #include "global.h"
jmarkel44 66:db1425574b58 9 #include "MbedJSONValue.h"
jmarkel44 94:18ae2fd82638 10 #include "ModbusMasterApi.h"
davidjhoward 120:539b20bd3816 11 #include "LoggerApi.h"
jmarkel44 70:7427f4959201 12 #include <vector>
jmarkel44 77:43e0a3d9e536 13 #include <string>
jmarkel44 77:43e0a3d9e536 14 #include <algorithm>
jmarkel44 48:1c7861d80d16 15
jmarkel44 114:c24aebb8b473 16 // local functions
jmarkel44 67:49f266601d83 17 static int createOutput(const char *controlFile);
jmarkel44 66:db1425574b58 18 static void loadPersistentOutputs(void);
jmarkel44 121:650205ffa656 19 static void refreshOutputs(const string);
jmarkel44 115:1558e01d04c6 20 static int enableOutputReq(OutputControlMsg_t *msg);
jmarkel44 115:1558e01d04c6 21 static int disableOutputReq(OutputControlMsg_t *msg);
jmarkel44 72:3754b352f156 22 static int unregisterControl(const char *id, unsigned int pri, const char *output);
jmarkel44 71:34856d21f2bf 23
jmarkel44 84:7b7cad3ba139 24 // The Output Map
jmarkel44 114:c24aebb8b473 25 //
jmarkel44 84:7b7cad3ba139 26 // this is the main data structure used to distinguish which control has
jmarkel44 84:7b7cad3ba139 27 // priority of an output. the layout is as-follows:
jmarkel44 84:7b7cad3ba139 28 //
jmarkel44 84:7b7cad3ba139 29 // outputMap["o_rly1"]-> Control<"ManCtrl_rly1", 100, ON >
jmarkel44 84:7b7cad3ba139 30 // Control<"SetpointCtrl_rly1", 800, OFF>
jmarkel44 84:7b7cad3ba139 31 // outputMap["o_rly2"]-> Control<"SetpointCtrl_rly2", 800, ON >
jmarkel44 84:7b7cad3ba139 32 // outputMap["o_rly3"]-> Control<"TimerControl_rl3", 500, ON>
jmarkel44 84:7b7cad3ba139 33 //
jmarkel44 84:7b7cad3ba139 34 // The Control Vector (per relay) is always sorted by priority, whereas
jmarkel44 84:7b7cad3ba139 35 // the highest priority control is at the beginning (v.begin()) of the
jmarkel44 114:c24aebb8b473 36 // list.
jmarkel44 84:7b7cad3ba139 37
jmarkel44 71:34856d21f2bf 38 typedef std::map<string, vector<Control> > StringOutputVector_t;
jmarkel44 77:43e0a3d9e536 39 StringOutputVector_t outputMap;
jmarkel44 66:db1425574b58 40
jmarkel44 84:7b7cad3ba139 41 // operator for sorting the outputs vectors per output
jmarkel44 80:b12b0adfcdc2 42 bool operator<(const Control &control1, const Control &control2)
jmarkel44 80:b12b0adfcdc2 43 {
jmarkel44 77:43e0a3d9e536 44 return control1.getPriority() < control2.getPriority();
jmarkel44 77:43e0a3d9e536 45 }
jmarkel44 63:0ded43237b22 46
jmarkel44 70:7427f4959201 47 /*****************************************************************************
jmarkel44 70:7427f4959201 48 * Function: OutputTask
jmarkel44 70:7427f4959201 49 * Description: Main entry point for the Output Task
jmarkel44 70:7427f4959201 50 *
jmarkel44 70:7427f4959201 51 * @param args -> not used
jmarkel44 70:7427f4959201 52 * @return none
jmarkel44 70:7427f4959201 53 *****************************************************************************/
jmarkel44 48:1c7861d80d16 54 void OutputTask(void const *args)
jmarkel44 48:1c7861d80d16 55 {
jmarkel44 80:b12b0adfcdc2 56 int rc;
jmarkel44 51:66b820f203a5 57 UNUSED(args);
jmarkel44 70:7427f4959201 58
jmarkel44 67:49f266601d83 59 printf("\r%s has started...\n", __func__);
jmarkel44 63:0ded43237b22 60
jmarkel44 66:db1425574b58 61 loadPersistentOutputs();
jmarkel44 75:96512ccc0443 62 osSignalSet(mainThreadId, sig_output_continue);
jmarkel44 75:96512ccc0443 63
jmarkel44 48:1c7861d80d16 64 while (true) {
jmarkel44 51:66b820f203a5 65 // wait for an event
jmarkel44 56:225786c56315 66 osEvent evt = OutputMasterMailBox.get();
jmarkel44 51:66b820f203a5 67 if (evt.status == osEventMail) {
jmarkel44 80:b12b0adfcdc2 68
jmarkel44 63:0ded43237b22 69 OutputControlMsg_t *msg = (OutputControlMsg_t*) evt.value.p;
jmarkel44 63:0ded43237b22 70
jmarkel44 63:0ded43237b22 71 switch ( msg->action ) {
jmarkel44 63:0ded43237b22 72 case ACTION_NEW:
jmarkel44 63:0ded43237b22 73 // read the file and and create an output entry
jmarkel44 80:b12b0adfcdc2 74 rc = createOutput(msg->controlFile);
jmarkel44 80:b12b0adfcdc2 75 if ( rc != 0 ) {
jmarkel44 80:b12b0adfcdc2 76 logError("%s: failed to create output %s\n",
jmarkel44 80:b12b0adfcdc2 77 __func__, msg->controlFile);
jmarkel44 80:b12b0adfcdc2 78 }
jmarkel44 63:0ded43237b22 79 break;
jmarkel44 71:34856d21f2bf 80 case ACTION_CONTROL_ON:
jmarkel44 115:1558e01d04c6 81 logInfo("%s is requesting ON control of %s", msg->id, msg->output_tag);
jmarkel44 115:1558e01d04c6 82 rc = enableOutputReq(msg);
jmarkel44 80:b12b0adfcdc2 83 if ( rc != 0 ) {
jmarkel44 80:b12b0adfcdc2 84 logError("%s: failed to enabled output for %s",
jmarkel44 80:b12b0adfcdc2 85 __func__, msg->id);
jmarkel44 80:b12b0adfcdc2 86 }
jmarkel44 71:34856d21f2bf 87 break;
jmarkel44 71:34856d21f2bf 88 case ACTION_CONTROL_OFF:
jmarkel44 115:1558e01d04c6 89 logInfo("%s is requesting OFF control of %s", msg->id, msg->output_tag);
jmarkel44 115:1558e01d04c6 90 rc = disableOutputReq(msg);
jmarkel44 80:b12b0adfcdc2 91 if ( rc != 0 ) {
jmarkel44 80:b12b0adfcdc2 92 printf("%s: failed to disabled output for %s",
jmarkel44 80:b12b0adfcdc2 93 __func__, msg->id);
jmarkel44 80:b12b0adfcdc2 94 }
jmarkel44 71:34856d21f2bf 95 break;
jmarkel44 72:3754b352f156 96 case ACTION_CONTROL_UNREGISTER:
jmarkel44 115:1558e01d04c6 97 logInfo("%s is requesting its deletion from %s", msg->id, msg->output_tag);
jmarkel44 115:1558e01d04c6 98 rc = unregisterControl(msg->id, msg->priority, msg->output_tag);
jmarkel44 80:b12b0adfcdc2 99 if ( rc != 0 ) {
jmarkel44 80:b12b0adfcdc2 100 printf("%s: failed to unregister control %s",
jmarkel44 84:7b7cad3ba139 101 __func__, msg->id);
jmarkel44 80:b12b0adfcdc2 102 }
jmarkel44 72:3754b352f156 103 break;
jmarkel44 63:0ded43237b22 104 default:
jmarkel44 63:0ded43237b22 105 break;
jmarkel44 63:0ded43237b22 106 }
jmarkel44 63:0ded43237b22 107
jmarkel44 56:225786c56315 108 // free the message
jmarkel44 56:225786c56315 109 OutputMasterMailBox.free(msg);
jmarkel44 114:c24aebb8b473 110
jmarkel44 114:c24aebb8b473 111 // refresh the outputs
jmarkel44 128:534bf29132f8 112 refreshOutputs(msg->output_tag);
jmarkel44 84:7b7cad3ba139 113 }
jmarkel44 84:7b7cad3ba139 114 }
jmarkel44 84:7b7cad3ba139 115 }
jmarkel44 84:7b7cad3ba139 116
jmarkel44 128:534bf29132f8 117 /*****************************************************************************
jmarkel44 128:534bf29132f8 118 * Function: recordEvent
jmarkel44 128:534bf29132f8 119 * Description: send an event to the logger
jmarkel44 128:534bf29132f8 120 *
jmarkel44 128:534bf29132f8 121 * @param output -> the output channel
jmarkel44 128:534bf29132f8 122 * @param control -> the control, this can be null
jmarkel44 128:534bf29132f8 123 * @return none
jmarkel44 128:534bf29132f8 124 *****************************************************************************/
jmarkel44 115:1558e01d04c6 125 void recordEvent(std::string output, const Control *control)
jmarkel44 114:c24aebb8b473 126 {
jmarkel44 121:650205ffa656 127
jmarkel44 115:1558e01d04c6 128 EventReasonStruct_t ev;
jmarkel44 121:650205ffa656 129 ModbusValue input_value;
jmarkel44 121:650205ffa656 130 ModbusValue output_value;
jmarkel44 115:1558e01d04c6 131 memset(&ev, 0, sizeof(ev));
jmarkel44 121:650205ffa656 132
jmarkel44 128:534bf29132f8 133 if ( !control ) {
jmarkel44 128:534bf29132f8 134 ev.eventReason = EVENT_REASON_NO_CONTROL;
jmarkel44 128:534bf29132f8 135 ModbusMasterReadRegister(output, &output_value);
jmarkel44 128:534bf29132f8 136 strncpy(ev.outputTag, output.c_str(), sizeof(ev.outputTag));
jmarkel44 128:534bf29132f8 137 ev.outputValue = output_value.value;
jmarkel44 128:534bf29132f8 138
jmarkel44 128:534bf29132f8 139 printf("\rEVENT RECORD\n");
jmarkel44 128:534bf29132f8 140 printf("\rev.eventReason = %d\n", ev.eventReason);
jmarkel44 128:534bf29132f8 141 printf("\rev.outputTag = %s\n", ev.outputTag);
jmarkel44 128:534bf29132f8 142 printf("\rev.outputValue = %.02f\n", ev.outputValue);
jmarkel44 128:534bf29132f8 143
jmarkel44 128:534bf29132f8 144 EventLoggerApi(ev);
jmarkel44 128:534bf29132f8 145 return;
jmarkel44 128:534bf29132f8 146 }
jmarkel44 128:534bf29132f8 147
jmarkel44 115:1558e01d04c6 148 switch ( control->getControlType() ) {
jmarkel44 121:650205ffa656 149 case CONTROL_SETPOINT:
jmarkel44 115:1558e01d04c6 150 ev.eventReason = EVENT_REASON_AUTO;
jmarkel44 115:1558e01d04c6 151 strncpy(ev.inputTag, control->getInput().c_str(), sizeof(ev.inputTag));
jmarkel44 115:1558e01d04c6 152 strncpy(ev.outputTag, output.c_str(), sizeof(ev.outputTag));
jmarkel44 115:1558e01d04c6 153 ModbusMasterReadRegister(control->getInput(), &input_value);
jmarkel44 115:1558e01d04c6 154 ModbusMasterReadRegister(output, &output_value);
jmarkel44 115:1558e01d04c6 155 ev.inputValue = input_value.value;
jmarkel44 115:1558e01d04c6 156 ev.outputValue = output_value.value;
jmarkel44 115:1558e01d04c6 157 printf("\rEVENT RECORD\n");
jmarkel44 115:1558e01d04c6 158 printf("\rev.eventReason = %d\n", ev.eventReason);
jmarkel44 115:1558e01d04c6 159 printf("\rev.inputTag = %s\n", ev.inputTag);
jmarkel44 115:1558e01d04c6 160 printf("\rev.outputTag = %s\n", ev.outputTag);
jmarkel44 115:1558e01d04c6 161 printf("\rev.inputValue = %.02f\n", ev.inputValue);
jmarkel44 115:1558e01d04c6 162 printf("\rev.outputValue = %.02f\n", ev.outputValue);
jmarkel44 115:1558e01d04c6 163 EventLoggerApi(ev);
jmarkel44 115:1558e01d04c6 164 break;
jmarkel44 115:1558e01d04c6 165 case CONTROL_MANUAL:
jmarkel44 121:650205ffa656 166 ev.eventReason = EVENT_REASON_MANUAL;
jmarkel44 121:650205ffa656 167 strncpy(ev.outputTag, output.c_str(), sizeof(ev.outputTag));
jmarkel44 121:650205ffa656 168 ModbusMasterReadRegister(output, &output_value);
jmarkel44 121:650205ffa656 169 ev.outputValue = output_value.value;
jmarkel44 121:650205ffa656 170 printf("\rEVENT RECORD\n");
jmarkel44 121:650205ffa656 171 printf("\rev.eventReason = %d\n", ev.eventReason);
jmarkel44 121:650205ffa656 172 printf("\rev.outputTag = %s\n", ev.outputTag);
jmarkel44 121:650205ffa656 173 printf("\rev.outputValue = %.02f\n", ev.outputValue);
jmarkel44 121:650205ffa656 174 EventLoggerApi(ev);
jmarkel44 121:650205ffa656 175 break;
jmarkel44 115:1558e01d04c6 176 default:
jmarkel44 115:1558e01d04c6 177 break;
jmarkel44 115:1558e01d04c6 178 }
jmarkel44 114:c24aebb8b473 179 }
jmarkel44 84:7b7cad3ba139 180
jmarkel44 84:7b7cad3ba139 181 /*****************************************************************************
jmarkel44 84:7b7cad3ba139 182 * Function: refreshOutputs
jmarkel44 84:7b7cad3ba139 183 * Description: send a message to the modbus master of who's in control
jmarkel44 84:7b7cad3ba139 184 *
jmarkel44 84:7b7cad3ba139 185 *
jmarkel44 84:7b7cad3ba139 186 * @param args -> not used
jmarkel44 84:7b7cad3ba139 187 * @return none
jmarkel44 84:7b7cad3ba139 188 *****************************************************************************/
jmarkel44 128:534bf29132f8 189 static void refreshOutputs(const string output_tag)
jmarkel44 84:7b7cad3ba139 190 {
jmarkel44 84:7b7cad3ba139 191 //who's in control here?
jmarkel44 84:7b7cad3ba139 192 StringOutputVector_t::iterator pos;
jmarkel44 84:7b7cad3ba139 193
jmarkel44 128:534bf29132f8 194 pos = outputMap.find(output_tag);
jmarkel44 128:534bf29132f8 195 if ( pos != outputMap.end() ) {
jmarkel44 128:534bf29132f8 196 if ( pos->second.empty() ) {
jmarkel44 128:534bf29132f8 197 // play it safe
jmarkel44 128:534bf29132f8 198 ModbusMasterWriteRegister(pos->first, 0.0);
jmarkel44 128:534bf29132f8 199 recordEvent(pos->first, NULL);
jmarkel44 128:534bf29132f8 200 // TODO: will need to record an event here also if the control is destroyed
jmarkel44 128:534bf29132f8 201 } else {
jmarkel44 128:534bf29132f8 202 ModbusMasterWriteRegister(pos->first, pos->second.begin()->getState());
jmarkel44 128:534bf29132f8 203 recordEvent(pos->first, (Control*)pos->second.begin());
jmarkel44 128:534bf29132f8 204 }
jmarkel44 128:534bf29132f8 205 } else {
jmarkel44 128:534bf29132f8 206 logError("%s failed to find the selected output %s",
jmarkel44 128:534bf29132f8 207 __func__, output_tag.c_str());
jmarkel44 128:534bf29132f8 208 }
jmarkel44 128:534bf29132f8 209
jmarkel44 128:534bf29132f8 210
jmarkel44 128:534bf29132f8 211 #if 0
jmarkel44 84:7b7cad3ba139 212 for ( pos = outputMap.begin(); pos != outputMap.end(); ++pos ) {
jmarkel44 84:7b7cad3ba139 213 if ( pos->second.empty() ) {
jmarkel44 95:42f92b03f1b8 214 // safeguarding
jmarkel44 95:42f92b03f1b8 215 ModbusMasterWriteRegister(pos->first, 0.00);
jmarkel44 84:7b7cad3ba139 216 } else {
jmarkel44 84:7b7cad3ba139 217 // a control is tied to this output
jmarkel44 128:534bf29132f8 218 // TODO: fix this so that only the output for which an action
jmarkel44 128:534bf29132f8 219 // occurred is updated
jmarkel44 128:534bf29132f8 220 //if ( id == pos->second.begin()->getId() )
jmarkel44 128:534bf29132f8 221 {
jmarkel44 121:650205ffa656 222
jmarkel44 121:650205ffa656 223 ModbusMasterWriteRegister(pos->first, pos->second.begin()->getState());
jmarkel44 121:650205ffa656 224 recordEvent(pos->first, (Control*)pos->second.begin());
jmarkel44 121:650205ffa656 225 }
jmarkel44 51:66b820f203a5 226 }
jmarkel44 48:1c7861d80d16 227 }
jmarkel44 128:534bf29132f8 228 #endif
jmarkel44 66:db1425574b58 229 }
jmarkel44 66:db1425574b58 230
jmarkel44 70:7427f4959201 231 /*****************************************************************************
jmarkel44 70:7427f4959201 232 * Function: DisplayOutputs
jmarkel44 70:7427f4959201 233 * Description: Display a list of outputs and its controls
jmarkel44 70:7427f4959201 234 *
jmarkel44 70:7427f4959201 235 * @param args -> not used
jmarkel44 70:7427f4959201 236 * @return none
jmarkel44 70:7427f4959201 237 *****************************************************************************/
jmarkel44 66:db1425574b58 238 void DisplayOutputs(void)
jmarkel44 66:db1425574b58 239 {
jmarkel44 66:db1425574b58 240 StringOutputVector_t::iterator pos;
jmarkel44 66:db1425574b58 241
jmarkel44 66:db1425574b58 242 for ( pos = outputMap.begin(); pos != outputMap.end(); ++pos ) {
jmarkel44 71:34856d21f2bf 243 if ( pos->second.empty() ) {
jmarkel44 71:34856d21f2bf 244 printf("\r [%s]->[no controls]\n", pos->first.c_str());
jmarkel44 71:34856d21f2bf 245 } else {
jmarkel44 71:34856d21f2bf 246 printf("\r [%s]->", pos->first.c_str());
jmarkel44 71:34856d21f2bf 247 vector<Control>::iterator i;
jmarkel44 71:34856d21f2bf 248 for ( i = pos->second.begin(); i != pos->second.end(); ++i ) {
jmarkel44 71:34856d21f2bf 249 i->display();
jmarkel44 71:34856d21f2bf 250 }
jmarkel44 71:34856d21f2bf 251 printf("\n");
jmarkel44 71:34856d21f2bf 252 }
jmarkel44 66:db1425574b58 253 }
jmarkel44 66:db1425574b58 254 printf("\r\n");
jmarkel44 66:db1425574b58 255 }
jmarkel44 66:db1425574b58 256
jmarkel44 71:34856d21f2bf 257
jmarkel44 71:34856d21f2bf 258 /*****************************************************************************
jmarkel44 72:3754b352f156 259 * Function: createOutput
jmarkel44 72:3754b352f156 260 * Description:
jmarkel44 71:34856d21f2bf 261 *
jmarkel44 77:43e0a3d9e536 262 * @param controlFile -> name of output file
jmarkel44 71:34856d21f2bf 263 * @return none
jmarkel44 71:34856d21f2bf 264 *****************************************************************************/
jmarkel44 77:43e0a3d9e536 265 static int createOutput(const char *outputFile)
jmarkel44 66:db1425574b58 266 {
jmarkel44 66:db1425574b58 267 char dataBuf[1024];
jmarkel44 77:43e0a3d9e536 268 int status = GLOBAL_mdot->readUserFile(outputFile, (void *)dataBuf, sizeof(dataBuf));
jmarkel44 67:49f266601d83 269 if ( status != true ) {
jmarkel44 77:43e0a3d9e536 270 logError("%s failed to read %s", __func__, outputFile);
jmarkel44 66:db1425574b58 271 return -1;
jmarkel44 66:db1425574b58 272 }
jmarkel44 66:db1425574b58 273
jmarkel44 66:db1425574b58 274 MbedJSONValue json_value;
jmarkel44 66:db1425574b58 275 parse(json_value, dataBuf);
jmarkel44 66:db1425574b58 276
jmarkel44 66:db1425574b58 277 // extract the relay information
jmarkel44 66:db1425574b58 278 string id = json_value["id"].get<string>();
jmarkel44 66:db1425574b58 279
jmarkel44 77:43e0a3d9e536 280 // maps don't allow duplicates, and the vector is empty for now
jmarkel44 71:34856d21f2bf 281 vector<Control> v;
jmarkel44 71:34856d21f2bf 282 outputMap[id] = v;
jmarkel44 71:34856d21f2bf 283
jmarkel44 71:34856d21f2bf 284 return 0;
jmarkel44 71:34856d21f2bf 285 }
jmarkel44 71:34856d21f2bf 286
jmarkel44 71:34856d21f2bf 287
jmarkel44 71:34856d21f2bf 288 /*****************************************************************************
jmarkel44 72:3754b352f156 289 * Function: enableOutputReq
jmarkel44 71:34856d21f2bf 290 * Description: Display a list of outputs and its controls
jmarkel44 71:34856d21f2bf 291 *
jmarkel44 71:34856d21f2bf 292 * @param args -> not used
jmarkel44 71:34856d21f2bf 293 * @return none
jmarkel44 71:34856d21f2bf 294 *****************************************************************************/
jmarkel44 115:1558e01d04c6 295 static int enableOutputReq(OutputControlMsg_t *msg)
jmarkel44 71:34856d21f2bf 296 {
jmarkel44 71:34856d21f2bf 297 // attempt to find the output in the map
jmarkel44 71:34856d21f2bf 298 StringOutputVector_t::iterator pos;
jmarkel44 71:34856d21f2bf 299
jmarkel44 115:1558e01d04c6 300 pos = outputMap.find(msg->output_tag);
jmarkel44 71:34856d21f2bf 301 if ( pos == outputMap.end() ) {
jmarkel44 71:34856d21f2bf 302 printf("%s: failed to find the designated output %s\n",
jmarkel44 115:1558e01d04c6 303 __func__, msg->output_tag);
jmarkel44 71:34856d21f2bf 304 return -1;
jmarkel44 71:34856d21f2bf 305 }
jmarkel44 71:34856d21f2bf 306
jmarkel44 71:34856d21f2bf 307 if ( pos->second.empty() ) {
jmarkel44 71:34856d21f2bf 308 // this is a new request
jmarkel44 115:1558e01d04c6 309 string cid(msg->id);
jmarkel44 115:1558e01d04c6 310 string input(msg->input_tag);
jmarkel44 115:1558e01d04c6 311 Control c(cid, msg->controlType, input, msg->priority, CONTROL_ON);
jmarkel44 71:34856d21f2bf 312 pos->second.push_back(c);
jmarkel44 71:34856d21f2bf 313 } else {
jmarkel44 71:34856d21f2bf 314 // find this control in the list
jmarkel44 71:34856d21f2bf 315 vector<Control>::iterator v;
jmarkel44 71:34856d21f2bf 316 for ( v = pos->second.begin(); v != pos->second.end(); ++v ) {
jmarkel44 115:1558e01d04c6 317 if ( strcmp(v->getId().c_str(), msg->id) == 0 ) {
jmarkel44 71:34856d21f2bf 318 v->setState(CONTROL_ON);
jmarkel44 77:43e0a3d9e536 319 break;
jmarkel44 71:34856d21f2bf 320 }
jmarkel44 71:34856d21f2bf 321 }
jmarkel44 77:43e0a3d9e536 322 if ( v == pos->second.end() ) {
jmarkel44 77:43e0a3d9e536 323 // this is a new request, so add it and sort the vector
jmarkel44 115:1558e01d04c6 324 string cid(msg->id);
jmarkel44 115:1558e01d04c6 325 string input(msg->input_tag);
jmarkel44 115:1558e01d04c6 326 Control c(cid, msg->controlType, input, msg->priority, CONTROL_ON);
jmarkel44 77:43e0a3d9e536 327 pos->second.push_back(c);
jmarkel44 77:43e0a3d9e536 328 std::sort(pos->second.begin(), pos->second.end());
jmarkel44 77:43e0a3d9e536 329 }
jmarkel44 71:34856d21f2bf 330 }
jmarkel44 71:34856d21f2bf 331
jmarkel44 71:34856d21f2bf 332 return 0;
jmarkel44 71:34856d21f2bf 333 }
jmarkel44 71:34856d21f2bf 334
jmarkel44 71:34856d21f2bf 335 /*****************************************************************************
jmarkel44 72:3754b352f156 336 * Function: disableOutputReq
jmarkel44 72:3754b352f156 337 * Description:
jmarkel44 71:34856d21f2bf 338 *
jmarkel44 71:34856d21f2bf 339 * @param args -> not used
jmarkel44 71:34856d21f2bf 340 * @return none
jmarkel44 71:34856d21f2bf 341 *****************************************************************************/
jmarkel44 115:1558e01d04c6 342 static int disableOutputReq(OutputControlMsg_t *msg)
jmarkel44 71:34856d21f2bf 343 {
jmarkel44 71:34856d21f2bf 344 // attempt to find the output in the map
jmarkel44 71:34856d21f2bf 345 StringOutputVector_t::iterator pos;
jmarkel44 71:34856d21f2bf 346
jmarkel44 115:1558e01d04c6 347 pos = outputMap.find(msg->output_tag);
jmarkel44 71:34856d21f2bf 348 if ( pos == outputMap.end() ) {
jmarkel44 71:34856d21f2bf 349 printf("%s: failed to find the designated output %s\n",
jmarkel44 115:1558e01d04c6 350 __func__, msg->output_tag);
jmarkel44 71:34856d21f2bf 351 return -1;
jmarkel44 71:34856d21f2bf 352 }
jmarkel44 71:34856d21f2bf 353
jmarkel44 80:b12b0adfcdc2 354 // if the control list is empty, push this control on the list
jmarkel44 71:34856d21f2bf 355 if ( pos->second.empty() ) {
jmarkel44 115:1558e01d04c6 356 string cid(msg->id);
jmarkel44 115:1558e01d04c6 357 string input(msg->input_tag);
jmarkel44 115:1558e01d04c6 358 Control c(cid, msg->controlType, input, msg->priority, CONTROL_OFF);
jmarkel44 71:34856d21f2bf 359 pos->second.push_back(c);
jmarkel44 71:34856d21f2bf 360 } else {
jmarkel44 71:34856d21f2bf 361 // find this control in the list
jmarkel44 71:34856d21f2bf 362 vector<Control>::iterator v;
jmarkel44 71:34856d21f2bf 363 for ( v = pos->second.begin(); v != pos->second.end(); ++v ) {
jmarkel44 115:1558e01d04c6 364 if ( strcmp(v->getId().c_str(), msg->id) == 0 ) {
jmarkel44 71:34856d21f2bf 365 v->setState(CONTROL_OFF);
jmarkel44 77:43e0a3d9e536 366 break;
jmarkel44 71:34856d21f2bf 367 }
jmarkel44 71:34856d21f2bf 368 }
jmarkel44 80:b12b0adfcdc2 369
jmarkel44 80:b12b0adfcdc2 370 if ( v == pos->second.end() ) {
jmarkel44 80:b12b0adfcdc2 371 // this is a new request, so add it and sort the vector
jmarkel44 115:1558e01d04c6 372 string cid(msg->id);
jmarkel44 115:1558e01d04c6 373 string input(msg->input_tag);
jmarkel44 115:1558e01d04c6 374 Control c(cid, msg->controlType, input, msg->priority, CONTROL_OFF);
jmarkel44 80:b12b0adfcdc2 375 pos->second.push_back(c);
jmarkel44 80:b12b0adfcdc2 376 std::sort(pos->second.begin(), pos->second.end());
jmarkel44 80:b12b0adfcdc2 377 }
jmarkel44 71:34856d21f2bf 378 }
jmarkel44 66:db1425574b58 379
jmarkel44 66:db1425574b58 380 return 0;
jmarkel44 66:db1425574b58 381 }
jmarkel44 66:db1425574b58 382
jmarkel44 74:03ccf04998b5 383 /*****************************************************************************
jmarkel44 74:03ccf04998b5 384 * Function: unregisterControl
jmarkel44 74:03ccf04998b5 385 * Description:
jmarkel44 74:03ccf04998b5 386 *
jmarkel44 74:03ccf04998b5 387 * @param id -> control identifier
jmarkel44 74:03ccf04998b5 388 * @param pri -> priority
jmarkel44 74:03ccf04998b5 389 * @param output -> output (e.g. "o_rly5)
jmarkel44 74:03ccf04998b5 390 *
jmarkel44 74:03ccf04998b5 391 * @return 0 on success; -1 on error
jmarkel44 74:03ccf04998b5 392 *****************************************************************************/
jmarkel44 72:3754b352f156 393 static int unregisterControl(const char *id, unsigned int pri, const char *output)
jmarkel44 72:3754b352f156 394 {
jmarkel44 72:3754b352f156 395 // attempt to find the output in the map
jmarkel44 72:3754b352f156 396 StringOutputVector_t::iterator pos;
jmarkel44 80:b12b0adfcdc2 397 bool found = false;
jmarkel44 72:3754b352f156 398
jmarkel44 72:3754b352f156 399 pos = outputMap.find(output);
jmarkel44 72:3754b352f156 400 if ( pos == outputMap.end() ) {
jmarkel44 72:3754b352f156 401 printf("%s: failed to find the designated output %s\n",
jmarkel44 72:3754b352f156 402 __func__, output);
jmarkel44 72:3754b352f156 403 return -1;
jmarkel44 72:3754b352f156 404 }
jmarkel44 72:3754b352f156 405
jmarkel44 72:3754b352f156 406 // find the control in the list
jmarkel44 72:3754b352f156 407 vector<Control>::iterator v;
jmarkel44 72:3754b352f156 408 for ( v = pos->second.begin(); v != pos->second.end(); ++v) {
jmarkel44 72:3754b352f156 409 if ( strcmp(v->getId().c_str(), id) == 0 ) {
jmarkel44 72:3754b352f156 410 // delete this entry
jmarkel44 72:3754b352f156 411 pos->second.erase(v);
jmarkel44 80:b12b0adfcdc2 412 found = true;
jmarkel44 72:3754b352f156 413 break;
jmarkel44 72:3754b352f156 414 }
jmarkel44 74:03ccf04998b5 415 }
jmarkel44 128:534bf29132f8 416
jmarkel44 80:b12b0adfcdc2 417 if ( !found ) {
jmarkel44 80:b12b0adfcdc2 418 logError("%s: failed to find control %s in list", __func__, id);
jmarkel44 80:b12b0adfcdc2 419 return -1;
jmarkel44 80:b12b0adfcdc2 420 }
jmarkel44 72:3754b352f156 421 return 0;
jmarkel44 72:3754b352f156 422 }
jmarkel44 72:3754b352f156 423
jmarkel44 72:3754b352f156 424 /*****************************************************************************
jmarkel44 72:3754b352f156 425 * Function: loadPersistentOutputs
jmarkel44 72:3754b352f156 426 * Description: pump up the output map based on persistent files
jmarkel44 72:3754b352f156 427 *
jmarkel44 72:3754b352f156 428 * @param args -> not used
jmarkel44 72:3754b352f156 429 * @return none
jmarkel44 72:3754b352f156 430 *****************************************************************************/
jmarkel44 66:db1425574b58 431 static void loadPersistentOutputs(void)
jmarkel44 66:db1425574b58 432 {
jmarkel44 66:db1425574b58 433 bool status;
jmarkel44 66:db1425574b58 434 MbedJSONValue json_value;
jmarkel44 71:34856d21f2bf 435
jmarkel44 77:43e0a3d9e536 436 printf("\rLoading persistent outputs:\n");
jmarkel44 66:db1425574b58 437
jmarkel44 66:db1425574b58 438 std::vector<mDot::mdot_file> file_list = GLOBAL_mdot->listUserFiles();
jmarkel44 70:7427f4959201 439
jmarkel44 66:db1425574b58 440 for (std::vector<mDot::mdot_file>::iterator i = file_list.begin(); i != file_list.end(); ++i) {
jmarkel44 67:49f266601d83 441 if( strncmp( i->name, OUTPUT_STR, strlen(OUTPUT_STR)) == 0 ) {
jmarkel44 66:db1425574b58 442
jmarkel44 66:db1425574b58 443 logInfo("%s: FOUND OUTPUT FILE: %s", __func__, i->name);
jmarkel44 66:db1425574b58 444
jmarkel44 66:db1425574b58 445 char scratchBuf[1024];
jmarkel44 66:db1425574b58 446
jmarkel44 66:db1425574b58 447 status = GLOBAL_mdot->readUserFile(i->name, scratchBuf, 1024);
jmarkel44 66:db1425574b58 448 if( status != true ) {
jmarkel44 66:db1425574b58 449 logInfo("(%d)read file failed, status=%d", __LINE__, status);
jmarkel44 66:db1425574b58 450 } else {
jmarkel44 66:db1425574b58 451 logInfo("(%d)Read File SUCCESS: %s", __LINE__, scratchBuf );
jmarkel44 66:db1425574b58 452 }
jmarkel44 66:db1425574b58 453
jmarkel44 66:db1425574b58 454 parse( json_value, scratchBuf );
jmarkel44 66:db1425574b58 455
jmarkel44 66:db1425574b58 456 string id = json_value["id"].get<string>();
jmarkel44 77:43e0a3d9e536 457 printf("\r output %s loaded\n", i->name);
jmarkel44 74:03ccf04998b5 458
jmarkel44 80:b12b0adfcdc2 459 // emplace the empty control vector into the output map
jmarkel44 71:34856d21f2bf 460 vector<Control> v;
jmarkel44 71:34856d21f2bf 461 outputMap[id] = v;
jmarkel44 66:db1425574b58 462 }
jmarkel44 66:db1425574b58 463 }
jmarkel44 70:7427f4959201 464 }