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 13:37:47 2016 +0000
Revision:
156:44f87c5a83ae
Parent:
153:0845c7bf236a
Child:
157:0d79678ed00f
new timer control algorithms;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmarkel44 19:9bc8fabeddfa 1 /******************************************************************************
jmarkel44 19:9bc8fabeddfa 2 *
jmarkel44 131:a290a3934132 3 * File: TimerControl.cpp
jmarkel44 35:6235ef67faa1 4 * Desciption: ICE Timer Control Class implementation
jmarkel44 19:9bc8fabeddfa 5 *
jmarkel44 19:9bc8fabeddfa 6 *****************************************************************************/
jmarkel44 19:9bc8fabeddfa 7 #include "TimerControl.h"
jmarkel44 19:9bc8fabeddfa 8 #include "mDot.h"
jmarkel44 35:6235ef67faa1 9 #include "MbedJSONValue.h"
jmarkel44 133:c871de2d2b90 10 #include "global.h"
jmarkel44 35:6235ef67faa1 11 #include <string>
jmarkel44 19:9bc8fabeddfa 12
jmarkel44 19:9bc8fabeddfa 13 extern mDot *GLOBAL_mdot;
jmarkel44 19:9bc8fabeddfa 14
jmarkel44 122:4db48b933115 15 //
jmarkel44 122:4db48b933115 16 // method: load
jmarkel44 122:4db48b933115 17 // description: load the pertinents from the control file
jmarkel44 128:534bf29132f8 18 //
jmarkel44 122:4db48b933115 19 // @param _controlFile
jmarkel44 122:4db48b933115 20 // @return true if loaded; false otherwise
jmarkel44 122:4db48b933115 21 //
jmarkel44 35:6235ef67faa1 22 bool TimerControl::load(string _controlFile)
jmarkel44 122:4db48b933115 23 {
jmarkel44 122:4db48b933115 24 MbedJSONValue json_value; // json parsing element
jmarkel44 122:4db48b933115 25
jmarkel44 19:9bc8fabeddfa 26 // try to open the control file
jmarkel44 122:4db48b933115 27 mDot::mdot_file file = GLOBAL_mdot->openUserFile(_controlFile.c_str(), mDot::FM_RDONLY);
jmarkel44 122:4db48b933115 28 if ( file.fd < 0 ) {
jmarkel44 35:6235ef67faa1 29 return false;
jmarkel44 122:4db48b933115 30 }
jmarkel44 35:6235ef67faa1 31
jmarkel44 35:6235ef67faa1 32 // read the data into a buffer
jmarkel44 35:6235ef67faa1 33 char dataBuf[1024];
jmarkel44 35:6235ef67faa1 34
jmarkel44 35:6235ef67faa1 35 int bytes_read = GLOBAL_mdot->readUserFile(file, (void *)dataBuf, sizeof(dataBuf));
jmarkel44 35:6235ef67faa1 36 if ( bytes_read != sizeof(dataBuf) ) {
jmarkel44 35:6235ef67faa1 37 logError("%s: failed to read %d bytes from %s", __func__, sizeof(dataBuf), controlFile.c_str());
jmarkel44 35:6235ef67faa1 38 return false;
jmarkel44 35:6235ef67faa1 39 }
jmarkel44 122:4db48b933115 40
jmarkel44 122:4db48b933115 41 // close the file
jmarkel44 35:6235ef67faa1 42 GLOBAL_mdot->closeUserFile(file);
jmarkel44 35:6235ef67faa1 43
jmarkel44 35:6235ef67faa1 44 parse(json_value, dataBuf);
jmarkel44 35:6235ef67faa1 45
jmarkel44 132:45821e189dd0 46 // the pertinents
jmarkel44 122:4db48b933115 47 controlFile = _controlFile;
jmarkel44 132:45821e189dd0 48 id = json_value["id"].get<string>();
jmarkel44 132:45821e189dd0 49 output = json_value["output"].get<string>();
jmarkel44 156:44f87c5a83ae 50 priority = atoi(json_value["priority"].get<string>().c_str());
jmarkel44 156:44f87c5a83ae 51 startTime = atol(json_value["starttime"].get<string>().c_str());
jmarkel44 156:44f87c5a83ae 52 duration = atoi(json_value["duration"].get<string>().c_str());
jmarkel44 122:4db48b933115 53
jmarkel44 122:4db48b933115 54 return true;
jmarkel44 122:4db48b933115 55 }
jmarkel44 122:4db48b933115 56
jmarkel44 132:45821e189dd0 57 //
jmarkel44 132:45821e189dd0 58 // method: start
jmarkel44 132:45821e189dd0 59 // description: initialize the control
jmarkel44 133:c871de2d2b90 60 //
jmarkel44 132:45821e189dd0 61 // @param none
jmarkel44 132:45821e189dd0 62 // @return none
jmarkel44 132:45821e189dd0 63 //
jmarkel44 126:c85ac6a8e9af 64 void TimerControl::start(void)
jmarkel44 126:c85ac6a8e9af 65 {
jmarkel44 128:534bf29132f8 66 currentState = STATE_OFF;
jmarkel44 128:534bf29132f8 67 }
jmarkel44 128:534bf29132f8 68
jmarkel44 132:45821e189dd0 69 //
jmarkel44 132:45821e189dd0 70 // method: timerStart
jmarkel44 132:45821e189dd0 71 // description: examine the timestamp to determine if the timer control
jmarkel44 132:45821e189dd0 72 // should be running
jmarkel44 132:45821e189dd0 73 //
jmarkel44 132:45821e189dd0 74 // @param none
jmarkel44 132:45821e189dd0 75 // @return true if timer should be running; false otherwise
jmarkel44 132:45821e189dd0 76 //
jmarkel44 132:45821e189dd0 77 bool TimerControl::timerStart(void)
jmarkel44 128:534bf29132f8 78 {
jmarkel44 156:44f87c5a83ae 79 unsigned long currentTime = time(NULL);
jmarkel44 156:44f87c5a83ae 80
jmarkel44 156:44f87c5a83ae 81 if ( currentTime < startTime )
jmarkel44 156:44f87c5a83ae 82 return false;
jmarkel44 156:44f87c5a83ae 83
jmarkel44 156:44f87c5a83ae 84 if ( currentTime >= startTime && currentTime <= (startTime + duration) ) {
jmarkel44 156:44f87c5a83ae 85 return true;
jmarkel44 132:45821e189dd0 86 }
jmarkel44 133:c871de2d2b90 87 return false;
jmarkel44 132:45821e189dd0 88 }
jmarkel44 132:45821e189dd0 89 //
jmarkel44 132:45821e189dd0 90 // method: timerStop
jmarkel44 132:45821e189dd0 91 // description: determines if a running timer should has reached its duration
jmarkel44 132:45821e189dd0 92 //
jmarkel44 132:45821e189dd0 93 // @param none
jmarkel44 132:45821e189dd0 94 // @return true if the timer has expired; false otherwise
jmarkel44 132:45821e189dd0 95 //
jmarkel44 133:c871de2d2b90 96 bool TimerControl::timerStop(void)
jmarkel44 132:45821e189dd0 97 {
jmarkel44 156:44f87c5a83ae 98 if ( time(NULL) >= startTime + duration ) {
jmarkel44 132:45821e189dd0 99 return true;
jmarkel44 132:45821e189dd0 100 }
jmarkel44 128:534bf29132f8 101 return false;
jmarkel44 126:c85ac6a8e9af 102 }
jmarkel44 126:c85ac6a8e9af 103
jmarkel44 132:45821e189dd0 104 //
jmarkel44 133:c871de2d2b90 105 // method: update
jmarkel44 132:45821e189dd0 106 // description: run the simplified state machine
jmarkel44 132:45821e189dd0 107 //
jmarkel44 132:45821e189dd0 108 // @param none
jmarkel44 132:45821e189dd0 109 // @return none
jmarkel44 132:45821e189dd0 110 //
jmarkel44 126:c85ac6a8e9af 111 void TimerControl::update(void)
jmarkel44 126:c85ac6a8e9af 112 {
jmarkel44 128:534bf29132f8 113 switch ( this->currentState ) {
jmarkel44 128:534bf29132f8 114 case STATE_OFF:
jmarkel44 132:45821e189dd0 115 if ( this->timerStart() ) {
jmarkel44 128:534bf29132f8 116 currentState = STATE_RUNNING;
jmarkel44 133:c871de2d2b90 117 this->startFeed();
jmarkel44 128:534bf29132f8 118 }
jmarkel44 128:534bf29132f8 119 break;
jmarkel44 128:534bf29132f8 120 case STATE_RUNNING:
jmarkel44 132:45821e189dd0 121 if ( this->timerStop() ) {
jmarkel44 128:534bf29132f8 122 currentState = STATE_OFF;
jmarkel44 133:c871de2d2b90 123 this->stopFeed();
jmarkel44 156:44f87c5a83ae 124 this->unregisterControl();
jmarkel44 128:534bf29132f8 125 }
jmarkel44 128:534bf29132f8 126 break;
jmarkel44 128:534bf29132f8 127 case STATE_DISABLED:
jmarkel44 128:534bf29132f8 128 // not implelmented
jmarkel44 128:534bf29132f8 129 default:
jmarkel44 128:534bf29132f8 130 break;
jmarkel44 128:534bf29132f8 131 }
jmarkel44 126:c85ac6a8e9af 132 }
jmarkel44 126:c85ac6a8e9af 133
jmarkel44 122:4db48b933115 134 //
jmarkel44 133:c871de2d2b90 135 // method: startFeed
jmarkel44 133:c871de2d2b90 136 // description: signal the output thread to start a feed
jmarkel44 133:c871de2d2b90 137 //
jmarkel44 133:c871de2d2b90 138 // @param none
jmarkel44 133:c871de2d2b90 139 // @return none
jmarkel44 133:c871de2d2b90 140 void TimerControl::startFeed(void)
jmarkel44 133:c871de2d2b90 141 {
jmarkel44 133:c871de2d2b90 142 logInfo("%s: %s attempting to start feed on relay %s\n",
jmarkel44 133:c871de2d2b90 143 __func__, controlFile.c_str(), output.c_str());
jmarkel44 133:c871de2d2b90 144
jmarkel44 133:c871de2d2b90 145 OutputControlMsg_t *output_mail = OutputMasterMailBox.alloc();
jmarkel44 133:c871de2d2b90 146 memset(output_mail, 0, sizeof(OutputControlMsg_t));
jmarkel44 133:c871de2d2b90 147
jmarkel44 133:c871de2d2b90 148 output_mail->action = ACTION_CONTROL_ON;
jmarkel44 133:c871de2d2b90 149 output_mail->controlType = CONTROL_TIMER;
jmarkel44 156:44f87c5a83ae 150 output_mail->priority = priority;
jmarkel44 133:c871de2d2b90 151
jmarkel44 133:c871de2d2b90 152 strncpy(output_mail->output_tag, this->output.c_str(), sizeof(output_mail->output_tag)-1);
jmarkel44 133:c871de2d2b90 153 strncpy(output_mail->id, this->id.c_str(), sizeof(output_mail->id)-1);
jmarkel44 133:c871de2d2b90 154 OutputMasterMailBox.put(output_mail);
jmarkel44 133:c871de2d2b90 155 }
jmarkel44 133:c871de2d2b90 156
jmarkel44 133:c871de2d2b90 157 //
jmarkel44 133:c871de2d2b90 158 // method: stopFeed
jmarkel44 133:c871de2d2b90 159 // description: signal the output thread to stop a feed
jmarkel44 133:c871de2d2b90 160 //
jmarkel44 133:c871de2d2b90 161 // @param none
jmarkel44 133:c871de2d2b90 162 // @return none
jmarkel44 133:c871de2d2b90 163 void TimerControl::stopFeed(void)
jmarkel44 133:c871de2d2b90 164 {
jmarkel44 133:c871de2d2b90 165 logInfo("%s: %s attempting to start feed on relay %s\n",
jmarkel44 133:c871de2d2b90 166 __func__, controlFile.c_str(), output.c_str());
jmarkel44 133:c871de2d2b90 167
jmarkel44 133:c871de2d2b90 168 OutputControlMsg_t *output_mail = OutputMasterMailBox.alloc();
jmarkel44 133:c871de2d2b90 169 memset(output_mail, 0, sizeof(OutputControlMsg_t));
jmarkel44 133:c871de2d2b90 170
jmarkel44 133:c871de2d2b90 171 output_mail->action = ACTION_CONTROL_OFF;
jmarkel44 133:c871de2d2b90 172 output_mail->controlType = CONTROL_TIMER;
jmarkel44 156:44f87c5a83ae 173 output_mail->priority = priority;
jmarkel44 133:c871de2d2b90 174
jmarkel44 133:c871de2d2b90 175 strncpy(output_mail->output_tag, this->output.c_str(), sizeof(output_mail->output_tag)-1);
jmarkel44 133:c871de2d2b90 176 strncpy(output_mail->id, this->id.c_str(), sizeof(output_mail->id)-1);
jmarkel44 133:c871de2d2b90 177 OutputMasterMailBox.put(output_mail);
jmarkel44 133:c871de2d2b90 178 }
jmarkel44 156:44f87c5a83ae 179
jmarkel44 153:0845c7bf236a 180 //
jmarkel44 136:6ad7ba157b70 181 // Method: unregisterControl
jmarkel44 136:6ad7ba157b70 182 // Description: send OFF indication to Output Master for this control's
jmarkel44 136:6ad7ba157b70 183 // relay
jmarkel44 136:6ad7ba157b70 184 //
jmarkel44 136:6ad7ba157b70 185 // @param none
jmarkel44 136:6ad7ba157b70 186 // @return none
jmarkel44 153:0845c7bf236a 187 //
jmarkel44 136:6ad7ba157b70 188 void TimerControl::unregisterControl(void)
jmarkel44 136:6ad7ba157b70 189 {
jmarkel44 136:6ad7ba157b70 190 logInfo("%s: %s attempting to unregister %s\n",
jmarkel44 136:6ad7ba157b70 191 __func__, controlFile.c_str());
jmarkel44 136:6ad7ba157b70 192
jmarkel44 136:6ad7ba157b70 193 OutputControlMsg_t *output_mail = OutputMasterMailBox.alloc();
jmarkel44 136:6ad7ba157b70 194 memset(output_mail, 0, sizeof(OutputControlMsg_t));
jmarkel44 156:44f87c5a83ae 195
jmarkel44 156:44f87c5a83ae 196 output_mail->action = ACTION_CONTROL_UNREGISTER;
jmarkel44 156:44f87c5a83ae 197 output_mail->controlType = CONTROL_TIMER;
jmarkel44 156:44f87c5a83ae 198 output_mail->priority = priority;
jmarkel44 136:6ad7ba157b70 199 strncpy(output_mail->output_tag, this->output.c_str(), sizeof(output_mail->output_tag)-1);
jmarkel44 136:6ad7ba157b70 200 strncpy(output_mail->id, this->id.c_str(), sizeof(output_mail->id)-1);
jmarkel44 156:44f87c5a83ae 201
jmarkel44 136:6ad7ba157b70 202 OutputMasterMailBox.put(output_mail);
jmarkel44 136:6ad7ba157b70 203 }
jmarkel44 136:6ad7ba157b70 204
jmarkel44 133:c871de2d2b90 205 //
jmarkel44 122:4db48b933115 206 // methid: display
jmarkel44 122:4db48b933115 207 // description: display the elements of this timer control object
jmarkel44 122:4db48b933115 208 //
jmarkel44 122:4db48b933115 209 // @param none
jmarkel44 132:45821e189dd0 210 // @return none
jmarkel44 132:45821e189dd0 211 //
jmarkel44 122:4db48b933115 212 void TimerControl::display(void)
jmarkel44 122:4db48b933115 213 {
jmarkel44 128:534bf29132f8 214 string mapper[] = { "OFF",
jmarkel44 128:534bf29132f8 215 "RUNNING",
jmarkel44 128:534bf29132f8 216 "DISABLED"
jmarkel44 128:534bf29132f8 217 };
jmarkel44 133:c871de2d2b90 218
jmarkel44 156:44f87c5a83ae 219 printf("\r controlFile : %s \n", controlFile.c_str());
jmarkel44 156:44f87c5a83ae 220 printf("\r id : %s \n", id.c_str());
jmarkel44 156:44f87c5a83ae 221 printf("\r output : %s \n", output.c_str());
jmarkel44 156:44f87c5a83ae 222 printf("\r priority : %d \n", priority);
jmarkel44 156:44f87c5a83ae 223 printf("\r start time : %lu \n", startTime);
jmarkel44 156:44f87c5a83ae 224 printf("\r duration : %u \n", duration);
jmarkel44 156:44f87c5a83ae 225 printf("\r end time : %lu \n", startTime + duration);
jmarkel44 156:44f87c5a83ae 226 printf("\r expires in : %lu sec \n", (startTime + duration) - time(NULL));
jmarkel44 156:44f87c5a83ae 227 printf("\r current State : %s\r\n\r\n", mapper[currentState].c_str());
jmarkel44 35:6235ef67faa1 228 }