Haozun Sun
/
Lab6Part2
The second part of lab6, all the functions tested.
main.cpp
- Committer:
- hzsun
- Date:
- 2020-04-10
- Revision:
- 9:cec9620ad205
- Parent:
- 8:1f2ac4a0744c
File content as of revision 9:cec9620ad205:
#include "mbed.h" #include "wdt.h" // -----------DESCRIBTION------------- // lab6 second part of the demostration, //all the functions have been tested // ----------------------------------------------- #define ON 1 #define OFF 0 DigitalOut led_red(LED_RED, ON); DigitalIn button(PTD0, PullUp); DigitalOut led1(PTC12, OFF); AnalogIn ain(A0) ; // Analog input 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 threadADC ; //thread for ADC # define ON1 0x01 # define OFF1 0x02 EventFlags signals; // event flags for signalling void waitButton() { while (!button) ; } float voltage; //value for voltage int t; // ---Thread for controlling LED 1---------------- // Turn LED1 on/off in response to signals // ----------------------------------------------- void led1_thread() // method to run in thread { int evt ; while (true) { evt = signals.wait_any(ON1 | OFF1); // wait for either signal if (evt & ON1) led1 = ON ; 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 ; wdt_kickB(); waitButton() ; // POSSIBLE FAULT HERE } } */ void adc_thread() // method to run in thread { while(true) { voltage = ain.read()*3.3f; //read from adc if (t == 0 && voltage > 0) { //if led should be off and the volt is out of range led_red = 0; //turn on internal led } if(t == 1 && (voltage < 1 || voltage > 2)) { //if led should be on and the voltage is out of range led_red = 0; //turn on internal led } pc.printf("currrnt_Voltage%3.3f%\n", voltage); // print on the screen ThisThread::sleep_for(1000) ; //delay } } // ---Thread for timing -------------------------- // Send signals to the other threads // ----------------------------------------------- void timer_thread() // method to run in thread { while (true) { ThisThread::sleep_for(1000) ; //delay signals.set(ON1) ; t = 1; //check the signal ThisThread::sleep_for(1000) ; //delay signals.set(OFF1) ; t = 0; //check the signal } } // -----------MAIN------------------------------- //run the three threads // ---------------------------------------------- int main(void) { wdt_32ms() ; // initialise watchdog - 32ms timeout wdt_kick_all() ; tick.attach_us(callback(&wdt_kick_all), 20000); // ticks every 20ms // start threads threadT.start(timer_thread) ; // start the timer thread threadLED1.start(led1_thread) ; // start the LED1 control thread threadADC.start(adc_thread) ; // start the adc thread // main thread does nothing more while (true) { ThisThread::sleep_for(10000) ; //delay } }