Alif Ahmed
/
Watchdog_sample_nocoverageLab6Part2
main.cpp@9:58491af42a2a, 2020-04-10 (annotated)
- Committer:
- alifsohen
- Date:
- Fri Apr 10 02:49:47 2020 +0000
- Revision:
- 9:58491af42a2a
- Parent:
- 8:e6403cb3582f
Lab 6 part 2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Manel_Marin | 0:5ce3cfc57999 | 1 | #include "mbed.h" |
WilliamMarshQMUL | 1:159a09ac60ba | 2 | #include "wdt.h" |
Manel_Marin | 0:5ce3cfc57999 | 3 | |
WilliamMarshQMUL | 2:c31a1758ac38 | 4 | // Sample program using the Watchdog |
WilliamMarshQMUL | 2:c31a1758ac38 | 5 | // --------------------------------- |
WilliamMarshQMUL | 3:32a940251192 | 6 | // * Three threads co-operate to flash two LEDs |
WilliamMarshQMUL | 3:32a940251192 | 7 | // * A simple way to inject a fault, by pressing a button |
alifsohen | 9:58491af42a2a | 8 | // * The watchdog is configured with a 1sec timeout |
WilliamMarshQMUL | 3:32a940251192 | 9 | |
WilliamMarshQMUL | 3:32a940251192 | 10 | #define ON 1 |
WilliamMarshQMUL | 3:32a940251192 | 11 | #define OFF 0 |
WilliamMarshQMUL | 3:32a940251192 | 12 | DigitalOut led_red(LED_RED, ON); |
alifsohen | 9:58491af42a2a | 13 | DigitalOut led_blue(LED_BLUE, ON); |
WilliamMarshQMUL | 3:32a940251192 | 14 | DigitalIn button(PTD0, PullUp); |
WilliamMarshQMUL | 3:32a940251192 | 15 | DigitalOut led1(PTC12, OFF); |
WilliamMarshQMUL | 3:32a940251192 | 16 | DigitalOut led2(PTC13, OFF); |
alifsohen | 9:58491af42a2a | 17 | AnalogIn ain(A0) ; // Analog input |
alifsohen | 9:58491af42a2a | 18 | EventQueue queue; // creates an event queue, to call read ADC |
WilliamMarshQMUL | 3:32a940251192 | 19 | |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 20 | Serial pc(USBTX, USBRX); // tx, rx, useful for debugging |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 21 | |
WilliamMarshQMUL | 3:32a940251192 | 22 | // This ticker is used to feed the watch dog |
WilliamMarshQMUL | 3:32a940251192 | 23 | Ticker tick; |
WilliamMarshQMUL | 3:32a940251192 | 24 | |
WilliamMarshQMUL | 3:32a940251192 | 25 | // Threads |
WilliamMarshQMUL | 3:32a940251192 | 26 | Thread threadT ; // timer thread |
WilliamMarshQMUL | 3:32a940251192 | 27 | Thread threadLED1 ; // thread LED1 |
WilliamMarshQMUL | 3:32a940251192 | 28 | Thread threadLED2 ; // thread LED2 |
WilliamMarshQMUL | 3:32a940251192 | 29 | |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 30 | # define ON1 0x01 |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 31 | # define ON2 0x02 |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 32 | # define OFF1 0x04 |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 33 | # define OFF2 0x08 |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 34 | EventFlags signals; // event flags for signalling |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 35 | |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 36 | |
WilliamMarshQMUL | 3:32a940251192 | 37 | // ------------Fault Injection Button------------- |
WilliamMarshQMUL | 3:32a940251192 | 38 | // Wait while the button is down |
WilliamMarshQMUL | 3:32a940251192 | 39 | // Use this to simulate a STUCK fault |
WilliamMarshQMUL | 3:32a940251192 | 40 | // ----------------------------------------------- |
WilliamMarshQMUL | 3:32a940251192 | 41 | void waitButton() { |
WilliamMarshQMUL | 3:32a940251192 | 42 | while (!button) ; |
WilliamMarshQMUL | 3:32a940251192 | 43 | } |
WilliamMarshQMUL | 2:c31a1758ac38 | 44 | |
alifsohen | 9:58491af42a2a | 45 | |
alifsohen | 9:58491af42a2a | 46 | // Write voltage digits |
alifsohen | 9:58491af42a2a | 47 | // v Voltage as scale int, e.g. 3.30 is 330 |
alifsohen | 9:58491af42a2a | 48 | void vToString(int v, char* s) { |
alifsohen | 9:58491af42a2a | 49 | s[3] = '0' + (v % 10) ; |
alifsohen | 9:58491af42a2a | 50 | v = v / 10 ; |
alifsohen | 9:58491af42a2a | 51 | s[2] = '0' + (v % 10) ; |
alifsohen | 9:58491af42a2a | 52 | v = v / 10 ; |
alifsohen | 9:58491af42a2a | 53 | s[0] = '0' + (v % 10) ; |
alifsohen | 9:58491af42a2a | 54 | } |
alifsohen | 9:58491af42a2a | 55 | |
WilliamMarshQMUL | 3:32a940251192 | 56 | // ---Thread for controlling LED 1---------------- |
WilliamMarshQMUL | 3:32a940251192 | 57 | // Turn LED1 on/off in response to signals |
WilliamMarshQMUL | 3:32a940251192 | 58 | // ----------------------------------------------- |
WilliamMarshQMUL | 3:32a940251192 | 59 | void led1_thread() { // method to run in thread |
alifsohen | 9:58491af42a2a | 60 | int volts = 0; |
alifsohen | 9:58491af42a2a | 61 | char vstring[] = "X.XX\r\n" ; |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 62 | int evt ; |
WilliamMarshQMUL | 3:32a940251192 | 63 | while (true) { |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 64 | evt = signals.wait_any(ON1 | OFF1); // wait for either signal |
alifsohen | 9:58491af42a2a | 65 | if (evt & ON1) { |
alifsohen | 9:58491af42a2a | 66 | led1 = ON ; |
alifsohen | 9:58491af42a2a | 67 | ThisThread::sleep_for(1) ; |
alifsohen | 9:58491af42a2a | 68 | // check if led is working |
alifsohen | 9:58491af42a2a | 69 | volts = ain.read_u16(); |
alifsohen | 9:58491af42a2a | 70 | vToString(volts, vstring) ; |
alifsohen | 9:58491af42a2a | 71 | if (volts > 100 && volts < 250) { |
alifsohen | 9:58491af42a2a | 72 | pc.printf(vstring) ; |
alifsohen | 9:58491af42a2a | 73 | while(true) { |
alifsohen | 9:58491af42a2a | 74 | led_blue = OFF; |
alifsohen | 9:58491af42a2a | 75 | } |
alifsohen | 9:58491af42a2a | 76 | wdt_kickA() ; |
alifsohen | 9:58491af42a2a | 77 | } else { |
alifsohen | 9:58491af42a2a | 78 | pc.printf(vstring) ; |
alifsohen | 9:58491af42a2a | 79 | led_red = OFF; |
alifsohen | 9:58491af42a2a | 80 | } |
alifsohen | 9:58491af42a2a | 81 | } |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 82 | if (evt & OFF1) led1 = OFF ; |
alifsohen | 9:58491af42a2a | 83 | |
alifsohen | 9:58491af42a2a | 84 | // waitButton() ; // POSSIBLE FAULT HERE |
alifsohen | 9:58491af42a2a | 85 | |
alifsohen | 8:e6403cb3582f | 86 | |
WilliamMarshQMUL | 3:32a940251192 | 87 | } |
WilliamMarshQMUL | 3:32a940251192 | 88 | } |
Manel_Marin | 0:5ce3cfc57999 | 89 | |
WilliamMarshQMUL | 3:32a940251192 | 90 | // ---Thread for controlling LED 2---------------- |
WilliamMarshQMUL | 3:32a940251192 | 91 | // Turn LED2 on/off in response to signals |
WilliamMarshQMUL | 3:32a940251192 | 92 | // ----------------------------------------------- |
WilliamMarshQMUL | 3:32a940251192 | 93 | void led2_thread() { // method to run in thread |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 94 | int evt ; |
WilliamMarshQMUL | 3:32a940251192 | 95 | while (true) { |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 96 | evt = signals.wait_any(ON2 | OFF2); // wait for any signal |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 97 | if (evt & ON2) led2 = ON ; |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 98 | if (evt & OFF2) led2 = OFF ; |
WilliamMarshQMUL | 3:32a940251192 | 99 | // waitButton() ; // POSSIBLE FAULT HERE |
alifsohen | 8:e6403cb3582f | 100 | wdt_kickB() ; |
WilliamMarshQMUL | 3:32a940251192 | 101 | } |
WilliamMarshQMUL | 3:32a940251192 | 102 | } |
Manel_Marin | 0:5ce3cfc57999 | 103 | |
WilliamMarshQMUL | 3:32a940251192 | 104 | // ---Thread for timing -------------------------- |
WilliamMarshQMUL | 3:32a940251192 | 105 | // Send signals to the other threads |
WilliamMarshQMUL | 3:32a940251192 | 106 | // ----------------------------------------------- |
WilliamMarshQMUL | 3:32a940251192 | 107 | void timer_thread() { // method to run in thread |
WilliamMarshQMUL | 3:32a940251192 | 108 | while (true) { |
WilliamMarshQMUL | 7:e49685bca7c7 | 109 | ThisThread::sleep_for(1000) ; |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 110 | signals.set(ON1 | ON2) ; |
WilliamMarshQMUL | 7:e49685bca7c7 | 111 | ThisThread::sleep_for(1000) ; |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 112 | signals.set(OFF1 | OFF2) ; |
alifsohen | 9:58491af42a2a | 113 | //waitButton() ; // POSSIBLE FAULT HERE |
WilliamMarshQMUL | 3:32a940251192 | 114 | } |
WilliamMarshQMUL | 3:32a940251192 | 115 | } |
WilliamMarshQMUL | 3:32a940251192 | 116 | |
alifsohen | 9:58491af42a2a | 117 | |
alifsohen | 9:58491af42a2a | 118 | |
alifsohen | 9:58491af42a2a | 119 | |
alifsohen | 9:58491af42a2a | 120 | |
alifsohen | 9:58491af42a2a | 121 | |
WilliamMarshQMUL | 3:32a940251192 | 122 | // -----------MAIN------------------------------- |
WilliamMarshQMUL | 3:32a940251192 | 123 | // Configure watchdog. Start threads. |
WilliamMarshQMUL | 3:32a940251192 | 124 | // Show start up with RED for 1sec |
WilliamMarshQMUL | 3:32a940251192 | 125 | // Remember the watchdog is running |
WilliamMarshQMUL | 3:32a940251192 | 126 | // - 1024ms to set it once |
WilliamMarshQMUL | 3:32a940251192 | 127 | // - then must feed it every 32ms |
WilliamMarshQMUL | 3:32a940251192 | 128 | // ---------------------------------------------- |
Manel_Marin | 0:5ce3cfc57999 | 129 | |
Manel_Marin | 0:5ce3cfc57999 | 130 | int main(void) { |
alifsohen | 8:e6403cb3582f | 131 | wdt_1sec() ; // initialise watchdog - 32ms timeout |
alifsohen | 9:58491af42a2a | 132 | |
WilliamMarshQMUL | 1:159a09ac60ba | 133 | |
WilliamMarshQMUL | 3:32a940251192 | 134 | // start threads |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 135 | threadT.start(timer_thread) ; // start the timer thread |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 136 | threadLED1.start(led1_thread) ; // start the LED1 control thread |
WilliamMarshQMUL | 6:8b0ca28c88a4 | 137 | threadLED2.start(led2_thread) ; // start the LED2 control thread |
WilliamMarshQMUL | 1:159a09ac60ba | 138 | |
WilliamMarshQMUL | 7:e49685bca7c7 | 139 | |
WilliamMarshQMUL | 7:e49685bca7c7 | 140 | // main thread does nothing more |
WilliamMarshQMUL | 7:e49685bca7c7 | 141 | while (true) { |
alifsohen | 9:58491af42a2a | 142 | |
WilliamMarshQMUL | 7:e49685bca7c7 | 143 | ThisThread::sleep_for(10000) ; |
WilliamMarshQMUL | 7:e49685bca7c7 | 144 | } |
Manel_Marin | 0:5ce3cfc57999 | 145 | } |