homework 7

Dependencies:   mbed-rtos mbed C12832_lcd LM75B

Committer:
gatedClock
Date:
Wed Sep 11 21:16:58 2013 +0000
Revision:
70:7c0743c28b11
Parent:
69:55b836e8ced7
Child:
71:4a5f256ecf7c
evidence that within a function called by a ticker,; message put and get do not work.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gatedClock 0:fcca4db7b32a 1 /*----------------------------------------------//------------------------------
gatedClock 0:fcca4db7b32a 2 student : m-moore
gatedClock 0:fcca4db7b32a 3 class : rtos
gatedClock 10:2b0a9fc39109 4 directory : RTOS_HW_07
gatedClock 0:fcca4db7b32a 5 file : main.cpp
gatedClock 0:fcca4db7b32a 6 ----description---------------------------------//------------------------------
gatedClock 70:7c0743c28b11 7 gotchyas
gatedClock 70:7c0743c28b11 8 1. using pc.printf inside a ticker routine will freeze the routine.
gatedClock 0:fcca4db7b32a 9 -----includes-----------------------------------//----------------------------*/
gatedClock 0:fcca4db7b32a 10 #include "mbed.h" // mbed class.
gatedClock 10:2b0a9fc39109 11 #include "rtos.h" // rtos class.
gatedClock 39:4e7e4d935a87 12 #include "LM75B.h" // thermometer class.
gatedClock 10:2b0a9fc39109 13 #include "C12832_lcd.h" // LCD class.
gatedClock 0:fcca4db7b32a 14 //---defines------------------------------------//------------------------------
gatedClock 9:cfdb9aa5857c 15 #define LCD1 lcd.locate(0, 0); // LCD line 1.
gatedClock 9:cfdb9aa5857c 16 #define LCD2 lcd.locate(0,11); // LCD line 2.
gatedClock 9:cfdb9aa5857c 17 #define LCD3 lcd.locate(0,22); // LCD line 3.
gatedClock 9:cfdb9aa5857c 18
gatedClock 10:2b0a9fc39109 19
gatedClock 66:4a0006fa5cc1 20 #define DEBOUNCEmS 16 // debounce wait in mS.
gatedClock 19:92b11e30aaaf 21 #define uS_TIMEOUT 100 // Timer uS timeout.
gatedClock 19:92b11e30aaaf 22 #define LBSIG 1 // left button signal code.
gatedClock 33:34c1bef3c4ff 23 #define PIPEuS 1000 // pipeline clock period.
gatedClock 19:92b11e30aaaf 24 #define SLOWCLOCKuS 500000 // slow-clock period.
gatedClock 39:4e7e4d935a87 25 #define TEMPCLOCKS 1 // temperature-measuring period in S.
gatedClock 26:bff592483cb1 26 #define PIPEDATASIZE 8 // dimension of tPipeData.
gatedClock 44:d16e813e61ef 27 #define THREAD_1_WAITmS 400 // thread 1 wait in mS.
gatedClock 67:1d9c85a4c3c1 28 #define THREAD_2_WAITmS 20 // LCD thread wait.
gatedClock 67:1d9c85a4c3c1 29 #define THREAD_3_WAITmS 80 // thread 3 wait in mS.
gatedClock 66:4a0006fa5cc1 30 #define THREAD_4_WAITmS 1 // thread 4 wait in mS.
gatedClock 57:0432c68ad232 31 #define THREAD_5_WAITmS 400 // thread 5 wait in mS.
gatedClock 44:d16e813e61ef 32 #define HB_MODULO 1024 // heartbeat modulo divisor.
gatedClock 50:2928c3cbdcc3 33
gatedClock 54:b0e7352d2516 34 #define MSG_INC_TIME 0x01
gatedClock 54:b0e7352d2516 35 #define MSG_DEC_TIME 0x02
gatedClock 58:ec630b6dd9b1 36 #define MSG_START 0x04
gatedClock 58:ec630b6dd9b1 37 #define MSG_STOP 0x08
gatedClock 58:ec630b6dd9b1 38 #define MSG_OPEN 0x10
gatedClock 58:ec630b6dd9b1 39 #define MSG_CLOSED 0x20
gatedClock 57:0432c68ad232 40
gatedClock 57:0432c68ad232 41 #define FSM_IDLE 0x00 // cook-state state-machine.
gatedClock 57:0432c68ad232 42 #define FSM_COOK 0x01 // cook-state state-machine.
gatedClock 57:0432c68ad232 43 #define FSM_PAUSE 0x02 // cook-state state-machine.
gatedClock 57:0432c68ad232 44 #define FSM_DONE 0x04 // cook-state state-machine.
gatedClock 65:e39360da5929 45
gatedClock 65:e39360da5929 46 #define DEBUG1 // debug preprocessor control.
gatedClock 0:fcca4db7b32a 47 //--global_definitions--------------------------//------------------------------
gatedClock 26:bff592483cb1 48 struct tButtons // button ISR updates.
gatedClock 26:bff592483cb1 49 {
gatedClock 26:bff592483cb1 50 char cLeftButton; // cooktime +60S.
gatedClock 26:bff592483cb1 51 char cRightButton; // cooktime -60S.
gatedClock 26:bff592483cb1 52 char cTopButton; // start cook.
gatedClock 26:bff592483cb1 53 char cBottomButton; // stop cook.
gatedClock 58:ec630b6dd9b1 54 char cCenterButton; // center button pressed.
gatedClock 53:8c2baf5623c8 55 char cDoorOpen; // door open.
gatedClock 26:bff592483cb1 56 };
gatedClock 34:b449d2a7c786 57
gatedClock 61:8026a9fc0cf1 58 Queue<int, 1> queueModTotalTime; // message to modify total time.
gatedClock 61:8026a9fc0cf1 59 Queue<int, 1> queueUpdateFSM; // message to inform FSM.
gatedClock 61:8026a9fc0cf1 60 Queue<int, 1> queueUpdateRemainingTime; // message to update remaining time.
gatedClock 70:7c0743c28b11 61 Queue<int, 16> queueSetRemainingTime; // tell countdown it's start time.
gatedClock 69:55b836e8ced7 62 Queue<int, 1> queueFSMnewState; // latest FSM state.
gatedClock 0:fcca4db7b32a 63 //--global_variables----------------------------//------------------------------
gatedClock 26:bff592483cb1 64 char gcSignalWaitEnable; // 1 to wait on a signal.
gatedClock 26:bff592483cb1 65 char gcSlowClock; // slow-clock signal.
gatedClock 33:34c1bef3c4ff 66 char gcInitializePipeline; // 1 to initialize pipeline state.
gatedClock 39:4e7e4d935a87 67 float gfCelsius; // from thermometer.
gatedClock 42:266d5bbbfd19 68 float gfLCDcelsius; // feed into LCD.
gatedClock 42:266d5bbbfd19 69 int gdLCDtotalCookTimeSec; // feed into LCD.
gatedClock 42:266d5bbbfd19 70 int gdCookTimeRemainingSec; // feed into LCD.
gatedClock 26:bff592483cb1 71 tButtons gtButtons; // ISR button updates.
gatedClock 70:7c0743c28b11 72
gatedClock 70:7c0743c28b11 73 int gdDiagTotalTime;
gatedClock 0:fcca4db7b32a 74 //--global_instances----------------------------//------------------------------
gatedClock 55:17f3354da63a 75 Serial pc(USBTX, USBRX); // PuTTY terminal communication.
gatedClock 39:4e7e4d935a87 76 LM75B temperature(p28,p27); // on-board thermometer.
gatedClock 9:cfdb9aa5857c 77 C12832_LCD lcd; // LCD object.
gatedClock 53:8c2baf5623c8 78 DigitalOut led0(LED4); // magnetron.
gatedClock 39:4e7e4d935a87 79 DigitalOut led1(LED3);
gatedClock 39:4e7e4d935a87 80 DigitalOut led2(LED2);
gatedClock 39:4e7e4d935a87 81 DigitalOut led3(LED1);
gatedClock 0:fcca4db7b32a 82
gatedClock 0:fcca4db7b32a 83 InterruptIn iJoyStickUp (p15); // joystick up rising edge.
gatedClock 0:fcca4db7b32a 84 InterruptIn iJoyStickDown (p12); // joystick down rising edge.
gatedClock 0:fcca4db7b32a 85 InterruptIn iJoyStickLeft (p13); // joystick left rising edge.
gatedClock 0:fcca4db7b32a 86 InterruptIn iJoyStickRight (p16); // joystick right rising edge.
gatedClock 0:fcca4db7b32a 87 InterruptIn iJoyStickCenter(p14); // 1 if joystick middle pressed.
gatedClock 66:4a0006fa5cc1 88
gatedClock 66:4a0006fa5cc1 89 Timer debounceTimer; // button debounce timer.
gatedClock 0:fcca4db7b32a 90
gatedClock 50:2928c3cbdcc3 91 Ticker tickerButtonStateManager; // manage the button states.
gatedClock 19:92b11e30aaaf 92 Ticker tickerSlowClock; // generate a ~1Hz clock.
gatedClock 64:255295f1d782 93 Ticker tickerCookCountdown; // remaining cook time.
gatedClock 63:63f362bcc2ac 94
gatedClock 63:63f362bcc2ac 95 // Timer timerFSMdone; // duration of FSM 'done' state.
gatedClock 40:7afff79f0d8b 96
gatedClock 0:fcca4db7b32a 97 //-------prototypes-----------------------------//------------------------------
gatedClock 49:56f790977983 98
gatedClock 19:92b11e30aaaf 99 void slowClock(); // 1Hz or thereabouts.
gatedClock 49:56f790977983 100
gatedClock 9:cfdb9aa5857c 101 void initialization(); // initialize settings.
gatedClock 13:21f27ba467c2 102
gatedClock 13:21f27ba467c2 103 void ISRleftButtonRising(); // cook-time increase.
gatedClock 13:21f27ba467c2 104 void ISRleftButtonFalling(); // button-release debounce.
gatedClock 13:21f27ba467c2 105 void ISRrightButtonRising(); // cook-time decrease.
gatedClock 13:21f27ba467c2 106 void ISRrightButtonFalling(); // button-release debounce.
gatedClock 13:21f27ba467c2 107 void ISRtopButtonRising(); // cook start.
gatedClock 13:21f27ba467c2 108 void ISRtopButtonFalling(); // button-release debounce.
gatedClock 13:21f27ba467c2 109 void ISRbottomButtonRising(); // cook stop.
gatedClock 13:21f27ba467c2 110 void ISRbottomButtonFalling(); // button-release debounce.
gatedClock 13:21f27ba467c2 111 void ISRcenterButtonRising(); // door state toggle.
gatedClock 13:21f27ba467c2 112 void ISRcenterButtonFalling(); // button-release debounce.
gatedClock 16:db7f0b3b2605 113 void disableSignalWaiting(); // break from signal waiting.
gatedClock 39:4e7e4d935a87 114
gatedClock 54:b0e7352d2516 115 void threadButtonStateManager(void const *args);
gatedClock 50:2928c3cbdcc3 116 void threadTotalTimeControl(void const *args);
gatedClock 57:0432c68ad232 117 void threadCookStateFSM(void const *args);
gatedClock 64:255295f1d782 118 void cookRemainingTime(); // remaining time countdown.
gatedClock 50:2928c3cbdcc3 119
gatedClock 40:7afff79f0d8b 120 void temperatureThread(void const *args); // temperature measurement.
gatedClock 42:266d5bbbfd19 121 void LCDthread (void const *args); // LCD display thread.
gatedClock 0:fcca4db7b32a 122 //==============================================//==============================
gatedClock 0:fcca4db7b32a 123 int main(void)
gatedClock 0:fcca4db7b32a 124 {
gatedClock 16:db7f0b3b2605 125 char cLeftButtonState; // 1 means button was pressed.
gatedClock 16:db7f0b3b2605 126
gatedClock 16:db7f0b3b2605 127
gatedClock 16:db7f0b3b2605 128
gatedClock 14:d3bb343cd5b2 129 iJoyStickLeft.rise (&ISRleftButtonRising);
gatedClock 14:d3bb343cd5b2 130 iJoyStickLeft.fall (&ISRleftButtonFalling);
gatedClock 9:cfdb9aa5857c 131
gatedClock 14:d3bb343cd5b2 132 iJoyStickRight.rise(&ISRrightButtonRising);
gatedClock 14:d3bb343cd5b2 133 iJoyStickRight.fall(&ISRrightButtonFalling);
gatedClock 14:d3bb343cd5b2 134
gatedClock 14:d3bb343cd5b2 135 iJoyStickUp.rise (&ISRtopButtonRising);
gatedClock 14:d3bb343cd5b2 136 iJoyStickUp.fall (&ISRtopButtonFalling);
gatedClock 9:cfdb9aa5857c 137
gatedClock 14:d3bb343cd5b2 138 iJoyStickDown.rise (&ISRbottomButtonRising);
gatedClock 14:d3bb343cd5b2 139 iJoyStickDown.fall (&ISRbottomButtonFalling);
gatedClock 7:9fbd1d540863 140
gatedClock 14:d3bb343cd5b2 141 iJoyStickCenter.rise(&ISRcenterButtonRising);
gatedClock 14:d3bb343cd5b2 142 iJoyStickCenter.fall(&ISRcenterButtonFalling);
gatedClock 9:cfdb9aa5857c 143
gatedClock 66:4a0006fa5cc1 144 debounceTimer.start(); // kick-off debounce timer.
gatedClock 66:4a0006fa5cc1 145
gatedClock 33:34c1bef3c4ff 146 gcInitializePipeline = 1; // tell pipeline to initialize.
gatedClock 16:db7f0b3b2605 147
gatedClock 9:cfdb9aa5857c 148 initialization(); // initialize variables.
gatedClock 21:b794d189c36b 149 gcSlowClock = 0;
gatedClock 44:d16e813e61ef 150 led1 = 0;
gatedClock 53:8c2baf5623c8 151 gtButtons.cDoorOpen = 0; // initialize with door closed.
gatedClock 63:63f362bcc2ac 152
gatedClock 63:63f362bcc2ac 153 // timerFSMdone.start(); // start 'done' timer.
gatedClock 49:56f790977983 154
gatedClock 70:7c0743c28b11 155 tickerSlowClock.attach_us(&slowClock ,SLOWCLOCKuS);
gatedClock 64:255295f1d782 156
gatedClock 64:255295f1d782 157 // count-down by one second.
gatedClock 69:55b836e8ced7 158 pc.printf("\n\r starting cookRemainingTime");
gatedClock 69:55b836e8ced7 159 tickerCookCountdown.attach(&cookRemainingTime,1);
gatedClock 54:b0e7352d2516 160
gatedClock 40:7afff79f0d8b 161
gatedClock 70:7c0743c28b11 162 Thread thread_1(temperatureThread ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL);
gatedClock 70:7c0743c28b11 163 Thread thread_2(LCDthread ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL);
gatedClock 70:7c0743c28b11 164 Thread thread_3(threadTotalTimeControl ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL);
gatedClock 70:7c0743c28b11 165 Thread thread_4(threadButtonStateManager,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); // was osPriorityIdle
gatedClock 70:7c0743c28b11 166 Thread thread_5(threadCookStateFSM ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL);
gatedClock 70:7c0743c28b11 167
gatedClock 66:4a0006fa5cc1 168 //Thread thread_4(threadButtonStateManager);
gatedClock 52:8ba6a0c91a89 169
gatedClock 40:7afff79f0d8b 170
gatedClock 59:5e45b5e4a874 171 // the message-receiving threads need 'else' for message-receive-timeout.
gatedClock 9:cfdb9aa5857c 172
gatedClock 14:d3bb343cd5b2 173 while(1)
gatedClock 0:fcca4db7b32a 174 {
gatedClock 70:7c0743c28b11 175 pc.printf("\n\r gdDiagTotalTime %d",gdDiagTotalTime);
gatedClock 70:7c0743c28b11 176
gatedClock 70:7c0743c28b11 177 Thread::wait(1000);
gatedClock 16:db7f0b3b2605 178
gatedClock 16:db7f0b3b2605 179
gatedClock 16:db7f0b3b2605 180
gatedClock 14:d3bb343cd5b2 181
gatedClock 0:fcca4db7b32a 182 }
gatedClock 19:92b11e30aaaf 183 }
gatedClock 19:92b11e30aaaf 184 /*----------------------------------------------//----------------------------*/
gatedClock 59:5e45b5e4a874 185
gatedClock 59:5e45b5e4a874 186 // this serves as the bottom-half for all of the button-press IRSs.
gatedClock 59:5e45b5e4a874 187 // it sends button-status messages to other threads, and it also
gatedClock 59:5e45b5e4a874 188 // clears the button-state globals to prepare them for the next
gatedClock 59:5e45b5e4a874 189 // button press.
gatedClock 59:5e45b5e4a874 190
gatedClock 59:5e45b5e4a874 191
gatedClock 54:b0e7352d2516 192 void threadButtonStateManager(void const *args)
gatedClock 50:2928c3cbdcc3 193 {
gatedClock 56:18cff6eb91db 194 int dMessage; // message.
gatedClock 50:2928c3cbdcc3 195
gatedClock 54:b0e7352d2516 196 while(1) // thread loop.
gatedClock 67:1d9c85a4c3c1 197 {
gatedClock 54:b0e7352d2516 198 //--- // TOTAL TIME CONTROL.
gatedClock 56:18cff6eb91db 199
gatedClock 56:18cff6eb91db 200 // encoded integers will be sent,
gatedClock 56:18cff6eb91db 201 // not pointers.
gatedClock 50:2928c3cbdcc3 202
gatedClock 50:2928c3cbdcc3 203 if (gtButtons.cLeftButton) // total time increment button.
gatedClock 50:2928c3cbdcc3 204 {
gatedClock 54:b0e7352d2516 205 dMessage = MSG_INC_TIME; // set message.
gatedClock 69:55b836e8ced7 206 queueModTotalTime.put((int *) dMessage,1);// pretend it's a pointer.
gatedClock 50:2928c3cbdcc3 207 gtButtons.cLeftButton = 0; // clear the button state.
gatedClock 67:1d9c85a4c3c1 208 // pc.printf("\n\r time increment button.");
gatedClock 50:2928c3cbdcc3 209 }
gatedClock 67:1d9c85a4c3c1 210
gatedClock 59:5e45b5e4a874 211 if (gtButtons.cRightButton) // total time decrement button.
gatedClock 50:2928c3cbdcc3 212 {
gatedClock 54:b0e7352d2516 213 dMessage = MSG_DEC_TIME; // set message.
gatedClock 69:55b836e8ced7 214 queueModTotalTime.put((int *) dMessage,1);// pretend it's a pointer.
gatedClock 50:2928c3cbdcc3 215 gtButtons.cRightButton = 0; // clear the button state.
gatedClock 67:1d9c85a4c3c1 216 // pc.printf("\n\r time decrement button.");
gatedClock 50:2928c3cbdcc3 217 }
gatedClock 67:1d9c85a4c3c1 218
gatedClock 59:5e45b5e4a874 219 //--- // COOK-STATE FSM.
gatedClock 59:5e45b5e4a874 220
gatedClock 59:5e45b5e4a874 221 if (gtButtons.cTopButton) // start-cook button.
gatedClock 58:ec630b6dd9b1 222 {
gatedClock 59:5e45b5e4a874 223 dMessage = MSG_START; // set message.
gatedClock 69:55b836e8ced7 224 queueUpdateFSM.put((int *) dMessage,1); // pretend it's a pointer.
gatedClock 59:5e45b5e4a874 225 gtButtons.cTopButton = 0; // clear the button state.
gatedClock 58:ec630b6dd9b1 226 }
gatedClock 67:1d9c85a4c3c1 227
gatedClock 59:5e45b5e4a874 228 if (gtButtons.cBottomButton) // stop-cook button.
gatedClock 58:ec630b6dd9b1 229 {
gatedClock 59:5e45b5e4a874 230 dMessage = MSG_STOP; // set message.
gatedClock 69:55b836e8ced7 231 queueUpdateFSM.put((int *) dMessage,1); // pretend it's a pointer.
gatedClock 59:5e45b5e4a874 232 gtButtons.cBottomButton = 0; // clear the button state.
gatedClock 58:ec630b6dd9b1 233 }
gatedClock 67:1d9c85a4c3c1 234
gatedClock 59:5e45b5e4a874 235 if (gtButtons.cCenterButton) // door-state-toggle.
gatedClock 58:ec630b6dd9b1 236 {
gatedClock 59:5e45b5e4a874 237 dMessage = gtButtons.cDoorOpen; // determined in ISR.
gatedClock 69:55b836e8ced7 238 queueUpdateFSM.put((int *) dMessage,1); // pretend it's a pointer.
gatedClock 59:5e45b5e4a874 239 gtButtons.cCenterButton = 0; // clear the button state.
gatedClock 58:ec630b6dd9b1 240 }
gatedClock 59:5e45b5e4a874 241 //---
gatedClock 58:ec630b6dd9b1 242
gatedClock 54:b0e7352d2516 243 Thread::wait(THREAD_4_WAITmS); // multitasking.
gatedClock 54:b0e7352d2516 244 } // thread loop.
gatedClock 54:b0e7352d2516 245 } // threadButtonStateManager.
gatedClock 50:2928c3cbdcc3 246 /*----------------------------------------------//----------------------------*/
gatedClock 51:e5ec74c49b01 247 // the incoming messages are mutually-exclusive.
gatedClock 51:e5ec74c49b01 248 // total time controller.
gatedClock 51:e5ec74c49b01 249 void threadTotalTimeControl(void const *args)
gatedClock 50:2928c3cbdcc3 250 {
gatedClock 51:e5ec74c49b01 251 static int dTotalTime = 0; // total time variable.
gatedClock 60:e10bf95bbc96 252 int dMessage; // message.
gatedClock 51:e5ec74c49b01 253 osEvent queueEvent; // queue event.
gatedClock 70:7c0743c28b11 254 int dRC;
gatedClock 50:2928c3cbdcc3 255
gatedClock 50:2928c3cbdcc3 256 while(1) // thread loop.
gatedClock 50:2928c3cbdcc3 257 {
gatedClock 50:2928c3cbdcc3 258
gatedClock 55:17f3354da63a 259 queueEvent = queueModTotalTime.get(1); // get message.
gatedClock 51:e5ec74c49b01 260 if (queueEvent.status == osEventMessage)
gatedClock 51:e5ec74c49b01 261 {
gatedClock 56:18cff6eb91db 262 dMessage = (int) queueEvent.value.p; // interpret as integer, not pointer.
gatedClock 54:b0e7352d2516 263
gatedClock 54:b0e7352d2516 264 // increment total time.
gatedClock 56:18cff6eb91db 265 if (dMessage == MSG_INC_TIME) dTotalTime += 60;
gatedClock 54:b0e7352d2516 266
gatedClock 54:b0e7352d2516 267 // decrement total time.
gatedClock 56:18cff6eb91db 268 if (dMessage == MSG_DEC_TIME) dTotalTime -= 60;
gatedClock 65:e39360da5929 269
gatedClock 65:e39360da5929 270 // saturations.
gatedClock 65:e39360da5929 271 if (dTotalTime > 180) dTotalTime = 180;
gatedClock 65:e39360da5929 272 if (dTotalTime < 0) dTotalTime = 0;
gatedClock 65:e39360da5929 273
gatedClock 70:7c0743c28b11 274 dRC = queueSetRemainingTime.put((int *) dTotalTime,1);
gatedClock 70:7c0743c28b11 275 pc.printf("\n\r just queueSetRemainingTime.put %d, dRC = %d",dTotalTime,dRC);
gatedClock 65:e39360da5929 276
gatedClock 65:e39360da5929 277
gatedClock 51:e5ec74c49b01 278 }
gatedClock 54:b0e7352d2516 279
gatedClock 65:e39360da5929 280
gatedClock 51:e5ec74c49b01 281
gatedClock 51:e5ec74c49b01 282 gdLCDtotalCookTimeSec = dTotalTime; // transmit to LCD.
gatedClock 61:8026a9fc0cf1 283
gatedClock 61:8026a9fc0cf1 284 // pretend it's a pointer.
gatedClock 61:8026a9fc0cf1 285 // queueUpdateTotalTime.put((int *) dTotalTime);
gatedClock 61:8026a9fc0cf1 286
gatedClock 61:8026a9fc0cf1 287
gatedClock 50:2928c3cbdcc3 288
gatedClock 50:2928c3cbdcc3 289 Thread::wait(THREAD_3_WAITmS); // multitasking.
gatedClock 50:2928c3cbdcc3 290 } // thread loop.
gatedClock 50:2928c3cbdcc3 291 } // threadTotalTimeControl.
gatedClock 33:34c1bef3c4ff 292 /*----------------------------------------------//----------------------------*/
gatedClock 60:e10bf95bbc96 293 /*
gatedClock 60:e10bf95bbc96 294 #define FSM_IDLE 0x00 // cook-state state-machine.
gatedClock 60:e10bf95bbc96 295 #define FSM_COOK 0x01 // cook-state state-machine.
gatedClock 60:e10bf95bbc96 296 #define FSM_PAUSE 0x02 // cook-state state-machine.
gatedClock 60:e10bf95bbc96 297 #define FSM_DONE 0x04 // cook-state state-machine.
gatedClock 62:48e7c196e2a5 298
gatedClock 62:48e7c196e2a5 299 #define MSG_START 0x04
gatedClock 62:48e7c196e2a5 300 #define MSG_STOP 0x08
gatedClock 62:48e7c196e2a5 301 #define MSG_OPEN 0x10
gatedClock 62:48e7c196e2a5 302 #define MSG_CLOSED 0x20
gatedClock 60:e10bf95bbc96 303 */
gatedClock 57:0432c68ad232 304 void threadCookStateFSM(void const *args) // cook-cycle FSM.
gatedClock 57:0432c68ad232 305 {
gatedClock 69:55b836e8ced7 306 static int dFSMstate = FSM_IDLE; // state of this FSM.
gatedClock 69:55b836e8ced7 307 static int dFSMstateLast = FSM_IDLE; // previous FSM state.
gatedClock 61:8026a9fc0cf1 308 static int dButtonState; // received button state.
gatedClock 61:8026a9fc0cf1 309 static int dRemainingTime; // received remaining time.
gatedClock 62:48e7c196e2a5 310
gatedClock 62:48e7c196e2a5 311 static int dButtonStart = 0;
gatedClock 62:48e7c196e2a5 312 static int dButtonStop = 0;
gatedClock 62:48e7c196e2a5 313 static int dDoorOpen = 0;
gatedClock 62:48e7c196e2a5 314 static int dTimeRemaining = 0;
gatedClock 62:48e7c196e2a5 315
gatedClock 63:63f362bcc2ac 316 osEvent queueEvent; // queue event.
gatedClock 63:63f362bcc2ac 317
gatedClock 57:0432c68ad232 318 while(1) // thread loop.
gatedClock 57:0432c68ad232 319 {
gatedClock 62:48e7c196e2a5 320
gatedClock 63:63f362bcc2ac 321 if (dFSMstate == FSM_IDLE) // idle state.
gatedClock 62:48e7c196e2a5 322 {
gatedClock 69:55b836e8ced7 323 // pc.printf("\n\r FSM_IDLE");
gatedClock 62:48e7c196e2a5 324 if (dButtonStart & !dDoorOpen & dTimeRemaining) dFSMstate = FSM_COOK;
gatedClock 62:48e7c196e2a5 325 }
gatedClock 62:48e7c196e2a5 326 else
gatedClock 63:63f362bcc2ac 327 if (dFSMstate == FSM_COOK) // cook state.
gatedClock 62:48e7c196e2a5 328 {
gatedClock 68:cbebcfc948aa 329 pc.printf("\n\r FSM_COOK");
gatedClock 68:cbebcfc948aa 330 if (dDoorOpen & dTimeRemaining) dFSMstate = FSM_PAUSE;
gatedClock 62:48e7c196e2a5 331 }
gatedClock 62:48e7c196e2a5 332 else
gatedClock 63:63f362bcc2ac 333 if (dFSMstate == FSM_PAUSE) // pause state.
gatedClock 62:48e7c196e2a5 334 {
gatedClock 68:cbebcfc948aa 335 pc.printf("\n\r FSM_PAUSE");
gatedClock 62:48e7c196e2a5 336 if (dButtonStart & !dDoorOpen & dTimeRemaining) dFSMstate = FSM_DONE;
gatedClock 62:48e7c196e2a5 337 if (dButtonStop) dFSMstate = FSM_COOK;
gatedClock 62:48e7c196e2a5 338 }
gatedClock 62:48e7c196e2a5 339 else
gatedClock 62:48e7c196e2a5 340 if (dFSMstate == FSM_DONE) // incomplete.
gatedClock 62:48e7c196e2a5 341 {
gatedClock 68:cbebcfc948aa 342 pc.printf("\n\r FSM_DONE");
gatedClock 63:63f362bcc2ac 343 // timerFSMdone.reset(); // reset the timer.
gatedClock 63:63f362bcc2ac 344 dFSMstate = FSM_IDLE; // end of beep.
gatedClock 62:48e7c196e2a5 345 }
gatedClock 62:48e7c196e2a5 346
gatedClock 69:55b836e8ced7 347
gatedClock 69:55b836e8ced7 348 if (dFSMstate != dFSMstateLast) // if just changed state.
gatedClock 69:55b836e8ced7 349 {
gatedClock 69:55b836e8ced7 350 // tell cookRemainingTime the new state.
gatedClock 69:55b836e8ced7 351 queueFSMnewState.put((int* )dFSMstate,1);
gatedClock 69:55b836e8ced7 352
gatedClock 69:55b836e8ced7 353
gatedClock 69:55b836e8ced7 354 }
gatedClock 62:48e7c196e2a5 355
gatedClock 63:63f362bcc2ac 356
gatedClock 60:e10bf95bbc96 357 queueEvent = queueUpdateFSM.get(1); // get message.
gatedClock 60:e10bf95bbc96 358 if (queueEvent.status == osEventMessage)// update state variable.
gatedClock 60:e10bf95bbc96 359 {
gatedClock 61:8026a9fc0cf1 360 // interpret as integer, not pointer.
gatedClock 61:8026a9fc0cf1 361 dButtonState = (int) queueEvent.value.p;
gatedClock 63:63f362bcc2ac 362
gatedClock 69:55b836e8ced7 363 pc.printf("\n dButtonState = %d",dButtonState);
gatedClock 69:55b836e8ced7 364
gatedClock 63:63f362bcc2ac 365 if (dButtonState == MSG_START)
gatedClock 63:63f362bcc2ac 366 {
gatedClock 69:55b836e8ced7 367 pc.printf("\n\r message start.");
gatedClock 63:63f362bcc2ac 368 dButtonStart = 1;
gatedClock 63:63f362bcc2ac 369 dButtonStop = 0;
gatedClock 63:63f362bcc2ac 370 }
gatedClock 63:63f362bcc2ac 371 if (dButtonState == MSG_STOP)
gatedClock 63:63f362bcc2ac 372 {
gatedClock 69:55b836e8ced7 373 pc.printf("\n\r message stop.");
gatedClock 63:63f362bcc2ac 374 dButtonStart = 0;
gatedClock 63:63f362bcc2ac 375 dButtonStop = 1;
gatedClock 63:63f362bcc2ac 376 }
gatedClock 63:63f362bcc2ac 377
gatedClock 63:63f362bcc2ac 378 if (dButtonState == MSG_OPEN)
gatedClock 63:63f362bcc2ac 379 {
gatedClock 69:55b836e8ced7 380 pc.printf("\n\r message open.");
gatedClock 63:63f362bcc2ac 381 dDoorOpen = 1;
gatedClock 63:63f362bcc2ac 382 }
gatedClock 63:63f362bcc2ac 383
gatedClock 63:63f362bcc2ac 384 if (dButtonState == MSG_CLOSED)
gatedClock 63:63f362bcc2ac 385 {
gatedClock 69:55b836e8ced7 386 pc.printf("\n\r message closed.");
gatedClock 63:63f362bcc2ac 387 dDoorOpen = 0;
gatedClock 63:63f362bcc2ac 388 }
gatedClock 63:63f362bcc2ac 389
gatedClock 61:8026a9fc0cf1 390 }
gatedClock 61:8026a9fc0cf1 391 // get message.
gatedClock 61:8026a9fc0cf1 392 queueEvent = queueUpdateRemainingTime.get(1);
gatedClock 61:8026a9fc0cf1 393 if (queueEvent.status == osEventMessage)// update state variable.
gatedClock 61:8026a9fc0cf1 394 {
gatedClock 70:7c0743c28b11 395 led3 = !led3;
gatedClock 61:8026a9fc0cf1 396 // interpret as integer, not pointer.
gatedClock 61:8026a9fc0cf1 397 dRemainingTime = (int) queueEvent.value.p;
gatedClock 69:55b836e8ced7 398
gatedClock 61:8026a9fc0cf1 399 }
gatedClock 60:e10bf95bbc96 400
gatedClock 60:e10bf95bbc96 401
gatedClock 61:8026a9fc0cf1 402
gatedClock 57:0432c68ad232 403
gatedClock 57:0432c68ad232 404
gatedClock 57:0432c68ad232 405
gatedClock 57:0432c68ad232 406
gatedClock 69:55b836e8ced7 407 dFSMstateLast = dFSMstate; // pipeline variable.
gatedClock 57:0432c68ad232 408 Thread::wait(THREAD_5_WAITmS); // multitasking.
gatedClock 57:0432c68ad232 409 } // thread loop.
gatedClock 57:0432c68ad232 410 } // threadCookStateFSM.
gatedClock 57:0432c68ad232 411 /*----------------------------------------------//----------------------------*/
gatedClock 19:92b11e30aaaf 412 void slowClock(void) // 1Hz or thereabouts.
gatedClock 19:92b11e30aaaf 413 {
gatedClock 24:d39516e077ea 414 gcSlowClock = !gcSlowClock; // toggle clock.
gatedClock 19:92b11e30aaaf 415 }
gatedClock 19:92b11e30aaaf 416 /*----------------------------------------------//----------------------------*/
gatedClock 0:fcca4db7b32a 417 void initialization(void) // program initializations.
gatedClock 0:fcca4db7b32a 418 {
gatedClock 16:db7f0b3b2605 419 gcSignalWaitEnable = 1;
gatedClock 0:fcca4db7b32a 420 }
gatedClock 0:fcca4db7b32a 421 /*----------------------------------------------//----------------------------*/
gatedClock 26:bff592483cb1 422 void ISRleftButtonRising(void) // cooktime plus 60s.
gatedClock 1:9188d4668a88 423 {
gatedClock 66:4a0006fa5cc1 424 if (debounceTimer.read_ms() > DEBOUNCEmS)
gatedClock 26:bff592483cb1 425 gtButtons.cLeftButton = 1; // detect left button.
gatedClock 9:cfdb9aa5857c 426
gatedClock 66:4a0006fa5cc1 427 debounceTimer.reset(); // begin debounce period.
gatedClock 11:9cae003da12b 428 }
gatedClock 1:9188d4668a88 429 /*----------------------------------------------//----------------------------*/
gatedClock 15:5eaa2ab1d00d 430 void ISRleftButtonFalling(void) // button-release debounce.
gatedClock 1:9188d4668a88 431 {
gatedClock 66:4a0006fa5cc1 432 debounceTimer.reset(); // begin debounce period.
gatedClock 11:9cae003da12b 433 }
gatedClock 2:665ffa57031f 434 /*----------------------------------------------//----------------------------*/
gatedClock 26:bff592483cb1 435 void ISRrightButtonRising(void) // cooktime -60s.
gatedClock 12:e40272e1fd8f 436 {
gatedClock 66:4a0006fa5cc1 437 if (debounceTimer.read_ms() > DEBOUNCEmS)
gatedClock 26:bff592483cb1 438 gtButtons.cRightButton = 1; // detect right button.
gatedClock 12:e40272e1fd8f 439
gatedClock 66:4a0006fa5cc1 440 debounceTimer.reset(); // begin debounce period.
gatedClock 12:e40272e1fd8f 441 }
gatedClock 12:e40272e1fd8f 442 /*----------------------------------------------//----------------------------*/
gatedClock 15:5eaa2ab1d00d 443 void ISRrightButtonFalling(void) // button-release debounce.
gatedClock 12:e40272e1fd8f 444 {
gatedClock 66:4a0006fa5cc1 445 debounceTimer.reset(); // begin debounce period.
gatedClock 12:e40272e1fd8f 446 }
gatedClock 12:e40272e1fd8f 447 /*----------------------------------------------//----------------------------*/
gatedClock 26:bff592483cb1 448 void ISRtopButtonRising(void) // cook start.
gatedClock 12:e40272e1fd8f 449 {
gatedClock 66:4a0006fa5cc1 450 if (debounceTimer.read_ms() > DEBOUNCEmS)
gatedClock 26:bff592483cb1 451 gtButtons.cTopButton = 1; // detect top button.
gatedClock 12:e40272e1fd8f 452
gatedClock 66:4a0006fa5cc1 453 debounceTimer.reset(); // begin debounce period.
gatedClock 12:e40272e1fd8f 454 }
gatedClock 12:e40272e1fd8f 455 /*----------------------------------------------//----------------------------*/
gatedClock 15:5eaa2ab1d00d 456 void ISRtopButtonFalling(void) // button-release debounce.
gatedClock 12:e40272e1fd8f 457 {
gatedClock 66:4a0006fa5cc1 458 debounceTimer.reset(); // begin debounce period.
gatedClock 12:e40272e1fd8f 459 }
gatedClock 12:e40272e1fd8f 460 /*----------------------------------------------//----------------------------*/
gatedClock 53:8c2baf5623c8 461 // front-end control of magnetron off.
gatedClock 53:8c2baf5623c8 462 // due to physical danger, the magnetron is turned off immediately
gatedClock 53:8c2baf5623c8 463 // upon off-button press, in the interrupt that it generates.
gatedClock 53:8c2baf5623c8 464
gatedClock 26:bff592483cb1 465 void ISRbottomButtonRising(void) // cook stop.
gatedClock 12:e40272e1fd8f 466 {
gatedClock 66:4a0006fa5cc1 467 if (debounceTimer.read_ms() > DEBOUNCEmS)
gatedClock 66:4a0006fa5cc1 468 {
gatedClock 66:4a0006fa5cc1 469 led0 = 0; // magnetron off.
gatedClock 66:4a0006fa5cc1 470 gtButtons.cBottomButton = 1; // detect bottom button.
gatedClock 66:4a0006fa5cc1 471 }
gatedClock 66:4a0006fa5cc1 472 debounceTimer.reset(); // begin debounce period.
gatedClock 66:4a0006fa5cc1 473 }
gatedClock 12:e40272e1fd8f 474 /*----------------------------------------------//----------------------------*/
gatedClock 15:5eaa2ab1d00d 475 void ISRbottomButtonFalling(void) // button-release debounce.
gatedClock 12:e40272e1fd8f 476 {
gatedClock 66:4a0006fa5cc1 477 debounceTimer.reset(); // begin debounce period.
gatedClock 12:e40272e1fd8f 478 }
gatedClock 12:e40272e1fd8f 479 /*----------------------------------------------//----------------------------*/
gatedClock 53:8c2baf5623c8 480 // front-end control of magnetron off.
gatedClock 53:8c2baf5623c8 481 // due to physical danger, the magnetron is turned off immediately
gatedClock 53:8c2baf5623c8 482 // upon detection of an open door.
gatedClock 53:8c2baf5623c8 483
gatedClock 26:bff592483cb1 484 void ISRcenterButtonRising(void) // toggle door state.
gatedClock 12:e40272e1fd8f 485 {
gatedClock 66:4a0006fa5cc1 486 if (debounceTimer.read_ms() > DEBOUNCEmS)
gatedClock 66:4a0006fa5cc1 487 {
gatedClock 66:4a0006fa5cc1 488 if (gtButtons.cDoorOpen == MSG_OPEN) // calculate door state.
gatedClock 66:4a0006fa5cc1 489 gtButtons.cDoorOpen = MSG_CLOSED;
gatedClock 66:4a0006fa5cc1 490 else
gatedClock 66:4a0006fa5cc1 491 gtButtons.cDoorOpen = MSG_OPEN;
gatedClock 53:8c2baf5623c8 492
gatedClock 59:5e45b5e4a874 493 // magnetron off.
gatedClock 66:4a0006fa5cc1 494 if (gtButtons.cDoorOpen == MSG_OPEN) led0 = 0;
gatedClock 58:ec630b6dd9b1 495
gatedClock 66:4a0006fa5cc1 496 gtButtons.cCenterButton = 1;
gatedClock 66:4a0006fa5cc1 497 }
gatedClock 66:4a0006fa5cc1 498 debounceTimer.reset(); // begin debounce period.
gatedClock 12:e40272e1fd8f 499 }
gatedClock 12:e40272e1fd8f 500 /*----------------------------------------------//----------------------------*/
gatedClock 15:5eaa2ab1d00d 501 void ISRcenterButtonFalling(void) // button-release debounce.
gatedClock 12:e40272e1fd8f 502 {
gatedClock 66:4a0006fa5cc1 503 debounceTimer.reset(); // begin debounce period.
gatedClock 12:e40272e1fd8f 504 }
gatedClock 12:e40272e1fd8f 505 /*----------------------------------------------//----------------------------*/
gatedClock 40:7afff79f0d8b 506 void temperatureThread(void const *args) // temperature measurement.
gatedClock 39:4e7e4d935a87 507 {
gatedClock 45:e3207684e841 508 while(1) // thread loop.
gatedClock 45:e3207684e841 509 {
gatedClock 45:e3207684e841 510 gfCelsius = temperature.read(); // physical measurement.
gatedClock 40:7afff79f0d8b 511
gatedClock 45:e3207684e841 512 Thread::wait(THREAD_1_WAITmS); // multitasking.
gatedClock 45:e3207684e841 513 } // thread loop.
gatedClock 45:e3207684e841 514 } // temperatureThread.
gatedClock 42:266d5bbbfd19 515 /*----------------------------------------------//----------------------------*/
gatedClock 42:266d5bbbfd19 516 void LCDthread(void const *args) // LCD display thread.
gatedClock 42:266d5bbbfd19 517 {
gatedClock 67:1d9c85a4c3c1 518
gatedClock 67:1d9c85a4c3c1 519 static int dLCDtotalCookTimeSec = 0; // sample current values.
gatedClock 67:1d9c85a4c3c1 520 static int dCookTimeRemainingSec = 0;
gatedClock 67:1d9c85a4c3c1 521 static float fLCDcelsius = 0.0;
gatedClock 67:1d9c85a4c3c1 522
gatedClock 67:1d9c85a4c3c1 523 // remember previous values.
gatedClock 67:1d9c85a4c3c1 524 static int dLCDtotalCookTimeSecLast = 0;
gatedClock 67:1d9c85a4c3c1 525 static int dCookTimeRemainingSecLast = 0;
gatedClock 67:1d9c85a4c3c1 526 static float fLCDcelsiusLast = 0.0;
gatedClock 67:1d9c85a4c3c1 527
gatedClock 44:d16e813e61ef 528 while(1) // thread loop.
gatedClock 44:d16e813e61ef 529 {
gatedClock 67:1d9c85a4c3c1 530 // don't allow the values to
gatedClock 67:1d9c85a4c3c1 531 // change in the middle of the
gatedClock 67:1d9c85a4c3c1 532 // below else the anti-blink
gatedClock 67:1d9c85a4c3c1 533 // code won't work.
gatedClock 67:1d9c85a4c3c1 534 dLCDtotalCookTimeSec = gdLCDtotalCookTimeSec;
gatedClock 67:1d9c85a4c3c1 535 dCookTimeRemainingSec = gdCookTimeRemainingSec;
gatedClock 67:1d9c85a4c3c1 536 fLCDcelsius = gfLCDcelsius;
gatedClock 67:1d9c85a4c3c1 537
gatedClock 67:1d9c85a4c3c1 538
gatedClock 67:1d9c85a4c3c1 539 // clear display only when
gatedClock 67:1d9c85a4c3c1 540 // necessary, in order to avoid
gatedClock 67:1d9c85a4c3c1 541 // 'blinkieness'.
gatedClock 67:1d9c85a4c3c1 542 if (dLCDtotalCookTimeSec != dLCDtotalCookTimeSecLast ||
gatedClock 67:1d9c85a4c3c1 543 dCookTimeRemainingSec != dCookTimeRemainingSecLast ||
gatedClock 67:1d9c85a4c3c1 544 fLCDcelsius != fLCDcelsiusLast)
gatedClock 67:1d9c85a4c3c1 545 lcd.cls();
gatedClock 42:266d5bbbfd19 546
gatedClock 44:d16e813e61ef 547 LCD1; // line 1.
gatedClock 67:1d9c85a4c3c1 548 lcd.printf(" total cook time: %d",dLCDtotalCookTimeSec);
gatedClock 42:266d5bbbfd19 549
gatedClock 44:d16e813e61ef 550 LCD2; // line 2.
gatedClock 67:1d9c85a4c3c1 551 lcd.printf(" remaing cook time: %d",dCookTimeRemainingSec);
gatedClock 42:266d5bbbfd19 552
gatedClock 44:d16e813e61ef 553 LCD3; // line 3.
gatedClock 67:1d9c85a4c3c1 554 lcd.printf(" temperature : %5.3f",fLCDcelsius);
gatedClock 67:1d9c85a4c3c1 555
gatedClock 67:1d9c85a4c3c1 556 // pipeline variables.
gatedClock 67:1d9c85a4c3c1 557 dLCDtotalCookTimeSecLast = dLCDtotalCookTimeSec;
gatedClock 67:1d9c85a4c3c1 558 dCookTimeRemainingSecLast = dCookTimeRemainingSec;
gatedClock 67:1d9c85a4c3c1 559 fLCDcelsiusLast = fLCDcelsius;
gatedClock 42:266d5bbbfd19 560
gatedClock 44:d16e813e61ef 561 Thread::wait(THREAD_2_WAITmS); // multitasking.
gatedClock 44:d16e813e61ef 562 } // thread loop.
gatedClock 44:d16e813e61ef 563 } // LCDthread.
gatedClock 42:266d5bbbfd19 564 /*----------------------------------------------//----------------------------*/
gatedClock 64:255295f1d782 565 void cookRemainingTime(void) // cook-cycle countdown.
gatedClock 64:255295f1d782 566 {
gatedClock 69:55b836e8ced7 567 static int dFSMstate = FSM_IDLE; // mirror FSM state.
gatedClock 69:55b836e8ced7 568 static int dTotalTime = 0; // local copy, total time.
gatedClock 65:e39360da5929 569 static int dRemainingTime = 0; // remaining time.
gatedClock 65:e39360da5929 570 osEvent queueEvent; // queue event.
gatedClock 70:7c0743c28b11 571 osEvent queueEvent1; // queue event.
gatedClock 69:55b836e8ced7 572
gatedClock 69:55b836e8ced7 573 // count-down while FSM is in cook mode.
gatedClock 69:55b836e8ced7 574 if (dFSMstate == FSM_COOK) dRemainingTime--;
gatedClock 66:4a0006fa5cc1 575
gatedClock 69:55b836e8ced7 576 // if done, including if stop button
gatedClock 69:55b836e8ced7 577 // was presed.
gatedClock 69:55b836e8ced7 578 if (dFSMstate == FSM_DONE) dRemainingTime = 0;
gatedClock 69:55b836e8ced7 579
gatedClock 69:55b836e8ced7 580 // saturate remaining time.
gatedClock 65:e39360da5929 581 if (dRemainingTime < 0) dRemainingTime = 0;
gatedClock 69:55b836e8ced7 582
gatedClock 70:7c0743c28b11 583 gdCookTimeRemainingSec = dRemainingTime; // update global.
gatedClock 70:7c0743c28b11 584
gatedClock 69:55b836e8ced7 585 // send to FSM.
gatedClock 69:55b836e8ced7 586 queueUpdateRemainingTime.put((int *) dRemainingTime,1);
gatedClock 69:55b836e8ced7 587
gatedClock 70:7c0743c28b11 588 queueEvent1 = queueSetRemainingTime.get(1);
gatedClock 70:7c0743c28b11 589 if (queueEvent1.status == osEventMessage) // update state variable.
gatedClock 70:7c0743c28b11 590 {
gatedClock 70:7c0743c28b11 591 led0 = !led0;
gatedClock 70:7c0743c28b11 592 dTotalTime = (int) queueEvent1.value.p; // interpret as integer, not pointer.
gatedClock 70:7c0743c28b11 593 gdDiagTotalTime = dTotalTime;
gatedClock 65:e39360da5929 594 }
gatedClock 70:7c0743c28b11 595
gatedClock 69:55b836e8ced7 596 queueEvent = queueFSMnewState.get(1); // get latest FSM state.
gatedClock 69:55b836e8ced7 597 if (queueEvent.status == osEventMessage) // if there is an FSM change.
gatedClock 69:55b836e8ced7 598 {
gatedClock 70:7c0743c28b11 599 led1 = !led1;
gatedClock 69:55b836e8ced7 600 dFSMstate = (int) queueEvent.value.p; // mirror the FSM state.
gatedClock 70:7c0743c28b11 601
gatedClock 69:55b836e8ced7 602 if (dFSMstate == FSM_COOK) // if FSM just entered cook mode.
gatedClock 69:55b836e8ced7 603 {
gatedClock 69:55b836e8ced7 604 dRemainingTime = dTotalTime; // rewind countdown.
gatedClock 70:7c0743c28b11 605 } // if FSM just entered cook mode.
gatedClock 69:55b836e8ced7 606
gatedClock 70:7c0743c28b11 607 } // get latest FSM state.
gatedClock 70:7c0743c28b11 608
gatedClock 70:7c0743c28b11 609 } // cookRemainingTime.
gatedClock 69:55b836e8ced7 610 /*----------------------------------------------//----------------------------*/
gatedClock 69:55b836e8ced7 611
gatedClock 69:55b836e8ced7 612
gatedClock 69:55b836e8ced7 613
gatedClock 69:55b836e8ced7 614
gatedClock 69:55b836e8ced7 615
gatedClock 69:55b836e8ced7 616
gatedClock 69:55b836e8ced7 617
gatedClock 69:55b836e8ced7 618
gatedClock 69:55b836e8ced7 619
gatedClock 69:55b836e8ced7 620
gatedClock 69:55b836e8ced7 621