Logic code

Dependencies:   mbed

main.cpp

Committer:
EricGlunn
Date:
2020-04-21
Revision:
1:14e49afb1d7c
Parent:
0:f4b1c6a95f25
Child:
2:9a88de905577

File content as of revision 1:14e49afb1d7c:

#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
#define FULL        0b11111111


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*254;
    }
    if( (command & pin2) == pin2){
        AnalogSample[1]=a2 * 254;
    }
    if( (command & pin3) == pin3){
        AnalogSample[2]=a3*254;
    }
    if( (command & pin4) == pin4){
        AnalogSample[3]=a4*254;
    }
    if( (command & pin5) == pin5){
        AnalogSample[4]=a5*254;
    }
    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, 1);        //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(FULL);                   //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);  
    }
}