summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanley Huang <stanleyhuangyc@gmail.com>2013-08-01 22:25:52 +0800
committerStanley Huang <stanleyhuangyc@gmail.com>2013-08-01 22:25:52 +0800
commit9e3c092a8ac7b75f60a9e875b007c0210cf195f3 (patch)
tree1b34bc883a364aa4152fcf2e85f0f017de31dc8e
parent042fd902968093199f22783a7f15c1624b9040d8 (diff)
download2021-arduino-obd-9e3c092a8ac7b75f60a9e875b007c0210cf195f3.tar.gz
2021-arduino-obd-9e3c092a8ac7b75f60a9e875b007c0210cf195f3.tar.bz2
2021-arduino-obd-9e3c092a8ac7b75f60a9e875b007c0210cf195f3.zip
update MEGA Logger
-rw-r--r--megalogger/datalogger.h168
-rw-r--r--megalogger/megalogger.ino45
2 files changed, 156 insertions, 57 deletions
diff --git a/megalogger/datalogger.h b/megalogger/datalogger.h
index c711709..9368548 100644
--- a/megalogger/datalogger.h
+++ b/megalogger/datalogger.h
@@ -1,23 +1,75 @@
// configurations
-#define ENABLE_DATA_OUT 1
+#define ENABLE_DATA_OUT 0
#define ENABLE_DATA_LOG 1
+typedef enum {
+ LOG_TYPE_DEFAULT = 0,
+ LOG_TYPE_0_60,
+ LOG_TYPE_0_100,
+ LOG_TYPE_100_200,
+ LOG_TYPE_400M,
+ LOG_TYPE_LAPS,
+ LOG_TYPE_ROUTE,
+} LOG_TYPES;
+
+#define FLAG_CAR 0x1
+#define FLAG_CYCLING 0x2
+#define FLAG_OBD 0x10
+#define FLAG_GPS 0x20
+#define FLAG_ACC 0x40
+
typedef struct {
- uint32_t /*DWORD*/ time;
- uint16_t /*WORD*/ pid;
- uint8_t /*BYTE*/ flags;
- uint8_t /*BYTE*/ checksum;
+ uint32_t time;
+ uint16_t pid;
+ uint8_t flags;
+ uint8_t checksum;
float value;
} LOG_DATA;
typedef struct {
- uint32_t /*DWORD*/ time;
- uint16_t /*WORD*/ pid;
- uint8_t /*BYTE*/ flags;
- uint8_t /*BYTE*/ checksum;
+ 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
@@ -28,7 +80,14 @@ typedef struct {
#define PID_ACC 0xF020
#define PID_GYRO 0xF021
-#define FILE_NAME_FORMAT "DAT%05d.LOG"
+#define PID_MESSAGE 0xFE00
+
+#define MSG_FILE_LIST_BEGIN 0x1
+#define MSG_FILE_LIST_END 0x2
+#define MSG_FILE_INFO 0x3
+#define MSG_FILE_REQUEST 0x4
+
+#define FILE_NAME_FORMAT "/DAT%05d.LOG"
#if ENABLE_DATA_OUT
#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__)
@@ -48,6 +107,50 @@ public:
mySerial.begin(9600);
#endif
}
+#if ENABLE_DATA_OUT
+ void sendFileInfo(File& file)
+ {
+ if (file.size() < HEADER_LEN) return;
+
+ LOG_DATA_FILE_INFO info = {0};
+ info.fileIndex = atol(file.name() + 3);
+ if (info.fileIndex == 0) return;
+
+ HEADER hdr;
+ if (file.readBytes((char*)&hdr, sizeof(hdr)) != sizeof(hdr)) return;
+
+ info.pid = PID_MESSAGE;
+ info.message = MSG_FILE_INFO;
+ info.fileSize = file.size();
+ info.time = hdr.dateTime;
+ info.logType = hdr.logType;
+ info.logFlags = hdr.flags;
+ info.checksum = getChecksum((char*)&info, sizeof(info));
+ mySerial.write((uint8_t*)&info, sizeof(info));
+ }
+ void sendCommand(byte message, void* data = 0, byte bytes = 0)
+ {
+ LOG_DATA_COMMAND msg = {0, PID_MESSAGE, message};
+ if (data) memcpy(msg.data, data, bytes);
+ msg.checksum = getChecksum((char*)&msg, sizeof(msg));
+ mySerial.write((uint8_t*)&msg, sizeof(msg));
+ }
+ bool receiveCommand(LOG_DATA_COMMAND& msg)
+ {
+ if (!mySerial.available())
+ return false;
+
+ if (mySerial.readBytes((char*)&msg, sizeof(msg)) != sizeof(msg))
+ return false;
+
+ uint8_t checksum = msg.checksum;
+ msg.checksum = 0;
+ if (getChecksum((char*)&msg, sizeof(msg)) != msg.checksum) {
+ return false;
+ }
+ return true;
+ }
+#endif
void logData(uint16_t pid, float value)
{
LOG_DATA_COMM ld = {dataTime, pid, 1, 0, value};
@@ -85,32 +188,37 @@ public:
dataSize += 20;
}
#if ENABLE_DATA_LOG
- bool openFile(uint16_t index)
+ uint16_t openFile(LOG_TYPES logType, uint16_t logFlags = 0, uint32_t dateTime = 0)
{
- char filename[13];
- sprintf(filename, FILE_NAME_FORMAT, index);
+ uint16_t fileIndex;
+ char filename[24] = "/FRMATICS";
+
+ if (SD.exists(filename)) {
+ for (fileIndex = 1; fileIndex; fileIndex++) {
+ sprintf(filename + 9, FILE_NAME_FORMAT, fileIndex);
+ if (!SD.exists(filename)) {
+ break;
+ }
+ }
+ if (fileIndex == 0)
+ return 0;
+ } else {
+ SD.mkdir(filename);
+ fileIndex = 1;
+ sprintf(filename + 9, FILE_NAME_FORMAT, 1);
+ }
+
sdfile = SD.open(filename, FILE_WRITE);
if (!sdfile) {
- return false;
+ return 0;
}
- uint32_t d;
- d = 'UDUS';
- sdfile.write((uint8_t*)&d, 4); // id
- d = 256;
- sdfile.write((uint8_t*)&d, 4); // offset
- sdfile.write((uint8_t)0x10); // VER
- sdfile.write((uint8_t)0);
- sdfile.write((uint8_t)0);
- sdfile.write((uint8_t)0);
- d = 0;
- sdfile.write((uint8_t*)&d, 4); // date
- sdfile.write((uint8_t*)&d, 4); // time
- for (byte i = 0; i < 256 - 20; i++)
+ HEADER hdr = {'UDUS', HEADER_LEN, 1, logType, 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 = 256;
- return true;
+ dataSize = HEADER_LEN;
+ return fileIndex;
}
void closeFile()
{
diff --git a/megalogger/megalogger.ino b/megalogger/megalogger.ino
index 0051ae6..5fba25a 100644
--- a/megalogger/megalogger.ino
+++ b/megalogger/megalogger.ino
@@ -128,12 +128,11 @@ public:
showStates();
- lcd.setFont(FONT_SIZE_MEDIUM);
- lcd.setCursor(0, 14);
- lcd.print("VIN: XXXXXXXX");
+ //lcd.setFont(FONT_SIZE_MEDIUM);
+ //lcd.setCursor(0, 14);
+ //lcd.print("VIN: XXXXXXXX");
showECUCap();
- delay(3000);
readSensor(PID_DISTANCE, startDistance);
@@ -145,7 +144,14 @@ public:
}
}
- openFile(fileIndex);
+ uint16_t flags = FLAG_CAR | FLAG_OBD;
+ if (state & STATE_GPS_CONNECTED) flags |= FLAG_GPS;
+ if (state & STATE_ACC_READY) flags |= FLAG_ACC;
+ uint16_t index = openFile(LOG_TYPE_DEFAULT, flags);
+ lcd.setCursor(0, 6);
+ lcd.print("File ID:");
+ lcd.printInt(index);
+ delay(5000);
initScreen();
@@ -288,21 +294,6 @@ public:
return false;
}
- char filename[13];
- // now determine log file name
- for (fileIndex = 1; fileIndex; fileIndex++) {
- sprintf(filename, FILE_NAME_FORMAT, fileIndex);
- if (!SD.exists(filename)) {
- break;
- }
- }
- if (!fileIndex) {
- lcd.print("Bad File");
- return false;
- }
-
- lcd.print("File:");
- lcd.print(filename);
state |= STATE_SD_READY;
return true;
}
@@ -664,12 +655,6 @@ static COBDLogger logger;
void setup()
{
- delay(100);
- lcd.begin();
-
- logger.begin();
- logger.initSender();
-
#ifdef GPSUART
#ifdef GPS_OPEN_BAUDRATE
GPSUART.begin(GPS_OPEN_BAUDRATE);
@@ -680,10 +665,16 @@ void setup()
GPSUART.begin(GPS_BAUDRATE);
// switching to 10Hz mode, effective only for MTK3329
//GPSUART.println(PMTK_SET_NMEA_OUTPUT_ALLDATA);
- //GPSUART.println(PMTK_SET_NMEA_UPDATE_5HZ);
+ GPSUART.println(PMTK_SET_NMEA_UPDATE_10HZ);
#endif
Wire.begin();
+ delay(200);
+ lcd.begin();
+
+ logger.begin();
+ logger.initSender();
+
//lcd.clear();
lcd.setLineHeight(8);
lcd.setFont(FONT_SIZE_MEDIUM);