diff --git a/Board320_240.cpp b/Board320_240.cpp index a9b2d87..5904167 100644 --- a/Board320_240.cpp +++ b/Board320_240.cpp @@ -13,31 +13,31 @@ void Board320_240::initBoard() { // Set button pins for input - pinMode(this->pinButtonMiddle, INPUT); - pinMode(this->pinButtonLeft, INPUT); - pinMode(this->pinButtonRight, INPUT); + pinMode(pinButtonMiddle, INPUT); + pinMode(pinButtonLeft, INPUT); + pinMode(pinButtonRight, INPUT); // mute speaker - if (this->pinSpeaker != 0) { + if (pinSpeaker != 0) { Serial.println("Mute speaker for m5stack"); - dacWrite(this->pinSpeaker, 0); + dacWrite(pinSpeaker, 0); } // Init display - Serial.println("Init this->tft display"); - this->tft.begin(); - this->tft.invertDisplay(this->invertDisplay); - this->tft.setRotation(this->liveData->settings.displayRotation); - this->setBrightness((this->liveData->settings.lcdBrightness == 0) ? 100 : this->liveData->settings.lcdBrightness); - this->tft.fillScreen(TFT_BLACK); + Serial.println("Init tft display"); + tft.begin(); + tft.invertDisplay(invertDisplay); + tft.setRotation(liveData->settings.displayRotation); + setBrightness((liveData->settings.lcdBrightness == 0) ? 100 : liveData->settings.lcdBrightness); + tft.fillScreen(TFT_BLACK); bool psramUsed = false; // 320x240 16bpp sprites requires psram #if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT) if (psramFound()) psramUsed = true; #endif - this->spr.setColorDepth((psramUsed) ? 16 : 8); - this->spr.createSprite(320, 240); + spr.setColorDepth((psramUsed) ? 16 : 8); + spr.createSprite(320, 240); } /** @@ -45,9 +45,9 @@ void Board320_240::initBoard() { */ void Board320_240::afterSetup() { // Show test data on right button during boot device - this->displayScreen = this->liveData->settings.defaultScreen; - if (digitalRead(this->pinButtonRight) == LOW) { - this->loadTestData(); + displayScreen = liveData->settings.defaultScreen; + if (digitalRead(pinButtonRight) == LOW) { + loadTestData(); } } @@ -65,13 +65,13 @@ void Board320_240::setBrightness(byte lcdBrightnessPerc) { void Board320_240::displayMessage(const char* row1, const char* row2) { // Must draw directly, withou sprite (due to psramFound check) - this->tft.fillScreen(TFT_BLACK); - this->tft.setTextDatum(ML_DATUM); - this->tft.setTextColor(TFT_WHITE, TFT_BLACK); - this->tft.setFreeFont(&Roboto_Thin_24); - this->tft.setTextDatum(BL_DATUM); - this->tft.drawString(row1, 0, 240 / 2, GFXFF); - this->tft.drawString(row2, 0, (240 / 2) + 30, GFXFF); + tft.fillScreen(TFT_BLACK); + tft.setTextDatum(ML_DATUM); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.setFreeFont(&Roboto_Thin_24); + tft.setTextDatum(BL_DATUM); + tft.drawString(row1, 0, 240 / 2, GFXFF); + tft.drawString(row2, 0, (240 / 2) + 30, GFXFF); } /** @@ -84,13 +84,13 @@ void Board320_240::drawBigCell(int32_t x, int32_t y, int32_t w, int32_t h, const posx = (x * 80) + 4; posy = (y * 60) + 1; - this->spr.fillRect(x * 80, y * 60, ((w) * 80) - 1, ((h) * 60) - 1, bgColor); - this->spr.drawFastVLine(((x + w) * 80) - 1, ((y) * 60) - 1, h * 60, TFT_BLACK); - this->spr.drawFastHLine(((x) * 80) - 1, ((y + h) * 60) - 1, w * 80, TFT_BLACK); - this->spr.setTextDatum(TL_DATUM); // Topleft - this->spr.setTextColor(TFT_SILVER, bgColor); // Bk, fg color - this->spr.setTextSize(1); // Size for small 5x7 font - this->spr.drawString(desc, posx, posy, 2); + spr.fillRect(x * 80, y * 60, ((w) * 80) - 1, ((h) * 60) - 1, bgColor); + spr.drawFastVLine(((x + w) * 80) - 1, ((y) * 60) - 1, h * 60, TFT_BLACK); + spr.drawFastHLine(((x) * 80) - 1, ((y + h) * 60) - 1, w * 80, TFT_BLACK); + spr.setTextDatum(TL_DATUM); // Topleft + spr.setTextColor(TFT_SILVER, bgColor); // Bk, fg color + spr.setTextSize(1); // Size for small 5x7 font + spr.drawString(desc, posx, posy, 2); // Big 2x2 cell in the middle of screen if (w == 2 && h == 2) { @@ -98,31 +98,31 @@ void Board320_240::drawBigCell(int32_t x, int32_t y, int32_t w, int32_t h, const // Bottom 2 numbers with charged/discharged kWh from start posx = (x * 80) + 5; posy = ((y + h) * 60) - 32; - sprintf(this->tmpStr3, "-%01.01f", this->liveData->params.cumulativeEnergyDischargedKWh - this->liveData->params.cumulativeEnergyDischargedKWhStart); - this->spr.setFreeFont(&Roboto_Thin_24); - this->spr.setTextDatum(TL_DATUM); - this->spr.drawString(this->tmpStr3, posx, posy, GFXFF); + sprintf(tmpStr3, "-%01.01f", liveData->params.cumulativeEnergyDischargedKWh - liveData->params.cumulativeEnergyDischargedKWhStart); + spr.setFreeFont(&Roboto_Thin_24); + spr.setTextDatum(TL_DATUM); + spr.drawString(tmpStr3, posx, posy, GFXFF); posx = ((x + w) * 80) - 8; - sprintf(this->tmpStr3, "+%01.01f", this->liveData->params.cumulativeEnergyChargedKWh - this->liveData->params.cumulativeEnergyChargedKWhStart); - this->spr.setTextDatum(TR_DATUM); - this->spr.drawString(this->tmpStr3, posx, posy, GFXFF); + sprintf(tmpStr3, "+%01.01f", liveData->params.cumulativeEnergyChargedKWh - liveData->params.cumulativeEnergyChargedKWhStart); + spr.setTextDatum(TR_DATUM); + spr.drawString(tmpStr3, posx, posy, GFXFF); // Main number - kwh on roads, amps on charges posy = (y * 60) + 24; - this->spr.setTextColor(fgColor, bgColor); - this->spr.setFreeFont(&Orbitron_Light_32); - this->spr.drawString(text, posx, posy, 7); + spr.setTextColor(fgColor, bgColor); + spr.setFreeFont(&Orbitron_Light_32); + spr.drawString(text, posx, posy, 7); } else { // All others 1x1 cells - this->spr.setTextDatum(MC_DATUM); - this->spr.setTextColor(fgColor, bgColor); - this->spr.setFreeFont(&Orbitron_Light_24); + spr.setTextDatum(MC_DATUM); + spr.setTextColor(fgColor, bgColor); + spr.setFreeFont(&Orbitron_Light_24); posx = (x * 80) + (w * 80 / 2) - 3; posy = (y * 60) + (h * 60 / 2) + 4; - this->spr.drawString(text, posx, posy, (w == 2 ? 7 : GFXFF)); + spr.drawString(text, posx, posy, (w == 2 ? 7 : GFXFF)); } } @@ -136,18 +136,18 @@ void Board320_240::drawSmallCell(int32_t x, int32_t y, int32_t w, int32_t h, con posx = (x * 80) + 4; posy = (y * 32) + 1; - this->spr.fillRect(x * 80, y * 32, ((w) * 80), ((h) * 32), bgColor); - this->spr.drawFastVLine(((x + w) * 80) - 1, ((y) * 32) - 1, h * 32, TFT_BLACK); - this->spr.drawFastHLine(((x) * 80) - 1, ((y + h) * 32) - 1, w * 80, TFT_BLACK); - this->spr.setTextDatum(TL_DATUM); // Topleft - this->spr.setTextColor(TFT_SILVER, bgColor); // Bk, fg bgColor - this->spr.setTextSize(1); // Size for small 5x7 font - this->spr.drawString(desc, posx, posy, 2); + spr.fillRect(x * 80, y * 32, ((w) * 80), ((h) * 32), bgColor); + spr.drawFastVLine(((x + w) * 80) - 1, ((y) * 32) - 1, h * 32, TFT_BLACK); + spr.drawFastHLine(((x) * 80) - 1, ((y + h) * 32) - 1, w * 80, TFT_BLACK); + spr.setTextDatum(TL_DATUM); // Topleft + spr.setTextColor(TFT_SILVER, bgColor); // Bk, fg bgColor + spr.setTextSize(1); // Size for small 5x7 font + spr.drawString(desc, posx, posy, 2); - this->spr.setTextDatum(TC_DATUM); - this->spr.setTextColor(fgColor, bgColor); + spr.setTextDatum(TC_DATUM); + spr.setTextColor(fgColor, bgColor); posx = (x * 80) + (w * 80 / 2) - 3; - this->spr.drawString(text, posx, posy + 14, 2); + spr.drawString(text, posx, posy + 14, 2); } /** @@ -158,25 +158,25 @@ void Board320_240::showTires(int32_t x, int32_t y, int32_t w, int32_t h, const c int32_t posx, posy; - this->spr.fillRect(x * 80, y * 60, ((w) * 80) - 1, ((h) * 60) - 1, color); - this->spr.drawFastVLine(((x + w) * 80) - 1, ((y) * 60) - 1, h * 60, TFT_BLACK); - this->spr.drawFastHLine(((x) * 80) - 1, ((y + h) * 60) - 1, w * 80, TFT_BLACK); + spr.fillRect(x * 80, y * 60, ((w) * 80) - 1, ((h) * 60) - 1, color); + spr.drawFastVLine(((x + w) * 80) - 1, ((y) * 60) - 1, h * 60, TFT_BLACK); + spr.drawFastHLine(((x) * 80) - 1, ((y + h) * 60) - 1, w * 80, TFT_BLACK); - this->spr.setTextDatum(TL_DATUM); - this->spr.setTextColor(TFT_SILVER, color); - this->spr.setTextSize(1); + spr.setTextDatum(TL_DATUM); + spr.setTextColor(TFT_SILVER, color); + spr.setTextSize(1); posx = (x * 80) + 4; posy = (y * 60) + 0; - this->spr.drawString(topleft, posx, posy, 2); + spr.drawString(topleft, posx, posy, 2); posy = (y * 60) + 14; - this->spr.drawString(bottomleft, posx, posy, 2); + spr.drawString(bottomleft, posx, posy, 2); - this->spr.setTextDatum(TR_DATUM); + spr.setTextDatum(TR_DATUM); posx = ((x + w) * 80) - 4; posy = (y * 60) + 0; - this->spr.drawString(topright, posx, posy, 2); + spr.drawString(topright, posx, posy, 2); posy = (y * 60) + 14; - this->spr.drawString(bottomright, posx, posy, 2); + spr.drawString(bottomright, posx, posy, 2); } /** @@ -187,79 +187,79 @@ void Board320_240::drawSceneMain() { // Tire pressure char pressureStr[4] = "bar"; char temperatureStr[2] = "C"; - if (this->liveData->settings.pressureUnit != 'b') + if (liveData->settings.pressureUnit != 'b') strcpy(pressureStr, "psi"); - if (this->liveData->settings.temperatureUnit != 'c') + if (liveData->settings.temperatureUnit != 'c') strcpy(temperatureStr, "F"); - sprintf(this->tmpStr1, "%01.01f%s %02.00f%s", this->liveData->bar2pressure(this->liveData->params.tireFrontLeftPressureBar), pressureStr, this->liveData->celsius2temperature(this->liveData->params.tireFrontLeftTempC), temperatureStr); - sprintf(this->tmpStr2, "%02.00f%s %01.01f%s", this->liveData->celsius2temperature(this->liveData->params.tireFrontRightTempC), temperatureStr, this->liveData->bar2pressure(this->liveData->params.tireFrontRightPressureBar), pressureStr); - sprintf(this->tmpStr3, "%01.01f%s %02.00f%s", this->liveData->bar2pressure(this->liveData->params.tireRearLeftPressureBar), pressureStr, this->liveData->celsius2temperature(this->liveData->params.tireRearLeftTempC), temperatureStr); - sprintf(this->tmpStr4, "%02.00f%s %01.01f%s", this->liveData->celsius2temperature(this->liveData->params.tireRearRightTempC), temperatureStr, this->liveData->bar2pressure(this->liveData->params.tireRearRightPressureBar), pressureStr); - showTires(1, 0, 2, 1, this->tmpStr1, this->tmpStr2, this->tmpStr3, this->tmpStr4, TFT_BLACK); + sprintf(tmpStr1, "%01.01f%s %02.00f%s", liveData->bar2pressure(liveData->params.tireFrontLeftPressureBar), pressureStr, liveData->celsius2temperature(liveData->params.tireFrontLeftTempC), temperatureStr); + sprintf(tmpStr2, "%02.00f%s %01.01f%s", liveData->celsius2temperature(liveData->params.tireFrontRightTempC), temperatureStr, liveData->bar2pressure(liveData->params.tireFrontRightPressureBar), pressureStr); + sprintf(tmpStr3, "%01.01f%s %02.00f%s", liveData->bar2pressure(liveData->params.tireRearLeftPressureBar), pressureStr, liveData->celsius2temperature(liveData->params.tireRearLeftTempC), temperatureStr); + sprintf(tmpStr4, "%02.00f%s %01.01f%s", liveData->celsius2temperature(liveData->params.tireRearRightTempC), temperatureStr, liveData->bar2pressure(liveData->params.tireRearRightPressureBar), pressureStr); + showTires(1, 0, 2, 1, tmpStr1, tmpStr2, tmpStr3, tmpStr4, TFT_BLACK); // Added later - kwh total in tires box // TODO: refactoring - this->spr.setTextDatum(TL_DATUM); - this->spr.setTextColor(TFT_GREEN, TFT_BLACK); - sprintf(this->tmpStr1, "C: %01.01f +%01.01fkWh", this->liveData->params.cumulativeEnergyChargedKWh, this->liveData->params.cumulativeEnergyChargedKWh - this->liveData->params.cumulativeEnergyChargedKWhStart); - this->spr.drawString(this->tmpStr1, (1 * 80) + 4, (0 * 60) + 30, 2); - this->spr.setTextColor(TFT_YELLOW, TFT_BLACK); - sprintf(this->tmpStr1, "D: %01.01f -%01.01fkWh", this->liveData->params.cumulativeEnergyDischargedKWh, this->liveData->params.cumulativeEnergyDischargedKWh - this->liveData->params.cumulativeEnergyDischargedKWhStart); - this->spr.drawString(this->tmpStr1, (1 * 80) + 4, (0 * 60) + 44, 2); + spr.setTextDatum(TL_DATUM); + spr.setTextColor(TFT_GREEN, TFT_BLACK); + sprintf(tmpStr1, "C: %01.01f +%01.01fkWh", liveData->params.cumulativeEnergyChargedKWh, liveData->params.cumulativeEnergyChargedKWh - liveData->params.cumulativeEnergyChargedKWhStart); + spr.drawString(tmpStr1, (1 * 80) + 4, (0 * 60) + 30, 2); + spr.setTextColor(TFT_YELLOW, TFT_BLACK); + sprintf(tmpStr1, "D: %01.01f -%01.01fkWh", liveData->params.cumulativeEnergyDischargedKWh, liveData->params.cumulativeEnergyDischargedKWh - liveData->params.cumulativeEnergyDischargedKWhStart); + spr.drawString(tmpStr1, (1 * 80) + 4, (0 * 60) + 44, 2); // batPowerKwh100 on roads, else batPowerAmp - if (this->liveData->params.speedKmh > 20) { - sprintf(this->tmpStr1, "%01.01f", this->liveData->km2distance(this->liveData->params.batPowerKwh100)); - drawBigCell(1, 1, 2, 2, this->tmpStr1, ((this->liveData->settings.distanceUnit == 'k') ? "POWER KWH/100KM" : "POWER KWH/100MI"), (this->liveData->params.batPowerKwh100 >= 0 ? TFT_DARKGREEN2 : (this->liveData->params.batPowerKwh100 < -30.0 ? TFT_RED : TFT_DARKRED)), TFT_WHITE); + if (liveData->params.speedKmh > 20) { + sprintf(tmpStr1, "%01.01f", liveData->km2distance(liveData->params.batPowerKwh100)); + drawBigCell(1, 1, 2, 2, tmpStr1, ((liveData->settings.distanceUnit == 'k') ? "POWER KWH/100KM" : "POWER KWH/100MI"), (liveData->params.batPowerKwh100 >= 0 ? TFT_DARKGREEN2 : (liveData->params.batPowerKwh100 < -30.0 ? TFT_RED : TFT_DARKRED)), TFT_WHITE); } else { // batPowerAmp on chargers (under 10kmh) - sprintf(this->tmpStr1, "%01.01f", this->liveData->params.batPowerKw); - drawBigCell(1, 1, 2, 2, this->tmpStr1, "POWER KW", (this->liveData->params.batPowerKw >= 0 ? TFT_DARKGREEN2 : (this->liveData->params.batPowerKw <= -30 ? TFT_RED : TFT_DARKRED)), TFT_WHITE); + sprintf(tmpStr1, "%01.01f", liveData->params.batPowerKw); + drawBigCell(1, 1, 2, 2, tmpStr1, "POWER KW", (liveData->params.batPowerKw >= 0 ? TFT_DARKGREEN2 : (liveData->params.batPowerKw <= -30 ? TFT_RED : TFT_DARKRED)), TFT_WHITE); } // socPerc - sprintf(this->tmpStr1, "%01.00f%%", this->liveData->params.socPerc); - sprintf(this->tmpStr2, (this->liveData->params.sohPerc == 100.0 ? "SOC/H%01.00f%%" : "SOC/H%01.01f%%"), this->liveData->params.sohPerc); - drawBigCell(0, 0, 1, 1, this->tmpStr1, this->tmpStr2, (this->liveData->params.socPerc < 10 || this->liveData->params.sohPerc < 100 ? TFT_RED : (this->liveData->params.socPerc > 80 ? TFT_DARKGREEN2 : TFT_DEFAULT_BK)), TFT_WHITE); + sprintf(tmpStr1, "%01.00f%%", liveData->params.socPerc); + sprintf(tmpStr2, (liveData->params.sohPerc == 100.0 ? "SOC/H%01.00f%%" : "SOC/H%01.01f%%"), liveData->params.sohPerc); + drawBigCell(0, 0, 1, 1, tmpStr1, tmpStr2, (liveData->params.socPerc < 10 || liveData->params.sohPerc < 100 ? TFT_RED : (liveData->params.socPerc > 80 ? TFT_DARKGREEN2 : TFT_DEFAULT_BK)), TFT_WHITE); // batPowerAmp - sprintf(this->tmpStr1, (abs(this->liveData->params.batPowerAmp) > 9.9 ? "%01.00f" : "%01.01f"), this->liveData->params.batPowerAmp); - drawBigCell(0, 1, 1, 1, this->tmpStr1, "CURRENT A", (this->liveData->params.batPowerAmp >= 0 ? TFT_DARKGREEN2 : TFT_DARKRED), TFT_WHITE); + sprintf(tmpStr1, (abs(liveData->params.batPowerAmp) > 9.9 ? "%01.00f" : "%01.01f"), liveData->params.batPowerAmp); + drawBigCell(0, 1, 1, 1, tmpStr1, "CURRENT A", (liveData->params.batPowerAmp >= 0 ? TFT_DARKGREEN2 : TFT_DARKRED), TFT_WHITE); // batVoltage - sprintf(this->tmpStr1, "%03.00f", this->liveData->params.batVoltage); - drawBigCell(0, 2, 1, 1, this->tmpStr1, "VOLTAGE", TFT_DEFAULT_BK, TFT_WHITE); + sprintf(tmpStr1, "%03.00f", liveData->params.batVoltage); + drawBigCell(0, 2, 1, 1, tmpStr1, "VOLTAGE", TFT_DEFAULT_BK, TFT_WHITE); // batCellMinV - sprintf(this->tmpStr1, "%01.02f", this->liveData->params.batCellMaxV - this->liveData->params.batCellMinV); - sprintf(this->tmpStr2, "CELLS %01.02f", this->liveData->params.batCellMinV); - drawBigCell(0, 3, 1, 1, ( this->liveData->params.batCellMaxV - this->liveData->params.batCellMinV == 0.00 ? "OK" : this->tmpStr1), this->tmpStr2, TFT_DEFAULT_BK, TFT_WHITE); + sprintf(tmpStr1, "%01.02f", liveData->params.batCellMaxV - liveData->params.batCellMinV); + sprintf(tmpStr2, "CELLS %01.02f", liveData->params.batCellMinV); + drawBigCell(0, 3, 1, 1, ( liveData->params.batCellMaxV - liveData->params.batCellMinV == 0.00 ? "OK" : tmpStr1), tmpStr2, TFT_DEFAULT_BK, TFT_WHITE); // batTempC - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f" : "%01.01f"), this->liveData->celsius2temperature(this->liveData->params.batMinC)); - sprintf(this->tmpStr2, ((this->liveData->settings.temperatureUnit == 'c') ? "BATT. %01.00fC" : "BATT. %01.01fF"), this->liveData->celsius2temperature(this->liveData->params.batMaxC)); - drawBigCell(1, 3, 1, 1, this->tmpStr1, this->tmpStr2, TFT_TEMP, (this->liveData->params.batTempC >= 15) ? ((this->liveData->params.batTempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f" : "%01.01f"), liveData->celsius2temperature(liveData->params.batMinC)); + sprintf(tmpStr2, ((liveData->settings.temperatureUnit == 'c') ? "BATT. %01.00fC" : "BATT. %01.01fF"), liveData->celsius2temperature(liveData->params.batMaxC)); + drawBigCell(1, 3, 1, 1, tmpStr1, tmpStr2, TFT_TEMP, (liveData->params.batTempC >= 15) ? ((liveData->params.batTempC >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); // batHeaterC - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f" : "%01.01f"), this->liveData->celsius2temperature(this->liveData->params.batHeaterC)); - drawBigCell(2, 3, 1, 1, this->tmpStr1, "BAT.HEAT", TFT_TEMP, TFT_WHITE); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f" : "%01.01f"), liveData->celsius2temperature(liveData->params.batHeaterC)); + drawBigCell(2, 3, 1, 1, tmpStr1, "BAT.HEAT", TFT_TEMP, TFT_WHITE); // Aux perc - sprintf(this->tmpStr1, "%01.00f%%", this->liveData->params.auxPerc); - drawBigCell(3, 0, 1, 1, this->tmpStr1, "AUX BAT.", (this->liveData->params.auxPerc < 60 ? TFT_RED : TFT_DEFAULT_BK), TFT_WHITE); + sprintf(tmpStr1, "%01.00f%%", liveData->params.auxPerc); + drawBigCell(3, 0, 1, 1, tmpStr1, "AUX BAT.", (liveData->params.auxPerc < 60 ? TFT_RED : TFT_DEFAULT_BK), TFT_WHITE); // Aux amp - sprintf(this->tmpStr1, (abs(this->liveData->params.auxCurrentAmp) > 9.9 ? "%01.00f" : "%01.01f"), this->liveData->params.auxCurrentAmp); - drawBigCell(3, 1, 1, 1, this->tmpStr1, "AUX AMPS", (this->liveData->params.auxCurrentAmp >= 0 ? TFT_DARKGREEN2 : TFT_DARKRED), TFT_WHITE); + sprintf(tmpStr1, (abs(liveData->params.auxCurrentAmp) > 9.9 ? "%01.00f" : "%01.01f"), liveData->params.auxCurrentAmp); + drawBigCell(3, 1, 1, 1, tmpStr1, "AUX AMPS", (liveData->params.auxCurrentAmp >= 0 ? TFT_DARKGREEN2 : TFT_DARKRED), TFT_WHITE); // auxVoltage - sprintf(this->tmpStr1, "%01.01f", this->liveData->params.auxVoltage); - drawBigCell(3, 2, 1, 1, this->tmpStr1, "AUX VOLTS", (this->liveData->params.auxVoltage < 12.1 ? TFT_RED : (this->liveData->params.auxVoltage < 12.6 ? TFT_ORANGE : TFT_DEFAULT_BK)), TFT_WHITE); + sprintf(tmpStr1, "%01.01f", liveData->params.auxVoltage); + drawBigCell(3, 2, 1, 1, tmpStr1, "AUX VOLTS", (liveData->params.auxVoltage < 12.1 ? TFT_RED : (liveData->params.auxVoltage < 12.6 ? TFT_ORANGE : TFT_DEFAULT_BK)), TFT_WHITE); // indoorTemperature - sprintf(this->tmpStr1, "%01.01f", this->liveData->celsius2temperature(this->liveData->params.indoorTemperature)); - sprintf(this->tmpStr2, "IN/OUT%01.01f", this->liveData->celsius2temperature(this->liveData->params.outdoorTemperature)); - drawBigCell(3, 3, 1, 1, this->tmpStr1, this->tmpStr2, TFT_TEMP, TFT_WHITE); + sprintf(tmpStr1, "%01.01f", liveData->celsius2temperature(liveData->params.indoorTemperature)); + sprintf(tmpStr2, "IN/OUT%01.01f", liveData->celsius2temperature(liveData->params.outdoorTemperature)); + drawBigCell(3, 3, 1, 1, tmpStr1, tmpStr2, TFT_TEMP, TFT_WHITE); } /** @@ -270,124 +270,124 @@ void Board320_240::drawSceneSpeed() { int32_t posx, posy; // HUD - if (this->displayScreenSpeedHud) { + if (displayScreenSpeedHud) { // Change rotation to vertical & mirror - if (this->tft.getRotation() != 6) { - this->tft.setRotation(6); + if (tft.getRotation() != 6) { + tft.setRotation(6); } - this->tft.fillScreen(TFT_BLACK); - this->tft.setTextDatum(TR_DATUM); // top-right alignment - this->tft.setTextColor(TFT_WHITE, TFT_BLACK); // foreground, background text color + tft.fillScreen(TFT_BLACK); + tft.setTextDatum(TR_DATUM); // top-right alignment + tft.setTextColor(TFT_WHITE, TFT_BLACK); // foreground, background text color // Draw speed - this->tft.setTextSize((this->liveData->params.speedKmh > 99) ? 1 : 2); - sprintf(this->tmpStr3, "0"); - if (this->liveData->params.speedKmh > 10) - sprintf(this->tmpStr3, "%01.00f", this->liveData->km2distance(this->liveData->params.speedKmh)); - this->tft.drawString(this->tmpStr3, 240, 0, 8); + tft.setTextSize((liveData->params.speedKmh > 99) ? 1 : 2); + sprintf(tmpStr3, "0"); + if (liveData->params.speedKmh > 10) + sprintf(tmpStr3, "%01.00f", liveData->km2distance(liveData->params.speedKmh)); + tft.drawString(tmpStr3, 240, 0, 8); // Draw power kWh/100km (>25kmh) else kW - this->tft.setTextSize(1); - if (this->liveData->params.speedKmh > 25 && this->liveData->params.batPowerKw < 0) - sprintf(this->tmpStr3, "%01.01f", this->liveData->km2distance(this->liveData->params.batPowerKwh100)); + tft.setTextSize(1); + if (liveData->params.speedKmh > 25 && liveData->params.batPowerKw < 0) + sprintf(tmpStr3, "%01.01f", liveData->km2distance(liveData->params.batPowerKwh100)); else - sprintf(this->tmpStr3, "%01.01f", this->liveData->params.batPowerKw); - this->tft.drawString(this->tmpStr3, 240, 150, 8); + sprintf(tmpStr3, "%01.01f", liveData->params.batPowerKw); + tft.drawString(tmpStr3, 240, 150, 8); // Draw soc% - sprintf(this->tmpStr3, "%01.00f", this->liveData->params.socPerc); - this->tft.drawString(this->tmpStr3, 240 , 230, 8); + sprintf(tmpStr3, "%01.00f", liveData->params.socPerc); + tft.drawString(tmpStr3, 240 , 230, 8); // Cold gate cirlce - this->tft.fillCircle(30, 280, 25, (this->liveData->params.batTempC >= 15) ? ((this->liveData->params.batTempC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED); + tft.fillCircle(30, 280, 25, (liveData->params.batTempC >= 15) ? ((liveData->params.batTempC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED); // Brake lights - this->tft.fillRect(0, 310, 240, 10, (this->liveData->params.brakeLights) ? TFT_RED : TFT_BLACK); + tft.fillRect(0, 310, 240, 10, (liveData->params.brakeLights) ? TFT_RED : TFT_BLACK); return; } // - this->spr.fillRect(0, 36, 200, 160, TFT_DARKRED); + spr.fillRect(0, 36, 200, 160, TFT_DARKRED); posx = 320 / 2; posy = 40; - this->spr.setTextDatum(TR_DATUM); - this->spr.setTextColor(TFT_WHITE, TFT_DARKRED); - this->spr.setTextSize(2); // Size for small 5cix7 font - sprintf(this->tmpStr3, "0"); - if (this->liveData->params.speedKmh > 10) - sprintf(this->tmpStr3, "%01.00f", this->liveData->km2distance(this->liveData->params.speedKmh)); - this->spr.drawString(this->tmpStr3, 200, posy, 7); + spr.setTextDatum(TR_DATUM); + spr.setTextColor(TFT_WHITE, TFT_DARKRED); + spr.setTextSize(2); // Size for small 5cix7 font + sprintf(tmpStr3, "0"); + if (liveData->params.speedKmh > 10) + sprintf(tmpStr3, "%01.00f", liveData->km2distance(liveData->params.speedKmh)); + spr.drawString(tmpStr3, 200, posy, 7); posy = 145; - this->spr.setTextDatum(TR_DATUM); // Top center - this->spr.setTextSize(1); - if (this->liveData->params.speedKmh > 25 && this->liveData->params.batPowerKw < 0) { - sprintf(this->tmpStr3, "%01.01f", this->liveData->km2distance(this->liveData->params.batPowerKwh100)); + spr.setTextDatum(TR_DATUM); // Top center + spr.setTextSize(1); + if (liveData->params.speedKmh > 25 && liveData->params.batPowerKw < 0) { + sprintf(tmpStr3, "%01.01f", liveData->km2distance(liveData->params.batPowerKwh100)); } else { - sprintf(this->tmpStr3, "%01.01f", this->liveData->params.batPowerKw); + sprintf(tmpStr3, "%01.01f", liveData->params.batPowerKw); } - this->spr.drawString(this->tmpStr3, 200, posy, 7); + spr.drawString(tmpStr3, 200, posy, 7); // Bottom 2 numbers with charged/discharged kWh from start - this->spr.setFreeFont(&Roboto_Thin_24); - this->spr.setTextColor(TFT_WHITE, TFT_BLACK); + spr.setFreeFont(&Roboto_Thin_24); + spr.setTextColor(TFT_WHITE, TFT_BLACK); posx = 5; posy = 5; - this->spr.setTextDatum(TL_DATUM); - sprintf(this->tmpStr3, ((this->liveData->settings.distanceUnit == 'k') ? "%01.00fkm " : "%01.00fmi "), this->liveData->km2distance(this->liveData->params.odoKm)); - this->spr.drawString(this->tmpStr3, posx, posy, GFXFF); - if (this->liveData->params.motorRpm > -1) { - this->spr.setTextDatum(TR_DATUM); - sprintf(this->tmpStr3, " %01.00frpm" , this->liveData->params.motorRpm); - this->spr.drawString(this->tmpStr3, 320 - posx, posy, GFXFF); + spr.setTextDatum(TL_DATUM); + sprintf(tmpStr3, ((liveData->settings.distanceUnit == 'k') ? "%01.00fkm " : "%01.00fmi "), liveData->km2distance(liveData->params.odoKm)); + spr.drawString(tmpStr3, posx, posy, GFXFF); + if (liveData->params.motorRpm > -1) { + spr.setTextDatum(TR_DATUM); + sprintf(tmpStr3, " %01.00frpm" , liveData->params.motorRpm); + spr.drawString(tmpStr3, 320 - posx, posy, GFXFF); } // Bottom info // Cummulative regen/power posy = 240 - 5; - sprintf(this->tmpStr3, "-%01.01f ", this->liveData->params.cumulativeEnergyDischargedKWh - this->liveData->params.cumulativeEnergyDischargedKWhStart); - this->spr.setTextDatum(BL_DATUM); - this->spr.drawString(this->tmpStr3, posx, posy, GFXFF); + sprintf(tmpStr3, "-%01.01f ", liveData->params.cumulativeEnergyDischargedKWh - liveData->params.cumulativeEnergyDischargedKWhStart); + spr.setTextDatum(BL_DATUM); + spr.drawString(tmpStr3, posx, posy, GFXFF); posx = 320 - 5; - sprintf(this->tmpStr3, " +%01.01f", this->liveData->params.cumulativeEnergyChargedKWh - this->liveData->params.cumulativeEnergyChargedKWhStart); - this->spr.setTextDatum(BR_DATUM); - this->spr.drawString(this->tmpStr3, posx, posy, GFXFF); + sprintf(tmpStr3, " +%01.01f", liveData->params.cumulativeEnergyChargedKWh - liveData->params.cumulativeEnergyChargedKWhStart); + spr.setTextDatum(BR_DATUM); + spr.drawString(tmpStr3, posx, posy, GFXFF); // Bat.power posx = 320 / 2; - sprintf(this->tmpStr3, " %01.01fkw ", this->liveData->params.batPowerKw); - this->spr.setTextDatum(BC_DATUM); - this->spr.drawString(this->tmpStr3, posx, posy, GFXFF); + sprintf(tmpStr3, " %01.01fkw ", liveData->params.batPowerKw); + spr.setTextDatum(BC_DATUM); + spr.drawString(tmpStr3, posx, posy, GFXFF); // RIGHT INFO // Battery "cold gate" detection - red < 15C (43KW limit), <25 (blue - 55kW limit), green all ok - this->spr.fillCircle(290, 60, 25, (this->liveData->params.batTempC >= 15) ? ((this->liveData->params.batTempC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED); - this->spr.setTextColor(TFT_WHITE, (this->liveData->params.batTempC >= 15) ? ((this->liveData->params.batTempC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED); - this->spr.setFreeFont(&Roboto_Thin_24); - this->spr.setTextDatum(MC_DATUM); - sprintf(this->tmpStr3, "%01.00f", this->liveData->celsius2temperature(this->liveData->params.batTempC)); - this->spr.drawString(this->tmpStr3, 290, 60, GFXFF); + spr.fillCircle(290, 60, 25, (liveData->params.batTempC >= 15) ? ((liveData->params.batTempC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED); + spr.setTextColor(TFT_WHITE, (liveData->params.batTempC >= 15) ? ((liveData->params.batTempC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED); + spr.setFreeFont(&Roboto_Thin_24); + spr.setTextDatum(MC_DATUM); + sprintf(tmpStr3, "%01.00f", liveData->celsius2temperature(liveData->params.batTempC)); + spr.drawString(tmpStr3, 290, 60, GFXFF); // Brake lights - this->spr.fillRect(210, 40, 40, 40, (this->liveData->params.brakeLights) ? TFT_RED : TFT_BLACK); + spr.fillRect(210, 40, 40, 40, (liveData->params.brakeLights) ? TFT_RED : TFT_BLACK); // Soc%, bat.kWh - this->spr.setFreeFont(&Orbitron_Light_32); - this->spr.setTextColor(TFT_WHITE, TFT_BLACK); - this->spr.setTextDatum(TR_DATUM); - sprintf(this->tmpStr3, " %01.00f%%", this->liveData->params.socPerc); - this->spr.drawString(this->tmpStr3, 320, 94, GFXFF); - if (this->liveData->params.socPerc > 0) { - float capacity = this->liveData->params.batteryTotalAvailableKWh * (this->liveData->params.socPerc / 100); + spr.setFreeFont(&Orbitron_Light_32); + spr.setTextColor(TFT_WHITE, TFT_BLACK); + spr.setTextDatum(TR_DATUM); + sprintf(tmpStr3, " %01.00f%%", liveData->params.socPerc); + spr.drawString(tmpStr3, 320, 94, GFXFF); + if (liveData->params.socPerc > 0) { + float capacity = liveData->params.batteryTotalAvailableKWh * (liveData->params.socPerc / 100); // calibration for Niro/Kona, real available capacity is ~66.5kWh, 0-10% ~6.2kWh, 90-100% ~7.2kWh - if (this->liveData->settings.carType == CAR_KIA_ENIRO_2020_64 || this->liveData->settings.carType == CAR_HYUNDAI_KONA_2020_64) { - capacity = (this->liveData->params.socPerc * 0.615) * (1 + (this->liveData->params.socPerc * 0.0008)); + if (liveData->settings.carType == CAR_KIA_ENIRO_2020_64 || liveData->settings.carType == CAR_HYUNDAI_KONA_2020_64) { + capacity = (liveData->params.socPerc * 0.615) * (1 + (liveData->params.socPerc * 0.0008)); } - sprintf(this->tmpStr3, " %01.01f", capacity); - this->spr.drawString(this->tmpStr3, 320, 129, GFXFF); - this->spr.drawString("kWh", 320, 164, GFXFF); + sprintf(tmpStr3, " %01.01f", capacity); + spr.drawString(tmpStr3, 320, 129, GFXFF); + spr.drawString("kWh", 320, 164, GFXFF); } } @@ -398,59 +398,59 @@ void Board320_240::drawSceneBatteryCells() { int32_t posx, posy; - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.batHeaterC)); - drawSmallCell(0, 0, 1, 1, this->tmpStr1, "HEATER", TFT_TEMP, TFT_CYAN); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.batInletC)); - drawSmallCell(1, 0, 1, 1, this->tmpStr1, "BAT.INLET", TFT_TEMP, TFT_CYAN); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.batModuleTempC[0])); - drawSmallCell(0, 1, 1, 1, this->tmpStr1, "MO1", TFT_TEMP, (this->liveData->params.batModuleTempC[0] >= 15) ? ((this->liveData->params.batModuleTempC[0] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.batModuleTempC[1])); - drawSmallCell(1, 1, 1, 1, this->tmpStr1, "MO2", TFT_TEMP, (this->liveData->params.batModuleTempC[1] >= 15) ? ((this->liveData->params.batModuleTempC[1] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.batModuleTempC[2])); - drawSmallCell(2, 1, 1, 1, this->tmpStr1, "MO3", TFT_TEMP, (this->liveData->params.batModuleTempC[2] >= 15) ? ((this->liveData->params.batModuleTempC[2] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.batModuleTempC[3])); - drawSmallCell(3, 1, 1, 1, this->tmpStr1, "MO4", TFT_TEMP, (this->liveData->params.batModuleTempC[3] >= 15) ? ((this->liveData->params.batModuleTempC[3] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.batHeaterC)); + drawSmallCell(0, 0, 1, 1, tmpStr1, "HEATER", TFT_TEMP, TFT_CYAN); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.batInletC)); + drawSmallCell(1, 0, 1, 1, tmpStr1, "BAT.INLET", TFT_TEMP, TFT_CYAN); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.batModuleTempC[0])); + drawSmallCell(0, 1, 1, 1, tmpStr1, "MO1", TFT_TEMP, (liveData->params.batModuleTempC[0] >= 15) ? ((liveData->params.batModuleTempC[0] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.batModuleTempC[1])); + drawSmallCell(1, 1, 1, 1, tmpStr1, "MO2", TFT_TEMP, (liveData->params.batModuleTempC[1] >= 15) ? ((liveData->params.batModuleTempC[1] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.batModuleTempC[2])); + drawSmallCell(2, 1, 1, 1, tmpStr1, "MO3", TFT_TEMP, (liveData->params.batModuleTempC[2] >= 15) ? ((liveData->params.batModuleTempC[2] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.batModuleTempC[3])); + drawSmallCell(3, 1, 1, 1, tmpStr1, "MO4", TFT_TEMP, (liveData->params.batModuleTempC[3] >= 15) ? ((liveData->params.batModuleTempC[3] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED); // Ioniq (up to 12 cells) - for (uint16_t i = 4; i < this->liveData->params.batModuleTempCount; i++) { - if (this->liveData->params.batModuleTempC[i] == 0) + for (uint16_t i = 4; i < liveData->params.batModuleTempCount; i++) { + if (liveData->params.batModuleTempC[i] == 0) continue; posx = (((i - 4) % 8) * 40); posy = ((floor((i - 4) / 8)) * 13) + 64; - //this->spr.fillRect(x * 80, y * 32, ((w) * 80), ((h) * 32), bgColor); - this->spr.setTextSize(1); // Size for small 5x7 font - this->spr.setTextDatum(TL_DATUM); - this->spr.setTextColor(((this->liveData->params.batModuleTempC[i] >= 15) ? ((this->liveData->params.batModuleTempC[i] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED), TFT_BLACK); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00fC" : "%01.01fF"), this->liveData->celsius2temperature(this->liveData->params.batModuleTempC[i])); - this->spr.drawString(this->tmpStr1, posx + 4, posy, 2); + //spr.fillRect(x * 80, y * 32, ((w) * 80), ((h) * 32), bgColor); + spr.setTextSize(1); // Size for small 5x7 font + spr.setTextDatum(TL_DATUM); + spr.setTextColor(((liveData->params.batModuleTempC[i] >= 15) ? ((liveData->params.batModuleTempC[i] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED), TFT_BLACK); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00fC" : "%01.01fF"), liveData->celsius2temperature(liveData->params.batModuleTempC[i])); + spr.drawString(tmpStr1, posx + 4, posy, 2); } - this->spr.setTextDatum(TL_DATUM); // Topleft - this->spr.setTextSize(1); // Size for small 5x7 font + spr.setTextDatum(TL_DATUM); // Topleft + spr.setTextSize(1); // Size for small 5x7 font // Find min and max val float minVal = -1, maxVal = -1; for (int i = 0; i < 98; i++) { - if ((this->liveData->params.cellVoltage[i] < minVal || minVal == -1) && this->liveData->params.cellVoltage[i] != -1) - minVal = this->liveData->params.cellVoltage[i]; - if ((this->liveData->params.cellVoltage[i] > maxVal || maxVal == -1) && this->liveData->params.cellVoltage[i] != -1) - maxVal = this->liveData->params.cellVoltage[i]; - if (this->liveData->params.cellVoltage[i] > 0 && i > this->liveData->params.cellCount + 1) - this->liveData->params.cellCount = i + 1; + if ((liveData->params.cellVoltage[i] < minVal || minVal == -1) && liveData->params.cellVoltage[i] != -1) + minVal = liveData->params.cellVoltage[i]; + if ((liveData->params.cellVoltage[i] > maxVal || maxVal == -1) && liveData->params.cellVoltage[i] != -1) + maxVal = liveData->params.cellVoltage[i]; + if (liveData->params.cellVoltage[i] > 0 && i > liveData->params.cellCount + 1) + liveData->params.cellCount = i + 1; } // Draw cell matrix for (int i = 0; i < 98; i++) { - if (this->liveData->params.cellVoltage[i] == -1) + if (liveData->params.cellVoltage[i] == -1) continue; posx = ((i % 8) * 40) + 4; - posy = ((floor(i / 8) + (this->liveData->params.cellCount > 96 ? 0 : 1)) * 13) + 68; - sprintf(this->tmpStr3, "%01.02f", this->liveData->params.cellVoltage[i]); - this->spr.setTextColor(TFT_NAVY, TFT_BLACK); - if (this->liveData->params.cellVoltage[i] == minVal && minVal != maxVal) - this->spr.setTextColor(TFT_RED, TFT_BLACK); - if (this->liveData->params.cellVoltage[i] == maxVal && minVal != maxVal) - this->spr.setTextColor(TFT_GREEN, TFT_BLACK); - this->spr.drawString(this->tmpStr3, posx, posy, 2); + posy = ((floor(i / 8) + (liveData->params.cellCount > 96 ? 0 : 1)) * 13) + 68; + sprintf(tmpStr3, "%01.02f", liveData->params.cellVoltage[i]); + spr.setTextColor(TFT_NAVY, TFT_BLACK); + if (liveData->params.cellVoltage[i] == minVal && minVal != maxVal) + spr.setTextColor(TFT_RED, TFT_BLACK); + if (liveData->params.cellVoltage[i] == maxVal && minVal != maxVal) + spr.setTextColor(TFT_GREEN, TFT_BLACK); + spr.drawString(tmpStr3, posx, posy, 2); } } @@ -461,79 +461,79 @@ void Board320_240::drawSceneBatteryCells() { void Board320_240::drawPreDrawnChargingGraphs(int zeroX, int zeroY, int mulX, int mulY) { // Rapid gate - this->spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 180 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 180 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 57 * mulX), zeroY - (/*I*/ 180 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_RAPIDGATE35); // Coldgate <5C - this->spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 65 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (65 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE0_5); // Coldgate 5-14C - this->spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 110 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 110 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 57 * mulX), zeroY - (/*I*/ 110 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE5_14); - this->spr.drawLine(zeroX + (/* SOC FROM */ 57 * mulX), zeroY - (/*I*/ 110 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 57 * mulX), zeroY - (/*I*/ 110 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 58 * mulX), zeroY - (/*I*/ 75 * /*U SOC*/ (58 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE5_14); - this->spr.drawLine(zeroX + (/* SOC FROM */ 58 * mulX), zeroY - (/*I*/ 75 * /*U SOC*/ (58 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 58 * mulX), zeroY - (/*I*/ 75 * /*U SOC*/ (58 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 64 * mulX), zeroY - (/*I*/ 75 * /*U SOC*/ (64 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE5_14); - this->spr.drawLine(zeroX + (/* SOC FROM */ 64 * mulX), zeroY - (/*I*/ 75 * /*U SOC*/ (64 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 64 * mulX), zeroY - (/*I*/ 75 * /*U SOC*/ (64 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 65 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (65 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE5_14); - this->spr.drawLine(zeroX + (/* SOC FROM */ 65 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (65 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 65 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (65 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 82 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (82 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE5_14); - this->spr.drawLine(zeroX + (/* SOC FROM */ 82 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (82 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 82 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (82 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 83 * mulX), zeroY - (/*I*/ 40 * /*U SOC*/ (83 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE5_14); // Coldgate 15-24C - this->spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 57 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE15_24); - this->spr.drawLine(zeroX + (/* SOC FROM */ 57 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 57 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC FROM */ 58 * mulX), zeroY - (/*I*/ 110 * /*U SOC*/ (58 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE15_24); - this->spr.drawLine(zeroX + (/* SOC TO */ 58 * mulX), zeroY - (/*I*/ 110 * /*U SOC*/ (58 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC TO */ 58 * mulX), zeroY - (/*I*/ 110 * /*U SOC*/ (58 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 78 * mulX), zeroY - (/*I*/ 110 * /*U SOC*/ (78 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_COLDGATE15_24); // Optimal - this->spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 1 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 57 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 51 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (51 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 51 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (51 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 51 * mulX), zeroY - (/*I*/ 195 * /*U SOC*/ (51 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 53 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (53 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 53 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (53 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 53 * mulX), zeroY - (/*I*/ 195 * /*U SOC*/ (53 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 55 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (55 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 55 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (55 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 55 * mulX), zeroY - (/*I*/ 195 * /*U SOC*/ (55 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 57 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 57 * mulX), zeroY - (/*I*/ 200 * /*U SOC*/ (57 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 58 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (58 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 58 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (58 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 58 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (58 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 77 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (77 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 71 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (71 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 71 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (71 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 71 * mulX), zeroY - (/*I*/ 145 * /*U SOC*/ (71 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 73 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (73 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 73 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (73 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 73 * mulX), zeroY - (/*I*/ 145 * /*U SOC*/ (73 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 75 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (75 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 75 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (75 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 75 * mulX), zeroY - (/*I*/ 145 * /*U SOC*/ (75 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 77 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (77 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 77 * mulX), zeroY - (/*I*/ 150 * /*U SOC*/ (77 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 78 * mulX), zeroY - (/*I*/ 90 * /*U SOC*/ (78 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 78 * mulX), zeroY - (/*I*/ 90 * /*U SOC*/ (78 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 78 * mulX), zeroY - (/*I*/ 90 * /*U SOC*/ (78 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 82 * mulX), zeroY - (/*I*/ 90 * /*U SOC*/ (82 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 82 * mulX), zeroY - (/*I*/ 90 * /*U SOC*/ (82 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 82 * mulX), zeroY - (/*I*/ 90 * /*U SOC*/ (82 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 83 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (83 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 83 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (83 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 83 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (83 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 92 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (92 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 92 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (92 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 92 * mulX), zeroY - (/*I*/ 60 * /*U SOC*/ (92 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 95 * mulX), zeroY - (/*I*/ 35 * /*U SOC*/ (95 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 95 * mulX), zeroY - (/*I*/ 35 * /*U SOC*/ (95 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 95 * mulX), zeroY - (/*I*/ 35 * /*U SOC*/ (95 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 98 * mulX), zeroY - (/*I*/ 35 * /*U SOC*/ (98 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); - this->spr.drawLine(zeroX + (/* SOC FROM */ 98 * mulX), zeroY - (/*I*/ 35 * /*U SOC*/ (98 * 55 / 100 + 352) /**/ / 1000 * mulY), + spr.drawLine(zeroX + (/* SOC FROM */ 98 * mulX), zeroY - (/*I*/ 35 * /*U SOC*/ (98 * 55 / 100 + 352) /**/ / 1000 * mulY), zeroX + (/* SOC TO */ 100 * mulX), zeroY - (/*I*/ 15 * /*U SOC*/ (100 * 55 / 100 + 352) /**/ / 1000 * mulY), TFT_GRAPH_OPTIMAL25); // Triangles int x = zeroX; int y; - if (this->liveData->params.batMaxC >= 35) { + if (liveData->params.batMaxC >= 35) { y = zeroY - (/*I*/ 180 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY); - } else if (this->liveData->params.batMinC >= 25) { + } else if (liveData->params.batMinC >= 25) { y = zeroY - (/*I*/ 200 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY); - } else if (this->liveData->params.batMinC >= 15) { + } else if (liveData->params.batMinC >= 15) { y = zeroY - (/*I*/ 150 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY); - } else if (this->liveData->params.batMinC >= 5) { + } else if (liveData->params.batMinC >= 5) { y = zeroY - (/*I*/ 110 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY); } else { y = zeroY - (/*I*/ 60 * /*U SOC*/ (1 * 55 / 100 + 352) /**/ / 1000 * mulY); } - this->spr.fillTriangle(x + 5, y, x , y - 5, x, y + 5, TFT_ORANGE); + spr.fillTriangle(x + 5, y, x , y - 5, x, y + 5, TFT_ORANGE); } /** @@ -549,152 +549,152 @@ void Board320_240::drawSceneChargingGraph() { int posy = 0; uint16_t color; - this->spr.fillSprite(TFT_BLACK); + spr.fillSprite(TFT_BLACK); - sprintf(this->tmpStr1, "%01.00f", this->liveData->params.socPerc); - drawSmallCell(0, 0, 1, 1, this->tmpStr1, "SOC", TFT_TEMP, TFT_CYAN); - sprintf(this->tmpStr1, "%01.01f", this->liveData->params.batPowerKw); - drawSmallCell(1, 0, 1, 1, this->tmpStr1, "POWER kW", TFT_TEMP, TFT_CYAN); - sprintf(this->tmpStr1, "%01.01f", this->liveData->params.batPowerAmp); - drawSmallCell(2, 0, 1, 1, this->tmpStr1, "CURRENT A", TFT_TEMP, TFT_CYAN); - sprintf(this->tmpStr1, "%03.00f", this->liveData->params.batVoltage); - drawSmallCell(3, 0, 1, 1, this->tmpStr1, "VOLTAGE", TFT_TEMP, TFT_CYAN); + sprintf(tmpStr1, "%01.00f", liveData->params.socPerc); + drawSmallCell(0, 0, 1, 1, tmpStr1, "SOC", TFT_TEMP, TFT_CYAN); + sprintf(tmpStr1, "%01.01f", liveData->params.batPowerKw); + drawSmallCell(1, 0, 1, 1, tmpStr1, "POWER kW", TFT_TEMP, TFT_CYAN); + sprintf(tmpStr1, "%01.01f", liveData->params.batPowerAmp); + drawSmallCell(2, 0, 1, 1, tmpStr1, "CURRENT A", TFT_TEMP, TFT_CYAN); + sprintf(tmpStr1, "%03.00f", liveData->params.batVoltage); + drawSmallCell(3, 0, 1, 1, tmpStr1, "VOLTAGE", TFT_TEMP, TFT_CYAN); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.batHeaterC)); - drawSmallCell(0, 1, 1, 1, this->tmpStr1, "HEATER", TFT_TEMP, TFT_RED); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.batInletC)); - drawSmallCell(1, 1, 1, 1, this->tmpStr1, "BAT.INLET", TFT_TEMP, TFT_CYAN); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.batMinC)); - drawSmallCell(2, 1, 1, 1, this->tmpStr1, "BAT.MIN", (this->liveData->params.batMinC >= 15) ? ((this->liveData->params.batMinC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED, TFT_CYAN); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), this->liveData->celsius2temperature(this->liveData->params.outdoorTemperature)); - drawSmallCell(3, 1, 1, 1, this->tmpStr1, "OUT.TEMP.", TFT_TEMP, TFT_CYAN); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.batHeaterC)); + drawSmallCell(0, 1, 1, 1, tmpStr1, "HEATER", TFT_TEMP, TFT_RED); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.batInletC)); + drawSmallCell(1, 1, 1, 1, tmpStr1, "BAT.INLET", TFT_TEMP, TFT_CYAN); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.batMinC)); + drawSmallCell(2, 1, 1, 1, tmpStr1, "BAT.MIN", (liveData->params.batMinC >= 15) ? ((liveData->params.batMinC >= 25) ? TFT_DARKGREEN2 : TFT_BLUE) : TFT_RED, TFT_CYAN); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "%01.00f C" : "%01.01f F"), liveData->celsius2temperature(liveData->params.outdoorTemperature)); + drawSmallCell(3, 1, 1, 1, tmpStr1, "OUT.TEMP.", TFT_TEMP, TFT_CYAN); - this->spr.setTextColor(TFT_SILVER, TFT_TEMP); + spr.setTextColor(TFT_SILVER, TFT_TEMP); for (int i = 0; i <= 10; i++) { color = TFT_DARKRED2; if (i == 0 || i == 5 || i == 10) color = TFT_DARKRED; - this->spr.drawFastVLine(zeroX + (i * 10 * mulX), zeroY - (maxKw * mulY), maxKw * mulY, color); + spr.drawFastVLine(zeroX + (i * 10 * mulX), zeroY - (maxKw * mulY), maxKw * mulY, color); /*if (i != 0 && i != 10) { - sprintf(this->tmpStr1, "%d%%", i * 10); - this->spr.setTextDatum(BC_DATUM); - this->spr.drawString(this->tmpStr1, zeroX + (i * 10 * mulX), zeroY - (maxKw * mulY), 2); + sprintf(tmpStr1, "%d%%", i * 10); + spr.setTextDatum(BC_DATUM); + spr.drawString(tmpStr1, zeroX + (i * 10 * mulX), zeroY - (maxKw * mulY), 2); }*/ if (i <= (maxKw / 10)) { - this->spr.drawFastHLine(zeroX, zeroY - (i * 10 * mulY), 100 * mulX, color); + spr.drawFastHLine(zeroX, zeroY - (i * 10 * mulY), 100 * mulX, color); if (i > 0) { - sprintf(this->tmpStr1, "%d", i * 10); - this->spr.setTextDatum(ML_DATUM); - this->spr.drawString(this->tmpStr1, zeroX + (100 * mulX) + 3, zeroY - (i * 10 * mulY), 2); + sprintf(tmpStr1, "%d", i * 10); + spr.setTextDatum(ML_DATUM); + spr.drawString(tmpStr1, zeroX + (100 * mulX) + 3, zeroY - (i * 10 * mulY), 2); } } } // Draw suggested curves - if (this->liveData->settings.predrawnChargingGraphs == 1) { + if (liveData->settings.predrawnChargingGraphs == 1) { drawPreDrawnChargingGraphs(zeroX, zeroY, mulX, mulY); } // Draw realtime values for (int i = 0; i <= 100; i++) { - if (this->liveData->params.chargingGraphBatMinTempC[i] > -10) - this->spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (this->liveData->params.chargingGraphBatMinTempC[i]*mulY), mulX, TFT_BLUE); - if (this->liveData->params.chargingGraphBatMaxTempC[i] > -10) - this->spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (this->liveData->params.chargingGraphBatMaxTempC[i]*mulY), mulX, TFT_BLUE); - if (this->liveData->params.chargingGraphWaterCoolantTempC[i] > -10) - this->spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (this->liveData->params.chargingGraphWaterCoolantTempC[i]*mulY), mulX, TFT_PURPLE); - if (this->liveData->params.chargingGraphHeaterTempC[i] > -10) - this->spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (this->liveData->params.chargingGraphHeaterTempC[i]*mulY), mulX, TFT_RED); + if (liveData->params.chargingGraphBatMinTempC[i] > -10) + spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (liveData->params.chargingGraphBatMinTempC[i]*mulY), mulX, TFT_BLUE); + if (liveData->params.chargingGraphBatMaxTempC[i] > -10) + spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (liveData->params.chargingGraphBatMaxTempC[i]*mulY), mulX, TFT_BLUE); + if (liveData->params.chargingGraphWaterCoolantTempC[i] > -10) + spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (liveData->params.chargingGraphWaterCoolantTempC[i]*mulY), mulX, TFT_PURPLE); + if (liveData->params.chargingGraphHeaterTempC[i] > -10) + spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (liveData->params.chargingGraphHeaterTempC[i]*mulY), mulX, TFT_RED); - if (this->liveData->params.chargingGraphMinKw[i] > 0) - this->spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (this->liveData->params.chargingGraphMinKw[i]*mulY), mulX, TFT_GREENYELLOW); - if (this->liveData->params.chargingGraphMaxKw[i] > 0) - this->spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (this->liveData->params.chargingGraphMaxKw[i]*mulY), mulX, TFT_YELLOW); + if (liveData->params.chargingGraphMinKw[i] > 0) + spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (liveData->params.chargingGraphMinKw[i]*mulY), mulX, TFT_GREENYELLOW); + if (liveData->params.chargingGraphMaxKw[i] > 0) + spr.drawFastHLine(zeroX + (i * mulX) - (mulX / 2), zeroY - (liveData->params.chargingGraphMaxKw[i]*mulY), mulX, TFT_YELLOW); } // Bat.module temperatures - this->spr.setTextSize(1); // Size for small 5x7 font - this->spr.setTextDatum(BL_DATUM); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "1=%01.00fC " : "1=%01.00fF "), this->liveData->celsius2temperature(this->liveData->params.batModuleTempC[0])); - this->spr.setTextColor((this->liveData->params.batModuleTempC[0] >= 15) ? ((this->liveData->params.batModuleTempC[0] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); - this->spr.drawString(this->tmpStr1, 0, zeroY - (maxKw * mulY), 2); + spr.setTextSize(1); // Size for small 5x7 font + spr.setTextDatum(BL_DATUM); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "1=%01.00fC " : "1=%01.00fF "), liveData->celsius2temperature(liveData->params.batModuleTempC[0])); + spr.setTextColor((liveData->params.batModuleTempC[0] >= 15) ? ((liveData->params.batModuleTempC[0] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); + spr.drawString(tmpStr1, 0, zeroY - (maxKw * mulY), 2); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "2=%01.00fC " : "2=%01.00fF "), this->liveData->celsius2temperature(this->liveData->params.batModuleTempC[1])); - this->spr.setTextColor((this->liveData->params.batModuleTempC[1] >= 15) ? ((this->liveData->params.batModuleTempC[1] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); - this->spr.drawString(this->tmpStr1, 48, zeroY - (maxKw * mulY), 2); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "2=%01.00fC " : "2=%01.00fF "), liveData->celsius2temperature(liveData->params.batModuleTempC[1])); + spr.setTextColor((liveData->params.batModuleTempC[1] >= 15) ? ((liveData->params.batModuleTempC[1] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); + spr.drawString(tmpStr1, 48, zeroY - (maxKw * mulY), 2); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "3=%01.00fC " : "3=%01.00fF "), this->liveData->celsius2temperature(this->liveData->params.batModuleTempC[2])); - this->spr.setTextColor((this->liveData->params.batModuleTempC[2] >= 15) ? ((this->liveData->params.batModuleTempC[2] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); - this->spr.drawString(this->tmpStr1, 96, zeroY - (maxKw * mulY), 2); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "3=%01.00fC " : "3=%01.00fF "), liveData->celsius2temperature(liveData->params.batModuleTempC[2])); + spr.setTextColor((liveData->params.batModuleTempC[2] >= 15) ? ((liveData->params.batModuleTempC[2] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); + spr.drawString(tmpStr1, 96, zeroY - (maxKw * mulY), 2); - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "4=%01.00fC " : "4=%01.00fF "), this->liveData->celsius2temperature(this->liveData->params.batModuleTempC[3])); - this->spr.setTextColor((this->liveData->params.batModuleTempC[3] >= 15) ? ((this->liveData->params.batModuleTempC[3] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); - this->spr.drawString(this->tmpStr1, 144, zeroY - (maxKw * mulY), 2); - sprintf(this->tmpStr1, "ir %01.00fkOhm", this->liveData->params.isolationResistanceKOhm ); + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "4=%01.00fC " : "4=%01.00fF "), liveData->celsius2temperature(liveData->params.batModuleTempC[3])); + spr.setTextColor((liveData->params.batModuleTempC[3] >= 15) ? ((liveData->params.batModuleTempC[3] >= 25) ? TFT_GREEN : TFT_BLUE) : TFT_RED, TFT_TEMP); + spr.drawString(tmpStr1, 144, zeroY - (maxKw * mulY), 2); + sprintf(tmpStr1, "ir %01.00fkOhm", liveData->params.isolationResistanceKOhm ); // Bms max.regen/power available - this->spr.setTextColor(TFT_WHITE, TFT_BLACK); - sprintf(this->tmpStr1, "xC=%01.00fkW ", this->liveData->params.availableChargePower); - this->spr.drawString(this->tmpStr1, 192, zeroY - (maxKw * mulY), 2); - this->spr.setTextColor(TFT_WHITE, TFT_BLACK); - sprintf(this->tmpStr1, "xD=%01.00fkW", this->liveData->params.availableDischargePower); - this->spr.drawString(this->tmpStr1, 256, zeroY - (maxKw * mulY), 2); + spr.setTextColor(TFT_WHITE, TFT_BLACK); + sprintf(tmpStr1, "xC=%01.00fkW ", liveData->params.availableChargePower); + spr.drawString(tmpStr1, 192, zeroY - (maxKw * mulY), 2); + spr.setTextColor(TFT_WHITE, TFT_BLACK); + sprintf(tmpStr1, "xD=%01.00fkW", liveData->params.availableDischargePower); + spr.drawString(tmpStr1, 256, zeroY - (maxKw * mulY), 2); // - this->spr.setTextDatum(TR_DATUM); - if (this->liveData->params.coolingWaterTempC != -1) { - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "W=%01.00fC" : "W=%01.00fF"), this->liveData->celsius2temperature(this->liveData->params.coolingWaterTempC)); - this->spr.setTextColor(TFT_PURPLE, TFT_TEMP); - this->spr.drawString(this->tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); + spr.setTextDatum(TR_DATUM); + if (liveData->params.coolingWaterTempC != -1) { + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "W=%01.00fC" : "W=%01.00fF"), liveData->celsius2temperature(liveData->params.coolingWaterTempC)); + spr.setTextColor(TFT_PURPLE, TFT_TEMP); + spr.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); posy++; } - this->spr.setTextColor(TFT_WHITE, TFT_TEMP); - if (this->liveData->params.batFanFeedbackHz > 0) { - sprintf(this->tmpStr1, "FF=%03.00fHz", this->liveData->params.batFanFeedbackHz); - this->spr.drawString(this->tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); + spr.setTextColor(TFT_WHITE, TFT_TEMP); + if (liveData->params.batFanFeedbackHz > 0) { + sprintf(tmpStr1, "FF=%03.00fHz", liveData->params.batFanFeedbackHz); + spr.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); posy++; } - if (this->liveData->params.batFanStatus > 0) { - sprintf(this->tmpStr1, "FS=%03.00f", this->liveData->params.batFanStatus); - this->spr.drawString(this->tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); + if (liveData->params.batFanStatus > 0) { + sprintf(tmpStr1, "FS=%03.00f", liveData->params.batFanStatus); + spr.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); posy++; } - if (this->liveData->params.coolantTemp1C != -1 && this->liveData->params.coolantTemp2C != -1) { - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "C1/2:%01.00f/%01.00fC" : "C1/2:%01.00f/%01.00fF"), this->liveData->celsius2temperature(this->liveData->params.coolantTemp1C), this->liveData->celsius2temperature(this->liveData->params.coolantTemp2C)); - this->spr.drawString(this->tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); + if (liveData->params.coolantTemp1C != -1 && liveData->params.coolantTemp2C != -1) { + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "C1/2:%01.00f/%01.00fC" : "C1/2:%01.00f/%01.00fF"), liveData->celsius2temperature(liveData->params.coolantTemp1C), liveData->celsius2temperature(liveData->params.coolantTemp2C)); + spr.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); posy++; } - if (this->liveData->params.bmsUnknownTempA != -1) { - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "A=%01.00fC" : "W=%01.00fF"), this->liveData->celsius2temperature(this->liveData->params.bmsUnknownTempA)); - this->spr.drawString(this->tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); + if (liveData->params.bmsUnknownTempA != -1) { + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "A=%01.00fC" : "W=%01.00fF"), liveData->celsius2temperature(liveData->params.bmsUnknownTempA)); + spr.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); posy++; } - if (this->liveData->params.bmsUnknownTempB != -1) { - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "B=%01.00fC" : "W=%01.00fF"), this->liveData->celsius2temperature(this->liveData->params.bmsUnknownTempB)); - this->spr.drawString(this->tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); + if (liveData->params.bmsUnknownTempB != -1) { + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "B=%01.00fC" : "W=%01.00fF"), liveData->celsius2temperature(liveData->params.bmsUnknownTempB)); + spr.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); posy++; } - if (this->liveData->params.bmsUnknownTempC != -1) { - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "C=%01.00fC" : "W=%01.00fF"), this->liveData->celsius2temperature(this->liveData->params.bmsUnknownTempC)); - this->spr.drawString(this->tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); + if (liveData->params.bmsUnknownTempC != -1) { + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "C=%01.00fC" : "W=%01.00fF"), liveData->celsius2temperature(liveData->params.bmsUnknownTempC)); + spr.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); posy++; } - if (this->liveData->params.bmsUnknownTempD != -1) { - sprintf(this->tmpStr1, ((this->liveData->settings.temperatureUnit == 'c') ? "D=%01.00fC" : "W=%01.00fF"), this->liveData->celsius2temperature(this->liveData->params.bmsUnknownTempD)); - this->spr.drawString(this->tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); + if (liveData->params.bmsUnknownTempD != -1) { + sprintf(tmpStr1, ((liveData->settings.temperatureUnit == 'c') ? "D=%01.00fC" : "W=%01.00fF"), liveData->celsius2temperature(liveData->params.bmsUnknownTempD)); + spr.drawString(tmpStr1, zeroX + (10 * 10 * mulX), zeroY - (maxKw * mulY) + (posy * 15), 2); posy++; } // Print charging time - time_t diffTime = this->liveData->params.currentTime - this->liveData->params.chargingStartTime; + time_t diffTime = liveData->params.currentTime - liveData->params.chargingStartTime; if ((diffTime / 60) > 99) - sprintf(this->tmpStr1, "%02d:%02d:%02d", (diffTime / 3600) % 24, (diffTime / 60) % 60, diffTime % 60); + sprintf(tmpStr1, "%02d:%02d:%02d", (diffTime / 3600) % 24, (diffTime / 60) % 60, diffTime % 60); else - sprintf(this->tmpStr1, "%02d:%02d", (diffTime / 60), diffTime % 60); - this->spr.setTextDatum(TL_DATUM); - this->spr.setTextColor(TFT_SILVER, TFT_BLACK); - this->spr.drawString(this->tmpStr1, 0, zeroY - (maxKw * mulY), 2); + sprintf(tmpStr1, "%02d:%02d", (diffTime / 60), diffTime % 60); + spr.setTextDatum(TL_DATUM); + spr.setTextColor(TFT_SILVER, TFT_BLACK); + spr.drawString(tmpStr1, 0, zeroY - (maxKw * mulY), 2); } /** @@ -709,80 +709,80 @@ void Board320_240::drawSceneSoc10Table() { float firstOdo = -1, lastOdo = -1, diffOdo0to5 = 0; float diffTime; - this->spr.setTextSize(1); // Size for small 5x7 font - this->spr.setTextColor(TFT_SILVER, TFT_TEMP); - this->spr.setTextDatum(TL_DATUM); - this->spr.drawString("CONSUMPTION | DISCH.100%->4% SOC", 2, zeroY, 2); + spr.setTextSize(1); // Size for small 5x7 font + spr.setTextColor(TFT_SILVER, TFT_TEMP); + spr.setTextDatum(TL_DATUM); + spr.drawString("CONSUMPTION | DISCH.100%->4% SOC", 2, zeroY, 2); - this->spr.setTextDatum(TR_DATUM); + spr.setTextDatum(TR_DATUM); - this->spr.drawString("dis./char.kWh", 128, zeroY + (1 * 15), 2); - this->spr.drawString(((this->liveData->settings.distanceUnit == 'k') ? "km" : "mi"), 160, zeroY + (1 * 15), 2); - this->spr.drawString("kWh100", 224, zeroY + (1 * 15), 2); - this->spr.drawString("avg.speed", 310, zeroY + (1 * 15), 2); + spr.drawString("dis./char.kWh", 128, zeroY + (1 * 15), 2); + spr.drawString(((liveData->settings.distanceUnit == 'k') ? "km" : "mi"), 160, zeroY + (1 * 15), 2); + spr.drawString("kWh100", 224, zeroY + (1 * 15), 2); + spr.drawString("avg.speed", 310, zeroY + (1 * 15), 2); for (int i = 0; i <= 10; i++) { - sprintf(this->tmpStr1, "%d%%", (i == 0) ? 5 : i * 10); - this->spr.drawString(this->tmpStr1, 32, zeroY + ((12 - i) * 15), 2); + sprintf(tmpStr1, "%d%%", (i == 0) ? 5 : i * 10); + spr.drawString(tmpStr1, 32, zeroY + ((12 - i) * 15), 2); - firstCed = (this->liveData->params.soc10ced[i] != -1) ? this->liveData->params.soc10ced[i] : firstCed; - lastCed = (lastCed == -1 && this->liveData->params.soc10ced[i] != -1) ? this->liveData->params.soc10ced[i] : lastCed; - firstCec = (this->liveData->params.soc10cec[i] != -1) ? this->liveData->params.soc10cec[i] : firstCec; - lastCec = (lastCec == -1 && this->liveData->params.soc10cec[i] != -1) ? this->liveData->params.soc10cec[i] : lastCec; - firstOdo = (this->liveData->params.soc10odo[i] != -1) ? this->liveData->params.soc10odo[i] : firstOdo; - lastOdo = (lastOdo == -1 && this->liveData->params.soc10odo[i] != -1) ? this->liveData->params.soc10odo[i] : lastOdo; + firstCed = (liveData->params.soc10ced[i] != -1) ? liveData->params.soc10ced[i] : firstCed; + lastCed = (lastCed == -1 && liveData->params.soc10ced[i] != -1) ? liveData->params.soc10ced[i] : lastCed; + firstCec = (liveData->params.soc10cec[i] != -1) ? liveData->params.soc10cec[i] : firstCec; + lastCec = (lastCec == -1 && liveData->params.soc10cec[i] != -1) ? liveData->params.soc10cec[i] : lastCec; + firstOdo = (liveData->params.soc10odo[i] != -1) ? liveData->params.soc10odo[i] : firstOdo; + lastOdo = (lastOdo == -1 && liveData->params.soc10odo[i] != -1) ? liveData->params.soc10odo[i] : lastOdo; if (i != 10) { - diffCec = (this->liveData->params.soc10cec[i + 1] != -1 && this->liveData->params.soc10cec[i] != -1) ? (this->liveData->params.soc10cec[i] - this->liveData->params.soc10cec[i + 1]) : 0; - diffCed = (this->liveData->params.soc10ced[i + 1] != -1 && this->liveData->params.soc10ced[i] != -1) ? (this->liveData->params.soc10ced[i + 1] - this->liveData->params.soc10ced[i]) : 0; - diffOdo = (this->liveData->params.soc10odo[i + 1] != -1 && this->liveData->params.soc10odo[i] != -1) ? (this->liveData->params.soc10odo[i] - this->liveData->params.soc10odo[i + 1]) : -1; - diffTime = (this->liveData->params.soc10time[i + 1] != -1 && this->liveData->params.soc10time[i] != -1) ? (this->liveData->params.soc10time[i] - this->liveData->params.soc10time[i + 1]) : -1; + diffCec = (liveData->params.soc10cec[i + 1] != -1 && liveData->params.soc10cec[i] != -1) ? (liveData->params.soc10cec[i] - liveData->params.soc10cec[i + 1]) : 0; + diffCed = (liveData->params.soc10ced[i + 1] != -1 && liveData->params.soc10ced[i] != -1) ? (liveData->params.soc10ced[i + 1] - liveData->params.soc10ced[i]) : 0; + diffOdo = (liveData->params.soc10odo[i + 1] != -1 && liveData->params.soc10odo[i] != -1) ? (liveData->params.soc10odo[i] - liveData->params.soc10odo[i + 1]) : -1; + diffTime = (liveData->params.soc10time[i + 1] != -1 && liveData->params.soc10time[i] != -1) ? (liveData->params.soc10time[i] - liveData->params.soc10time[i + 1]) : -1; if (diffCec != 0) { - sprintf(this->tmpStr1, "+%01.01f", diffCec); - this->spr.drawString(this->tmpStr1, 128, zeroY + ((12 - i) * 15), 2); + sprintf(tmpStr1, "+%01.01f", diffCec); + spr.drawString(tmpStr1, 128, zeroY + ((12 - i) * 15), 2); diffCec0to5 = (i == 0) ? diffCec : diffCec0to5; } if (diffCed != 0) { - sprintf(this->tmpStr1, "%01.01f", diffCed); - this->spr.drawString(this->tmpStr1, 80, zeroY + ((12 - i) * 15), 2); + sprintf(tmpStr1, "%01.01f", diffCed); + spr.drawString(tmpStr1, 80, zeroY + ((12 - i) * 15), 2); diffCed0to5 = (i == 0) ? diffCed : diffCed0to5; } if (diffOdo != -1) { - sprintf(this->tmpStr1, "%01.00f", this->liveData->km2distance(diffOdo)); - this->spr.drawString(this->tmpStr1, 160, zeroY + ((12 - i) * 15), 2); + sprintf(tmpStr1, "%01.00f", liveData->km2distance(diffOdo)); + spr.drawString(tmpStr1, 160, zeroY + ((12 - i) * 15), 2); diffOdo0to5 = (i == 0) ? diffOdo : diffOdo0to5; if (diffTime > 0) { - sprintf(this->tmpStr1, "%01.01f", this->liveData->km2distance(diffOdo) / (diffTime / 3600)); - this->spr.drawString(this->tmpStr1, 310, zeroY + ((12 - i) * 15), 2); + sprintf(tmpStr1, "%01.01f", liveData->km2distance(diffOdo) / (diffTime / 3600)); + spr.drawString(tmpStr1, 310, zeroY + ((12 - i) * 15), 2); } } if (diffOdo > 0 && diffCed != 0) { - sprintf(this->tmpStr1, "%01.1f", (-diffCed * 100.0 / this->liveData->km2distance(diffOdo))); - this->spr.drawString(this->tmpStr1, 224, zeroY + ((12 - i) * 15), 2); + sprintf(tmpStr1, "%01.1f", (-diffCed * 100.0 / liveData->km2distance(diffOdo))); + spr.drawString(tmpStr1, 224, zeroY + ((12 - i) * 15), 2); } } - if (diffOdo == -1 && this->liveData->params.soc10odo[i] != -1) { - sprintf(this->tmpStr1, "%01.00f", this->liveData->km2distance(this->liveData->params.soc10odo[i])); - this->spr.drawString(this->tmpStr1, 160, zeroY + ((12 - i) * 15), 2); + if (diffOdo == -1 && liveData->params.soc10odo[i] != -1) { + sprintf(tmpStr1, "%01.00f", liveData->km2distance(liveData->params.soc10odo[i])); + spr.drawString(tmpStr1, 160, zeroY + ((12 - i) * 15), 2); } } - this->spr.drawString("0%", 32, zeroY + (13 * 15), 2); - this->spr.drawString("0-5% is calculated (same) as 5-10%", 310, zeroY + (13 * 15), 2); + spr.drawString("0%", 32, zeroY + (13 * 15), 2); + spr.drawString("0-5% is calculated (same) as 5-10%", 310, zeroY + (13 * 15), 2); - this->spr.drawString("TOT.", 32, zeroY + (14 * 15), 2); + spr.drawString("TOT.", 32, zeroY + (14 * 15), 2); diffCed = (lastCed != -1 && firstCed != -1) ? firstCed - lastCed + diffCed0to5 : 0; - sprintf(this->tmpStr1, "%01.01f", diffCed); - this->spr.drawString(this->tmpStr1, 80, zeroY + (14 * 15), 2); + sprintf(tmpStr1, "%01.01f", diffCed); + spr.drawString(tmpStr1, 80, zeroY + (14 * 15), 2); diffCec = (lastCec != -1 && firstCec != -1) ? lastCec - firstCec + diffCec0to5 : 0; - sprintf(this->tmpStr1, "+%01.01f", diffCec); - this->spr.drawString(this->tmpStr1, 128, zeroY + (14 * 15), 2); + sprintf(tmpStr1, "+%01.01f", diffCec); + spr.drawString(tmpStr1, 128, zeroY + (14 * 15), 2); diffOdo = (lastOdo != -1 && firstOdo != -1) ? lastOdo - firstOdo + diffOdo0to5 : 0; - sprintf(this->tmpStr1, "%01.00f", this->liveData->km2distance(diffOdo)); - this->spr.drawString(this->tmpStr1, 160, zeroY + (14 * 15), 2); - sprintf(this->tmpStr1, "AVAIL.CAP: %01.01f kWh", -diffCed - diffCec); - this->spr.drawString(this->tmpStr1, 310, zeroY + (14 * 15), 2); + sprintf(tmpStr1, "%01.00f", liveData->km2distance(diffOdo)); + spr.drawString(tmpStr1, 160, zeroY + (14 * 15), 2); + sprintf(tmpStr1, "AVAIL.CAP: %01.01f kWh", -diffCed - diffCec); + spr.drawString(tmpStr1, 310, zeroY + (14 * 15), 2); } /** @@ -794,27 +794,27 @@ void Board320_240::drawSceneDebug() { String chHex, chHex2; uint8_t chByte; - this->spr.setTextSize(1); // Size for small 5x7 font - this->spr.setTextColor(TFT_SILVER, TFT_TEMP); - this->spr.setTextDatum(TL_DATUM); - this->spr.drawString(debugAtshRequest, 0, 0, 2); - this->spr.drawString(debugCommandRequest, 128, 0, 2); - this->spr.drawString(this->liveData->commandRequest, 256, 0, 2); - this->spr.setTextDatum(TR_DATUM); + spr.setTextSize(1); // Size for small 5x7 font + spr.setTextColor(TFT_SILVER, TFT_TEMP); + spr.setTextDatum(TL_DATUM); + spr.drawString(debugAtshRequest, 0, 0, 2); + spr.drawString(debugCommandRequest, 128, 0, 2); + spr.drawString(liveData->commandRequest, 256, 0, 2); + spr.setTextDatum(TR_DATUM); for (int i = 0; i < debugLastString.length() / 2; i++) { chHex = debugLastString.substring(i * 2, (i * 2) + 2); chHex2 = debugPreviousString.substring(i * 2, (i * 2) + 2); - this->spr.setTextColor(((chHex.equals(chHex2)) ? TFT_SILVER : TFT_GREEN), TFT_TEMP); - chByte = this->liveData->hexToDec(chHex.c_str(), 1, false); + spr.setTextColor(((chHex.equals(chHex2)) ? TFT_SILVER : TFT_GREEN), TFT_TEMP); + chByte = liveData->hexToDec(chHex.c_str(), 1, false); posx = (((i) % 10) * 32) + 24; posy = ((floor((i) / 10)) * 32) + 24; - sprintf(this->tmpStr1, "%03d", chByte); - this->spr.drawString(this->tmpStr1, posx + 4, posy, 2); + sprintf(tmpStr1, "%03d", chByte); + spr.drawString(tmpStr1, posx + 4, posy, 2); - this->spr.setTextColor(TFT_YELLOW, TFT_TEMP); - sprintf(this->tmpStr1, "%c", (char)chByte); - this->spr.drawString(this->tmpStr1, posx + 4, posy + 13, 2); + spr.setTextColor(TFT_YELLOW, TFT_TEMP); + sprintf(tmpStr1, "%c", (char)chByte); + spr.drawString(tmpStr1, posx + 4, posy + 13, 2); } debugPreviousString = debugLastString; @@ -831,11 +831,11 @@ String Board320_240::menuItemCaption(int16_t menuItemId, String title) { suffix = APP_VERSION; if (menuItemId == 401) // distance - suffix = (this->liveData->settings.distanceUnit == 'k') ? "[km]" : "[mi]"; + suffix = (liveData->settings.distanceUnit == 'k') ? "[km]" : "[mi]"; if (menuItemId == 402) // temperature - suffix = (this->liveData->settings.temperatureUnit == 'c') ? "[C]" : "[F]"; + suffix = (liveData->settings.temperatureUnit == 'c') ? "[C]" : "[F]"; if (menuItemId == 403) // pressure - suffix = (this->liveData->settings.pressureUnit == 'b') ? "[bar]" : "[psi]"; + suffix = (liveData->settings.pressureUnit == 'b') ? "[bar]" : "[psi]"; title = ((prefix == "") ? "" : prefix + " ") + title + ((suffix == "") ? "" : " " + suffix); @@ -849,36 +849,32 @@ void Board320_240::showMenu() { uint16_t posY = 0, tmpCurrMenuItem = 0; - this->liveData->menuVisible = true; -Serial.println("A"); - this->spr.fillSprite(TFT_BLACK); - this->spr.setTextDatum(TL_DATUM); - this->spr.setFreeFont(&Roboto_Thin_24); + liveData->menuVisible = true; + spr.fillSprite(TFT_BLACK); + spr.setTextDatum(TL_DATUM); + spr.setFreeFont(&Roboto_Thin_24); -Serial.println("B"); // Page scroll - uint8_t visibleCount = (int)(this->tft.height() / this->spr.fontHeight()); - if (this->liveData->menuItemSelected >= this->liveData->menuItemOffset + visibleCount) - this->liveData->menuItemOffset = this->liveData->menuItemSelected - visibleCount + 1; - if (this->liveData->menuItemSelected < this->liveData->menuItemOffset) - this->liveData->menuItemOffset = this->liveData->menuItemSelected; -Serial.println("C"); + uint8_t visibleCount = (int)(tft.height() / spr.fontHeight()); + if (liveData->menuItemSelected >= liveData->menuItemOffset + visibleCount) + liveData->menuItemOffset = liveData->menuItemSelected - visibleCount + 1; + if (liveData->menuItemSelected < liveData->menuItemOffset) + liveData->menuItemOffset = liveData->menuItemSelected; // Print items - for (uint16_t i = 0; i < this->liveData->menuItemsCount; ++i) { - if (this->liveData->menuCurrent == this->liveData->menuItems[i].parentId) { -Serial.println("D"); - if (tmpCurrMenuItem >= this->liveData->menuItemOffset) { - this->spr.fillRect(0, posY, 320, this->spr.fontHeight() + 2, (this->liveData->menuItemSelected == tmpCurrMenuItem) ? TFT_DARKGREEN2 : TFT_BLACK); - this->spr.setTextColor((this->liveData->menuItemSelected == tmpCurrMenuItem) ? TFT_WHITE : TFT_WHITE, (this->liveData->menuItemSelected == tmpCurrMenuItem) ? TFT_DARKGREEN2 : TFT_BLACK); - this->spr.drawString(this->menuItemCaption(this->liveData->menuItems[i].id, this->liveData->menuItems[i].title), 0, posY + 2, GFXFF); - posY += this->spr.fontHeight(); + for (uint16_t i = 0; i < liveData->menuItemsCount; ++i) { + if (liveData->menuCurrent == liveData->menuItems[i].parentId) { + if (tmpCurrMenuItem >= liveData->menuItemOffset) { + spr.fillRect(0, posY, 320, spr.fontHeight() + 2, (liveData->menuItemSelected == tmpCurrMenuItem) ? TFT_DARKGREEN2 : TFT_BLACK); + spr.setTextColor((liveData->menuItemSelected == tmpCurrMenuItem) ? TFT_WHITE : TFT_WHITE, (liveData->menuItemSelected == tmpCurrMenuItem) ? TFT_DARKGREEN2 : TFT_BLACK); + spr.drawString(menuItemCaption(liveData->menuItems[i].id, liveData->menuItems[i].title), 0, posY + 2, GFXFF); + posY += spr.fontHeight(); } tmpCurrMenuItem++; } } - this->spr.pushSprite(0, 0); + spr.pushSprite(0, 0); } /** @@ -886,10 +882,10 @@ Serial.println("D"); */ void Board320_240::hideMenu() { - this->liveData->menuVisible = false; - this->liveData->menuCurrent = 0; - this->liveData->menuItemSelected = 0; - this->redrawScreen(); + liveData->menuVisible = false; + liveData->menuCurrent = 0; + liveData->menuItemSelected = 0; + redrawScreen(); } /** @@ -899,16 +895,16 @@ void Board320_240::menuMove(bool forward) { if (forward) { uint16_t tmpCount = 0; - for (uint16_t i = 0; i < this->liveData->menuItemsCount; ++i) { - if (this->liveData->menuCurrent == this->liveData->menuItems[i].parentId) { + for (uint16_t i = 0; i < liveData->menuItemsCount; ++i) { + if (liveData->menuCurrent == liveData->menuItems[i].parentId) { tmpCount++; } } - this->liveData->menuItemSelected = (this->liveData->menuItemSelected >= tmpCount - 1 ) ? tmpCount - 1 : this->liveData->menuItemSelected + 1; + liveData->menuItemSelected = (liveData->menuItemSelected >= tmpCount - 1 ) ? tmpCount - 1 : liveData->menuItemSelected + 1; } else { - this->liveData->menuItemSelected = (this->liveData->menuItemSelected <= 0) ? 0 : this->liveData->menuItemSelected - 1; + liveData->menuItemSelected = (liveData->menuItemSelected <= 0) ? 0 : liveData->menuItemSelected - 1; } - this->showMenu(); + showMenu(); } /** @@ -919,10 +915,10 @@ void Board320_240::menuItemClick() { // Locate menu item for meta data MENU_ITEM tmpMenuItem; uint16_t tmpCurrMenuItem = 0; - for (uint16_t i = 0; i < this->liveData->menuItemsCount; ++i) { - if (this->liveData->menuCurrent == this->liveData->menuItems[i].parentId) { - if (this->liveData->menuItemSelected == tmpCurrMenuItem) { - tmpMenuItem = this->liveData->menuItems[i]; + for (uint16_t i = 0; i < liveData->menuItemsCount; ++i) { + if (liveData->menuCurrent == liveData->menuItems[i].parentId) { + if (liveData->menuItemSelected == tmpCurrMenuItem) { + tmpMenuItem = liveData->menuItems[i]; break; } tmpCurrMenuItem++; @@ -930,86 +926,86 @@ void Board320_240::menuItemClick() { } // Exit menu, parent level menu, open item - if (this->liveData->menuItemSelected == 0) { + if (liveData->menuItemSelected == 0) { // Exit menu if (tmpMenuItem.parentId == 0 && tmpMenuItem.id == 0) { - this->liveData->menuVisible = false; - this->redrawScreen(); + liveData->menuVisible = false; + redrawScreen(); } else { // Parent menu - this->liveData->menuCurrent = tmpMenuItem.targetParentId; - this->showMenu(); + liveData->menuCurrent = tmpMenuItem.targetParentId; + showMenu(); } return; } else { Serial.println(tmpMenuItem.id); // Device list if (tmpMenuItem.id > 10000 && tmpMenuItem.id < 10100) { - strlcpy((char*)this->liveData->settings.obdMacAddress, (char*)tmpMenuItem.obdMacAddress, 20); + strlcpy((char*)liveData->settings.obdMacAddress, (char*)tmpMenuItem.obdMacAddress, 20); Serial.print("Selected adapter MAC address "); - Serial.println(this->liveData->settings.obdMacAddress); - this->saveSettings(); + Serial.println(liveData->settings.obdMacAddress); + saveSettings(); ESP.restart(); } // Other menus switch (tmpMenuItem.id) { // Set vehicle type - case 101: this->liveData->settings.carType = CAR_KIA_ENIRO_2020_64; break; - case 102: this->liveData->settings.carType = CAR_HYUNDAI_KONA_2020_64; break; - case 103: this->liveData->settings.carType = CAR_HYUNDAI_IONIQ_2018; break; - case 104: this->liveData->settings.carType = CAR_KIA_ENIRO_2020_39; break; - case 105: this->liveData->settings.carType = CAR_HYUNDAI_KONA_2020_39; break; - case 106: this->liveData->settings.carType = CAR_RENAULT_ZOE; break; - case 107: this->liveData->settings.carType = CAR_DEBUG_OBD2_KIA; break; + case 101: liveData->settings.carType = CAR_KIA_ENIRO_2020_64; break; + case 102: liveData->settings.carType = CAR_HYUNDAI_KONA_2020_64; break; + case 103: liveData->settings.carType = CAR_HYUNDAI_IONIQ_2018; break; + case 104: liveData->settings.carType = CAR_KIA_ENIRO_2020_39; break; + case 105: liveData->settings.carType = CAR_HYUNDAI_KONA_2020_39; break; + case 106: liveData->settings.carType = CAR_RENAULT_ZOE; break; + case 107: liveData->settings.carType = CAR_DEBUG_OBD2_KIA; break; // Screen orientation - case 3011: this->liveData->settings.displayRotation = 1; this->tft.setRotation(this->liveData->settings.displayRotation); break; - case 3012: this->liveData->settings.displayRotation = 3; this->tft.setRotation(this->liveData->settings.displayRotation); break; + case 3011: liveData->settings.displayRotation = 1; tft.setRotation(liveData->settings.displayRotation); break; + case 3012: liveData->settings.displayRotation = 3; tft.setRotation(liveData->settings.displayRotation); break; // Default screen - case 3021: this->liveData->settings.defaultScreen = 1; break; - case 3022: this->liveData->settings.defaultScreen = 2; break; - case 3023: this->liveData->settings.defaultScreen = 3; break; - case 3024: this->liveData->settings.defaultScreen = 4; break; - case 3025: this->liveData->settings.defaultScreen = 5; break; + case 3021: liveData->settings.defaultScreen = 1; break; + case 3022: liveData->settings.defaultScreen = 2; break; + case 3023: liveData->settings.defaultScreen = 3; break; + case 3024: liveData->settings.defaultScreen = 4; break; + case 3025: liveData->settings.defaultScreen = 5; break; // Debug screen off/on - case 3031: this->liveData->settings.debugScreen = 0; break; - case 3032: this->liveData->settings.debugScreen = 1; break; + case 3031: liveData->settings.debugScreen = 0; break; + case 3032: liveData->settings.debugScreen = 1; break; // Lcd brightness - case 3041: this->liveData->settings.lcdBrightness = 0; break; - case 3042: this->liveData->settings.lcdBrightness = 20; break; - case 3043: this->liveData->settings.lcdBrightness = 50; break; - case 3044: this->liveData->settings.lcdBrightness = 100; break; + case 3041: liveData->settings.lcdBrightness = 0; break; + case 3042: liveData->settings.lcdBrightness = 20; break; + case 3043: liveData->settings.lcdBrightness = 50; break; + case 3044: liveData->settings.lcdBrightness = 100; break; // Pre-drawn charg.graphs off/on - case 3051: this->liveData->settings.predrawnChargingGraphs = 0; break; - case 3052: this->liveData->settings.predrawnChargingGraphs = 1; break; + case 3051: liveData->settings.predrawnChargingGraphs = 0; break; + case 3052: liveData->settings.predrawnChargingGraphs = 1; break; // Distance - case 4011: this->liveData->settings.distanceUnit = 'k'; break; - case 4012: this->liveData->settings.distanceUnit = 'm'; break; + case 4011: liveData->settings.distanceUnit = 'k'; break; + case 4012: liveData->settings.distanceUnit = 'm'; break; // Temperature - case 4021: this->liveData->settings.temperatureUnit = 'c'; break; - case 4022: this->liveData->settings.temperatureUnit = 'f'; break; + case 4021: liveData->settings.temperatureUnit = 'c'; break; + case 4022: liveData->settings.temperatureUnit = 'f'; break; // Pressure - case 4031: this->liveData->settings.pressureUnit = 'b'; break; - case 4032: this->liveData->settings.pressureUnit = 'p'; break; + case 4031: liveData->settings.pressureUnit = 'b'; break; + case 4032: liveData->settings.pressureUnit = 'p'; break; // Pair ble device case 2: scanDevices = true; /*startBleScan(); */return; // Reset settings - case 8: this->resetSettings(); hideMenu(); return; + case 8: resetSettings(); hideMenu(); return; // Save settings - case 9: this->saveSettings(); break; + case 9: saveSettings(); break; // Version case 10: hideMenu(); return; // Shutdown - case 11: this->shutdownDevice(); return; + case 11: shutdownDevice(); return; default: // Submenu - this->liveData->menuCurrent = tmpMenuItem.id; - this->liveData->menuItemSelected = 0; - this->showMenu(); + liveData->menuCurrent = tmpMenuItem.id; + liveData->menuItemSelected = 0; + showMenu(); return; } // close menu - this->hideMenu(); + hideMenu(); } } @@ -1018,81 +1014,81 @@ void Board320_240::menuItemClick() { */ void Board320_240::redrawScreen() { - if (this->liveData->menuVisible) { + if (liveData->menuVisible) { return; } // Lights not enabled - if (!this->testDataMode && this->liveData->params.forwardDriveMode && !this->liveData->params.headLights && !this->liveData->params.dayLights) { - this->spr.fillSprite(TFT_RED); - this->spr.setFreeFont(&Orbitron_Light_32); - this->spr.setTextColor(TFT_WHITE, TFT_RED); - this->spr.setTextDatum(MC_DATUM); - this->spr.drawString("! LIGHTS OFF !", 160, 120, GFXFF); - this->spr.pushSprite(0, 0); + if (!testDataMode && liveData->params.forwardDriveMode && !liveData->params.headLights && !liveData->params.dayLights) { + spr.fillSprite(TFT_RED); + spr.setFreeFont(&Orbitron_Light_32); + spr.setTextColor(TFT_WHITE, TFT_RED); + spr.setTextDatum(MC_DATUM); + spr.drawString("! LIGHTS OFF !", 160, 120, GFXFF); + spr.pushSprite(0, 0); return; } - this->spr.fillSprite(TFT_BLACK); + spr.fillSprite(TFT_BLACK); // 1. Auto mode = >5kpm Screen 3 - speed, other wise basic Screen2 - Main screen, if charging then Screen 5 Graph - if (this->displayScreen == SCREEN_AUTO) { - if (this->liveData->params.speedKmh > 5) { - if (this->displayScreenAutoMode != 3) { - this->displayScreenAutoMode = 3; + if (displayScreen == SCREEN_AUTO) { + if (liveData->params.speedKmh > 5) { + if (displayScreenAutoMode != 3) { + displayScreenAutoMode = 3; } - this->drawSceneSpeed(); - } else if (this->liveData->params.batPowerKw > 1) { - if (this->displayScreenAutoMode != 5) { - this->displayScreenAutoMode = 5; + drawSceneSpeed(); + } else if (liveData->params.batPowerKw > 1) { + if (displayScreenAutoMode != 5) { + displayScreenAutoMode = 5; } - this->drawSceneChargingGraph(); + drawSceneChargingGraph(); } else { - if (this->displayScreenAutoMode != 2) { - this->displayScreenAutoMode = 2; + if (displayScreenAutoMode != 2) { + displayScreenAutoMode = 2; } - this->drawSceneMain(); + drawSceneMain(); } } // 2. Main screen - if (this->displayScreen == SCREEN_DASH) { - this->drawSceneMain(); + if (displayScreen == SCREEN_DASH) { + drawSceneMain(); } // 3. Big speed + kwh/100km - if (this->displayScreen == SCREEN_SPEED) { - this->drawSceneSpeed(); + if (displayScreen == SCREEN_SPEED) { + drawSceneSpeed(); } // 4. Battery cells - if (this->displayScreen == SCREEN_CELLS) { - this->drawSceneBatteryCells(); + if (displayScreen == SCREEN_CELLS) { + drawSceneBatteryCells(); } // 5. Charging graph - if (this->displayScreen == SCREEN_CHARGING) { - this->drawSceneChargingGraph(); + if (displayScreen == SCREEN_CHARGING) { + drawSceneChargingGraph(); } // 6. SOC10% table (CEC-CED) - if (this->displayScreen == SCREEN_SOC10) { - this->drawSceneSoc10Table(); + if (displayScreen == SCREEN_SOC10) { + drawSceneSoc10Table(); } // 7. DEBUG SCREEN - if (this->displayScreen == SCREEN_DEBUG) { - this->drawSceneDebug(); + if (displayScreen == SCREEN_DEBUG) { + drawSceneDebug(); } - if (!this->displayScreenSpeedHud) { + if (!displayScreenSpeedHud) { // BLE not connected - if (!this->liveData->bleConnected && this->liveData->bleConnect) { + if (!liveData->bleConnected && liveData->bleConnect) { // Print message - this->spr.setTextSize(1); - this->spr.setTextColor(TFT_WHITE, TFT_BLACK); - this->spr.setTextDatum(TL_DATUM); - this->spr.drawString("BLE4 OBDII not connected...", 0, 180, 2); - this->spr.drawString("Press middle button to menu.", 0, 200, 2); - this->spr.drawString(APP_VERSION, 0, 220, 2); + spr.setTextSize(1); + spr.setTextColor(TFT_WHITE, TFT_BLACK); + spr.setTextDatum(TL_DATUM); + spr.drawString("BLE4 OBDII not connected...", 0, 180, 2); + spr.drawString("Press middle button to menu.", 0, 200, 2); + spr.drawString(APP_VERSION, 0, 220, 2); } - this->spr.pushSprite(0, 0); + spr.pushSprite(0, 0); } } @@ -1101,9 +1097,9 @@ void Board320_240::redrawScreen() { */ void Board320_240::loadTestData() { - this->testDataMode = true; // skip lights off message - this->carInterface->loadTestData(); - this->redrawScreen(); + testDataMode = true; // skip lights off message + carInterface->loadTestData(); + redrawScreen(); } /** @@ -1114,58 +1110,58 @@ void Board320_240::mainLoop() { /////////////////////////////////////////////////////////////////////// // Handle buttons // MIDDLE - menu select - if (digitalRead(this->pinButtonMiddle) == HIGH) { - this->btnMiddlePressed = false; + if (digitalRead(pinButtonMiddle) == HIGH) { + btnMiddlePressed = false; } else { - if (!this->btnMiddlePressed) { - this->btnMiddlePressed = true; - this->tft.setRotation(this->liveData->settings.displayRotation); - if (this->liveData->menuVisible) { + if (!btnMiddlePressed) { + btnMiddlePressed = true; + tft.setRotation(liveData->settings.displayRotation); + if (liveData->menuVisible) { menuItemClick(); } else { - this->showMenu(); + showMenu(); } } } // LEFT - screen rotate, menu - if (digitalRead((this->liveData->settings.displayRotation == 1) ? this->pinButtonRight : this->pinButtonLeft) == HIGH) { - this->btnLeftPressed = false; + if (digitalRead((liveData->settings.displayRotation == 1) ? pinButtonRight : pinButtonLeft) == HIGH) { + btnLeftPressed = false; } else { - if (!this->btnLeftPressed) { - this->btnLeftPressed = true; - this->tft.setRotation(this->liveData->settings.displayRotation); + if (!btnLeftPressed) { + btnLeftPressed = true; + tft.setRotation(liveData->settings.displayRotation); // Menu handling - if (this->liveData->menuVisible) { - this->menuMove(false); + if (liveData->menuVisible) { + menuMove(false); } else { - this->displayScreen++; - if (this->displayScreen > this->displayScreenCount - (this->liveData->settings.debugScreen == 0) ? 1 : 0) - this->displayScreen = 0; // rotate screens + displayScreen++; + if (displayScreen > displayScreenCount - (liveData->settings.debugScreen == 0) ? 1 : 0) + displayScreen = 0; // rotate screens // Turn off display on screen 0 - this->setBrightness((this->displayScreen == SCREEN_BLANK) ? 0 : (this->liveData->settings.lcdBrightness == 0) ? 100 : this->liveData->settings.lcdBrightness); - this->redrawScreen(); + setBrightness((displayScreen == SCREEN_BLANK) ? 0 : (liveData->settings.lcdBrightness == 0) ? 100 : liveData->settings.lcdBrightness); + redrawScreen(); } } } // RIGHT - menu, debug screen rotation - if (digitalRead((this->liveData->settings.displayRotation == 1) ? this->pinButtonLeft : this->pinButtonRight) == HIGH) { - this->btnRightPressed = false; + if (digitalRead((liveData->settings.displayRotation == 1) ? pinButtonLeft : pinButtonRight) == HIGH) { + btnRightPressed = false; } else { - if (!this->btnRightPressed) { - this->btnRightPressed = true; - this->tft.setRotation(this->liveData->settings.displayRotation); + if (!btnRightPressed) { + btnRightPressed = true; + tft.setRotation(liveData->settings.displayRotation); // Menu handling - if (this->liveData->menuVisible) { - this->menuMove(true); + if (liveData->menuVisible) { + menuMove(true); } else { // doAction - if (this->displayScreen == SCREEN_SPEED) { - this->displayScreenSpeedHud = !this->displayScreenSpeedHud; - this->redrawScreen(); + if (displayScreen == SCREEN_SPEED) { + displayScreenSpeedHud = !displayScreenSpeedHud; + redrawScreen(); } - if (this->liveData->settings.debugScreen == 1 && this->displayScreen == SCREEN_DEBUG) { - this->debugCommandIndex = (this->debugCommandIndex >= this->liveData->commandQueueCount) ? this->liveData->commandQueueLoopFrom : this->debugCommandIndex + 1; - this->redrawScreen(); + if (liveData->settings.debugScreen == 1 && displayScreen == SCREEN_DEBUG) { + debugCommandIndex = (debugCommandIndex >= liveData->commandQueueCount) ? liveData->commandQueueLoopFrom : debugCommandIndex + 1; + redrawScreen(); } } @@ -1178,7 +1174,7 @@ void Board320_240::mainLoop() { * skipAdapterScan */ bool Board320_240::skipAdapterScan() { - return digitalRead(this->pinButtonMiddle) == LOW || digitalRead(this->pinButtonRight) == LOW; + return digitalRead(pinButtonMiddle) == LOW || digitalRead(pinButtonRight) == LOW; } #endif // BOARD320_240_CPP diff --git a/BoardInterface.cpp b/BoardInterface.cpp index 3019651..ac10978 100644 --- a/BoardInterface.cpp +++ b/BoardInterface.cpp @@ -10,14 +10,14 @@ Set live data */ void BoardInterface::setLiveData(LiveData* pLiveData) { - this->liveData = pLiveData; + liveData = pLiveData; } /** Attach car interface */ void BoardInterface::attachCar(CarInterface* pCarInterface) { - this->carInterface = pCarInterface; + carInterface = pCarInterface; } @@ -28,11 +28,11 @@ void BoardInterface::shutdownDevice() { Serial.println("Shutdown."); - this->displayMessage("Shutdown in 3 sec.", ""); + displayMessage("Shutdown in 3 sec.", ""); delay(3000); setCpuFrequencyMhz(80); - this->setBrightness(0); + setBrightness(0); //WiFi.disconnect(true); //WiFi.mode(WIFI_OFF); btStop(); @@ -52,7 +52,7 @@ void BoardInterface::saveSettings() { // Flash to memory Serial.println("Settings saved to eeprom."); - EEPROM.put(0, this->liveData->settings); + EEPROM.put(0, liveData->settings); EEPROM.commit(); } @@ -63,11 +63,11 @@ void BoardInterface::resetSettings() { // Flash to memory Serial.println("Factory reset."); - this->liveData->settings.initFlag = 1; - EEPROM.put(0, this->liveData->settings); + liveData->settings.initFlag = 1; + EEPROM.put(0, liveData->settings); EEPROM.commit(); - this->displayMessage("Settings erased", "Restarting in 5 seconds"); + displayMessage("Settings erased", "Restarting in 5 seconds"); delay(5000); ESP.restart(); @@ -81,28 +81,28 @@ void BoardInterface::loadSettings() { String tmpStr; // Init - this->liveData->settings.initFlag = 183; - this->liveData->settings.settingsVersion = 3; - this->liveData->settings.carType = CAR_KIA_ENIRO_2020_64; + liveData->settings.initFlag = 183; + liveData->settings.settingsVersion = 3; + liveData->settings.carType = CAR_KIA_ENIRO_2020_64; // Default OBD adapter MAC and UUID's tmpStr = "00:00:00:00:00:00"; // Pair via menu (middle button) - tmpStr.toCharArray(this->liveData->settings.obdMacAddress, tmpStr.length() + 1); + tmpStr.toCharArray(liveData->settings.obdMacAddress, tmpStr.length() + 1); tmpStr = "000018f0-0000-1000-8000-00805f9b34fb"; // Default UUID's for VGate iCar Pro BLE4 adapter - tmpStr.toCharArray(this->liveData->settings.serviceUUID, tmpStr.length() + 1); + tmpStr.toCharArray(liveData->settings.serviceUUID, tmpStr.length() + 1); tmpStr = "00002af0-0000-1000-8000-00805f9b34fb"; - tmpStr.toCharArray(this->liveData->settings.charTxUUID, tmpStr.length() + 1); + tmpStr.toCharArray(liveData->settings.charTxUUID, tmpStr.length() + 1); tmpStr = "00002af1-0000-1000-8000-00805f9b34fb"; - tmpStr.toCharArray(this->liveData->settings.charRxUUID, tmpStr.length() + 1); + tmpStr.toCharArray(liveData->settings.charRxUUID, tmpStr.length() + 1); - this->liveData->settings.displayRotation = 1; // 1,3 - this->liveData->settings.distanceUnit = 'k'; - this->liveData->settings.temperatureUnit = 'c'; - this->liveData->settings.pressureUnit = 'b'; - this->liveData->settings.defaultScreen = 1; - this->liveData->settings.lcdBrightness = 0; - this->liveData->settings.debugScreen = 0; - this->liveData->settings.predrawnChargingGraphs = 1; + liveData->settings.displayRotation = 1; // 1,3 + liveData->settings.distanceUnit = 'k'; + liveData->settings.temperatureUnit = 'c'; + liveData->settings.pressureUnit = 'b'; + liveData->settings.defaultScreen = 1; + liveData->settings.lcdBrightness = 0; + liveData->settings.debugScreen = 0; + liveData->settings.predrawnChargingGraphs = 1; #ifdef SIM800L_ENABLED tmpStr = "internet.t-mobile.cz"; @@ -116,34 +116,34 @@ void BoardInterface::loadSettings() { // Load settings and replace default values Serial.println("Reading settings from eeprom."); EEPROM.begin(sizeof(SETTINGS_STRUC)); - EEPROM.get(0, this->liveData->tmpSettings); + EEPROM.get(0, liveData->tmpSettings); // Init flash with default settings - if (this->liveData->tmpSettings.initFlag != 183) { + if (liveData->tmpSettings.initFlag != 183) { Serial.println("Settings not found. Initialization."); - this->saveSettings(); + saveSettings(); } else { Serial.print("Loaded settings ver.: "); - Serial.println(this->liveData->settings.settingsVersion); + Serial.println(liveData->settings.settingsVersion); // Upgrade structure - if (this->liveData->settings.settingsVersion != this->liveData->tmpSettings.settingsVersion) { - if (this->liveData->tmpSettings.settingsVersion == 1) { - this->liveData->tmpSettings.settingsVersion = 2; - this->liveData->tmpSettings.defaultScreen = this->liveData->settings.defaultScreen; - this->liveData->tmpSettings.lcdBrightness = this->liveData->settings.lcdBrightness; - this->liveData->tmpSettings.debugScreen = this->liveData->settings.debugScreen; + if (liveData->settings.settingsVersion != liveData->tmpSettings.settingsVersion) { + if (liveData->tmpSettings.settingsVersion == 1) { + liveData->tmpSettings.settingsVersion = 2; + liveData->tmpSettings.defaultScreen = liveData->settings.defaultScreen; + liveData->tmpSettings.lcdBrightness = liveData->settings.lcdBrightness; + liveData->tmpSettings.debugScreen = liveData->settings.debugScreen; } - if (this->liveData->tmpSettings.settingsVersion == 2) { - this->liveData->tmpSettings.settingsVersion = 3; - this->liveData->tmpSettings.predrawnChargingGraphs = this->liveData->settings.predrawnChargingGraphs; + if (liveData->tmpSettings.settingsVersion == 2) { + liveData->tmpSettings.settingsVersion = 3; + liveData->tmpSettings.predrawnChargingGraphs = liveData->settings.predrawnChargingGraphs; } - this->saveSettings(); + saveSettings(); } // Save version? No need to upgrade structure - if (this->liveData->settings.settingsVersion == this->liveData->tmpSettings.settingsVersion) { - this->liveData->settings = this->liveData->tmpSettings; + if (liveData->settings.settingsVersion == liveData->tmpSettings.settingsVersion) { + liveData->settings = liveData->tmpSettings; } } } diff --git a/BoardM5stackCore.cpp b/BoardM5stackCore.cpp index 744165e..3119b00 100644 --- a/BoardM5stackCore.cpp +++ b/BoardM5stackCore.cpp @@ -4,21 +4,58 @@ #include "BoardInterface.h" #include "Board320_240.h" #include "BoardM5stackCore.h" +#include +#include /** Init board */ void BoardM5stackCore::initBoard() { - this->invertDisplay = true; - this->pinButtonLeft = BUTTON_LEFT; - this->pinButtonRight = BUTTON_RIGHT; - this->pinButtonMiddle = BUTTON_MIDDLE; - this->pinSpeaker = SPEAKER_PIN; - this->pinBrightness = TFT_BL; + invertDisplay = true; + pinButtonLeft = BUTTON_LEFT; + pinButtonRight = BUTTON_RIGHT; + pinButtonMiddle = BUTTON_MIDDLE; + pinSpeaker = SPEAKER_PIN; + pinBrightness = TFT_BL; Board320_240::initBoard(); - } +void BoardM5stackCore::mainLoop() { + + Board320_240::mainLoop(); + +/*#define TFCARD_CS_PIN 4 + + if (!SD.begin(TFCARD_CS_PIN, SPI, 40000000)) { + Serial.println("Card Mount Failed"); + return; + } + uint8_t cardType = SD.cardType(); + if (cardType == CARD_NONE) { + Serial.println("No SD card attached"); + return; + } + + Serial.print("SD Card Type: "); + if (cardType == CARD_MMC) { + Serial.println("MMC"); + } else if (cardType == CARD_SD) { + Serial.println("SDSC"); + } else if (cardType == CARD_SDHC) { + Serial.println("SDHC"); + } else { + Serial.println("UNKNOWN"); + } + + uint64_t cardSize = SD.cardSize() / (1024 * 1024); + Serial.printf("SD Card Size: %lluMB\n", cardSize); + + Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024)); + Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024)); + */ +} + + #endif // BOARDM5STACKCORE_CPP diff --git a/BoardM5stackCore.h b/BoardM5stackCore.h index 55045d4..71e5b2f 100644 --- a/BoardM5stackCore.h +++ b/BoardM5stackCore.h @@ -34,11 +34,11 @@ #include "Board320_240.h" class BoardM5stackCore : public Board320_240 { - - private: + + private: public: void initBoard() override; - + void mainLoop() override; }; #endif // BOARDM5STACKCORE_H diff --git a/BoardTtgoT4v13.cpp b/BoardTtgoT4v13.cpp index bbfcc7b..bb1a0e8 100644 --- a/BoardTtgoT4v13.cpp +++ b/BoardTtgoT4v13.cpp @@ -10,11 +10,11 @@ */ void BoardTtgoT4v13::initBoard() { - this->pinButtonLeft = BUTTON_LEFT; - this->pinButtonRight = BUTTON_RIGHT; - this->pinButtonMiddle = BUTTON_MIDDLE; - //this->pinSpeaker = SPEAKER_PIN; - this->pinBrightness = TFT_BL; + pinButtonLeft = BUTTON_LEFT; + pinButtonRight = BUTTON_RIGHT; + pinButtonMiddle = BUTTON_MIDDLE; + //pinSpeaker = SPEAKER_PIN; + pinBrightness = TFT_BL; Board320_240::initBoard(); } diff --git a/CarHyundaiIoniq.cpp b/CarHyundaiIoniq.cpp index 7ae1991..4f8f22f 100644 --- a/CarHyundaiIoniq.cpp +++ b/CarHyundaiIoniq.cpp @@ -7,7 +7,7 @@ #define commandQueueLoopFromHyundaiIoniq 8 /** - activatethis->liveData->commandQueue + activateliveData->commandQueue */ void CarHyundaiIoniq::activateCommandQueue() { @@ -63,19 +63,19 @@ void CarHyundaiIoniq::activateCommandQueue() { }; // 28kWh version - this->liveData->params.batteryTotalAvailableKWh = 28; - this->liveData->params.batModuleTempCount = 12; + liveData->params.batteryTotalAvailableKWh = 28; + liveData->params.batModuleTempCount = 12; // Empty and fill command queue for (int i = 0; i < 300; i++) { - this->liveData->commandQueue[i] = ""; + liveData->commandQueue[i] = ""; } for (int i = 0; i < commandQueueCountHyundaiIoniq; i++) { - this->liveData->commandQueue[i] = commandQueueHyundaiIoniq[i]; + liveData->commandQueue[i] = commandQueueHyundaiIoniq[i]; } - this->liveData->commandQueueLoopFrom = commandQueueLoopFromHyundaiIoniq; - this->liveData->commandQueueCount = commandQueueCountHyundaiIoniq; + liveData->commandQueueLoopFrom = commandQueueLoopFromHyundaiIoniq; + liveData->commandQueueCount = commandQueueCountHyundaiIoniq; } /** @@ -84,157 +84,157 @@ void CarHyundaiIoniq::activateCommandQueue() { void CarHyundaiIoniq::parseRowMerged() { // VMCU 7E2 - if (this->liveData->currentAtshRequest.equals("ATSH7E2")) { - if (this->liveData->commandRequest.equals("2101")) { - this->liveData->params.speedKmh = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750 - if (this->liveData->params.speedKmh < -99 || this->liveData->params.speedKmh > 200) - this->liveData->params.speedKmh = 0; + if (liveData->currentAtshRequest.equals("ATSH7E2")) { + if (liveData->commandRequest.equals("2101")) { + liveData->params.speedKmh = liveData->hexToDec(liveData->responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750 + if (liveData->params.speedKmh < -99 || liveData->params.speedKmh > 200) + liveData->params.speedKmh = 0; } - if (this->liveData->commandRequest.equals("2102")) { - this->liveData->params.auxPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(50, 52).c_str(), 1, false); - this->liveData->params.auxCurrentAmp = - this->liveData->hexToDec(this->liveData->responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0; + if (liveData->commandRequest.equals("2102")) { + liveData->params.auxPerc = liveData->hexToDec(liveData->responseRowMerged.substring(50, 52).c_str(), 1, false); + liveData->params.auxCurrentAmp = - liveData->hexToDec(liveData->responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0; } } // Cluster module 7c6 - if (this->liveData->currentAtshRequest.equals("ATSH7C6")) { - if (this->liveData->commandRequest.equals("22B002")) { - this->liveData->params.odoKm = float(strtol(this->liveData->responseRowMerged.substring(18, 24).c_str(), 0, 16)); + if (liveData->currentAtshRequest.equals("ATSH7C6")) { + if (liveData->commandRequest.equals("22B002")) { + liveData->params.odoKm = float(strtol(liveData->responseRowMerged.substring(18, 24).c_str(), 0, 16)); } } // Aircon 7b3 - if (this->liveData->currentAtshRequest.equals("ATSH7B3")) { - if (this->liveData->commandRequest.equals("220100")) { - this->liveData->params.indoorTemperature = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; - this->liveData->params.outdoorTemperature = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(18, 20).c_str(), 1, false) / 2) - 40; + if (liveData->currentAtshRequest.equals("ATSH7B3")) { + if (liveData->commandRequest.equals("220100")) { + liveData->params.indoorTemperature = (liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; + liveData->params.outdoorTemperature = (liveData->hexToDec(liveData->responseRowMerged.substring(18, 20).c_str(), 1, false) / 2) - 40; } - if (this->liveData->commandRequest.equals("220102") && this->liveData->responseRowMerged.substring(12, 14) == "00") { - this->liveData->params.coolantTemp1C = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false) / 2) - 40; - this->liveData->params.coolantTemp2C = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; + if (liveData->commandRequest.equals("220102") && liveData->responseRowMerged.substring(12, 14) == "00") { + liveData->params.coolantTemp1C = (liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false) / 2) - 40; + liveData->params.coolantTemp2C = (liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; } } // BMS 7e4 - if (this->liveData->currentAtshRequest.equals("ATSH7E4")) { - if (this->liveData->commandRequest.equals("2101")) { - this->liveData->params.cumulativeEnergyChargedKWh = float(strtol(this->liveData->responseRowMerged.substring(80, 88).c_str(), 0, 16)) / 10.0; - if (this->liveData->params.cumulativeEnergyChargedKWhStart == -1) - this->liveData->params.cumulativeEnergyChargedKWhStart = this->liveData->params.cumulativeEnergyChargedKWh; - this->liveData->params.cumulativeEnergyDischargedKWh = float(strtol(this->liveData->responseRowMerged.substring(88, 96).c_str(), 0, 16)) / 10.0; - if (this->liveData->params.cumulativeEnergyDischargedKWhStart == -1) - this->liveData->params.cumulativeEnergyDischargedKWhStart = this->liveData->params.cumulativeEnergyDischargedKWh; - this->liveData->params.availableChargePower = float(strtol(this->liveData->responseRowMerged.substring(16, 20).c_str(), 0, 16)) / 100.0; - this->liveData->params.availableDischargePower = float(strtol(this->liveData->responseRowMerged.substring(20, 24).c_str(), 0, 16)) / 100.0; - this->liveData->params.isolationResistanceKOhm = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(118, 122).c_str(), 2, true); - this->liveData->params.batFanStatus = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(58, 60).c_str(), 2, true); - this->liveData->params.batFanFeedbackHz = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(60, 62).c_str(), 2, true); - this->liveData->params.auxVoltage = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(62, 64).c_str(), 2, true) / 10.0; - this->liveData->params.batPowerAmp = - this->liveData->hexToDec(this->liveData->responseRowMerged.substring(24, 28).c_str(), 2, true) / 10.0; - this->liveData->params.batVoltage = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(28, 32).c_str(), 2, false) / 10.0; - this->liveData->params.batPowerKw = (this->liveData->params.batPowerAmp * this->liveData->params.batVoltage) / 1000.0; - if (this->liveData->params.batPowerKw < 1) // Reset charging start time - this->liveData->params.chargingStartTime = this->liveData->params.currentTime; - this->liveData->params.batPowerKwh100 = this->liveData->params.batPowerKw / this->liveData->params.speedKmh * 100; - this->liveData->params.batCellMaxV = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(50, 52).c_str(), 1, false) / 50.0; - this->liveData->params.batCellMinV = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(54, 56).c_str(), 1, false) / 50.0; - this->liveData->params.batModuleTempC[0] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); - this->liveData->params.batModuleTempC[1] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(38, 40).c_str(), 1, true); - this->liveData->params.batModuleTempC[2] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(40, 42).c_str(), 1, true); - this->liveData->params.batModuleTempC[3] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(42, 44).c_str(), 1, true); - this->liveData->params.batModuleTempC[4] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(44, 46).c_str(), 1, true); - //this->liveData->params.batTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); - //this->liveData->params.batMaxC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 34).c_str(), 1, true); - //this->liveData->params.batMinC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); + if (liveData->currentAtshRequest.equals("ATSH7E4")) { + if (liveData->commandRequest.equals("2101")) { + liveData->params.cumulativeEnergyChargedKWh = float(strtol(liveData->responseRowMerged.substring(80, 88).c_str(), 0, 16)) / 10.0; + if (liveData->params.cumulativeEnergyChargedKWhStart == -1) + liveData->params.cumulativeEnergyChargedKWhStart = liveData->params.cumulativeEnergyChargedKWh; + liveData->params.cumulativeEnergyDischargedKWh = float(strtol(liveData->responseRowMerged.substring(88, 96).c_str(), 0, 16)) / 10.0; + if (liveData->params.cumulativeEnergyDischargedKWhStart == -1) + liveData->params.cumulativeEnergyDischargedKWhStart = liveData->params.cumulativeEnergyDischargedKWh; + liveData->params.availableChargePower = float(strtol(liveData->responseRowMerged.substring(16, 20).c_str(), 0, 16)) / 100.0; + liveData->params.availableDischargePower = float(strtol(liveData->responseRowMerged.substring(20, 24).c_str(), 0, 16)) / 100.0; + liveData->params.isolationResistanceKOhm = liveData->hexToDec(liveData->responseRowMerged.substring(118, 122).c_str(), 2, true); + liveData->params.batFanStatus = liveData->hexToDec(liveData->responseRowMerged.substring(58, 60).c_str(), 2, true); + liveData->params.batFanFeedbackHz = liveData->hexToDec(liveData->responseRowMerged.substring(60, 62).c_str(), 2, true); + liveData->params.auxVoltage = liveData->hexToDec(liveData->responseRowMerged.substring(62, 64).c_str(), 2, true) / 10.0; + liveData->params.batPowerAmp = - liveData->hexToDec(liveData->responseRowMerged.substring(24, 28).c_str(), 2, true) / 10.0; + liveData->params.batVoltage = liveData->hexToDec(liveData->responseRowMerged.substring(28, 32).c_str(), 2, false) / 10.0; + liveData->params.batPowerKw = (liveData->params.batPowerAmp * liveData->params.batVoltage) / 1000.0; + if (liveData->params.batPowerKw < 1) // Reset charging start time + liveData->params.chargingStartTime = liveData->params.currentTime; + liveData->params.batPowerKwh100 = liveData->params.batPowerKw / liveData->params.speedKmh * 100; + liveData->params.batCellMaxV = liveData->hexToDec(liveData->responseRowMerged.substring(50, 52).c_str(), 1, false) / 50.0; + liveData->params.batCellMinV = liveData->hexToDec(liveData->responseRowMerged.substring(54, 56).c_str(), 1, false) / 50.0; + liveData->params.batModuleTempC[0] = liveData->hexToDec(liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); + liveData->params.batModuleTempC[1] = liveData->hexToDec(liveData->responseRowMerged.substring(38, 40).c_str(), 1, true); + liveData->params.batModuleTempC[2] = liveData->hexToDec(liveData->responseRowMerged.substring(40, 42).c_str(), 1, true); + liveData->params.batModuleTempC[3] = liveData->hexToDec(liveData->responseRowMerged.substring(42, 44).c_str(), 1, true); + liveData->params.batModuleTempC[4] = liveData->hexToDec(liveData->responseRowMerged.substring(44, 46).c_str(), 1, true); + //liveData->params.batTempC = liveData->hexToDec(liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); + //liveData->params.batMaxC = liveData->hexToDec(liveData->responseRowMerged.substring(32, 34).c_str(), 1, true); + //liveData->params.batMinC = liveData->hexToDec(liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); // This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging) - this->liveData->params.batInletC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(48, 50).c_str(), 1, true); - if (this->liveData->params.speedKmh < 10 && this->liveData->params.batPowerKw >= 1 && this->liveData->params.socPerc > 0 && this->liveData->params.socPerc <= 100) { - if ( this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)] == -100 || this->liveData->params.batPowerKw < this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)]) - this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)] = this->liveData->params.batPowerKw; - if ( this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)] == -100 || this->liveData->params.batPowerKw > this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)]) - this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)] = this->liveData->params.batPowerKw; - this->liveData->params.chargingGraphBatMinTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batMinC; - this->liveData->params.chargingGraphBatMaxTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batMaxC; - this->liveData->params.chargingGraphHeaterTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batHeaterC; + liveData->params.batInletC = liveData->hexToDec(liveData->responseRowMerged.substring(48, 50).c_str(), 1, true); + if (liveData->params.speedKmh < 10 && liveData->params.batPowerKw >= 1 && liveData->params.socPerc > 0 && liveData->params.socPerc <= 100) { + if ( liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)] == -100 || liveData->params.batPowerKw < liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)]) + liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)] = liveData->params.batPowerKw; + if ( liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)] == -100 || liveData->params.batPowerKw > liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)]) + liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)] = liveData->params.batPowerKw; + liveData->params.chargingGraphBatMinTempC[int(liveData->params.socPerc)] = liveData->params.batMinC; + liveData->params.chargingGraphBatMaxTempC[int(liveData->params.socPerc)] = liveData->params.batMaxC; + liveData->params.chargingGraphHeaterTempC[int(liveData->params.socPerc)] = liveData->params.batHeaterC; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("2102") && this->liveData->responseRowMerged.substring(10, 12) == "FF") { + if (liveData->commandRequest.equals("2102") && liveData->responseRowMerged.substring(10, 12) == "FF") { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(12 + (i * 2), 12 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[i] = liveData->hexToDec(liveData->responseRowMerged.substring(12 + (i * 2), 12 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("2103")) { + if (liveData->commandRequest.equals("2103")) { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[32 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(12 + (i * 2), 12 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[32 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(12 + (i * 2), 12 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("2104")) { + if (liveData->commandRequest.equals("2104")) { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[64 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(12 + (i * 2), 12 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[64 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(12 + (i * 2), 12 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("2105")) { - this->liveData->params.socPercPrevious = this->liveData->params.socPerc; - this->liveData->params.sohPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(54, 58).c_str(), 2, false) / 10.0; - this->liveData->params.socPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(66, 68).c_str(), 1, false) / 2.0; + if (liveData->commandRequest.equals("2105")) { + liveData->params.socPercPrevious = liveData->params.socPerc; + liveData->params.sohPerc = liveData->hexToDec(liveData->responseRowMerged.substring(54, 58).c_str(), 2, false) / 10.0; + liveData->params.socPerc = liveData->hexToDec(liveData->responseRowMerged.substring(66, 68).c_str(), 1, false) / 2.0; // Remaining battery modules (tempC) - this->liveData->params.batModuleTempC[5] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(22, 24).c_str(), 1, true); - this->liveData->params.batModuleTempC[6] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(24, 26).c_str(), 1, true); - this->liveData->params.batModuleTempC[7] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(26, 28).c_str(), 1, true); - this->liveData->params.batModuleTempC[8] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(28, 30).c_str(), 1, true); - this->liveData->params.batModuleTempC[9] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 32).c_str(), 1, true); - this->liveData->params.batModuleTempC[10] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 34).c_str(), 1, true); - this->liveData->params.batModuleTempC[11] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); + liveData->params.batModuleTempC[5] = liveData->hexToDec(liveData->responseRowMerged.substring(22, 24).c_str(), 1, true); + liveData->params.batModuleTempC[6] = liveData->hexToDec(liveData->responseRowMerged.substring(24, 26).c_str(), 1, true); + liveData->params.batModuleTempC[7] = liveData->hexToDec(liveData->responseRowMerged.substring(26, 28).c_str(), 1, true); + liveData->params.batModuleTempC[8] = liveData->hexToDec(liveData->responseRowMerged.substring(28, 30).c_str(), 1, true); + liveData->params.batModuleTempC[9] = liveData->hexToDec(liveData->responseRowMerged.substring(30, 32).c_str(), 1, true); + liveData->params.batModuleTempC[10] = liveData->hexToDec(liveData->responseRowMerged.substring(32, 34).c_str(), 1, true); + liveData->params.batModuleTempC[11] = liveData->hexToDec(liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); - this->liveData->params.batMinC = this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[0]; - for (uint16_t i = 1; i < this->liveData->params.batModuleTempCount; i++) { - if (this->liveData->params.batModuleTempC[i] < this->liveData->params.batMinC) - this->liveData->params.batMinC = this->liveData->params.batModuleTempC[i]; - if (this->liveData->params.batModuleTempC[i] > this->liveData->params.batMaxC) - this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[i]; + liveData->params.batMinC = liveData->params.batMaxC = liveData->params.batModuleTempC[0]; + for (uint16_t i = 1; i < liveData->params.batModuleTempCount; i++) { + if (liveData->params.batModuleTempC[i] < liveData->params.batMinC) + liveData->params.batMinC = liveData->params.batModuleTempC[i]; + if (liveData->params.batModuleTempC[i] > liveData->params.batMaxC) + liveData->params.batMaxC = liveData->params.batModuleTempC[i]; } - this->liveData->params.batTempC = this->liveData->params.batMinC; + liveData->params.batTempC = liveData->params.batMinC; // Soc10ced table, record x0% CEC/CED table (ex. 90%->89%, 80%->79%) - if (this->liveData->params.socPercPrevious - this->liveData->params.socPerc > 0) { - byte index = (int(this->liveData->params.socPerc) == 4) ? 0 : (int)(this->liveData->params.socPerc / 10) + 1; - if ((int(this->liveData->params.socPerc) % 10 == 9 || int(this->liveData->params.socPerc) == 4) && this->liveData->params.soc10ced[index] == -1) { - this->liveData->params.soc10ced[index] = this->liveData->params.cumulativeEnergyDischargedKWh; - this->liveData->params.soc10cec[index] = this->liveData->params.cumulativeEnergyChargedKWh; - this->liveData->params.soc10odo[index] = this->liveData->params.odoKm; - this->liveData->params.soc10time[index] = this->liveData->params.currentTime; + if (liveData->params.socPercPrevious - liveData->params.socPerc > 0) { + byte index = (int(liveData->params.socPerc) == 4) ? 0 : (int)(liveData->params.socPerc / 10) + 1; + if ((int(liveData->params.socPerc) % 10 == 9 || int(liveData->params.socPerc) == 4) && liveData->params.soc10ced[index] == -1) { + liveData->params.soc10ced[index] = liveData->params.cumulativeEnergyDischargedKWh; + liveData->params.soc10cec[index] = liveData->params.cumulativeEnergyChargedKWh; + liveData->params.soc10odo[index] = liveData->params.odoKm; + liveData->params.soc10time[index] = liveData->params.currentTime; } } - this->liveData->params.batHeaterC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(50, 52).c_str(), 1, true); + liveData->params.batHeaterC = liveData->hexToDec(liveData->responseRowMerged.substring(50, 52).c_str(), 1, true); // for (int i = 30; i < 32; i++) { // ai/aj position - this->liveData->params.cellVoltage[96 - 30 + i] = -1; + liveData->params.cellVoltage[96 - 30 + i] = -1; } } // BMS 7e4 // IONIQ FAILED - if (this->liveData->commandRequest.equals("2106")) { - this->liveData->params.coolingWaterTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); + if (liveData->commandRequest.equals("2106")) { + liveData->params.coolingWaterTempC = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); } } // TPMS 7a0 - if (this->liveData->currentAtshRequest.equals("ATSH7A0")) { - if (this->liveData->commandRequest.equals("22c00b")) { - this->liveData->params.tireFrontLeftPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireFrontRightPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(22, 24).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireRearRightPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 32).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireRearLeftPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(38, 40).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireFrontLeftTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireFrontRightTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(24, 26).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireRearRightTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 34).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireRearLeftTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(40, 42).c_str(), 2, false) - 50; // === OK Valid + if (liveData->currentAtshRequest.equals("ATSH7A0")) { + if (liveData->commandRequest.equals("22c00b")) { + liveData->params.tireFrontLeftPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireFrontRightPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(22, 24).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireRearRightPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(30, 32).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireRearLeftPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(38, 40).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireFrontLeftTempC = liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireFrontRightTempC = liveData->hexToDec(liveData->responseRowMerged.substring(24, 26).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireRearRightTempC = liveData->hexToDec(liveData->responseRowMerged.substring(32, 34).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireRearLeftTempC = liveData->hexToDec(liveData->responseRowMerged.substring(40, 42).c_str(), 2, false) - 50; // === OK Valid } } @@ -246,134 +246,134 @@ void CarHyundaiIoniq::parseRowMerged() { void CarHyundaiIoniq::loadTestData() { // VMCU ATSH7E2 - this->liveData->currentAtshRequest = "ATSH7E2"; + liveData->currentAtshRequest = "ATSH7E2"; // 2101 - this->liveData->commandRequest = "2101"; - this->liveData->responseRowMerged = "6101FFE0000009211222062F03000000001D7734"; - this->parseRowMerged(); + liveData->commandRequest = "2101"; + liveData->responseRowMerged = "6101FFE0000009211222062F03000000001D7734"; + parseRowMerged(); // 2102 - this->liveData->commandRequest = "2102"; - this->liveData->responseRowMerged = "6102FF80000001010000009315B2888D390B08618B683900000000"; - this->parseRowMerged(); + liveData->commandRequest = "2102"; + liveData->responseRowMerged = "6102FF80000001010000009315B2888D390B08618B683900000000"; + parseRowMerged(); // "ATSH7DF", - this->liveData->currentAtshRequest = "ATSH7DF"; + liveData->currentAtshRequest = "ATSH7DF"; // AIRCON / ACU ATSH7B3 - this->liveData->currentAtshRequest = "ATSH7B3"; + liveData->currentAtshRequest = "ATSH7B3"; // 220100 - this->liveData->commandRequest = "220100"; - this->liveData->responseRowMerged = "6201007E5007C8FF8A876A011010FFFF10FF10FFFFFFFFFFFFFFFFFF2EEF767D00FFFF00FFFF000000"; - this->parseRowMerged(); + liveData->commandRequest = "220100"; + liveData->responseRowMerged = "6201007E5007C8FF8A876A011010FFFF10FF10FFFFFFFFFFFFFFFFFF2EEF767D00FFFF00FFFF000000"; + parseRowMerged(); // 220102 - this->liveData->commandRequest = "220102"; - this->liveData->responseRowMerged = "620102FF800000A3950000000000002600000000"; - this->parseRowMerged(); + liveData->commandRequest = "220102"; + liveData->responseRowMerged = "620102FF800000A3950000000000002600000000"; + parseRowMerged(); // BMS ATSH7E4 - this->liveData->currentAtshRequest = "ATSH7E4"; + liveData->currentAtshRequest = "ATSH7E4"; // 220101 - this->liveData->commandRequest = "2101"; - this->liveData->responseRowMerged = "6101FFFFFFFF5026482648A3FFC30D9E181717171718170019B50FB501000090000142230001425F0000771B00007486007815D809015C0000000003E800"; - this->parseRowMerged(); + liveData->commandRequest = "2101"; + liveData->responseRowMerged = "6101FFFFFFFF5026482648A3FFC30D9E181717171718170019B50FB501000090000142230001425F0000771B00007486007815D809015C0000000003E800"; + parseRowMerged(); // 220102 - this->liveData->commandRequest = "2102"; - this->liveData->responseRowMerged = "6102FFFFFFFFB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5000000"; - this->parseRowMerged(); + liveData->commandRequest = "2102"; + liveData->responseRowMerged = "6102FFFFFFFFB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5000000"; + parseRowMerged(); // 220103 - this->liveData->commandRequest = "2103"; - this->liveData->responseRowMerged = "6103FFFFFFFFB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5000000"; - this->parseRowMerged(); + liveData->commandRequest = "2103"; + liveData->responseRowMerged = "6103FFFFFFFFB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5000000"; + parseRowMerged(); // 220104 - this->liveData->commandRequest = "2104"; - this->liveData->responseRowMerged = "6104FFFFFFFFB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5000000"; - this->parseRowMerged(); + liveData->commandRequest = "2104"; + liveData->responseRowMerged = "6104FFFFFFFFB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5000000"; + parseRowMerged(); // 220105 - this->liveData->commandRequest = "2105"; - this->liveData->responseRowMerged = "6105FFFFFFFF00000000001717171817171726482648000150181703E81A03E801520029000000000000000000000000"; - this->parseRowMerged(); + liveData->commandRequest = "2105"; + liveData->responseRowMerged = "6105FFFFFFFF00000000001717171817171726482648000150181703E81A03E801520029000000000000000000000000"; + parseRowMerged(); // 220106 - this->liveData->commandRequest = "2106"; - this->liveData->responseRowMerged = "7F2112"; // n/a on ioniq - this->parseRowMerged(); + liveData->commandRequest = "2106"; + liveData->responseRowMerged = "7F2112"; // n/a on ioniq + parseRowMerged(); // BCM / TPMS ATSH7A0 - this->liveData->currentAtshRequest = "ATSH7A0"; + liveData->currentAtshRequest = "ATSH7A0"; // 22c00b - this->liveData->commandRequest = "22c00b"; - this->liveData->responseRowMerged = "62C00BFFFF0000B9510100B9510100B84F0100B54F0100AAAAAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "22c00b"; + liveData->responseRowMerged = "62C00BFFFF0000B9510100B9510100B84F0100B54F0100AAAAAAAA"; + parseRowMerged(); // ATSH7C6 - this->liveData->currentAtshRequest = "ATSH7C6"; + liveData->currentAtshRequest = "ATSH7C6"; // 22b002 - this->liveData->commandRequest = "22b002"; - this->liveData->responseRowMerged = "62B002E000000000AD003D2D0000000000000000"; - this->parseRowMerged(); + liveData->commandRequest = "22b002"; + liveData->responseRowMerged = "62B002E000000000AD003D2D0000000000000000"; + parseRowMerged(); - /* this->liveData->params.batModule01TempC = 28; - this->liveData->params.batModule02TempC = 29; - this->liveData->params.batModule03TempC = 28; - this->liveData->params.batModule04TempC = 30; - //this->liveData->params.batTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); - //this->liveData->params.batMaxC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); - //this->liveData->params.batMinC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); + /* liveData->params.batModule01TempC = 28; + liveData->params.batModule02TempC = 29; + liveData->params.batModule03TempC = 28; + liveData->params.batModule04TempC = 30; + //liveData->params.batTempC = liveData->hexToDec(liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); + //liveData->params.batMaxC = liveData->hexToDec(liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); + //liveData->params.batMinC = liveData->hexToDec(liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); // This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging) - this->liveData->params.batMinC = this->liveData->params.batMaxC = this->liveData->params.batModule01TempC; - this->liveData->params.batMinC = (this->liveData->params.batModule02TempC < this->liveData->params.batMinC) ? this->liveData->params.batModule02TempC : this->liveData->params.batMinC ; - this->liveData->params.batMinC = (this->liveData->params.batModule03TempC < this->liveData->params.batMinC) ? this->liveData->params.batModule03TempC : this->liveData->params.batMinC ; - this->liveData->params.batMinC = (this->liveData->params.batModule04TempC < this->liveData->params.batMinC) ? this->liveData->params.batModule04TempC : this->liveData->params.batMinC ; - this->liveData->params.batMaxC = (this->liveData->params.batModule02TempC > this->liveData->params.batMaxC) ? this->liveData->params.batModule02TempC : this->liveData->params.batMaxC ; - this->liveData->params.batMaxC = (this->liveData->params.batModule03TempC > this->liveData->params.batMaxC) ? this->liveData->params.batModule03TempC : this->liveData->params.batMaxC ; - this->liveData->params.batMaxC = (this->liveData->params.batModule04TempC > this->liveData->params.batMaxC) ? this->liveData->params.batModule04TempC : this->liveData->params.batMaxC ; - this->liveData->params.batTempC = this->liveData->params.batMinC; + liveData->params.batMinC = liveData->params.batMaxC = liveData->params.batModule01TempC; + liveData->params.batMinC = (liveData->params.batModule02TempC < liveData->params.batMinC) ? liveData->params.batModule02TempC : liveData->params.batMinC ; + liveData->params.batMinC = (liveData->params.batModule03TempC < liveData->params.batMinC) ? liveData->params.batModule03TempC : liveData->params.batMinC ; + liveData->params.batMinC = (liveData->params.batModule04TempC < liveData->params.batMinC) ? liveData->params.batModule04TempC : liveData->params.batMinC ; + liveData->params.batMaxC = (liveData->params.batModule02TempC > liveData->params.batMaxC) ? liveData->params.batModule02TempC : liveData->params.batMaxC ; + liveData->params.batMaxC = (liveData->params.batModule03TempC > liveData->params.batMaxC) ? liveData->params.batModule03TempC : liveData->params.batMaxC ; + liveData->params.batMaxC = (liveData->params.batModule04TempC > liveData->params.batMaxC) ? liveData->params.batModule04TempC : liveData->params.batMaxC ; + liveData->params.batTempC = liveData->params.batMinC; // - this->liveData->params.soc10ced[10] = 2200; - this->liveData->params.soc10cec[10] = 2500; - this->liveData->params.soc10odo[10] = 13000; - this->liveData->params.soc10time[10] = 13000; - this->liveData->params.soc10ced[9] = this->liveData->params.soc10ced[10] + 6.4; - this->liveData->params.soc10cec[9] = this->liveData->params.soc10cec[10] + 0; - this->liveData->params.soc10odo[9] = this->liveData->params.soc10odo[10] + 30; - this->liveData->params.soc10time[9] = this->liveData->params.soc10time[10] + 900; - this->liveData->params.soc10ced[8] = this->liveData->params.soc10ced[9] + 6.8; - this->liveData->params.soc10cec[8] = this->liveData->params.soc10cec[9] + 0; - this->liveData->params.soc10odo[8] = this->liveData->params.soc10odo[9] + 30; - this->liveData->params.soc10time[8] = this->liveData->params.soc10time[9] + 900; - this->liveData->params.soc10ced[7] = this->liveData->params.soc10ced[8] + 7.2; - this->liveData->params.soc10cec[7] = this->liveData->params.soc10cec[8] + 0.6; - this->liveData->params.soc10odo[7] = this->liveData->params.soc10odo[8] + 30; - this->liveData->params.soc10time[7] = this->liveData->params.soc10time[8] + 900; - this->liveData->params.soc10ced[6] = this->liveData->params.soc10ced[7] + 6.7; - this->liveData->params.soc10cec[6] = this->liveData->params.soc10cec[7] + 0; - this->liveData->params.soc10odo[6] = this->liveData->params.soc10odo[7] + 30; - this->liveData->params.soc10time[6] = this->liveData->params.soc10time[7] + 900; - this->liveData->params.soc10ced[5] = this->liveData->params.soc10ced[6] + 6.7; - this->liveData->params.soc10cec[5] = this->liveData->params.soc10cec[6] + 0; - this->liveData->params.soc10odo[5] = this->liveData->params.soc10odo[6] + 30; - this->liveData->params.soc10time[5] = this->liveData->params.soc10time[6] + 900; - this->liveData->params.soc10ced[4] = this->liveData->params.soc10ced[5] + 6.4; - this->liveData->params.soc10cec[4] = this->liveData->params.soc10cec[5] + 0.3; - this->liveData->params.soc10odo[4] = this->liveData->params.soc10odo[5] + 30; - this->liveData->params.soc10time[4] = this->liveData->params.soc10time[5] + 900; - this->liveData->params.soc10ced[3] = this->liveData->params.soc10ced[4] + 6.4; - this->liveData->params.soc10cec[3] = this->liveData->params.soc10cec[4] + 0; - this->liveData->params.soc10odo[3] = this->liveData->params.soc10odo[4] + 30; - this->liveData->params.soc10time[3] = this->liveData->params.soc10time[4] + 900; - this->liveData->params.soc10ced[2] = this->liveData->params.soc10ced[3] + 5.4; - this->liveData->params.soc10cec[2] = this->liveData->params.soc10cec[3] + 0.1; - this->liveData->params.soc10odo[2] = this->liveData->params.soc10odo[3] + 30; - this->liveData->params.soc10time[2] = this->liveData->params.soc10time[3] + 900; - this->liveData->params.soc10ced[1] = this->liveData->params.soc10ced[2] + 6.2; - this->liveData->params.soc10cec[1] = this->liveData->params.soc10cec[2] + 0.1; - this->liveData->params.soc10odo[1] = this->liveData->params.soc10odo[2] + 30; - this->liveData->params.soc10time[1] = this->liveData->params.soc10time[2] + 900; - this->liveData->params.soc10ced[0] = this->liveData->params.soc10ced[1] + 2.9; - this->liveData->params.soc10cec[0] = this->liveData->params.soc10cec[1] + 0.5; - this->liveData->params.soc10odo[0] = this->liveData->params.soc10odo[1] + 15; - this->liveData->params.soc10time[0] = this->liveData->params.soc10time[1] + 900; + liveData->params.soc10ced[10] = 2200; + liveData->params.soc10cec[10] = 2500; + liveData->params.soc10odo[10] = 13000; + liveData->params.soc10time[10] = 13000; + liveData->params.soc10ced[9] = liveData->params.soc10ced[10] + 6.4; + liveData->params.soc10cec[9] = liveData->params.soc10cec[10] + 0; + liveData->params.soc10odo[9] = liveData->params.soc10odo[10] + 30; + liveData->params.soc10time[9] = liveData->params.soc10time[10] + 900; + liveData->params.soc10ced[8] = liveData->params.soc10ced[9] + 6.8; + liveData->params.soc10cec[8] = liveData->params.soc10cec[9] + 0; + liveData->params.soc10odo[8] = liveData->params.soc10odo[9] + 30; + liveData->params.soc10time[8] = liveData->params.soc10time[9] + 900; + liveData->params.soc10ced[7] = liveData->params.soc10ced[8] + 7.2; + liveData->params.soc10cec[7] = liveData->params.soc10cec[8] + 0.6; + liveData->params.soc10odo[7] = liveData->params.soc10odo[8] + 30; + liveData->params.soc10time[7] = liveData->params.soc10time[8] + 900; + liveData->params.soc10ced[6] = liveData->params.soc10ced[7] + 6.7; + liveData->params.soc10cec[6] = liveData->params.soc10cec[7] + 0; + liveData->params.soc10odo[6] = liveData->params.soc10odo[7] + 30; + liveData->params.soc10time[6] = liveData->params.soc10time[7] + 900; + liveData->params.soc10ced[5] = liveData->params.soc10ced[6] + 6.7; + liveData->params.soc10cec[5] = liveData->params.soc10cec[6] + 0; + liveData->params.soc10odo[5] = liveData->params.soc10odo[6] + 30; + liveData->params.soc10time[5] = liveData->params.soc10time[6] + 900; + liveData->params.soc10ced[4] = liveData->params.soc10ced[5] + 6.4; + liveData->params.soc10cec[4] = liveData->params.soc10cec[5] + 0.3; + liveData->params.soc10odo[4] = liveData->params.soc10odo[5] + 30; + liveData->params.soc10time[4] = liveData->params.soc10time[5] + 900; + liveData->params.soc10ced[3] = liveData->params.soc10ced[4] + 6.4; + liveData->params.soc10cec[3] = liveData->params.soc10cec[4] + 0; + liveData->params.soc10odo[3] = liveData->params.soc10odo[4] + 30; + liveData->params.soc10time[3] = liveData->params.soc10time[4] + 900; + liveData->params.soc10ced[2] = liveData->params.soc10ced[3] + 5.4; + liveData->params.soc10cec[2] = liveData->params.soc10cec[3] + 0.1; + liveData->params.soc10odo[2] = liveData->params.soc10odo[3] + 30; + liveData->params.soc10time[2] = liveData->params.soc10time[3] + 900; + liveData->params.soc10ced[1] = liveData->params.soc10ced[2] + 6.2; + liveData->params.soc10cec[1] = liveData->params.soc10cec[2] + 0.1; + liveData->params.soc10odo[1] = liveData->params.soc10odo[2] + 30; + liveData->params.soc10time[1] = liveData->params.soc10time[2] + 900; + liveData->params.soc10ced[0] = liveData->params.soc10ced[1] + 2.9; + liveData->params.soc10cec[0] = liveData->params.soc10cec[1] + 0.5; + liveData->params.soc10odo[0] = liveData->params.soc10odo[1] + 15; + liveData->params.soc10time[0] = liveData->params.soc10time[1] + 900; */ } diff --git a/CarInterface.cpp b/CarInterface.cpp index 0dc7540..da557df 100644 --- a/CarInterface.cpp +++ b/CarInterface.cpp @@ -5,7 +5,7 @@ #include "LiveData.h" void CarInterface::setLiveData(LiveData* pLiveData) { - this->liveData = pLiveData; + liveData = pLiveData; } void CarInterface::activateCommandQueue() { diff --git a/CarKiaDebugObd2.cpp b/CarKiaDebugObd2.cpp index e2a3f43..044f07e 100644 --- a/CarKiaDebugObd2.cpp +++ b/CarKiaDebugObd2.cpp @@ -219,18 +219,18 @@ void CarKiaDebugObd2::activateCommandQueue() { }; // 39 or 64 kWh model? - this->liveData->params.batteryTotalAvailableKWh = 64; + liveData->params.batteryTotalAvailableKWh = 64; // Empty and fill command queue for (uint16_t i = 0; i < 300; i++) { - this->liveData->commandQueue[i] = ""; + liveData->commandQueue[i] = ""; } for (uint16_t i = 0; i < commandQueueCountDebugObd2Kia; i++) { - this->liveData->commandQueue[i] = commandQueueDebugObd2Kia[i]; + liveData->commandQueue[i] = commandQueueDebugObd2Kia[i]; } - this->liveData->commandQueueLoopFrom = commandQueueLoopFromDebugObd2Kia; - this->liveData->commandQueueCount = commandQueueCountDebugObd2Kia; + liveData->commandQueueLoopFrom = commandQueueLoopFromDebugObd2Kia; + liveData->commandQueueCount = commandQueueCountDebugObd2Kia; } /** @@ -239,142 +239,142 @@ void CarKiaDebugObd2::activateCommandQueue() { void CarKiaDebugObd2::parseRowMerged() { // VMCU 7E2 - if (this->liveData->currentAtshRequest.equals("ATSH7E2")) { - if (this->liveData->commandRequest.equals("2101")) { - this->liveData->params.speedKmh = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750 - if (this->liveData->params.speedKmh < -99 || this->liveData->params.speedKmh > 200) - this->liveData->params.speedKmh = 0; + if (liveData->currentAtshRequest.equals("ATSH7E2")) { + if (liveData->commandRequest.equals("2101")) { + liveData->params.speedKmh = liveData->hexToDec(liveData->responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750 + if (liveData->params.speedKmh < -99 || liveData->params.speedKmh > 200) + liveData->params.speedKmh = 0; } - if (this->liveData->commandRequest.equals("2102")) { - this->liveData->params.auxPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(50, 52).c_str(), 1, false); - this->liveData->params.auxCurrentAmp = - this->liveData->hexToDec(this->liveData->responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0; + if (liveData->commandRequest.equals("2102")) { + liveData->params.auxPerc = liveData->hexToDec(liveData->responseRowMerged.substring(50, 52).c_str(), 1, false); + liveData->params.auxCurrentAmp = - liveData->hexToDec(liveData->responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0; } } // Cluster module 7c6 - if (this->liveData->currentAtshRequest.equals("ATSH7C6")) { - if (this->liveData->commandRequest.equals("22B002")) { - this->liveData->params.odoKm = float(strtol(this->liveData->responseRowMerged.substring(18, 24).c_str(), 0, 16)); + if (liveData->currentAtshRequest.equals("ATSH7C6")) { + if (liveData->commandRequest.equals("22B002")) { + liveData->params.odoKm = float(strtol(liveData->responseRowMerged.substring(18, 24).c_str(), 0, 16)); } } // Aircon 7b3 - if (this->liveData->currentAtshRequest.equals("ATSH7B3")) { - if (this->liveData->commandRequest.equals("220100")) { - this->liveData->params.indoorTemperature = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; - this->liveData->params.outdoorTemperature = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(18, 20).c_str(), 1, false) / 2) - 40; + if (liveData->currentAtshRequest.equals("ATSH7B3")) { + if (liveData->commandRequest.equals("220100")) { + liveData->params.indoorTemperature = (liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; + liveData->params.outdoorTemperature = (liveData->hexToDec(liveData->responseRowMerged.substring(18, 20).c_str(), 1, false) / 2) - 40; } - if (this->liveData->commandRequest.equals("220102") && this->liveData->responseRowMerged.substring(12, 14) == "00") { - this->liveData->params.coolantTemp1C = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false) / 2) - 40; - this->liveData->params.coolantTemp2C = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; + if (liveData->commandRequest.equals("220102") && liveData->responseRowMerged.substring(12, 14) == "00") { + liveData->params.coolantTemp1C = (liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false) / 2) - 40; + liveData->params.coolantTemp2C = (liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; } } // BMS 7e4 - if (this->liveData->currentAtshRequest.equals("ATSH7E4")) { - if (this->liveData->commandRequest.equals("220101")) { - this->liveData->params.cumulativeEnergyChargedKWh = float(strtol(this->liveData->responseRowMerged.substring(82, 90).c_str(), 0, 16)) / 10.0; - if (this->liveData->params.cumulativeEnergyChargedKWhStart == -1) - this->liveData->params.cumulativeEnergyChargedKWhStart = this->liveData->params.cumulativeEnergyChargedKWh; - this->liveData->params.cumulativeEnergyDischargedKWh = float(strtol(this->liveData->responseRowMerged.substring(90, 98).c_str(), 0, 16)) / 10.0; - if (this->liveData->params.cumulativeEnergyDischargedKWhStart == -1) - this->liveData->params.cumulativeEnergyDischargedKWhStart = this->liveData->params.cumulativeEnergyDischargedKWh; - this->liveData->params.auxVoltage = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(64, 66).c_str(), 2, true) / 10.0; - this->liveData->params.batPowerAmp = - this->liveData->hexToDec(this->liveData->responseRowMerged.substring(26, 30).c_str(), 2, true) / 10.0; - this->liveData->params.batVoltage = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 34).c_str(), 2, false) / 10.0; - this->liveData->params.batPowerKw = (this->liveData->params.batPowerAmp * this->liveData->params.batVoltage) / 1000.0; - this->liveData->params.batPowerKwh100 = this->liveData->params.batPowerKw / this->liveData->params.speedKmh * 100; - this->liveData->params.batCellMaxV = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(52, 54).c_str(), 1, false) / 50.0; - this->liveData->params.batCellMinV = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(56, 58).c_str(), 1, false) / 50.0; - this->liveData->params.batModuleTempC[0] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(38, 40).c_str(), 1, true); - this->liveData->params.batModuleTempC[1] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(40, 42).c_str(), 1, true); - this->liveData->params.batModuleTempC[2] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(42, 44).c_str(), 1, true); - this->liveData->params.batModuleTempC[3] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(44, 46).c_str(), 1, true); - //this->liveData->params.batTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); - //this->liveData->params.batMaxC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); - //this->liveData->params.batMinC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); + if (liveData->currentAtshRequest.equals("ATSH7E4")) { + if (liveData->commandRequest.equals("220101")) { + liveData->params.cumulativeEnergyChargedKWh = float(strtol(liveData->responseRowMerged.substring(82, 90).c_str(), 0, 16)) / 10.0; + if (liveData->params.cumulativeEnergyChargedKWhStart == -1) + liveData->params.cumulativeEnergyChargedKWhStart = liveData->params.cumulativeEnergyChargedKWh; + liveData->params.cumulativeEnergyDischargedKWh = float(strtol(liveData->responseRowMerged.substring(90, 98).c_str(), 0, 16)) / 10.0; + if (liveData->params.cumulativeEnergyDischargedKWhStart == -1) + liveData->params.cumulativeEnergyDischargedKWhStart = liveData->params.cumulativeEnergyDischargedKWh; + liveData->params.auxVoltage = liveData->hexToDec(liveData->responseRowMerged.substring(64, 66).c_str(), 2, true) / 10.0; + liveData->params.batPowerAmp = - liveData->hexToDec(liveData->responseRowMerged.substring(26, 30).c_str(), 2, true) / 10.0; + liveData->params.batVoltage = liveData->hexToDec(liveData->responseRowMerged.substring(30, 34).c_str(), 2, false) / 10.0; + liveData->params.batPowerKw = (liveData->params.batPowerAmp * liveData->params.batVoltage) / 1000.0; + liveData->params.batPowerKwh100 = liveData->params.batPowerKw / liveData->params.speedKmh * 100; + liveData->params.batCellMaxV = liveData->hexToDec(liveData->responseRowMerged.substring(52, 54).c_str(), 1, false) / 50.0; + liveData->params.batCellMinV = liveData->hexToDec(liveData->responseRowMerged.substring(56, 58).c_str(), 1, false) / 50.0; + liveData->params.batModuleTempC[0] = liveData->hexToDec(liveData->responseRowMerged.substring(38, 40).c_str(), 1, true); + liveData->params.batModuleTempC[1] = liveData->hexToDec(liveData->responseRowMerged.substring(40, 42).c_str(), 1, true); + liveData->params.batModuleTempC[2] = liveData->hexToDec(liveData->responseRowMerged.substring(42, 44).c_str(), 1, true); + liveData->params.batModuleTempC[3] = liveData->hexToDec(liveData->responseRowMerged.substring(44, 46).c_str(), 1, true); + //liveData->params.batTempC = liveData->hexToDec(liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); + //liveData->params.batMaxC = liveData->hexToDec(liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); + //liveData->params.batMinC = liveData->hexToDec(liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); // This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging) - this->liveData->params.batMinC = this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[0]; - this->liveData->params.batMinC = (this->liveData->params.batModuleTempC[1] < this->liveData->params.batMinC) ? this->liveData->params.batModuleTempC[1] : this->liveData->params.batMinC; - this->liveData->params.batMinC = (this->liveData->params.batModuleTempC[2] < this->liveData->params.batMinC) ? this->liveData->params.batModuleTempC[2] : this->liveData->params.batMinC; - this->liveData->params.batMinC = (this->liveData->params.batModuleTempC[3] < this->liveData->params.batMinC) ? this->liveData->params.batModuleTempC[3] : this->liveData->params.batMinC; - this->liveData->params.batMaxC = (this->liveData->params.batModuleTempC[1] > this->liveData->params.batMaxC) ? this->liveData->params.batModuleTempC[1] : this->liveData->params.batMaxC; - this->liveData->params.batMaxC = (this->liveData->params.batModuleTempC[2] > this->liveData->params.batMaxC) ? this->liveData->params.batModuleTempC[2] : this->liveData->params.batMaxC; - this->liveData->params.batMaxC = (this->liveData->params.batModuleTempC[3] > this->liveData->params.batMaxC) ? this->liveData->params.batModuleTempC[3] : this->liveData->params.batMaxC; - this->liveData->params.batTempC = this->liveData->params.batMinC; + liveData->params.batMinC = liveData->params.batMaxC = liveData->params.batModuleTempC[0]; + liveData->params.batMinC = (liveData->params.batModuleTempC[1] < liveData->params.batMinC) ? liveData->params.batModuleTempC[1] : liveData->params.batMinC; + liveData->params.batMinC = (liveData->params.batModuleTempC[2] < liveData->params.batMinC) ? liveData->params.batModuleTempC[2] : liveData->params.batMinC; + liveData->params.batMinC = (liveData->params.batModuleTempC[3] < liveData->params.batMinC) ? liveData->params.batModuleTempC[3] : liveData->params.batMinC; + liveData->params.batMaxC = (liveData->params.batModuleTempC[1] > liveData->params.batMaxC) ? liveData->params.batModuleTempC[1] : liveData->params.batMaxC; + liveData->params.batMaxC = (liveData->params.batModuleTempC[2] > liveData->params.batMaxC) ? liveData->params.batModuleTempC[2] : liveData->params.batMaxC; + liveData->params.batMaxC = (liveData->params.batModuleTempC[3] > liveData->params.batMaxC) ? liveData->params.batModuleTempC[3] : liveData->params.batMaxC; + liveData->params.batTempC = liveData->params.batMinC; - this->liveData->params.batInletC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(50, 52).c_str(), 1, true); - if (this->liveData->params.speedKmh < 10 && this->liveData->params.batPowerKw >= 1 && this->liveData->params.socPerc > 0 && this->liveData->params.socPerc <= 100) { - if ( this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)] == -100 || this->liveData->params.batPowerKw < this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)]) - this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)] = this->liveData->params.batPowerKw; - if ( this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)] == -100 || this->liveData->params.batPowerKw > this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)]) - this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)] = this->liveData->params.batPowerKw; - this->liveData->params.chargingGraphBatMinTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batMinC; - this->liveData->params.chargingGraphBatMaxTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batMaxC; - this->liveData->params.chargingGraphHeaterTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batHeaterC; + liveData->params.batInletC = liveData->hexToDec(liveData->responseRowMerged.substring(50, 52).c_str(), 1, true); + if (liveData->params.speedKmh < 10 && liveData->params.batPowerKw >= 1 && liveData->params.socPerc > 0 && liveData->params.socPerc <= 100) { + if ( liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)] == -100 || liveData->params.batPowerKw < liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)]) + liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)] = liveData->params.batPowerKw; + if ( liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)] == -100 || liveData->params.batPowerKw > liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)]) + liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)] = liveData->params.batPowerKw; + liveData->params.chargingGraphBatMinTempC[int(liveData->params.socPerc)] = liveData->params.batMinC; + liveData->params.chargingGraphBatMaxTempC[int(liveData->params.socPerc)] = liveData->params.batMaxC; + liveData->params.chargingGraphHeaterTempC[int(liveData->params.socPerc)] = liveData->params.batHeaterC; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220102") && this->liveData->responseRowMerged.substring(12, 14) == "FF") { + if (liveData->commandRequest.equals("220102") && liveData->responseRowMerged.substring(12, 14) == "FF") { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220103")) { + if (liveData->commandRequest.equals("220103")) { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[32 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[32 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220104")) { + if (liveData->commandRequest.equals("220104")) { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[64 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[64 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220105")) { - this->liveData->params.socPercPrevious = this->liveData->params.socPerc; - this->liveData->params.sohPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(56, 60).c_str(), 2, false) / 10.0; - this->liveData->params.socPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(68, 70).c_str(), 1, false) / 2.0; + if (liveData->commandRequest.equals("220105")) { + liveData->params.socPercPrevious = liveData->params.socPerc; + liveData->params.sohPerc = liveData->hexToDec(liveData->responseRowMerged.substring(56, 60).c_str(), 2, false) / 10.0; + liveData->params.socPerc = liveData->hexToDec(liveData->responseRowMerged.substring(68, 70).c_str(), 1, false) / 2.0; // Soc10ced table, record x0% CEC/CED table (ex. 90%->89%, 80%->79%) - if (this->liveData->params.socPercPrevious - this->liveData->params.socPerc > 0) { - byte index = (int(this->liveData->params.socPerc) == 4) ? 0 : (int)(this->liveData->params.socPerc / 10) + 1; - if ((int(this->liveData->params.socPerc) % 10 == 9 || int(this->liveData->params.socPerc) == 4) && this->liveData->params.soc10ced[index] == -1) { + if (liveData->params.socPercPrevious - liveData->params.socPerc > 0) { + byte index = (int(liveData->params.socPerc) == 4) ? 0 : (int)(liveData->params.socPerc / 10) + 1; + if ((int(liveData->params.socPerc) % 10 == 9 || int(liveData->params.socPerc) == 4) && liveData->params.soc10ced[index] == -1) { struct tm now; getLocalTime(&now, 0); time_t time_now_epoch = mktime(&now); - this->liveData->params.soc10ced[index] = this->liveData->params.cumulativeEnergyDischargedKWh; - this->liveData->params.soc10cec[index] = this->liveData->params.cumulativeEnergyChargedKWh; - this->liveData->params.soc10odo[index] = this->liveData->params.odoKm; - this->liveData->params.soc10time[index] = time_now_epoch; + liveData->params.soc10ced[index] = liveData->params.cumulativeEnergyDischargedKWh; + liveData->params.soc10cec[index] = liveData->params.cumulativeEnergyChargedKWh; + liveData->params.soc10odo[index] = liveData->params.odoKm; + liveData->params.soc10time[index] = time_now_epoch; } } - this->liveData->params.batHeaterC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(52, 54).c_str(), 1, true); + liveData->params.batHeaterC = liveData->hexToDec(liveData->responseRowMerged.substring(52, 54).c_str(), 1, true); // for (int i = 30; i < 32; i++) { // ai/aj position - this->liveData->params.cellVoltage[96 - 30 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[96 - 30 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220106")) { - this->liveData->params.coolingWaterTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); + if (liveData->commandRequest.equals("220106")) { + liveData->params.coolingWaterTempC = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); } } // TPMS 7a0 - if (this->liveData->currentAtshRequest.equals("ATSH7A0")) { - if (this->liveData->commandRequest.equals("22c00b")) { - this->liveData->params.tireFrontLeftPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireFrontRightPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(22, 24).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireRearRightPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 32).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireRearLeftPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(38, 40).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireFrontLeftTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireFrontRightTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(24, 26).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireRearRightTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 34).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireRearLeftTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(40, 42).c_str(), 2, false) - 50; // === OK Valid + if (liveData->currentAtshRequest.equals("ATSH7A0")) { + if (liveData->commandRequest.equals("22c00b")) { + liveData->params.tireFrontLeftPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireFrontRightPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(22, 24).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireRearRightPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(30, 32).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireRearLeftPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(38, 40).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireFrontLeftTempC = liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireFrontRightTempC = liveData->hexToDec(liveData->responseRowMerged.substring(24, 26).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireRearRightTempC = liveData->hexToDec(liveData->responseRowMerged.substring(32, 34).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireRearLeftTempC = liveData->hexToDec(liveData->responseRowMerged.substring(40, 42).c_str(), 2, false) - 50; // === OK Valid } } @@ -386,134 +386,134 @@ void CarKiaDebugObd2::parseRowMerged() { void CarKiaDebugObd2::loadTestData() { // VMCU ATSH7E2 - this->liveData->currentAtshRequest = "ATSH7E2"; + liveData->currentAtshRequest = "ATSH7E2"; // 2101 - this->liveData->commandRequest = "2101"; - this->liveData->responseRowMerged = "6101FFF8000009285A3B0648030000B4179D763404080805000000"; - this->parseRowMerged(); + liveData->commandRequest = "2101"; + liveData->responseRowMerged = "6101FFF8000009285A3B0648030000B4179D763404080805000000"; + parseRowMerged(); // 2102 - this->liveData->commandRequest = "2102"; - this->liveData->responseRowMerged = "6102F8FFFC000101000000840FBF83BD33270680953033757F59291C76000001010100000007000000"; - this->liveData->responseRowMerged = "6102F8FFFC000101000000931CC77F4C39040BE09BA7385D8158832175000001010100000007000000"; - this->parseRowMerged(); + liveData->commandRequest = "2102"; + liveData->responseRowMerged = "6102F8FFFC000101000000840FBF83BD33270680953033757F59291C76000001010100000007000000"; + liveData->responseRowMerged = "6102F8FFFC000101000000931CC77F4C39040BE09BA7385D8158832175000001010100000007000000"; + parseRowMerged(); // "ATSH7DF", - this->liveData->currentAtshRequest = "ATSH7DF"; + liveData->currentAtshRequest = "ATSH7DF"; // 2106 - this->liveData->commandRequest = "2106"; - this->liveData->responseRowMerged = "6106FFFF800000000000000200001B001C001C000600060006000E000000010000000000000000013D013D013E013E00"; - this->parseRowMerged(); + liveData->commandRequest = "2106"; + liveData->responseRowMerged = "6106FFFF800000000000000200001B001C001C000600060006000E000000010000000000000000013D013D013E013E00"; + parseRowMerged(); // AIRCON / ACU ATSH7B3 - this->liveData->currentAtshRequest = "ATSH7B3"; + liveData->currentAtshRequest = "ATSH7B3"; // 220100 - this->liveData->commandRequest = "220100"; - this->liveData->responseRowMerged = "6201007E5027C8FF7F765D05B95AFFFF5AFF11FFFFFFFFFFFF6AFFFF2DF0757630FFFF00FFFF000000"; - this->liveData->responseRowMerged = "6201007E5027C8FF867C58121010FFFF10FF8EFFFFFFFFFFFF10FFFF0DF0617900FFFF01FFFF000000"; - this->parseRowMerged(); + liveData->commandRequest = "220100"; + liveData->responseRowMerged = "6201007E5027C8FF7F765D05B95AFFFF5AFF11FFFFFFFFFFFF6AFFFF2DF0757630FFFF00FFFF000000"; + liveData->responseRowMerged = "6201007E5027C8FF867C58121010FFFF10FF8EFFFFFFFFFFFF10FFFF0DF0617900FFFF01FFFF000000"; + parseRowMerged(); // BMS ATSH7E4 - this->liveData->currentAtshRequest = "ATSH7E4"; + liveData->currentAtshRequest = "ATSH7E4"; // 220101 - this->liveData->commandRequest = "220101"; - this->liveData->responseRowMerged = "620101FFF7E7FF99000000000300B10EFE120F11100F12000018C438C30B00008400003864000035850000153A00001374000647010D017F0BDA0BDA03E8"; - this->liveData->responseRowMerged = "620101FFF7E7FFB3000000000300120F9B111011101011000014CC38CB3B00009100003A510000367C000015FB000013D3000690250D018E0000000003E8"; - this->parseRowMerged(); + liveData->commandRequest = "220101"; + liveData->responseRowMerged = "620101FFF7E7FF99000000000300B10EFE120F11100F12000018C438C30B00008400003864000035850000153A00001374000647010D017F0BDA0BDA03E8"; + liveData->responseRowMerged = "620101FFF7E7FFB3000000000300120F9B111011101011000014CC38CB3B00009100003A510000367C000015FB000013D3000690250D018E0000000003E8"; + parseRowMerged(); // 220102 - this->liveData->commandRequest = "220102"; - this->liveData->responseRowMerged = "620102FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220102"; + liveData->responseRowMerged = "620102FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; + parseRowMerged(); // 220103 - this->liveData->commandRequest = "220103"; - this->liveData->responseRowMerged = "620103FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACBCACACFCCCBCBCBCBCBCBCBCBAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220103"; + liveData->responseRowMerged = "620103FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACBCACACFCCCBCBCBCBCBCBCBCBAAAA"; + parseRowMerged(); // 220104 - this->liveData->commandRequest = "220104"; - this->liveData->responseRowMerged = "620104FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220104"; + liveData->responseRowMerged = "620104FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; + parseRowMerged(); // 220105 - this->liveData->commandRequest = "220105"; - this->liveData->responseRowMerged = "620105003fff9000000000000000000F8A86012B4946500101500DAC03E800000000AC0000C7C701000F00000000AAAA"; - this->liveData->responseRowMerged = "620105003FFF90000000000000000014918E012927465000015013BB03E800000000BB0000CBCB01001300000000AAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220105"; + liveData->responseRowMerged = "620105003fff9000000000000000000F8A86012B4946500101500DAC03E800000000AC0000C7C701000F00000000AAAA"; + liveData->responseRowMerged = "620105003FFF90000000000000000014918E012927465000015013BB03E800000000BB0000CBCB01001300000000AAAA"; + parseRowMerged(); // 220106 - this->liveData->commandRequest = "220106"; - this->liveData->responseRowMerged = "620106FFFFFFFF14001A00240000003A7C86B4B30000000928EA00"; - this->parseRowMerged(); + liveData->commandRequest = "220106"; + liveData->responseRowMerged = "620106FFFFFFFF14001A00240000003A7C86B4B30000000928EA00"; + parseRowMerged(); // BCM / TPMS ATSH7A0 - this->liveData->currentAtshRequest = "ATSH7A0"; + liveData->currentAtshRequest = "ATSH7A0"; // 22c00b - this->liveData->commandRequest = "22c00b"; - this->liveData->responseRowMerged = "62C00BFFFF0000B93D0100B43E0100B43D0100BB3C0100AAAAAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "22c00b"; + liveData->responseRowMerged = "62C00BFFFF0000B93D0100B43E0100B43D0100BB3C0100AAAAAAAA"; + parseRowMerged(); // ATSH7C6 - this->liveData->currentAtshRequest = "ATSH7C6"; + liveData->currentAtshRequest = "ATSH7C6"; // 22b002 - this->liveData->commandRequest = "22b002"; - this->liveData->responseRowMerged = "62B002E0000000FFB400330B0000000000000000"; - this->parseRowMerged(); + liveData->commandRequest = "22b002"; + liveData->responseRowMerged = "62B002E0000000FFB400330B0000000000000000"; + parseRowMerged(); - this->liveData->params.batModuleTempC[0] = 28; - this->liveData->params.batModuleTempC[1] = 29; - this->liveData->params.batModuleTempC[2] = 28; - this->liveData->params.batModuleTempC[3] = 30; + liveData->params.batModuleTempC[0] = 28; + liveData->params.batModuleTempC[1] = 29; + liveData->params.batModuleTempC[2] = 28; + liveData->params.batModuleTempC[3] = 30; // This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging) - this->liveData->params.batMinC = this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[0]; - for (uint16_t i = 1; i < this->liveData->params.batModuleTempCount; i++) { - if (this->liveData->params.batModuleTempC[i] < this->liveData->params.batMinC) - this->liveData->params.batMinC = this->liveData->params.batModuleTempC[i]; - if (this->liveData->params.batModuleTempC[i] > this->liveData->params.batMaxC) - this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[i]; + liveData->params.batMinC = liveData->params.batMaxC = liveData->params.batModuleTempC[0]; + for (uint16_t i = 1; i < liveData->params.batModuleTempCount; i++) { + if (liveData->params.batModuleTempC[i] < liveData->params.batMinC) + liveData->params.batMinC = liveData->params.batModuleTempC[i]; + if (liveData->params.batModuleTempC[i] > liveData->params.batMaxC) + liveData->params.batMaxC = liveData->params.batModuleTempC[i]; } - this->liveData->params.batTempC = this->liveData->params.batMinC; + liveData->params.batTempC = liveData->params.batMinC; // - this->liveData->params.soc10ced[10] = 2200; - this->liveData->params.soc10cec[10] = 2500; - this->liveData->params.soc10odo[10] = 13000; - this->liveData->params.soc10time[10] = 13000; - this->liveData->params.soc10ced[9] = this->liveData->params.soc10ced[10] + 6.4; - this->liveData->params.soc10cec[9] = this->liveData->params.soc10cec[10] + 0; - this->liveData->params.soc10odo[9] = this->liveData->params.soc10odo[10] + 30; - this->liveData->params.soc10time[9] = this->liveData->params.soc10time[10] + 900; - this->liveData->params.soc10ced[8] = this->liveData->params.soc10ced[9] + 6.8; - this->liveData->params.soc10cec[8] = this->liveData->params.soc10cec[9] + 0; - this->liveData->params.soc10odo[8] = this->liveData->params.soc10odo[9] + 30; - this->liveData->params.soc10time[8] = this->liveData->params.soc10time[9] + 900; - this->liveData->params.soc10ced[7] = this->liveData->params.soc10ced[8] + 7.2; - this->liveData->params.soc10cec[7] = this->liveData->params.soc10cec[8] + 0.6; - this->liveData->params.soc10odo[7] = this->liveData->params.soc10odo[8] + 30; - this->liveData->params.soc10time[7] = this->liveData->params.soc10time[8] + 900; - this->liveData->params.soc10ced[6] = this->liveData->params.soc10ced[7] + 6.7; - this->liveData->params.soc10cec[6] = this->liveData->params.soc10cec[7] + 0; - this->liveData->params.soc10odo[6] = this->liveData->params.soc10odo[7] + 30; - this->liveData->params.soc10time[6] = this->liveData->params.soc10time[7] + 900; - this->liveData->params.soc10ced[5] = this->liveData->params.soc10ced[6] + 6.7; - this->liveData->params.soc10cec[5] = this->liveData->params.soc10cec[6] + 0; - this->liveData->params.soc10odo[5] = this->liveData->params.soc10odo[6] + 30; - this->liveData->params.soc10time[5] = this->liveData->params.soc10time[6] + 900; - this->liveData->params.soc10ced[4] = this->liveData->params.soc10ced[5] + 6.4; - this->liveData->params.soc10cec[4] = this->liveData->params.soc10cec[5] + 0.3; - this->liveData->params.soc10odo[4] = this->liveData->params.soc10odo[5] + 30; - this->liveData->params.soc10time[4] = this->liveData->params.soc10time[5] + 900; - this->liveData->params.soc10ced[3] = this->liveData->params.soc10ced[4] + 6.4; - this->liveData->params.soc10cec[3] = this->liveData->params.soc10cec[4] + 0; - this->liveData->params.soc10odo[3] = this->liveData->params.soc10odo[4] + 30; - this->liveData->params.soc10time[3] = this->liveData->params.soc10time[4] + 900; - this->liveData->params.soc10ced[2] = this->liveData->params.soc10ced[3] + 5.4; - this->liveData->params.soc10cec[2] = this->liveData->params.soc10cec[3] + 0.1; - this->liveData->params.soc10odo[2] = this->liveData->params.soc10odo[3] + 30; - this->liveData->params.soc10time[2] = this->liveData->params.soc10time[3] + 900; - this->liveData->params.soc10ced[1] = this->liveData->params.soc10ced[2] + 6.2; - this->liveData->params.soc10cec[1] = this->liveData->params.soc10cec[2] + 0.1; - this->liveData->params.soc10odo[1] = this->liveData->params.soc10odo[2] + 30; - this->liveData->params.soc10time[1] = this->liveData->params.soc10time[2] + 900; - this->liveData->params.soc10ced[0] = this->liveData->params.soc10ced[1] + 2.9; - this->liveData->params.soc10cec[0] = this->liveData->params.soc10cec[1] + 0.5; - this->liveData->params.soc10odo[0] = this->liveData->params.soc10odo[1] + 15; - this->liveData->params.soc10time[0] = this->liveData->params.soc10time[1] + 900; + liveData->params.soc10ced[10] = 2200; + liveData->params.soc10cec[10] = 2500; + liveData->params.soc10odo[10] = 13000; + liveData->params.soc10time[10] = 13000; + liveData->params.soc10ced[9] = liveData->params.soc10ced[10] + 6.4; + liveData->params.soc10cec[9] = liveData->params.soc10cec[10] + 0; + liveData->params.soc10odo[9] = liveData->params.soc10odo[10] + 30; + liveData->params.soc10time[9] = liveData->params.soc10time[10] + 900; + liveData->params.soc10ced[8] = liveData->params.soc10ced[9] + 6.8; + liveData->params.soc10cec[8] = liveData->params.soc10cec[9] + 0; + liveData->params.soc10odo[8] = liveData->params.soc10odo[9] + 30; + liveData->params.soc10time[8] = liveData->params.soc10time[9] + 900; + liveData->params.soc10ced[7] = liveData->params.soc10ced[8] + 7.2; + liveData->params.soc10cec[7] = liveData->params.soc10cec[8] + 0.6; + liveData->params.soc10odo[7] = liveData->params.soc10odo[8] + 30; + liveData->params.soc10time[7] = liveData->params.soc10time[8] + 900; + liveData->params.soc10ced[6] = liveData->params.soc10ced[7] + 6.7; + liveData->params.soc10cec[6] = liveData->params.soc10cec[7] + 0; + liveData->params.soc10odo[6] = liveData->params.soc10odo[7] + 30; + liveData->params.soc10time[6] = liveData->params.soc10time[7] + 900; + liveData->params.soc10ced[5] = liveData->params.soc10ced[6] + 6.7; + liveData->params.soc10cec[5] = liveData->params.soc10cec[6] + 0; + liveData->params.soc10odo[5] = liveData->params.soc10odo[6] + 30; + liveData->params.soc10time[5] = liveData->params.soc10time[6] + 900; + liveData->params.soc10ced[4] = liveData->params.soc10ced[5] + 6.4; + liveData->params.soc10cec[4] = liveData->params.soc10cec[5] + 0.3; + liveData->params.soc10odo[4] = liveData->params.soc10odo[5] + 30; + liveData->params.soc10time[4] = liveData->params.soc10time[5] + 900; + liveData->params.soc10ced[3] = liveData->params.soc10ced[4] + 6.4; + liveData->params.soc10cec[3] = liveData->params.soc10cec[4] + 0; + liveData->params.soc10odo[3] = liveData->params.soc10odo[4] + 30; + liveData->params.soc10time[3] = liveData->params.soc10time[4] + 900; + liveData->params.soc10ced[2] = liveData->params.soc10ced[3] + 5.4; + liveData->params.soc10cec[2] = liveData->params.soc10cec[3] + 0.1; + liveData->params.soc10odo[2] = liveData->params.soc10odo[3] + 30; + liveData->params.soc10time[2] = liveData->params.soc10time[3] + 900; + liveData->params.soc10ced[1] = liveData->params.soc10ced[2] + 6.2; + liveData->params.soc10cec[1] = liveData->params.soc10cec[2] + 0.1; + liveData->params.soc10odo[1] = liveData->params.soc10odo[2] + 30; + liveData->params.soc10time[1] = liveData->params.soc10time[2] + 900; + liveData->params.soc10ced[0] = liveData->params.soc10ced[1] + 2.9; + liveData->params.soc10cec[0] = liveData->params.soc10cec[1] + 0.5; + liveData->params.soc10odo[0] = liveData->params.soc10odo[1] + 15; + liveData->params.soc10time[0] = liveData->params.soc10time[1] + 900; } diff --git a/CarKiaEniro.cpp b/CarKiaEniro.cpp index fc7e604..feb59ba 100644 --- a/CarKiaEniro.cpp +++ b/CarKiaEniro.cpp @@ -84,23 +84,23 @@ void CarKiaEniro::activateCommandQueue() { }; // 39 or 64 kWh model? - this->liveData->params.batModuleTempCount = 4; - this->liveData->params.batteryTotalAvailableKWh = 64; + liveData->params.batModuleTempCount = 4; + liveData->params.batteryTotalAvailableKWh = 64; // =(I18*0,615)*(1+(I18*0,0008)) soc to kwh niro ev 2020 - if (this->liveData->settings.carType == CAR_KIA_ENIRO_2020_39 || this->liveData->settings.carType == CAR_HYUNDAI_KONA_2020_39) { - this->liveData->params.batteryTotalAvailableKWh = 39.2; + if (liveData->settings.carType == CAR_KIA_ENIRO_2020_39 || liveData->settings.carType == CAR_HYUNDAI_KONA_2020_39) { + liveData->params.batteryTotalAvailableKWh = 39.2; } // Empty and fill command queue for (int i = 0; i < 300; i++) { - this->liveData->commandQueue[i] = ""; + liveData->commandQueue[i] = ""; } for (int i = 0; i < commandQueueCountKiaENiro; i++) { - this->liveData->commandQueue[i] = commandQueueKiaENiro[i]; + liveData->commandQueue[i] = commandQueueKiaENiro[i]; } - this->liveData->commandQueueLoopFrom = commandQueueLoopFromKiaENiro; - this->liveData->commandQueueCount = commandQueueCountKiaENiro; + liveData->commandQueueLoopFrom = commandQueueLoopFromKiaENiro; + liveData->commandQueueCount = commandQueueCountKiaENiro; } /** @@ -111,181 +111,181 @@ void CarKiaEniro::parseRowMerged() { bool tempByte; // ABS / ESP + AHB 7D1 - if (this->liveData->currentAtshRequest.equals("ATSH7D1")) { - if (this->liveData->commandRequest.equals("22C101")) { - uint8_t driveMode = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(22, 24).c_str(), 1, false); - this->liveData->params.forwardDriveMode = (driveMode == 4); - this->liveData->params.reverseDriveMode = (driveMode == 2); - this->liveData->params.parkModeOrNeutral = (driveMode == 1); + if (liveData->currentAtshRequest.equals("ATSH7D1")) { + if (liveData->commandRequest.equals("22C101")) { + uint8_t driveMode = liveData->hexToDec(liveData->responseRowMerged.substring(22, 24).c_str(), 1, false); + liveData->params.forwardDriveMode = (driveMode == 4); + liveData->params.reverseDriveMode = (driveMode == 2); + liveData->params.parkModeOrNeutral = (driveMode == 1); } } // IGPM - if (this->liveData->currentAtshRequest.equals("ATSH770")) { - if (this->liveData->commandRequest.equals("22BC03")) { - tempByte = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false); - this->liveData->params.ignitionOnPrevious = this->liveData->params.ignitionOn; - this->liveData->params.ignitionOn = (bitRead(tempByte, 5) == 1); - if (this->liveData->params.ignitionOnPrevious && !this->liveData->params.ignitionOn) - this->liveData->params.automaticShutdownTimer = this->liveData->params.currentTime; + if (liveData->currentAtshRequest.equals("ATSH770")) { + if (liveData->commandRequest.equals("22BC03")) { + tempByte = liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false); + liveData->params.ignitionOnPrevious = liveData->params.ignitionOn; + liveData->params.ignitionOn = (bitRead(tempByte, 5) == 1); + if (liveData->params.ignitionOnPrevious && !liveData->params.ignitionOn) + liveData->params.automaticShutdownTimer = liveData->params.currentTime; - this->liveData->params.lightInfo = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(18, 20).c_str(), 1, false); - this->liveData->params.headLights = (bitRead(this->liveData->params.lightInfo, 5) == 1); - this->liveData->params.dayLights = (bitRead(this->liveData->params.lightInfo, 3) == 1); + liveData->params.lightInfo = liveData->hexToDec(liveData->responseRowMerged.substring(18, 20).c_str(), 1, false); + liveData->params.headLights = (bitRead(liveData->params.lightInfo, 5) == 1); + liveData->params.dayLights = (bitRead(liveData->params.lightInfo, 3) == 1); } - if (this->liveData->commandRequest.equals("22BC06")) { - this->liveData->params.brakeLightInfo = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); - this->liveData->params.brakeLights = (bitRead(this->liveData->params.brakeLightInfo, 5) == 1); + if (liveData->commandRequest.equals("22BC06")) { + liveData->params.brakeLightInfo = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); + liveData->params.brakeLights = (bitRead(liveData->params.brakeLightInfo, 5) == 1); } } // VMCU 7E2 - if (this->liveData->currentAtshRequest.equals("ATSH7E2")) { - if (this->liveData->commandRequest.equals("2101")) { - this->liveData->params.speedKmh = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750 - if (this->liveData->params.speedKmh < -99 || this->liveData->params.speedKmh > 200) - this->liveData->params.speedKmh = 0; + if (liveData->currentAtshRequest.equals("ATSH7E2")) { + if (liveData->commandRequest.equals("2101")) { + liveData->params.speedKmh = liveData->hexToDec(liveData->responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750 + if (liveData->params.speedKmh < -99 || liveData->params.speedKmh > 200) + liveData->params.speedKmh = 0; } - if (this->liveData->commandRequest.equals("2102")) { - this->liveData->params.auxPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(50, 52).c_str(), 1, false); - this->liveData->params.auxCurrentAmp = - this->liveData->hexToDec(this->liveData->responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0; + if (liveData->commandRequest.equals("2102")) { + liveData->params.auxPerc = liveData->hexToDec(liveData->responseRowMerged.substring(50, 52).c_str(), 1, false); + liveData->params.auxCurrentAmp = - liveData->hexToDec(liveData->responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0; } } // Cluster module 7c6 - if (this->liveData->currentAtshRequest.equals("ATSH7C6")) { - if (this->liveData->commandRequest.equals("22B002")) { - this->liveData->params.odoKm = float(strtol(this->liveData->responseRowMerged.substring(18, 24).c_str(), 0, 16)); + if (liveData->currentAtshRequest.equals("ATSH7C6")) { + if (liveData->commandRequest.equals("22B002")) { + liveData->params.odoKm = float(strtol(liveData->responseRowMerged.substring(18, 24).c_str(), 0, 16)); } } // Aircon 7b3 - if (this->liveData->currentAtshRequest.equals("ATSH7B3")) { - if (this->liveData->commandRequest.equals("220100")) { - this->liveData->params.indoorTemperature = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; - this->liveData->params.outdoorTemperature = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(18, 20).c_str(), 1, false) / 2) - 40; + if (liveData->currentAtshRequest.equals("ATSH7B3")) { + if (liveData->commandRequest.equals("220100")) { + liveData->params.indoorTemperature = (liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; + liveData->params.outdoorTemperature = (liveData->hexToDec(liveData->responseRowMerged.substring(18, 20).c_str(), 1, false) / 2) - 40; } - if (this->liveData->commandRequest.equals("220102") && this->liveData->responseRowMerged.substring(12, 14) == "00") { - this->liveData->params.coolantTemp1C = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false) / 2) - 40; - this->liveData->params.coolantTemp2C = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; + if (liveData->commandRequest.equals("220102") && liveData->responseRowMerged.substring(12, 14) == "00") { + liveData->params.coolantTemp1C = (liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false) / 2) - 40; + liveData->params.coolantTemp2C = (liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; } } // BMS 7e4 - if (this->liveData->currentAtshRequest.equals("ATSH7E4")) { - if (this->liveData->commandRequest.equals("220101")) { - this->liveData->params.cumulativeEnergyChargedKWh = float(strtol(this->liveData->responseRowMerged.substring(82, 90).c_str(), 0, 16)) / 10.0; - if (this->liveData->params.cumulativeEnergyChargedKWhStart == -1) - this->liveData->params.cumulativeEnergyChargedKWhStart = this->liveData->params.cumulativeEnergyChargedKWh; - this->liveData->params.cumulativeEnergyDischargedKWh = float(strtol(this->liveData->responseRowMerged.substring(90, 98).c_str(), 0, 16)) / 10.0; - if (this->liveData->params.cumulativeEnergyDischargedKWhStart == -1) - this->liveData->params.cumulativeEnergyDischargedKWhStart = this->liveData->params.cumulativeEnergyDischargedKWh; - this->liveData->params.availableChargePower = float(strtol(this->liveData->responseRowMerged.substring(16, 20).c_str(), 0, 16)) / 100.0; - this->liveData->params.availableDischargePower = float(strtol(this->liveData->responseRowMerged.substring(20, 24).c_str(), 0, 16)) / 100.0; - //this->liveData->params.isolationResistanceKOhm = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(118, 122).c_str(), 2, true); - this->liveData->params.batFanStatus = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(60, 62).c_str(), 2, true); - this->liveData->params.batFanFeedbackHz = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(62, 64).c_str(), 2, true); - this->liveData->params.auxVoltage = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(64, 66).c_str(), 2, true) / 10.0; - this->liveData->params.batPowerAmp = - this->liveData->hexToDec(this->liveData->responseRowMerged.substring(26, 30).c_str(), 2, true) / 10.0; - this->liveData->params.batVoltage = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 34).c_str(), 2, false) / 10.0; - this->liveData->params.batPowerKw = (this->liveData->params.batPowerAmp * this->liveData->params.batVoltage) / 1000.0; - if (this->liveData->params.batPowerKw < 0) // Reset charging start time - this->liveData->params.chargingStartTime = this->liveData->params.currentTime; - this->liveData->params.batPowerKwh100 = this->liveData->params.batPowerKw / this->liveData->params.speedKmh * 100; - this->liveData->params.batCellMaxV = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(52, 54).c_str(), 1, false) / 50.0; - this->liveData->params.batCellMinV = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(56, 58).c_str(), 1, false) / 50.0; - this->liveData->params.batModuleTempC[0] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(38, 40).c_str(), 1, true); - this->liveData->params.batModuleTempC[1] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(40, 42).c_str(), 1, true); - this->liveData->params.batModuleTempC[2] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(42, 44).c_str(), 1, true); - this->liveData->params.batModuleTempC[3] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(44, 46).c_str(), 1, true); - this->liveData->params.motorRpm = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(112, 116).c_str(), 2, false); - //this->liveData->params.batTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); - //this->liveData->params.batMaxC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); - //this->liveData->params.batMinC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); + if (liveData->currentAtshRequest.equals("ATSH7E4")) { + if (liveData->commandRequest.equals("220101")) { + liveData->params.cumulativeEnergyChargedKWh = float(strtol(liveData->responseRowMerged.substring(82, 90).c_str(), 0, 16)) / 10.0; + if (liveData->params.cumulativeEnergyChargedKWhStart == -1) + liveData->params.cumulativeEnergyChargedKWhStart = liveData->params.cumulativeEnergyChargedKWh; + liveData->params.cumulativeEnergyDischargedKWh = float(strtol(liveData->responseRowMerged.substring(90, 98).c_str(), 0, 16)) / 10.0; + if (liveData->params.cumulativeEnergyDischargedKWhStart == -1) + liveData->params.cumulativeEnergyDischargedKWhStart = liveData->params.cumulativeEnergyDischargedKWh; + liveData->params.availableChargePower = float(strtol(liveData->responseRowMerged.substring(16, 20).c_str(), 0, 16)) / 100.0; + liveData->params.availableDischargePower = float(strtol(liveData->responseRowMerged.substring(20, 24).c_str(), 0, 16)) / 100.0; + //liveData->params.isolationResistanceKOhm = liveData->hexToDec(liveData->responseRowMerged.substring(118, 122).c_str(), 2, true); + liveData->params.batFanStatus = liveData->hexToDec(liveData->responseRowMerged.substring(60, 62).c_str(), 2, true); + liveData->params.batFanFeedbackHz = liveData->hexToDec(liveData->responseRowMerged.substring(62, 64).c_str(), 2, true); + liveData->params.auxVoltage = liveData->hexToDec(liveData->responseRowMerged.substring(64, 66).c_str(), 2, true) / 10.0; + liveData->params.batPowerAmp = - liveData->hexToDec(liveData->responseRowMerged.substring(26, 30).c_str(), 2, true) / 10.0; + liveData->params.batVoltage = liveData->hexToDec(liveData->responseRowMerged.substring(30, 34).c_str(), 2, false) / 10.0; + liveData->params.batPowerKw = (liveData->params.batPowerAmp * liveData->params.batVoltage) / 1000.0; + if (liveData->params.batPowerKw < 0) // Reset charging start time + liveData->params.chargingStartTime = liveData->params.currentTime; + liveData->params.batPowerKwh100 = liveData->params.batPowerKw / liveData->params.speedKmh * 100; + liveData->params.batCellMaxV = liveData->hexToDec(liveData->responseRowMerged.substring(52, 54).c_str(), 1, false) / 50.0; + liveData->params.batCellMinV = liveData->hexToDec(liveData->responseRowMerged.substring(56, 58).c_str(), 1, false) / 50.0; + liveData->params.batModuleTempC[0] = liveData->hexToDec(liveData->responseRowMerged.substring(38, 40).c_str(), 1, true); + liveData->params.batModuleTempC[1] = liveData->hexToDec(liveData->responseRowMerged.substring(40, 42).c_str(), 1, true); + liveData->params.batModuleTempC[2] = liveData->hexToDec(liveData->responseRowMerged.substring(42, 44).c_str(), 1, true); + liveData->params.batModuleTempC[3] = liveData->hexToDec(liveData->responseRowMerged.substring(44, 46).c_str(), 1, true); + liveData->params.motorRpm = liveData->hexToDec(liveData->responseRowMerged.substring(112, 116).c_str(), 2, false); + //liveData->params.batTempC = liveData->hexToDec(liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); + //liveData->params.batMaxC = liveData->hexToDec(liveData->responseRowMerged.substring(34, 36).c_str(), 1, true); + //liveData->params.batMinC = liveData->hexToDec(liveData->responseRowMerged.substring(36, 38).c_str(), 1, true); // This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging) - this->liveData->params.batMinC = this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[0]; - for (uint16_t i = 1; i < this->liveData->params.batModuleTempCount; i++) { - if (this->liveData->params.batModuleTempC[i] < this->liveData->params.batMinC) - this->liveData->params.batMinC = this->liveData->params.batModuleTempC[i]; - if (this->liveData->params.batModuleTempC[i] > this->liveData->params.batMaxC) - this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[i]; + liveData->params.batMinC = liveData->params.batMaxC = liveData->params.batModuleTempC[0]; + for (uint16_t i = 1; i < liveData->params.batModuleTempCount; i++) { + if (liveData->params.batModuleTempC[i] < liveData->params.batMinC) + liveData->params.batMinC = liveData->params.batModuleTempC[i]; + if (liveData->params.batModuleTempC[i] > liveData->params.batMaxC) + liveData->params.batMaxC = liveData->params.batModuleTempC[i]; } - this->liveData->params.batTempC = this->liveData->params.batMinC; + liveData->params.batTempC = liveData->params.batMinC; - this->liveData->params.batInletC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(50, 52).c_str(), 1, true); - if (this->liveData->params.speedKmh < 10 && this->liveData->params.batPowerKw >= 1 && this->liveData->params.socPerc > 0 && this->liveData->params.socPerc <= 100) { - if ( this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)] < 0 || this->liveData->params.batPowerKw < this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)]) - this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)] = this->liveData->params.batPowerKw; - if ( this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)] < 0 || this->liveData->params.batPowerKw > this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)]) - this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)] = this->liveData->params.batPowerKw; - this->liveData->params.chargingGraphBatMinTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batMinC; - this->liveData->params.chargingGraphBatMaxTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batMaxC; - this->liveData->params.chargingGraphHeaterTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batHeaterC; - this->liveData->params.chargingGraphWaterCoolantTempC[int(this->liveData->params.socPerc)] = this->liveData->params.coolingWaterTempC; + liveData->params.batInletC = liveData->hexToDec(liveData->responseRowMerged.substring(50, 52).c_str(), 1, true); + if (liveData->params.speedKmh < 10 && liveData->params.batPowerKw >= 1 && liveData->params.socPerc > 0 && liveData->params.socPerc <= 100) { + if ( liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)] < 0 || liveData->params.batPowerKw < liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)]) + liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)] = liveData->params.batPowerKw; + if ( liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)] < 0 || liveData->params.batPowerKw > liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)]) + liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)] = liveData->params.batPowerKw; + liveData->params.chargingGraphBatMinTempC[int(liveData->params.socPerc)] = liveData->params.batMinC; + liveData->params.chargingGraphBatMaxTempC[int(liveData->params.socPerc)] = liveData->params.batMaxC; + liveData->params.chargingGraphHeaterTempC[int(liveData->params.socPerc)] = liveData->params.batHeaterC; + liveData->params.chargingGraphWaterCoolantTempC[int(liveData->params.socPerc)] = liveData->params.coolingWaterTempC; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220102") && this->liveData->responseRowMerged.substring(12, 14) == "FF") { + if (liveData->commandRequest.equals("220102") && liveData->responseRowMerged.substring(12, 14) == "FF") { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220103")) { + if (liveData->commandRequest.equals("220103")) { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[32 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[32 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220104")) { + if (liveData->commandRequest.equals("220104")) { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[64 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[64 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220105")) { - this->liveData->params.socPercPrevious = this->liveData->params.socPerc; - this->liveData->params.sohPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(56, 60).c_str(), 2, false) / 10.0; - this->liveData->params.socPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(68, 70).c_str(), 1, false) / 2.0; + if (liveData->commandRequest.equals("220105")) { + liveData->params.socPercPrevious = liveData->params.socPerc; + liveData->params.sohPerc = liveData->hexToDec(liveData->responseRowMerged.substring(56, 60).c_str(), 2, false) / 10.0; + liveData->params.socPerc = liveData->hexToDec(liveData->responseRowMerged.substring(68, 70).c_str(), 1, false) / 2.0; // Soc10ced table, record x0% CEC/CED table (ex. 90%->89%, 80%->79%) - if (this->liveData->params.socPercPrevious - this->liveData->params.socPerc > 0) { - byte index = (int(this->liveData->params.socPerc) == 4) ? 0 : (int)(this->liveData->params.socPerc / 10) + 1; - if ((int(this->liveData->params.socPerc) % 10 == 9 || int(this->liveData->params.socPerc) == 4) && this->liveData->params.soc10ced[index] == -1) { - this->liveData->params.soc10ced[index] = this->liveData->params.cumulativeEnergyDischargedKWh; - this->liveData->params.soc10cec[index] = this->liveData->params.cumulativeEnergyChargedKWh; - this->liveData->params.soc10odo[index] = this->liveData->params.odoKm; - this->liveData->params.soc10time[index] = this->liveData->params.currentTime; + if (liveData->params.socPercPrevious - liveData->params.socPerc > 0) { + byte index = (int(liveData->params.socPerc) == 4) ? 0 : (int)(liveData->params.socPerc / 10) + 1; + if ((int(liveData->params.socPerc) % 10 == 9 || int(liveData->params.socPerc) == 4) && liveData->params.soc10ced[index] == -1) { + liveData->params.soc10ced[index] = liveData->params.cumulativeEnergyDischargedKWh; + liveData->params.soc10cec[index] = liveData->params.cumulativeEnergyChargedKWh; + liveData->params.soc10odo[index] = liveData->params.odoKm; + liveData->params.soc10time[index] = liveData->params.currentTime; } } - this->liveData->params.bmsUnknownTempA = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 32).c_str(), 1, true); - this->liveData->params.batHeaterC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(52, 54).c_str(), 1, true); - this->liveData->params.bmsUnknownTempB = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(82, 84).c_str(), 1, true); + liveData->params.bmsUnknownTempA = liveData->hexToDec(liveData->responseRowMerged.substring(30, 32).c_str(), 1, true); + liveData->params.batHeaterC = liveData->hexToDec(liveData->responseRowMerged.substring(52, 54).c_str(), 1, true); + liveData->params.bmsUnknownTempB = liveData->hexToDec(liveData->responseRowMerged.substring(82, 84).c_str(), 1, true); // for (int i = 30; i < 32; i++) { // ai/aj position - this->liveData->params.cellVoltage[96 - 30 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[96 - 30 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220106")) { - this->liveData->params.coolingWaterTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); - this->liveData->params.bmsUnknownTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(18, 20).c_str(), 1, true); - this->liveData->params.bmsUnknownTempD = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(46, 48).c_str(), 1, true); + if (liveData->commandRequest.equals("220106")) { + liveData->params.coolingWaterTempC = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); + liveData->params.bmsUnknownTempC = liveData->hexToDec(liveData->responseRowMerged.substring(18, 20).c_str(), 1, true); + liveData->params.bmsUnknownTempD = liveData->hexToDec(liveData->responseRowMerged.substring(46, 48).c_str(), 1, true); } } // TPMS 7a0 - if (this->liveData->currentAtshRequest.equals("ATSH7A0")) { - if (this->liveData->commandRequest.equals("22c00b")) { - this->liveData->params.tireFrontLeftPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireFrontRightPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(22, 24).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireRearRightPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 32).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireRearLeftPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(38, 40).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireFrontLeftTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireFrontRightTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(24, 26).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireRearRightTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 34).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireRearLeftTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(40, 42).c_str(), 2, false) - 50; // === OK Valid + if (liveData->currentAtshRequest.equals("ATSH7A0")) { + if (liveData->commandRequest.equals("22c00b")) { + liveData->params.tireFrontLeftPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireFrontRightPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(22, 24).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireRearRightPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(30, 32).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireRearLeftPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(38, 40).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireFrontLeftTempC = liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireFrontRightTempC = liveData->hexToDec(liveData->responseRowMerged.substring(24, 26).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireRearRightTempC = liveData->hexToDec(liveData->responseRowMerged.substring(32, 34).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireRearLeftTempC = liveData->hexToDec(liveData->responseRowMerged.substring(40, 42).c_str(), 2, false) - 50; // === OK Valid } } } @@ -296,150 +296,150 @@ void CarKiaEniro::parseRowMerged() { void CarKiaEniro::loadTestData() { // IGPM - this->liveData->currentAtshRequest = "ATSH770"; + liveData->currentAtshRequest = "ATSH770"; // 22BC03 - this->liveData->commandRequest = "22BC03"; - this->liveData->responseRowMerged = "62BC03FDEE7C730A600000AAAA"; - this->parseRowMerged(); + liveData->commandRequest = "22BC03"; + liveData->responseRowMerged = "62BC03FDEE7C730A600000AAAA"; + parseRowMerged(); // ABS / ESP + AHB ATSH7D1 - this->liveData->currentAtshRequest = "ATSH7D1"; + liveData->currentAtshRequest = "ATSH7D1"; // 2101 - this->liveData->commandRequest = "22C101"; - this->liveData->responseRowMerged = "62C1015FD7E7D0FFFF00FF04D0D400000000FF7EFF0030F5010000FFFF7F6307F207FE05FF00FF3FFFFFAAAAAAAAAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "22C101"; + liveData->responseRowMerged = "62C1015FD7E7D0FFFF00FF04D0D400000000FF7EFF0030F5010000FFFF7F6307F207FE05FF00FF3FFFFFAAAAAAAAAAAA"; + parseRowMerged(); // VMCU ATSH7E2 - this->liveData->currentAtshRequest = "ATSH7E2"; + liveData->currentAtshRequest = "ATSH7E2"; // 2101 - this->liveData->commandRequest = "2101"; - this->liveData->responseRowMerged = "6101FFF8000009285A3B0648030000B4179D763404080805000000"; - this->parseRowMerged(); + liveData->commandRequest = "2101"; + liveData->responseRowMerged = "6101FFF8000009285A3B0648030000B4179D763404080805000000"; + parseRowMerged(); // 2102 - this->liveData->commandRequest = "2102"; - this->liveData->responseRowMerged = "6102F8FFFC000101000000840FBF83BD33270680953033757F59291C76000001010100000007000000"; - this->liveData->responseRowMerged = "6102F8FFFC000101000000931CC77F4C39040BE09BA7385D8158832175000001010100000007000000"; - this->parseRowMerged(); + liveData->commandRequest = "2102"; + liveData->responseRowMerged = "6102F8FFFC000101000000840FBF83BD33270680953033757F59291C76000001010100000007000000"; + liveData->responseRowMerged = "6102F8FFFC000101000000931CC77F4C39040BE09BA7385D8158832175000001010100000007000000"; + parseRowMerged(); // "ATSH7DF", - this->liveData->currentAtshRequest = "ATSH7DF"; + liveData->currentAtshRequest = "ATSH7DF"; // 2106 - this->liveData->commandRequest = "2106"; - this->liveData->responseRowMerged = "6106FFFF800000000000000200001B001C001C000600060006000E000000010000000000000000013D013D013E013E00"; - this->parseRowMerged(); + liveData->commandRequest = "2106"; + liveData->responseRowMerged = "6106FFFF800000000000000200001B001C001C000600060006000E000000010000000000000000013D013D013E013E00"; + parseRowMerged(); // AIRCON / ACU ATSH7B3 - this->liveData->currentAtshRequest = "ATSH7B3"; + liveData->currentAtshRequest = "ATSH7B3"; // 220100 - this->liveData->commandRequest = "220100"; - this->liveData->responseRowMerged = "6201007E5027C8FF7F765D05B95AFFFF5AFF11FFFFFFFFFFFF6AFFFF2DF0757630FFFF00FFFF000000"; - this->liveData->responseRowMerged = "6201007E5027C8FF867C58121010FFFF10FF8EFFFFFFFFFFFF10FFFF0DF0617900FFFF01FFFF000000"; - this->parseRowMerged(); + liveData->commandRequest = "220100"; + liveData->responseRowMerged = "6201007E5027C8FF7F765D05B95AFFFF5AFF11FFFFFFFFFFFF6AFFFF2DF0757630FFFF00FFFF000000"; + liveData->responseRowMerged = "6201007E5027C8FF867C58121010FFFF10FF8EFFFFFFFFFFFF10FFFF0DF0617900FFFF01FFFF000000"; + parseRowMerged(); // BMS ATSH7E4 - this->liveData->currentAtshRequest = "ATSH7E4"; + liveData->currentAtshRequest = "ATSH7E4"; // 220101 - this->liveData->commandRequest = "220101"; - this->liveData->responseRowMerged = "620101FFF7E7FF99000000000300B10EFE120F11100F12000018C438C30B00008400003864000035850000153A00001374000647010D017F0BDA0BDA03E8"; - this->liveData->responseRowMerged = "620101FFF7E7FFB3000000000300120F9B111011101011000014CC38CB3B00009100003A510000367C000015FB000013D3000690250D018E0000000003E8"; - this->parseRowMerged(); + liveData->commandRequest = "220101"; + liveData->responseRowMerged = "620101FFF7E7FF99000000000300B10EFE120F11100F12000018C438C30B00008400003864000035850000153A00001374000647010D017F0BDA0BDA03E8"; + liveData->responseRowMerged = "620101FFF7E7FFB3000000000300120F9B111011101011000014CC38CB3B00009100003A510000367C000015FB000013D3000690250D018E0000000003E8"; + parseRowMerged(); // 220102 - this->liveData->commandRequest = "220102"; - this->liveData->responseRowMerged = "620102FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220102"; + liveData->responseRowMerged = "620102FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; + parseRowMerged(); // 220103 - this->liveData->commandRequest = "220103"; - this->liveData->responseRowMerged = "620103FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACBCACACFCCCBCBCBCBCBCBCBCBAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220103"; + liveData->responseRowMerged = "620103FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACBCACACFCCCBCBCBCBCBCBCBCBAAAA"; + parseRowMerged(); // 220104 - this->liveData->commandRequest = "220104"; - this->liveData->responseRowMerged = "620104FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220104"; + liveData->responseRowMerged = "620104FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; + parseRowMerged(); // 220105 - this->liveData->commandRequest = "220105"; - this->liveData->responseRowMerged = "620105003fff9000000000000000000F8A86012B4946500101500DAC03E800000000AC0000C7C701000F00000000AAAA"; - this->liveData->responseRowMerged = "620105003FFF90000000000000000014918E012927465000015013BB03E800000000BB0000CBCB01001300000000AAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220105"; + liveData->responseRowMerged = "620105003fff9000000000000000000F8A86012B4946500101500DAC03E800000000AC0000C7C701000F00000000AAAA"; + liveData->responseRowMerged = "620105003FFF90000000000000000014918E012927465000015013BB03E800000000BB0000CBCB01001300000000AAAA"; + parseRowMerged(); // 220106 - this->liveData->commandRequest = "220106"; - this->liveData->responseRowMerged = "620106FFFFFFFF14001A00240000003A7C86B4B30000000928EA00"; - this->parseRowMerged(); + liveData->commandRequest = "220106"; + liveData->responseRowMerged = "620106FFFFFFFF14001A00240000003A7C86B4B30000000928EA00"; + parseRowMerged(); // BCM / TPMS ATSH7A0 - this->liveData->currentAtshRequest = "ATSH7A0"; + liveData->currentAtshRequest = "ATSH7A0"; // 22c00b - this->liveData->commandRequest = "22c00b"; - this->liveData->responseRowMerged = "62C00BFFFF0000B93D0100B43E0100B43D0100BB3C0100AAAAAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "22c00b"; + liveData->responseRowMerged = "62C00BFFFF0000B93D0100B43E0100B43D0100BB3C0100AAAAAAAA"; + parseRowMerged(); // ATSH7C6 - this->liveData->currentAtshRequest = "ATSH7C6"; + liveData->currentAtshRequest = "ATSH7C6"; // 22b002 - this->liveData->commandRequest = "22b002"; - this->liveData->responseRowMerged = "62B002E0000000FFB400330B0000000000000000"; - this->parseRowMerged(); + liveData->commandRequest = "22b002"; + liveData->responseRowMerged = "62B002E0000000FFB400330B0000000000000000"; + parseRowMerged(); - this->liveData->params.batModuleTempC[0] = 28; - this->liveData->params.batModuleTempC[1] = 29; - this->liveData->params.batModuleTempC[2] = 28; - this->liveData->params.batModuleTempC[3] = 30; + liveData->params.batModuleTempC[0] = 28; + liveData->params.batModuleTempC[1] = 29; + liveData->params.batModuleTempC[2] = 28; + liveData->params.batModuleTempC[3] = 30; // This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging) - this->liveData->params.batMinC = this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[0]; - for (uint16_t i = 1; i < this->liveData->params.batModuleTempCount; i++) { - if (this->liveData->params.batModuleTempC[i] < this->liveData->params.batMinC) - this->liveData->params.batMinC = this->liveData->params.batModuleTempC[i]; - if (this->liveData->params.batModuleTempC[i] > this->liveData->params.batMaxC) - this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[i]; + liveData->params.batMinC = liveData->params.batMaxC = liveData->params.batModuleTempC[0]; + for (uint16_t i = 1; i < liveData->params.batModuleTempCount; i++) { + if (liveData->params.batModuleTempC[i] < liveData->params.batMinC) + liveData->params.batMinC = liveData->params.batModuleTempC[i]; + if (liveData->params.batModuleTempC[i] > liveData->params.batMaxC) + liveData->params.batMaxC = liveData->params.batModuleTempC[i]; } - this->liveData->params.batTempC = this->liveData->params.batMinC; + liveData->params.batTempC = liveData->params.batMinC; // - this->liveData->params.soc10ced[10] = 2200; - this->liveData->params.soc10cec[10] = 2500; - this->liveData->params.soc10odo[10] = 13000; - this->liveData->params.soc10time[10] = 13000; - this->liveData->params.soc10ced[9] = this->liveData->params.soc10ced[10] + 6.4; - this->liveData->params.soc10cec[9] = this->liveData->params.soc10cec[10] + 0; - this->liveData->params.soc10odo[9] = this->liveData->params.soc10odo[10] + 30; - this->liveData->params.soc10time[9] = this->liveData->params.soc10time[10] + 900; - this->liveData->params.soc10ced[8] = this->liveData->params.soc10ced[9] + 6.8; - this->liveData->params.soc10cec[8] = this->liveData->params.soc10cec[9] + 0; - this->liveData->params.soc10odo[8] = this->liveData->params.soc10odo[9] + 30; - this->liveData->params.soc10time[8] = this->liveData->params.soc10time[9] + 900; - this->liveData->params.soc10ced[7] = this->liveData->params.soc10ced[8] + 7.2; - this->liveData->params.soc10cec[7] = this->liveData->params.soc10cec[8] + 0.6; - this->liveData->params.soc10odo[7] = this->liveData->params.soc10odo[8] + 30; - this->liveData->params.soc10time[7] = this->liveData->params.soc10time[8] + 900; - this->liveData->params.soc10ced[6] = this->liveData->params.soc10ced[7] + 6.7; - this->liveData->params.soc10cec[6] = this->liveData->params.soc10cec[7] + 0; - this->liveData->params.soc10odo[6] = this->liveData->params.soc10odo[7] + 30; - this->liveData->params.soc10time[6] = this->liveData->params.soc10time[7] + 900; - this->liveData->params.soc10ced[5] = this->liveData->params.soc10ced[6] + 6.7; - this->liveData->params.soc10cec[5] = this->liveData->params.soc10cec[6] + 0; - this->liveData->params.soc10odo[5] = this->liveData->params.soc10odo[6] + 30; - this->liveData->params.soc10time[5] = this->liveData->params.soc10time[6] + 900; - this->liveData->params.soc10ced[4] = this->liveData->params.soc10ced[5] + 6.4; - this->liveData->params.soc10cec[4] = this->liveData->params.soc10cec[5] + 0.3; - this->liveData->params.soc10odo[4] = this->liveData->params.soc10odo[5] + 30; - this->liveData->params.soc10time[4] = this->liveData->params.soc10time[5] + 900; - this->liveData->params.soc10ced[3] = this->liveData->params.soc10ced[4] + 6.4; - this->liveData->params.soc10cec[3] = this->liveData->params.soc10cec[4] + 0; - this->liveData->params.soc10odo[3] = this->liveData->params.soc10odo[4] + 30; - this->liveData->params.soc10time[3] = this->liveData->params.soc10time[4] + 900; - this->liveData->params.soc10ced[2] = this->liveData->params.soc10ced[3] + 5.4; - this->liveData->params.soc10cec[2] = this->liveData->params.soc10cec[3] + 0.1; - this->liveData->params.soc10odo[2] = this->liveData->params.soc10odo[3] + 30; - this->liveData->params.soc10time[2] = this->liveData->params.soc10time[3] + 900; - this->liveData->params.soc10ced[1] = this->liveData->params.soc10ced[2] + 6.2; - this->liveData->params.soc10cec[1] = this->liveData->params.soc10cec[2] + 0.1; - this->liveData->params.soc10odo[1] = this->liveData->params.soc10odo[2] + 30; - this->liveData->params.soc10time[1] = this->liveData->params.soc10time[2] + 900; - this->liveData->params.soc10ced[0] = this->liveData->params.soc10ced[1] + 2.9; - this->liveData->params.soc10cec[0] = this->liveData->params.soc10cec[1] + 0.5; - this->liveData->params.soc10odo[0] = this->liveData->params.soc10odo[1] + 15; - this->liveData->params.soc10time[0] = this->liveData->params.soc10time[1] + 900; + liveData->params.soc10ced[10] = 2200; + liveData->params.soc10cec[10] = 2500; + liveData->params.soc10odo[10] = 13000; + liveData->params.soc10time[10] = 13000; + liveData->params.soc10ced[9] = liveData->params.soc10ced[10] + 6.4; + liveData->params.soc10cec[9] = liveData->params.soc10cec[10] + 0; + liveData->params.soc10odo[9] = liveData->params.soc10odo[10] + 30; + liveData->params.soc10time[9] = liveData->params.soc10time[10] + 900; + liveData->params.soc10ced[8] = liveData->params.soc10ced[9] + 6.8; + liveData->params.soc10cec[8] = liveData->params.soc10cec[9] + 0; + liveData->params.soc10odo[8] = liveData->params.soc10odo[9] + 30; + liveData->params.soc10time[8] = liveData->params.soc10time[9] + 900; + liveData->params.soc10ced[7] = liveData->params.soc10ced[8] + 7.2; + liveData->params.soc10cec[7] = liveData->params.soc10cec[8] + 0.6; + liveData->params.soc10odo[7] = liveData->params.soc10odo[8] + 30; + liveData->params.soc10time[7] = liveData->params.soc10time[8] + 900; + liveData->params.soc10ced[6] = liveData->params.soc10ced[7] + 6.7; + liveData->params.soc10cec[6] = liveData->params.soc10cec[7] + 0; + liveData->params.soc10odo[6] = liveData->params.soc10odo[7] + 30; + liveData->params.soc10time[6] = liveData->params.soc10time[7] + 900; + liveData->params.soc10ced[5] = liveData->params.soc10ced[6] + 6.7; + liveData->params.soc10cec[5] = liveData->params.soc10cec[6] + 0; + liveData->params.soc10odo[5] = liveData->params.soc10odo[6] + 30; + liveData->params.soc10time[5] = liveData->params.soc10time[6] + 900; + liveData->params.soc10ced[4] = liveData->params.soc10ced[5] + 6.4; + liveData->params.soc10cec[4] = liveData->params.soc10cec[5] + 0.3; + liveData->params.soc10odo[4] = liveData->params.soc10odo[5] + 30; + liveData->params.soc10time[4] = liveData->params.soc10time[5] + 900; + liveData->params.soc10ced[3] = liveData->params.soc10ced[4] + 6.4; + liveData->params.soc10cec[3] = liveData->params.soc10cec[4] + 0; + liveData->params.soc10odo[3] = liveData->params.soc10odo[4] + 30; + liveData->params.soc10time[3] = liveData->params.soc10time[4] + 900; + liveData->params.soc10ced[2] = liveData->params.soc10ced[3] + 5.4; + liveData->params.soc10cec[2] = liveData->params.soc10cec[3] + 0.1; + liveData->params.soc10odo[2] = liveData->params.soc10odo[3] + 30; + liveData->params.soc10time[2] = liveData->params.soc10time[3] + 900; + liveData->params.soc10ced[1] = liveData->params.soc10ced[2] + 6.2; + liveData->params.soc10cec[1] = liveData->params.soc10cec[2] + 0.1; + liveData->params.soc10odo[1] = liveData->params.soc10odo[2] + 30; + liveData->params.soc10time[1] = liveData->params.soc10time[2] + 900; + liveData->params.soc10ced[0] = liveData->params.soc10ced[1] + 2.9; + liveData->params.soc10cec[0] = liveData->params.soc10cec[1] + 0.5; + liveData->params.soc10odo[0] = liveData->params.soc10odo[1] + 15; + liveData->params.soc10time[0] = liveData->params.soc10time[1] + 900; } diff --git a/CarRenaultZoe.cpp b/CarRenaultZoe.cpp index c7b632d..e190091 100644 --- a/CarRenaultZoe.cpp +++ b/CarRenaultZoe.cpp @@ -49,19 +49,19 @@ void CarRenaultZoe::activateCommandQueue() { }; // - this->liveData->params.batModuleTempCount = 12; // 24, 12 is display limit - this->liveData->params.batteryTotalAvailableKWh = 28; + liveData->params.batModuleTempCount = 12; // 24, 12 is display limit + liveData->params.batteryTotalAvailableKWh = 28; // Empty and fill command queue for (int i = 0; i < 300; i++) { - this->liveData->commandQueue[i] = ""; + liveData->commandQueue[i] = ""; } for (int i = 0; i < commandQueueCountRenaultZoe; i++) { - this->liveData->commandQueue[i] = commandQueueRenaultZoe[i]; + liveData->commandQueue[i] = commandQueueRenaultZoe[i]; } - this->liveData->commandQueueLoopFrom = commandQueueLoopFromRenaultZoe; - this->liveData->commandQueueCount = commandQueueCountRenaultZoe; + liveData->commandQueueLoopFrom = commandQueueLoopFromRenaultZoe; + liveData->commandQueueCount = commandQueueCountRenaultZoe; } /** @@ -72,212 +72,212 @@ void CarRenaultZoe::parseRowMerged() { bool tempByte; // LBC 79B - if (this->liveData->currentAtshRequest.equals("ATSH79B")) { - if (this->liveData->commandRequest.equals("2101")) { - this->liveData->params.batPowerAmp = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(4, 8).c_str(), 2, false) - 5000; - this->liveData->params.batPowerKw = (this->liveData->params.batPowerAmp * this->liveData->params.batVoltage) / 1000.0; - this->liveData->params.auxVoltage = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(56, 60).c_str(), 2, false) / 100.0; - this->liveData->params.availableChargePower = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(84, 88).c_str(), 2, false) / 100.0; - this->liveData->params.batCellMinV = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(24, 28).c_str(), 2, false) / 100.0; - this->liveData->params.batCellMaxV = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(28, 32).c_str(), 2, false) / 100.0; + if (liveData->currentAtshRequest.equals("ATSH79B")) { + if (liveData->commandRequest.equals("2101")) { + liveData->params.batPowerAmp = liveData->hexToDec(liveData->responseRowMerged.substring(4, 8).c_str(), 2, false) - 5000; + liveData->params.batPowerKw = (liveData->params.batPowerAmp * liveData->params.batVoltage) / 1000.0; + liveData->params.auxVoltage = liveData->hexToDec(liveData->responseRowMerged.substring(56, 60).c_str(), 2, false) / 100.0; + liveData->params.availableChargePower = liveData->hexToDec(liveData->responseRowMerged.substring(84, 88).c_str(), 2, false) / 100.0; + liveData->params.batCellMinV = liveData->hexToDec(liveData->responseRowMerged.substring(24, 28).c_str(), 2, false) / 100.0; + liveData->params.batCellMaxV = liveData->hexToDec(liveData->responseRowMerged.substring(28, 32).c_str(), 2, false) / 100.0; } - if (this->liveData->commandRequest.equals("2103")) { - this->liveData->params.socPercPrevious = this->liveData->params.socPerc; - this->liveData->params.socPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(48, 52).c_str(), 2, false) / 100.0; + if (liveData->commandRequest.equals("2103")) { + liveData->params.socPercPrevious = liveData->params.socPerc; + liveData->params.socPerc = liveData->hexToDec(liveData->responseRowMerged.substring(48, 52).c_str(), 2, false) / 100.0; } - if (this->liveData->commandRequest.equals("2104")) { + if (liveData->commandRequest.equals("2104")) { for (uint16_t i = 0; i < 12; i++) { - this->liveData->params.batModuleTempC[i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(8 + ( i * 6), 10 + (i * 6)).c_str(), 1, false) - 40; + liveData->params.batModuleTempC[i] = liveData->hexToDec(liveData->responseRowMerged.substring(8 + ( i * 6), 10 + (i * 6)).c_str(), 1, false) - 40; } for (uint16_t i = 12; i < 24; i++) { - this->liveData->params.batModuleTempC[i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(80 + ((i - 12) * 6), 82 + ((i - 12) * 6)).c_str(), 1, false) - 40; + liveData->params.batModuleTempC[i] = liveData->hexToDec(liveData->responseRowMerged.substring(80 + ((i - 12) * 6), 82 + ((i - 12) * 6)).c_str(), 1, false) - 40; } } - if (this->liveData->commandRequest.equals("2141")) { + if (liveData->commandRequest.equals("2141")) { for (int i = 0; i < 62; i++) { - this->liveData->params.cellVoltage[i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(4 + (i * 4), 8 + (i * 4)).c_str(), 2, false) / 1000; + liveData->params.cellVoltage[i] = liveData->hexToDec(liveData->responseRowMerged.substring(4 + (i * 4), 8 + (i * 4)).c_str(), 2, false) / 1000; } } - if (this->liveData->commandRequest.equals("2142")) { + if (liveData->commandRequest.equals("2142")) { for (int i = 0; i < 34; i++) { - this->liveData->params.cellVoltage[i + 62] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(4 + (i * 4), 8 + (i * 4)).c_str(), 2, false) / 1000; + liveData->params.cellVoltage[i + 62] = liveData->hexToDec(liveData->responseRowMerged.substring(4 + (i * 4), 8 + (i * 4)).c_str(), 2, false) / 1000; } } - if (this->liveData->commandRequest.equals("2161")) { - this->liveData->params.sohPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(18, 20).c_str(), 2, false) / 2.0; + if (liveData->commandRequest.equals("2161")) { + liveData->params.sohPerc = liveData->hexToDec(liveData->responseRowMerged.substring(18, 20).c_str(), 2, false) / 2.0; } } /* niro // ABS / ESP + AHB 7D1 - if (this->liveData->currentAtshRequest.equals("ATSH7D1")) { - if (this->liveData->commandRequest.equals("22C101")) { - uint8_t driveMode = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(22, 24).c_str(), 1, false); - this->liveData->params.forwardDriveMode = (driveMode == 4); - this->liveData->params.reverseDriveMode = (driveMode == 2); - this->liveData->params.parkModeOrNeutral = (driveMode == 1); + if (liveData->currentAtshRequest.equals("ATSH7D1")) { + if (liveData->commandRequest.equals("22C101")) { + uint8_t driveMode = liveData->hexToDec(liveData->responseRowMerged.substring(22, 24).c_str(), 1, false); + liveData->params.forwardDriveMode = (driveMode == 4); + liveData->params.reverseDriveMode = (driveMode == 2); + liveData->params.parkModeOrNeutral = (driveMode == 1); } } // IGPM - if (this->liveData->currentAtshRequest.equals("ATSH770")) { - if (this->liveData->commandRequest.equals("22BC03")) { - tempByte = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false); - this->liveData->params.ignitionOnPrevious = this->liveData->params.ignitionOn; - this->liveData->params.ignitionOn = (bitRead(tempByte, 5) == 1); - if (this->liveData->params.ignitionOnPrevious && !this->liveData->params.ignitionOn) - this->liveData->params.automaticShutdownTimer = this->liveData->params.currentTime; + if (liveData->currentAtshRequest.equals("ATSH770")) { + if (liveData->commandRequest.equals("22BC03")) { + tempByte = liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false); + liveData->params.ignitionOnPrevious = liveData->params.ignitionOn; + liveData->params.ignitionOn = (bitRead(tempByte, 5) == 1); + if (liveData->params.ignitionOnPrevious && !liveData->params.ignitionOn) + liveData->params.automaticShutdownTimer = liveData->params.currentTime; - this->liveData->params.lightInfo = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(18, 20).c_str(), 1, false); - this->liveData->params.headLights = (bitRead(this->liveData->params.lightInfo, 5) == 1); - this->liveData->params.dayLights = (bitRead(this->liveData->params.lightInfo, 3) == 1); + liveData->params.lightInfo = liveData->hexToDec(liveData->responseRowMerged.substring(18, 20).c_str(), 1, false); + liveData->params.headLights = (bitRead(liveData->params.lightInfo, 5) == 1); + liveData->params.dayLights = (bitRead(liveData->params.lightInfo, 3) == 1); } - if (this->liveData->commandRequest.equals("22BC06")) { - this->liveData->params.brakeLightInfo = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); - this->liveData->params.brakeLights = (bitRead(this->liveData->params.brakeLightInfo, 5) == 1); + if (liveData->commandRequest.equals("22BC06")) { + liveData->params.brakeLightInfo = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); + liveData->params.brakeLights = (bitRead(liveData->params.brakeLightInfo, 5) == 1); } } // VMCU 7E2 - if (this->liveData->currentAtshRequest.equals("ATSH7E2")) { - if (this->liveData->commandRequest.equals("2101")) { - this->liveData->params.speedKmh = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750 - if (this->liveData->params.speedKmh < -99 || this->liveData->params.speedKmh > 200) - this->liveData->params.speedKmh = 0; + if (liveData->currentAtshRequest.equals("ATSH7E2")) { + if (liveData->commandRequest.equals("2101")) { + liveData->params.speedKmh = liveData->hexToDec(liveData->responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750 + if (liveData->params.speedKmh < -99 || liveData->params.speedKmh > 200) + liveData->params.speedKmh = 0; } - if (this->liveData->commandRequest.equals("2102")) { - this->liveData->params.auxPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(50, 52).c_str(), 1, false); - this->liveData->params.auxCurrentAmp = - this->liveData->hexToDec(this->liveData->responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0; + if (liveData->commandRequest.equals("2102")) { + liveData->params.auxPerc = liveData->hexToDec(liveData->responseRowMerged.substring(50, 52).c_str(), 1, false); + liveData->params.auxCurrentAmp = - liveData->hexToDec(liveData->responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0; } } // Cluster module 7c6 - if (this->liveData->currentAtshRequest.equals("ATSH7C6")) { - if (this->liveData->commandRequest.equals("22B002")) { - this->liveData->params.odoKm = float(strtol(this->liveData->responseRowMerged.substring(18, 24).c_str(), 0, 16)); + if (liveData->currentAtshRequest.equals("ATSH7C6")) { + if (liveData->commandRequest.equals("22B002")) { + liveData->params.odoKm = float(strtol(liveData->responseRowMerged.substring(18, 24).c_str(), 0, 16)); } } // Aircon 7b3 - if (this->liveData->currentAtshRequest.equals("ATSH7B3")) { - if (this->liveData->commandRequest.equals("220100")) { - this->liveData->params.indoorTemperature = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; - this->liveData->params.outdoorTemperature = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(18, 20).c_str(), 1, false) / 2) - 40; + if (liveData->currentAtshRequest.equals("ATSH7B3")) { + if (liveData->commandRequest.equals("220100")) { + liveData->params.indoorTemperature = (liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; + liveData->params.outdoorTemperature = (liveData->hexToDec(liveData->responseRowMerged.substring(18, 20).c_str(), 1, false) / 2) - 40; } - if (this->liveData->commandRequest.equals("220102") && this->liveData->responseRowMerged.substring(12, 14) == "00") { - this->liveData->params.coolantTemp1C = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false) / 2) - 40; - this->liveData->params.coolantTemp2C = (this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; + if (liveData->commandRequest.equals("220102") && liveData->responseRowMerged.substring(12, 14) == "00") { + liveData->params.coolantTemp1C = (liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false) / 2) - 40; + liveData->params.coolantTemp2C = (liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; } } // BMS 7e4 - if (this->liveData->currentAtshRequest.equals("ATSH7E4")) { - if (this->liveData->commandRequest.equals("220101")) { - this->liveData->params.cumulativeEnergyChargedKWh = float(strtol(this->liveData->responseRowMerged.substring(82, 90).c_str(), 0, 16)) / 10.0; - if (this->liveData->params.cumulativeEnergyChargedKWhStart == -1) - this->liveData->params.cumulativeEnergyChargedKWhStart = this->liveData->params.cumulativeEnergyChargedKWh; - this->liveData->params.cumulativeEnergyDischargedKWh = float(strtol(this->liveData->responseRowMerged.substring(90, 98).c_str(), 0, 16)) / 10.0; - if (this->liveData->params.cumulativeEnergyDischargedKWhStart == -1) - this->liveData->params.cumulativeEnergyDischargedKWhStart = this->liveData->params.cumulativeEnergyDischargedKWh; - this->liveData->params.availableDischargePower = float(strtol(this->liveData->responseRowMerged.substring(20, 24).c_str(), 0, 16)) / 100.0; - //this->liveData->params.isolationResistanceKOhm = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(118, 122).c_str(), 2, true); - this->liveData->params.batFanStatus = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(60, 62).c_str(), 2, true); - this->liveData->params.batFanFeedbackHz = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(62, 64).c_str(), 2, true); - this->liveData->params.auxVoltage = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(64, 66).c_str(), 2, true) / 10.0; - this->liveData->params.batVoltage = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 34).c_str(), 2, false) / 10.0; - if (this->liveData->params.batPowerKw < 0) // Reset charging start time - this->liveData->params.chargingStartTime = this->liveData->params.currentTime; - this->liveData->params.batPowerKwh100 = this->liveData->params.batPowerKw / this->liveData->params.speedKmh * 100; - this->liveData->params.batModuleTempC[0] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(38, 40).c_str(), 1, true); - this->liveData->params.batModuleTempC[1] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(40, 42).c_str(), 1, true); - this->liveData->params.batModuleTempC[2] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(42, 44).c_str(), 1, true); - this->liveData->params.batModuleTempC[3] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(44, 46).c_str(), 1, true); - this->liveData->params.motorRpm = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(112, 116).c_str(), 2, false); + if (liveData->currentAtshRequest.equals("ATSH7E4")) { + if (liveData->commandRequest.equals("220101")) { + liveData->params.cumulativeEnergyChargedKWh = float(strtol(liveData->responseRowMerged.substring(82, 90).c_str(), 0, 16)) / 10.0; + if (liveData->params.cumulativeEnergyChargedKWhStart == -1) + liveData->params.cumulativeEnergyChargedKWhStart = liveData->params.cumulativeEnergyChargedKWh; + liveData->params.cumulativeEnergyDischargedKWh = float(strtol(liveData->responseRowMerged.substring(90, 98).c_str(), 0, 16)) / 10.0; + if (liveData->params.cumulativeEnergyDischargedKWhStart == -1) + liveData->params.cumulativeEnergyDischargedKWhStart = liveData->params.cumulativeEnergyDischargedKWh; + liveData->params.availableDischargePower = float(strtol(liveData->responseRowMerged.substring(20, 24).c_str(), 0, 16)) / 100.0; + //liveData->params.isolationResistanceKOhm = liveData->hexToDec(liveData->responseRowMerged.substring(118, 122).c_str(), 2, true); + liveData->params.batFanStatus = liveData->hexToDec(liveData->responseRowMerged.substring(60, 62).c_str(), 2, true); + liveData->params.batFanFeedbackHz = liveData->hexToDec(liveData->responseRowMerged.substring(62, 64).c_str(), 2, true); + liveData->params.auxVoltage = liveData->hexToDec(liveData->responseRowMerged.substring(64, 66).c_str(), 2, true) / 10.0; + liveData->params.batVoltage = liveData->hexToDec(liveData->responseRowMerged.substring(30, 34).c_str(), 2, false) / 10.0; + if (liveData->params.batPowerKw < 0) // Reset charging start time + liveData->params.chargingStartTime = liveData->params.currentTime; + liveData->params.batPowerKwh100 = liveData->params.batPowerKw / liveData->params.speedKmh * 100; + liveData->params.batModuleTempC[0] = liveData->hexToDec(liveData->responseRowMerged.substring(38, 40).c_str(), 1, true); + liveData->params.batModuleTempC[1] = liveData->hexToDec(liveData->responseRowMerged.substring(40, 42).c_str(), 1, true); + liveData->params.batModuleTempC[2] = liveData->hexToDec(liveData->responseRowMerged.substring(42, 44).c_str(), 1, true); + liveData->params.batModuleTempC[3] = liveData->hexToDec(liveData->responseRowMerged.substring(44, 46).c_str(), 1, true); + liveData->params.motorRpm = liveData->hexToDec(liveData->responseRowMerged.substring(112, 116).c_str(), 2, false); // This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging) - this->liveData->params.batMinC = this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[0]; - for (uint16_t i = 1; i < this->liveData->params.batModuleTempCount; i++) { - if (this->liveData->params.batModuleTempC[i] < this->liveData->params.batMinC) - this->liveData->params.batMinC = this->liveData->params.batModuleTempC[i]; - if (this->liveData->params.batModuleTempC[i] > this->liveData->params.batMaxC) - this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[i]; + liveData->params.batMinC = liveData->params.batMaxC = liveData->params.batModuleTempC[0]; + for (uint16_t i = 1; i < liveData->params.batModuleTempCount; i++) { + if (liveData->params.batModuleTempC[i] < liveData->params.batMinC) + liveData->params.batMinC = liveData->params.batModuleTempC[i]; + if (liveData->params.batModuleTempC[i] > liveData->params.batMaxC) + liveData->params.batMaxC = liveData->params.batModuleTempC[i]; } - this->liveData->params.batTempC = this->liveData->params.batMinC; + liveData->params.batTempC = liveData->params.batMinC; - this->liveData->params.batInletC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(50, 52).c_str(), 1, true); - if (this->liveData->params.speedKmh < 10 && this->liveData->params.batPowerKw >= 1 && this->liveData->params.socPerc > 0 && this->liveData->params.socPerc <= 100) { - if ( this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)] < 0 || this->liveData->params.batPowerKw < this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)]) - this->liveData->params.chargingGraphMinKw[int(this->liveData->params.socPerc)] = this->liveData->params.batPowerKw; - if ( this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)] < 0 || this->liveData->params.batPowerKw > this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)]) - this->liveData->params.chargingGraphMaxKw[int(this->liveData->params.socPerc)] = this->liveData->params.batPowerKw; - this->liveData->params.chargingGraphBatMinTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batMinC; - this->liveData->params.chargingGraphBatMaxTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batMaxC; - this->liveData->params.chargingGraphHeaterTempC[int(this->liveData->params.socPerc)] = this->liveData->params.batHeaterC; - this->liveData->params.chargingGraphWaterCoolantTempC[int(this->liveData->params.socPerc)] = this->liveData->params.coolingWaterTempC; + liveData->params.batInletC = liveData->hexToDec(liveData->responseRowMerged.substring(50, 52).c_str(), 1, true); + if (liveData->params.speedKmh < 10 && liveData->params.batPowerKw >= 1 && liveData->params.socPerc > 0 && liveData->params.socPerc <= 100) { + if ( liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)] < 0 || liveData->params.batPowerKw < liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)]) + liveData->params.chargingGraphMinKw[int(liveData->params.socPerc)] = liveData->params.batPowerKw; + if ( liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)] < 0 || liveData->params.batPowerKw > liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)]) + liveData->params.chargingGraphMaxKw[int(liveData->params.socPerc)] = liveData->params.batPowerKw; + liveData->params.chargingGraphBatMinTempC[int(liveData->params.socPerc)] = liveData->params.batMinC; + liveData->params.chargingGraphBatMaxTempC[int(liveData->params.socPerc)] = liveData->params.batMaxC; + liveData->params.chargingGraphHeaterTempC[int(liveData->params.socPerc)] = liveData->params.batHeaterC; + liveData->params.chargingGraphWaterCoolantTempC[int(liveData->params.socPerc)] = liveData->params.coolingWaterTempC; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220102") && this->liveData->responseRowMerged.substring(12, 14) == "FF") { + if (liveData->commandRequest.equals("220102") && liveData->responseRowMerged.substring(12, 14) == "FF") { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220103")) { + if (liveData->commandRequest.equals("220103")) { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[32 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[32 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220104")) { + if (liveData->commandRequest.equals("220104")) { for (int i = 0; i < 32; i++) { - this->liveData->params.cellVoltage[64 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[64 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220105")) { - this->liveData->params.socPercPrevious = this->liveData->params.socPerc; - this->liveData->params.sohPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(56, 60).c_str(), 2, false) / 10.0; - this->liveData->params.socPerc = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(68, 70).c_str(), 1, false) / 2.0; + if (liveData->commandRequest.equals("220105")) { + liveData->params.socPercPrevious = liveData->params.socPerc; + liveData->params.sohPerc = liveData->hexToDec(liveData->responseRowMerged.substring(56, 60).c_str(), 2, false) / 10.0; + liveData->params.socPerc = liveData->hexToDec(liveData->responseRowMerged.substring(68, 70).c_str(), 1, false) / 2.0; // Soc10ced table, record x0% CEC/CED table (ex. 90%->89%, 80%->79%) - if (this->liveData->params.socPercPrevious - this->liveData->params.socPerc > 0) { - byte index = (int(this->liveData->params.socPerc) == 4) ? 0 : (int)(this->liveData->params.socPerc / 10) + 1; - if ((int(this->liveData->params.socPerc) % 10 == 9 || int(this->liveData->params.socPerc) == 4) && this->liveData->params.soc10ced[index] == -1) { - this->liveData->params.soc10ced[index] = this->liveData->params.cumulativeEnergyDischargedKWh; - this->liveData->params.soc10cec[index] = this->liveData->params.cumulativeEnergyChargedKWh; - this->liveData->params.soc10odo[index] = this->liveData->params.odoKm; - this->liveData->params.soc10time[index] = this->liveData->params.currentTime; + if (liveData->params.socPercPrevious - liveData->params.socPerc > 0) { + byte index = (int(liveData->params.socPerc) == 4) ? 0 : (int)(liveData->params.socPerc / 10) + 1; + if ((int(liveData->params.socPerc) % 10 == 9 || int(liveData->params.socPerc) == 4) && liveData->params.soc10ced[index] == -1) { + liveData->params.soc10ced[index] = liveData->params.cumulativeEnergyDischargedKWh; + liveData->params.soc10cec[index] = liveData->params.cumulativeEnergyChargedKWh; + liveData->params.soc10odo[index] = liveData->params.odoKm; + liveData->params.soc10time[index] = liveData->params.currentTime; } } - this->liveData->params.bmsUnknownTempA = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 32).c_str(), 1, true); - this->liveData->params.batHeaterC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(52, 54).c_str(), 1, true); - this->liveData->params.bmsUnknownTempB = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(82, 84).c_str(), 1, true); + liveData->params.bmsUnknownTempA = liveData->hexToDec(liveData->responseRowMerged.substring(30, 32).c_str(), 1, true); + liveData->params.batHeaterC = liveData->hexToDec(liveData->responseRowMerged.substring(52, 54).c_str(), 1, true); + liveData->params.bmsUnknownTempB = liveData->hexToDec(liveData->responseRowMerged.substring(82, 84).c_str(), 1, true); // for (int i = 30; i < 32; i++) { // ai/aj position - this->liveData->params.cellVoltage[96 - 30 + i] = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; + liveData->params.cellVoltage[96 - 30 + i] = liveData->hexToDec(liveData->responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; } } // BMS 7e4 - if (this->liveData->commandRequest.equals("220106")) { - this->liveData->params.coolingWaterTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); - this->liveData->params.bmsUnknownTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(18, 20).c_str(), 1, true); - this->liveData->params.bmsUnknownTempD = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(46, 48).c_str(), 1, true); + if (liveData->commandRequest.equals("220106")) { + liveData->params.coolingWaterTempC = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 1, false); + liveData->params.bmsUnknownTempC = liveData->hexToDec(liveData->responseRowMerged.substring(18, 20).c_str(), 1, true); + liveData->params.bmsUnknownTempD = liveData->hexToDec(liveData->responseRowMerged.substring(46, 48).c_str(), 1, true); } } // TPMS 7a0 - if (this->liveData->currentAtshRequest.equals("ATSH7A0")) { - if (this->liveData->commandRequest.equals("22c00b")) { - this->liveData->params.tireFrontLeftPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(14, 16).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireFrontRightPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(22, 24).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireRearRightPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(30, 32).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireRearLeftPressureBar = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(38, 40).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 - this->liveData->params.tireFrontLeftTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(16, 18).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireFrontRightTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(24, 26).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireRearRightTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(32, 34).c_str(), 2, false) - 50; // === OK Valid - this->liveData->params.tireRearLeftTempC = this->liveData->hexToDec(this->liveData->responseRowMerged.substring(40, 42).c_str(), 2, false) - 50; // === OK Valid + if (liveData->currentAtshRequest.equals("ATSH7A0")) { + if (liveData->commandRequest.equals("22c00b")) { + liveData->params.tireFrontLeftPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(14, 16).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireFrontRightPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(22, 24).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireRearRightPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(30, 32).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireRearLeftPressureBar = liveData->hexToDec(liveData->responseRowMerged.substring(38, 40).c_str(), 2, false) / 72.51886900361; // === OK Valid *0.2 / 14.503773800722 + liveData->params.tireFrontLeftTempC = liveData->hexToDec(liveData->responseRowMerged.substring(16, 18).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireFrontRightTempC = liveData->hexToDec(liveData->responseRowMerged.substring(24, 26).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireRearRightTempC = liveData->hexToDec(liveData->responseRowMerged.substring(32, 34).c_str(), 2, false) - 50; // === OK Valid + liveData->params.tireRearLeftTempC = liveData->hexToDec(liveData->responseRowMerged.substring(40, 42).c_str(), 2, false) - 50; // === OK Valid } } */ @@ -289,174 +289,174 @@ void CarRenaultZoe::parseRowMerged() { void CarRenaultZoe::loadTestData() { /// LBC 79B - this->liveData->currentAtshRequest = "ATSH79B"; - this->liveData->commandRequest = "2101"; - this->liveData->responseRowMerged = "6101134D138600000000000000000000000009980D610FB120D0000005420000000000000004ECB20000074B2927100000000000000000"; - this->parseRowMerged(); - this->liveData->commandRequest = "2103"; - this->liveData->responseRowMerged = "610301770D010D740000000001750174000000FFFF07D0050D410000030000000000"; - this->parseRowMerged(); - this->liveData->commandRequest = "2104"; - this->liveData->responseRowMerged = "61040B9D290B9F290B9D290B99290B9E290B98290B8A2A0B842A0BA0290B9B290B9A290B9629FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29292A000000000000"; - this->parseRowMerged(); - this->liveData->commandRequest = "2141"; - this->liveData->responseRowMerged = "61410E930E950E900E930E930E950E950E930E970E940E970E970E950E940E940E930E970E920E930E8F0E900E8E0E8C0E920E970E920E940E940E930E950E950E940E970E970E950E970E940E950E950E990E940E9A0E8E0E900E990E950E900E990E980E950E940E970E970E950E940E980E970E920E920E940E950E93000000000000"; - this->parseRowMerged(); - this->liveData->commandRequest = "2142"; - this->liveData->responseRowMerged = "61420E920E940E970E930E920E970E940E950E950E980E920E900E8F0E8F0E920E900E920E940E9B0E980E950E940E950E930E970E980E980E950E950E930E970E950E950E978BFA8C200000"; - this->parseRowMerged(); - this->liveData->commandRequest = "2161"; - this->liveData->responseRowMerged = "6161000AA820C8C8C8C2C2000153B400004669FF"; - this->parseRowMerged(); + liveData->currentAtshRequest = "ATSH79B"; + liveData->commandRequest = "2101"; + liveData->responseRowMerged = "6101134D138600000000000000000000000009980D610FB120D0000005420000000000000004ECB20000074B2927100000000000000000"; + parseRowMerged(); + liveData->commandRequest = "2103"; + liveData->responseRowMerged = "610301770D010D740000000001750174000000FFFF07D0050D410000030000000000"; + parseRowMerged(); + liveData->commandRequest = "2104"; + liveData->responseRowMerged = "61040B9D290B9F290B9D290B99290B9E290B98290B8A2A0B842A0BA0290B9B290B9A290B9629FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29292A000000000000"; + parseRowMerged(); + liveData->commandRequest = "2141"; + liveData->responseRowMerged = "61410E930E950E900E930E930E950E950E930E970E940E970E970E950E940E940E930E970E920E930E8F0E900E8E0E8C0E920E970E920E940E940E930E950E950E940E970E970E950E970E940E950E950E990E940E9A0E8E0E900E990E950E900E990E980E950E940E970E970E950E940E980E970E920E920E940E950E93000000000000"; + parseRowMerged(); + liveData->commandRequest = "2142"; + liveData->responseRowMerged = "61420E920E940E970E930E920E970E940E950E950E980E920E900E8F0E8F0E920E900E920E940E9B0E980E950E940E950E930E970E980E980E950E950E930E970E950E950E978BFA8C200000"; + parseRowMerged(); + liveData->commandRequest = "2161"; + liveData->responseRowMerged = "6161000AA820C8C8C8C2C2000153B400004669FF"; + parseRowMerged(); /* niro /// IGPM - this->liveData->currentAtshRequest = "ATSH770"; + liveData->currentAtshRequest = "ATSH770"; // 22BC03 - this->liveData->commandRequest = "22BC03"; - this->liveData->responseRowMerged = "62BC03FDEE7C730A600000AAAA"; - this->parseRowMerged(); + liveData->commandRequest = "22BC03"; + liveData->responseRowMerged = "62BC03FDEE7C730A600000AAAA"; + parseRowMerged(); // ABS / ESP + AHB ATSH7D1 - this->liveData->currentAtshRequest = "ATSH7D1"; + liveData->currentAtshRequest = "ATSH7D1"; // 2101 - this->liveData->commandRequest = "22C101"; - this->liveData->responseRowMerged = "62C1015FD7E7D0FFFF00FF04D0D400000000FF7EFF0030F5010000FFFF7F6307F207FE05FF00FF3FFFFFAAAAAAAAAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "22C101"; + liveData->responseRowMerged = "62C1015FD7E7D0FFFF00FF04D0D400000000FF7EFF0030F5010000FFFF7F6307F207FE05FF00FF3FFFFFAAAAAAAAAAAA"; + parseRowMerged(); // VMCU ATSH7E2 - this->liveData->currentAtshRequest = "ATSH7E2"; + liveData->currentAtshRequest = "ATSH7E2"; // 2101 - this->liveData->commandRequest = "2101"; - this->liveData->responseRowMerged = "6101FFF8000009285A3B0648030000B4179D763404080805000000"; - this->parseRowMerged(); + liveData->commandRequest = "2101"; + liveData->responseRowMerged = "6101FFF8000009285A3B0648030000B4179D763404080805000000"; + parseRowMerged(); // 2102 - this->liveData->commandRequest = "2102"; - this->liveData->responseRowMerged = "6102F8FFFC000101000000840FBF83BD33270680953033757F59291C76000001010100000007000000"; - this->liveData->responseRowMerged = "6102F8FFFC000101000000931CC77F4C39040BE09BA7385D8158832175000001010100000007000000"; - this->parseRowMerged(); + liveData->commandRequest = "2102"; + liveData->responseRowMerged = "6102F8FFFC000101000000840FBF83BD33270680953033757F59291C76000001010100000007000000"; + liveData->responseRowMerged = "6102F8FFFC000101000000931CC77F4C39040BE09BA7385D8158832175000001010100000007000000"; + parseRowMerged(); // "ATSH7DF", - this->liveData->currentAtshRequest = "ATSH7DF"; + liveData->currentAtshRequest = "ATSH7DF"; // 2106 - this->liveData->commandRequest = "2106"; - this->liveData->responseRowMerged = "6106FFFF800000000000000200001B001C001C000600060006000E000000010000000000000000013D013D013E013E00"; - this->parseRowMerged(); + liveData->commandRequest = "2106"; + liveData->responseRowMerged = "6106FFFF800000000000000200001B001C001C000600060006000E000000010000000000000000013D013D013E013E00"; + parseRowMerged(); // AIRCON / ACU ATSH7B3 - this->liveData->currentAtshRequest = "ATSH7B3"; + liveData->currentAtshRequest = "ATSH7B3"; // 220100 - this->liveData->commandRequest = "220100"; - this->liveData->responseRowMerged = "6201007E5027C8FF7F765D05B95AFFFF5AFF11FFFFFFFFFFFF6AFFFF2DF0757630FFFF00FFFF000000"; - this->liveData->responseRowMerged = "6201007E5027C8FF867C58121010FFFF10FF8EFFFFFFFFFFFF10FFFF0DF0617900FFFF01FFFF000000"; - this->parseRowMerged(); + liveData->commandRequest = "220100"; + liveData->responseRowMerged = "6201007E5027C8FF7F765D05B95AFFFF5AFF11FFFFFFFFFFFF6AFFFF2DF0757630FFFF00FFFF000000"; + liveData->responseRowMerged = "6201007E5027C8FF867C58121010FFFF10FF8EFFFFFFFFFFFF10FFFF0DF0617900FFFF01FFFF000000"; + parseRowMerged(); // BMS ATSH7E4 - this->liveData->currentAtshRequest = "ATSH7E4"; + liveData->currentAtshRequest = "ATSH7E4"; // 220101 - this->liveData->commandRequest = "220101"; - this->liveData->responseRowMerged = "620101FFF7E7FF99000000000300B10EFE120F11100F12000018C438C30B00008400003864000035850000153A00001374000647010D017F0BDA0BDA03E8"; - this->liveData->responseRowMerged = "620101FFF7E7FFB3000000000300120F9B111011101011000014CC38CB3B00009100003A510000367C000015FB000013D3000690250D018E0000000003E8"; - this->parseRowMerged(); + liveData->commandRequest = "220101"; + liveData->responseRowMerged = "620101FFF7E7FF99000000000300B10EFE120F11100F12000018C438C30B00008400003864000035850000153A00001374000647010D017F0BDA0BDA03E8"; + liveData->responseRowMerged = "620101FFF7E7FFB3000000000300120F9B111011101011000014CC38CB3B00009100003A510000367C000015FB000013D3000690250D018E0000000003E8"; + parseRowMerged(); // 220102 - this->liveData->commandRequest = "220102"; - this->liveData->responseRowMerged = "620102FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220102"; + liveData->responseRowMerged = "620102FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; + parseRowMerged(); // 220103 - this->liveData->commandRequest = "220103"; - this->liveData->responseRowMerged = "620103FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACBCACACFCCCBCBCBCBCBCBCBCBAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220103"; + liveData->responseRowMerged = "620103FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACBCACACFCCCBCBCBCBCBCBCBCBAAAA"; + parseRowMerged(); // 220104 - this->liveData->commandRequest = "220104"; - this->liveData->responseRowMerged = "620104FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220104"; + liveData->responseRowMerged = "620104FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA"; + parseRowMerged(); // 220105 - this->liveData->commandRequest = "220105"; - this->liveData->responseRowMerged = "620105003fff9000000000000000000F8A86012B4946500101500DAC03E800000000AC0000C7C701000F00000000AAAA"; - this->liveData->responseRowMerged = "620105003FFF90000000000000000014918E012927465000015013BB03E800000000BB0000CBCB01001300000000AAAA"; - this->parseRowMerged(); + liveData->commandRequest = "220105"; + liveData->responseRowMerged = "620105003fff9000000000000000000F8A86012B4946500101500DAC03E800000000AC0000C7C701000F00000000AAAA"; + liveData->responseRowMerged = "620105003FFF90000000000000000014918E012927465000015013BB03E800000000BB0000CBCB01001300000000AAAA"; + parseRowMerged(); // 220106 - this->liveData->commandRequest = "220106"; - this->liveData->responseRowMerged = "620106FFFFFFFF14001A00240000003A7C86B4B30000000928EA00"; - this->parseRowMerged(); + liveData->commandRequest = "220106"; + liveData->responseRowMerged = "620106FFFFFFFF14001A00240000003A7C86B4B30000000928EA00"; + parseRowMerged(); // BCM / TPMS ATSH7A0 - this->liveData->currentAtshRequest = "ATSH7A0"; + liveData->currentAtshRequest = "ATSH7A0"; // 22c00b - this->liveData->commandRequest = "22c00b"; - this->liveData->responseRowMerged = "62C00BFFFF0000B93D0100B43E0100B43D0100BB3C0100AAAAAAAA"; - this->parseRowMerged(); + liveData->commandRequest = "22c00b"; + liveData->responseRowMerged = "62C00BFFFF0000B93D0100B43E0100B43D0100BB3C0100AAAAAAAA"; + parseRowMerged(); // ATSH7C6 - this->liveData->currentAtshRequest = "ATSH7C6"; + liveData->currentAtshRequest = "ATSH7C6"; // 22b002 - this->liveData->commandRequest = "22b002"; - this->liveData->responseRowMerged = "62B002E0000000FFB400330B0000000000000000"; - this->parseRowMerged(); + liveData->commandRequest = "22b002"; + liveData->responseRowMerged = "62B002E0000000FFB400330B0000000000000000"; + parseRowMerged(); - this->liveData->params.batModuleTempC[0] = 28; - this->liveData->params.batModuleTempC[1] = 29; - this->liveData->params.batModuleTempC[2] = 28; - this->liveData->params.batModuleTempC[3] = 30; + liveData->params.batModuleTempC[0] = 28; + liveData->params.batModuleTempC[1] = 29; + liveData->params.batModuleTempC[2] = 28; + liveData->params.batModuleTempC[3] = 30; // This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging) - this->liveData->params.batMinC = this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[0]; - for (uint16_t i = 1; i < this->liveData->params.batModuleTempCount; i++) { - if (this->liveData->params.batModuleTempC[i] < this->liveData->params.batMinC) - this->liveData->params.batMinC = this->liveData->params.batModuleTempC[i]; - if (this->liveData->params.batModuleTempC[i] > this->liveData->params.batMaxC) - this->liveData->params.batMaxC = this->liveData->params.batModuleTempC[i]; + liveData->params.batMinC = liveData->params.batMaxC = liveData->params.batModuleTempC[0]; + for (uint16_t i = 1; i < liveData->params.batModuleTempCount; i++) { + if (liveData->params.batModuleTempC[i] < liveData->params.batMinC) + liveData->params.batMinC = liveData->params.batModuleTempC[i]; + if (liveData->params.batModuleTempC[i] > liveData->params.batMaxC) + liveData->params.batMaxC = liveData->params.batModuleTempC[i]; } - this->liveData->params.batTempC = this->liveData->params.batMinC; + liveData->params.batTempC = liveData->params.batMinC; // - this->liveData->params.soc10ced[10] = 2200; - this->liveData->params.soc10cec[10] = 2500; - this->liveData->params.soc10odo[10] = 13000; - this->liveData->params.soc10time[10] = 13000; - this->liveData->params.soc10ced[9] = this->liveData->params.soc10ced[10] + 6.4; - this->liveData->params.soc10cec[9] = this->liveData->params.soc10cec[10] + 0; - this->liveData->params.soc10odo[9] = this->liveData->params.soc10odo[10] + 30; - this->liveData->params.soc10time[9] = this->liveData->params.soc10time[10] + 900; - this->liveData->params.soc10ced[8] = this->liveData->params.soc10ced[9] + 6.8; - this->liveData->params.soc10cec[8] = this->liveData->params.soc10cec[9] + 0; - this->liveData->params.soc10odo[8] = this->liveData->params.soc10odo[9] + 30; - this->liveData->params.soc10time[8] = this->liveData->params.soc10time[9] + 900; - this->liveData->params.soc10ced[7] = this->liveData->params.soc10ced[8] + 7.2; - this->liveData->params.soc10cec[7] = this->liveData->params.soc10cec[8] + 0.6; - this->liveData->params.soc10odo[7] = this->liveData->params.soc10odo[8] + 30; - this->liveData->params.soc10time[7] = this->liveData->params.soc10time[8] + 900; - this->liveData->params.soc10ced[6] = this->liveData->params.soc10ced[7] + 6.7; - this->liveData->params.soc10cec[6] = this->liveData->params.soc10cec[7] + 0; - this->liveData->params.soc10odo[6] = this->liveData->params.soc10odo[7] + 30; - this->liveData->params.soc10time[6] = this->liveData->params.soc10time[7] + 900; - this->liveData->params.soc10ced[5] = this->liveData->params.soc10ced[6] + 6.7; - this->liveData->params.soc10cec[5] = this->liveData->params.soc10cec[6] + 0; - this->liveData->params.soc10odo[5] = this->liveData->params.soc10odo[6] + 30; - this->liveData->params.soc10time[5] = this->liveData->params.soc10time[6] + 900; - this->liveData->params.soc10ced[4] = this->liveData->params.soc10ced[5] + 6.4; - this->liveData->params.soc10cec[4] = this->liveData->params.soc10cec[5] + 0.3; - this->liveData->params.soc10odo[4] = this->liveData->params.soc10odo[5] + 30; - this->liveData->params.soc10time[4] = this->liveData->params.soc10time[5] + 900; - this->liveData->params.soc10ced[3] = this->liveData->params.soc10ced[4] + 6.4; - this->liveData->params.soc10cec[3] = this->liveData->params.soc10cec[4] + 0; - this->liveData->params.soc10odo[3] = this->liveData->params.soc10odo[4] + 30; - this->liveData->params.soc10time[3] = this->liveData->params.soc10time[4] + 900; - this->liveData->params.soc10ced[2] = this->liveData->params.soc10ced[3] + 5.4; - this->liveData->params.soc10cec[2] = this->liveData->params.soc10cec[3] + 0.1; - this->liveData->params.soc10odo[2] = this->liveData->params.soc10odo[3] + 30; - this->liveData->params.soc10time[2] = this->liveData->params.soc10time[3] + 900; - this->liveData->params.soc10ced[1] = this->liveData->params.soc10ced[2] + 6.2; - this->liveData->params.soc10cec[1] = this->liveData->params.soc10cec[2] + 0.1; - this->liveData->params.soc10odo[1] = this->liveData->params.soc10odo[2] + 30; - this->liveData->params.soc10time[1] = this->liveData->params.soc10time[2] + 900; - this->liveData->params.soc10ced[0] = this->liveData->params.soc10ced[1] + 2.9; - this->liveData->params.soc10cec[0] = this->liveData->params.soc10cec[1] + 0.5; - this->liveData->params.soc10odo[0] = this->liveData->params.soc10odo[1] + 15; - this->liveData->params.soc10time[0] = this->liveData->params.soc10time[1] + 900; + liveData->params.soc10ced[10] = 2200; + liveData->params.soc10cec[10] = 2500; + liveData->params.soc10odo[10] = 13000; + liveData->params.soc10time[10] = 13000; + liveData->params.soc10ced[9] = liveData->params.soc10ced[10] + 6.4; + liveData->params.soc10cec[9] = liveData->params.soc10cec[10] + 0; + liveData->params.soc10odo[9] = liveData->params.soc10odo[10] + 30; + liveData->params.soc10time[9] = liveData->params.soc10time[10] + 900; + liveData->params.soc10ced[8] = liveData->params.soc10ced[9] + 6.8; + liveData->params.soc10cec[8] = liveData->params.soc10cec[9] + 0; + liveData->params.soc10odo[8] = liveData->params.soc10odo[9] + 30; + liveData->params.soc10time[8] = liveData->params.soc10time[9] + 900; + liveData->params.soc10ced[7] = liveData->params.soc10ced[8] + 7.2; + liveData->params.soc10cec[7] = liveData->params.soc10cec[8] + 0.6; + liveData->params.soc10odo[7] = liveData->params.soc10odo[8] + 30; + liveData->params.soc10time[7] = liveData->params.soc10time[8] + 900; + liveData->params.soc10ced[6] = liveData->params.soc10ced[7] + 6.7; + liveData->params.soc10cec[6] = liveData->params.soc10cec[7] + 0; + liveData->params.soc10odo[6] = liveData->params.soc10odo[7] + 30; + liveData->params.soc10time[6] = liveData->params.soc10time[7] + 900; + liveData->params.soc10ced[5] = liveData->params.soc10ced[6] + 6.7; + liveData->params.soc10cec[5] = liveData->params.soc10cec[6] + 0; + liveData->params.soc10odo[5] = liveData->params.soc10odo[6] + 30; + liveData->params.soc10time[5] = liveData->params.soc10time[6] + 900; + liveData->params.soc10ced[4] = liveData->params.soc10ced[5] + 6.4; + liveData->params.soc10cec[4] = liveData->params.soc10cec[5] + 0.3; + liveData->params.soc10odo[4] = liveData->params.soc10odo[5] + 30; + liveData->params.soc10time[4] = liveData->params.soc10time[5] + 900; + liveData->params.soc10ced[3] = liveData->params.soc10ced[4] + 6.4; + liveData->params.soc10cec[3] = liveData->params.soc10cec[4] + 0; + liveData->params.soc10odo[3] = liveData->params.soc10odo[4] + 30; + liveData->params.soc10time[3] = liveData->params.soc10time[4] + 900; + liveData->params.soc10ced[2] = liveData->params.soc10ced[3] + 5.4; + liveData->params.soc10cec[2] = liveData->params.soc10cec[3] + 0.1; + liveData->params.soc10odo[2] = liveData->params.soc10odo[3] + 30; + liveData->params.soc10time[2] = liveData->params.soc10time[3] + 900; + liveData->params.soc10ced[1] = liveData->params.soc10ced[2] + 6.2; + liveData->params.soc10cec[1] = liveData->params.soc10cec[2] + 0.1; + liveData->params.soc10odo[1] = liveData->params.soc10odo[2] + 30; + liveData->params.soc10time[1] = liveData->params.soc10time[2] + 900; + liveData->params.soc10ced[0] = liveData->params.soc10ced[1] + 2.9; + liveData->params.soc10cec[0] = liveData->params.soc10cec[1] + 0.5; + liveData->params.soc10odo[0] = liveData->params.soc10odo[1] + 15; + liveData->params.soc10time[0] = liveData->params.soc10time[1] + 900; */ } diff --git a/LiveData.cpp b/LiveData.cpp index 8a0d159..c1a904c 100644 --- a/LiveData.cpp +++ b/LiveData.cpp @@ -10,95 +10,95 @@ */ void LiveData::initParams() { - this->params.automaticShutdownTimer = 0; + params.automaticShutdownTimer = 0; #ifdef SIM800L_ENABLED - this->params.lastDataSent = 0; - this->params.sim800l_enabled = false; + params.lastDataSent = 0; + params.sim800l_enabled = false; #endif //SIM800L_ENABLED - this->params.ignitionOn = false; - this->params.ignitionOnPrevious = false; - this->params.chargingStartTime = this->params.currentTime = 0; - this->params.lightInfo = 0; - this->params.headLights = false; - this->params.dayLights = false; - this->params.brakeLights = false; - this->params.brakeLightInfo = 0; - this->params.forwardDriveMode = false; - this->params.reverseDriveMode = false; - this->params.parkModeOrNeutral = false; - this->params.espState = 0; - this->params.speedKmh = -1; - this->params.motorRpm = -1; - this->params.odoKm = -1; - this->params.socPerc = -1; - this->params.socPercPrevious = -1; - this->params.sohPerc = -1; - this->params.cumulativeEnergyChargedKWh = -1; - this->params.cumulativeEnergyChargedKWhStart = -1; - this->params.cumulativeEnergyDischargedKWh = -1; - this->params.cumulativeEnergyDischargedKWhStart = -1; - this->params.availableChargePower = -1; - this->params.availableDischargePower = -1; - this->params.isolationResistanceKOhm = -1; - this->params.batPowerAmp = -1; - this->params.batPowerKw = -1; - this->params.batPowerKwh100 = -1; - this->params.batVoltage = -1; - this->params.batCellMinV = -1; - this->params.batCellMaxV = -1; - this->params.batTempC = -1; - this->params.batHeaterC = -1; - this->params.batInletC = -1; - this->params.batFanStatus = -1; - this->params.batFanFeedbackHz = -1; - this->params.batMinC = -1; - this->params.batMaxC = -1; + params.ignitionOn = false; + params.ignitionOnPrevious = false; + params.chargingStartTime = params.currentTime = 0; + params.lightInfo = 0; + params.headLights = false; + params.dayLights = false; + params.brakeLights = false; + params.brakeLightInfo = 0; + params.forwardDriveMode = false; + params.reverseDriveMode = false; + params.parkModeOrNeutral = false; + params.espState = 0; + params.speedKmh = -1; + params.motorRpm = -1; + params.odoKm = -1; + params.socPerc = -1; + params.socPercPrevious = -1; + params.sohPerc = -1; + params.cumulativeEnergyChargedKWh = -1; + params.cumulativeEnergyChargedKWhStart = -1; + params.cumulativeEnergyDischargedKWh = -1; + params.cumulativeEnergyDischargedKWhStart = -1; + params.availableChargePower = -1; + params.availableDischargePower = -1; + params.isolationResistanceKOhm = -1; + params.batPowerAmp = -1; + params.batPowerKw = -1; + params.batPowerKwh100 = -1; + params.batVoltage = -1; + params.batCellMinV = -1; + params.batCellMaxV = -1; + params.batTempC = -1; + params.batHeaterC = -1; + params.batInletC = -1; + params.batFanStatus = -1; + params.batFanFeedbackHz = -1; + params.batMinC = -1; + params.batMaxC = -1; for (int i = 0; i < 12; i++) { - this->params.batModuleTempC[i] = 0; + params.batModuleTempC[i] = 0; } - this->params.batModuleTempC[0] = -1; - this->params.batModuleTempC[1] = -1; - this->params.batModuleTempC[2] = -1; - this->params.batModuleTempC[3] = -1; - this->params.coolingWaterTempC = -1; - this->params.coolantTemp1C = -1; - this->params.coolantTemp2C = -1; - this->params.bmsUnknownTempA = -1; - this->params.bmsUnknownTempB = -1; - this->params.bmsUnknownTempC = -1; - this->params.bmsUnknownTempD = -1; - this->params.auxPerc = -1; - this->params.auxCurrentAmp = -1; - this->params.auxVoltage = -1; - this->params.indoorTemperature = -1; - this->params.outdoorTemperature = -1; - this->params.tireFrontLeftTempC = -1; - this->params.tireFrontLeftPressureBar = -1; - this->params.tireFrontRightTempC = -1; - this->params.tireFrontRightPressureBar = -1; - this->params.tireRearLeftTempC = -1; - this->params.tireRearLeftPressureBar = -1; - this->params.tireRearRightTempC = -1; - this->params.tireRearRightPressureBar = -1; + params.batModuleTempC[0] = -1; + params.batModuleTempC[1] = -1; + params.batModuleTempC[2] = -1; + params.batModuleTempC[3] = -1; + params.coolingWaterTempC = -1; + params.coolantTemp1C = -1; + params.coolantTemp2C = -1; + params.bmsUnknownTempA = -1; + params.bmsUnknownTempB = -1; + params.bmsUnknownTempC = -1; + params.bmsUnknownTempD = -1; + params.auxPerc = -1; + params.auxCurrentAmp = -1; + params.auxVoltage = -1; + params.indoorTemperature = -1; + params.outdoorTemperature = -1; + params.tireFrontLeftTempC = -1; + params.tireFrontLeftPressureBar = -1; + params.tireFrontRightTempC = -1; + params.tireFrontRightPressureBar = -1; + params.tireRearLeftTempC = -1; + params.tireRearLeftPressureBar = -1; + params.tireRearRightTempC = -1; + params.tireRearRightPressureBar = -1; for (int i = 0; i <= 10; i++) { - this->params.soc10ced[i] = this->params.soc10cec[i] = this->params.soc10odo[i] = -1; - this->params.soc10time[i] = 0; + params.soc10ced[i] = params.soc10cec[i] = params.soc10odo[i] = -1; + params.soc10time[i] = 0; } for (int i = 0; i < 98; i++) { - this->params.cellVoltage[i] = 0; + params.cellVoltage[i] = 0; } - this->params.cellCount = 0; + params.cellCount = 0; for (int i = 0; i <= 100; i++) { - this->params.chargingGraphMinKw[i] = -1; - this->params.chargingGraphMaxKw[i] = -1; - this->params.chargingGraphBatMinTempC[i] = -100; - this->params.chargingGraphBatMaxTempC[i] = -100; - this->params.chargingGraphHeaterTempC[i] = -100; - this->params.chargingGraphWaterCoolantTempC[i] = -100; + params.chargingGraphMinKw[i] = -1; + params.chargingGraphMaxKw[i] = -1; + params.chargingGraphBatMinTempC[i] = -100; + params.chargingGraphBatMaxTempC[i] = -100; + params.chargingGraphHeaterTempC[i] = -100; + params.chargingGraphWaterCoolantTempC[i] = -100; } // Menu - this->menuItems = menuItemsSource; + menuItems = menuItemsSource; } /** @@ -134,21 +134,21 @@ float LiveData::hexToDec(String hexString, byte bytes, bool signedNum) { Convert km to km or miles */ float LiveData::km2distance(float inKm) { - return (this->settings.distanceUnit == 'k') ? inKm : inKm / 1.609344; + return (settings.distanceUnit == 'k') ? inKm : inKm / 1.609344; } /** Convert celsius to celsius or farenheit */ float LiveData::celsius2temperature(float inCelsius) { - return (this->settings.temperatureUnit == 'c') ? inCelsius : (inCelsius * 1.8) + 32; + return (settings.temperatureUnit == 'c') ? inCelsius : (inCelsius * 1.8) + 32; } /** Convert bar to bar or psi */ float LiveData::bar2pressure(float inBar) { - return (this->settings.pressureUnit == 'b') ? inBar : inBar * 14.503773800722; + return (settings.pressureUnit == 'b') ? inBar : inBar * 14.503773800722; }