it is a program reading sensor data and sending back to host

Dependencies:   MAG3110 MMA8451Q TSI mbed

Committer:
yufat48
Date:
Thu Feb 13 06:47:58 2014 +0000
Revision:
0:b9ec5c188bd7
it is a program reading sensor data and sending back to the host

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yufat48 0:b9ec5c188bd7 1 /* Author: Edoardo De Marchi
yufat48 0:b9ec5c188bd7 2 * Name: Test Code for MMA7660FC
yufat48 0:b9ec5c188bd7 3 */
yufat48 0:b9ec5c188bd7 4 #include "mbed.h"
yufat48 0:b9ec5c188bd7 5 #include "MMA8451Q.h"
yufat48 0:b9ec5c188bd7 6 #include "MAG3110.h"
yufat48 0:b9ec5c188bd7 7 #include "TSISensor.h"
yufat48 0:b9ec5c188bd7 8 #include <ctype.h>
yufat48 0:b9ec5c188bd7 9 #define MMA8451_I2C_ADDRESS (0x1d<<1) // I2C SLAVE ADDR MMA7660FC
yufat48 0:b9ec5c188bd7 10 #define buffer_size 255
yufat48 0:b9ec5c188bd7 11 Ticker lightsensor_tick;
yufat48 0:b9ec5c188bd7 12 Ticker Mag_x_tick;
yufat48 0:b9ec5c188bd7 13 Ticker Mag_y_tick;
yufat48 0:b9ec5c188bd7 14 Ticker Mag_z_tick;
yufat48 0:b9ec5c188bd7 15 Ticker Acc_x_tick;
yufat48 0:b9ec5c188bd7 16 Ticker Acc_y_tick;
yufat48 0:b9ec5c188bd7 17 Ticker Acc_z_tick;
yufat48 0:b9ec5c188bd7 18 Ticker Touch_tick;
yufat48 0:b9ec5c188bd7 19 float rate=1.0;
yufat48 0:b9ec5c188bd7 20 int buff = 0;
yufat48 0:b9ec5c188bd7 21 char buffer[32];
yufat48 0:b9ec5c188bd7 22 int sample_light = 1;
yufat48 0:b9ec5c188bd7 23 MAG3110 mag(PTE25,PTE24);
yufat48 0:b9ec5c188bd7 24 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); //sda, scl, Addr
yufat48 0:b9ec5c188bd7 25 TSISensor touch;
yufat48 0:b9ec5c188bd7 26 Serial pc(USBTX, USBRX);
yufat48 0:b9ec5c188bd7 27 AnalogIn lightsensor(PTE22);
yufat48 0:b9ec5c188bd7 28 volatile int tx_in=0;
yufat48 0:b9ec5c188bd7 29 volatile int tx_out=0;
yufat48 0:b9ec5c188bd7 30 char tx_line[80];
yufat48 0:b9ec5c188bd7 31 char tx_buffer[buffer_size];
yufat48 0:b9ec5c188bd7 32 unsigned char c = ' ';
yufat48 0:b9ec5c188bd7 33 float x=0, y=0, z=0, l=0, t=0;
yufat48 0:b9ec5c188bd7 34 int mx, my, mz;
yufat48 0:b9ec5c188bd7 35 void Tx_interrupt();
yufat48 0:b9ec5c188bd7 36 void send_line();
yufat48 0:b9ec5c188bd7 37 void sendInt(int x)
yufat48 0:b9ec5c188bd7 38 {
yufat48 0:b9ec5c188bd7 39 char *p = (char *)&x;
yufat48 0:b9ec5c188bd7 40 pc.putc(*p);
yufat48 0:b9ec5c188bd7 41 pc.putc(*(p+1));
yufat48 0:b9ec5c188bd7 42 pc.putc(*(p+2));
yufat48 0:b9ec5c188bd7 43 pc.putc(*(p+3));
yufat48 0:b9ec5c188bd7 44 }
yufat48 0:b9ec5c188bd7 45 void sendFloat(float x)
yufat48 0:b9ec5c188bd7 46 {
yufat48 0:b9ec5c188bd7 47 char *p = (char *)&x;
yufat48 0:b9ec5c188bd7 48 pc.putc(*p);
yufat48 0:b9ec5c188bd7 49 pc.putc(*(p+1));
yufat48 0:b9ec5c188bd7 50 pc.putc(*(p+2));
yufat48 0:b9ec5c188bd7 51 pc.putc(*(p+3));
yufat48 0:b9ec5c188bd7 52 }
yufat48 0:b9ec5c188bd7 53 void send_line()
yufat48 0:b9ec5c188bd7 54 {
yufat48 0:b9ec5c188bd7 55 int i;
yufat48 0:b9ec5c188bd7 56 char temp_char;
yufat48 0:b9ec5c188bd7 57 bool empty;
yufat48 0:b9ec5c188bd7 58 i = 0;
yufat48 0:b9ec5c188bd7 59 // Start Critical Section - don't interrupt while changing global buffer variables
yufat48 0:b9ec5c188bd7 60 NVIC_DisableIRQ(UART1_IRQn);
yufat48 0:b9ec5c188bd7 61 //_disable_irq(pc.RxIrq);
yufat48 0:b9ec5c188bd7 62 empty = (tx_in == tx_out);
yufat48 0:b9ec5c188bd7 63 while ((i==0) || (tx_line[i-1] != '\n'))
yufat48 0:b9ec5c188bd7 64 {
yufat48 0:b9ec5c188bd7 65 // Wait if buffer full
yufat48 0:b9ec5c188bd7 66 if (((tx_in + 1) % buffer_size) == tx_out)
yufat48 0:b9ec5c188bd7 67 {
yufat48 0:b9ec5c188bd7 68 // End Critical Section - need to let interrupt routine empty buffer by sending
yufat48 0:b9ec5c188bd7 69 NVIC_EnableIRQ(UART1_IRQn);
yufat48 0:b9ec5c188bd7 70 while (((tx_in + 1) % buffer_size) == tx_out)
yufat48 0:b9ec5c188bd7 71 {
yufat48 0:b9ec5c188bd7 72 }
yufat48 0:b9ec5c188bd7 73 // Start Critical Section - don't interrupt while changing global buffer variables
yufat48 0:b9ec5c188bd7 74 NVIC_DisableIRQ(UART1_IRQn);
yufat48 0:b9ec5c188bd7 75 }
yufat48 0:b9ec5c188bd7 76 tx_buffer[tx_in] = tx_line[i];
yufat48 0:b9ec5c188bd7 77 i++;
yufat48 0:b9ec5c188bd7 78 tx_in = (tx_in + 1) % buffer_size;
yufat48 0:b9ec5c188bd7 79 }
yufat48 0:b9ec5c188bd7 80 if (pc.writeable() && (empty)) {
yufat48 0:b9ec5c188bd7 81 temp_char = tx_buffer[tx_out];
yufat48 0:b9ec5c188bd7 82 tx_out = (tx_out + 1) % buffer_size;
yufat48 0:b9ec5c188bd7 83 // Send first character to start tx interrupts, if stopped
yufat48 0:b9ec5c188bd7 84 pc.putc(temp_char);
yufat48 0:b9ec5c188bd7 85 }
yufat48 0:b9ec5c188bd7 86 // End Critical Section
yufat48 0:b9ec5c188bd7 87 NVIC_EnableIRQ(UART1_IRQn);
yufat48 0:b9ec5c188bd7 88 return;
yufat48 0:b9ec5c188bd7 89 }
yufat48 0:b9ec5c188bd7 90 void light_tick()
yufat48 0:b9ec5c188bd7 91 {
yufat48 0:b9ec5c188bd7 92 if(c == '1' || c=='9')
yufat48 0:b9ec5c188bd7 93 {
yufat48 0:b9ec5c188bd7 94 l = lightsensor.read();
yufat48 0:b9ec5c188bd7 95 pc.putc('1');
yufat48 0:b9ec5c188bd7 96 sendFloat(l);
yufat48 0:b9ec5c188bd7 97 }
yufat48 0:b9ec5c188bd7 98
yufat48 0:b9ec5c188bd7 99 return;
yufat48 0:b9ec5c188bd7 100 }
yufat48 0:b9ec5c188bd7 101 void mx_tick()
yufat48 0:b9ec5c188bd7 102 {
yufat48 0:b9ec5c188bd7 103 if(c=='2' || c=='9')
yufat48 0:b9ec5c188bd7 104 {
yufat48 0:b9ec5c188bd7 105 mag.getValues(&mx, &my, &mz);
yufat48 0:b9ec5c188bd7 106 pc.putc('2');
yufat48 0:b9ec5c188bd7 107 sendInt(mx);
yufat48 0:b9ec5c188bd7 108 }
yufat48 0:b9ec5c188bd7 109 return;
yufat48 0:b9ec5c188bd7 110 }
yufat48 0:b9ec5c188bd7 111 void my_tick()
yufat48 0:b9ec5c188bd7 112 {
yufat48 0:b9ec5c188bd7 113 if(c=='3' || c=='9')
yufat48 0:b9ec5c188bd7 114 {
yufat48 0:b9ec5c188bd7 115 mag.getValues(&mx, &my, &mz);
yufat48 0:b9ec5c188bd7 116 pc.putc('3');
yufat48 0:b9ec5c188bd7 117 sendInt(mz);
yufat48 0:b9ec5c188bd7 118 }
yufat48 0:b9ec5c188bd7 119 return;
yufat48 0:b9ec5c188bd7 120 }
yufat48 0:b9ec5c188bd7 121 void mz_tick()
yufat48 0:b9ec5c188bd7 122 {
yufat48 0:b9ec5c188bd7 123 if(c=='4' || c=='9')
yufat48 0:b9ec5c188bd7 124 {
yufat48 0:b9ec5c188bd7 125 mag.getValues(&mx, &my, &mz);
yufat48 0:b9ec5c188bd7 126 pc.putc('4');
yufat48 0:b9ec5c188bd7 127 sendInt(my);
yufat48 0:b9ec5c188bd7 128 }
yufat48 0:b9ec5c188bd7 129 return;
yufat48 0:b9ec5c188bd7 130 }
yufat48 0:b9ec5c188bd7 131 void ax_tick()
yufat48 0:b9ec5c188bd7 132 {
yufat48 0:b9ec5c188bd7 133 if(c=='6' || c=='9')
yufat48 0:b9ec5c188bd7 134 {
yufat48 0:b9ec5c188bd7 135 x = acc.getAccX();
yufat48 0:b9ec5c188bd7 136 pc.putc('6');
yufat48 0:b9ec5c188bd7 137 sendFloat(x);
yufat48 0:b9ec5c188bd7 138 }
yufat48 0:b9ec5c188bd7 139 return;
yufat48 0:b9ec5c188bd7 140 }
yufat48 0:b9ec5c188bd7 141 void ay_tick()
yufat48 0:b9ec5c188bd7 142 {
yufat48 0:b9ec5c188bd7 143 if(c=='7' || c=='9')
yufat48 0:b9ec5c188bd7 144 {
yufat48 0:b9ec5c188bd7 145 y = acc.getAccY();
yufat48 0:b9ec5c188bd7 146 pc.putc('7');
yufat48 0:b9ec5c188bd7 147 sendFloat(y);
yufat48 0:b9ec5c188bd7 148 }
yufat48 0:b9ec5c188bd7 149 return;
yufat48 0:b9ec5c188bd7 150 }
yufat48 0:b9ec5c188bd7 151 void az_tick()
yufat48 0:b9ec5c188bd7 152 {
yufat48 0:b9ec5c188bd7 153 if(c=='8' || c=='9')
yufat48 0:b9ec5c188bd7 154 {
yufat48 0:b9ec5c188bd7 155 z = acc.getAccZ();
yufat48 0:b9ec5c188bd7 156 pc.putc('8');
yufat48 0:b9ec5c188bd7 157 sendFloat(z);
yufat48 0:b9ec5c188bd7 158 }
yufat48 0:b9ec5c188bd7 159 return;
yufat48 0:b9ec5c188bd7 160 }
yufat48 0:b9ec5c188bd7 161 void touch_tick()
yufat48 0:b9ec5c188bd7 162 {
yufat48 0:b9ec5c188bd7 163 if(c=='5'||c=='9')
yufat48 0:b9ec5c188bd7 164 {
yufat48 0:b9ec5c188bd7 165 t = touch.readPercentage();
yufat48 0:b9ec5c188bd7 166 pc.putc('5');
yufat48 0:b9ec5c188bd7 167 sendFloat(t);
yufat48 0:b9ec5c188bd7 168 }
yufat48 0:b9ec5c188bd7 169 return;
yufat48 0:b9ec5c188bd7 170 }
yufat48 0:b9ec5c188bd7 171 void receive_handler()
yufat48 0:b9ec5c188bd7 172 {
yufat48 0:b9ec5c188bd7 173 memset(buffer, 0 , sizeof(buffer));
yufat48 0:b9ec5c188bd7 174 buff=0;
yufat48 0:b9ec5c188bd7 175 while (1)
yufat48 0:b9ec5c188bd7 176 {
yufat48 0:b9ec5c188bd7 177 buffer[buff] = pc.getc();
yufat48 0:b9ec5c188bd7 178 if (buffer[buff] == '\n' || buffer[buff] == '\r')
yufat48 0:b9ec5c188bd7 179 {
yufat48 0:b9ec5c188bd7 180 buff++;
yufat48 0:b9ec5c188bd7 181
yufat48 0:b9ec5c188bd7 182 break;
yufat48 0:b9ec5c188bd7 183 }
yufat48 0:b9ec5c188bd7 184 buff++;
yufat48 0:b9ec5c188bd7 185 }
yufat48 0:b9ec5c188bd7 186 c = buffer[0];
yufat48 0:b9ec5c188bd7 187 int i = 1;
yufat48 0:b9ec5c188bd7 188 rate = 0;
yufat48 0:b9ec5c188bd7 189 while ((buffer[i]>='0') && (buffer[i]<='9'))
yufat48 0:b9ec5c188bd7 190 {
yufat48 0:b9ec5c188bd7 191 rate = rate*10 + buffer[i]-'0';
yufat48 0:b9ec5c188bd7 192 i++;
yufat48 0:b9ec5c188bd7 193 if (buffer[i] == '\n' || buffer[i] == '\r')
yufat48 0:b9ec5c188bd7 194 break;
yufat48 0:b9ec5c188bd7 195 }
yufat48 0:b9ec5c188bd7 196 //pc.putc(buffer[1]);
yufat48 0:b9ec5c188bd7 197 //lightsensor_tick.detach();
yufat48 0:b9ec5c188bd7 198 switch (c)
yufat48 0:b9ec5c188bd7 199 {
yufat48 0:b9ec5c188bd7 200 case '0':
yufat48 0:b9ec5c188bd7 201 lightsensor_tick.detach();
yufat48 0:b9ec5c188bd7 202 Mag_x_tick.detach();
yufat48 0:b9ec5c188bd7 203 Mag_y_tick.detach();
yufat48 0:b9ec5c188bd7 204 Mag_z_tick.detach();
yufat48 0:b9ec5c188bd7 205 Touch_tick.detach();
yufat48 0:b9ec5c188bd7 206 Acc_x_tick.detach();
yufat48 0:b9ec5c188bd7 207 Acc_y_tick.detach();
yufat48 0:b9ec5c188bd7 208 Acc_z_tick.detach();
yufat48 0:b9ec5c188bd7 209 break;
yufat48 0:b9ec5c188bd7 210 case '1': lightsensor_tick.attach(&light_tick,1/rate);
yufat48 0:b9ec5c188bd7 211 break;
yufat48 0:b9ec5c188bd7 212 case '2': Mag_x_tick.attach(&mx_tick,1/rate);
yufat48 0:b9ec5c188bd7 213 break;
yufat48 0:b9ec5c188bd7 214 case '3':
yufat48 0:b9ec5c188bd7 215 Mag_y_tick.attach(&my_tick,1/rate);
yufat48 0:b9ec5c188bd7 216 break;
yufat48 0:b9ec5c188bd7 217 case '4':
yufat48 0:b9ec5c188bd7 218 Mag_z_tick.attach(&mz_tick,1/rate);
yufat48 0:b9ec5c188bd7 219 break;
yufat48 0:b9ec5c188bd7 220 case '5': Touch_tick.attach(&touch_tick,1/rate);
yufat48 0:b9ec5c188bd7 221 break;
yufat48 0:b9ec5c188bd7 222 case '6':
yufat48 0:b9ec5c188bd7 223 Acc_x_tick.attach(&ax_tick,1/rate);
yufat48 0:b9ec5c188bd7 224 break;
yufat48 0:b9ec5c188bd7 225 case '7':
yufat48 0:b9ec5c188bd7 226 Acc_y_tick.attach(&ay_tick,1/rate);
yufat48 0:b9ec5c188bd7 227 break;
yufat48 0:b9ec5c188bd7 228 case '8':
yufat48 0:b9ec5c188bd7 229 Acc_z_tick.attach(&az_tick,1/rate);
yufat48 0:b9ec5c188bd7 230 break;
yufat48 0:b9ec5c188bd7 231 case '9':
yufat48 0:b9ec5c188bd7 232 lightsensor_tick.attach(&light_tick,1/rate);
yufat48 0:b9ec5c188bd7 233 Mag_x_tick.attach(&mx_tick,rate);
yufat48 0:b9ec5c188bd7 234 Mag_y_tick.attach(&my_tick,1/rate);
yufat48 0:b9ec5c188bd7 235 Mag_z_tick.attach(&mz_tick,1/rate);
yufat48 0:b9ec5c188bd7 236 Acc_x_tick.attach(&ax_tick,1/rate);
yufat48 0:b9ec5c188bd7 237 Acc_y_tick.attach(&ay_tick,1/rate);
yufat48 0:b9ec5c188bd7 238 Acc_z_tick.attach(&az_tick,1/rate);
yufat48 0:b9ec5c188bd7 239 Touch_tick.attach(&touch_tick,1/rate);
yufat48 0:b9ec5c188bd7 240 break;
yufat48 0:b9ec5c188bd7 241 }
yufat48 0:b9ec5c188bd7 242 return;
yufat48 0:b9ec5c188bd7 243 }
yufat48 0:b9ec5c188bd7 244 int main()
yufat48 0:b9ec5c188bd7 245 {
yufat48 0:b9ec5c188bd7 246 pc.baud(9600); // Initialization
yufat48 0:b9ec5c188bd7 247 // pc.attach(&keyInterrupt, pc.RxIrq); // Key In Interrupt
yufat48 0:b9ec5c188bd7 248 pc.attach(&receive_handler,pc.RxIrq);
yufat48 0:b9ec5c188bd7 249 //lightsensor_tick.attach(&light_tick,3);
yufat48 0:b9ec5c188bd7 250
yufat48 0:b9ec5c188bd7 251
yufat48 0:b9ec5c188bd7 252
yufat48 0:b9ec5c188bd7 253 while(1)
yufat48 0:b9ec5c188bd7 254 {
yufat48 0:b9ec5c188bd7 255 }
yufat48 0:b9ec5c188bd7 256
yufat48 0:b9ec5c188bd7 257 }
yufat48 0:b9ec5c188bd7 258 void Tx_interrupt() {
yufat48 0:b9ec5c188bd7 259 // Loop to fill more than one character in UART's transmit FIFO buffer
yufat48 0:b9ec5c188bd7 260 // Stop if buffer empty
yufat48 0:b9ec5c188bd7 261 while ((pc.writeable()) && (tx_in != tx_out)) {
yufat48 0:b9ec5c188bd7 262 pc.putc(tx_buffer[tx_out]);
yufat48 0:b9ec5c188bd7 263 tx_out = (tx_out + 1) % buffer_size;
yufat48 0:b9ec5c188bd7 264 }
yufat48 0:b9ec5c188bd7 265 return;
yufat48 0:b9ec5c188bd7 266 }