Committer:
gtanvir
Date:
Thu Feb 14 22:53:14 2019 +0000
Revision:
5:f7c980ba6e08
Parent:
4:ebd00f94455a
Final, Working properly, Viva(ed).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WilliamMarshQMUL 0:ad3cdc525b99 1 #include "mbed.h"
WilliamMarshQMUL 1:126dd2f5fc2d 2
gtanvir 5:f7c980ba6e08 3 #define state0 0
gtanvir 5:f7c980ba6e08 4 #define state1 1
gtanvir 5:f7c980ba6e08 5 #define state2 2
gtanvir 5:f7c980ba6e08 6 #define state3 3
gtanvir 5:f7c980ba6e08 7 #define state4 4
gtanvir 5:f7c980ba6e08 8 #define state5 5
WilliamMarshQMUL 0:ad3cdc525b99 9
WilliamMarshQMUL 0:ad3cdc525b99 10 AnalogIn ain(A0) ; // Analog input
WilliamMarshQMUL 0:ad3cdc525b99 11 DigitalOut led1(LED_RED); // Red LED
gtanvir 5:f7c980ba6e08 12 DigitalOut externalLed1(D2);
gtanvir 5:f7c980ba6e08 13 DigitalOut externalLed2(D3);
gtanvir 5:f7c980ba6e08 14 DigitalOut externalLed3(D4);
gtanvir 5:f7c980ba6e08 15 DigitalOut externalLed4(D5);
gtanvir 5:f7c980ba6e08 16 DigitalOut externalLed5(D6);
WilliamMarshQMUL 0:ad3cdc525b99 17
gtanvir 5:f7c980ba6e08 18 DigitalIn externalButton(PTD0);
gtanvir 5:f7c980ba6e08 19
gtanvir 5:f7c980ba6e08 20 EventQueue queue; // creates an event queue, to call read ADC
gtanvir 5:f7c980ba6e08 21
gtanvir 5:f7c980ba6e08 22 Serial pc(USBTX, USBRX); // tx, rx, for debugging
WilliamMarshQMUL 0:ad3cdc525b99 23
WilliamMarshQMUL 4:ebd00f94455a 24 // This thread runs the event queue
WilliamMarshQMUL 4:ebd00f94455a 25 Thread eventThread ;
WilliamMarshQMUL 3:f5d7fddeef39 26
WilliamMarshQMUL 0:ad3cdc525b99 27 // Message type
WilliamMarshQMUL 0:ad3cdc525b99 28 typedef struct {
gtanvir 5:f7c980ba6e08 29 uint16_t analog; // // Analog input value
gtanvir 5:f7c980ba6e08 30 uint16_t pressEventOccured; // Callibration Check for a button press */
WilliamMarshQMUL 0:ad3cdc525b99 31 } message_t;
WilliamMarshQMUL 0:ad3cdc525b99 32
WilliamMarshQMUL 0:ad3cdc525b99 33 // Mail box
gtanvir 5:f7c980ba6e08 34 Mail<message_t, 3> mailbox;
WilliamMarshQMUL 0:ad3cdc525b99 35
WilliamMarshQMUL 0:ad3cdc525b99 36 // Function called every 10ms to read ADC
WilliamMarshQMUL 4:ebd00f94455a 37 // Average using a low pass filter
WilliamMarshQMUL 0:ad3cdc525b99 38 // Every 10th value is sent to mailbox
gtanvir 5:f7c980ba6e08 39
WilliamMarshQMUL 4:ebd00f94455a 40 volatile int samples = 0 ;
WilliamMarshQMUL 4:ebd00f94455a 41 volatile uint16_t smoothed = 0 ;
gtanvir 5:f7c980ba6e08 42 volatile int pressEvent = 0 ; // Variable set by the polling thread
gtanvir 5:f7c980ba6e08 43 enum buttonPos { up, down, bounce }; // Button positions
gtanvir 5:f7c980ba6e08 44 volatile buttonPos pos = up ;
gtanvir 5:f7c980ba6e08 45 volatile int bcounter = 0 ;
WilliamMarshQMUL 4:ebd00f94455a 46
WilliamMarshQMUL 0:ad3cdc525b99 47 void readA0() {
gtanvir 5:f7c980ba6e08 48
gtanvir 5:f7c980ba6e08 49 switch (pos) {
gtanvir 5:f7c980ba6e08 50 case up :
gtanvir 5:f7c980ba6e08 51 if (!externalButton.read()) { // now down
gtanvir 5:f7c980ba6e08 52 pressEvent = 1 ; // transition occurred
gtanvir 5:f7c980ba6e08 53 pos = down ;
gtanvir 5:f7c980ba6e08 54 }
gtanvir 5:f7c980ba6e08 55 break ;
gtanvir 5:f7c980ba6e08 56 case down :
gtanvir 5:f7c980ba6e08 57 if (externalButton == 1) { // no longer down
gtanvir 5:f7c980ba6e08 58 bcounter = 3 ; // wait four cycles
gtanvir 5:f7c980ba6e08 59 pos = bounce ;
gtanvir 5:f7c980ba6e08 60 }
gtanvir 5:f7c980ba6e08 61 break ;
gtanvir 5:f7c980ba6e08 62 case bounce :
gtanvir 5:f7c980ba6e08 63 if (externalButton == 0) { // down again - button has bounced
gtanvir 5:f7c980ba6e08 64 pos = down ; // no event
gtanvir 5:f7c980ba6e08 65 } else if (bcounter == 0) {
gtanvir 5:f7c980ba6e08 66 pos = up ; // delay passed - reset to up
gtanvir 5:f7c980ba6e08 67 } else {
gtanvir 5:f7c980ba6e08 68 bcounter-- ; // continue waiting
gtanvir 5:f7c980ba6e08 69 }
gtanvir 5:f7c980ba6e08 70 break ;
gtanvir 5:f7c980ba6e08 71 }
gtanvir 5:f7c980ba6e08 72
WilliamMarshQMUL 4:ebd00f94455a 73 smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
gtanvir 5:f7c980ba6e08 74 samples++ ;
gtanvir 5:f7c980ba6e08 75
WilliamMarshQMUL 4:ebd00f94455a 76 if (samples == 10) {
WilliamMarshQMUL 4:ebd00f94455a 77 // send to thread
gtanvir 5:f7c980ba6e08 78 message_t *mess = mailbox.alloc() ; // may fail but does not block
WilliamMarshQMUL 4:ebd00f94455a 79 if (mess) {
WilliamMarshQMUL 4:ebd00f94455a 80 mess->analog = smoothed ;
gtanvir 5:f7c980ba6e08 81 mess->pressEventOccured = pressEvent ; // Callibration
gtanvir 5:f7c980ba6e08 82 pressEvent = 0;
gtanvir 5:f7c980ba6e08 83 mailbox.put(mess); // fails but does not block if full
WilliamMarshQMUL 0:ad3cdc525b99 84 }
WilliamMarshQMUL 4:ebd00f94455a 85 samples = 0;
gtanvir 5:f7c980ba6e08 86 }
WilliamMarshQMUL 0:ad3cdc525b99 87 }
WilliamMarshQMUL 0:ad3cdc525b99 88
WilliamMarshQMUL 0:ad3cdc525b99 89 // Write voltage digits
WilliamMarshQMUL 0:ad3cdc525b99 90 // v Voltage as scale int, e.g. 3.30 is 330
WilliamMarshQMUL 0:ad3cdc525b99 91 void vToString(int v, char* s) {
WilliamMarshQMUL 0:ad3cdc525b99 92 s[3] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 93 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 94 s[2] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 95 v = v / 10 ;
WilliamMarshQMUL 0:ad3cdc525b99 96 s[0] = '0' + (v % 10) ;
WilliamMarshQMUL 0:ad3cdc525b99 97 }
WilliamMarshQMUL 0:ad3cdc525b99 98
WilliamMarshQMUL 0:ad3cdc525b99 99 // Main program
WilliamMarshQMUL 0:ad3cdc525b99 100 // Initialise variables
WilliamMarshQMUL 0:ad3cdc525b99 101 // Attach ISR for ticker
WilliamMarshQMUL 0:ad3cdc525b99 102 // Procss messages from mailbox
gtanvir 5:f7c980ba6e08 103
WilliamMarshQMUL 0:ad3cdc525b99 104 int main() {
WilliamMarshQMUL 0:ad3cdc525b99 105 led1 = 1 ; // turn off
WilliamMarshQMUL 0:ad3cdc525b99 106 int volts = 0 ;
gtanvir 5:f7c980ba6e08 107 int threshold[6] = {0,0,0,0,0,0};
gtanvir 5:f7c980ba6e08 108 unsigned int systemState = 0;
WilliamMarshQMUL 0:ad3cdc525b99 109 int counter = 0 ;
WilliamMarshQMUL 0:ad3cdc525b99 110 char vstring[] = "X.XX\r\n" ;
gtanvir 5:f7c980ba6e08 111
WilliamMarshQMUL 4:ebd00f94455a 112 // Start the event queue
WilliamMarshQMUL 4:ebd00f94455a 113 eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
gtanvir 5:f7c980ba6e08 114
WilliamMarshQMUL 4:ebd00f94455a 115 // call the readA0 function every 10ms
WilliamMarshQMUL 4:ebd00f94455a 116 queue.call_every(10, readA0) ;
WilliamMarshQMUL 0:ad3cdc525b99 117
WilliamMarshQMUL 0:ad3cdc525b99 118 while (true) {
gtanvir 5:f7c980ba6e08 119
WilliamMarshQMUL 0:ad3cdc525b99 120 osEvent evt = mailbox.get(); // wait for mail
gtanvir 5:f7c980ba6e08 121
WilliamMarshQMUL 0:ad3cdc525b99 122 if (evt.status == osEventMail) {
WilliamMarshQMUL 0:ad3cdc525b99 123 message_t* mess = (message_t*)evt.value.p ;
WilliamMarshQMUL 0:ad3cdc525b99 124 volts = (mess->analog * 330) / 0xffff ;
gtanvir 5:f7c980ba6e08 125 if(mess->pressEventOccured == 1) { // Check if callibration needed
gtanvir 5:f7c980ba6e08 126 for (int i=0; i<6; i++) {
gtanvir 5:f7c980ba6e08 127 threshold[i] = (i*volts)/6 ; // Setting new thresholds according to new callibration valued
gtanvir 5:f7c980ba6e08 128 }
gtanvir 5:f7c980ba6e08 129 }
gtanvir 5:f7c980ba6e08 130 mailbox.free(mess) ; // free the message space
gtanvir 5:f7c980ba6e08 131 }
gtanvir 5:f7c980ba6e08 132
gtanvir 5:f7c980ba6e08 133 if (volts>=threshold[0] && volts<threshold[1])
gtanvir 5:f7c980ba6e08 134 systemState = state0;
gtanvir 5:f7c980ba6e08 135 else if (volts>=threshold[1] && volts<threshold[2])
gtanvir 5:f7c980ba6e08 136 systemState = state1;
gtanvir 5:f7c980ba6e08 137 else if (volts>=threshold[2] && volts<threshold[3])
gtanvir 5:f7c980ba6e08 138 systemState = state2;
gtanvir 5:f7c980ba6e08 139 else if (volts>=threshold[3] && volts<threshold[4])
gtanvir 5:f7c980ba6e08 140 systemState = state3;
gtanvir 5:f7c980ba6e08 141 else if (volts>=threshold[4] && volts<threshold[5])
gtanvir 5:f7c980ba6e08 142 systemState = state4;
gtanvir 5:f7c980ba6e08 143 else if (volts>=threshold[5])
gtanvir 5:f7c980ba6e08 144 systemState = state5;
gtanvir 5:f7c980ba6e08 145
WilliamMarshQMUL 0:ad3cdc525b99 146 vToString(volts, vstring) ;
WilliamMarshQMUL 0:ad3cdc525b99 147 counter++ ;
gtanvir 5:f7c980ba6e08 148 if (counter == 10) { // limit bandwidth of serial
WilliamMarshQMUL 0:ad3cdc525b99 149 counter = 0 ;
gtanvir 5:f7c980ba6e08 150 pc.printf(vstring);
gtanvir 5:f7c980ba6e08 151 pc.putc('\n');
gtanvir 5:f7c980ba6e08 152 pc.putc('\r');
WilliamMarshQMUL 0:ad3cdc525b99 153 }
gtanvir 5:f7c980ba6e08 154
gtanvir 5:f7c980ba6e08 155 switch(systemState) {
gtanvir 5:f7c980ba6e08 156 case state0:
gtanvir 5:f7c980ba6e08 157 externalLed1.write(0);
gtanvir 5:f7c980ba6e08 158 externalLed2.write(0);
gtanvir 5:f7c980ba6e08 159 externalLed3.write(0);
gtanvir 5:f7c980ba6e08 160 externalLed4.write(0);
gtanvir 5:f7c980ba6e08 161 externalLed5.write(0);
gtanvir 5:f7c980ba6e08 162 break;
gtanvir 5:f7c980ba6e08 163 case state1:
gtanvir 5:f7c980ba6e08 164 externalLed1.write(1);
gtanvir 5:f7c980ba6e08 165 externalLed2.write(0);
gtanvir 5:f7c980ba6e08 166 externalLed3.write(0);
gtanvir 5:f7c980ba6e08 167 externalLed4.write(0);
gtanvir 5:f7c980ba6e08 168 externalLed5.write(0);
gtanvir 5:f7c980ba6e08 169 break;
gtanvir 5:f7c980ba6e08 170 case state2:
gtanvir 5:f7c980ba6e08 171 externalLed1.write(1);
gtanvir 5:f7c980ba6e08 172 externalLed2.write(1);
gtanvir 5:f7c980ba6e08 173 externalLed3.write(0);
gtanvir 5:f7c980ba6e08 174 externalLed4.write(0);
gtanvir 5:f7c980ba6e08 175 externalLed5.write(0);
gtanvir 5:f7c980ba6e08 176 break;
gtanvir 5:f7c980ba6e08 177 case state3:
gtanvir 5:f7c980ba6e08 178 externalLed1.write(1);
gtanvir 5:f7c980ba6e08 179 externalLed2.write(1);
gtanvir 5:f7c980ba6e08 180 externalLed3.write(1);
gtanvir 5:f7c980ba6e08 181 externalLed4.write(0);
gtanvir 5:f7c980ba6e08 182 externalLed5.write(0);
gtanvir 5:f7c980ba6e08 183 break;
gtanvir 5:f7c980ba6e08 184 case state4:
gtanvir 5:f7c980ba6e08 185 externalLed1.write(1);
gtanvir 5:f7c980ba6e08 186 externalLed2.write(1);
gtanvir 5:f7c980ba6e08 187 externalLed3.write(1);
gtanvir 5:f7c980ba6e08 188 externalLed4.write(1);
gtanvir 5:f7c980ba6e08 189 externalLed5.write(0);
gtanvir 5:f7c980ba6e08 190 break;
gtanvir 5:f7c980ba6e08 191 case state5:
gtanvir 5:f7c980ba6e08 192 externalLed1.write(1);
gtanvir 5:f7c980ba6e08 193 externalLed2.write(1);
gtanvir 5:f7c980ba6e08 194 externalLed3.write(1);
gtanvir 5:f7c980ba6e08 195 externalLed4.write(1);
gtanvir 5:f7c980ba6e08 196 externalLed5.write(1);
gtanvir 5:f7c980ba6e08 197 break;
WilliamMarshQMUL 0:ad3cdc525b99 198 }
WilliamMarshQMUL 0:ad3cdc525b99 199 }
gtanvir 5:f7c980ba6e08 200 }
gtanvir 5:f7c980ba6e08 201