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 12:45:49 2016 +0000
Revision:
121:650205ffa656
Parent:
120:539b20bd3816
Child:
122:4db48b933115
event logging of manual controls;

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 121:650205ffa656 112 refreshOutputs(msg->id);
jmarkel44 84:7b7cad3ba139 113 }
jmarkel44 84:7b7cad3ba139 114 }
jmarkel44 84:7b7cad3ba139 115 }
jmarkel44 84:7b7cad3ba139 116
jmarkel44 115:1558e01d04c6 117 void recordEvent(std::string output, const Control *control)
jmarkel44 114:c24aebb8b473 118 {
jmarkel44 121:650205ffa656 119
jmarkel44 115:1558e01d04c6 120 EventReasonStruct_t ev;
jmarkel44 121:650205ffa656 121 ModbusValue input_value;
jmarkel44 121:650205ffa656 122 ModbusValue output_value;
jmarkel44 115:1558e01d04c6 123 memset(&ev, 0, sizeof(ev));
jmarkel44 121:650205ffa656 124
jmarkel44 115:1558e01d04c6 125 switch ( control->getControlType() ) {
jmarkel44 121:650205ffa656 126 case CONTROL_SETPOINT:
jmarkel44 115:1558e01d04c6 127 ev.eventReason = EVENT_REASON_AUTO;
jmarkel44 115:1558e01d04c6 128 strncpy(ev.inputTag, control->getInput().c_str(), sizeof(ev.inputTag));
jmarkel44 115:1558e01d04c6 129 strncpy(ev.outputTag, output.c_str(), sizeof(ev.outputTag));
jmarkel44 115:1558e01d04c6 130 ModbusMasterReadRegister(control->getInput(), &input_value);
jmarkel44 115:1558e01d04c6 131 ModbusMasterReadRegister(output, &output_value);
jmarkel44 115:1558e01d04c6 132 ev.inputValue = input_value.value;
jmarkel44 115:1558e01d04c6 133 ev.outputValue = output_value.value;
jmarkel44 115:1558e01d04c6 134 printf("\rEVENT RECORD\n");
jmarkel44 115:1558e01d04c6 135 printf("\rev.eventReason = %d\n", ev.eventReason);
jmarkel44 115:1558e01d04c6 136 printf("\rev.inputTag = %s\n", ev.inputTag);
jmarkel44 115:1558e01d04c6 137 printf("\rev.outputTag = %s\n", ev.outputTag);
jmarkel44 115:1558e01d04c6 138 printf("\rev.inputValue = %.02f\n", ev.inputValue);
jmarkel44 115:1558e01d04c6 139 printf("\rev.outputValue = %.02f\n", ev.outputValue);
jmarkel44 115:1558e01d04c6 140 EventLoggerApi(ev);
jmarkel44 115:1558e01d04c6 141 break;
jmarkel44 115:1558e01d04c6 142 case CONTROL_MANUAL:
jmarkel44 121:650205ffa656 143 ev.eventReason = EVENT_REASON_MANUAL;
jmarkel44 121:650205ffa656 144 strncpy(ev.outputTag, output.c_str(), sizeof(ev.outputTag));
jmarkel44 121:650205ffa656 145 ModbusMasterReadRegister(output, &output_value);
jmarkel44 121:650205ffa656 146 ev.outputValue = output_value.value;
jmarkel44 121:650205ffa656 147 printf("\rEVENT RECORD\n");
jmarkel44 121:650205ffa656 148 printf("\rev.eventReason = %d\n", ev.eventReason);
jmarkel44 121:650205ffa656 149 printf("\rev.outputTag = %s\n", ev.outputTag);
jmarkel44 121:650205ffa656 150 printf("\rev.outputValue = %.02f\n", ev.outputValue);
jmarkel44 121:650205ffa656 151 EventLoggerApi(ev);
jmarkel44 121:650205ffa656 152 break;
jmarkel44 115:1558e01d04c6 153 default:
jmarkel44 115:1558e01d04c6 154 break;
jmarkel44 115:1558e01d04c6 155 }
jmarkel44 114:c24aebb8b473 156 }
jmarkel44 84:7b7cad3ba139 157
jmarkel44 84:7b7cad3ba139 158 /*****************************************************************************
jmarkel44 84:7b7cad3ba139 159 * Function: refreshOutputs
jmarkel44 84:7b7cad3ba139 160 * Description: send a message to the modbus master of who's in control
jmarkel44 84:7b7cad3ba139 161 *
jmarkel44 84:7b7cad3ba139 162 *
jmarkel44 84:7b7cad3ba139 163 * @param args -> not used
jmarkel44 84:7b7cad3ba139 164 * @return none
jmarkel44 84:7b7cad3ba139 165 *****************************************************************************/
jmarkel44 121:650205ffa656 166 static void refreshOutputs(const string id)
jmarkel44 84:7b7cad3ba139 167 {
jmarkel44 84:7b7cad3ba139 168 //who's in control here?
jmarkel44 84:7b7cad3ba139 169 StringOutputVector_t::iterator pos;
jmarkel44 84:7b7cad3ba139 170
jmarkel44 84:7b7cad3ba139 171 for ( pos = outputMap.begin(); pos != outputMap.end(); ++pos ) {
jmarkel44 84:7b7cad3ba139 172 if ( pos->second.empty() ) {
jmarkel44 95:42f92b03f1b8 173 // safeguarding
jmarkel44 95:42f92b03f1b8 174 ModbusMasterWriteRegister(pos->first, 0.00);
jmarkel44 84:7b7cad3ba139 175 } else {
jmarkel44 84:7b7cad3ba139 176 // a control is tied to this output
jmarkel44 121:650205ffa656 177 if ( id == pos->second.begin()->getId() ) {
jmarkel44 121:650205ffa656 178
jmarkel44 121:650205ffa656 179 ModbusMasterWriteRegister(pos->first, pos->second.begin()->getState());
jmarkel44 121:650205ffa656 180 recordEvent(pos->first, (Control*)pos->second.begin());
jmarkel44 121:650205ffa656 181 }
jmarkel44 51:66b820f203a5 182 }
jmarkel44 48:1c7861d80d16 183 }
jmarkel44 66:db1425574b58 184 }
jmarkel44 66:db1425574b58 185
jmarkel44 70:7427f4959201 186 /*****************************************************************************
jmarkel44 70:7427f4959201 187 * Function: DisplayOutputs
jmarkel44 70:7427f4959201 188 * Description: Display a list of outputs and its controls
jmarkel44 70:7427f4959201 189 *
jmarkel44 70:7427f4959201 190 * @param args -> not used
jmarkel44 70:7427f4959201 191 * @return none
jmarkel44 70:7427f4959201 192 *****************************************************************************/
jmarkel44 66:db1425574b58 193 void DisplayOutputs(void)
jmarkel44 66:db1425574b58 194 {
jmarkel44 66:db1425574b58 195 StringOutputVector_t::iterator pos;
jmarkel44 66:db1425574b58 196
jmarkel44 66:db1425574b58 197 for ( pos = outputMap.begin(); pos != outputMap.end(); ++pos ) {
jmarkel44 71:34856d21f2bf 198 if ( pos->second.empty() ) {
jmarkel44 71:34856d21f2bf 199 printf("\r [%s]->[no controls]\n", pos->first.c_str());
jmarkel44 71:34856d21f2bf 200 } else {
jmarkel44 71:34856d21f2bf 201 printf("\r [%s]->", pos->first.c_str());
jmarkel44 71:34856d21f2bf 202 vector<Control>::iterator i;
jmarkel44 71:34856d21f2bf 203 for ( i = pos->second.begin(); i != pos->second.end(); ++i ) {
jmarkel44 71:34856d21f2bf 204 i->display();
jmarkel44 71:34856d21f2bf 205 }
jmarkel44 71:34856d21f2bf 206 printf("\n");
jmarkel44 71:34856d21f2bf 207 }
jmarkel44 66:db1425574b58 208 }
jmarkel44 66:db1425574b58 209 printf("\r\n");
jmarkel44 66:db1425574b58 210 }
jmarkel44 66:db1425574b58 211
jmarkel44 71:34856d21f2bf 212
jmarkel44 71:34856d21f2bf 213 /*****************************************************************************
jmarkel44 72:3754b352f156 214 * Function: createOutput
jmarkel44 72:3754b352f156 215 * Description:
jmarkel44 71:34856d21f2bf 216 *
jmarkel44 77:43e0a3d9e536 217 * @param controlFile -> name of output file
jmarkel44 71:34856d21f2bf 218 * @return none
jmarkel44 71:34856d21f2bf 219 *****************************************************************************/
jmarkel44 77:43e0a3d9e536 220 static int createOutput(const char *outputFile)
jmarkel44 66:db1425574b58 221 {
jmarkel44 66:db1425574b58 222 char dataBuf[1024];
jmarkel44 77:43e0a3d9e536 223 int status = GLOBAL_mdot->readUserFile(outputFile, (void *)dataBuf, sizeof(dataBuf));
jmarkel44 67:49f266601d83 224 if ( status != true ) {
jmarkel44 77:43e0a3d9e536 225 logError("%s failed to read %s", __func__, outputFile);
jmarkel44 66:db1425574b58 226 return -1;
jmarkel44 66:db1425574b58 227 }
jmarkel44 66:db1425574b58 228
jmarkel44 66:db1425574b58 229 MbedJSONValue json_value;
jmarkel44 66:db1425574b58 230 parse(json_value, dataBuf);
jmarkel44 66:db1425574b58 231
jmarkel44 66:db1425574b58 232 // extract the relay information
jmarkel44 66:db1425574b58 233 string id = json_value["id"].get<string>();
jmarkel44 66:db1425574b58 234
jmarkel44 77:43e0a3d9e536 235 // maps don't allow duplicates, and the vector is empty for now
jmarkel44 71:34856d21f2bf 236 vector<Control> v;
jmarkel44 71:34856d21f2bf 237 outputMap[id] = v;
jmarkel44 71:34856d21f2bf 238
jmarkel44 71:34856d21f2bf 239 return 0;
jmarkel44 71:34856d21f2bf 240 }
jmarkel44 71:34856d21f2bf 241
jmarkel44 71:34856d21f2bf 242
jmarkel44 71:34856d21f2bf 243 /*****************************************************************************
jmarkel44 72:3754b352f156 244 * Function: enableOutputReq
jmarkel44 71:34856d21f2bf 245 * Description: Display a list of outputs and its controls
jmarkel44 71:34856d21f2bf 246 *
jmarkel44 71:34856d21f2bf 247 * @param args -> not used
jmarkel44 71:34856d21f2bf 248 * @return none
jmarkel44 71:34856d21f2bf 249 *****************************************************************************/
jmarkel44 115:1558e01d04c6 250 //static int enableOutputReq(const char *id, unsigned int priority, const char *output)
jmarkel44 115:1558e01d04c6 251 static int enableOutputReq(OutputControlMsg_t *msg)
jmarkel44 71:34856d21f2bf 252 {
jmarkel44 71:34856d21f2bf 253 // attempt to find the output in the map
jmarkel44 71:34856d21f2bf 254 StringOutputVector_t::iterator pos;
jmarkel44 71:34856d21f2bf 255
jmarkel44 115:1558e01d04c6 256 pos = outputMap.find(msg->output_tag);
jmarkel44 71:34856d21f2bf 257 if ( pos == outputMap.end() ) {
jmarkel44 71:34856d21f2bf 258 printf("%s: failed to find the designated output %s\n",
jmarkel44 115:1558e01d04c6 259 __func__, msg->output_tag);
jmarkel44 71:34856d21f2bf 260 return -1;
jmarkel44 71:34856d21f2bf 261 }
jmarkel44 71:34856d21f2bf 262
jmarkel44 71:34856d21f2bf 263 if ( pos->second.empty() ) {
jmarkel44 71:34856d21f2bf 264 // this is a new request
jmarkel44 115:1558e01d04c6 265 string cid(msg->id);
jmarkel44 115:1558e01d04c6 266 string input(msg->input_tag);
jmarkel44 115:1558e01d04c6 267 Control c(cid, msg->controlType, input, msg->priority, CONTROL_ON);
jmarkel44 71:34856d21f2bf 268 pos->second.push_back(c);
jmarkel44 71:34856d21f2bf 269 } else {
jmarkel44 71:34856d21f2bf 270 // find this control in the list
jmarkel44 71:34856d21f2bf 271 vector<Control>::iterator v;
jmarkel44 71:34856d21f2bf 272 for ( v = pos->second.begin(); v != pos->second.end(); ++v ) {
jmarkel44 115:1558e01d04c6 273 if ( strcmp(v->getId().c_str(), msg->id) == 0 ) {
jmarkel44 71:34856d21f2bf 274 v->setState(CONTROL_ON);
jmarkel44 77:43e0a3d9e536 275 break;
jmarkel44 71:34856d21f2bf 276 }
jmarkel44 71:34856d21f2bf 277 }
jmarkel44 77:43e0a3d9e536 278 if ( v == pos->second.end() ) {
jmarkel44 77:43e0a3d9e536 279 // this is a new request, so add it and sort the vector
jmarkel44 115:1558e01d04c6 280 string cid(msg->id);
jmarkel44 115:1558e01d04c6 281 string input(msg->input_tag);
jmarkel44 115:1558e01d04c6 282 Control c(cid, msg->controlType, input, msg->priority, CONTROL_ON);
jmarkel44 77:43e0a3d9e536 283 pos->second.push_back(c);
jmarkel44 77:43e0a3d9e536 284 std::sort(pos->second.begin(), pos->second.end());
jmarkel44 77:43e0a3d9e536 285 }
jmarkel44 71:34856d21f2bf 286 }
jmarkel44 71:34856d21f2bf 287
jmarkel44 71:34856d21f2bf 288 return 0;
jmarkel44 71:34856d21f2bf 289 }
jmarkel44 71:34856d21f2bf 290
jmarkel44 71:34856d21f2bf 291 /*****************************************************************************
jmarkel44 72:3754b352f156 292 * Function: disableOutputReq
jmarkel44 72:3754b352f156 293 * Description:
jmarkel44 71:34856d21f2bf 294 *
jmarkel44 71:34856d21f2bf 295 * @param args -> not used
jmarkel44 71:34856d21f2bf 296 * @return none
jmarkel44 71:34856d21f2bf 297 *****************************************************************************/
jmarkel44 115:1558e01d04c6 298 static int disableOutputReq(OutputControlMsg_t *msg)
jmarkel44 71:34856d21f2bf 299 {
jmarkel44 71:34856d21f2bf 300 // attempt to find the output in the map
jmarkel44 71:34856d21f2bf 301 StringOutputVector_t::iterator pos;
jmarkel44 71:34856d21f2bf 302
jmarkel44 115:1558e01d04c6 303 pos = outputMap.find(msg->output_tag);
jmarkel44 71:34856d21f2bf 304 if ( pos == outputMap.end() ) {
jmarkel44 71:34856d21f2bf 305 printf("%s: failed to find the designated output %s\n",
jmarkel44 115:1558e01d04c6 306 __func__, msg->output_tag);
jmarkel44 71:34856d21f2bf 307 return -1;
jmarkel44 71:34856d21f2bf 308 }
jmarkel44 71:34856d21f2bf 309
jmarkel44 80:b12b0adfcdc2 310 // if the control list is empty, push this control on the list
jmarkel44 71:34856d21f2bf 311 if ( pos->second.empty() ) {
jmarkel44 115:1558e01d04c6 312 string cid(msg->id);
jmarkel44 115:1558e01d04c6 313 string input(msg->input_tag);
jmarkel44 115:1558e01d04c6 314 Control c(cid, msg->controlType, input, msg->priority, CONTROL_OFF);
jmarkel44 71:34856d21f2bf 315 pos->second.push_back(c);
jmarkel44 71:34856d21f2bf 316 } else {
jmarkel44 71:34856d21f2bf 317 // find this control in the list
jmarkel44 71:34856d21f2bf 318 vector<Control>::iterator v;
jmarkel44 71:34856d21f2bf 319 for ( v = pos->second.begin(); v != pos->second.end(); ++v ) {
jmarkel44 115:1558e01d04c6 320 if ( strcmp(v->getId().c_str(), msg->id) == 0 ) {
jmarkel44 71:34856d21f2bf 321 v->setState(CONTROL_OFF);
jmarkel44 77:43e0a3d9e536 322 break;
jmarkel44 71:34856d21f2bf 323 }
jmarkel44 71:34856d21f2bf 324 }
jmarkel44 80:b12b0adfcdc2 325
jmarkel44 80:b12b0adfcdc2 326 if ( v == pos->second.end() ) {
jmarkel44 80:b12b0adfcdc2 327 // this is a new request, so add it and sort the vector
jmarkel44 115:1558e01d04c6 328 string cid(msg->id);
jmarkel44 115:1558e01d04c6 329 string input(msg->input_tag);
jmarkel44 115:1558e01d04c6 330 Control c(cid, msg->controlType, input, msg->priority, CONTROL_OFF);
jmarkel44 80:b12b0adfcdc2 331 pos->second.push_back(c);
jmarkel44 80:b12b0adfcdc2 332 std::sort(pos->second.begin(), pos->second.end());
jmarkel44 80:b12b0adfcdc2 333 }
jmarkel44 71:34856d21f2bf 334 }
jmarkel44 66:db1425574b58 335
jmarkel44 66:db1425574b58 336 return 0;
jmarkel44 66:db1425574b58 337 }
jmarkel44 66:db1425574b58 338
jmarkel44 74:03ccf04998b5 339 /*****************************************************************************
jmarkel44 74:03ccf04998b5 340 * Function: unregisterControl
jmarkel44 74:03ccf04998b5 341 * Description:
jmarkel44 74:03ccf04998b5 342 *
jmarkel44 74:03ccf04998b5 343 * @param id -> control identifier
jmarkel44 74:03ccf04998b5 344 * @param pri -> priority
jmarkel44 74:03ccf04998b5 345 * @param output -> output (e.g. "o_rly5)
jmarkel44 74:03ccf04998b5 346 *
jmarkel44 74:03ccf04998b5 347 * @return 0 on success; -1 on error
jmarkel44 74:03ccf04998b5 348 *****************************************************************************/
jmarkel44 72:3754b352f156 349 static int unregisterControl(const char *id, unsigned int pri, const char *output)
jmarkel44 72:3754b352f156 350 {
jmarkel44 72:3754b352f156 351 // attempt to find the output in the map
jmarkel44 72:3754b352f156 352 StringOutputVector_t::iterator pos;
jmarkel44 80:b12b0adfcdc2 353 bool found = false;
jmarkel44 72:3754b352f156 354
jmarkel44 72:3754b352f156 355 pos = outputMap.find(output);
jmarkel44 72:3754b352f156 356 if ( pos == outputMap.end() ) {
jmarkel44 72:3754b352f156 357 printf("%s: failed to find the designated output %s\n",
jmarkel44 72:3754b352f156 358 __func__, output);
jmarkel44 72:3754b352f156 359 return -1;
jmarkel44 72:3754b352f156 360 }
jmarkel44 72:3754b352f156 361
jmarkel44 72:3754b352f156 362 // find the control in the list
jmarkel44 72:3754b352f156 363 vector<Control>::iterator v;
jmarkel44 72:3754b352f156 364 for ( v = pos->second.begin(); v != pos->second.end(); ++v) {
jmarkel44 72:3754b352f156 365 if ( strcmp(v->getId().c_str(), id) == 0 ) {
jmarkel44 72:3754b352f156 366 // delete this entry
jmarkel44 72:3754b352f156 367 pos->second.erase(v);
jmarkel44 80:b12b0adfcdc2 368 found = true;
jmarkel44 72:3754b352f156 369 break;
jmarkel44 72:3754b352f156 370 }
jmarkel44 74:03ccf04998b5 371 }
jmarkel44 80:b12b0adfcdc2 372 if ( !found ) {
jmarkel44 80:b12b0adfcdc2 373 logError("%s: failed to find control %s in list", __func__, id);
jmarkel44 80:b12b0adfcdc2 374 return -1;
jmarkel44 80:b12b0adfcdc2 375 }
jmarkel44 72:3754b352f156 376 return 0;
jmarkel44 72:3754b352f156 377 }
jmarkel44 72:3754b352f156 378
jmarkel44 72:3754b352f156 379 /*****************************************************************************
jmarkel44 72:3754b352f156 380 * Function: loadPersistentOutputs
jmarkel44 72:3754b352f156 381 * Description: pump up the output map based on persistent files
jmarkel44 72:3754b352f156 382 *
jmarkel44 72:3754b352f156 383 * @param args -> not used
jmarkel44 72:3754b352f156 384 * @return none
jmarkel44 72:3754b352f156 385 *****************************************************************************/
jmarkel44 66:db1425574b58 386 static void loadPersistentOutputs(void)
jmarkel44 66:db1425574b58 387 {
jmarkel44 66:db1425574b58 388 bool status;
jmarkel44 66:db1425574b58 389 MbedJSONValue json_value;
jmarkel44 71:34856d21f2bf 390
jmarkel44 77:43e0a3d9e536 391 printf("\rLoading persistent outputs:\n");
jmarkel44 66:db1425574b58 392
jmarkel44 66:db1425574b58 393 std::vector<mDot::mdot_file> file_list = GLOBAL_mdot->listUserFiles();
jmarkel44 70:7427f4959201 394
jmarkel44 66:db1425574b58 395 for (std::vector<mDot::mdot_file>::iterator i = file_list.begin(); i != file_list.end(); ++i) {
jmarkel44 67:49f266601d83 396 if( strncmp( i->name, OUTPUT_STR, strlen(OUTPUT_STR)) == 0 ) {
jmarkel44 66:db1425574b58 397
jmarkel44 66:db1425574b58 398 logInfo("%s: FOUND OUTPUT FILE: %s", __func__, i->name);
jmarkel44 66:db1425574b58 399
jmarkel44 66:db1425574b58 400 char scratchBuf[1024];
jmarkel44 66:db1425574b58 401
jmarkel44 66:db1425574b58 402 status = GLOBAL_mdot->readUserFile(i->name, scratchBuf, 1024);
jmarkel44 66:db1425574b58 403 if( status != true ) {
jmarkel44 66:db1425574b58 404 logInfo("(%d)read file failed, status=%d", __LINE__, status);
jmarkel44 66:db1425574b58 405 } else {
jmarkel44 66:db1425574b58 406 logInfo("(%d)Read File SUCCESS: %s", __LINE__, scratchBuf );
jmarkel44 66:db1425574b58 407 }
jmarkel44 66:db1425574b58 408
jmarkel44 66:db1425574b58 409 parse( json_value, scratchBuf );
jmarkel44 66:db1425574b58 410
jmarkel44 66:db1425574b58 411 string id = json_value["id"].get<string>();
jmarkel44 77:43e0a3d9e536 412 printf("\r output %s loaded\n", i->name);
jmarkel44 74:03ccf04998b5 413
jmarkel44 80:b12b0adfcdc2 414 // emplace the empty control vector into the output map
jmarkel44 71:34856d21f2bf 415 vector<Control> v;
jmarkel44 71:34856d21f2bf 416 outputMap[id] = v;
jmarkel44 66:db1425574b58 417 }
jmarkel44 66:db1425574b58 418 }
jmarkel44 70:7427f4959201 419 }