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?

UserRevisionLine numberNew 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 }