By Michael Wasko and Haoran Xiao

Dependencies:   MAG3110 MMA8451Q SLCD TSI mbed

main.cpp

Committer:
HaoranX
Date:
2014-02-12
Revision:
0:792bc968c89f

File content as of revision 0:792bc968c89f:

#include "mbed.h"
#include "MMA8451Q.h"
#include "MAG3110.h"
#include "TSISensor.h"
#include "SLCD.h"

#define ACC_ID 0
#define MAG_ID 1
#define ADC_ID 2
#define TSI_ID 3
#define NUM_OF_SENSOR 4

union Serial_Float{
    float f;
    char bt[4];
};

union Serial_Int{
    int i;
    char bt[4];
};

typedef union _data {
  float f;
  char  s[4];
} myData;

Serial pc(USBTX, USBRX);
MMA8451Q acc(PTE25,PTE24,0x1d<<1);
MAG3110 mag(PTE25,PTE24);
AnalogIn adc(PTE30);
TSISensor tsi;
SLCD slcd;
DigitalOut led2(LED2);
bool sirq_flags[NUM_OF_SENSOR] = {0}; // interrupt flags
int SR = 0; // total sampling rate

void send(float data, int id);
void send(int data, int id);
void read_cmd();
void display(int val);

Ticker acc_timer;
Ticker mag_timer;
Ticker adc_timer;
Ticker tsi_timer;
void acc_timer_irq();
void mag_timer_irq();
void adc_timer_irq();
void tsi_timer_irq();

// initial sampling frequency:
float sp_freq[NUM_OF_SENSOR] = {1,1,1,1};
// current sensor states:
int sp_flag[NUM_OF_SENSOR] = {0};

int main(){
    // Initialize sampling rate for display
    SR = 3*sp_freq[0]*sp_flag[0]+sp_freq[1]*sp_flag[1]+sp_freq[2]*sp_flag[2]+sp_freq[3]*sp_flag[3];
    led2 = 1;
    // set baud rate to 460800
    pc.baud(460800);
    // display current sampling rate on LCD
    display(SR);
    while(1){
        // check requests, execute and clear
        if(sirq_flags[ACC_ID]){
            send(acc.getAccX(),0);
            send(acc.getAccY(),1);
            send(acc.getAccZ(),2);
            sirq_flags[ACC_ID] = 0;
        }
        if(sirq_flags[MAG_ID]){
            send(mag.readVal(0x1d),3);
            sirq_flags[MAG_ID] = 0;
        }
        if(sirq_flags[ADC_ID]){
            send(float(adc.read()*3.3),4);
            sirq_flags[ADC_ID] = 0;
        }
        if(sirq_flags[TSI_ID]){
            send(tsi.readPercentage(),5);
            sirq_flags[TSI_ID] = 0;
        }
        if(pc.readable()){
            read_cmd();
            // refresh current sampling rate after the command is read:
            SR = 3*sp_freq[0]*sp_flag[0]+sp_freq[1]*sp_flag[1]+sp_freq[2]*sp_flag[2]+sp_freq[3]*sp_flag[3];
            display(SR);
        }
    }
}

// interrupt functions for each ticker
void acc_timer_irq(){
    sirq_flags[ACC_ID] = 1;
}
void mag_timer_irq(){
    sirq_flags[MAG_ID] = 1;
}
void adc_timer_irq(){
    sirq_flags[ADC_ID] = 1;
}
void tsi_timer_irq(){
    sirq_flags[TSI_ID] = 1;
}

// serial write (overloaded with different data type)
void send(float data,int id){
    Serial_Float srdata;
    srdata.f = data;
    for(int i = 0; i < 4; i++)
        pc.putc(srdata.bt[i]);
    pc.putc('0'+id);
}
void send(int data, int id){
    Serial_Int srdata;
    srdata.i = data;
    for(int i = 0; i < 4; i++)
        pc.putc(srdata.bt[i]);
    pc.putc('0'+id);
}

// read command
void read_cmd(){
    __disable_irq();
    led2 = !led2;
    char op; char id; myData freq;
    while(pc.readable()){//Flush input
        pc.getc();
    }
    pc.putc('r'); //confirm ready
    op = pc.getc(); // get operation
    id = pc.getc(); // get sensor id
    if(op == 'c') {
        if (id == '0'){
            acc_timer.detach();
            sp_flag[ACC_ID] = 0;
        }
        else if (id == '1'){
            mag_timer.detach();
            sp_flag[MAG_ID] = 0;
        }
        else if (id == '2'){
            adc_timer.detach();
            sp_flag[ADC_ID] = 0;
        }
        else if (id == '3'){
            tsi_timer.detach();
            sp_flag[TSI_ID] = 0;
        }
    }
    if(op == 'o') {
        for (int i=0; i<4; i++) {
            freq.s[i] = pc.getc();
        }
        switch(id){
            case '0':
                sp_freq[0] = freq.f;
                acc_timer.attach(&acc_timer_irq, 1.0/freq.f);
                sp_flag[ACC_ID] = 1; 
                break;
            case '1':
                sp_freq[1] = freq.f;
                mag_timer.attach(&mag_timer_irq, 1.0/freq.f); 
                sp_flag[MAG_ID] = 1;
                break;
            case '2':
                sp_freq[2] = freq.f;
                adc_timer.attach(&adc_timer_irq, 1.0/freq.f);
                sp_flag[ADC_ID] = 1;
                break;
            case '3':
                sp_freq[3] = freq.f;
                tsi_timer.attach(&tsi_timer_irq, 1.0/freq.f); 
                sp_flag[TSI_ID] = 1;
                break;
        }
    }
    led2 = !led2;
    __enable_irq();
}

// LCD function
void display(int val){
    char buf[16];
    sprintf(buf,"%d%d%d",val/100,(val%100)/10,val%10);
    slcd.printf(buf);
    slcd.Home();
}