Swimate V2 without RTOS code

Dependencies:   Adafruit_GFX_128x64 DS3231 PinDetect SDFileSystem USBDevice mbed RealtimeMath MODSERIAL

Files at this revision

API Documentation at this revision

Comitter:
ellingjp
Date:
Sat May 17 01:20:31 2014 +0000
Parent:
4:b962f5a783a1
Child:
8:8430a5c0914c
Commit message:
Refactor -- introduced bug that causes garbage to be received from mpu

Changed in this revision

RingBuffer.lib Show diff for this revision Revisions of this file
debug.cpp Show annotated file Show diff for this revision Revisions of this file
debug.h 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
main.h Show annotated file Show diff for this revision Revisions of this file
receive_data.cpp Show annotated file Show diff for this revision Revisions of this file
receive_data.h Show annotated file Show diff for this revision Revisions of this file
shared.h Show annotated file Show diff for this revision Revisions of this file
--- a/RingBuffer.lib	Mon May 12 18:52:45 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/okini3939/code/RingBuffer/#bc363775c3eb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debug.cpp	Sat May 17 01:20:31 2014 +0000
@@ -0,0 +1,7 @@
+#include "mbed.h"
+#include "USBSerial.h"
+
+#ifndef NDEBUG
+DigitalOut led(LED1);
+USBSerial pc;
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debug.h	Sat May 17 01:20:31 2014 +0000
@@ -0,0 +1,35 @@
+#ifndef _DEBUG_H
+#define _DEBUG_H
+
+#include "mbed.h"
+#include "USBSerial.h"
+
+#define DMP_ERROR_RATE 1
+#define SD_ERROR_RATE 2
+
+//#define NDEBUG
+#ifndef NDEBUG
+    /************ On-board LED Access      ****************/
+    extern DigitalOut led;
+    #define DIE(x) while (1) {led = !led; wait(x);} // Halt program and flash led x times /s
+    
+    /************ PC Serial Print Commands ****************/
+    extern USBSerial pc;
+    #define PC_PRINT(x) pc.printf("%s", x);
+    #define PC_PRINTF(x,y) pc.printf(x, y);
+    #define PC_PRINTLN(x) pc.printf("%s\r\n", x);
+    #define PC_PRINTLNF(x,y) pc.printf(x,y); pc.printf("\r\n");
+    #define PC_PRINTR(x) pc.printf("%s\r",x);
+    #define PC_PRINTFR(x,y) pc.printf(x,y); pc.printf("\r");
+#else
+    #define DIE(x)
+
+    #define PC_PRINT(x)
+    #define PC_PRINTF(x,y)
+    #define PC_PRINTLN(x)
+    #define PC_PRINTLNF(x,y)
+    #define PC_PRINTR(x)
+    #define PC_PRINTFR(x,y)
+#endif
+
+#endif // _DEBUG_H
\ No newline at end of file
--- a/main.cpp	Mon May 12 18:52:45 2014 +0000
+++ b/main.cpp	Sat May 17 01:20:31 2014 +0000
@@ -2,13 +2,9 @@
 #include "mbed.h"
 #include "USBSerial.h"
 #include "Adafruit_SSD1306.h"
-#include "MPU6050_6Axis_MotionApps20.h"
 #include "SDFileSystem.h"
-
-//Virtual serial port over USB
-#ifdef PC_DEBUG
-USBSerial pc;
-#endif
+#include "receive_data.h"
+#include "debug.h"
 
 // Display
 #ifdef OLED_DEBUG
@@ -16,16 +12,9 @@
 Adafruit_SSD1306 oled(spi0, P0_11, P0_12, P0_13); // DC, RST, CS
 #endif
 
-// MPU
-MPU6050 mpu;
-InterruptIn dataReady(P0_15);
-
 // SD Card
 SDFileSystem sd(P0_21, P0_22, P1_15, P1_19, "sd"); // MOSI, MISO, SCLK, SSEL SPI1
 
-// LED for debug
-DigitalOut led(LED1);
-
 // Logging vars
 FILE *logFile;
 
@@ -41,47 +30,6 @@
 enum state {IDLE, CAPTURE};
 enum state State;
 
-// MPU control/status vars
-bool dmpReady = false;  // set true if DMP init was successful
-uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
-uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
-uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
-uint16_t fifoCount;     // count of all bytes currently in FIFO
-uint8_t fifoBuffer[64]; // FIFO storage buffer
-
-// orientation/motion vars
-Quaternion q;           // [w, x, y, z]         quaternion container
-VectorInt16 aa;         // [x, y, z]            accel sensor measurements
-VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
-VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
-VectorFloat gravity;    // [x, y, z]            gravity vector
-float euler[3];         // [psi, theta, phi]    Euler angle container
-float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector
-
-// Forward declarations
-void die(int flash_rate_s);
-bool log_open();
-void log_data(VectorInt16 data, Quaternion q);
-void log_close();
-void mpu_init();
-void get_data();
-
-volatile bool mpuInterrupt = false;
-void dataReadyISR() {
-    mpuInterrupt = true;
-}
-
-//void captureSwitchISR() {
-//    // used for debouncing
-//    static int prev_time = 0;
-//
-//    if (totalTime.read_ms() - prev_time < 200)
-//        return;
-//        
-//    State = (State == IDLE) ? CAPTURE : IDLE;
-//    prev_time = totalTime.read_ms();
-//}
-
 void captureSwitchISR() {
     // used for debouncing
     static int prev_time = 0;
@@ -104,132 +52,36 @@
     captureSwitch.mode(PullUp);
     captureSwitch.rise(captureSwitchISR);   
     
-    OLED_PRINTP("Waiting to capture.     ",0,0);
     while (true) {
-        if (State == CAPTURE) {
-            PC_PRINTLN("Start capture button pressed!");
-            OLED_CLEAR();
-            OLED_PRINTPR("Starting capture.       ",0,0);
-            
-            // Start receiving data
-            PC_PRINTLN("Opening log file...");
-            if (!log_open()) {
-                OLED_CLEAR();
-                OLED_PRINTP("ERROR: SD (retry)", 0, 50);
-                State = IDLE;
-                continue;
+        if (State == IDLE){
+            PC_PRINT("Idling\r");
+        } else if (State == CAPTURE) {
+            receive_init();
+            while (State == CAPTURE) {
+                __disable_irq();
+                receive_data();
+                __enable_irq();
             }
-            
-            PC_PRINTLN("Initializing MPU...");
-            mpu_init();
-            
-            PC_PRINTLN("Starting capture...");
-            OLED_PRINTPR("Capturing data...       ",0,0);
-            captureTime.start();
-            while (State == CAPTURE)
-                get_data();
-            OLED_PRINTPR("Finished capture.",0,0);
-            
-            log_close();
-            captureTime.stop();
-            captureTime.reset();
-        }
-    
-        PC_PRINTLN("Idling...");
-    }
-}
-
-/* Halts program and flashes LED at specified rate */
-void die(int flash_rate_s) {
-    while (1) {
-        led = 1;
-        wait(flash_rate_s/2);
-        led = 0;
-        wait(flash_rate_s/2);
+            // data = receive_data();
+            // log_data(data);
+            // split = get_split(data);
+            // display_split;
+        } 
+        // else if (State == SYNC) {
+        // begin_sync();
+        // }
     }
 }
 
-/* Returns false on failure, true otherwise */
-bool log_open() {
-    logFile = fopen(LOG_FILE, "a");
-    if (logFile == NULL) {
-        PC_PRINTLNF("SD card initialization error: Failed to open %s", LOG_FILE);
-        return false;
-    }
-    fprintf(logFile, "---- BEGIN NEW DATASET ----\n");
-    return true;
-}
 
-void log_close() {
-    if (logFile != NULL)
-        fclose(logFile);
-}
-
-void mpu_init() {
-    PC_PRINTLN("Initializing MPU");
-    mpu.initialize();
-    devStatus = mpu.dmpInitialize();
-    
-    if (devStatus == 0) {
-        mpu.setDMPEnabled(true);
-        packetSize = mpu.dmpGetFIFOPacketSize();
-        
-        PC_PRINTLN("DMP Initialized successfully!");
-        dmpReady = true;
-        dataReady.rise(dataReadyISR);
-    } else { // ERROR
-        PC_PRINTLNF("Error initializing MPU (code %d)", devStatus);
-        die(DMP_ERROR_RATE);
-    }
-}
 
-/* Requires the log to be open and mpu to be initialized*/
-void get_data() {
-    static uint32_t n_overflows = 0;
-    //while (true) {
-        //if (!dmpReady) break;   // do nothing if dmp not ready
-        if (!dmpReady) return;
-        
-        while (!mpuInterrupt && fifoCount < packetSize);
-        
-        // Reset interrupt
-        mpuInterrupt = false;
-        mpuIntStatus = mpu.getIntStatus();
-
-        // get current FIFO count
-        fifoCount = mpu.getFIFOCount();
-    
-        // check for overflow (this should never happen unless our code is too inefficient)
-        if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
-            PC_PRINTLNF("**** FIFO OVERFLOW @ %d ms ****", captureTime.read_ms());
-            n_overflows++;
-            // reset so we can continue cleanly
-            mpu.resetFIFO();
-            // otherwise, check for DMP data ready interrupt (this should happen frequently)
-        } else if (mpuIntStatus & 0x02) {
-            // Wait for a full packet - should be very short wait
-            while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
-    
-            // read a packet from FIFO
-            mpu.getFIFOBytes(fifoBuffer, packetSize);
-            fifoCount -= packetSize;
-            
-            // Get acceleration data
-            mpu.dmpGetAccel(&aa, fifoBuffer);
-            mpu.dmpGetQuaternion(&q, fifoBuffer);
-//            mpu.dmpGetGravity(&gravity, &q);
-//            mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
-//            mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q);
-            
-            PC_PRINTF("%d, ", aaWorld.x); PC_PRINTF("%d, ", aaWorld.y); PC_PRINTLNF("%d", aaWorld.z);
-            
-//            OLED_SETCURS(0, 10); OLED_PRINTF("%d, ", aaWorld.x); OLED_PRINTF("%d, ", aaWorld.y); OLED_PRINTLNF("%d", aaWorld.z);
-            
-            fprintf(logFile, "%u,%d,%d,%d,%f,%f,%f,%f,%u\n", captureTime.read_ms(), aa.x, aa.y, aa.z, q.x, q.y, q.z, q.w, n_overflows);
-        //}
-    }
-}
-
-void log_data(VectorInt16 data, Quaternion q) {
-    fprintf(logFile, "%d,%d,%d,%d,%f,%f,%f,%f\n", captureTime.read_ms(), data.x, data.y, data.z, q.x, q.y, q.z, q.w);
-}
\ No newline at end of file
+/* Returns false on failure, true otherwise */
+//bool log_open() {
+//    logFile = fopen(LOG_FILE, "a");
+//    if (logFile == NULL) {
+//        PC_PRINTLNF("SD card initialization error: Failed to open %s", LOG_FILE);
+//        return false;
+//    }
+//    fprintf(logFile, "---- BEGIN NEW DATASET ----\n");
+//    return true;
+//}
\ No newline at end of file
--- a/main.h	Mon May 12 18:52:45 2014 +0000
+++ b/main.h	Sat May 17 01:20:31 2014 +0000
@@ -1,26 +1,6 @@
-#define DMP_ERROR_RATE 1
-#define SD_ERROR_RATE 2
-
 #define LOG_FILE "/sd/data.log"
 
-//#define PC_DEBUG
-#ifdef PC_DEBUG
-    #define PC_PRINT(x) pc.printf("%s", x);
-    #define PC_PRINTF(x,y) pc.printf(x, y);
-    #define PC_PRINTLN(x) pc.printf("%s\r\n", x);
-    #define PC_PRINTLNF(x,y) pc.printf(x,y); pc.printf("\r\n");
-    #define PC_PRINTR(x) pc.printf("%s\r",x);
-    #define PC_PRINTFR(x,y) pc.printf(x,y); pc.printf("\r");
-#else
-    #define PC_PRINT(x)
-    #define PC_PRINTF(x,y)
-    #define PC_PRINTLN(x)
-    #define PC_PRINTLNF(x,y)
-    #define PC_PRINTR(x)
-    #define PC_PRINTFR(x,y)
-#endif
-
-#define OLED_DEBUG
+// #define OLED_DEBUG
 #ifdef OLED_DEBUG
     #define OLED_SETCURS(xpos,ypos) oled.setCursor(xpos,ypos);
     #define OLED_CLEAR() oled.clearDisplay();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/receive_data.cpp	Sat May 17 01:20:31 2014 +0000
@@ -0,0 +1,97 @@
+#include "mbed.h"
+#include "MPU6050_6Axis_MotionApps20.h"
+#include "debug.h"
+
+// MPU
+MPU6050 mpu;
+InterruptIn dataReady(P0_15);
+
+// MPU control/status vars
+bool dmpReady = false;  // set true if DMP init was successful
+uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
+uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
+uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
+uint16_t fifoCount;     // count of all bytes currently in FIFO
+uint8_t fifoBuffer[64]; // FIFO storage buffer
+
+// orientation/motion vars
+Quaternion q;           // [w, x, y, z]         quaternion container
+VectorInt16 aa;         // [x, y, z]            accel sensor measurements
+VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
+VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
+VectorFloat gravity;    // [x, y, z]            gravity vector
+float euler[3];         // [psi, theta, phi]    Euler angle container
+float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector
+
+volatile bool mpuInterrupt = false;
+void dataReadyISR() {
+    mpuInterrupt = true;
+}
+
+/* Returns a pointer to an array containing the most recent data, otherwise NULL.  Requires the mpu to be initialized. */
+void receive_data()
+{
+    static uint32_t n_overflows = 0;
+//    while (true) {
+    //if (!dmpReady) break;   // do nothing if dmp not ready
+    if (!dmpReady) return;
+
+    while (!mpuInterrupt && fifoCount < packetSize);
+
+    // Reset interrupt
+    mpuInterrupt = false;
+    mpuIntStatus = mpu.getIntStatus();
+
+    // get current FIFO count
+    fifoCount = mpu.getFIFOCount();
+    
+//    PC_PRINTF("%d, ", fifoCount); PC_PRINTF("%x, ", mpuIntStatus);
+    // check for overflow (this should never happen unless our code is too inefficient)
+    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
+        PC_PRINTLN("**** FIFO OVERFLOW ****");
+        n_overflows++;
+        // reset so we can continue cleanly
+        mpu.resetFIFO();
+        // otherwise, check for DMP data ready interrupt (this should happen frequently)
+    } else if (mpuIntStatus & 0x02) {
+        // Wait for a full packet - should be very short wait
+        while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
+
+        // read a packet from FIFO
+        mpu.getFIFOBytes(fifoBuffer, packetSize);
+        fifoCount -= packetSize;
+
+        // Get acceleration data
+        mpu.dmpGetAccel(&aa, fifoBuffer);
+//            mpu.dmpGetQuaternion(&q, fifoBuffer);
+//            mpu.dmpGetGravity(&gravity, &q);
+//            mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
+//            mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q);
+
+        PC_PRINTF("%d, ", aa.x);
+        PC_PRINTF("%d, ", aa.y);
+        PC_PRINTLNF("%d", aa.z);
+//            OLED_SETCURS(0, 10); OLED_PRINTF("%d, ", aaWorld.x); OLED_PRINTF("%d, ", aaWorld.y); OLED_PRINTLNF("%d", aaWorld.z);
+
+//            fprintf(logFile, "%u,%d,%d,%d,%f,%f,%f,%f,%u\n", captureTime.read_ms(), aa.x, aa.y, aa.z, q.x, q.y, q.z, q.w, n_overflows);
+//        }
+    }
+}
+
+void receive_init() {
+    PC_PRINTLN("Initializing MPU");
+    mpu.initialize();
+    devStatus = mpu.dmpInitialize();
+    
+    if (devStatus == 0) {
+        mpu.setDMPEnabled(true);
+        packetSize = mpu.dmpGetFIFOPacketSize();
+        
+        PC_PRINTLN("DMP Initialized successfully!");
+        dmpReady = true;
+        dataReady.rise(dataReadyISR);
+    } else { // ERROR
+        PC_PRINTLNF("Error initializing MPU (code %d)", devStatus);
+        DIE(DMP_ERROR_RATE);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/receive_data.h	Sat May 17 01:20:31 2014 +0000
@@ -0,0 +1,9 @@
+#ifndef _RECEIVE_H
+#define _RECEIVE_H
+
+#include "helper_3dmath.h"
+
+void receive_init();
+void receive_data();
+
+#endif // _RECEIVE_H
\ No newline at end of file