Alif Ahmed
/
Watchdog_sample_nocoverageLab6Part2
main.cpp
- Committer:
- alifsohen
- Date:
- 2020-04-10
- Revision:
- 9:58491af42a2a
- Parent:
- 8:e6403cb3582f
File content as of revision 9:58491af42a2a:
#include "mbed.h" #include "wdt.h" // Sample program using the Watchdog // --------------------------------- // * Three threads co-operate to flash two LEDs // * A simple way to inject a fault, by pressing a button // * The watchdog is configured with a 1sec timeout #define ON 1 #define OFF 0 DigitalOut led_red(LED_RED, ON); DigitalOut led_blue(LED_BLUE, ON); DigitalIn button(PTD0, PullUp); DigitalOut led1(PTC12, OFF); DigitalOut led2(PTC13, OFF); AnalogIn ain(A0) ; // Analog input EventQueue queue; // creates an event queue, to call read ADC Serial pc(USBTX, USBRX); // tx, rx, useful for debugging // This ticker is used to feed the watch dog Ticker tick; // Threads Thread threadT ; // timer thread Thread threadLED1 ; // thread LED1 Thread threadLED2 ; // thread LED2 # define ON1 0x01 # define ON2 0x02 # define OFF1 0x04 # define OFF2 0x08 EventFlags signals; // event flags for signalling // ------------Fault Injection Button------------- // Wait while the button is down // Use this to simulate a STUCK fault // ----------------------------------------------- void waitButton() { while (!button) ; } // Write voltage digits // v Voltage as scale int, e.g. 3.30 is 330 void vToString(int v, char* s) { s[3] = '0' + (v % 10) ; v = v / 10 ; s[2] = '0' + (v % 10) ; v = v / 10 ; s[0] = '0' + (v % 10) ; } // ---Thread for controlling LED 1---------------- // Turn LED1 on/off in response to signals // ----------------------------------------------- void led1_thread() { // method to run in thread int volts = 0; char vstring[] = "X.XX\r\n" ; int evt ; while (true) { evt = signals.wait_any(ON1 | OFF1); // wait for either signal if (evt & ON1) { led1 = ON ; ThisThread::sleep_for(1) ; // check if led is working volts = ain.read_u16(); vToString(volts, vstring) ; if (volts > 100 && volts < 250) { pc.printf(vstring) ; while(true) { led_blue = OFF; } wdt_kickA() ; } else { pc.printf(vstring) ; led_red = OFF; } } if (evt & OFF1) led1 = OFF ; // waitButton() ; // POSSIBLE FAULT HERE } } // ---Thread for controlling LED 2---------------- // Turn LED2 on/off in response to signals // ----------------------------------------------- void led2_thread() { // method to run in thread int evt ; while (true) { evt = signals.wait_any(ON2 | OFF2); // wait for any signal if (evt & ON2) led2 = ON ; if (evt & OFF2) led2 = OFF ; // waitButton() ; // POSSIBLE FAULT HERE wdt_kickB() ; } } // ---Thread for timing -------------------------- // Send signals to the other threads // ----------------------------------------------- void timer_thread() { // method to run in thread while (true) { ThisThread::sleep_for(1000) ; signals.set(ON1 | ON2) ; ThisThread::sleep_for(1000) ; signals.set(OFF1 | OFF2) ; //waitButton() ; // POSSIBLE FAULT HERE } } // -----------MAIN------------------------------- // Configure watchdog. Start threads. // Show start up with RED for 1sec // Remember the watchdog is running // - 1024ms to set it once // - then must feed it every 32ms // ---------------------------------------------- int main(void) { wdt_1sec() ; // initialise watchdog - 32ms timeout // start threads threadT.start(timer_thread) ; // start the timer thread threadLED1.start(led1_thread) ; // start the LED1 control thread threadLED2.start(led2_thread) ; // start the LED2 control thread // main thread does nothing more while (true) { ThisThread::sleep_for(10000) ; } }