By Michael Wasko and Haoran Xiao

Dependencies:   MAG3110 MMA8451Q SLCD TSI mbed

Files at this revision

API Documentation at this revision

Comitter:
HaoranX
Date:
Wed Feb 12 22:11:23 2014 +0000
Commit message:
v1

Changed in this revision

MAG3110.lib Show annotated file Show diff for this revision Revisions of this file
MMA8451Q.lib Show annotated file Show diff for this revision Revisions of this file
SLCD.lib Show annotated file Show diff for this revision Revisions of this file
TSI.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.lib Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 792bc968c89f MAG3110.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MAG3110.lib	Wed Feb 12 22:11:23 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/SomeRandomBloke/code/MAG3110/#cf40601402b7
diff -r 000000000000 -r 792bc968c89f MMA8451Q.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA8451Q.lib	Wed Feb 12 22:11:23 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/JoKer/code/MMA8451Q/#2d14600116fc
diff -r 000000000000 -r 792bc968c89f SLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SLCD.lib	Wed Feb 12 22:11:23 2014 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/Sissors/code/SLCD/#f70873bc6121
diff -r 000000000000 -r 792bc968c89f TSI.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TSI.lib	Wed Feb 12 22:11:23 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/vsluiter/code/TSI/#4dc2f5a3a731
diff -r 000000000000 -r 792bc968c89f main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Feb 12 22:11:23 2014 +0000
@@ -0,0 +1,190 @@
+#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();
+}
\ No newline at end of file
diff -r 000000000000 -r 792bc968c89f mbed.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.lib	Wed Feb 12 22:11:23 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/#824293ae5e43