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@0:61364762ee0e, 2017-01-24 (annotated)
- Committer:
- jmarkel44
- Date:
- Tue Jan 24 19:05:33 2017 +0000
- Revision:
- 0:61364762ee0e
Port from IAR to Nucleo-F412 board
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 | } |