Los Putacos / Mbed OS WearableDevice_Nucleo_New

Dependencies:   MPU9250_SPI

Fork of WearableDevice_Nucleo by Los Putacos

Revision:
27:c4b2ce6fa5b8
Parent:
26:4bc56ce08d15
Child:
28:c7e977a19564
--- a/main.cpp	Wed Nov 08 10:59:01 2017 +0000
+++ b/main.cpp	Sun Nov 12 14:54:49 2017 +0000
@@ -50,19 +50,22 @@
 
 // Global Variables
 uint16_t Time_Data = 0;
-uint32_t File_Size = 0;
+uint32_t Data_Size = 0;
+uint16_t LineCount = 0;
 volatile uint16_t readPointer = 0;
 volatile uint16_t readPointer_MIC = 0;
 volatile uint16_t writePointer = 0;
 volatile uint16_t writePointer_MIC = 0;
 
-uint8_t ReadIMU_Flag = 0;
-uint8_t WriteSD_Flag = 0;
+uint8_t ReadIMUDone_Flag = 0;
+uint8_t WriteSDDone_Flag = 0;
+uint8_t SendXBeeDone_Flag = 0;
+
 uint8_t Requested_Time = 0;
 uint8_t Current_Position = 0;
 
 char Time_Buffer[2];
-char Data_Buffer[500];
+char Data_Buffer[255];
 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"
@@ -73,8 +76,6 @@
 /* Callback function, invoked at packet reception */
 static void receive_cb(const XBeeLib::RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t 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]);
@@ -87,14 +88,13 @@
 
             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
+                memset(Data_Buffer, 0, sizeof(Data_Buffer));        // Clear Data_Buffer
+
                 PC.printf(" - Time: %d\n", Requested_Time);         // Display Requested Time
                 PC.printf("------------------------------------\r\n");
                 Ticker_ReceiveXBee.detach();
@@ -172,61 +172,91 @@
 //-----------------------------------------------------------------
 
 //-----------------------------------------------------------------
+void Reset()            // Reset All Variables
+{
+    Time_Data = 0;
+    Data_Size = 0;
+    LineCount = 0;
+
+    readPointer = 0;
+    readPointer_MIC = 0;
+    writePointer = 0;
+    writePointer_MIC = 0;
+
+    ReadIMUDone_Flag = 0;
+    WriteSDDone_Flag = 0;
+    SendXBeeDone_Flag = 0;
+
+    Requested_Time = 0;
+    Current_Position = 0;
+
+    memset(Time_Buffer, 0, sizeof(Time_Buffer));
+    memset(Data_Buffer, 0, sizeof(Data_Buffer));
+    memset(Data_Storage, 0, sizeof(Data_Storage));
+    memset(Data_Storage_MIC, 0, sizeof(Data_Storage_MIC));
+}
+//-----------------------------------------------------------------
+
+//-----------------------------------------------------------------
 int main()
 {
     Setup();    // Initial Setups
 
     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;
+        while ((writePointer != readPointer) && (writePointer_MIC != readPointer_MIC) && (ReadIMUDone_Flag == 1)) {
+            if (((Requested_Time * 1000) - LineCount) >= 8) {
+                for (int i = 0; i < 8; i++) {
+                    Data_Size += sprintf(&Data_Buffer[Data_Size], "%d;%d;%d;%d;%d#\n", Data_Storage[readPointer++], Data_Storage_MIC[readPointer_MIC++], Data_Storage[readPointer++], Data_Storage[readPointer++], Data_Storage[readPointer++]);
+                    LineCount++;
+                }
+
+                txStatus = XBee.send_data_to_coordinator((const uint8_t *) Data_Buffer, Data_Size);
+                if (txStatus != XBeeLib::TxStatusSuccess)
+                    PC.printf("send_data_to_coordinator() failed with error %d\n", (int) txStatus);
+            } else {
+                for (int i = 0; i < ((Requested_Time * 1000) - LineCount); i++) {
+                    Data_Size += sprintf(&Data_Buffer[Data_Size], "%d;%d;%d;%d;%d#\n", Data_Storage[readPointer++], Data_Storage_MIC[readPointer_MIC++], Data_Storage[readPointer++], Data_Storage[readPointer++], Data_Storage[readPointer++]);
+                    LineCount++;
+                }
+
+                txStatus = XBee.send_data_to_coordinator((const uint8_t *) Data_Buffer, Data_Size);
+                if (txStatus != XBeeLib::TxStatusSuccess)
+                    PC.printf("send_data_to_coordinator() failed with error %d\n", (int) txStatus);
+            }
+
+            Data_Size = 0;
+            memset(Data_Buffer, 0, sizeof(Data_Buffer));    // Clear Data_Buffer
         }
 
-        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);
+        if ((LineCount >= (Requested_Time * 1000)) && (ReadIMUDone_Flag == 1)) {
+            PC.printf(" Done! - Time taken: %d ms\n", TimeStamp.read_ms());
+            TimeStamp.stop();
 
             readPointer = 0;
             readPointer_MIC = 0;
-            writePointer = 0;
-            writePointer_MIC = 0;
+            SendXBeeDone_Flag = 1;
 
-            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", "r");
-            fseek(fp, 0, SEEK_END);         // Go to End-Of-File
-            File_Size = ftell(fp);          // Read File Size
-            PC.printf("Sending Data ...");
-            rewind(fp);
+            PC.printf("Writing SD-Card ...");
+            fp = fopen("/sd/Log/Data_Log.txt", "w");            // Create & Open "Data_Log.txt" File
+            setvbuf(fp, NULL, _IONBF, 0);                       // Set SD-Buffer to "0"
+            fprintf(fp, "Time; Mic; AccX; AccY; AccZ#\n");      // Write Header into File
+            TimeStamp.reset();
             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
+        while ((writePointer != readPointer) && (writePointer_MIC != readPointer_MIC) && (SendXBeeDone_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++]);
+            WriteSDDone_Flag = 1;
+        }
 
-                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();
-            }
+        if ((readPointer == writePointer) && (writePointer_MIC == readPointer_MIC) && (WriteSDDone_Flag == 1)) {
+            fclose(fp);
+            PC.printf(" Done! - Time taken: %d ms\n", TimeStamp.read_ms());
+            PC.printf("------------------------------------\r\n");
+            TimeStamp.stop();
+
+            Reset();        // Reset All Variables
+            Ticker_ReceiveXBee.attach(queue.event(&ReceiveXBee), 0.5);
         }
     }
 }