Md Golam Tanvir Zim
/
week03_ADCandticker_sample
Diff: main.cpp
- Revision:
- 5:f7c980ba6e08
- Parent:
- 4:ebd00f94455a
diff -r ebd00f94455a -r f7c980ba6e08 main.cpp --- a/main.cpp Thu Jan 31 13:53:15 2019 +0000 +++ b/main.cpp Thu Feb 14 22:53:14 2019 +0000 @@ -1,46 +1,89 @@ - -// LAB 3 SAMPLE PROGRAM 1 -// Revised for mbed 5 -// Revised to replace Ticker with event queue and thread - #include "mbed.h" +#define state0 0 +#define state1 1 +#define state2 2 +#define state3 3 +#define state4 4 +#define state5 5 AnalogIn ain(A0) ; // Analog input DigitalOut led1(LED_RED); // Red LED -EventQueue queue; // creates an event queue, to call read ADC +DigitalOut externalLed1(D2); +DigitalOut externalLed2(D3); +DigitalOut externalLed3(D4); +DigitalOut externalLed4(D5); +DigitalOut externalLed5(D6); -Serial pc(USBTX, USBRX); // tx, rx, for debugging +DigitalIn externalButton(PTD0); + +EventQueue queue; // creates an event queue, to call read ADC + +Serial pc(USBTX, USBRX); // tx, rx, for debugging // This thread runs the event queue Thread eventThread ; // Message type typedef struct { - uint16_t analog; /* Analog input value */ + uint16_t analog; // // Analog input value + uint16_t pressEventOccured; // Callibration Check for a button press */ } message_t; // Mail box -Mail<message_t, 2> mailbox; +Mail<message_t, 3> mailbox; // Function called every 10ms to read ADC // Average using a low pass filter // Every 10th value is sent to mailbox + volatile int samples = 0 ; volatile uint16_t smoothed = 0 ; +volatile int pressEvent = 0 ; // Variable set by the polling thread +enum buttonPos { up, down, bounce }; // Button positions +volatile buttonPos pos = up ; +volatile int bcounter = 0 ; void readA0() { + + switch (pos) { + case up : + if (!externalButton.read()) { // now down + pressEvent = 1 ; // transition occurred + pos = down ; + } + break ; + case down : + if (externalButton == 1) { // no longer down + bcounter = 3 ; // wait four cycles + pos = bounce ; + } + break ; + case bounce : + if (externalButton == 0) { // down again - button has bounced + pos = down ; // no event + } else if (bcounter == 0) { + pos = up ; // delay passed - reset to up + } else { + bcounter-- ; // continue waiting + } + break ; + } + smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ; - samples++ ; + samples++ ; + if (samples == 10) { // send to thread - message_t *mess = mailbox.alloc() ; // may fail but does not block + message_t *mess = mailbox.alloc() ; // may fail but does not block if (mess) { mess->analog = smoothed ; - mailbox.put(mess); // fails but does not block if full + mess->pressEventOccured = pressEvent ; // Callibration + pressEvent = 0; + mailbox.put(mess); // fails but does not block if full } samples = 0; - } + } } // Write voltage digits @@ -57,32 +100,102 @@ // Initialise variables // Attach ISR for ticker // Procss messages from mailbox + int main() { led1 = 1 ; // turn off int volts = 0 ; - const int threshold = 100 ; + int threshold[6] = {0,0,0,0,0,0}; + unsigned int systemState = 0; int counter = 0 ; char vstring[] = "X.XX\r\n" ; - + // Start the event queue eventThread.start(callback(&queue, &EventQueue::dispatch_forever)); - + // call the readA0 function every 10ms queue.call_every(10, readA0) ; while (true) { + osEvent evt = mailbox.get(); // wait for mail + if (evt.status == osEventMail) { message_t* mess = (message_t*)evt.value.p ; volts = (mess->analog * 330) / 0xffff ; - mailbox.free(mess) ; // free the message space - if (volts > threshold) led1 = 0 ; else led1 = 1 ; + if(mess->pressEventOccured == 1) { // Check if callibration needed + for (int i=0; i<6; i++) { + threshold[i] = (i*volts)/6 ; // Setting new thresholds according to new callibration valued + } + } + mailbox.free(mess) ; // free the message space + } + + if (volts>=threshold[0] && volts<threshold[1]) + systemState = state0; + else if (volts>=threshold[1] && volts<threshold[2]) + systemState = state1; + else if (volts>=threshold[2] && volts<threshold[3]) + systemState = state2; + else if (volts>=threshold[3] && volts<threshold[4]) + systemState = state3; + else if (volts>=threshold[4] && volts<threshold[5]) + systemState = state4; + else if (volts>=threshold[5]) + systemState = state5; + vToString(volts, vstring) ; counter++ ; - if (counter == 10) { // limit bandwidth of serial - pc.printf(vstring) ; + if (counter == 10) { // limit bandwidth of serial counter = 0 ; + pc.printf(vstring); + pc.putc('\n'); + pc.putc('\r'); } + + switch(systemState) { + case state0: + externalLed1.write(0); + externalLed2.write(0); + externalLed3.write(0); + externalLed4.write(0); + externalLed5.write(0); + break; + case state1: + externalLed1.write(1); + externalLed2.write(0); + externalLed3.write(0); + externalLed4.write(0); + externalLed5.write(0); + break; + case state2: + externalLed1.write(1); + externalLed2.write(1); + externalLed3.write(0); + externalLed4.write(0); + externalLed5.write(0); + break; + case state3: + externalLed1.write(1); + externalLed2.write(1); + externalLed3.write(1); + externalLed4.write(0); + externalLed5.write(0); + break; + case state4: + externalLed1.write(1); + externalLed2.write(1); + externalLed3.write(1); + externalLed4.write(1); + externalLed5.write(0); + break; + case state5: + externalLed1.write(1); + externalLed2.write(1); + externalLed3.write(1); + externalLed4.write(1); + externalLed5.write(1); + break; } } -} + } +