microwave simulator

Dependencies:   C12832_lcd LM75B mbed

Committer:
rabad1
Date:
Thu Oct 24 22:07:46 2013 +0000
Revision:
2:9f6bdaddefff
Parent:
1:fac01d40d819
updated comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rabad1 0:2f825861a3a2 1 #include "mbed.h"
rabad1 0:2f825861a3a2 2
rabad1 0:2f825861a3a2 3 #include "LM75B.h"
rabad1 0:2f825861a3a2 4 #include "C12832_lcd.h"
rabad1 0:2f825861a3a2 5 #include "keypad.h"
rabad1 0:2f825861a3a2 6
rabad1 0:2f825861a3a2 7 // uncomment to allow DEBUG
rabad1 1:fac01d40d819 8 //#define DEBUG
rabad1 0:2f825861a3a2 9
rabad1 0:2f825861a3a2 10 #define BUTTON_LEFT (p13)
rabad1 0:2f825861a3a2 11 #define BUTTON_RIGHT (p16)
rabad1 0:2f825861a3a2 12 #define BUTTON_START (p15)
rabad1 0:2f825861a3a2 13 #define BUTTON_STOP (p12)
rabad1 0:2f825861a3a2 14 #define BUTTON_DOOR (p14)
rabad1 1:fac01d40d819 15 #define TEMP_SCL (p27)
rabad1 1:fac01d40d819 16 #define TEMP_SDA (p28)
rabad1 1:fac01d40d819 17 #define ALARM (p26)
rabad1 0:2f825861a3a2 18
rabad1 0:2f825861a3a2 19 #define DOOR_CLOSED (0)
rabad1 0:2f825861a3a2 20 #define DOOR_OPEN (1)
rabad1 0:2f825861a3a2 21
rabad1 0:2f825861a3a2 22 #define LED_OFF (0)
rabad1 0:2f825861a3a2 23 #define LED_ON (1)
rabad1 0:2f825861a3a2 24
rabad1 0:2f825861a3a2 25 #define TRUE (1)
rabad1 0:2f825861a3a2 26 #define FALSE (0)
rabad1 0:2f825861a3a2 27
rabad1 0:2f825861a3a2 28 #define MIN_COOKING_TIME (0) // secs
rabad1 0:2f825861a3a2 29 #define MAX_COOKING_TIME (180)
rabad1 0:2f825861a3a2 30 #define COOKING_TIME_INCREMENT (60)
rabad1 0:2f825861a3a2 31 #define MAX_TICKER_TIME (60)
rabad1 0:2f825861a3a2 32 #define WDOG_TIME (1)
rabad1 0:2f825861a3a2 33
rabad1 0:2f825861a3a2 34 #define TEMP_INCREMENT (10.0f) // degC
rabad1 0:2f825861a3a2 35
rabad1 0:2f825861a3a2 36 typedef enum
rabad1 0:2f825861a3a2 37 {
rabad1 0:2f825861a3a2 38 STATUS_IDLE = 0,
rabad1 0:2f825861a3a2 39 STATUS_COOKING,
rabad1 0:2f825861a3a2 40 STATUS_DONE
rabad1 0:2f825861a3a2 41 } etSTATUS;
rabad1 0:2f825861a3a2 42
rabad1 0:2f825861a3a2 43 #ifdef DEBUG
rabad1 0:2f825861a3a2 44 #define MAX_LATENCY (10) // msec
rabad1 0:2f825861a3a2 45 #define ERROR_MICROWAVE_SM (1L<<0)
rabad1 0:2f825861a3a2 46 #define ERROR_LATENCY_DOOR (1L<<1)
rabad1 0:2f825861a3a2 47 #define ERROR_LATENCY_STOP (1L<<2)
rabad1 0:2f825861a3a2 48 #endif /* DEBUG */
rabad1 0:2f825861a3a2 49
rabad1 0:2f825861a3a2 50 // forward declarations
rabad1 0:2f825861a3a2 51 void init_microwave(void);
rabad1 0:2f825861a3a2 52 void press_left(void);
rabad1 0:2f825861a3a2 53 void press_right(void);
rabad1 0:2f825861a3a2 54 void press_start(void);
rabad1 0:2f825861a3a2 55 void press_stop(void);
rabad1 0:2f825861a3a2 56 void press_door(void);
rabad1 0:2f825861a3a2 57 void wdog_update(void);
rabad1 0:2f825861a3a2 58 void update_output(void);
rabad1 0:2f825861a3a2 59
rabad1 0:2f825861a3a2 60 void microwave_sm(void); // microwave state machine
rabad1 0:2f825861a3a2 61
rabad1 0:2f825861a3a2 62 // input peripherals
rabad1 0:2f825861a3a2 63 Keypad keypad( BUTTON_LEFT, press_left, // keypad
rabad1 0:2f825861a3a2 64 BUTTON_RIGHT, press_right,
rabad1 0:2f825861a3a2 65 BUTTON_START, press_start,
rabad1 0:2f825861a3a2 66 BUTTON_STOP, press_stop,
rabad1 0:2f825861a3a2 67 BUTTON_DOOR, press_door );
rabad1 1:fac01d40d819 68 LM75B tmp(TEMP_SDA,TEMP_SCL); // temperature sensor
rabad1 0:2f825861a3a2 69
rabad1 0:2f825861a3a2 70
rabad1 0:2f825861a3a2 71 // output peripherals
rabad1 0:2f825861a3a2 72 C12832_LCD lcd; // LCD screen
rabad1 0:2f825861a3a2 73 DigitalOut cooking_status(LED1); // LED for cooking progress
rabad1 0:2f825861a3a2 74 DigitalOut carousel_status(LED2); // LED for carousel
rabad1 0:2f825861a3a2 75 #ifdef DEBUG
rabad1 0:2f825861a3a2 76 DigitalOut debugLED(LED4); // general debug LED
rabad1 0:2f825861a3a2 77 #endif /* DEBUG */
rabad1 1:fac01d40d819 78 PwmOut alarm(ALARM); // alarm
rabad1 0:2f825861a3a2 79
rabad1 0:2f825861a3a2 80 // Timers
rabad1 0:2f825861a3a2 81 Ticker wdog; // 1sec watchdog
rabad1 0:2f825861a3a2 82 #ifdef DEBUG
rabad1 0:2f825861a3a2 83 Timer latency_wdog;
rabad1 0:2f825861a3a2 84 #endif /* DEBUG */
rabad1 0:2f825861a3a2 85
rabad1 0:2f825861a3a2 86 // global status variables
rabad1 0:2f825861a3a2 87 volatile signed short ssCookingTime;
rabad1 0:2f825861a3a2 88 unsigned char ucDoorStatus = DOOR_CLOSED;
rabad1 0:2f825861a3a2 89 float fTemp = 0.0f;
rabad1 0:2f825861a3a2 90 etSTATUS opStatus;
rabad1 0:2f825861a3a2 91 volatile unsigned char start_requested;
rabad1 0:2f825861a3a2 92 volatile unsigned char stop_requested;
rabad1 0:2f825861a3a2 93 volatile unsigned char temp_ticker;
rabad1 1:fac01d40d819 94 unsigned char reset_wdog;
rabad1 0:2f825861a3a2 95 #ifdef DEBUG
rabad1 0:2f825861a3a2 96 unsigned long ulErrorCode = 0UL;
rabad1 0:2f825861a3a2 97 #endif /* DEBUG */
rabad1 0:2f825861a3a2 98
rabad1 2:9f6bdaddefff 99 /* Name: main()
rabad1 2:9f6bdaddefff 100 * Desc: entry point of application. This will also invoke the microwave
rabad1 2:9f6bdaddefff 101 * state machine and update output
rabad1 2:9f6bdaddefff 102 * Inputs: none
rabad1 2:9f6bdaddefff 103 * Outputs: none
rabad1 2:9f6bdaddefff 104 */
rabad1 0:2f825861a3a2 105 int main()
rabad1 0:2f825861a3a2 106 {
rabad1 1:fac01d40d819 107 unsigned int while_loop_counter = 0;
rabad1 0:2f825861a3a2 108
rabad1 0:2f825861a3a2 109 init_microwave();
rabad1 0:2f825861a3a2 110
rabad1 0:2f825861a3a2 111 while(1)
rabad1 0:2f825861a3a2 112 {
rabad1 0:2f825861a3a2 113 while_loop_counter++;
rabad1 0:2f825861a3a2 114
rabad1 0:2f825861a3a2 115 microwave_sm(); // execute state machine
rabad1 0:2f825861a3a2 116
rabad1 0:2f825861a3a2 117 // do not need to update LCD as often
rabad1 1:fac01d40d819 118 if ( while_loop_counter & 0x4000 )
rabad1 0:2f825861a3a2 119 {
rabad1 0:2f825861a3a2 120 update_output();
rabad1 0:2f825861a3a2 121 }
rabad1 0:2f825861a3a2 122 }
rabad1 0:2f825861a3a2 123 }
rabad1 0:2f825861a3a2 124
rabad1 2:9f6bdaddefff 125 /* Name: init_microwave()
rabad1 2:9f6bdaddefff 126 * Desc: initializes the microwave state machine to STATUS_IDLE
rabad1 2:9f6bdaddefff 127 * Inputs: none
rabad1 2:9f6bdaddefff 128 * Outputs: none
rabad1 2:9f6bdaddefff 129 */
rabad1 0:2f825861a3a2 130 void init_microwave(void)
rabad1 0:2f825861a3a2 131 {
rabad1 0:2f825861a3a2 132 ssCookingTime = 0L;
rabad1 0:2f825861a3a2 133 cooking_status = LED_OFF;
rabad1 0:2f825861a3a2 134 carousel_status = LED_OFF;
rabad1 0:2f825861a3a2 135 opStatus = STATUS_IDLE;
rabad1 0:2f825861a3a2 136 start_requested = FALSE;
rabad1 0:2f825861a3a2 137 stop_requested = FALSE;
rabad1 1:fac01d40d819 138 reset_wdog = FALSE;
rabad1 0:2f825861a3a2 139 }
rabad1 0:2f825861a3a2 140
rabad1 2:9f6bdaddefff 141 /* Name: press_left()
rabad1 2:9f6bdaddefff 142 * Desc: ISR callback function for left button.
rabad1 2:9f6bdaddefff 143 * Inputs: none
rabad1 2:9f6bdaddefff 144 * Outputs: none
rabad1 2:9f6bdaddefff 145 */
rabad1 0:2f825861a3a2 146 void press_left(void)
rabad1 0:2f825861a3a2 147 {
rabad1 0:2f825861a3a2 148 if ( opStatus == STATUS_DONE )
rabad1 0:2f825861a3a2 149 {
rabad1 0:2f825861a3a2 150 return;
rabad1 0:2f825861a3a2 151 }
rabad1 0:2f825861a3a2 152 ssCookingTime += COOKING_TIME_INCREMENT;
rabad1 0:2f825861a3a2 153 if ( ssCookingTime >= MAX_COOKING_TIME )
rabad1 0:2f825861a3a2 154 {
rabad1 0:2f825861a3a2 155 ssCookingTime = MAX_COOKING_TIME;
rabad1 0:2f825861a3a2 156 }
rabad1 0:2f825861a3a2 157 }
rabad1 0:2f825861a3a2 158
rabad1 2:9f6bdaddefff 159 /* Name: press_right()
rabad1 2:9f6bdaddefff 160 * Desc: ISR callback function for right button.
rabad1 2:9f6bdaddefff 161 * Inputs: none
rabad1 2:9f6bdaddefff 162 * Outputs: none
rabad1 2:9f6bdaddefff 163 */
rabad1 0:2f825861a3a2 164 void press_right(void)
rabad1 0:2f825861a3a2 165 {
rabad1 0:2f825861a3a2 166 if ( opStatus != STATUS_IDLE )
rabad1 0:2f825861a3a2 167 {
rabad1 0:2f825861a3a2 168 return;
rabad1 0:2f825861a3a2 169 }
rabad1 0:2f825861a3a2 170 ssCookingTime -= COOKING_TIME_INCREMENT;
rabad1 0:2f825861a3a2 171 if ( ssCookingTime <= MIN_COOKING_TIME )
rabad1 0:2f825861a3a2 172 {
rabad1 0:2f825861a3a2 173 ssCookingTime = MIN_COOKING_TIME;
rabad1 0:2f825861a3a2 174 }
rabad1 0:2f825861a3a2 175 }
rabad1 0:2f825861a3a2 176
rabad1 2:9f6bdaddefff 177 /* Name: press_start()
rabad1 2:9f6bdaddefff 178 * Desc: ISR callback function for start button.
rabad1 2:9f6bdaddefff 179 * Inputs: none
rabad1 2:9f6bdaddefff 180 * Outputs: none
rabad1 2:9f6bdaddefff 181 */
rabad1 0:2f825861a3a2 182 void press_start(void)
rabad1 0:2f825861a3a2 183 {
rabad1 0:2f825861a3a2 184 if ( opStatus != STATUS_IDLE )
rabad1 0:2f825861a3a2 185 {
rabad1 0:2f825861a3a2 186 return;
rabad1 0:2f825861a3a2 187 }
rabad1 0:2f825861a3a2 188
rabad1 0:2f825861a3a2 189 if ( ssCookingTime && (ucDoorStatus == DOOR_CLOSED) )
rabad1 0:2f825861a3a2 190 {
rabad1 0:2f825861a3a2 191 start_requested = TRUE;
rabad1 0:2f825861a3a2 192 }
rabad1 0:2f825861a3a2 193 }
rabad1 0:2f825861a3a2 194
rabad1 2:9f6bdaddefff 195 /* Name: press_stop()
rabad1 2:9f6bdaddefff 196 * Desc: ISR callback function for stop button.
rabad1 2:9f6bdaddefff 197 * Inputs: none
rabad1 2:9f6bdaddefff 198 * Outputs: none
rabad1 2:9f6bdaddefff 199 */
rabad1 0:2f825861a3a2 200 void press_stop(void)
rabad1 0:2f825861a3a2 201 {
rabad1 0:2f825861a3a2 202 if ( opStatus == STATUS_IDLE )
rabad1 0:2f825861a3a2 203 {
rabad1 0:2f825861a3a2 204 init_microwave();
rabad1 0:2f825861a3a2 205 return;
rabad1 0:2f825861a3a2 206 }
rabad1 0:2f825861a3a2 207 else
rabad1 0:2f825861a3a2 208 {
rabad1 0:2f825861a3a2 209 #ifdef DEBUG
rabad1 0:2f825861a3a2 210 latency_wdog.start();
rabad1 0:2f825861a3a2 211 #endif
rabad1 0:2f825861a3a2 212 stop_requested = TRUE;
rabad1 0:2f825861a3a2 213 }
rabad1 0:2f825861a3a2 214 }
rabad1 0:2f825861a3a2 215
rabad1 2:9f6bdaddefff 216 /* Name: press_door()
rabad1 2:9f6bdaddefff 217 * Desc: ISR callback function for door button.
rabad1 2:9f6bdaddefff 218 * Inputs: none
rabad1 2:9f6bdaddefff 219 * Outputs: none
rabad1 2:9f6bdaddefff 220 */
rabad1 0:2f825861a3a2 221 void press_door(void)
rabad1 0:2f825861a3a2 222 {
rabad1 0:2f825861a3a2 223 ucDoorStatus = !ucDoorStatus;
rabad1 0:2f825861a3a2 224 if ( opStatus == STATUS_COOKING )
rabad1 0:2f825861a3a2 225 {
rabad1 0:2f825861a3a2 226 #ifdef DEBUG
rabad1 0:2f825861a3a2 227 latency_wdog.start();
rabad1 0:2f825861a3a2 228 #endif
rabad1 0:2f825861a3a2 229 }
rabad1 0:2f825861a3a2 230 }
rabad1 0:2f825861a3a2 231
rabad1 2:9f6bdaddefff 232 /* Name: wdog_update()
rabad1 2:9f6bdaddefff 233 * Desc: callback function for watchdog timer. This watchog updates the
rabad1 2:9f6bdaddefff 234 * cooking time when the microwave is running (STATUS_COOKING).
rabad1 2:9f6bdaddefff 235 * Inputs: none
rabad1 2:9f6bdaddefff 236 * Outputs: none
rabad1 2:9f6bdaddefff 237 */
rabad1 0:2f825861a3a2 238 void wdog_update(void)
rabad1 0:2f825861a3a2 239 {
rabad1 0:2f825861a3a2 240 if ( opStatus == STATUS_COOKING )
rabad1 0:2f825861a3a2 241 {
rabad1 0:2f825861a3a2 242 ssCookingTime--;
rabad1 0:2f825861a3a2 243
rabad1 0:2f825861a3a2 244 // reset wdog
rabad1 0:2f825861a3a2 245 if ( ssCookingTime )
rabad1 0:2f825861a3a2 246 {
rabad1 1:fac01d40d819 247 reset_wdog = TRUE;
rabad1 0:2f825861a3a2 248 }
rabad1 0:2f825861a3a2 249
rabad1 0:2f825861a3a2 250 if ( temp_ticker )
rabad1 0:2f825861a3a2 251 {
rabad1 0:2f825861a3a2 252 temp_ticker--;
rabad1 0:2f825861a3a2 253 }
rabad1 0:2f825861a3a2 254 }
rabad1 0:2f825861a3a2 255 }
rabad1 0:2f825861a3a2 256
rabad1 2:9f6bdaddefff 257 /* Name: microwave_sm()
rabad1 2:9f6bdaddefff 258 * Desc: This is the microwave state machine. It processes all input and
rabad1 2:9f6bdaddefff 259 * updates all state variables.
rabad1 2:9f6bdaddefff 260 * Inputs: none
rabad1 2:9f6bdaddefff 261 * Outputs: none
rabad1 2:9f6bdaddefff 262 */
rabad1 0:2f825861a3a2 263 void microwave_sm(void)
rabad1 0:2f825861a3a2 264 {
rabad1 0:2f825861a3a2 265 switch ( opStatus )
rabad1 0:2f825861a3a2 266 {
rabad1 0:2f825861a3a2 267 case STATUS_IDLE:
rabad1 0:2f825861a3a2 268 if ( ssCookingTime && !ucDoorStatus && start_requested )
rabad1 0:2f825861a3a2 269 {
rabad1 1:fac01d40d819 270 fTemp = tmp.read();
rabad1 0:2f825861a3a2 271 start_requested = FALSE;
rabad1 0:2f825861a3a2 272 wdog.attach(wdog_update, 1);
rabad1 0:2f825861a3a2 273 temp_ticker = (ssCookingTime > MAX_TICKER_TIME) ? MAX_TICKER_TIME : ssCookingTime;
rabad1 0:2f825861a3a2 274 opStatus = STATUS_COOKING;
rabad1 0:2f825861a3a2 275 }
rabad1 0:2f825861a3a2 276 break;
rabad1 0:2f825861a3a2 277
rabad1 0:2f825861a3a2 278 case STATUS_COOKING:
rabad1 0:2f825861a3a2 279 if ( ucDoorStatus == DOOR_OPEN )
rabad1 0:2f825861a3a2 280 {
rabad1 0:2f825861a3a2 281 #ifdef DEBUG
rabad1 0:2f825861a3a2 282 if (latency_wdog.read_ms() > MAX_LATENCY)
rabad1 0:2f825861a3a2 283 {
rabad1 0:2f825861a3a2 284 ulErrorCode |= ERROR_LATENCY_DOOR;
rabad1 0:2f825861a3a2 285 }
rabad1 0:2f825861a3a2 286 latency_wdog.stop();
rabad1 0:2f825861a3a2 287 #endif /* DEBUG */
rabad1 0:2f825861a3a2 288 init_microwave();
rabad1 0:2f825861a3a2 289 }
rabad1 0:2f825861a3a2 290 else if ( stop_requested )
rabad1 0:2f825861a3a2 291 {
rabad1 0:2f825861a3a2 292 #ifdef DEBUG
rabad1 0:2f825861a3a2 293 if (latency_wdog.read_ms() > MAX_LATENCY)
rabad1 0:2f825861a3a2 294 {
rabad1 0:2f825861a3a2 295 ulErrorCode |= ERROR_LATENCY_STOP;
rabad1 0:2f825861a3a2 296 }
rabad1 0:2f825861a3a2 297 latency_wdog.stop();
rabad1 0:2f825861a3a2 298 #endif /* DEBUG */
rabad1 0:2f825861a3a2 299 init_microwave();
rabad1 0:2f825861a3a2 300 }
rabad1 0:2f825861a3a2 301 else
rabad1 0:2f825861a3a2 302 {
rabad1 0:2f825861a3a2 303 if ( !ssCookingTime )
rabad1 0:2f825861a3a2 304 {
rabad1 0:2f825861a3a2 305 opStatus = STATUS_DONE;
rabad1 0:2f825861a3a2 306 }
rabad1 1:fac01d40d819 307 if ( !temp_ticker )
rabad1 0:2f825861a3a2 308 {
rabad1 0:2f825861a3a2 309 fTemp += TEMP_INCREMENT;
rabad1 0:2f825861a3a2 310 temp_ticker = (ssCookingTime > MAX_TICKER_TIME) ? MAX_TICKER_TIME : ssCookingTime;
rabad1 0:2f825861a3a2 311 }
rabad1 1:fac01d40d819 312 if ( reset_wdog )
rabad1 1:fac01d40d819 313 {
rabad1 1:fac01d40d819 314 wdog.attach(wdog_update, 1);
rabad1 1:fac01d40d819 315 reset_wdog = FALSE;
rabad1 1:fac01d40d819 316 }
rabad1 0:2f825861a3a2 317 }
rabad1 0:2f825861a3a2 318 break;
rabad1 0:2f825861a3a2 319
rabad1 0:2f825861a3a2 320 case STATUS_DONE:
rabad1 0:2f825861a3a2 321 if ( ucDoorStatus == DOOR_OPEN || stop_requested )
rabad1 0:2f825861a3a2 322 {
rabad1 0:2f825861a3a2 323 init_microwave();
rabad1 0:2f825861a3a2 324 }
rabad1 0:2f825861a3a2 325 break;
rabad1 0:2f825861a3a2 326
rabad1 0:2f825861a3a2 327 default:
rabad1 0:2f825861a3a2 328 #ifdef DEBUG
rabad1 0:2f825861a3a2 329 // something is wrong if we got here!
rabad1 0:2f825861a3a2 330 ulErrorCode |= ERROR_MICROWAVE_SM;
rabad1 0:2f825861a3a2 331 #endif /* DEBUG */
rabad1 0:2f825861a3a2 332 break;
rabad1 0:2f825861a3a2 333 }
rabad1 0:2f825861a3a2 334 }
rabad1 0:2f825861a3a2 335
rabad1 2:9f6bdaddefff 336 /* Name: update_output()
rabad1 2:9f6bdaddefff 337 * Desc: Updates all output based on status variables.
rabad1 2:9f6bdaddefff 338 * Inputs: none
rabad1 2:9f6bdaddefff 339 * Outputs: none
rabad1 2:9f6bdaddefff 340 */
rabad1 0:2f825861a3a2 341 void update_output(void)
rabad1 0:2f825861a3a2 342 {
rabad1 0:2f825861a3a2 343 static unsigned char toggle_alarm = 0;
rabad1 1:fac01d40d819 344 static unsigned char toggle_leds = 0;
rabad1 0:2f825861a3a2 345 static etSTATUS previousState = (etSTATUS) 0xFF;
rabad1 0:2f825861a3a2 346
rabad1 0:2f825861a3a2 347 // clear the screen only when we transition states to prevent flicker
rabad1 0:2f825861a3a2 348 if ( previousState != opStatus )
rabad1 0:2f825861a3a2 349 {
rabad1 0:2f825861a3a2 350 lcd.cls();
rabad1 0:2f825861a3a2 351 previousState = opStatus;
rabad1 0:2f825861a3a2 352 }
rabad1 0:2f825861a3a2 353 lcd.locate(0,0);
rabad1 0:2f825861a3a2 354 lcd.printf("Cooking Time: %3d secs\n",ssCookingTime);
rabad1 0:2f825861a3a2 355
rabad1 0:2f825861a3a2 356 switch ( opStatus )
rabad1 0:2f825861a3a2 357 {
rabad1 0:2f825861a3a2 358 case STATUS_IDLE:
rabad1 0:2f825861a3a2 359 // alarm should be off in this state
rabad1 0:2f825861a3a2 360 toggle_alarm = 0;
rabad1 0:2f825861a3a2 361 alarm = 0.0;
rabad1 0:2f825861a3a2 362 break;
rabad1 0:2f825861a3a2 363
rabad1 0:2f825861a3a2 364 case STATUS_COOKING:
rabad1 0:2f825861a3a2 365 // display temp
rabad1 0:2f825861a3a2 366 lcd.locate(0,10);
rabad1 0:2f825861a3a2 367 lcd.printf("Temp: %.2f degC\n", fTemp);
rabad1 0:2f825861a3a2 368
rabad1 0:2f825861a3a2 369 // update LEDs
rabad1 1:fac01d40d819 370 toggle_leds++;
rabad1 1:fac01d40d819 371 if ( toggle_leds & 0x10 )
rabad1 1:fac01d40d819 372 {
rabad1 1:fac01d40d819 373 cooking_status = !cooking_status;
rabad1 1:fac01d40d819 374 carousel_status = !carousel_status;
rabad1 1:fac01d40d819 375 }
rabad1 0:2f825861a3a2 376
rabad1 0:2f825861a3a2 377 // alarm should be off in this state
rabad1 0:2f825861a3a2 378 toggle_alarm = 0;
rabad1 0:2f825861a3a2 379 alarm = 0.0;
rabad1 0:2f825861a3a2 380 break;
rabad1 0:2f825861a3a2 381
rabad1 0:2f825861a3a2 382 case STATUS_DONE:
rabad1 0:2f825861a3a2 383 // LEDs off in this state
rabad1 0:2f825861a3a2 384 cooking_status = LED_OFF;
rabad1 0:2f825861a3a2 385 carousel_status = LED_OFF;
rabad1 0:2f825861a3a2 386
rabad1 0:2f825861a3a2 387 // sound alarm
rabad1 0:2f825861a3a2 388 toggle_alarm++;
rabad1 1:fac01d40d819 389 if ( toggle_alarm & 0x10 )
rabad1 0:2f825861a3a2 390 {
rabad1 0:2f825861a3a2 391 alarm.period(1.0/5000);
rabad1 0:2f825861a3a2 392 alarm = 0.5;
rabad1 0:2f825861a3a2 393 }
rabad1 0:2f825861a3a2 394 else
rabad1 0:2f825861a3a2 395 {
rabad1 0:2f825861a3a2 396 alarm = 0.0;
rabad1 0:2f825861a3a2 397 }
rabad1 0:2f825861a3a2 398
rabad1 0:2f825861a3a2 399 lcd.locate(0,10);
rabad1 0:2f825861a3a2 400 lcd.printf("ENJOY YOUR MEAL!\n");
rabad1 0:2f825861a3a2 401 break;
rabad1 0:2f825861a3a2 402 }
rabad1 0:2f825861a3a2 403 lcd.locate(0,23);
rabad1 0:2f825861a3a2 404 lcd.printf("door %s\n", ucDoorStatus ? "open " : "closed");
rabad1 0:2f825861a3a2 405 #ifdef DEBUG
rabad1 0:2f825861a3a2 406 lcd.locate(95,23);
rabad1 0:2f825861a3a2 407 lcd.printf("0x%04X\n", ulErrorCode);
rabad1 0:2f825861a3a2 408 #endif /* DEBUG */
rabad1 0:2f825861a3a2 409 }