Erick / Mbed 2 deprecated ICE-F412

Dependencies:   mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }