Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ICE-Application/src/ControlTask/ControlTask.cpp@1:b2e90cda7a5a, 2017-01-24 (annotated)
- Committer:
- jmarkel44
- Date:
- Tue Jan 24 19:06:45 2017 +0000
- Revision:
- 1:b2e90cda7a5a
- Parent:
- 0:61364762ee0e
Port from IAR F412 project
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| jmarkel44 | 0:61364762ee0e | 1 | /****************************************************************************** | 
| jmarkel44 | 0:61364762ee0e | 2 | * | 
| jmarkel44 | 0:61364762ee0e | 3 | * File: ControlTask.cpp | 
| jmarkel44 | 0:61364762ee0e | 4 | * Desciption: source for the ICE Control task | 
| jmarkel44 | 0:61364762ee0e | 5 | * | 
| jmarkel44 | 0:61364762ee0e | 6 | *****************************************************************************/ | 
| jmarkel44 | 0:61364762ee0e | 7 | |
| jmarkel44 | 0:61364762ee0e | 8 | #include "ControlTask.h" | 
| jmarkel44 | 0:61364762ee0e | 9 | #include <stdio.h> | 
| jmarkel44 | 0:61364762ee0e | 10 | #include "rtos.h" | 
| jmarkel44 | 0:61364762ee0e | 11 | #include "ConfigurationHandler.h" | 
| jmarkel44 | 0:61364762ee0e | 12 | #include "ICELog.h" | 
| jmarkel44 | 0:61364762ee0e | 13 | #include "global.h" | 
| jmarkel44 | 0:61364762ee0e | 14 | |
| jmarkel44 | 0:61364762ee0e | 15 | // control functions | 
| jmarkel44 | 0:61364762ee0e | 16 | static void serviceManualControls(void); | 
| jmarkel44 | 0:61364762ee0e | 17 | static void serviceTimerControls(void); | 
| jmarkel44 | 0:61364762ee0e | 18 | static void serviceSetpointControls(void); | 
| jmarkel44 | 0:61364762ee0e | 19 | static void serviceCompositeControls(void); | 
| jmarkel44 | 0:61364762ee0e | 20 | static void serviceFailsafeControls(void); | 
| jmarkel44 | 0:61364762ee0e | 21 | static void serviceSequenceControls(void); | 
| jmarkel44 | 0:61364762ee0e | 22 | |
| jmarkel44 | 0:61364762ee0e | 23 | static void sendMail(std::string controlFile, Action_t action, Control_t control); | 
| jmarkel44 | 0:61364762ee0e | 24 | |
| jmarkel44 | 0:61364762ee0e | 25 | // | 
| jmarkel44 | 0:61364762ee0e | 26 | // Task: ControlTask | 
| jmarkel44 | 0:61364762ee0e | 27 | // Description: This task will loop through all of the configued control | 
| jmarkel44 | 0:61364762ee0e | 28 | // and run the updater | 
| jmarkel44 | 0:61364762ee0e | 29 | // | 
| jmarkel44 | 0:61364762ee0e | 30 | // @param[in] none | 
| jmarkel44 | 0:61364762ee0e | 31 | // @param[out] none | 
| jmarkel44 | 0:61364762ee0e | 32 | // @return none | 
| jmarkel44 | 0:61364762ee0e | 33 | // | 
| jmarkel44 | 0:61364762ee0e | 34 | void ControlTask(void const *args) | 
| jmarkel44 | 0:61364762ee0e | 35 | { | 
| jmarkel44 | 0:61364762ee0e | 36 | printf("\r%s has started...\n", __func__); | 
| jmarkel44 | 0:61364762ee0e | 37 | |
| jmarkel44 | 0:61364762ee0e | 38 | while ( true ) { | 
| jmarkel44 | 0:61364762ee0e | 39 | |
| jmarkel44 | 0:61364762ee0e | 40 | serviceTimerControls(); | 
| jmarkel44 | 0:61364762ee0e | 41 | serviceManualControls(); | 
| jmarkel44 | 0:61364762ee0e | 42 | serviceSetpointControls(); | 
| jmarkel44 | 0:61364762ee0e | 43 | serviceCompositeControls(); | 
| jmarkel44 | 0:61364762ee0e | 44 | serviceFailsafeControls(); | 
| jmarkel44 | 0:61364762ee0e | 45 | serviceSequenceControls(); | 
| jmarkel44 | 0:61364762ee0e | 46 | } | 
| jmarkel44 | 0:61364762ee0e | 47 | } | 
| jmarkel44 | 0:61364762ee0e | 48 | |
| jmarkel44 | 0:61364762ee0e | 49 | // | 
| jmarkel44 | 0:61364762ee0e | 50 | // function: serviceManualControls() | 
| jmarkel44 | 0:61364762ee0e | 51 | // description: run the updater on the manual controls | 
| jmarkel44 | 0:61364762ee0e | 52 | // | 
| jmarkel44 | 0:61364762ee0e | 53 | // @param[in] none | 
| jmarkel44 | 0:61364762ee0e | 54 | // @param[out] none | 
| jmarkel44 | 0:61364762ee0e | 55 | // @return none | 
| jmarkel44 | 0:61364762ee0e | 56 | // | 
| jmarkel44 | 0:61364762ee0e | 57 | static void serviceManualControls(void) | 
| jmarkel44 | 0:61364762ee0e | 58 | { | 
| jmarkel44 | 0:61364762ee0e | 59 | ManualControlError_t rc; | 
| jmarkel44 | 0:61364762ee0e | 60 | |
| jmarkel44 | 0:61364762ee0e | 61 | manual_mutex.lock(); | 
| jmarkel44 | 0:61364762ee0e | 62 | if ( !manualTable.empty() ) { | 
| jmarkel44 | 0:61364762ee0e | 63 | StringManualMap::iterator pos; | 
| jmarkel44 | 0:61364762ee0e | 64 | for ( pos = manualTable.begin(); pos != manualTable.end(); ++pos) { | 
| jmarkel44 | 0:61364762ee0e | 65 | rc = pos->second->update(); | 
| jmarkel44 | 0:61364762ee0e | 66 | if ( rc == MANUAL_CONTROL_DESTROY ) { | 
| jmarkel44 | 0:61364762ee0e | 67 | // send mail to the configuration handler to destroy this control | 
| jmarkel44 | 0:61364762ee0e | 68 | sendMail(pos->second->getControlFile(), ACTION_DESTROY, CONTROL_MANUAL); | 
| jmarkel44 | 0:61364762ee0e | 69 | } else if ( rc != MANUAL_CONTROL_OK ) { | 
| jmarkel44 | 0:61364762ee0e | 70 | logError("%s: error %d updating the manual control", __func__, rc); | 
| jmarkel44 | 0:61364762ee0e | 71 | } | 
| jmarkel44 | 0:61364762ee0e | 72 | } | 
| jmarkel44 | 0:61364762ee0e | 73 | } | 
| jmarkel44 | 0:61364762ee0e | 74 | manual_mutex.unlock(); | 
| jmarkel44 | 0:61364762ee0e | 75 | } | 
| jmarkel44 | 0:61364762ee0e | 76 | |
| jmarkel44 | 0:61364762ee0e | 77 | // | 
| jmarkel44 | 0:61364762ee0e | 78 | // function: serviceSetpointControls | 
| jmarkel44 | 0:61364762ee0e | 79 | // description: run the updater on the setpoint controls | 
| jmarkel44 | 0:61364762ee0e | 80 | // | 
| jmarkel44 | 0:61364762ee0e | 81 | // @param[in] none | 
| jmarkel44 | 0:61364762ee0e | 82 | // @param[out] none | 
| jmarkel44 | 0:61364762ee0e | 83 | // @return none | 
| jmarkel44 | 0:61364762ee0e | 84 | // | 
| jmarkel44 | 0:61364762ee0e | 85 | static void serviceSetpointControls(void) | 
| jmarkel44 | 0:61364762ee0e | 86 | { | 
| jmarkel44 | 0:61364762ee0e | 87 | SetpointControlError_t rc; | 
| jmarkel44 | 0:61364762ee0e | 88 | |
| jmarkel44 | 0:61364762ee0e | 89 | setpoint_mutex.lock(); | 
| jmarkel44 | 0:61364762ee0e | 90 | if ( !setpointTable.empty() ) { | 
| jmarkel44 | 0:61364762ee0e | 91 | StringSetpointMap::const_iterator pos; | 
| jmarkel44 | 0:61364762ee0e | 92 | for ( pos = setpointTable.begin(); pos != setpointTable.end(); ++pos ) { | 
| jmarkel44 | 0:61364762ee0e | 93 | // run the updater | 
| jmarkel44 | 0:61364762ee0e | 94 | rc = pos->second->update(); | 
| jmarkel44 | 0:61364762ee0e | 95 | if ( rc != SETPOINT_CONTROL_OK ) { | 
| jmarkel44 | 0:61364762ee0e | 96 | logError("%s: error (%d) updating setpoint control %s", | 
| jmarkel44 | 0:61364762ee0e | 97 | __func__, rc, pos->second->getId().c_str()); | 
| jmarkel44 | 0:61364762ee0e | 98 | } | 
| jmarkel44 | 0:61364762ee0e | 99 | } | 
| jmarkel44 | 0:61364762ee0e | 100 | } | 
| jmarkel44 | 0:61364762ee0e | 101 | setpoint_mutex.unlock(); | 
| jmarkel44 | 0:61364762ee0e | 102 | } | 
| jmarkel44 | 0:61364762ee0e | 103 | |
| jmarkel44 | 0:61364762ee0e | 104 | // | 
| jmarkel44 | 0:61364762ee0e | 105 | // function: serviceTimerControls | 
| jmarkel44 | 0:61364762ee0e | 106 | // description: run the updater on the timer controls | 
| jmarkel44 | 0:61364762ee0e | 107 | // | 
| jmarkel44 | 0:61364762ee0e | 108 | // @param[in] none | 
| jmarkel44 | 0:61364762ee0e | 109 | // @param[out] none | 
| jmarkel44 | 0:61364762ee0e | 110 | // @return none | 
| jmarkel44 | 0:61364762ee0e | 111 | // | 
| jmarkel44 | 0:61364762ee0e | 112 | static void serviceTimerControls(void) | 
| jmarkel44 | 0:61364762ee0e | 113 | { | 
| jmarkel44 | 0:61364762ee0e | 114 | TimerControlError_t rc; | 
| jmarkel44 | 0:61364762ee0e | 115 | |
| jmarkel44 | 0:61364762ee0e | 116 | timer_mutex.lock(); | 
| jmarkel44 | 0:61364762ee0e | 117 | if ( !timerTable.empty() ) { | 
| jmarkel44 | 0:61364762ee0e | 118 | StringTimerMap::const_iterator pos; | 
| jmarkel44 | 0:61364762ee0e | 119 | for ( pos = timerTable.begin(); pos != timerTable.end(); ++pos ) { | 
| jmarkel44 | 0:61364762ee0e | 120 | // run the updater | 
| jmarkel44 | 0:61364762ee0e | 121 | rc = pos->second->update(); | 
| jmarkel44 | 0:61364762ee0e | 122 | if ( rc != TIMER_CONTROL_OK ) { | 
| jmarkel44 | 0:61364762ee0e | 123 | logError("%s: error (%d) updating timer control %s", | 
| jmarkel44 | 0:61364762ee0e | 124 | __func__, rc, pos->second->getId().c_str()); | 
| jmarkel44 | 0:61364762ee0e | 125 | } | 
| jmarkel44 | 0:61364762ee0e | 126 | } | 
| jmarkel44 | 0:61364762ee0e | 127 | } | 
| jmarkel44 | 0:61364762ee0e | 128 | timer_mutex.unlock(); | 
| jmarkel44 | 0:61364762ee0e | 129 | } | 
| jmarkel44 | 0:61364762ee0e | 130 | |
| jmarkel44 | 0:61364762ee0e | 131 | // | 
| jmarkel44 | 0:61364762ee0e | 132 | // function: serviceCompositeControls | 
| jmarkel44 | 0:61364762ee0e | 133 | // description: run the updater on the composite controls | 
| jmarkel44 | 0:61364762ee0e | 134 | // | 
| jmarkel44 | 0:61364762ee0e | 135 | // @param[in] none | 
| jmarkel44 | 0:61364762ee0e | 136 | // @param[out] none | 
| jmarkel44 | 0:61364762ee0e | 137 | // @return none | 
| jmarkel44 | 0:61364762ee0e | 138 | // | 
| jmarkel44 | 0:61364762ee0e | 139 | static void serviceCompositeControls(void) | 
| jmarkel44 | 0:61364762ee0e | 140 | { | 
| jmarkel44 | 0:61364762ee0e | 141 | CompositeControlError_t rc; | 
| jmarkel44 | 0:61364762ee0e | 142 | |
| jmarkel44 | 0:61364762ee0e | 143 | // service the composite controls | 
| jmarkel44 | 0:61364762ee0e | 144 | composite_mutex.lock(); | 
| jmarkel44 | 0:61364762ee0e | 145 | if ( !compositeTable.empty() ) { | 
| jmarkel44 | 0:61364762ee0e | 146 | StringCompositeMap::const_iterator pos; | 
| jmarkel44 | 0:61364762ee0e | 147 | for ( pos = compositeTable.begin(); pos != compositeTable.end(); ++pos ) { | 
| jmarkel44 | 0:61364762ee0e | 148 | // run the updater | 
| jmarkel44 | 0:61364762ee0e | 149 | rc = pos->second->update(); | 
| jmarkel44 | 0:61364762ee0e | 150 | if ( rc != COMPOSITE_CONTROL_OK ) { | 
| jmarkel44 | 0:61364762ee0e | 151 | logError("%s: error (%d) updating composite control %s", | 
| jmarkel44 | 0:61364762ee0e | 152 | __func__, rc, pos->second->getId().c_str()); | 
| jmarkel44 | 0:61364762ee0e | 153 | } | 
| jmarkel44 | 0:61364762ee0e | 154 | } | 
| jmarkel44 | 0:61364762ee0e | 155 | } | 
| jmarkel44 | 0:61364762ee0e | 156 | composite_mutex.unlock(); | 
| jmarkel44 | 0:61364762ee0e | 157 | } | 
| jmarkel44 | 0:61364762ee0e | 158 | |
| jmarkel44 | 0:61364762ee0e | 159 | // | 
| jmarkel44 | 0:61364762ee0e | 160 | // function: serviceFailsafeControls | 
| jmarkel44 | 0:61364762ee0e | 161 | // description: run the updater on the failsafe controls | 
| jmarkel44 | 0:61364762ee0e | 162 | // | 
| jmarkel44 | 0:61364762ee0e | 163 | // @param[in] none | 
| jmarkel44 | 0:61364762ee0e | 164 | // @param[out] none | 
| jmarkel44 | 0:61364762ee0e | 165 | // @return none | 
| jmarkel44 | 0:61364762ee0e | 166 | // | 
| jmarkel44 | 0:61364762ee0e | 167 | static void serviceFailsafeControls(void) | 
| jmarkel44 | 0:61364762ee0e | 168 | { | 
| jmarkel44 | 0:61364762ee0e | 169 | FailsafeControlError_t rc; | 
| jmarkel44 | 0:61364762ee0e | 170 | |
| jmarkel44 | 0:61364762ee0e | 171 | // service the setpoint controls | 
| jmarkel44 | 0:61364762ee0e | 172 | failsafe_mutex.lock(); | 
| jmarkel44 | 0:61364762ee0e | 173 | if ( !failsafeTable.empty() ) { | 
| jmarkel44 | 0:61364762ee0e | 174 | StringFailsafeMap::const_iterator pos; | 
| jmarkel44 | 0:61364762ee0e | 175 | for ( pos = failsafeTable.begin(); pos != failsafeTable.end(); ++pos ) { | 
| jmarkel44 | 0:61364762ee0e | 176 | // run the updater | 
| jmarkel44 | 0:61364762ee0e | 177 | rc = pos->second->update(); | 
| jmarkel44 | 0:61364762ee0e | 178 | if ( rc != FAILSAFE_CONTROL_OK ) { | 
| jmarkel44 | 0:61364762ee0e | 179 | logError("%s: error (%d) updating failsafe control %s", | 
| jmarkel44 | 0:61364762ee0e | 180 | __func__, rc, pos->second->getId().c_str()); | 
| jmarkel44 | 0:61364762ee0e | 181 | } | 
| jmarkel44 | 0:61364762ee0e | 182 | } | 
| jmarkel44 | 0:61364762ee0e | 183 | } | 
| jmarkel44 | 0:61364762ee0e | 184 | failsafe_mutex.unlock(); | 
| jmarkel44 | 0:61364762ee0e | 185 | } | 
| jmarkel44 | 0:61364762ee0e | 186 | |
| jmarkel44 | 0:61364762ee0e | 187 | static void serviceSequenceControls(void) | 
| jmarkel44 | 0:61364762ee0e | 188 | { | 
| jmarkel44 | 0:61364762ee0e | 189 | SequenceControlError_t rc; | 
| jmarkel44 | 0:61364762ee0e | 190 | |
| jmarkel44 | 0:61364762ee0e | 191 | // service the sequence controls | 
| jmarkel44 | 0:61364762ee0e | 192 | sequence_mutex.lock(); | 
| jmarkel44 | 0:61364762ee0e | 193 | if ( !sequenceTable.empty() ) { | 
| jmarkel44 | 0:61364762ee0e | 194 | StringSequenceMap::const_iterator pos; | 
| jmarkel44 | 0:61364762ee0e | 195 | for ( pos = sequenceTable.begin(); pos != sequenceTable.end(); ++pos ) { | 
| jmarkel44 | 0:61364762ee0e | 196 | rc = pos->second->run(); | 
| jmarkel44 | 0:61364762ee0e | 197 | if ( rc != SEQUENCE_CONTROL_OK ) { | 
| jmarkel44 | 0:61364762ee0e | 198 | logError("%s: error (%d) running sequence control %s", | 
| jmarkel44 | 0:61364762ee0e | 199 | __func__, rc, pos->second->getId().c_str()); | 
| jmarkel44 | 0:61364762ee0e | 200 | } | 
| jmarkel44 | 0:61364762ee0e | 201 | } | 
| jmarkel44 | 0:61364762ee0e | 202 | } | 
| jmarkel44 | 0:61364762ee0e | 203 | sequence_mutex.unlock(); | 
| jmarkel44 | 0:61364762ee0e | 204 | } | 
| jmarkel44 | 0:61364762ee0e | 205 | |
| jmarkel44 | 0:61364762ee0e | 206 | // | 
| jmarkel44 | 0:61364762ee0e | 207 | // function: sendMail | 
| jmarkel44 | 0:61364762ee0e | 208 | // desctiption: send mail to the configuration handler | 
| jmarkel44 | 0:61364762ee0e | 209 | // | 
| jmarkel44 | 0:61364762ee0e | 210 | // @param[in] controlFile -> key | 
| jmarkel44 | 0:61364762ee0e | 211 | // @param[in] action -> destroy, create, modify, etc. | 
| jmarkel44 | 0:61364762ee0e | 212 | // @param[in] control -> manual, setpoint... | 
| jmarkel44 | 0:61364762ee0e | 213 | // @param[out] none | 
| jmarkel44 | 0:61364762ee0e | 214 | // @return none | 
| jmarkel44 | 0:61364762ee0e | 215 | // | 
| jmarkel44 | 0:61364762ee0e | 216 | static void sendMail(std::string controlFile, Action_t action, Control_t control) | 
| jmarkel44 | 0:61364762ee0e | 217 | { | 
| jmarkel44 | 0:61364762ee0e | 218 | ConfigMessage_t *msg = ConfigHandlerMailBox.alloc(); | 
| jmarkel44 | 0:61364762ee0e | 219 | memset(msg, 0, sizeof(ConfigMessage_t)); | 
| jmarkel44 | 0:61364762ee0e | 220 | msg->action = action; | 
| jmarkel44 | 0:61364762ee0e | 221 | msg->control = control; | 
| jmarkel44 | 0:61364762ee0e | 222 | strncpy(msg->controlFile, controlFile.c_str(), sizeof(msg->controlFile)-1); | 
| jmarkel44 | 0:61364762ee0e | 223 | |
| jmarkel44 | 0:61364762ee0e | 224 | printf("%s: Sending a destroy request for control %s\r\n", | 
| jmarkel44 | 0:61364762ee0e | 225 | __func__, msg->controlFile); | 
| jmarkel44 | 0:61364762ee0e | 226 | |
| jmarkel44 | 0:61364762ee0e | 227 | ConfigHandlerMailBox.put(msg); | 
| jmarkel44 | 0:61364762ee0e | 228 | } |