By Michael Wasko and Haoran Xiao

Dependencies:   MAG3110 MMA8451Q SLCD TSI mbed

Committer:
HaoranX
Date:
Wed Feb 12 22:11:23 2014 +0000
Revision:
0:792bc968c89f
v1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HaoranX 0:792bc968c89f 1 #include "mbed.h"
HaoranX 0:792bc968c89f 2 #include "MMA8451Q.h"
HaoranX 0:792bc968c89f 3 #include "MAG3110.h"
HaoranX 0:792bc968c89f 4 #include "TSISensor.h"
HaoranX 0:792bc968c89f 5 #include "SLCD.h"
HaoranX 0:792bc968c89f 6
HaoranX 0:792bc968c89f 7 #define ACC_ID 0
HaoranX 0:792bc968c89f 8 #define MAG_ID 1
HaoranX 0:792bc968c89f 9 #define ADC_ID 2
HaoranX 0:792bc968c89f 10 #define TSI_ID 3
HaoranX 0:792bc968c89f 11 #define NUM_OF_SENSOR 4
HaoranX 0:792bc968c89f 12
HaoranX 0:792bc968c89f 13 union Serial_Float{
HaoranX 0:792bc968c89f 14 float f;
HaoranX 0:792bc968c89f 15 char bt[4];
HaoranX 0:792bc968c89f 16 };
HaoranX 0:792bc968c89f 17
HaoranX 0:792bc968c89f 18 union Serial_Int{
HaoranX 0:792bc968c89f 19 int i;
HaoranX 0:792bc968c89f 20 char bt[4];
HaoranX 0:792bc968c89f 21 };
HaoranX 0:792bc968c89f 22
HaoranX 0:792bc968c89f 23 typedef union _data {
HaoranX 0:792bc968c89f 24 float f;
HaoranX 0:792bc968c89f 25 char s[4];
HaoranX 0:792bc968c89f 26 } myData;
HaoranX 0:792bc968c89f 27
HaoranX 0:792bc968c89f 28 Serial pc(USBTX, USBRX);
HaoranX 0:792bc968c89f 29 MMA8451Q acc(PTE25,PTE24,0x1d<<1);
HaoranX 0:792bc968c89f 30 MAG3110 mag(PTE25,PTE24);
HaoranX 0:792bc968c89f 31 AnalogIn adc(PTE30);
HaoranX 0:792bc968c89f 32 TSISensor tsi;
HaoranX 0:792bc968c89f 33 SLCD slcd;
HaoranX 0:792bc968c89f 34 DigitalOut led2(LED2);
HaoranX 0:792bc968c89f 35 bool sirq_flags[NUM_OF_SENSOR] = {0}; // interrupt flags
HaoranX 0:792bc968c89f 36 int SR = 0; // total sampling rate
HaoranX 0:792bc968c89f 37
HaoranX 0:792bc968c89f 38 void send(float data, int id);
HaoranX 0:792bc968c89f 39 void send(int data, int id);
HaoranX 0:792bc968c89f 40 void read_cmd();
HaoranX 0:792bc968c89f 41 void display(int val);
HaoranX 0:792bc968c89f 42
HaoranX 0:792bc968c89f 43 Ticker acc_timer;
HaoranX 0:792bc968c89f 44 Ticker mag_timer;
HaoranX 0:792bc968c89f 45 Ticker adc_timer;
HaoranX 0:792bc968c89f 46 Ticker tsi_timer;
HaoranX 0:792bc968c89f 47 void acc_timer_irq();
HaoranX 0:792bc968c89f 48 void mag_timer_irq();
HaoranX 0:792bc968c89f 49 void adc_timer_irq();
HaoranX 0:792bc968c89f 50 void tsi_timer_irq();
HaoranX 0:792bc968c89f 51
HaoranX 0:792bc968c89f 52 // initial sampling frequency:
HaoranX 0:792bc968c89f 53 float sp_freq[NUM_OF_SENSOR] = {1,1,1,1};
HaoranX 0:792bc968c89f 54 // current sensor states:
HaoranX 0:792bc968c89f 55 int sp_flag[NUM_OF_SENSOR] = {0};
HaoranX 0:792bc968c89f 56
HaoranX 0:792bc968c89f 57 int main(){
HaoranX 0:792bc968c89f 58 // Initialize sampling rate for display
HaoranX 0:792bc968c89f 59 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];
HaoranX 0:792bc968c89f 60 led2 = 1;
HaoranX 0:792bc968c89f 61 // set baud rate to 460800
HaoranX 0:792bc968c89f 62 pc.baud(460800);
HaoranX 0:792bc968c89f 63 // display current sampling rate on LCD
HaoranX 0:792bc968c89f 64 display(SR);
HaoranX 0:792bc968c89f 65 while(1){
HaoranX 0:792bc968c89f 66 // check requests, execute and clear
HaoranX 0:792bc968c89f 67 if(sirq_flags[ACC_ID]){
HaoranX 0:792bc968c89f 68 send(acc.getAccX(),0);
HaoranX 0:792bc968c89f 69 send(acc.getAccY(),1);
HaoranX 0:792bc968c89f 70 send(acc.getAccZ(),2);
HaoranX 0:792bc968c89f 71 sirq_flags[ACC_ID] = 0;
HaoranX 0:792bc968c89f 72 }
HaoranX 0:792bc968c89f 73 if(sirq_flags[MAG_ID]){
HaoranX 0:792bc968c89f 74 send(mag.readVal(0x1d),3);
HaoranX 0:792bc968c89f 75 sirq_flags[MAG_ID] = 0;
HaoranX 0:792bc968c89f 76 }
HaoranX 0:792bc968c89f 77 if(sirq_flags[ADC_ID]){
HaoranX 0:792bc968c89f 78 send(float(adc.read()*3.3),4);
HaoranX 0:792bc968c89f 79 sirq_flags[ADC_ID] = 0;
HaoranX 0:792bc968c89f 80 }
HaoranX 0:792bc968c89f 81 if(sirq_flags[TSI_ID]){
HaoranX 0:792bc968c89f 82 send(tsi.readPercentage(),5);
HaoranX 0:792bc968c89f 83 sirq_flags[TSI_ID] = 0;
HaoranX 0:792bc968c89f 84 }
HaoranX 0:792bc968c89f 85 if(pc.readable()){
HaoranX 0:792bc968c89f 86 read_cmd();
HaoranX 0:792bc968c89f 87 // refresh current sampling rate after the command is read:
HaoranX 0:792bc968c89f 88 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];
HaoranX 0:792bc968c89f 89 display(SR);
HaoranX 0:792bc968c89f 90 }
HaoranX 0:792bc968c89f 91 }
HaoranX 0:792bc968c89f 92 }
HaoranX 0:792bc968c89f 93
HaoranX 0:792bc968c89f 94 // interrupt functions for each ticker
HaoranX 0:792bc968c89f 95 void acc_timer_irq(){
HaoranX 0:792bc968c89f 96 sirq_flags[ACC_ID] = 1;
HaoranX 0:792bc968c89f 97 }
HaoranX 0:792bc968c89f 98 void mag_timer_irq(){
HaoranX 0:792bc968c89f 99 sirq_flags[MAG_ID] = 1;
HaoranX 0:792bc968c89f 100 }
HaoranX 0:792bc968c89f 101 void adc_timer_irq(){
HaoranX 0:792bc968c89f 102 sirq_flags[ADC_ID] = 1;
HaoranX 0:792bc968c89f 103 }
HaoranX 0:792bc968c89f 104 void tsi_timer_irq(){
HaoranX 0:792bc968c89f 105 sirq_flags[TSI_ID] = 1;
HaoranX 0:792bc968c89f 106 }
HaoranX 0:792bc968c89f 107
HaoranX 0:792bc968c89f 108 // serial write (overloaded with different data type)
HaoranX 0:792bc968c89f 109 void send(float data,int id){
HaoranX 0:792bc968c89f 110 Serial_Float srdata;
HaoranX 0:792bc968c89f 111 srdata.f = data;
HaoranX 0:792bc968c89f 112 for(int i = 0; i < 4; i++)
HaoranX 0:792bc968c89f 113 pc.putc(srdata.bt[i]);
HaoranX 0:792bc968c89f 114 pc.putc('0'+id);
HaoranX 0:792bc968c89f 115 }
HaoranX 0:792bc968c89f 116 void send(int data, int id){
HaoranX 0:792bc968c89f 117 Serial_Int srdata;
HaoranX 0:792bc968c89f 118 srdata.i = data;
HaoranX 0:792bc968c89f 119 for(int i = 0; i < 4; i++)
HaoranX 0:792bc968c89f 120 pc.putc(srdata.bt[i]);
HaoranX 0:792bc968c89f 121 pc.putc('0'+id);
HaoranX 0:792bc968c89f 122 }
HaoranX 0:792bc968c89f 123
HaoranX 0:792bc968c89f 124 // read command
HaoranX 0:792bc968c89f 125 void read_cmd(){
HaoranX 0:792bc968c89f 126 __disable_irq();
HaoranX 0:792bc968c89f 127 led2 = !led2;
HaoranX 0:792bc968c89f 128 char op; char id; myData freq;
HaoranX 0:792bc968c89f 129 while(pc.readable()){//Flush input
HaoranX 0:792bc968c89f 130 pc.getc();
HaoranX 0:792bc968c89f 131 }
HaoranX 0:792bc968c89f 132 pc.putc('r'); //confirm ready
HaoranX 0:792bc968c89f 133 op = pc.getc(); // get operation
HaoranX 0:792bc968c89f 134 id = pc.getc(); // get sensor id
HaoranX 0:792bc968c89f 135 if(op == 'c') {
HaoranX 0:792bc968c89f 136 if (id == '0'){
HaoranX 0:792bc968c89f 137 acc_timer.detach();
HaoranX 0:792bc968c89f 138 sp_flag[ACC_ID] = 0;
HaoranX 0:792bc968c89f 139 }
HaoranX 0:792bc968c89f 140 else if (id == '1'){
HaoranX 0:792bc968c89f 141 mag_timer.detach();
HaoranX 0:792bc968c89f 142 sp_flag[MAG_ID] = 0;
HaoranX 0:792bc968c89f 143 }
HaoranX 0:792bc968c89f 144 else if (id == '2'){
HaoranX 0:792bc968c89f 145 adc_timer.detach();
HaoranX 0:792bc968c89f 146 sp_flag[ADC_ID] = 0;
HaoranX 0:792bc968c89f 147 }
HaoranX 0:792bc968c89f 148 else if (id == '3'){
HaoranX 0:792bc968c89f 149 tsi_timer.detach();
HaoranX 0:792bc968c89f 150 sp_flag[TSI_ID] = 0;
HaoranX 0:792bc968c89f 151 }
HaoranX 0:792bc968c89f 152 }
HaoranX 0:792bc968c89f 153 if(op == 'o') {
HaoranX 0:792bc968c89f 154 for (int i=0; i<4; i++) {
HaoranX 0:792bc968c89f 155 freq.s[i] = pc.getc();
HaoranX 0:792bc968c89f 156 }
HaoranX 0:792bc968c89f 157 switch(id){
HaoranX 0:792bc968c89f 158 case '0':
HaoranX 0:792bc968c89f 159 sp_freq[0] = freq.f;
HaoranX 0:792bc968c89f 160 acc_timer.attach(&acc_timer_irq, 1.0/freq.f);
HaoranX 0:792bc968c89f 161 sp_flag[ACC_ID] = 1;
HaoranX 0:792bc968c89f 162 break;
HaoranX 0:792bc968c89f 163 case '1':
HaoranX 0:792bc968c89f 164 sp_freq[1] = freq.f;
HaoranX 0:792bc968c89f 165 mag_timer.attach(&mag_timer_irq, 1.0/freq.f);
HaoranX 0:792bc968c89f 166 sp_flag[MAG_ID] = 1;
HaoranX 0:792bc968c89f 167 break;
HaoranX 0:792bc968c89f 168 case '2':
HaoranX 0:792bc968c89f 169 sp_freq[2] = freq.f;
HaoranX 0:792bc968c89f 170 adc_timer.attach(&adc_timer_irq, 1.0/freq.f);
HaoranX 0:792bc968c89f 171 sp_flag[ADC_ID] = 1;
HaoranX 0:792bc968c89f 172 break;
HaoranX 0:792bc968c89f 173 case '3':
HaoranX 0:792bc968c89f 174 sp_freq[3] = freq.f;
HaoranX 0:792bc968c89f 175 tsi_timer.attach(&tsi_timer_irq, 1.0/freq.f);
HaoranX 0:792bc968c89f 176 sp_flag[TSI_ID] = 1;
HaoranX 0:792bc968c89f 177 break;
HaoranX 0:792bc968c89f 178 }
HaoranX 0:792bc968c89f 179 }
HaoranX 0:792bc968c89f 180 led2 = !led2;
HaoranX 0:792bc968c89f 181 __enable_irq();
HaoranX 0:792bc968c89f 182 }
HaoranX 0:792bc968c89f 183
HaoranX 0:792bc968c89f 184 // LCD function
HaoranX 0:792bc968c89f 185 void display(int val){
HaoranX 0:792bc968c89f 186 char buf[16];
HaoranX 0:792bc968c89f 187 sprintf(buf,"%d%d%d",val/100,(val%100)/10,val%10);
HaoranX 0:792bc968c89f 188 slcd.printf(buf);
HaoranX 0:792bc968c89f 189 slcd.Home();
HaoranX 0:792bc968c89f 190 }