Smart Garage monitor and control system
Dependencies: mbed HBridge MQ7 Ton SimpleScheduler Pir_sensor
main.cpp@5:00c71adb66e9, 2021-03-19 (annotated)
- Committer:
- pkunnals
- Date:
- Fri Mar 19 19:23:20 2021 +0000
- Revision:
- 5:00c71adb66e9
- Parent:
- 4:ae0a21e468bb
Smart Garage Monitor and control system
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pkunnals | 4:ae0a21e468bb | 1 | #include "mbed.h" |
agaikwad | 3:164296bb4985 | 2 | #include "math.h" |
pkunnals | 4:ae0a21e468bb | 3 | #include "Pir_sensor.h" |
pkunnals | 4:ae0a21e468bb | 4 | #include "MQ7.h" |
agaikwad | 3:164296bb4985 | 5 | #include <string> |
pkunnals | 4:ae0a21e468bb | 6 | #include "SimpleScheduler.h" |
pkunnals | 4:ae0a21e468bb | 7 | #include "ESP8266.h" |
pkunnals | 4:ae0a21e468bb | 8 | #include "Thingspeak.h" |
pkunnals | 4:ae0a21e468bb | 9 | #include "HBridge.h" |
pkunnals | 4:ae0a21e468bb | 10 | #include "Ton.h" |
pkunnals | 4:ae0a21e468bb | 11 | |
pkunnals | 4:ae0a21e468bb | 12 | #define TIMER_PERIODICITY (1) /* 1 second */ |
pkunnals | 4:ae0a21e468bb | 13 | #define SCHEDULER_TASK_PERIODICITY (500) /* 500ms */ |
pkunnals | 4:ae0a21e468bb | 14 | #define GARAGE_LIGHT_TURN_OFF_DELAY (10) |
pkunnals | 4:ae0a21e468bb | 15 | |
pkunnals | 4:ae0a21e468bb | 16 | Ton t1(15000); // Timer ON delay of 15 seconds. |
pkunnals | 4:ae0a21e468bb | 17 | Ton t2(15000); // Timer ON delay of 15 seconds. |
agaikwad | 3:164296bb4985 | 18 | |
pkunnals | 4:ae0a21e468bb | 19 | Serial PC(USBTX, USBRX); |
pkunnals | 4:ae0a21e468bb | 20 | /* pir senor input */ |
pkunnals | 4:ae0a21e468bb | 21 | Pir_sensor PIR(D2); |
pkunnals | 4:ae0a21e468bb | 22 | /* Garage lamp output */ |
pkunnals | 4:ae0a21e468bb | 23 | DigitalOut Garage_Lamp_Status(D7); |
pkunnals | 4:ae0a21e468bb | 24 | /* Garage CO sensor output */ |
pkunnals | 4:ae0a21e468bb | 25 | MQ7 CO_Sensor(A0,D3); |
pkunnals | 4:ae0a21e468bb | 26 | DigitalOut PIR_DetectionLight(LED2); |
pkunnals | 4:ae0a21e468bb | 27 | HBridge Motor(D5,D6,D4); |
agaikwad | 3:164296bb4985 | 28 | |
pkunnals | 4:ae0a21e468bb | 29 | Ticker ticker; |
pkunnals | 4:ae0a21e468bb | 30 | SimpleScheduler *scheduler; |
pkunnals | 4:ae0a21e468bb | 31 | |
pkunnals | 4:ae0a21e468bb | 32 | typedef enum { |
SIT2016 | 1:2012c31aee1b | 33 | |
pkunnals | 4:ae0a21e468bb | 34 | DOOR_IS_OPEN = 1, |
pkunnals | 4:ae0a21e468bb | 35 | DOOR_IS_CLOSED = 2, |
pkunnals | 4:ae0a21e468bb | 36 | DOOR_IS_SAFE_OPEN = 3, |
pkunnals | 4:ae0a21e468bb | 37 | } eDoor_Status_t; |
pkunnals | 4:ae0a21e468bb | 38 | |
pkunnals | 4:ae0a21e468bb | 39 | |
pkunnals | 4:ae0a21e468bb | 40 | typedef enum { |
SIT2016 | 1:2012c31aee1b | 41 | |
pkunnals | 4:ae0a21e468bb | 42 | MOVEMENT_DETECTED = 1, |
pkunnals | 4:ae0a21e468bb | 43 | NO_MOVEMENT_DETECTED = 2, |
pkunnals | 4:ae0a21e468bb | 44 | } ePIR_Status_t; |
SIT2016 | 1:2012c31aee1b | 45 | |
pkunnals | 4:ae0a21e468bb | 46 | typedef enum { |
pkunnals | 4:ae0a21e468bb | 47 | |
pkunnals | 4:ae0a21e468bb | 48 | OPEN_DOOR = 1, |
pkunnals | 4:ae0a21e468bb | 49 | CLOSE_DOOR = 2, |
pkunnals | 4:ae0a21e468bb | 50 | SAFE_OPEN_DOOR = 3, |
pkunnals | 4:ae0a21e468bb | 51 | } eDoor_Command_t; |
SIT2016 | 1:2012c31aee1b | 52 | |
pkunnals | 4:ae0a21e468bb | 53 | eDoor_Status_t doorStatus = DOOR_IS_CLOSED; |
pkunnals | 4:ae0a21e468bb | 54 | eDoor_Command_t doorControl = CLOSE_DOOR; |
pkunnals | 4:ae0a21e468bb | 55 | eDoor_Command_t prevDoorControl = CLOSE_DOOR; |
pkunnals | 4:ae0a21e468bb | 56 | char garage_light_delay_counter = 0; |
pkunnals | 4:ae0a21e468bb | 57 | ePIR_Status_t PIR_Status = NO_MOVEMENT_DETECTED; |
pkunnals | 4:ae0a21e468bb | 58 | int CO_Level = 1; |
pkunnals | 4:ae0a21e468bb | 59 | /*! |
pkunnals | 4:ae0a21e468bb | 60 | * Periodic Timer Interrupt controlling garage lights |
pkunnals | 4:ae0a21e468bb | 61 | * |
pkunnals | 4:ae0a21e468bb | 62 | * ============================================================================= |
pkunnals | 4:ae0a21e468bb | 63 | */ |
pkunnals | 4:ae0a21e468bb | 64 | void Periodic_Interrupt ( void ) |
pkunnals | 4:ae0a21e468bb | 65 | { |
pkunnals | 4:ae0a21e468bb | 66 | if ( garage_light_delay_counter > 0 ) |
pkunnals | 4:ae0a21e468bb | 67 | { |
pkunnals | 4:ae0a21e468bb | 68 | garage_light_delay_counter--; |
pkunnals | 4:ae0a21e468bb | 69 | } |
pkunnals | 4:ae0a21e468bb | 70 | else |
pkunnals | 4:ae0a21e468bb | 71 | { |
pkunnals | 4:ae0a21e468bb | 72 | if ( DOOR_IS_CLOSED == doorStatus ) |
pkunnals | 4:ae0a21e468bb | 73 | { |
pkunnals | 4:ae0a21e468bb | 74 | Garage_Lamp_Status = 0; |
pkunnals | 4:ae0a21e468bb | 75 | } |
pkunnals | 4:ae0a21e468bb | 76 | |
pkunnals | 4:ae0a21e468bb | 77 | PIR_Status = NO_MOVEMENT_DETECTED; |
pkunnals | 4:ae0a21e468bb | 78 | } |
pkunnals | 4:ae0a21e468bb | 79 | } |
SIT2016 | 1:2012c31aee1b | 80 | |
pkunnals | 4:ae0a21e468bb | 81 | /*! |
pkunnals | 4:ae0a21e468bb | 82 | * Function used monitor and control door status, CO level and garage lights |
pkunnals | 4:ae0a21e468bb | 83 | * |
pkunnals | 4:ae0a21e468bb | 84 | * ============================================================================= |
pkunnals | 4:ae0a21e468bb | 85 | */ |
pkunnals | 4:ae0a21e468bb | 86 | void Garage_Monitor_Runnable ( void ) |
agaikwad | 3:164296bb4985 | 87 | { |
pkunnals | 4:ae0a21e468bb | 88 | /* Development In Progress */ |
pkunnals | 4:ae0a21e468bb | 89 | if( PIR.read() ) |
pkunnals | 4:ae0a21e468bb | 90 | { |
pkunnals | 4:ae0a21e468bb | 91 | PIR_DetectionLight = 0; |
pkunnals | 4:ae0a21e468bb | 92 | Garage_Lamp_Status = 1; |
pkunnals | 4:ae0a21e468bb | 93 | PC.printf("\n\r*** MOTION DETECTED *** \n\r"); |
pkunnals | 4:ae0a21e468bb | 94 | PIR_Status = MOVEMENT_DETECTED; |
pkunnals | 4:ae0a21e468bb | 95 | PC.printf("\r\n*** GARAGE LIGHT IS ON *** \r\n"); |
pkunnals | 4:ae0a21e468bb | 96 | garage_light_delay_counter = GARAGE_LIGHT_TURN_OFF_DELAY; |
pkunnals | 4:ae0a21e468bb | 97 | } |
pkunnals | 4:ae0a21e468bb | 98 | else |
pkunnals | 4:ae0a21e468bb | 99 | { |
pkunnals | 4:ae0a21e468bb | 100 | if ( PIR_DetectionLight == 0 ) |
pkunnals | 4:ae0a21e468bb | 101 | { |
pkunnals | 4:ae0a21e468bb | 102 | PC.printf("\n\r*** NO MOTION DETECTED *** \n\r"); |
pkunnals | 4:ae0a21e468bb | 103 | } |
pkunnals | 4:ae0a21e468bb | 104 | PIR_DetectionLight = 1; |
pkunnals | 4:ae0a21e468bb | 105 | } |
agaikwad | 3:164296bb4985 | 106 | |
pkunnals | 4:ae0a21e468bb | 107 | CO_Level = CO_Sensor.get_CO_value (); |
pkunnals | 4:ae0a21e468bb | 108 | if ( CO_Level == 1 ) |
pkunnals | 4:ae0a21e468bb | 109 | { |
pkunnals | 4:ae0a21e468bb | 110 | PC.printf("\r\n*** GARAGE CO LEVEL IS SAFE/LOW *** \r\n"); |
pkunnals | 4:ae0a21e468bb | 111 | } |
pkunnals | 4:ae0a21e468bb | 112 | else if ( CO_Level == 2 ) |
pkunnals | 4:ae0a21e468bb | 113 | { |
pkunnals | 4:ae0a21e468bb | 114 | PC.printf("\r\n*** WARNING!! GARAGE CO LEVEL IS MODERATE *** \r\n"); |
pkunnals | 4:ae0a21e468bb | 115 | } |
pkunnals | 4:ae0a21e468bb | 116 | else |
pkunnals | 4:ae0a21e468bb | 117 | { |
pkunnals | 4:ae0a21e468bb | 118 | PC.printf("\r\n*** DANGER!!! GARAGE CO LEVEL IS HIGH *** \r\n"); |
pkunnals | 4:ae0a21e468bb | 119 | } |
pkunnals | 4:ae0a21e468bb | 120 | PC.printf("\n\r=========================================================================\n\r"); |
pkunnals | 4:ae0a21e468bb | 121 | PC.printf("\n\rGarage Door Status = %d \n\rGarage CO Level = %d\n\rPIR Status = %d \n\r", (int)doorStatus, CO_Level, (int)PIR_Status); |
pkunnals | 4:ae0a21e468bb | 122 | PC.printf("\n\r=========================================================================\n\r"); |
agaikwad | 3:164296bb4985 | 123 | |
pkunnals | 4:ae0a21e468bb | 124 | if ( t2 ) |
pkunnals | 4:ae0a21e468bb | 125 | { |
pkunnals | 4:ae0a21e468bb | 126 | /* Send garage status to Thingspeak channel */ |
pkunnals | 4:ae0a21e468bb | 127 | Send_to_Thingspeak ( (int)doorStatus, CO_Level, (int)PIR_Status ) ; |
pkunnals | 4:ae0a21e468bb | 128 | t2 = Ton::Off; |
pkunnals | 4:ae0a21e468bb | 129 | t2.reset(); |
pkunnals | 4:ae0a21e468bb | 130 | t1 = Ton::On; |
agaikwad | 3:164296bb4985 | 131 | } |
SIT2016 | 2:817794b2f733 | 132 | } |
SIT2016 | 2:817794b2f733 | 133 | |
pkunnals | 4:ae0a21e468bb | 134 | void Garage_Door_Control_Runnable( void ) |
pkunnals | 4:ae0a21e468bb | 135 | { |
pkunnals | 4:ae0a21e468bb | 136 | |
pkunnals | 4:ae0a21e468bb | 137 | if ( t1 ) |
pkunnals | 4:ae0a21e468bb | 138 | { |
pkunnals | 4:ae0a21e468bb | 139 | // This code will be executed once the timer times out. |
pkunnals | 4:ae0a21e468bb | 140 | doorControl = ( eDoor_Command_t ) Read_from_Thingspeak(); |
pkunnals | 4:ae0a21e468bb | 141 | PC.printf("\r\n Door Command received from Thingspeak = %d \r\n", doorControl); |
pkunnals | 4:ae0a21e468bb | 142 | t1 = Ton::Off; |
pkunnals | 4:ae0a21e468bb | 143 | t1.reset(); |
pkunnals | 4:ae0a21e468bb | 144 | t2 = Ton::On; |
pkunnals | 4:ae0a21e468bb | 145 | } |
pkunnals | 4:ae0a21e468bb | 146 | if ( ( CO_Level > 1 ) && ( prevDoorControl != OPEN_DOOR ) ) |
pkunnals | 4:ae0a21e468bb | 147 | { |
pkunnals | 4:ae0a21e468bb | 148 | doorControl = SAFE_OPEN_DOOR; |
pkunnals | 4:ae0a21e468bb | 149 | } |
pkunnals | 4:ae0a21e468bb | 150 | if ( ( doorControl == OPEN_DOOR ) && ( prevDoorControl != OPEN_DOOR ) ) |
pkunnals | 4:ae0a21e468bb | 151 | { |
pkunnals | 4:ae0a21e468bb | 152 | Garage_Lamp_Status = 1; |
pkunnals | 4:ae0a21e468bb | 153 | garage_light_delay_counter = GARAGE_LIGHT_TURN_OFF_DELAY; |
pkunnals | 4:ae0a21e468bb | 154 | PC.printf("\r\n*** GARAGE LIGHT IS TURNED ON *** \r\n"); |
pkunnals | 4:ae0a21e468bb | 155 | Motor.forward (); |
pkunnals | 4:ae0a21e468bb | 156 | if ( doorStatus == DOOR_IS_CLOSED ) |
pkunnals | 4:ae0a21e468bb | 157 | { |
pkunnals | 4:ae0a21e468bb | 158 | wait(8); |
pkunnals | 4:ae0a21e468bb | 159 | } |
pkunnals | 4:ae0a21e468bb | 160 | else if ( doorStatus == DOOR_IS_SAFE_OPEN ) |
pkunnals | 4:ae0a21e468bb | 161 | { |
pkunnals | 4:ae0a21e468bb | 162 | wait(6); |
pkunnals | 4:ae0a21e468bb | 163 | } |
pkunnals | 4:ae0a21e468bb | 164 | Motor.stop (); |
pkunnals | 4:ae0a21e468bb | 165 | doorStatus = DOOR_IS_OPEN; |
pkunnals | 4:ae0a21e468bb | 166 | PC.printf("\r\n*** DOOR IS OPEN ***\r\n"); |
pkunnals | 4:ae0a21e468bb | 167 | } |
pkunnals | 4:ae0a21e468bb | 168 | else if ( ( doorControl == SAFE_OPEN_DOOR ) && ( prevDoorControl == CLOSE_DOOR ) ) |
pkunnals | 4:ae0a21e468bb | 169 | { |
pkunnals | 4:ae0a21e468bb | 170 | Garage_Lamp_Status = 1; |
pkunnals | 4:ae0a21e468bb | 171 | garage_light_delay_counter = GARAGE_LIGHT_TURN_OFF_DELAY; |
pkunnals | 4:ae0a21e468bb | 172 | PC.printf("\r\n*** GARAGE LIGHT IS TURNED ON *** \r\n"); |
pkunnals | 4:ae0a21e468bb | 173 | Motor.forward (); |
pkunnals | 4:ae0a21e468bb | 174 | wait(2); |
pkunnals | 4:ae0a21e468bb | 175 | Motor.stop (); |
pkunnals | 4:ae0a21e468bb | 176 | doorStatus = DOOR_IS_SAFE_OPEN; |
pkunnals | 4:ae0a21e468bb | 177 | PC.printf("\r\n*** DOOR IS SAFETY OPEN ***\r\n"); |
pkunnals | 4:ae0a21e468bb | 178 | } |
pkunnals | 4:ae0a21e468bb | 179 | else if ( ( doorControl == CLOSE_DOOR ) && ( prevDoorControl != CLOSE_DOOR ) ) |
pkunnals | 4:ae0a21e468bb | 180 | { |
pkunnals | 4:ae0a21e468bb | 181 | Garage_Lamp_Status = 1; |
pkunnals | 4:ae0a21e468bb | 182 | garage_light_delay_counter = GARAGE_LIGHT_TURN_OFF_DELAY; |
pkunnals | 4:ae0a21e468bb | 183 | PC.printf("\r\n*** GARAGE LIGHT IS TURNED ON *** \r\n"); |
pkunnals | 4:ae0a21e468bb | 184 | Motor.backward (); |
pkunnals | 4:ae0a21e468bb | 185 | if ( doorStatus == DOOR_IS_OPEN ) |
pkunnals | 4:ae0a21e468bb | 186 | { |
pkunnals | 4:ae0a21e468bb | 187 | wait(9); |
pkunnals | 4:ae0a21e468bb | 188 | } |
pkunnals | 4:ae0a21e468bb | 189 | else if ( doorStatus == DOOR_IS_SAFE_OPEN ) |
pkunnals | 4:ae0a21e468bb | 190 | { |
pkunnals | 4:ae0a21e468bb | 191 | wait(2); |
pkunnals | 4:ae0a21e468bb | 192 | } |
pkunnals | 4:ae0a21e468bb | 193 | Motor.stop (); |
pkunnals | 4:ae0a21e468bb | 194 | PC.printf("\r\n*** DOOR IS CLOSED *** \r\n"); |
pkunnals | 4:ae0a21e468bb | 195 | doorStatus = DOOR_IS_CLOSED; |
pkunnals | 4:ae0a21e468bb | 196 | } |
pkunnals | 4:ae0a21e468bb | 197 | else |
pkunnals | 4:ae0a21e468bb | 198 | { |
pkunnals | 4:ae0a21e468bb | 199 | |
pkunnals | 4:ae0a21e468bb | 200 | } |
pkunnals | 4:ae0a21e468bb | 201 | prevDoorControl = doorControl; |
agaikwad | 3:164296bb4985 | 202 | } |
agaikwad | 3:164296bb4985 | 203 | |
pkunnals | 4:ae0a21e468bb | 204 | void Task_500ms_Runnable(SimpleTask *task) { |
pkunnals | 4:ae0a21e468bb | 205 | |
pkunnals | 4:ae0a21e468bb | 206 | Garage_Door_Control_Runnable (); |
agaikwad | 3:164296bb4985 | 207 | |
pkunnals | 4:ae0a21e468bb | 208 | Garage_Monitor_Runnable (); |
pkunnals | 4:ae0a21e468bb | 209 | } |
pkunnals | 4:ae0a21e468bb | 210 | |
pkunnals | 4:ae0a21e468bb | 211 | /*! |
pkunnals | 4:ae0a21e468bb | 212 | * Main function, user application starts from here. |
pkunnals | 4:ae0a21e468bb | 213 | * |
pkunnals | 4:ae0a21e468bb | 214 | * ============================================================================= |
pkunnals | 4:ae0a21e468bb | 215 | */ |
pkunnals | 4:ae0a21e468bb | 216 | int main ( void ) |
pkunnals | 4:ae0a21e468bb | 217 | { |
pkunnals | 4:ae0a21e468bb | 218 | /* Baud rate used for communicating with Tera-term on PC */ |
pkunnals | 4:ae0a21e468bb | 219 | PC.baud(115200); |
pkunnals | 4:ae0a21e468bb | 220 | PC.printf("\n\r\n\r"); |
pkunnals | 4:ae0a21e468bb | 221 | PC.printf(" ###### ## ## ###### ##### ######## #### ###### ##### ###### #### ######## ###### ## ## ###### ######## ######## ## ##\n\r"); |
pkunnals | 4:ae0a21e468bb | 222 | PC.printf("## ## ### ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ###\n\r"); |
pkunnals | 4:ae0a21e468bb | 223 | PC.printf("## #### #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ## ## #### ####\n\r"); |
pkunnals | 4:ae0a21e468bb | 224 | PC.printf(" ###### ## ### ## ######## ## ### ## ## ### ######## ## ### ######## ## ### ###### ###### ## ###### ## ###### ## ### ##\n\r"); |
pkunnals | 4:ae0a21e468bb | 225 | PC.printf(" ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##\n\r"); |
pkunnals | 4:ae0a21e468bb | 226 | PC.printf("## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##\n\r"); |
pkunnals | 4:ae0a21e468bb | 227 | PC.printf(" ###### ## ## ## ## ## ## ## #### ## ## ## ## ## ## #### ######## ###### ## ###### ## ######## ## ##\n\r"); |
pkunnals | 4:ae0a21e468bb | 228 | PC.printf("-----------------------------------------------------------------------------------------\n\r"); |
pkunnals | 4:ae0a21e468bb | 229 | PC.printf("Developed By: Priyanka Kunnal Siddalingappa\n\r"); |
pkunnals | 4:ae0a21e468bb | 230 | PC.printf("-----------------------------------------------------------------------------------------\n\r\n\r"); |
agaikwad | 3:164296bb4985 | 231 | |
pkunnals | 4:ae0a21e468bb | 232 | PC.printf("\n\n\rInitial ESP...\n\n\r"); |
pkunnals | 4:ae0a21e468bb | 233 | /* Initialize ESP wifi module */ |
pkunnals | 4:ae0a21e468bb | 234 | Esp8266_Init(); |
agaikwad | 3:164296bb4985 | 235 | |
pkunnals | 4:ae0a21e468bb | 236 | doorStatus = DOOR_IS_CLOSED; |
pkunnals | 4:ae0a21e468bb | 237 | doorControl = CLOSE_DOOR; |
pkunnals | 4:ae0a21e468bb | 238 | prevDoorControl = CLOSE_DOOR; |
pkunnals | 4:ae0a21e468bb | 239 | PIR_Status = NO_MOVEMENT_DETECTED; |
pkunnals | 4:ae0a21e468bb | 240 | garage_light_delay_counter = 0; |
pkunnals | 4:ae0a21e468bb | 241 | if (!t1.isRunning()) |
agaikwad | 3:164296bb4985 | 242 | { |
pkunnals | 4:ae0a21e468bb | 243 | t1 = Ton::On; |
pkunnals | 4:ae0a21e468bb | 244 | doorControl = ( eDoor_Command_t ) Read_from_Thingspeak(); |
agaikwad | 3:164296bb4985 | 245 | } |
SIT2016 | 1:2012c31aee1b | 246 | |
pkunnals | 4:ae0a21e468bb | 247 | PC.printf("\n\n\rStarting Periodic Interrupt...\n\n\r"); |
pkunnals | 4:ae0a21e468bb | 248 | /* Trigger the interrupt periodically */ |
pkunnals | 4:ae0a21e468bb | 249 | ticker.attach(Periodic_Interrupt, TIMER_PERIODICITY); |
agaikwad | 3:164296bb4985 | 250 | |
pkunnals | 4:ae0a21e468bb | 251 | PC.printf("\n\n\rStarting Scheduler...\n\n\r"); |
pkunnals | 4:ae0a21e468bb | 252 | scheduler = new SimpleScheduler; |
pkunnals | 4:ae0a21e468bb | 253 | scheduler |
pkunnals | 4:ae0a21e468bb | 254 | ->addTask( new SimpleTask(SCHEDULER_TASK_PERIODICITY, Task_500ms_Runnable) ) |
pkunnals | 4:ae0a21e468bb | 255 | ; |
pkunnals | 4:ae0a21e468bb | 256 | scheduler->run(); |
pkunnals | 4:ae0a21e468bb | 257 | |
pkunnals | 4:ae0a21e468bb | 258 | /*! |
pkunnals | 4:ae0a21e468bb | 259 | * Wait forever |
pkunnals | 4:ae0a21e468bb | 260 | * ======================== |
pkunnals | 4:ae0a21e468bb | 261 | */ |
pkunnals | 4:ae0a21e468bb | 262 | while (1) |
pkunnals | 4:ae0a21e468bb | 263 | { |
pkunnals | 4:ae0a21e468bb | 264 | ; |
agaikwad | 3:164296bb4985 | 265 | } |
SIT2016 | 1:2012c31aee1b | 266 | } |