From b84ad47025835c67f2da2379373ae5df95113c68 Mon Sep 17 00:00:00 2001 From: Lubos Petrovic Date: Thu, 4 Jun 2020 13:37:52 +0200 Subject: [PATCH] v1.5 added Units menu and support for miles/psi/farenheits --- README.md | 3 + enirodashboard.ino | 253 ++++++++++++++++++++++++++------------------- 2 files changed, 148 insertions(+), 108 deletions(-) diff --git a/README.md b/README.md index f4c4700..86944fd 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,9 @@ Screen list ## Release notes +### v1.5 2020-06-03 +- added support for different units (miles, farenheit, psi) + ### v1.4 2020-05-29 - added menu - Pairing with VGATE iCar Pro BLE4 adapter via menu! diff --git a/enirodashboard.ino b/enirodashboard.ino index 1554a18..bc731a9 100644 --- a/enirodashboard.ino +++ b/enirodashboard.ino @@ -1,8 +1,8 @@ /* - KIA eNiro Dashboard 1.4, 2020-05-29 - !! working only with OBD BLE 4.0 adapters - !! Supported adapter is Vgate ICar Pro (must be BLE4.0 version) + KIA eNiro Dashboard 1.5, 2020-06-03 + !! working only with OBD BLE 4.0 adapters + !! Supported adapter is Vgate ICar Pro (must be BLE4.0 version) !! Not working with standard BLUETOOTH 3 adapters IMPORTANT Replace HM_MAC, serviceUUID, charTxUUID, charRxUUID as described below @@ -54,7 +54,6 @@ uint32_t PIN = 1234; // Misc #define GFXFF 1 // TFT FOnts -#define PSI2BAR_DIVIDER 14.503773800722 // tires psi / 14,503773800722 -> bar TFT_eSPI tft = TFT_eSPI(); @@ -148,7 +147,7 @@ typedef struct { char serviceUUID[40]; } MENU_ITEM; -#define menuItemsCount 24 +#define menuItemsCount 39 bool menuVisible = false; uint16_t menuCurrent = 0; uint8_t menuItemSelected = 0; @@ -159,36 +158,37 @@ MENU_ITEM menuItems[menuItemsCount] = { {1, 0, -1, "Vehicle type"}, {2, 0, -1, "Select OBD2BLE adapter"}, {3, 0, -1, "Others"}, - //{4, 0, -1, "Units"}, + {4, 0, -1, "Units"}, {8, 0, -1, "Factory reset"}, {9, 0, -1, "Save settings"}, {100, 1, 0, "<- parent menu"}, {101, 1, -1, "Kia eNiro 2020"}, + {102, 1, -1, "Hyundai Kona 2020"}, {300, 3, 0, "<- parent menu"}, {301, 3, -1, "Screen rotation"}, - /*{400, 4, 0, "<- parent menu"}, - {401, 4, -1, "Distance"}, - {402, 4, -1, "Temperature"}, - {403, 4, -1, "Pressure"}, - */ + {400, 4, 0, "<- parent menu"}, + {401, 4, -1, "Distance"}, + {402, 4, -1, "Temperature"}, + {403, 4, -1, "Pressure"}, + {3010, 301, 3, "<- parent menu"}, {3011, 301, -1, "Normal"}, {3012, 301, -1, "Flip vertical"}, - /* - {4010, 401, 4, "<- parent menu"}, - {4011, 401, -1, "Kilometers"}, - {4012, 401, -1, "Miles"}, - {4020, 402, 4, "<- parent menu"}, - {4021, 402, -1, "Celsius"}, - {4022, 402, -1, "Fahrenheit"}, + {4010, 401, 4, "<- parent menu"}, + {4011, 401, -1, "Kilometers"}, + {4012, 401, -1, "Miles"}, - {4030, 403, 4, "<- parent menu"}, - {4031, 403, -1, "Bar"}, - {4032, 403, -1, "Psi"},*/ + {4020, 402, 4, "<- parent menu"}, + {4021, 402, -1, "Celsius"}, + {4022, 402, -1, "Fahrenheit"}, + + {4030, 403, 4, "<- parent menu"}, + {4031, 403, -1, "Bar"}, + {4032, 403, -1, "Psi"}, {9999, 9998, 0, "List of BLE devices"}, {10000, 9999, -1, "empty list"}, @@ -260,7 +260,7 @@ typedef struct { typedef struct { byte initFlag; // 183 value byte settingsVersion; // 1 - uint16_t carType; // 0 - Kia eNiro 2020 + uint16_t carType; // 0 - Kia eNiro 2020, 1 - Hyundai Kona 2020 char obdMacAddress[20]; char serviceUUID[40]; char charTxUUID[40]; @@ -275,54 +275,6 @@ PARAMS_STRUC params; // Realtime sensor values PARAMS_STRUC oldParams; // Old states used for change detection (draw optimization) SETTINGS_STRUC settings, tmpSettings; // Settings stored into flash -/** - Load setting from flash memory, upgrade structure if version differs -*/ -bool loadSettings() { - - String tmpStr; - - // Init - settings.initFlag = 183; - settings.settingsVersion = 1; - settings.carType = 0; - - // Default OBD adapter MAC and UUID's - tmpStr = "00:00:00:00:00:00"; // Pair via menu (middle button) - tmpStr.toCharArray(settings.obdMacAddress, 18); - tmpStr = "000018f0-0000-1000-8000-00805f9b34fb"; - tmpStr.toCharArray(settings.serviceUUID, 37); - tmpStr = "00002af0-0000-1000-8000-00805f9b34fb"; - tmpStr.toCharArray(settings.charTxUUID, 37); - tmpStr = "00002af1-0000-1000-8000-00805f9b34fb"; - tmpStr.toCharArray(settings.charRxUUID, 37); - - settings.displayRotation = 1; // 1,3 - settings.distanceUnit = 'k'; - settings.temperatureUnit = 'c'; - settings.pressureUnit = 'b'; - - // Load settings and replace default values - Serial.println("Reading settings from eeprom."); - EEPROM.begin(sizeof(SETTINGS_STRUC)); - EEPROM.get(0, tmpSettings); - - // Init flash with default settings - if (tmpSettings.initFlag != 183) { - Serial.println("Settings not found. Initialization."); - saveSettings(); - } else { - Serial.print("Loaded settings ver.: "); - Serial.println(settings.settingsVersion); - // Save version? No need to upgrade structure - if (settings.settingsVersion == tmpSettings.settingsVersion) { - settings = tmpSettings; - } - } - - return true; -} - /** Load settings from flash memory, upgrade structure if version differs */ @@ -355,6 +307,54 @@ bool resetSettings() { return true; } +/** + Load setting from flash memory, upgrade structure if version differs +*/ +bool loadSettings() { + + String tmpStr; + + // Init + settings.initFlag = 183; + settings.settingsVersion = 1; + settings.carType = 0; // Kia eNiro + + // Default OBD adapter MAC and UUID's + tmpStr = "00:00:00:00:00:00"; // Pair via menu (middle button) + tmpStr.toCharArray(settings.obdMacAddress, 18); + tmpStr = "000018f0-0000-1000-8000-00805f9b34fb"; // Default UUID's for VGate iCar Pro BLE4 adapter + tmpStr.toCharArray(settings.serviceUUID, 37); + tmpStr = "00002af0-0000-1000-8000-00805f9b34fb"; + tmpStr.toCharArray(settings.charTxUUID, 37); + tmpStr = "00002af1-0000-1000-8000-00805f9b34fb"; + tmpStr.toCharArray(settings.charRxUUID, 37); + + settings.displayRotation = 1; // 1,3 + settings.distanceUnit = 'k'; + settings.temperatureUnit = 'c'; + settings.pressureUnit = 'b'; + + // Load settings and replace default values + Serial.println("Reading settings from eeprom."); + EEPROM.begin(sizeof(SETTINGS_STRUC)); + EEPROM.get(0, tmpSettings); + + // Init flash with default settings + if (tmpSettings.initFlag != 183) { + Serial.println("Settings not found. Initialization."); + saveSettings(); + } else { + Serial.print("Loaded settings ver.: "); + Serial.println(settings.settingsVersion); + // Save version? No need to upgrade structure + if (settings.settingsVersion == tmpSettings.settingsVersion) { + settings = tmpSettings; + } + } + + return true; +} + /** Init structure with data */ @@ -446,6 +446,27 @@ float hexToDec(String hexString, byte bytes = 2, bool signedNum = true) { return (decValue > 32767 ? (float)decValue - 65536.0 : decValue); } +/** + Convert km to km or miles +*/ +float km2distance(float inKm) { + return (settings.distanceUnit == 'k') ? inKm : inKm / 1.609344; +} + +/** + Convert celsius to celsius or farenheit +*/ +float celsius2temperature(float inCelsius) { + return (settings.temperatureUnit == 'c') ? inCelsius : (inCelsius * 1.8) + 32; +} + +/** + Convert bar to bar or psi +*/ +float bar2pressure(float inBar) { + return (settings.pressureUnit == 'b') ? inBar : inBar * 14.503773800722; +} + /** Clear screen a display two lines message */ @@ -585,10 +606,16 @@ bool drawSceneMain(bool force) { || oldParams.cumulativeEnergyDischargedKWhStart != params.cumulativeEnergyDischargedKWhStart || oldParams.cumulativeEnergyDischargedKWh != params.cumulativeEnergyDischargedKWh ) { - sprintf(tmpStr1, "%01.01fbar %02.00fC", params.tireFrontLeftPressureBar, params.tireFrontLeftTempC); - sprintf(tmpStr2, "%02.00fC %01.01fbar", params.tireFrontRightTempC, params.tireFrontRightPressureBar); - sprintf(tmpStr3, "%01.01fbar %02.00fC", params.tireRearLeftPressureBar, params.tireRearLeftTempC); - sprintf(tmpStr4, "%02.00fC %01.01fbar", params.tireRearRightTempC, params.tireRearRightPressureBar); + char pressureStr[4] = "bar"; + char temperatureStr[2] = "C"; + if (settings.pressureUnit != 'b') + strcpy(pressureStr, "psi"); + if (settings.temperatureUnit != 'c') + strcpy(temperatureStr, "F"); + sprintf(tmpStr1, "%01.01f%s %02.00f%s", bar2pressure(params.tireFrontLeftPressureBar), pressureStr, celsius2temperature(params.tireFrontLeftTempC), temperatureStr); + sprintf(tmpStr2, "%02.00f%s %01.01f%s", celsius2temperature(params.tireFrontRightTempC), temperatureStr, bar2pressure(params.tireFrontRightPressureBar), pressureStr); + sprintf(tmpStr3, "%01.01f%s %02.00f%s", bar2pressure(params.tireRearLeftPressureBar), pressureStr, celsius2temperature(params.tireRearLeftTempC), temperatureStr); + sprintf(tmpStr4, "%02.00f%s %01.01f%s", celsius2temperature(params.tireRearRightTempC), temperatureStr, bar2pressure(params.tireRearRightPressureBar), pressureStr); showTires(1, 0, 2, 1, tmpStr1, tmpStr2, tmpStr3, tmpStr4, TFT_BLACK); // Added later - kwh total in tires box @@ -618,8 +645,8 @@ bool drawSceneMain(bool force) { // batPowerKwh100 on roads, else batPowerAmp if (params.speedKmh > 20) { if (force || params.batPowerKwh100 != oldParams.batPowerKwh100) { - sprintf(tmpStr1, "%01.01f", params.batPowerKwh100); - monitoringRect(1, 1, 2, 2, tmpStr1, "KWH/100KM", (params.batPowerKwh100 >= 0 ? TFT_DARKGREEN2 : (params.batPowerKwh100 < -30.0 ? TFT_RED : TFT_DARKRED)), TFT_WHITE); + sprintf(tmpStr1, "%01.01f", km2distance(params.batPowerKwh100)); + monitoringRect(1, 1, 2, 2, tmpStr1, ((settings.distanceUnit == 'k') ? "KWH/100KM" : "KWH/100MI"), (params.batPowerKwh100 >= 0 ? TFT_DARKGREEN2 : (params.batPowerKwh100 < -30.0 ? TFT_RED : TFT_DARKRED)), TFT_WHITE); oldParams.batPowerKwh100 = params.batPowerKwh100; } } else { @@ -665,14 +692,14 @@ bool drawSceneMain(bool force) { // batTempC if (force || params.batTempC != oldParams.batTempC) { - sprintf(tmpStr1, "%01.00f", params.batTempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f" : "%01.01f"), celsius2temperature(params.batTempC)); monitoringRect(1, 3, 1, 1, tmpStr1, "BAT.TEMP.C", TFT_TEMP, (params.batTempC >= 15) ? ((params.batTempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); oldParams.batTempC = params.batTempC; } // batHeaterC if (force || params.batHeaterC != oldParams.batHeaterC) { - sprintf(tmpStr1, "%01.00f", params.batHeaterC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f" : "%01.01f"), celsius2temperature(params.batHeaterC)); monitoringRect(2, 3, 1, 1, tmpStr1, "BAT.HEAT C", TFT_TEMP, TFT_WHITE); oldParams.batHeaterC = params.batHeaterC; } @@ -700,8 +727,8 @@ bool drawSceneMain(bool force) { // indoorTemperature if (force || params.indoorTemperature != oldParams.indoorTemperature || params.outdoorTemperature != oldParams.outdoorTemperature) { - sprintf(tmpStr1, "%01.01f", params.indoorTemperature); - sprintf(tmpStr2, "IN/OUT%01.01fC", params.outdoorTemperature); + sprintf(tmpStr1, "%01.01f", celsius2temperature(params.indoorTemperature)); + sprintf(tmpStr2, "IN/OUT%01.01f", celsius2temperature(params.outdoorTemperature)); monitoringRect(3, 3, 1, 1, tmpStr1, tmpStr2, TFT_TEMP, TFT_WHITE); oldParams.indoorTemperature = params.indoorTemperature; oldParams.outdoorTemperature = params.outdoorTemperature; @@ -724,14 +751,14 @@ bool drawSceneSpeed(bool force) { tft.setTextSize(2); // Size for small 5x7 font sprintf(tmpStr3, " 0 "); if (params.speedKmh > 10) - sprintf(tmpStr3, " %01.00f ", params.speedKmh); + sprintf(tmpStr3, " %01.00f ", km2distance(params.speedKmh)); tft.drawString(tmpStr3, posx, posy, 7); posy = 140; tft.setTextDatum(TC_DATUM); // Top center tft.setTextSize(1); if (params.speedKmh > 25 && params.batPowerKw < 0) { - sprintf(tmpStr3, " %01.01f ", params.batPowerKwh100); + sprintf(tmpStr3, " %01.01f ", km2distance(params.batPowerKwh100)); } else { sprintf(tmpStr3, " %01.01f ", params.batPowerKw); } @@ -741,7 +768,7 @@ bool drawSceneSpeed(bool force) { tft.setFreeFont(&Roboto_Thin_24); posx = 10; posy = 10; - sprintf(tmpStr3, "%01.00fkm ", params.odoKm); + sprintf(tmpStr3, ((settings.distanceUnit == 'k') ? "%01.00fkm " : "%01.00fmi "), km2distance(params.odoKm)); tft.setTextDatum(TL_DATUM); tft.drawString(tmpStr3, posx, posy, GFXFF); @@ -761,7 +788,7 @@ bool drawSceneSpeed(bool force) { tft.drawString(tmpStr3, posx, posy, GFXFF); // Battery "cold gate" detection - red < 15C (43KW limit), <25 (blue - 55kW limit), green all ok - sprintf(tmpStr3, "%01.00f", params.batTempC); + sprintf(tmpStr3, "%01.00f", celsius2temperature(params.batTempC)); tft.fillCircle(290, 30, 25, (params.batTempC >= 15) ? ((params.batTempC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED); tft.setTextColor(TFT_WHITE, (params.batTempC >= 15) ? ((params.batTempC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED); tft.setFreeFont(&Roboto_Thin_24); @@ -778,17 +805,17 @@ bool drawSceneBatteryCells(bool force) { int32_t posx, posy; - sprintf(tmpStr1, "%01.00f C", params.batHeaterC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.batHeaterC)); drawSmallRect(0, 0, 1, 1, tmpStr1, "HEATER", TFT_TEMP, TFT_CYAN); - sprintf(tmpStr1, "%01.00f C", params.batInletC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.batInletC)); drawSmallRect(1, 0, 1, 1, tmpStr1, "BAT.INLET", TFT_TEMP, TFT_CYAN); - sprintf(tmpStr1, "%01.00f C", params.batModule01TempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.batModule01TempC)); drawSmallRect(0, 1, 1, 1, tmpStr1, "MO1", TFT_TEMP, (params.batModule01TempC >= 15) ? ((params.batModule01TempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); - sprintf(tmpStr1, "%01.00f C", params.batModule02TempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.batModule02TempC)); drawSmallRect(1, 1, 1, 1, tmpStr1, "MO2", TFT_TEMP, (params.batModule02TempC >= 15) ? ((params.batModule02TempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); - sprintf(tmpStr1, "%01.00f C", params.batModule03TempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.batModule03TempC)); drawSmallRect(2, 1, 1, 1, tmpStr1, "MO3", TFT_TEMP, (params.batModule03TempC >= 15) ? ((params.batModule03TempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); - sprintf(tmpStr1, "%01.00f C", params.batModule04TempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.batModule04TempC)); drawSmallRect(3, 1, 1, 1, tmpStr1, "MO4", TFT_TEMP, (params.batModule04TempC >= 15) ? ((params.batModule04TempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); tft.setTextDatum(TL_DATUM); // Topleft @@ -840,13 +867,13 @@ bool drawSceneChargingGraph(bool force) { sprintf(tmpStr1, "%03.00f", params.batVoltage); drawSmallRect(3, 0, 1, 1, tmpStr1, "VOLTAGE", TFT_TEMP, TFT_CYAN); - sprintf(tmpStr1, "%01.00f C", params.batHeaterC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.batHeaterC)); drawSmallRect(0, 1, 1, 1, tmpStr1, "HEATER", TFT_TEMP, TFT_CYAN); - sprintf(tmpStr1, "%01.00f C", params.batInletC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.batInletC)); drawSmallRect(1, 1, 1, 1, tmpStr1, "BAT.INLET", TFT_TEMP, TFT_CYAN); - sprintf(tmpStr1, "%01.00f C", params.batMinC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.batMinC)); drawSmallRect(2, 1, 1, 1, tmpStr1, "BAT.MIN", (params.batMinC >= 15) ? ((params.batMinC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED, TFT_CYAN); - sprintf(tmpStr1, "%01.01f C", params.outdoorTemperature); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), celsius2temperature(params.outdoorTemperature)); drawSmallRect(3, 1, 1, 1, tmpStr1, "OUT.TEMP.", TFT_TEMP, TFT_CYAN); tft.setTextColor(TFT_SILVER, TFT_TEMP); @@ -882,25 +909,25 @@ bool drawSceneChargingGraph(bool force) { tft.setTextSize(1); // Size for small 5x7 font tft.setTextDatum(TR_DATUM); - sprintf(tmpStr1, "1:%01.00fC", params.batModule01TempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "1:%01.00fC" : "1:%01.00fF"), celsius2temperature(params.batModule01TempC)); tft.setTextColor((params.batModule01TempC >= 15) ? ((params.batModule01TempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (0 * 15), 2); - sprintf(tmpStr1, "2:%01.00fC", params.batModule02TempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "2:%01.00fC" : "2:%01.00fF"), celsius2temperature(params.batModule02TempC)); tft.setTextColor((params.batModule02TempC >= 15) ? ((params.batModule02TempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (1 * 15), 2); - sprintf(tmpStr1, "3:%01.00fC", params.batModule03TempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "3:%01.00fC" : "3:%01.00fF"), celsius2temperature(params.batModule03TempC)); tft.setTextColor((params.batModule03TempC >= 15) ? ((params.batModule03TempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (2 * 15), 2); - sprintf(tmpStr1, "4:%01.00fC", params.batModule04TempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "4:%01.00fC" : "4:%01.00fF"), celsius2temperature(params.batModule04TempC)); tft.setTextColor((params.batModule04TempC >= 15) ? ((params.batModule04TempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (3 * 15), 2); - sprintf(tmpStr1, "W:%01.00fC", params.coolingWaterTempC); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "W:%01.00fC" : "W:%01.00fF"), celsius2temperature(params.coolingWaterTempC)); tft.setTextColor(TFT_CYAN, TFT_TEMP); tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (4 * 15), 2); - sprintf(tmpStr1, "C1:%01.00fC", params.coolantTemp1C); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "C1:%01.00fC" : "C1:%01.00fF"), celsius2temperature(params.coolantTemp1C)); tft.setTextColor(TFT_CYAN, TFT_TEMP); tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (5 * 15), 2); - sprintf(tmpStr1, "C2:%01.00fC", params.coolantTemp2C); + sprintf(tmpStr1, ((settings.temperatureUnit == 'c') ? "C2:%01.00fC" : "C2:%01.00fF"), celsius2temperature(params.coolantTemp2C)); tft.setTextColor(TFT_CYAN, TFT_TEMP); tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (6 * 15), 2); @@ -926,7 +953,7 @@ bool drawSceneSoc10Table(bool force) { tft.setTextDatum(TR_DATUM); tft.drawString("dis./char.kWh", 128, zeroY + (1 * 15), 2); - tft.drawString("km", 160, zeroY + (1 * 15), 2); + tft.drawString(((settings.distanceUnit == 'k') ? "km" : "mi"), 160, zeroY + (1 * 15), 2); tft.drawString("kWh100", 224, zeroY + (1 * 15), 2); tft.drawString("avg.speed", 310, zeroY + (1 * 15), 2); @@ -957,22 +984,22 @@ bool drawSceneSoc10Table(bool force) { diffCed0to5 = (i == 0) ? diffCed : diffCed0to5; } if (diffOdo != -1) { - sprintf(tmpStr1, "%01.00f", diffOdo); + sprintf(tmpStr1, "%01.00f", km2distance(diffOdo)); tft.drawString(tmpStr1, 160, zeroY + ((12 - i) * 15), 2); diffOdo0to5 = (i == 0) ? diffOdo : diffOdo0to5; if (diffTime > 0) { - sprintf(tmpStr1, "%01.01f", diffOdo / (diffTime / 3600)); + sprintf(tmpStr1, "%01.01f", km2distance(diffOdo) / (diffTime / 3600)); tft.drawString(tmpStr1, 310, zeroY + ((12 - i) * 15), 2); } } if (diffOdo > 0 && diffCed != 0) { - sprintf(tmpStr1, "%01.1f", (-diffCed * 100.0 / diffOdo)); + sprintf(tmpStr1, "%01.1f", (-diffCed * 100.0 / km2distance(diffOdo))); tft.drawString(tmpStr1, 224, zeroY + ((12 - i) * 15), 2); } } if (diffOdo == -1 && params.soc10odo[i] != -1) { - sprintf(tmpStr1, "%01.00f", params.soc10odo[i]); + sprintf(tmpStr1, "%01.00f", km2distance(params.soc10odo[i])); tft.drawString(tmpStr1, 160, zeroY + ((12 - i) * 15), 2); } } @@ -988,7 +1015,7 @@ bool drawSceneSoc10Table(bool force) { sprintf(tmpStr1, "+%01.01f", diffCec); tft.drawString(tmpStr1, 128, zeroY + (14 * 15), 2); diffOdo = (lastOdo != -1 && firstOdo != -1) ? lastOdo - firstOdo + diffOdo0to5 : 0; - sprintf(tmpStr1, "%01.00f", diffOdo); + sprintf(tmpStr1, "%01.00f", km2distance(diffOdo)); tft.drawString(tmpStr1, 160, zeroY + (14 * 15), 2); sprintf(tmpStr1, "AVAIL.CAP: %01.01f kWh", -diffCed - diffCec); tft.drawString(tmpStr1, 310, zeroY + (14 * 15), 2); @@ -1116,10 +1143,20 @@ bool menuItemClick() { // Other menus switch (tmpMenuItem.id) { // Set vehicle type - case 101: settings.carType = 1; break; + case 101: settings.carType = 0; break; + case 102: settings.carType = 1; break; // Screen orientation case 3011: settings.displayRotation = 1; tft.setRotation(settings.displayRotation); break; case 3012: settings.displayRotation = 3; tft.setRotation(settings.displayRotation); break; + // Distance + case 4011: settings.distanceUnit = 'k'; break; + case 4012: settings.distanceUnit = 'm'; break; + // Temperature + case 4021: settings.temperatureUnit = 'c'; break; + case 4022: settings.temperatureUnit = 'f'; break; + // Pressure + case 4031: settings.pressureUnit = 'b'; break; + case 4032: settings.pressureUnit = 'p'; break; // Pair ble device case 2: startBleScan(); return false; // Reset settings