Bkap / src

Dependencies:   APA102

Dependents:   BookAndPlug

Committer:
vrou44
Date:
Mon May 14 12:33:43 2018 +0000
Revision:
0:5648c217e527
Initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vrou44 0:5648c217e527 1 /*
vrou44 0:5648c217e527 2 * BNP_Ctrl.cpp
vrou44 0:5648c217e527 3 *
vrou44 0:5648c217e527 4 * Created on: 23 mars 2018
vrou44 0:5648c217e527 5 * Author: hd01073
vrou44 0:5648c217e527 6 */
vrou44 0:5648c217e527 7
vrou44 0:5648c217e527 8 #include <stdio.h>
vrou44 0:5648c217e527 9 #include "mbed.h"
vrou44 0:5648c217e527 10 #include "mbed_events.h"
vrou44 0:5648c217e527 11 #include "BNP_Ctrl.h"
vrou44 0:5648c217e527 12 #include "MotorCtrl.h"
vrou44 0:5648c217e527 13 #include "LedCtrl.h"
vrou44 0:5648c217e527 14 #include "BltLink.h"
vrou44 0:5648c217e527 15 #include "Audio.h"
vrou44 0:5648c217e527 16
vrou44 0:5648c217e527 17 // 0.33 ==> 1000 Watt @220V
vrou44 0:5648c217e527 18 #define POWER_IN_WATT_AT_220V 5.0 // adjusted to my air fan !!
vrou44 0:5648c217e527 19 #define HALL_TRESHOLD ((0.33/1000.0) * POWER_IN_WATT_AT_220V)
vrou44 0:5648c217e527 20
vrou44 0:5648c217e527 21 #define RELAY_PLUG_E_PIN_ID PG_4
vrou44 0:5648c217e527 22 #define RELAY_PLUG_C_PIN_ID PG_5
vrou44 0:5648c217e527 23 #define RELAY_CLOSING_PIN_VALUE 0
vrou44 0:5648c217e527 24 #define RELAY_OPENING_PIN_VALUE 1
vrou44 0:5648c217e527 25
vrou44 0:5648c217e527 26
vrou44 0:5648c217e527 27 DigitalOut *plugE_P = 0 ; // ne fonctionne pas au 31/03/18 ==> on utilise plugC
vrou44 0:5648c217e527 28 DigitalOut *plugC_P = 0 ;
vrou44 0:5648c217e527 29 AnalogIn *hallSensorP = 0 ;
vrou44 0:5648c217e527 30
vrou44 0:5648c217e527 31
vrou44 0:5648c217e527 32 BNP_Ctrl *BNP_Ctrl::singleInstP = 0 ;
vrou44 0:5648c217e527 33
vrou44 0:5648c217e527 34
vrou44 0:5648c217e527 35 void BNP_Ctrl::signalEvent(Evt evt)
vrou44 0:5648c217e527 36 {
vrou44 0:5648c217e527 37 mainQueueP->call(instanceFeedFsm, evt) ;
vrou44 0:5648c217e527 38 }
vrou44 0:5648c217e527 39
vrou44 0:5648c217e527 40 void BNP_Ctrl::init(void)
vrou44 0:5648c217e527 41 {
vrou44 0:5648c217e527 42 if (!plugE_P) {
vrou44 0:5648c217e527 43 plugE_P = new DigitalOut (RELAY_PLUG_E_PIN_ID) ; // relai ok au 31/03/18
vrou44 0:5648c217e527 44 }
vrou44 0:5648c217e527 45 if (!plugC_P) {
vrou44 0:5648c217e527 46 plugC_P = new DigitalOut (RELAY_PLUG_C_PIN_ID) ; // relai ok au 31/03/18
vrou44 0:5648c217e527 47 }
vrou44 0:5648c217e527 48 if (!hallSensorP) {
vrou44 0:5648c217e527 49 hallSensorP = new AnalogIn (PB_1) ;
vrou44 0:5648c217e527 50 }
vrou44 0:5648c217e527 51
vrou44 0:5648c217e527 52 *plugE_P = RELAY_OPENING_PIN_VALUE ; // attention : logique negative. 1 ==> relais ouvert
vrou44 0:5648c217e527 53 *plugC_P = RELAY_OPENING_PIN_VALUE ;
vrou44 0:5648c217e527 54 state = initInProgress ;
vrou44 0:5648c217e527 55 }
vrou44 0:5648c217e527 56
vrou44 0:5648c217e527 57 void BNP_Ctrl::plugConnectDetect(void)
vrou44 0:5648c217e527 58 {
vrou44 0:5648c217e527 59 float voltageHallSensor = *hallSensorP ;
vrou44 0:5648c217e527 60 if ((double)voltageHallSensor > HALL_TRESHOLD) {
vrou44 0:5648c217e527 61 singleInstP->feedFsm(currentDetected) ;
vrou44 0:5648c217e527 62 }
vrou44 0:5648c217e527 63 }
vrou44 0:5648c217e527 64
vrou44 0:5648c217e527 65
vrou44 0:5648c217e527 66 void BNP_Ctrl::plugDisconnectDetect(void)
vrou44 0:5648c217e527 67 {
vrou44 0:5648c217e527 68 float voltageHallSensor = *hallSensorP ;
vrou44 0:5648c217e527 69 if ((double)voltageHallSensor < HALL_TRESHOLD) {
vrou44 0:5648c217e527 70 singleInstP->feedFsm(currentInterrupted) ;
vrou44 0:5648c217e527 71 }
vrou44 0:5648c217e527 72 }
vrou44 0:5648c217e527 73
vrou44 0:5648c217e527 74
vrou44 0:5648c217e527 75 void BNP_Ctrl::plugConnectTimeoutHdlr(void)
vrou44 0:5648c217e527 76 {
vrou44 0:5648c217e527 77 singleInstP->feedFsm(timeoutFired) ;
vrou44 0:5648c217e527 78 }
vrou44 0:5648c217e527 79
vrou44 0:5648c217e527 80
vrou44 0:5648c217e527 81 void BNP_Ctrl::internalDelayExpiredHdlr(void)
vrou44 0:5648c217e527 82 {
vrou44 0:5648c217e527 83 singleInstP->feedFsm(delayExpired) ;
vrou44 0:5648c217e527 84 }
vrou44 0:5648c217e527 85
vrou44 0:5648c217e527 86
vrou44 0:5648c217e527 87 void BNP_Ctrl::feedFsm(Evt evt)
vrou44 0:5648c217e527 88 {
vrou44 0:5648c217e527 89 switch (state) {
vrou44 0:5648c217e527 90 case initInProgress:
vrou44 0:5648c217e527 91 printf ("\r\nBNP_Ctrl: state initInProgress") ;
vrou44 0:5648c217e527 92 switch (evt) {
vrou44 0:5648c217e527 93 case irisInitDone :
vrou44 0:5648c217e527 94 printf ("\r\nBNP_Ctrl: evt irisInitDone") ;
vrou44 0:5648c217e527 95 LedCtrl::requiredActivity = LedCtrl::signalingTermIdle ;
vrou44 0:5648c217e527 96 LedCtrl::signalEvent(LedCtrl::activityChangeRequired) ;
vrou44 0:5648c217e527 97 state = idleWithLed;
vrou44 0:5648c217e527 98 break ;
vrou44 0:5648c217e527 99 default: // spurious evt
vrou44 0:5648c217e527 100 break ;
vrou44 0:5648c217e527 101 }
vrou44 0:5648c217e527 102 break ;
vrou44 0:5648c217e527 103
vrou44 0:5648c217e527 104
vrou44 0:5648c217e527 105 case idleNoLed :
vrou44 0:5648c217e527 106 case idleWithLed :
vrou44 0:5648c217e527 107 printf ("\r\nBNP_Ctrl: state Idle") ;
vrou44 0:5648c217e527 108 switch (evt) {
vrou44 0:5648c217e527 109 case oprTerminalReserve :
vrou44 0:5648c217e527 110 printf ("\r\nBNP_Ctrl: evt oprTerminalReserve") ;
vrou44 0:5648c217e527 111 LedCtrl::requiredActivity = LedCtrl::signalingTermSelected ;
vrou44 0:5648c217e527 112 LedCtrl::signalEvent(LedCtrl::activityChangeRequired) ;
vrou44 0:5648c217e527 113 state = terminalSelected ;
vrou44 0:5648c217e527 114 break ;
vrou44 0:5648c217e527 115 default: // spurious evt
vrou44 0:5648c217e527 116 break ;
vrou44 0:5648c217e527 117 }
vrou44 0:5648c217e527 118 break ;
vrou44 0:5648c217e527 119
vrou44 0:5648c217e527 120
vrou44 0:5648c217e527 121 case terminalSelected :
vrou44 0:5648c217e527 122 printf ("\r\nBNP_Ctrl: state terminalSelected") ;
vrou44 0:5648c217e527 123 switch (evt) {
vrou44 0:5648c217e527 124 case oprPlugSelection :
vrou44 0:5648c217e527 125 printf ("\r\nBNP_Ctrl: evt oprPlugSelection") ;
vrou44 0:5648c217e527 126 LedCtrl::requiredActivity = LedCtrl::signalingPlugSelected ;
vrou44 0:5648c217e527 127 LedCtrl::signalEvent(LedCtrl::activityChangeRequired) ;
vrou44 0:5648c217e527 128 MotorCtrl::getInst().targetPosition = BltLink::getInst().selectedIrisPosition ;
vrou44 0:5648c217e527 129 MotorCtrl::signalEvent(MotorCtrl::newPosRequired) ;
vrou44 0:5648c217e527 130 state = plugPresentationInProgress;
vrou44 0:5648c217e527 131 break ;
vrou44 0:5648c217e527 132 default: // spurious evt
vrou44 0:5648c217e527 133 break ;
vrou44 0:5648c217e527 134 }
vrou44 0:5648c217e527 135 break ;
vrou44 0:5648c217e527 136
vrou44 0:5648c217e527 137 case plugPresentationInProgress:
vrou44 0:5648c217e527 138 printf ("\r\nBNP_Ctrl: state plugPresentationInProgress") ;
vrou44 0:5648c217e527 139 switch (evt) {
vrou44 0:5648c217e527 140 case irisPositionReached :
vrou44 0:5648c217e527 141 printf ("\r\nBNP_Ctrl: evt irisPos reached") ;
vrou44 0:5648c217e527 142 if (MotorCtrl::getInst().targetPosition == irisAtPlugEPosition) {
vrou44 0:5648c217e527 143 *plugE_P = RELAY_CLOSING_PIN_VALUE ;
vrou44 0:5648c217e527 144 Audio::startPlay(trackPlugE) ;
vrou44 0:5648c217e527 145 } else {
vrou44 0:5648c217e527 146 *plugC_P = RELAY_CLOSING_PIN_VALUE ;
vrou44 0:5648c217e527 147 Audio::startPlay(trackPlugC) ;
vrou44 0:5648c217e527 148 }
vrou44 0:5648c217e527 149 autoRepeatTimerId = mainQueueP->call_every(500, plugConnectDetect) ;
vrou44 0:5648c217e527 150 timeoutId = mainQueueP->call_in (30000, plugConnectTimeoutHdlr) ;
vrou44 0:5648c217e527 151 state = waitingPlugConnection ;
vrou44 0:5648c217e527 152 break ;
vrou44 0:5648c217e527 153 default: // spurious evt
vrou44 0:5648c217e527 154 break ;
vrou44 0:5648c217e527 155 }
vrou44 0:5648c217e527 156 break ;
vrou44 0:5648c217e527 157
vrou44 0:5648c217e527 158 case waitingPlugConnection:
vrou44 0:5648c217e527 159 printf ("\r\nBNP_Ctrl: state waitingPlugConnection") ;
vrou44 0:5648c217e527 160 switch (evt) {
vrou44 0:5648c217e527 161 case currentDetected :
vrou44 0:5648c217e527 162 printf ("\r\nBNP_Ctrl: evt current detect") ;
vrou44 0:5648c217e527 163 mainQueueP->cancel(autoRepeatTimerId) ;
vrou44 0:5648c217e527 164 autoRepeatTimerId = 0 ;
vrou44 0:5648c217e527 165 mainQueueP->cancel(timeoutId) ;
vrou44 0:5648c217e527 166 timeoutId = 0 ;
vrou44 0:5648c217e527 167 LedCtrl::requiredActivity = LedCtrl::signalingCharging ;
vrou44 0:5648c217e527 168 LedCtrl::signalEvent(LedCtrl::activityChangeRequired) ;
vrou44 0:5648c217e527 169 autoRepeatTimerId = mainQueueP->call_every(500, plugDisconnectDetect) ;
vrou44 0:5648c217e527 170 state = chargingInProgress ;
vrou44 0:5648c217e527 171 break ;
vrou44 0:5648c217e527 172
vrou44 0:5648c217e527 173 case timeoutFired :
vrou44 0:5648c217e527 174 printf ("\r\nBNP_Ctrl: timeout fired") ;
vrou44 0:5648c217e527 175 mainQueueP->cancel(autoRepeatTimerId) ;
vrou44 0:5648c217e527 176 autoRepeatTimerId = 0 ;
vrou44 0:5648c217e527 177 mainQueueP->cancel(timeoutId) ;
vrou44 0:5648c217e527 178 timeoutId = 0 ;
vrou44 0:5648c217e527 179 if (MotorCtrl::getInst().targetPosition == irisAtPlugEPosition) {
vrou44 0:5648c217e527 180 *plugE_P = RELAY_OPENING_PIN_VALUE;
vrou44 0:5648c217e527 181 } else {
vrou44 0:5648c217e527 182 *plugC_P = RELAY_OPENING_PIN_VALUE ;
vrou44 0:5648c217e527 183 }
vrou44 0:5648c217e527 184 LedCtrl::requiredActivity = LedCtrl::signalingChargeSuspended ;
vrou44 0:5648c217e527 185 LedCtrl::signalEvent(LedCtrl::activityChangeRequired) ;
vrou44 0:5648c217e527 186 MotorCtrl::getInst().targetPosition = BNP_Ctrl::irisAtShieldPosition ;
vrou44 0:5648c217e527 187 MotorCtrl::signalEvent(MotorCtrl::newPosRequired) ;
vrou44 0:5648c217e527 188 state = shieldPresentationInProgress ;
vrou44 0:5648c217e527 189 break ;
vrou44 0:5648c217e527 190
vrou44 0:5648c217e527 191 default: // spurious evt
vrou44 0:5648c217e527 192 break ;
vrou44 0:5648c217e527 193 }
vrou44 0:5648c217e527 194 break ;
vrou44 0:5648c217e527 195
vrou44 0:5648c217e527 196 case chargingInProgress:
vrou44 0:5648c217e527 197 printf ("\r\nBNP_Ctrl: state chargin") ;
vrou44 0:5648c217e527 198 switch (evt) {
vrou44 0:5648c217e527 199 case currentInterrupted :
vrou44 0:5648c217e527 200 printf ("\r\nBNP_Ctrl: evt no current") ;
vrou44 0:5648c217e527 201 mainQueueP->cancel(autoRepeatTimerId) ;
vrou44 0:5648c217e527 202 autoRepeatTimerId = 0 ;
vrou44 0:5648c217e527 203 if (MotorCtrl::getInst().targetPosition == irisAtPlugEPosition) {
vrou44 0:5648c217e527 204 *plugE_P = RELAY_OPENING_PIN_VALUE ;
vrou44 0:5648c217e527 205 } else {
vrou44 0:5648c217e527 206 *plugC_P = RELAY_OPENING_PIN_VALUE ;
vrou44 0:5648c217e527 207 }
vrou44 0:5648c217e527 208 LedCtrl::requiredActivity = LedCtrl::signalingChargeSuspended ;
vrou44 0:5648c217e527 209 LedCtrl::signalEvent(LedCtrl::activityChangeRequired) ;
vrou44 0:5648c217e527 210 MotorCtrl::getInst().targetPosition = BNP_Ctrl::irisAtShieldPosition ;
vrou44 0:5648c217e527 211 MotorCtrl::signalEvent(MotorCtrl::newPosRequired) ;
vrou44 0:5648c217e527 212 state = shieldPresentationInProgress ;
vrou44 0:5648c217e527 213 break ;
vrou44 0:5648c217e527 214
vrou44 0:5648c217e527 215 default: // spurious evt
vrou44 0:5648c217e527 216 break ;
vrou44 0:5648c217e527 217 }
vrou44 0:5648c217e527 218
vrou44 0:5648c217e527 219 break ;
vrou44 0:5648c217e527 220
vrou44 0:5648c217e527 221 case shieldPresentationInProgress:
vrou44 0:5648c217e527 222 printf ("\r\nBNP_Ctrl: shield present in progress") ;
vrou44 0:5648c217e527 223 switch (evt) {
vrou44 0:5648c217e527 224 case irisPositionReached :
vrou44 0:5648c217e527 225 case irisPositionTimeOut : // !!! TODO : manage this event separately
vrou44 0:5648c217e527 226 printf ("\r\nBNP_Ctrl: evt pos reached or to") ;
vrou44 0:5648c217e527 227 delayId = mainQueueP->call_in (60000, internalDelayExpiredHdlr) ;
vrou44 0:5648c217e527 228 state = chargingSuspended ;
vrou44 0:5648c217e527 229 break ;
vrou44 0:5648c217e527 230
vrou44 0:5648c217e527 231 default:
vrou44 0:5648c217e527 232 break ;
vrou44 0:5648c217e527 233 }
vrou44 0:5648c217e527 234
vrou44 0:5648c217e527 235 case chargingSuspended:
vrou44 0:5648c217e527 236 printf ("\r\nBNP_Ctrl: state charge suspend") ;
vrou44 0:5648c217e527 237 switch (evt) {
vrou44 0:5648c217e527 238 case delayExpired :
vrou44 0:5648c217e527 239 printf ("\r\nBNP_Ctrl: evt delay expired") ;
vrou44 0:5648c217e527 240 delayId = 0 ;
vrou44 0:5648c217e527 241 LedCtrl::requiredActivity = LedCtrl::signalingTermIdle ;
vrou44 0:5648c217e527 242 LedCtrl::signalEvent(LedCtrl::activityChangeRequired) ;
vrou44 0:5648c217e527 243 state = idleWithLed;
vrou44 0:5648c217e527 244 break ;
vrou44 0:5648c217e527 245
vrou44 0:5648c217e527 246 case oprResumptionRequest :
vrou44 0:5648c217e527 247 printf ("\r\nBNP_Ctrl: evt resume request") ;
vrou44 0:5648c217e527 248 mainQueueP->cancel(delayId) ;
vrou44 0:5648c217e527 249 Audio::startPlay(trackResumption) ;
vrou44 0:5648c217e527 250 LedCtrl::requiredActivity = LedCtrl::signalingPlugSelected ;
vrou44 0:5648c217e527 251 LedCtrl::signalEvent(LedCtrl::activityChangeRequired) ;
vrou44 0:5648c217e527 252 MotorCtrl::getInst().targetPosition = BltLink::getInst().selectedIrisPosition ;
vrou44 0:5648c217e527 253 MotorCtrl::signalEvent(MotorCtrl::newPosRequired) ;
vrou44 0:5648c217e527 254 state = plugPresentationInProgress;
vrou44 0:5648c217e527 255 break ;
vrou44 0:5648c217e527 256
vrou44 0:5648c217e527 257 case oprTerminalRelease:
vrou44 0:5648c217e527 258 printf ("\r\nBNP_Ctrl: evt oprTerminalRelease") ;
vrou44 0:5648c217e527 259 delayId = 0 ;
vrou44 0:5648c217e527 260 LedCtrl::requiredActivity = LedCtrl::signalingTermIdle ;
vrou44 0:5648c217e527 261 LedCtrl::signalEvent(LedCtrl::activityChangeRequired) ;
vrou44 0:5648c217e527 262 state = idleWithLed;
vrou44 0:5648c217e527 263 break ;
vrou44 0:5648c217e527 264
vrou44 0:5648c217e527 265
vrou44 0:5648c217e527 266 default:
vrou44 0:5648c217e527 267 break ;
vrou44 0:5648c217e527 268 }
vrou44 0:5648c217e527 269 break ;
vrou44 0:5648c217e527 270
vrou44 0:5648c217e527 271 default :
vrou44 0:5648c217e527 272 printf ("!!!! ERROR - BNP_Ctrl::feedFsm\n\r") ;
vrou44 0:5648c217e527 273 break ;
vrou44 0:5648c217e527 274 }
vrou44 0:5648c217e527 275 }