it is a program reading sensor data and sending back to host
Dependencies: MAG3110 MMA8451Q TSI mbed
main.cpp
- Committer:
- yufat48
- Date:
- 2014-02-13
- Revision:
- 0:b9ec5c188bd7
File content as of revision 0:b9ec5c188bd7:
/* Author: Edoardo De Marchi * Name: Test Code for MMA7660FC */ #include "mbed.h" #include "MMA8451Q.h" #include "MAG3110.h" #include "TSISensor.h" #include <ctype.h> #define MMA8451_I2C_ADDRESS (0x1d<<1) // I2C SLAVE ADDR MMA7660FC #define buffer_size 255 Ticker lightsensor_tick; Ticker Mag_x_tick; Ticker Mag_y_tick; Ticker Mag_z_tick; Ticker Acc_x_tick; Ticker Acc_y_tick; Ticker Acc_z_tick; Ticker Touch_tick; float rate=1.0; int buff = 0; char buffer[32]; int sample_light = 1; MAG3110 mag(PTE25,PTE24); MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); //sda, scl, Addr TSISensor touch; Serial pc(USBTX, USBRX); AnalogIn lightsensor(PTE22); volatile int tx_in=0; volatile int tx_out=0; char tx_line[80]; char tx_buffer[buffer_size]; unsigned char c = ' '; float x=0, y=0, z=0, l=0, t=0; int mx, my, mz; void Tx_interrupt(); void send_line(); void sendInt(int x) { char *p = (char *)&x; pc.putc(*p); pc.putc(*(p+1)); pc.putc(*(p+2)); pc.putc(*(p+3)); } void sendFloat(float x) { char *p = (char *)&x; pc.putc(*p); pc.putc(*(p+1)); pc.putc(*(p+2)); pc.putc(*(p+3)); } void send_line() { int i; char temp_char; bool empty; i = 0; // Start Critical Section - don't interrupt while changing global buffer variables NVIC_DisableIRQ(UART1_IRQn); //_disable_irq(pc.RxIrq); empty = (tx_in == tx_out); while ((i==0) || (tx_line[i-1] != '\n')) { // Wait if buffer full if (((tx_in + 1) % buffer_size) == tx_out) { // End Critical Section - need to let interrupt routine empty buffer by sending NVIC_EnableIRQ(UART1_IRQn); while (((tx_in + 1) % buffer_size) == tx_out) { } // Start Critical Section - don't interrupt while changing global buffer variables NVIC_DisableIRQ(UART1_IRQn); } tx_buffer[tx_in] = tx_line[i]; i++; tx_in = (tx_in + 1) % buffer_size; } if (pc.writeable() && (empty)) { temp_char = tx_buffer[tx_out]; tx_out = (tx_out + 1) % buffer_size; // Send first character to start tx interrupts, if stopped pc.putc(temp_char); } // End Critical Section NVIC_EnableIRQ(UART1_IRQn); return; } void light_tick() { if(c == '1' || c=='9') { l = lightsensor.read(); pc.putc('1'); sendFloat(l); } return; } void mx_tick() { if(c=='2' || c=='9') { mag.getValues(&mx, &my, &mz); pc.putc('2'); sendInt(mx); } return; } void my_tick() { if(c=='3' || c=='9') { mag.getValues(&mx, &my, &mz); pc.putc('3'); sendInt(mz); } return; } void mz_tick() { if(c=='4' || c=='9') { mag.getValues(&mx, &my, &mz); pc.putc('4'); sendInt(my); } return; } void ax_tick() { if(c=='6' || c=='9') { x = acc.getAccX(); pc.putc('6'); sendFloat(x); } return; } void ay_tick() { if(c=='7' || c=='9') { y = acc.getAccY(); pc.putc('7'); sendFloat(y); } return; } void az_tick() { if(c=='8' || c=='9') { z = acc.getAccZ(); pc.putc('8'); sendFloat(z); } return; } void touch_tick() { if(c=='5'||c=='9') { t = touch.readPercentage(); pc.putc('5'); sendFloat(t); } return; } void receive_handler() { memset(buffer, 0 , sizeof(buffer)); buff=0; while (1) { buffer[buff] = pc.getc(); if (buffer[buff] == '\n' || buffer[buff] == '\r') { buff++; break; } buff++; } c = buffer[0]; int i = 1; rate = 0; while ((buffer[i]>='0') && (buffer[i]<='9')) { rate = rate*10 + buffer[i]-'0'; i++; if (buffer[i] == '\n' || buffer[i] == '\r') break; } //pc.putc(buffer[1]); //lightsensor_tick.detach(); switch (c) { case '0': lightsensor_tick.detach(); Mag_x_tick.detach(); Mag_y_tick.detach(); Mag_z_tick.detach(); Touch_tick.detach(); Acc_x_tick.detach(); Acc_y_tick.detach(); Acc_z_tick.detach(); break; case '1': lightsensor_tick.attach(&light_tick,1/rate); break; case '2': Mag_x_tick.attach(&mx_tick,1/rate); break; case '3': Mag_y_tick.attach(&my_tick,1/rate); break; case '4': Mag_z_tick.attach(&mz_tick,1/rate); break; case '5': Touch_tick.attach(&touch_tick,1/rate); break; case '6': Acc_x_tick.attach(&ax_tick,1/rate); break; case '7': Acc_y_tick.attach(&ay_tick,1/rate); break; case '8': Acc_z_tick.attach(&az_tick,1/rate); break; case '9': lightsensor_tick.attach(&light_tick,1/rate); Mag_x_tick.attach(&mx_tick,rate); Mag_y_tick.attach(&my_tick,1/rate); Mag_z_tick.attach(&mz_tick,1/rate); Acc_x_tick.attach(&ax_tick,1/rate); Acc_y_tick.attach(&ay_tick,1/rate); Acc_z_tick.attach(&az_tick,1/rate); Touch_tick.attach(&touch_tick,1/rate); break; } return; } int main() { pc.baud(9600); // Initialization // pc.attach(&keyInterrupt, pc.RxIrq); // Key In Interrupt pc.attach(&receive_handler,pc.RxIrq); //lightsensor_tick.attach(&light_tick,3); while(1) { } } void Tx_interrupt() { // Loop to fill more than one character in UART's transmit FIFO buffer // Stop if buffer empty while ((pc.writeable()) && (tx_in != tx_out)) { pc.putc(tx_buffer[tx_out]); tx_out = (tx_out + 1) % buffer_size; } return; }