MicrowaveSimulation_LPC1768
Dependencies: C12832_lcd DebounceInterrupts LM75B mbed-rtos mbed
main.cpp@0:ca76ec016be0, 2014-03-17 (annotated)
- Committer:
- joinamruta
- Date:
- Mon Mar 17 19:27:11 2014 +0000
- Revision:
- 0:ca76ec016be0
Microwave Simulation on LPC1768 mbed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
joinamruta | 0:ca76ec016be0 | 1 | /******************************************************************************** |
joinamruta | 0:ca76ec016be0 | 2 | * Program to implement a microwave. A RTOS program to simulate a microwave * |
joinamruta | 0:ca76ec016be0 | 3 | * which has the following user features: * |
joinamruta | 0:ca76ec016be0 | 4 | * i) Left and right buttons to raise/lower the cook time in 1 minute increments * |
joinamruta | 0:ca76ec016be0 | 5 | * ii) Top and bottom buttons to start/stop the microwave * |
joinamruta | 0:ca76ec016be0 | 6 | * iii) Middle button to open/close the door * |
joinamruta | 0:ca76ec016be0 | 7 | * iv) Temperature sensor to show the inside temperature * |
joinamruta | 0:ca76ec016be0 | 8 | * v) LCD output to show: * |
joinamruta | 0:ca76ec016be0 | 9 | * (1) Requested cook time * |
joinamruta | 0:ca76ec016be0 | 10 | * (2) Elapsed cook time (max 3 minutes) * |
joinamruta | 0:ca76ec016be0 | 11 | * (3) Temperature (goes up each minute by 10(?) degrees, starting with room) * |
joinamruta | 0:ca76ec016be0 | 12 | * vi) LED to show: * |
joinamruta | 0:ca76ec016be0 | 13 | * (1) One LED blinking to show cooking in progress * |
joinamruta | 0:ca76ec016be0 | 14 | * vii) Short audio sound: * |
joinamruta | 0:ca76ec016be0 | 15 | * (1) To indicate cooking done * |
joinamruta | 0:ca76ec016be0 | 16 | * Timing requirements: * |
joinamruta | 0:ca76ec016be0 | 17 | * 1. Cooking must stop within 1ms of door opening or stop button * |
joinamruta | 0:ca76ec016be0 | 18 | * 2. Temperature sensor must be polled once every 10 seconds * |
joinamruta | 0:ca76ec016be0 | 19 | * 3. Cooking time must have a 3 min max with a default of 2 min * |
joinamruta | 0:ca76ec016be0 | 20 | * * |
joinamruta | 0:ca76ec016be0 | 21 | * Test cases: * |
joinamruta | 0:ca76ec016be0 | 22 | * The following test cases are done using black box approach. If DEBUG is * |
joinamruta | 0:ca76ec016be0 | 23 | * enabled, some white box testing can be performed * |
joinamruta | 0:ca76ec016be0 | 24 | * * |
joinamruta | 0:ca76ec016be0 | 25 | * Test conditon Pass/Fail criteria Pass/Fail * |
joinamruta | 0:ca76ec016be0 | 26 | * =============================== ============================ ========= * |
joinamruta | 0:ca76ec016be0 | 27 | * 1)Push Joystick's LEFT Button Riase set cook time by 1 minute PASS * |
joinamruta | 0:ca76ec016be0 | 28 | * (max 3 mins) * |
joinamruta | 0:ca76ec016be0 | 29 | * 2)Push Joystick's RIGHT Button Lower set cook time by 1 minute PASS * |
joinamruta | 0:ca76ec016be0 | 30 | * (min 1 min) * |
joinamruta | 0:ca76ec016be0 | 31 | * 3)Push Joystick's UP Button Start microwave cooking IFF PASS * |
joinamruta | 0:ca76ec016be0 | 32 | * door is closed * |
joinamruta | 0:ca76ec016be0 | 33 | * 4)Push Joystick's DOWN Button Stop microwave cooking if PASS * |
joinamruta | 0:ca76ec016be0 | 34 | * cooking was going on. * |
joinamruta | 0:ca76ec016be0 | 35 | * 5)Push Joystick's MIDDLE Button Toggle between open and close PASS * |
joinamruta | 0:ca76ec016be0 | 36 | * door positions. * |
joinamruta | 0:ca76ec016be0 | 37 | * LED4 turns on if door open PASS * |
joinamruta | 0:ca76ec016be0 | 38 | * LED4 turns off if door closed PASS * |
joinamruta | 0:ca76ec016be0 | 39 | * 5.1)If door opened while cooking Suspend cooking immediately PASS * |
joinamruta | 0:ca76ec016be0 | 40 | * was on * |
joinamruta | 0:ca76ec016be0 | 41 | * (Debounce handled for all joystick buttons) * |
joinamruta | 0:ca76ec016be0 | 42 | * 6)While cooking session on LED1 blinks PASS * |
joinamruta | 0:ca76ec016be0 | 43 | * (STARTED State) LCD 1)shows elapsed cook time PASS * |
joinamruta | 0:ca76ec016be0 | 44 | * 2)shows set cook time PASS * |
joinamruta | 0:ca76ec016be0 | 45 | * 3)shows temperature(up by 10 PASS * |
joinamruta | 0:ca76ec016be0 | 46 | * deg F each minute of cooking) * |
joinamruta | 0:ca76ec016be0 | 47 | * Elapsed cook time is checked PASS * |
joinamruta | 0:ca76ec016be0 | 48 | * against set cook time to check when * |
joinamruta | 0:ca76ec016be0 | 49 | * cooking will complete.(COMPLETED STATE) * |
joinamruta | 0:ca76ec016be0 | 50 | * 7)When cooking suspended Elapsed cook time suspended PASS * |
joinamruta | 0:ca76ec016be0 | 51 | * (SUSPENDED State) either LED1 stops blinking PASS * |
joinamruta | 0:ca76ec016be0 | 52 | * due to stop button or door * |
joinamruta | 0:ca76ec016be0 | 53 | * open button * |
joinamruta | 0:ca76ec016be0 | 54 | * 8)Elapsed cook time equals Cooking session COMPLETED STATE PASS * |
joinamruta | 0:ca76ec016be0 | 55 | * set cook time LED1 stops blinking PASS * |
joinamruta | 0:ca76ec016be0 | 56 | * speaker sounds PASS * |
joinamruta | 0:ca76ec016be0 | 57 | * * |
joinamruta | 0:ca76ec016be0 | 58 | *********************************************************************************/ |
joinamruta | 0:ca76ec016be0 | 59 | |
joinamruta | 0:ca76ec016be0 | 60 | #include "mbed.h" |
joinamruta | 0:ca76ec016be0 | 61 | #include "LM75B.h" |
joinamruta | 0:ca76ec016be0 | 62 | #include "C12832_lcd.h" |
joinamruta | 0:ca76ec016be0 | 63 | #include "rtos.h" |
joinamruta | 0:ca76ec016be0 | 64 | #include "DebouncedIn.h" |
joinamruta | 0:ca76ec016be0 | 65 | #include "DebouncedInterrupt.h" |
joinamruta | 0:ca76ec016be0 | 66 | #include "Serial.h" |
joinamruta | 0:ca76ec016be0 | 67 | #include "LM75B.h" |
joinamruta | 0:ca76ec016be0 | 68 | |
joinamruta | 0:ca76ec016be0 | 69 | |
joinamruta | 0:ca76ec016be0 | 70 | /*default set cook time , 2 minutes*/ |
joinamruta | 0:ca76ec016be0 | 71 | #define DEFAULTCOOKTIME 120 |
joinamruta | 0:ca76ec016be0 | 72 | |
joinamruta | 0:ca76ec016be0 | 73 | /*for door positions*/ |
joinamruta | 0:ca76ec016be0 | 74 | #define OPEN 1 |
joinamruta | 0:ca76ec016be0 | 75 | #define CLOSE 0 |
joinamruta | 0:ca76ec016be0 | 76 | |
joinamruta | 0:ca76ec016be0 | 77 | /*to indicate in what state a cooking session is*/ |
joinamruta | 0:ca76ec016be0 | 78 | #define STARTED 1 |
joinamruta | 0:ca76ec016be0 | 79 | #define COMPLETED 0 |
joinamruta | 0:ca76ec016be0 | 80 | #define SUSPENDED 2 |
joinamruta | 0:ca76ec016be0 | 81 | |
joinamruta | 0:ca76ec016be0 | 82 | /*to test proper functioning*/ |
joinamruta | 0:ca76ec016be0 | 83 | #define DEBUG |
joinamruta | 0:ca76ec016be0 | 84 | #ifdef DEBUG |
joinamruta | 0:ca76ec016be0 | 85 | Serial pc(USBTX, USBRX); |
joinamruta | 0:ca76ec016be0 | 86 | #endif |
joinamruta | 0:ca76ec016be0 | 87 | |
joinamruta | 0:ca76ec016be0 | 88 | /*function declarations*/ |
joinamruta | 0:ca76ec016be0 | 89 | void open_door(); |
joinamruta | 0:ca76ec016be0 | 90 | void time_up(); |
joinamruta | 0:ca76ec016be0 | 91 | void time_down(); |
joinamruta | 0:ca76ec016be0 | 92 | void LED_blink (void const *args); |
joinamruta | 0:ca76ec016be0 | 93 | void inside_temperatureLED_blink (void const *args); |
joinamruta | 0:ca76ec016be0 | 94 | void sound_speaker (void const *args); |
joinamruta | 0:ca76ec016be0 | 95 | void start_cooking (); |
joinamruta | 0:ca76ec016be0 | 96 | void stop_cooking (); |
joinamruta | 0:ca76ec016be0 | 97 | void update_lcd(void const *args); |
joinamruta | 0:ca76ec016be0 | 98 | void check_ellapsed_cook_time (void const *args); |
joinamruta | 0:ca76ec016be0 | 99 | void suspendCooking(void const *args); |
joinamruta | 0:ca76ec016be0 | 100 | |
joinamruta | 0:ca76ec016be0 | 101 | DebouncedInterrupt increase_time(p13); |
joinamruta | 0:ca76ec016be0 | 102 | DebouncedInterrupt decrease_time(p16); |
joinamruta | 0:ca76ec016be0 | 103 | DebouncedInterrupt start (p12); |
joinamruta | 0:ca76ec016be0 | 104 | DebouncedInterrupt stop(p15); |
joinamruta | 0:ca76ec016be0 | 105 | DebouncedInterrupt door_status(p14); |
joinamruta | 0:ca76ec016be0 | 106 | C12832_LCD lcd; |
joinamruta | 0:ca76ec016be0 | 107 | DigitalOut cook_progress(LED1); |
joinamruta | 0:ca76ec016be0 | 108 | DigitalOut door_signal(LED4); //This LED will be 1 if door is open |
joinamruta | 0:ca76ec016be0 | 109 | DigitalOut done_cooking(LED2); |
joinamruta | 0:ca76ec016be0 | 110 | PwmOut speaker(p26); |
joinamruta | 0:ca76ec016be0 | 111 | LM75B tmp(p28,p27); |
joinamruta | 0:ca76ec016be0 | 112 | |
joinamruta | 0:ca76ec016be0 | 113 | /*set cook time, time for which the cooking should be done*/ |
joinamruta | 0:ca76ec016be0 | 114 | int requested_cook_time = DEFAULTCOOKTIME; |
joinamruta | 0:ca76ec016be0 | 115 | |
joinamruta | 0:ca76ec016be0 | 116 | /*keep track if door is closed or open CLOSE :0 OPEN:1*/ |
joinamruta | 0:ca76ec016be0 | 117 | bool door_position = CLOSE; |
joinamruta | 0:ca76ec016be0 | 118 | |
joinamruta | 0:ca76ec016be0 | 119 | /*cooking has been suspended or not, either due to opening of door |
joinamruta | 0:ca76ec016be0 | 120 | or stop button pressing while the cooking was going on*/ |
joinamruta | 0:ca76ec016be0 | 121 | bool suspended_cooking_flag = false; |
joinamruta | 0:ca76ec016be0 | 122 | |
joinamruta | 0:ca76ec016be0 | 123 | /*inside temp is room temperature*/ |
joinamruta | 0:ca76ec016be0 | 124 | float ctemperature; |
joinamruta | 0:ca76ec016be0 | 125 | float temperature; |
joinamruta | 0:ca76ec016be0 | 126 | int count = 0; |
joinamruta | 0:ca76ec016be0 | 127 | |
joinamruta | 0:ca76ec016be0 | 128 | /*to indicate whether a particular cooking session has been started |
joinamruta | 0:ca76ec016be0 | 129 | or completed.*/ |
joinamruta | 0:ca76ec016be0 | 130 | int a_cooking_session = COMPLETED; |
joinamruta | 0:ca76ec016be0 | 131 | Timer ellapsed_cook_timer; |
joinamruta | 0:ca76ec016be0 | 132 | Ticker LED_Blink_timer; |
joinamruta | 0:ca76ec016be0 | 133 | Ticker get_temperature; |
joinamruta | 0:ca76ec016be0 | 134 | |
joinamruta | 0:ca76ec016be0 | 135 | |
joinamruta | 0:ca76ec016be0 | 136 | /*Open and close door button interrupt service routine*/ |
joinamruta | 0:ca76ec016be0 | 137 | void open_door() |
joinamruta | 0:ca76ec016be0 | 138 | { |
joinamruta | 0:ca76ec016be0 | 139 | /*allow interrupt action to take place only if suspend_cooking |
joinamruta | 0:ca76ec016be0 | 140 | action was completed*/ |
joinamruta | 0:ca76ec016be0 | 141 | if (suspended_cooking_flag == false) { |
joinamruta | 0:ca76ec016be0 | 142 | //toggle door_position |
joinamruta | 0:ca76ec016be0 | 143 | door_position = !door_position; |
joinamruta | 0:ca76ec016be0 | 144 | if (door_position == OPEN) { |
joinamruta | 0:ca76ec016be0 | 145 | door_signal = 1; |
joinamruta | 0:ca76ec016be0 | 146 | /*if door was opened while cooking was going on |
joinamruta | 0:ca76ec016be0 | 147 | then suspend cooking immediately*/ |
joinamruta | 0:ca76ec016be0 | 148 | if (a_cooking_session == STARTED) { |
joinamruta | 0:ca76ec016be0 | 149 | suspended_cooking_flag = true; |
joinamruta | 0:ca76ec016be0 | 150 | a_cooking_session = SUSPENDED; |
joinamruta | 0:ca76ec016be0 | 151 | } |
joinamruta | 0:ca76ec016be0 | 152 | } else { |
joinamruta | 0:ca76ec016be0 | 153 | door_signal = 0; |
joinamruta | 0:ca76ec016be0 | 154 | } |
joinamruta | 0:ca76ec016be0 | 155 | } |
joinamruta | 0:ca76ec016be0 | 156 | } |
joinamruta | 0:ca76ec016be0 | 157 | |
joinamruta | 0:ca76ec016be0 | 158 | /*Raise cook time button interrupt service routine, |
joinamruta | 0:ca76ec016be0 | 159 | raises the cook time by 1 minute increaments |
joinamruta | 0:ca76ec016be0 | 160 | */ |
joinamruta | 0:ca76ec016be0 | 161 | void time_up() |
joinamruta | 0:ca76ec016be0 | 162 | { |
joinamruta | 0:ca76ec016be0 | 163 | if (requested_cook_time < 180) |
joinamruta | 0:ca76ec016be0 | 164 | /*increment cooking time by 1 minute = 60 sec,max = 180 secs.*/ |
joinamruta | 0:ca76ec016be0 | 165 | requested_cook_time = requested_cook_time + 60; |
joinamruta | 0:ca76ec016be0 | 166 | else |
joinamruta | 0:ca76ec016be0 | 167 | requested_cook_time = 180; |
joinamruta | 0:ca76ec016be0 | 168 | } |
joinamruta | 0:ca76ec016be0 | 169 | |
joinamruta | 0:ca76ec016be0 | 170 | |
joinamruta | 0:ca76ec016be0 | 171 | /*lower cook time button interrupt service routine, |
joinamruta | 0:ca76ec016be0 | 172 | lowers cook time by 1 minute decreaments |
joinamruta | 0:ca76ec016be0 | 173 | */ |
joinamruta | 0:ca76ec016be0 | 174 | void time_down() |
joinamruta | 0:ca76ec016be0 | 175 | { |
joinamruta | 0:ca76ec016be0 | 176 | if (requested_cook_time > 60) |
joinamruta | 0:ca76ec016be0 | 177 | /*decrement cooking time by 1 minute = 60 sec*/ |
joinamruta | 0:ca76ec016be0 | 178 | requested_cook_time = requested_cook_time - 60; |
joinamruta | 0:ca76ec016be0 | 179 | else |
joinamruta | 0:ca76ec016be0 | 180 | requested_cook_time = 60; |
joinamruta | 0:ca76ec016be0 | 181 | |
joinamruta | 0:ca76ec016be0 | 182 | } |
joinamruta | 0:ca76ec016be0 | 183 | |
joinamruta | 0:ca76ec016be0 | 184 | /*blink led ticker handler routine.Led blinks at interval |
joinamruta | 0:ca76ec016be0 | 185 | of 0.250ms while cooking is going on. |
joinamruta | 0:ca76ec016be0 | 186 | */ |
joinamruta | 0:ca76ec016be0 | 187 | void LED_blink () |
joinamruta | 0:ca76ec016be0 | 188 | { |
joinamruta | 0:ca76ec016be0 | 189 | cook_progress= !cook_progress; |
joinamruta | 0:ca76ec016be0 | 190 | } |
joinamruta | 0:ca76ec016be0 | 191 | |
joinamruta | 0:ca76ec016be0 | 192 | /*temperature ticker handler routine to read inside temperature every 10 secs. |
joinamruta | 0:ca76ec016be0 | 193 | */ |
joinamruta | 0:ca76ec016be0 | 194 | void inside_temperature () |
joinamruta | 0:ca76ec016be0 | 195 | { |
joinamruta | 0:ca76ec016be0 | 196 | ctemperature = (1.8)*tmp.read()+32; |
joinamruta | 0:ca76ec016be0 | 197 | /*to make the temperature displayed on lcd to go up by 10 deg F every minute*/ |
joinamruta | 0:ca76ec016be0 | 198 | if (count < 7) { |
joinamruta | 0:ca76ec016be0 | 199 | count = count +1; |
joinamruta | 0:ca76ec016be0 | 200 | if (count == 6) { |
joinamruta | 0:ca76ec016be0 | 201 | temperature = temperature + 10; |
joinamruta | 0:ca76ec016be0 | 202 | count = 0; |
joinamruta | 0:ca76ec016be0 | 203 | } |
joinamruta | 0:ca76ec016be0 | 204 | } |
joinamruta | 0:ca76ec016be0 | 205 | } |
joinamruta | 0:ca76ec016be0 | 206 | |
joinamruta | 0:ca76ec016be0 | 207 | /*start cooking button interrupt service routine. |
joinamruta | 0:ca76ec016be0 | 208 | */ |
joinamruta | 0:ca76ec016be0 | 209 | void start_cooking () |
joinamruta | 0:ca76ec016be0 | 210 | { |
joinamruta | 0:ca76ec016be0 | 211 | if (door_position == CLOSE) { |
joinamruta | 0:ca76ec016be0 | 212 | if (a_cooking_session != STARTED) { |
joinamruta | 0:ca76ec016be0 | 213 | if (a_cooking_session == COMPLETED) { |
joinamruta | 0:ca76ec016be0 | 214 | a_cooking_session = STARTED;//a fresh cooking session has started |
joinamruta | 0:ca76ec016be0 | 215 | temperature = (1.8)*tmp.read()+32;//starting at room temperature |
joinamruta | 0:ca76ec016be0 | 216 | } |
joinamruta | 0:ca76ec016be0 | 217 | if (a_cooking_session == SUSPENDED) |
joinamruta | 0:ca76ec016be0 | 218 | a_cooking_session = STARTED;//a suspended session restarted |
joinamruta | 0:ca76ec016be0 | 219 | ellapsed_cook_timer.start(); |
joinamruta | 0:ca76ec016be0 | 220 | get_temperature.attach(&inside_temperature, 10.0); //read temperature every 10sec |
joinamruta | 0:ca76ec016be0 | 221 | LED_Blink_timer.attach(&LED_blink,0.250); |
joinamruta | 0:ca76ec016be0 | 222 | } |
joinamruta | 0:ca76ec016be0 | 223 | } |
joinamruta | 0:ca76ec016be0 | 224 | } |
joinamruta | 0:ca76ec016be0 | 225 | |
joinamruta | 0:ca76ec016be0 | 226 | /*stop cooking button interrupt service routine. |
joinamruta | 0:ca76ec016be0 | 227 | */ |
joinamruta | 0:ca76ec016be0 | 228 | void stop_cooking () |
joinamruta | 0:ca76ec016be0 | 229 | { |
joinamruta | 0:ca76ec016be0 | 230 | if (a_cooking_session == STARTED) { |
joinamruta | 0:ca76ec016be0 | 231 | a_cooking_session = SUSPENDED; |
joinamruta | 0:ca76ec016be0 | 232 | ellapsed_cook_timer.stop(); |
joinamruta | 0:ca76ec016be0 | 233 | get_temperature.detach(); |
joinamruta | 0:ca76ec016be0 | 234 | LED_Blink_timer.detach(); |
joinamruta | 0:ca76ec016be0 | 235 | cook_progress = 0; |
joinamruta | 0:ca76ec016be0 | 236 | |
joinamruta | 0:ca76ec016be0 | 237 | } |
joinamruta | 0:ca76ec016be0 | 238 | } |
joinamruta | 0:ca76ec016be0 | 239 | |
joinamruta | 0:ca76ec016be0 | 240 | |
joinamruta | 0:ca76ec016be0 | 241 | /*function that sounds the speaker once cooking is completed. |
joinamruta | 0:ca76ec016be0 | 242 | */ |
joinamruta | 0:ca76ec016be0 | 243 | void start_speaker() |
joinamruta | 0:ca76ec016be0 | 244 | { |
joinamruta | 0:ca76ec016be0 | 245 | speaker.period(1.0/5000); |
joinamruta | 0:ca76ec016be0 | 246 | while(door_position != OPEN && a_cooking_session == COMPLETED) { |
joinamruta | 0:ca76ec016be0 | 247 | speaker = 0.5; |
joinamruta | 0:ca76ec016be0 | 248 | wait(0.1); |
joinamruta | 0:ca76ec016be0 | 249 | speaker = 0.0; |
joinamruta | 0:ca76ec016be0 | 250 | wait(0.1); |
joinamruta | 0:ca76ec016be0 | 251 | } |
joinamruta | 0:ca76ec016be0 | 252 | speaker = 0.0; |
joinamruta | 0:ca76ec016be0 | 253 | } |
joinamruta | 0:ca76ec016be0 | 254 | |
joinamruta | 0:ca76ec016be0 | 255 | |
joinamruta | 0:ca76ec016be0 | 256 | /*Thread that displays/updates the : |
joinamruta | 0:ca76ec016be0 | 257 | (1) Requested cook time |
joinamruta | 0:ca76ec016be0 | 258 | (2) Elapsed cook time (max 3 minutes) |
joinamruta | 0:ca76ec016be0 | 259 | (3) Temperature (goes up each minute by 10 degrees(F), starting with room) |
joinamruta | 0:ca76ec016be0 | 260 | */ |
joinamruta | 0:ca76ec016be0 | 261 | void update_lcd(void const *args) |
joinamruta | 0:ca76ec016be0 | 262 | { |
joinamruta | 0:ca76ec016be0 | 263 | lcd.cls(); |
joinamruta | 0:ca76ec016be0 | 264 | while(true) { |
joinamruta | 0:ca76ec016be0 | 265 | lcd.locate(0,0); |
joinamruta | 0:ca76ec016be0 | 266 | lcd.printf("Elapsed time : %0.2f sec",ellapsed_cook_timer.read()); |
joinamruta | 0:ca76ec016be0 | 267 | lcd.locate(0, 8); |
joinamruta | 0:ca76ec016be0 | 268 | lcd.printf("Set cook time : %d min",requested_cook_time/60); |
joinamruta | 0:ca76ec016be0 | 269 | lcd.locate(0, 16); |
joinamruta | 0:ca76ec016be0 | 270 | lcd.printf("Temperature : %0.2f deg F", temperature); |
joinamruta | 0:ca76ec016be0 | 271 | Thread::wait (1000); |
joinamruta | 0:ca76ec016be0 | 272 | } |
joinamruta | 0:ca76ec016be0 | 273 | } |
joinamruta | 0:ca76ec016be0 | 274 | |
joinamruta | 0:ca76ec016be0 | 275 | /*Thread that keeps track of how much time has elapsed |
joinamruta | 0:ca76ec016be0 | 276 | since cooking is going on(does not includes the time when cooking |
joinamruta | 0:ca76ec016be0 | 277 | suspended)in order to cook for requested amount of cook time |
joinamruta | 0:ca76ec016be0 | 278 | */ |
joinamruta | 0:ca76ec016be0 | 279 | void check_ellapsed_cook_time (void const *args) |
joinamruta | 0:ca76ec016be0 | 280 | { |
joinamruta | 0:ca76ec016be0 | 281 | Thread suspend_cooking(suspendCooking, NULL, osPriorityHigh); |
joinamruta | 0:ca76ec016be0 | 282 | #ifdef DEBUG |
joinamruta | 0:ca76ec016be0 | 283 | pc.printf("Created Thread suspend_cooking\r\n"); |
joinamruta | 0:ca76ec016be0 | 284 | #endif |
joinamruta | 0:ca76ec016be0 | 285 | while (true) { |
joinamruta | 0:ca76ec016be0 | 286 | if (suspended_cooking_flag == true) |
joinamruta | 0:ca76ec016be0 | 287 | suspend_cooking.signal_set(0x1);//IPC |
joinamruta | 0:ca76ec016be0 | 288 | else { |
joinamruta | 0:ca76ec016be0 | 289 | if (a_cooking_session == STARTED && (ellapsed_cook_timer.read() >= requested_cook_time) ) { |
joinamruta | 0:ca76ec016be0 | 290 | a_cooking_session = COMPLETED; |
joinamruta | 0:ca76ec016be0 | 291 | ellapsed_cook_timer.stop(); |
joinamruta | 0:ca76ec016be0 | 292 | ellapsed_cook_timer.reset(); |
joinamruta | 0:ca76ec016be0 | 293 | get_temperature.detach(); |
joinamruta | 0:ca76ec016be0 | 294 | LED_Blink_timer.detach(); |
joinamruta | 0:ca76ec016be0 | 295 | start_speaker(); |
joinamruta | 0:ca76ec016be0 | 296 | } |
joinamruta | 0:ca76ec016be0 | 297 | } |
joinamruta | 0:ca76ec016be0 | 298 | Thread::wait(500); |
joinamruta | 0:ca76ec016be0 | 299 | } |
joinamruta | 0:ca76ec016be0 | 300 | } |
joinamruta | 0:ca76ec016be0 | 301 | |
joinamruta | 0:ca76ec016be0 | 302 | /*Thread that wakes up(on a signal,an IPC mechanism) in order to |
joinamruta | 0:ca76ec016be0 | 303 | complete the remaining activities of stop/suspend cooking(action) |
joinamruta | 0:ca76ec016be0 | 304 | when microwave door was suddenly opened in the middle of cooking. |
joinamruta | 0:ca76ec016be0 | 305 | When the open door interrupt occurs while cooking was on |
joinamruta | 0:ca76ec016be0 | 306 | the corresponding interrupt service routine wakes this thread up |
joinamruta | 0:ca76ec016be0 | 307 | by sneding a signal to it. |
joinamruta | 0:ca76ec016be0 | 308 | */ |
joinamruta | 0:ca76ec016be0 | 309 | void suspendCooking (void const *args) |
joinamruta | 0:ca76ec016be0 | 310 | { |
joinamruta | 0:ca76ec016be0 | 311 | while (1) { |
joinamruta | 0:ca76ec016be0 | 312 | #ifdef DEBUG |
joinamruta | 0:ca76ec016be0 | 313 | pc.printf("suspend_cooking Thread waiting for signal\r\n"); |
joinamruta | 0:ca76ec016be0 | 314 | #endif |
joinamruta | 0:ca76ec016be0 | 315 | Thread::signal_wait(0x1); //IPC |
joinamruta | 0:ca76ec016be0 | 316 | #ifdef DEBUG |
joinamruta | 0:ca76ec016be0 | 317 | pc.printf("suspend_cooking Thread awakened by a siganl\r\n"); |
joinamruta | 0:ca76ec016be0 | 318 | #endif |
joinamruta | 0:ca76ec016be0 | 319 | ellapsed_cook_timer.stop(); |
joinamruta | 0:ca76ec016be0 | 320 | //cook_status = OFF; |
joinamruta | 0:ca76ec016be0 | 321 | get_temperature.detach(); |
joinamruta | 0:ca76ec016be0 | 322 | LED_Blink_timer.detach(); |
joinamruta | 0:ca76ec016be0 | 323 | cook_progress = 0; |
joinamruta | 0:ca76ec016be0 | 324 | suspended_cooking_flag = false; |
joinamruta | 0:ca76ec016be0 | 325 | } |
joinamruta | 0:ca76ec016be0 | 326 | } |
joinamruta | 0:ca76ec016be0 | 327 | |
joinamruta | 0:ca76ec016be0 | 328 | int main() |
joinamruta | 0:ca76ec016be0 | 329 | { |
joinamruta | 0:ca76ec016be0 | 330 | increase_time.attach(&time_up); |
joinamruta | 0:ca76ec016be0 | 331 | decrease_time.attach(&time_down); |
joinamruta | 0:ca76ec016be0 | 332 | start.attach(&start_cooking); |
joinamruta | 0:ca76ec016be0 | 333 | stop.attach(&stop_cooking); |
joinamruta | 0:ca76ec016be0 | 334 | door_status.attach(&open_door); |
joinamruta | 0:ca76ec016be0 | 335 | door_signal = door_position; |
joinamruta | 0:ca76ec016be0 | 336 | |
joinamruta | 0:ca76ec016be0 | 337 | #ifdef DEBUG |
joinamruta | 0:ca76ec016be0 | 338 | pc.printf("Attached all interrupt handlers\r\n"); |
joinamruta | 0:ca76ec016be0 | 339 | #endif |
joinamruta | 0:ca76ec016be0 | 340 | Thread lcd_display(update_lcd, NULL, osPriorityAboveNormal); |
joinamruta | 0:ca76ec016be0 | 341 | #ifdef DEBUG |
joinamruta | 0:ca76ec016be0 | 342 | pc.printf("Created Thread lcd_display\r\n"); |
joinamruta | 0:ca76ec016be0 | 343 | #endif |
joinamruta | 0:ca76ec016be0 | 344 | Thread track_ellapsed_cook_time(check_ellapsed_cook_time, NULL, osPriorityAboveNormal); |
joinamruta | 0:ca76ec016be0 | 345 | #ifdef DEBUG |
joinamruta | 0:ca76ec016be0 | 346 | pc.printf("Created Thread track_ellapsed_cook_time\r\n"); |
joinamruta | 0:ca76ec016be0 | 347 | #endif |
joinamruta | 0:ca76ec016be0 | 348 | |
joinamruta | 0:ca76ec016be0 | 349 | while (true) { |
joinamruta | 0:ca76ec016be0 | 350 | Thread::wait(1500); |
joinamruta | 0:ca76ec016be0 | 351 | } |
joinamruta | 0:ca76ec016be0 | 352 | } |