By Michael Wasko and Haoran Xiao
Dependencies: MAG3110 MMA8451Q SLCD TSI mbed
main.cpp@0:792bc968c89f, 2014-02-12 (annotated)
- Committer:
- HaoranX
- Date:
- Wed Feb 12 22:11:23 2014 +0000
- Revision:
- 0:792bc968c89f
v1
Who changed what in which revision?
User | Revision | Line number | New 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 | } |