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/config.h      |  61 ++++++-----
 unologger/datalogger.h  | 282 +++++++++++-------------------------------------
 unologger/unologger.cbp |   5 +-
 unologger/unologger.ino |   1 -
 4 files changed, 101 insertions(+), 248 deletions(-)

(limited to 'unologger')

diff --git a/unologger/config.h b/unologger/config.h
index 75ac11b..0662878 100644
--- a/unologger/config.h
+++ b/unologger/config.h
@@ -2,47 +2,60 @@
 #define CONFIG_H_INCLUDED
 
 /**************************************
-* OBD-II options
+* Choose model of OBD-II Adapter
 **************************************/
+// OBD_MODEL_I2C for I2C version
+// OBD_MODEL_UART for UART version
 #define OBD_MODEL OBD_MODEL_UART
 #define OBD_PROTOCOL 0 /* 0 for auto */
 
 /**************************************
-* Data logging/streaming out
+* Data logging options
 **************************************/
+// enable(1)/disable(0) data logging (if SD card is present)
+#define ENABLE_DATA_LOG 1
+#define SD_CS_PIN 10
+
+/**************************************
+* Data streaming options
+**************************************/
+// enable(1)/disable(0) data streaming
 #define ENABLE_DATA_OUT 0
-#define ENABLE_DATA_LOG 0
+
+// uses software(1)/hardware(0) serial for data streaming
 #define USE_SOFTSERIAL 0
-//this defines the format of log file
-#define LOG_FORMAT FORMAT_CSV
+
+// this defines the format of data streaming
+// FORMAT_BIN is required by Freematics OBD iOS App
 #define STREAM_FORMAT FORMAT_CSV
-#define STREAM_BAUDRATE 115200
 
-/**************************************
-* Default working mode
-**************************************/
-#define MODE_DEFAULT MODE_LOGGER /* MODE_LOGGER/MODE_TIMER */
-//#define MODE_SWITCH_PIN 8
+/* Default streaming baudrates:
+   9600bps for BLE
+   38400bps for BT 2.1
+*/
+#define STREAM_BAUDRATE 9600
+
+// outputs debug information
+#define VERBOSE 0
 
 /**************************************
-* Choose SD pin here
+* Accelerometer & Gyro
 **************************************/
-//#define SD_CS_PIN SS // generic
-//#define SD_CS_PIN 4 // ethernet shield
-//#define SD_CS_PIN 7 // microduino
-#define SD_CS_PIN 10 // SD breakout
+#define USE_MPU6050 1
+#define ACC_DATA_RATIO 160
+#define GYRO_DATA_RATIO 256
 
 /**************************************
-* Choose LCD model here
+* Timeout/interval options
 **************************************/
-LCD_ILI9341 lcd;
-//LCD_Null lcd;
+#define OBD_MIN_INTERVAL 20 /* ms */
+#define ACC_DATA_INTERVAL 200 /* ms */
+#define GPS_DATA_TIMEOUT 2000 /* ms */
 
 /**************************************
-* Other options
+* LCD module (uncomment only one)
 **************************************/
-#define USE_MPU6050 0
-//#define DEBUG Serial
-#define DEBUG_BAUDRATE 9600
+LCD_ILI9341 lcd; /* 2.4" ILI9341 based SPI TFT LCD */
+//LCD_Null lcd;
 
-#endif // CONFIG_H_INCLUDED
+#endif
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
 };
diff --git a/unologger/unologger.cbp b/unologger/unologger.cbp
index 281e3e4..ad04efc 100644
--- a/unologger/unologger.cbp
+++ b/unologger/unologger.cbp
@@ -582,12 +582,8 @@
 		<Compiler>
 			<Add directory="." />
 		</Compiler>
-		<Unit filename="ILI9341.cpp" />
-		<Unit filename="MultiLCD.cpp" />
-		<Unit filename="MultiLCD.h" />
 		<Unit filename="config.h" />
 		<Unit filename="datalogger.h" />
-		<Unit filename="fonts.cpp" />
 		<Unit filename="images.h" />
 		<Unit filename="unologger.ino">
 			<Option compile="1" />
@@ -596,6 +592,7 @@
 		<Extensions>
 			<code_completion />
 			<debugger />
+			<envvars />
 		</Extensions>
 	</Project>
 </CodeBlocks_project_file>
diff --git a/unologger/unologger.ino b/unologger/unologger.ino
index 9e0fe00..48f48b9 100644
--- a/unologger/unologger.ino
+++ b/unologger/unologger.ino
@@ -70,7 +70,6 @@ public:
 
         showStates();
 
-        lcd.clear();
         benchmark();
         delay(5000);
 
-- 
cgit v1.2.3