v1.5 added Units menu and support for miles/psi/farenheits

This commit is contained in:
Lubos Petrovic
2020-06-04 13:37:52 +02:00
parent b857ee1df3
commit b84ad47025
2 changed files with 148 additions and 108 deletions

View File

@@ -44,6 +44,9 @@ Screen list
## Release notes ## Release notes
### v1.5 2020-06-03
- added support for different units (miles, farenheit, psi)
### v1.4 2020-05-29 ### v1.4 2020-05-29
- added menu - added menu
- Pairing with VGATE iCar Pro BLE4 adapter via menu! - Pairing with VGATE iCar Pro BLE4 adapter via menu!

View File

@@ -1,8 +1,8 @@
/* /*
KIA eNiro Dashboard 1.4, 2020-05-29 KIA eNiro Dashboard 1.5, 2020-06-03
!! working only with OBD BLE 4.0 adapters !! working only with OBD BLE 4.0 adapters
!! Supported adapter is Vgate ICar Pro (must be BLE4.0 version) !! Supported adapter is Vgate ICar Pro (must be BLE4.0 version)
!! Not working with standard BLUETOOTH 3 adapters !! Not working with standard BLUETOOTH 3 adapters
IMPORTANT Replace HM_MAC, serviceUUID, charTxUUID, charRxUUID as described below IMPORTANT Replace HM_MAC, serviceUUID, charTxUUID, charRxUUID as described below
@@ -54,7 +54,6 @@ uint32_t PIN = 1234;
// Misc // Misc
#define GFXFF 1 // TFT FOnts #define GFXFF 1 // TFT FOnts
#define PSI2BAR_DIVIDER 14.503773800722 // tires psi / 14,503773800722 -> bar
TFT_eSPI tft = TFT_eSPI(); TFT_eSPI tft = TFT_eSPI();
@@ -148,7 +147,7 @@ typedef struct {
char serviceUUID[40]; char serviceUUID[40];
} MENU_ITEM; } MENU_ITEM;
#define menuItemsCount 24 #define menuItemsCount 39
bool menuVisible = false; bool menuVisible = false;
uint16_t menuCurrent = 0; uint16_t menuCurrent = 0;
uint8_t menuItemSelected = 0; uint8_t menuItemSelected = 0;
@@ -159,36 +158,37 @@ MENU_ITEM menuItems[menuItemsCount] = {
{1, 0, -1, "Vehicle type"}, {1, 0, -1, "Vehicle type"},
{2, 0, -1, "Select OBD2BLE adapter"}, {2, 0, -1, "Select OBD2BLE adapter"},
{3, 0, -1, "Others"}, {3, 0, -1, "Others"},
//{4, 0, -1, "Units"}, {4, 0, -1, "Units"},
{8, 0, -1, "Factory reset"}, {8, 0, -1, "Factory reset"},
{9, 0, -1, "Save settings"}, {9, 0, -1, "Save settings"},
{100, 1, 0, "<- parent menu"}, {100, 1, 0, "<- parent menu"},
{101, 1, -1, "Kia eNiro 2020"}, {101, 1, -1, "Kia eNiro 2020"},
{102, 1, -1, "Hyundai Kona 2020"},
{300, 3, 0, "<- parent menu"}, {300, 3, 0, "<- parent menu"},
{301, 3, -1, "Screen rotation"}, {301, 3, -1, "Screen rotation"},
/*{400, 4, 0, "<- parent menu"}, {400, 4, 0, "<- parent menu"},
{401, 4, -1, "Distance"}, {401, 4, -1, "Distance"},
{402, 4, -1, "Temperature"}, {402, 4, -1, "Temperature"},
{403, 4, -1, "Pressure"}, {403, 4, -1, "Pressure"},
*/
{3010, 301, 3, "<- parent menu"}, {3010, 301, 3, "<- parent menu"},
{3011, 301, -1, "Normal"}, {3011, 301, -1, "Normal"},
{3012, 301, -1, "Flip vertical"}, {3012, 301, -1, "Flip vertical"},
/*
{4010, 401, 4, "<- parent menu"},
{4011, 401, -1, "Kilometers"},
{4012, 401, -1, "Miles"},
{4020, 402, 4, "<- parent menu"}, {4010, 401, 4, "<- parent menu"},
{4021, 402, -1, "Celsius"}, {4011, 401, -1, "Kilometers"},
{4022, 402, -1, "Fahrenheit"}, {4012, 401, -1, "Miles"},
{4030, 403, 4, "<- parent menu"}, {4020, 402, 4, "<- parent menu"},
{4031, 403, -1, "Bar"}, {4021, 402, -1, "Celsius"},
{4032, 403, -1, "Psi"},*/ {4022, 402, -1, "Fahrenheit"},
{4030, 403, 4, "<- parent menu"},
{4031, 403, -1, "Bar"},
{4032, 403, -1, "Psi"},
{9999, 9998, 0, "List of BLE devices"}, {9999, 9998, 0, "List of BLE devices"},
{10000, 9999, -1, "empty list"}, {10000, 9999, -1, "empty list"},
@@ -260,7 +260,7 @@ typedef struct {
typedef struct { typedef struct {
byte initFlag; // 183 value byte initFlag; // 183 value
byte settingsVersion; // 1 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 obdMacAddress[20];
char serviceUUID[40]; char serviceUUID[40];
char charTxUUID[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) PARAMS_STRUC oldParams; // Old states used for change detection (draw optimization)
SETTINGS_STRUC settings, tmpSettings; // Settings stored into flash 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 Load settings from flash memory, upgrade structure if version differs
*/ */
@@ -355,6 +307,54 @@ bool resetSettings() {
return true; 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 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); 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 Clear screen a display two lines message
*/ */
@@ -585,10 +606,16 @@ bool drawSceneMain(bool force) {
|| oldParams.cumulativeEnergyDischargedKWhStart != params.cumulativeEnergyDischargedKWhStart || oldParams.cumulativeEnergyDischargedKWhStart != params.cumulativeEnergyDischargedKWhStart
|| oldParams.cumulativeEnergyDischargedKWh != params.cumulativeEnergyDischargedKWh || oldParams.cumulativeEnergyDischargedKWh != params.cumulativeEnergyDischargedKWh
) { ) {
sprintf(tmpStr1, "%01.01fbar %02.00fC", params.tireFrontLeftPressureBar, params.tireFrontLeftTempC); char pressureStr[4] = "bar";
sprintf(tmpStr2, "%02.00fC %01.01fbar", params.tireFrontRightTempC, params.tireFrontRightPressureBar); char temperatureStr[2] = "C";
sprintf(tmpStr3, "%01.01fbar %02.00fC", params.tireRearLeftPressureBar, params.tireRearLeftTempC); if (settings.pressureUnit != 'b')
sprintf(tmpStr4, "%02.00fC %01.01fbar", params.tireRearRightTempC, params.tireRearRightPressureBar); 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); showTires(1, 0, 2, 1, tmpStr1, tmpStr2, tmpStr3, tmpStr4, TFT_BLACK);
// Added later - kwh total in tires box // Added later - kwh total in tires box
@@ -618,8 +645,8 @@ bool drawSceneMain(bool force) {
// batPowerKwh100 on roads, else batPowerAmp // batPowerKwh100 on roads, else batPowerAmp
if (params.speedKmh > 20) { if (params.speedKmh > 20) {
if (force || params.batPowerKwh100 != oldParams.batPowerKwh100) { if (force || params.batPowerKwh100 != oldParams.batPowerKwh100) {
sprintf(tmpStr1, "%01.01f", params.batPowerKwh100); sprintf(tmpStr1, "%01.01f", km2distance(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); 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; oldParams.batPowerKwh100 = params.batPowerKwh100;
} }
} else { } else {
@@ -665,14 +692,14 @@ bool drawSceneMain(bool force) {
// batTempC // batTempC
if (force || params.batTempC != oldParams.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); 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; oldParams.batTempC = params.batTempC;
} }
// batHeaterC // batHeaterC
if (force || params.batHeaterC != oldParams.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); monitoringRect(2, 3, 1, 1, tmpStr1, "BAT.HEAT C", TFT_TEMP, TFT_WHITE);
oldParams.batHeaterC = params.batHeaterC; oldParams.batHeaterC = params.batHeaterC;
} }
@@ -700,8 +727,8 @@ bool drawSceneMain(bool force) {
// indoorTemperature // indoorTemperature
if (force || params.indoorTemperature != oldParams.indoorTemperature || params.outdoorTemperature != oldParams.outdoorTemperature) { if (force || params.indoorTemperature != oldParams.indoorTemperature || params.outdoorTemperature != oldParams.outdoorTemperature) {
sprintf(tmpStr1, "%01.01f", params.indoorTemperature); sprintf(tmpStr1, "%01.01f", celsius2temperature(params.indoorTemperature));
sprintf(tmpStr2, "IN/OUT%01.01fC", params.outdoorTemperature); sprintf(tmpStr2, "IN/OUT%01.01f", celsius2temperature(params.outdoorTemperature));
monitoringRect(3, 3, 1, 1, tmpStr1, tmpStr2, TFT_TEMP, TFT_WHITE); monitoringRect(3, 3, 1, 1, tmpStr1, tmpStr2, TFT_TEMP, TFT_WHITE);
oldParams.indoorTemperature = params.indoorTemperature; oldParams.indoorTemperature = params.indoorTemperature;
oldParams.outdoorTemperature = params.outdoorTemperature; oldParams.outdoorTemperature = params.outdoorTemperature;
@@ -724,14 +751,14 @@ bool drawSceneSpeed(bool force) {
tft.setTextSize(2); // Size for small 5x7 font tft.setTextSize(2); // Size for small 5x7 font
sprintf(tmpStr3, " 0 "); sprintf(tmpStr3, " 0 ");
if (params.speedKmh > 10) if (params.speedKmh > 10)
sprintf(tmpStr3, " %01.00f ", params.speedKmh); sprintf(tmpStr3, " %01.00f ", km2distance(params.speedKmh));
tft.drawString(tmpStr3, posx, posy, 7); tft.drawString(tmpStr3, posx, posy, 7);
posy = 140; posy = 140;
tft.setTextDatum(TC_DATUM); // Top center tft.setTextDatum(TC_DATUM); // Top center
tft.setTextSize(1); tft.setTextSize(1);
if (params.speedKmh > 25 && params.batPowerKw < 0) { if (params.speedKmh > 25 && params.batPowerKw < 0) {
sprintf(tmpStr3, " %01.01f ", params.batPowerKwh100); sprintf(tmpStr3, " %01.01f ", km2distance(params.batPowerKwh100));
} else { } else {
sprintf(tmpStr3, " %01.01f ", params.batPowerKw); sprintf(tmpStr3, " %01.01f ", params.batPowerKw);
} }
@@ -741,7 +768,7 @@ bool drawSceneSpeed(bool force) {
tft.setFreeFont(&Roboto_Thin_24); tft.setFreeFont(&Roboto_Thin_24);
posx = 10; posx = 10;
posy = 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.setTextDatum(TL_DATUM);
tft.drawString(tmpStr3, posx, posy, GFXFF); tft.drawString(tmpStr3, posx, posy, GFXFF);
@@ -761,7 +788,7 @@ bool drawSceneSpeed(bool force) {
tft.drawString(tmpStr3, posx, posy, GFXFF); tft.drawString(tmpStr3, posx, posy, GFXFF);
// Battery "cold gate" detection - red < 15C (43KW limit), <25 (blue - 55kW limit), green all ok // 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.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.setTextColor(TFT_WHITE, (params.batTempC >= 15) ? ((params.batTempC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED);
tft.setFreeFont(&Roboto_Thin_24); tft.setFreeFont(&Roboto_Thin_24);
@@ -778,17 +805,17 @@ bool drawSceneBatteryCells(bool force) {
int32_t posx, posy; 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); 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); 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); 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); 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); 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); 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 tft.setTextDatum(TL_DATUM); // Topleft
@@ -840,13 +867,13 @@ bool drawSceneChargingGraph(bool force) {
sprintf(tmpStr1, "%03.00f", params.batVoltage); sprintf(tmpStr1, "%03.00f", params.batVoltage);
drawSmallRect(3, 0, 1, 1, tmpStr1, "VOLTAGE", TFT_TEMP, TFT_CYAN); 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); 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); 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); 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); drawSmallRect(3, 1, 1, 1, tmpStr1, "OUT.TEMP.", TFT_TEMP, TFT_CYAN);
tft.setTextColor(TFT_SILVER, TFT_TEMP); tft.setTextColor(TFT_SILVER, TFT_TEMP);
@@ -882,25 +909,25 @@ bool drawSceneChargingGraph(bool force) {
tft.setTextSize(1); // Size for small 5x7 font tft.setTextSize(1); // Size for small 5x7 font
tft.setTextDatum(TR_DATUM); 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.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); 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.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); 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.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); 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.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); 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.setTextColor(TFT_CYAN, TFT_TEMP);
tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (4 * 15), 2); 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.setTextColor(TFT_CYAN, TFT_TEMP);
tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (5 * 15), 2); 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.setTextColor(TFT_CYAN, TFT_TEMP);
tft.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (6 * 15), 2); 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.setTextDatum(TR_DATUM);
tft.drawString("dis./char.kWh", 128, zeroY + (1 * 15), 2); 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("kWh100", 224, zeroY + (1 * 15), 2);
tft.drawString("avg.speed", 310, 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; diffCed0to5 = (i == 0) ? diffCed : diffCed0to5;
} }
if (diffOdo != -1) { if (diffOdo != -1) {
sprintf(tmpStr1, "%01.00f", diffOdo); sprintf(tmpStr1, "%01.00f", km2distance(diffOdo));
tft.drawString(tmpStr1, 160, zeroY + ((12 - i) * 15), 2); tft.drawString(tmpStr1, 160, zeroY + ((12 - i) * 15), 2);
diffOdo0to5 = (i == 0) ? diffOdo : diffOdo0to5; diffOdo0to5 = (i == 0) ? diffOdo : diffOdo0to5;
if (diffTime > 0) { 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); tft.drawString(tmpStr1, 310, zeroY + ((12 - i) * 15), 2);
} }
} }
if (diffOdo > 0 && diffCed != 0) { 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); tft.drawString(tmpStr1, 224, zeroY + ((12 - i) * 15), 2);
} }
} }
if (diffOdo == -1 && params.soc10odo[i] != -1) { 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); tft.drawString(tmpStr1, 160, zeroY + ((12 - i) * 15), 2);
} }
} }
@@ -988,7 +1015,7 @@ bool drawSceneSoc10Table(bool force) {
sprintf(tmpStr1, "+%01.01f", diffCec); sprintf(tmpStr1, "+%01.01f", diffCec);
tft.drawString(tmpStr1, 128, zeroY + (14 * 15), 2); tft.drawString(tmpStr1, 128, zeroY + (14 * 15), 2);
diffOdo = (lastOdo != -1 && firstOdo != -1) ? lastOdo - firstOdo + diffOdo0to5 : 0; 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); tft.drawString(tmpStr1, 160, zeroY + (14 * 15), 2);
sprintf(tmpStr1, "AVAIL.CAP: %01.01f kWh", -diffCed - diffCec); sprintf(tmpStr1, "AVAIL.CAP: %01.01f kWh", -diffCed - diffCec);
tft.drawString(tmpStr1, 310, zeroY + (14 * 15), 2); tft.drawString(tmpStr1, 310, zeroY + (14 * 15), 2);
@@ -1116,10 +1143,20 @@ bool menuItemClick() {
// Other menus // Other menus
switch (tmpMenuItem.id) { switch (tmpMenuItem.id) {
// Set vehicle type // Set vehicle type
case 101: settings.carType = 1; break; case 101: settings.carType = 0; break;
case 102: settings.carType = 1; break;
// Screen orientation // Screen orientation
case 3011: settings.displayRotation = 1; tft.setRotation(settings.displayRotation); break; case 3011: settings.displayRotation = 1; tft.setRotation(settings.displayRotation); break;
case 3012: settings.displayRotation = 3; 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 // Pair ble device
case 2: startBleScan(); return false; case 2: startBleScan(); return false;
// Reset settings // Reset settings