Revision:
5:f7c980ba6e08
Parent:
4:ebd00f94455a
--- 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;
         }
     }
-}
+ }
+