From e9a869eec9345aebc3f597f1c45c9b8e7f824efc Mon Sep 17 00:00:00 2001 From: Stanley Huang Date: Tue, 11 Mar 2014 13:20:27 +0800 Subject: Update UnoLogger --- unologger/config.h | 7 ++- unologger/unologger.ino | 152 ++++++++++++++++++++++++++++++------------------ 2 files changed, 103 insertions(+), 56 deletions(-) (limited to 'unologger') diff --git a/unologger/config.h b/unologger/config.h index eb109b4..2be5a7d 100644 --- a/unologger/config.h +++ b/unologger/config.h @@ -1,11 +1,16 @@ #ifndef CONFIG_H_INCLUDED #define CONFIG_H_INCLUDED +/************************************** +* OBD-II options +**************************************/ +#define OBD_PROTOCOL 0 /* 0 for auto */ + /************************************** * Data logging/streaming out **************************************/ #define ENABLE_DATA_OUT 0 -#define ENABLE_DATA_LOG 1 +#define ENABLE_DATA_LOG 0 #define USE_SOFTSERIAL 0 //this defines the format of log file #define LOG_FORMAT FORMAT_CSV diff --git a/unologger/unologger.ino b/unologger/unologger.ino index ac17b94..dc4cf1f 100644 --- a/unologger/unologger.ino +++ b/unologger/unologger.ino @@ -33,11 +33,11 @@ static int speed = 0; static uint32_t distance = 0; static uint16_t fileIndex = 0; static uint32_t startTime = 0; -static uint32_t pidCount = 0; +static uint16_t elapsed = 0; static uint8_t lastPid = 0; static int lastValue = 0; -static byte pidTier1[]= {PID_RPM, PID_SPEED, PID_ENGINE_LOAD, PID_RPM, PID_SPEED, PID_THROTTLE}; +static byte pidTier1[]= {PID_RPM, PID_SPEED, PID_ENGINE_LOAD, PID_THROTTLE}; static byte pidTier2[] = {PID_INTAKE_MAP, PID_TIMING_ADVANCE}; static byte pidTier3[] = {PID_COOLANT_TEMP, PID_INTAKE_TEMP, PID_AMBIENT_TEMP, PID_FUEL_LEVEL, PID_DISTANCE}; @@ -63,12 +63,16 @@ public: do { showStates(); - } while (!init()); + } while (!init(OBD_PROTOCOL)); state |= STATE_OBD_READY; showStates(); + lcd.clear(); + benchmark(); + delay(1000); + uint16_t flags = FLAG_CAR | FLAG_OBD; if (state & STATE_GPS_FOUND) flags |= FLAG_GPS; if (state & STATE_ACC_READY) flags |= FLAG_ACC; @@ -88,9 +92,6 @@ public: delay(100); #endif - //showECUCap(); - //delay(3000); - #if ENABLE_DATA_LOG // open file for logging if (!(state & STATE_SD_READY)) { @@ -101,8 +102,38 @@ public: } #endif + showECUCap(); + delay(3000); + initScreen(); } + void benchmark() + { + lcd.setFont(FONT_SIZE_MEDIUM); + + char buf[OBD_RECV_BUF_SIZE]; + uint8_t count = 0; + startTime = millis(); + for (uint8_t n = 0; n < TIER_NUM1; n++) { + sendQuery(pidTier1[n]); + lcd.write('['); + lcd.print(millis()); + lcd.write(']'); + lcd.println(pidTier1[n], HEX); + if (receive(buf) > 0) { + lcd.println(buf); + count++; + } + } + lcd.setCursor(0, 28); + if (count) { + lcd.print("OBD Time: "); + lcd.printInt((millis() - startTime) / count); + lcd.print("ms"); + } else { + lcd.print("No PID!"); + } + } void loop() { static byte index = 0; @@ -195,20 +226,26 @@ private: showData(lastPid, lastValue); lastPid = 0; } - lcd.setFont(FONT_SIZE_MEDIUM); - lcd.setCursor(248, 8); - lcd.printInt(pidCount * 1000 / (millis() - startTime), 4); - lcd.print("ms"); - + uint16_t t = (millis() - startTime) >> 10; + if (t != elapsed) { + lcd.setFont(FONT_SIZE_MEDIUM); + lcd.setCursor(260, 8); + lcd.printInt(elapsed / 60, 2); + lcd.write(':'); + lcd.setFlags(FLAG_PAD_ZERO); + lcd.printInt(elapsed % 60, 2); + lcd.setFlags(0); + elapsed = t; + } + #if ENABLE_DATA_LOG // flush SD data every 1KB if (dataSize - lastFileSize >= 1024) { flushFile(); lastFileSize = dataSize; // display logged data size - lcd.setCursor(248, 11); + lcd.setCursor(260, 11); lcd.printInt(dataSize >> 10, 4); - lcd.print("KB"); } #endif } @@ -229,40 +266,39 @@ private: { int value; // send a query to OBD adapter for specified OBD-II pid - + // send a query command - sendQuery(pid); - // wait for reponse - bool hasData; - unsigned long tick = millis(); - do { - dataIdleLoop(); - } while (!(hasData = available()) && millis() - tick < OBD_TIMEOUT_SHORT); - if (!hasData) { - errors++; - return; - } - // receive and parse the response - pid = 0; - if (getResult(pid, value)) { - dataTime = millis(); - // log data to SD card - logData(0x100 | pid, value); - lastValue = value; - lastPid = pid; - pidCount++; + sendQuery(pid); + // wait for reponse + pid = 0; // this lets PID also get from response + // receive and parse the response + if (getResult(pid, value)) { + dataTime = millis(); + // log data to SD card + logData(0x100 | pid, value); + lastValue = value; + lastPid = pid; + } else { + errors++; + return; } } void showECUCap() { - byte pidlist[] = {PID_RPM, PID_SPEED, PID_THROTTLE, PID_ENGINE_LOAD, PID_CONTROL_MODULE_VOLTAGE, PID_MAF_FLOW, PID_INTAKE_MAP, PID_FUEL_LEVEL, PID_FUEL_PRESSURE, PID_COOLANT_TEMP, PID_INTAKE_TEMP, PID_AMBIENT_TEMP, PID_TIMING_ADVANCE, PID_BAROMETRIC}; - const char* namelist[] = {"RPM", "SPEED", "THR", "ENG.LOAD", "CTRL VOLT", "MAF", "MAP", "FUEL LV.", "FUEL PRE.", "COOLANT", "INTAKE","AMBIENT", "IGNITION", "BARO"}; + lcd.clear(); lcd.setFont(FONT_SIZE_MEDIUM); - for (byte i = 0; i < sizeof(pidlist) / sizeof(pidlist[0]); i++) { - lcd.setCursor(192, i << 1); - lcd.print(namelist[i]); - lcd.write(':'); - showTickCross(isValidPID(pidlist[i])); + byte pid = 0; + uint16_t col; + uint8_t row; + for (byte i = 0; ; pid++) { + if (pid % 0x20 == 0) continue; + col = (i / 15) * 52; + row = (i % 15) << 1; + i++; + if (col > 280) break; + lcd.setCursor(col, row); + lcd.print(0x100 | pid, HEX); + showTickCross(isValidPID(pid)); } } void reconnect() @@ -277,12 +313,16 @@ private: state &= ~(STATE_OBD_READY | STATE_ACC_READY); state |= STATE_SLEEPING; //digitalWrite(SD_CS_PIN, LOW); - for (int i = 0; !init(); i++) { - if (i == 10) lcd.clear(); + for (uint16_t i = 0; !init(); i++) { + if (i == 5) { + lcd.backlight(false); + lcd.clear(); + } } state &= ~STATE_SLEEPING; fileIndex++; write('\r'); + lcd.backlight(true); setup(); } byte state; @@ -297,10 +337,10 @@ private: void showStates() { lcd.setFont(FONT_SIZE_MEDIUM); - lcd.setCursor(0, 10); + lcd.setCursor(0, 6); lcd.print("OBD "); showTickCross(state & STATE_OBD_READY); - lcd.setCursor(0, 13); + lcd.setCursor(0, 8); lcd.print("ACC "); showTickCross(state & STATE_ACC_READY); } @@ -382,12 +422,11 @@ private: void showChart(int value) { static uint16_t pos = 0; - byte n = value / 60; + if (value < 500) return; + byte n = (value - 600) / 30; lcd.fill(pos, pos, 239 - n, 239, RGB16_CYAN); - if (++pos == 320) { - lcd.fill(0, 319, 120, 239); - pos = 0; - } + pos = (pos + 1) % 320; + lcd.fill(pos, pos, 120, 239); } void initLoggerScreen() { @@ -411,10 +450,10 @@ private: lcd.setCursor(164, 7); lcd.print("INTAKE MAP"); - lcd.setCursor(248, 7); - lcd.print("OBD Time:"); - lcd.setCursor(248, 10); - lcd.print("Log Size:"); + lcd.setCursor(260, 7); + lcd.print("ELAPSED"); + lcd.setCursor(260, 10); + lcd.print("LOG SIZE"); lcd.setTextColor(RGB16_YELLOW); lcd.setCursor(24, 5); @@ -431,6 +470,9 @@ private: lcd.print("km"); lcd.setCursor(200, 12); lcd.print("kpa"); + lcd.setCursor(296, 12); + lcd.print("KB"); + lcd.setTextColor(RGB16_WHITE); @@ -457,7 +499,7 @@ void setup() #if ENABLE_DATA_LOG lcd.setFont(FONT_SIZE_MEDIUM); - lcd.setCursor(0, 7); + lcd.setCursor(0, 4); logger.checkSD(); #endif logger.setup(); -- cgit v1.2.3