From c1ab85dc0842273ba225afbc5b4a077f3cb9ed0b Mon Sep 17 00:00:00 2001
From: Stanley Huang <stanleyhuangyc@gmail.com>
Date: Fri, 15 Aug 2014 22:25:12 +1000
Subject: Update UnoLogger

---
 unologger/datalogger.h | 282 +++++++++++--------------------------------------
 1 file changed, 63 insertions(+), 219 deletions(-)

(limited to 'unologger/datalogger.h')

diff --git a/unologger/datalogger.h b/unologger/datalogger.h
index 00896ff..920af4c 100644
--- a/unologger/datalogger.h
+++ b/unologger/datalogger.h
@@ -1,14 +1,14 @@
+/*************************************************************************
+* Arduino Data Logger Class
+* Distributed under GPL v2.0
+* Copyright (c) 2013-2014 Stanley Huang <stanleyhuangyc@gmail.com>
+* All rights reserved.
+* Visit http://freematics.com for more information
+*************************************************************************/
+
 #define FORMAT_BIN 0
 #define FORMAT_CSV 1
 
-typedef struct {
-    uint32_t time;
-    uint16_t pid;
-    uint8_t flags;
-    uint8_t checksum;
-    float value;
-} LOG_DATA;
-
 typedef struct {
     uint32_t time;
     uint16_t pid;
@@ -17,57 +17,21 @@ typedef struct {
     float value[3];
 } LOG_DATA_COMM;
 
-typedef struct {
-    uint32_t time; /* e.g. 1307281259 */
-    uint16_t pid;
-    uint8_t message;
-    uint8_t checksum;
-    uint16_t fileIndex;
-    uint16_t fileSize; /* KB */
-    uint16_t logFlags;
-    uint8_t logType;
-    uint8_t data[5];
-} LOG_DATA_FILE_INFO;
-
-typedef struct {
-    uint32_t time;
-    uint16_t pid;
-    uint8_t message;
-    uint8_t checksum;
-    uint8_t data[12];
-} LOG_DATA_COMMAND;
-
-typedef struct {
-    uint32_t id;
-    uint32_t dataOffset;
-    uint8_t ver;
-    uint8_t logType;
-    uint16_t flags;
-    uint32_t dateTime; //4, YYMMDDHHMM, e.g. 1305291359
-    /*
-    uint8_t devid[8];
-    uint8_t vin[24];
-    uint8_t unused[84];
-    */
-} HEADER;
-
 #define HEADER_LEN 128 /* bytes */
 
-#define PID_GPS_COORDINATES 0xF00A
-#define PID_GPS_ALTITUDE 0xF00C
-#define PID_GPS_SPEED 0xF00D
-#define PID_GPS_HEADING 0xF00E
-#define PID_GPS_SAT_COUNT 0xF00F
-#define PID_GPS_TIME 0xF010
+#define PID_GPS_LATITUDE 0xA
+#define PID_GPS_LONGITUDE 0xB
+#define PID_GPS_ALTITUDE 0xC
+#define PID_GPS_SPEED 0xD
+#define PID_GPS_HEADING 0xE
+#define PID_GPS_SAT_COUNT 0xF
+#define PID_GPS_TIME 0x10
+#define PID_GPS_DATE 0x11
 
-#define PID_ACC 0xF020
-#define PID_GYRO 0xF021
+#define PID_ACC 0x20
+#define PID_GYRO 0x21
 
-#if LOG_FORMAT == FORMAT_BIN
-#define FILE_NAME_FORMAT "/DAT%05d.LOG"
-#else
 #define FILE_NAME_FORMAT "/DAT%05d.CSV"
-#endif
 
 #if ENABLE_DATA_OUT
 
@@ -83,21 +47,37 @@ typedef struct {
 
 #else
 
-#define SerialBLE Serial
+#define SerialBLE Serial3
 
 #endif
 
 #endif
 
+#if ENABLE_DATA_LOG
+static File sdfile;
+#endif
+
+static const char* idstr = "FREEMATICS\r";
+
 class CDataLogger {
 public:
     void initSender()
     {
 #if ENABLE_DATA_OUT
         SerialBLE.begin(STREAM_BAUDRATE);
+        SerialBLE.print(idstr);
 #endif
-#if ENABLE_DATA_LOG && LOG_FORMAT == FORMAT_CSV
+#if ENABLE_DATA_LOG
         m_lastDataTime = 0;
+#endif
+    }
+    void logTimeElapsed()
+    {
+#if ENABLE_DATA_LOG
+        dataSize += sdfile.print(dataTime - m_lastDataTime);
+        sdfile.write(',');
+        dataSize++;
+        m_lastDataTime = dataTime;
 #endif
     }
     void logData(char c)
@@ -106,188 +86,64 @@ public:
         SerialBLE.write(c);
 #endif
 #if ENABLE_DATA_LOG
-        if (sdfile) dataSize += sdfile.write(c);
+        if (c >= ' ') {
+            sdfile.write(c);
+            dataSize++;
+        }
 #endif
     }
     void logData(uint16_t pid, int value)
     {
-#if LOG_FORMAT == FORMAT_BIN || STREAM_FORMAT == FORMAT_BIN
-        LOG_DATA_COMM ld = {dataTime, pid, 1, 0, value};
-        ld.checksum = getChecksum((char*)&ld, 12);
-#endif
+        char buf[16];
+        byte n = sprintf(buf, "%X,%d\r", pid, value);
 #if ENABLE_DATA_OUT
 #if STREAM_FORMAT == FORMAT_BIN
-        SerialBLE.write((uint8_t*)&ld, 12);
-#else
-        SerialBLE.print(pid, HEX);
-        SerialBLE.write(',');
-        SerialBLE.print(value);
-        SerialBLE.write('\n');
-#endif
-#endif
-#if ENABLE_DATA_LOG
-        if (!sdfile) return;
-#if LOG_FORMAT == FORMAT_BIN
-        sdfile.write((uint8_t*)&ld, 12);
-        dataSize += 12;
-#else
-        dataSize += sdfile.print(dataTime - m_lastDataTime);
-        sdfile.write(',');
-        dataSize += sdfile.print(pid, HEX);
-        sdfile.write(',');
-        dataSize += sdfile.print(value);
-        sdfile.write('\n');
-        dataSize += 3;
-        m_lastDataTime = dataTime;
-#endif
-#endif
-    }
-    void logData(uint16_t pid, float value)
-    {
-#if LOG_FORMAT == FORMAT_BIN || STREAM_FORMAT == FORMAT_BIN
         LOG_DATA_COMM ld = {dataTime, pid, 1, 0, value};
         ld.checksum = getChecksum((char*)&ld, 12);
-#endif
-#if ENABLE_DATA_OUT
-#if STREAM_FORMAT == FORMAT_BIN
         SerialBLE.write((uint8_t*)&ld, 12);
 #else
-        SerialBLE.print(pid, HEX);
-        SerialBLE.write(',');
-        SerialBLE.print(value);
-        SerialBLE.write('\n');
+        SerialBLE.write((uint8_t*)buf, n);
 #endif
 #endif
 #if ENABLE_DATA_LOG
-        if (!sdfile) return;
-#if LOG_FORMAT == FORMAT_BIN
-        sdfile.write((uint8_t*)&ld, 12);
-        dataSize += 12;
-#else
-        dataSize += sdfile.print(dataTime - m_lastDataTime);
-        sdfile.write(',');
-        dataSize += sdfile.print(pid, HEX);
-        sdfile.write(',');
-        dataSize += sdfile.print(value);
-        sdfile.write('\n');
-        dataSize += 3;
-        m_lastDataTime = dataTime;
-#endif
+        logTimeElapsed();
+        dataSize += sdfile.write((uint8_t*)buf, n);
 #endif
     }
-    void logData(uint16_t pid, float value1, float value2)
+    void logData(uint16_t pid, int32_t value)
     {
-#if LOG_FORMAT == FORMAT_BIN || STREAM_FORMAT == FORMAT_BIN
-        LOG_DATA_COMM ld = {dataTime, pid, 2, 0, {value1, value2}};
-        ld.checksum = getChecksum((char*)&ld, 16);
-#endif
+        char buf[20];
+        byte n = sprintf(buf, "%X,%ld\r", pid, value);
 #if ENABLE_DATA_OUT
 #if STREAM_FORMAT == FORMAT_BIN
-        SerialBLE.write((uint8_t*)&ld, 16);
+        LOG_DATA_COMM ld = {dataTime, pid, 1, 0, value};
+        ld.checksum = getChecksum((char*)&ld, 12);
+        SerialBLE.write((uint8_t*)&ld, 12);
 #else
-        SerialBLE.print(pid, HEX);
-        SerialBLE.write(',');
-        SerialBLE.print(value1, 6);
-        SerialBLE.write(',');
-        SerialBLE.print(value2, 6);
-        SerialBLE.write('\n');
+        SerialBLE.write((uint8_t*)buf, n);
 #endif
 #endif
 #if ENABLE_DATA_LOG
-        if (!sdfile) return;
-#if LOG_FORMAT == FORMAT_BIN
-        sdfile.write((uint8_t*)&ld, 16);
-        dataSize += 16;
-#else
-        dataSize += sdfile.print(dataTime - m_lastDataTime);
-        sdfile.write(',');
-        dataSize += sdfile.print(pid, HEX);
-        sdfile.write(',');
-        dataSize += sdfile.print(value1, 6);
-        sdfile.write(',');
-        dataSize += sdfile.print(value2, 6);
-        sdfile.write('\n');
-        dataSize += 4;
-        m_lastDataTime = dataTime;
-#endif
+        logTimeElapsed();
+        dataSize += sdfile.write((uint8_t*)buf, n);
 #endif
     }
-    void logData(uint16_t pid, uint32_t value1, uint32_t value2)
+    void logData(uint16_t pid, int value1, int value2, int value3)
     {
-#if LOG_FORMAT == FORMAT_BIN || STREAM_FORMAT == FORMAT_BIN
-        LOG_DATA_COMM ld = {dataTime, pid, 2, 0, {value1, value2}};
-        ld.checksum = getChecksum((char*)&ld, 16);
-#endif
+        char buf[24];
+        byte n = sprintf(buf, "%X,%d,%d,%d\r", pid, value1, value2, value3);
 #if ENABLE_DATA_OUT
 #if STREAM_FORMAT == FORMAT_BIN
-        SerialBLE.write((uint8_t*)&ld, 16);
-#else
-        SerialBLE.print(pid, HEX);
-        SerialBLE.write(',');
-        SerialBLE.print(value1);
-        SerialBLE.write(',');
-        SerialBLE.print(value2);
-        SerialBLE.write('\n');
-#endif
-#endif
-#if ENABLE_DATA_LOG
-        if (!sdfile) return;
-#if LOG_FORMAT == FORMAT_BIN
-        sdfile.write((uint8_t*)&ld, 16);
-        dataSize += 16;
-#else
-        dataSize += sdfile.print(dataTime - m_lastDataTime);
-        sdfile.write(',');
-        dataSize += sdfile.print(pid, HEX);
-        sdfile.write(',');
-        dataSize += sdfile.print(value1);
-        sdfile.write(',');
-        dataSize += sdfile.print(value2);
-        sdfile.write('\n');
-        dataSize += 4;
-        m_lastDataTime = dataTime;
-#endif
-#endif
-    }
-    void logData(uint16_t pid, int value1, int value2, int value3)
-    {
-#if LOG_FORMAT == FORMAT_BIN || STREAM_FORMAT == FORMAT_BIN
         LOG_DATA_COMM ld = {dataTime, pid, 3, 0, {value1, value2, value3}};
         ld.checksum = getChecksum((char*)&ld, 20);
-#endif
-#if ENABLE_DATA_OUT
-#if STREAM_FORMAT == FORMAT_BIN
         SerialBLE.write((uint8_t*)&ld, 20);
 #else
-        SerialBLE.print(pid, HEX);
-        SerialBLE.write(',');
-        SerialBLE.print(value1);
-        SerialBLE.write(',');
-        SerialBLE.print(value2);
-        SerialBLE.write(',');
-        SerialBLE.print(value3);
-        SerialBLE.write('\n');
+        SerialBLE.write((uint8_t*)buf, n);
 #endif
 #endif
 #if ENABLE_DATA_LOG
-        if (!sdfile) return;
-#if LOG_FORMAT == FORMAT_BIN
-        sdfile.write((uint8_t*)&ld, 20);
-        dataSize += 20;
-#else
-        dataSize += sdfile.print(dataTime - m_lastDataTime);
-        sdfile.write(',');
-        dataSize += sdfile.print(pid, HEX);
-        sdfile.write(',');
-        dataSize += sdfile.print(value1);
-        sdfile.write(',');
-        dataSize += sdfile.print(value2);
-        sdfile.write(',');
-        dataSize += sdfile.print(value3);
-        sdfile.write('\n');
-        dataSize += 5;
-        m_lastDataTime = dataTime;
-#endif
+        logTimeElapsed();
+        dataSize += sdfile.write((uint8_t*)buf, n);
 #endif
     }
 #if ENABLE_DATA_LOG
@@ -295,7 +151,8 @@ public:
     {
         uint16_t fileIndex;
         char filename[24] = "/FRMATICS";
-
+        
+        dataSize = 0;
         if (SD.exists(filename)) {
             for (fileIndex = 1; fileIndex; fileIndex++) {
                 sprintf(filename + 9, FILE_NAME_FORMAT, fileIndex);
@@ -315,16 +172,6 @@ public:
         if (!sdfile) {
             return 0;
         }
-
-#if LOG_FORMAT == FORMAT_BIN
-        HEADER hdr = {'UDUS', HEADER_LEN, 1, 0, logFlags, dateTime};
-        sdfile.write((uint8_t*)&hdr, sizeof(hdr));
-        for (byte i = 0; i < HEADER_LEN - sizeof(hdr); i++)
-            sdfile.write((uint8_t)0);
-        dataSize = HEADER_LEN;
-#else
-        sdfile.println("Freematics Log File");
-#endif
         return fileIndex;
     }
     void closeFile()
@@ -333,7 +180,7 @@ public:
     }
     void flushFile()
     {
-        if (sdfile) sdfile.flush();
+        sdfile.flush();
     }
 #endif
     uint32_t dataTime;
@@ -348,9 +195,6 @@ private:
         return checksum;
     }
 #if ENABLE_DATA_LOG
-    File sdfile;
-#if LOG_FORMAT == FORMAT_CSV
     uint32_t m_lastDataTime;
 #endif
-#endif
 };
-- 
cgit v1.2.3