Los Putacos / Mbed OS WearableDevice_Nucleo_New

Dependencies:   MPU9250_SPI

Fork of WearableDevice_Nucleo by Los Putacos

Revision:
26:4bc56ce08d15
Parent:
25:86137c182a17
Child:
27:c4b2ce6fa5b8
--- a/main.cpp	Fri Oct 27 23:49:44 2017 +0000
+++ b/main.cpp	Wed Nov 08 10:59:01 2017 +0000
@@ -16,12 +16,8 @@
 
 //-----------------------------------------------------------------
 // Includes
-// #include "rtos.h"
-// #include "mbed_events.h"
-
 #include "mbed.h"
 #include "configuration.h"
-#include "pin.h"
 
 #include "XBeeLib.h"
 #include "SDFileSystem.h"
@@ -33,34 +29,43 @@
 //-----------------------------------------------------------------
 // Declarations
 FILE *fp;                                   // FILE Type for SD-Card
-Timer time_stamp;                           // Timer µS time-stamp
-
-// Global Variables
-const char DeviceNr[6] = "DEV01";
-char Data_Buffer[10] = "";
+Timer TimeStamp;                            // Timer µS time-stamp
+Serial PC(USBTX, USBRX);                    // Create an Serial PC Object - USBTX, USBRX
+SPI spi(MPU_MOSI, MPU_MISO, MPU_SCK);       // Create an SPI Object for MPU9250 - MOSI, MISO, SCK
+mpu9250_spi imu(spi, MPU_CS);               // Create an MPU9250 Object - SPI Object, CS
+SDFileSystem sd(SD_MOSI, SD_MISO, SD_CLK, SD_CS, "sd", SD_CD, SDFileSystem::SWITCH_NEG_NO, 25000000);   // Create an SDFileSystem Object - MOSI, MISO, CLK, CS
+XBeeLib::XBeeZB XBee = XBeeLib::XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 230400);                // Create an XBee Object - TX, RX, RESET, NC, NC, BaudRate
+XBeeLib::TxStatus txStatus;                 // XBee Status Variable
 
 // Events
 EventQueue queue(32 * EVENTS_EVENT_SIZE);   // Event Setup
-EventQueue Event1;
 
 // Tickers
-Ticker Ticker1;
+Ticker Ticker_IMU;
+Ticker Ticker_ReceiveXBee;
 
 // Threads
-Thread Thread1;
+Thread Thread_IMU(osPriorityRealtime);
+Thread Thread_ReceiveXBee(osPriorityNormal);
 
-// PC Serial (Debug)
-Serial PC(USBTX, USBRX);
-XBeeLib::XBeeZB XBee = XBeeLib::XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 115200);
+// Global Variables
+uint16_t Time_Data = 0;
+uint32_t File_Size = 0;
+volatile uint16_t readPointer = 0;
+volatile uint16_t readPointer_MIC = 0;
+volatile uint16_t writePointer = 0;
+volatile uint16_t writePointer_MIC = 0;
 
-int task1_id = queue.call_every(200, CheckInputBuffer);
-int task2_id = queue.call_every(1, ReadIMUData);
+uint8_t ReadIMU_Flag = 0;
+uint8_t WriteSD_Flag = 0;
+uint8_t Requested_Time = 0;
+uint8_t Current_Position = 0;
 
-// Create an SDFileSystem object
-SDFileSystem sd(SD_MOSI, SD_MISO, SD_CLK, SD_CS, "sd");
-// Create an MPU9250 object
-SPI spi(MPU_MOSI, MPU_MISO, MPU_SCK);
-mpu9250_spi imu(spi, MPU_CS);
+char Time_Buffer[2];
+char Data_Buffer[500];
+const char DeviceNr[6] = "DEV01";
+int16_t Data_Storage[BufferSize];               // BufferSize defined in "event.h"
+uint16_t Data_Storage_MIC[BufferSize_MIC];      // BufferSize_MIC defined in "event.h"
 
 //-----------------------------------------------------------------
 
@@ -68,19 +73,38 @@
 /* Callback function, invoked at packet reception */
 static void receive_cb(const XBeeLib::RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
 {
-    PC.printf("Package Length: %i \r\n", len);
+    memset(Data_Buffer, 0, sizeof(Data_Buffer));    // Clear Data_Buffer
+    memset(Time_Buffer, 0, sizeof(Time_Buffer));    // Clear Time_Buffer
+    PC.printf("Package Length: %i \r\n", len);      // Display Package Length
     for (int i = 0; i < len; i++) {
         Data_Buffer[i] = char(data[i]);
-        PC.printf("%c", Data_Buffer[i]);
+        PC.printf("%c", Data_Buffer[i]);            // Display Received Package
     }
 
-    if (len == 9) {
-        if ((char(Data_Buffer[0]) == '#') && (char(Data_Buffer[6]) == ',')) {
+    if (len == 9) {         // Check Package Length (correct: len = 9)
+        if ((char(Data_Buffer[0]) == '#') && (char(Data_Buffer[6]) == ',')) {       // Check for "#" and "," at specific Positions
             PC.printf(" - Command Detected!\r\n");
 
-            if (strstr(Data_Buffer, DeviceNr) != NULL)
-                PC.printf("Correct Package ID!\r\n");
-            else
+            if (strstr(Data_Buffer, DeviceNr) != NULL) {        // Check for valid DeviceNr in Package
+                PC.printf("Correct Package ID!");
+                fp = fopen("/sd/Log/Data_Log.txt", "w");        // Create & Open "Data_Log.txt" File
+                setvbuf(fp, NULL, _IONBF, 0);
+                fprintf(fp, "Time; Mic; AccX; AccY; AccZ\n");       // Write Header into File
+
+                Current_Position = (uint8_t)(strchr(Data_Buffer, ',') - Data_Buffer);
+                Time_Buffer[0] = Data_Buffer[Current_Position + 1];
+                Time_Buffer[1] = Data_Buffer[Current_Position + 2];
+                Requested_Time = atoi(Time_Buffer);                 // Requested Time by received Package
+                PC.printf(" - Time: %d\n", Requested_Time);         // Display Requested Time
+                PC.printf("------------------------------------\r\n");
+                Ticker_ReceiveXBee.detach();
+
+                PC.printf("Measuring ...");
+                TimeStamp.reset();          // Reset TimeStamp
+                TimeStamp.start();          // Start TimeStamp
+                Thread_IMU.start(callback(&queue, &EventQueue::dispatch_forever));      // Start Measurement Thread
+                Ticker_IMU.attach_us(queue.event(&ReadIMU), 1000);                      // Attach 1 ms Ticker to Measurement "ReadIMU"
+            } else
                 PC.printf("Wrong Package ID!\r\n");
         } else
             PC.printf(" - Non-valid Command Delimiter!\r\n");
@@ -92,55 +116,59 @@
 //-----------------------------------------------------------------
 void Setup()
 {
-    // Initialize PC Serial Connection
-    PC.baud(115200);
+    PC.baud(230400);            // Initialize PC Serial Connection
     PC.printf("\r\n------------- Booting! -------------\r\n");
     PC.printf("CPU SystemCoreClock is %d Hz", SystemCoreClock);
+    wait(0.5);
 
-    // Initialize XBee Serial Connection
-    XBee.init();
-    XBee.register_receive_cb(&receive_cb);       // Register Callbacks
+    XBee.init();                                // Initialize XBee Serial Connection
+    XBee.register_receive_cb(&receive_cb);      // Register Callbacks
+    wait(0.5);
 
     // Initialize IMU SPI Connection
-    if(imu.init(1, BITS_DLPF_CFG_188HZ))         // Initialize the MPU9250
+    if(imu.init(1, BITS_DLPF_CFG_188HZ))        // Initialize the MPU9250
         PC.printf("\nCouldn't initialize MPU9250 via SPI!");
-    PC.printf("\nWHOAMI = 0x%2x", imu.whoami());                        // Output I2C Address to check SPI (correct: 104)
+    PC.printf("\nWHOAMI = 0x%2x", imu.whoami());                        // Output I2C Address to check SPI (correct: 104 - 0x68)
     PC.printf("\nAcc_Scale = %u\n", imu.set_acc_scale(BITS_FS_16G));    // Set Full Range for Acc.
+    imu.calib_acc();        // Calibrate Acceleration Sensor
+    wait(0.5);
 
     // Initialize SD-Card SPI Connection
-
-
-}
+    mkdir("/sd/Log", 0777);                     // Create 'Log' Directory
+    fp = fopen("/sd/Log/Data_Log.txt", "w");    // Create & Open "Data_Log.txt" File
 
-void SDTest()
-{
-    mkdir("/sd/Log", 0777);
-
-    fp = fopen("/sd/Log/Data_Log.txt", "w");
-    if(fp == NULL) {
+    if(fp == NULL)
         error("File Writing Failed!\n");
+    else {
+        PC.printf("\nSD-Card Initialized!\n");
     }
-    fprintf(fp, "12345");
     fclose(fp);
 
-    fp = fopen("/sd/Log/Data_Log.txt", "r");  // open the file in 'read' mode
-
-    PC.printf("\nRead from file: ");
-    while (!feof(fp)) {     // While Not End-Of-File
-        fread((char*) Data_Buffer, 1, 100, fp);
-    }
-    PC.printf("\r\n");
-    fclose(fp);
+    // Display Card Type
+    printf("Card type: ");
+    SDFileSystem::CardType cardType = sd.card_type();
+    if (cardType == SDFileSystem::CARD_NONE)
+        printf("None\n");
+    else if (cardType == SDFileSystem::CARD_MMC)
+        printf("MMC\n");
+    else if (cardType == SDFileSystem::CARD_SD)
+        printf("SD\n");
+    else if (cardType == SDFileSystem::CARD_SDHC)
+        printf("SDHC\n");
+    else
+        printf("Unknown\n");
 
-    // data_len = sizeof(Data_Buffer); // / sizeof Data_Buffer[0] - 1;
+    // Display Card Capacity
+    printf("Sectors: %u\n", sd.disk_sectors());
+    printf("Capacity: %.1fMB\n", sd.disk_sectors() / 2048.0);
 
-    XBeeLib::TxStatus txStatus = XBee.send_data_to_coordinator((uint8_t*) Data_Buffer, sizeof(Data_Buffer));
-    if (txStatus != XBeeLib::TxStatusSuccess)
-        PC.printf("send_data_to_coordinator() failed with error %d\n", (int) txStatus);
+    TimeStamp.reset();  // Reset Timer TimeStamp
+    led1 = 1;           // Turn ON LED to display 'Ready!'
+    PC.printf("\r\n------------- Ready! ---------------\r\n");
 
-    PC.printf("SD Test Successful!\n");
+    Thread_ReceiveXBee.start(callback(&queue, &EventQueue::dispatch_forever));      // Start XBee-Receiving Thread
+    Ticker_ReceiveXBee.attach(queue.event(&ReceiveXBee), 0.5);                      // Attach 500 ms Ticker to "ReceiveXBee"
 }
-
 //-----------------------------------------------------------------
 
 //-----------------------------------------------------------------
@@ -148,20 +176,58 @@
 {
     Setup();    // Initial Setups
 
-    led1 = 1;
-    PC.printf("\r\n----------- Ready! --------------\r\n");
-    SDTest();
+    while (true) {
+        while ((writePointer != readPointer) && (writePointer_MIC != readPointer_MIC) && (ReadIMU_Flag == 1)) {
+            fprintf(fp, "%d;%d;%d;%d;%d\n", Data_Storage[readPointer++], Data_Storage_MIC[readPointer_MIC++], Data_Storage[readPointer++], Data_Storage[readPointer++], Data_Storage[readPointer++]);
+            WriteSD_Flag = 1;
+        }
+
+        if ((readPointer == writePointer) && (writePointer_MIC == readPointer_MIC) && (WriteSD_Flag == 1)) {
+            fclose(fp);
+            PC.printf(" Done!\nWP: %d - RP: %d\n", writePointer + writePointer_MIC, readPointer + readPointer_MIC);
 
-    Thread1.start(callback(&Event1, &EventQueue::dispatch_forever));
-    Ticker1.attach(Event1.event(&ReadIMUData), 0.1);
+            readPointer = 0;
+            readPointer_MIC = 0;
+            writePointer = 0;
+            writePointer_MIC = 0;
+
+            ReadIMU_Flag = 0;
+            WriteSD_Flag = 0;
+            memset(Data_Storage, 0, sizeof(Data_Storage));
+            memset(Data_Storage_MIC, 0, sizeof(Data_Storage_MIC));
+            memset(Data_Buffer, 0, sizeof(Data_Buffer));
 
-    fp = fopen("/sd/Log/Data_Log.txt", "w");
-    time_stamp.reset();
-    time_stamp.start();
-    queue.dispatch();
-    while (true) {
+            fp = fopen("/sd/Log/Data_Log.txt", "r");
+            fseek(fp, 0, SEEK_END);         // Go to End-Of-File
+            File_Size = ftell(fp);          // Read File Size
+            PC.printf("Sending Data ...");
+            rewind(fp);
+            TimeStamp.start();
+        }
+
+        while (File_Size) {
+            if (File_Size >= 250) {
+                fread(Data_Buffer, 250, 1, fp);     // Read Data into Buffer
 
+                txStatus = XBee.send_data_to_coordinator((const uint8_t *) Data_Buffer, 250);
+                if (txStatus != XBeeLib::TxStatusSuccess)
+                    PC.printf("send_data_to_coordinator() failed with error %d\n", (int) txStatus);
+                File_Size = File_Size - 250;
+            } else {
+                fread(Data_Buffer, File_Size, 1, fp);     // Read Data into Buffer
 
+                txStatus = XBee.send_data_to_coordinator((const uint8_t *) Data_Buffer, File_Size);
+                if (txStatus != XBeeLib::TxStatusSuccess)
+                    PC.printf("send_data_to_coordinator() failed with error %d\n", (int) txStatus);
+                File_Size = 0;
+                
+                PC.printf(" Done!\n");
+                PC.printf("------------------------------------\r\n");
+                Ticker_ReceiveXBee.attach(queue.event(&ReceiveXBee), 0.5);
+                PC.printf("Time taken: %d", TimeStamp.read_ms());
+                TimeStamp.stop();
+            }
+        }
     }
 }
 //-----------------------------------------------------------------
\ No newline at end of file