Eric Glunn
/
4180Project_Analog
Logic code
Diff: main.cpp
- Revision:
- 0:f4b1c6a95f25
- Child:
- 1:14e49afb1d7c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Apr 20 19:43:36 2020 +0000 @@ -0,0 +1,147 @@ +#include "mbed.h" +#define reset 0b00000000 //Define masks +#define digital 0b00100000 +#define analog 0b01000000 +#define I2C 0b01100000 +#define stateMask 0b11100000 +#define pinMask 0b00011111 +#define pin1 0b00010000 +#define pin2 0b00001000 +#define pin3 0b00000100 +#define pin4 0b00000010 +#define pin5 0b00000001 + + +DigitalOut myled(LED1); +DigitalOut DigitalStatus(LED2); //Led for when Digital read is running +DigitalOut AnalogStatus(LED3); //LED for when Analog read is running + +DigitalIn d1(p21); //Always set these pins for digital in +DigitalIn d2(p22); +DigitalIn d3(p23); +DigitalIn d4(p24); +DigitalIn d5(p25); + +AnalogIn a1(p16); //Always set these pins for analog in +AnalogIn a2(p17); +AnalogIn a3(p18); +AnalogIn a4(p19); +AnalogIn a5(p20); + + +Serial PC(USBTX,USBRX); +Ticker tickerboi; //Initialize the ticker for Sampling + +volatile unsigned char DigitalSample; +volatile unsigned char AnalogSample[5]; + +volatile bool DigitalRunning; +volatile bool AnalogRunning; + +volatile unsigned char command; +volatile unsigned char state; + +volatile bool newDigital=false; +volatile bool newAnalog=false; + + + +void digital_sample_func(void){ //sampling function, samples each pin specified and Ors it + DigitalSample = digital; + + if( (command & pin1) == pin1){ + DigitalSample=DigitalSample + d1*pin1; + } + if( (command & pin2) == pin2){ + DigitalSample=DigitalSample + d2*pin2; + } + if( (command & pin3) == pin3){ + DigitalSample=DigitalSample + d3*pin3; + } + if( (command & pin4) == pin4){ + DigitalSample=DigitalSample + d4*pin4; + } + if( (command & pin5) == pin5){ + DigitalSample=DigitalSample + d5*pin5; + } + newDigital=true; +} + + +void analog_sample_func(void){ + for(int i=0; i<5; i++){ + AnalogSample[i]=0; + } + if( (command & pin1) == pin1){ + AnalogSample[0]=a1*255; + } + if( (command & pin2) == pin2){ + AnalogSample[1]=a2*255; + } + if( (command & pin3) == pin3){ + AnalogSample[2]=a3*255; + } + if( (command & pin4) == pin4){ + AnalogSample[3]=a4*255; + } + if( (command & pin5) == pin5){ + AnalogSample[4]=a5*255; + } + newAnalog=true; + +} + + +void SerialInterrupt(void){ + command=PC.getc(); + state= command & stateMask; + switch(state){ + case reset: + tickerboi.detach(); //detach Ticker + DigitalRunning=false; //turn off status LED + AnalogRunning=false; + break; + + case digital: + tickerboi.attach(&digital_sample_func, .1); //Ticker will call digital read every 100 ms + DigitalRunning=true; // turn on status LED + break; + + case analog: + tickerboi.attach(&analog_sample_func, .01); //Ticker will call analog read every 10ms + AnalogRunning=true; + } +} + +int main() { + PC.attach(&SerialInterrupt, Serial::RxIrq); + + + while(1) { + + DigitalStatus=DigitalRunning; //Indicate DigitalRead is running + AnalogStatus=AnalogRunning; //Indicate analogRead is running + + if(newDigital){ //if digital sampling was run + PC.putc(DigitalSample); + newDigital=false; + } + + if(newAnalog){ //if analog sampling was run + PC.putc(analog); //First bit is 0b01000000 + for(int i=0; i<5; i++){ //Send all of the analog bits + PC.putc(AnalogSample[i]); + } + PC.putc(command); //Last bit is command from PC + newAnalog=false; + } + + myled = 1; //indicate main loop is running + wait(0.2); + myled = 0; + wait(0.2); + } +} + + +