diff options
-rw-r--r-- | unologger/config.h | 61 | ||||
-rw-r--r-- | unologger/datalogger.h | 282 | ||||
-rw-r--r-- | unologger/unologger.cbp | 5 | ||||
-rw-r--r-- | unologger/unologger.ino | 1 |
4 files changed, 101 insertions, 248 deletions
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,3 +1,11 @@ +/************************************************************************* +* 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 @@ -6,68 +14,24 @@ typedef struct { uint16_t pid; uint8_t flags; uint8_t checksum; - float value; -} LOG_DATA; - -typedef struct { - uint32_t time; - uint16_t pid; - uint8_t flags; - uint8_t checksum; 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,211 +47,103 @@ 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) { #if ENABLE_DATA_OUT && STREAM_FORMAT == FORMAT_CSV 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); |