Files
evDash/LiveData.h
2020-12-20 12:24:56 +01:00

247 lines
6.6 KiB
C++

#ifndef LIVEDATA_H
#define LIVEDATA_H
#include <Arduino.h>
#include <stdint.h>
#include <WString.h>
#include <string.h>
#include <sys/time.h>
#include <BLEDevice.h>
#include "config.h"
// SUPPORTED CARS
#define CAR_KIA_ENIRO_2020_64 0
#define CAR_HYUNDAI_KONA_2020_64 1
#define CAR_HYUNDAI_IONIQ_2018 2
#define CAR_KIA_ENIRO_2020_39 3
#define CAR_HYUNDAI_KONA_2020_39 4
#define CAR_RENAULT_ZOE 5
#define CAR_KIA_NIRO_PHEV 6
#define CAR_DEBUG_OBD2_KIA 999
//
#define COMM_TYPE_OBD2BLE4 0
#define COMM_TYPE_OBD2CAN 1
#define COMM_TYPE_OBD2BT3 2
// SCREENS
#define SCREEN_BLANK 0
#define SCREEN_AUTO 1
#define SCREEN_DASH 2
#define SCREEN_SPEED 3
#define SCREEN_CELLS 4
#define SCREEN_CHARGING 5
#define SCREEN_SOC10 6
// Structure with realtime values
typedef struct {
// System
time_t currentTime;
time_t chargingStartTime;
time_t automaticShutdownTimer;
// SIM
time_t lastDataSent;
bool sim800l_enabled;
// GPS
bool currTimeSyncWithGps;
float gpsLat;
float gpsLon;
byte gpsSat; // satellites count
int16_t gpsAlt;
// SD card
bool sdcardInit;
bool sdcardRecording;
char sdcardFilename[32];
// Car params
bool ignitionOn;
bool ignitionOnPrevious;
uint64_t operationTimeSec;
bool sdcardCanNotify;
bool forwardDriveMode;
bool reverseDriveMode;
bool parkModeOrNeutral;
bool headLights;
bool dayLights;
bool brakeLights;
uint8_t lightInfo;
uint8_t brakeLightInfo;
uint8_t espState;
float batteryTotalAvailableKWh;
float speedKmh;
float motorRpm;
float odoKm;
float socPerc;
float socPercPrevious;
float sohPerc;
float cumulativeEnergyChargedKWh;
float cumulativeEnergyChargedKWhStart;
float cumulativeEnergyDischargedKWh;
float cumulativeEnergyDischargedKWhStart;
float availableChargePower; // max regen
float availableDischargePower; // max power
float isolationResistanceKOhm;
float batPowerAmp;
float batPowerKw;
float batPowerKwh100;
float batVoltage;
float batCellMinV;
float batCellMaxV;
float batTempC;
float batHeaterC;
float batInletC;
float batFanStatus;
float batFanFeedbackHz;
float batMinC;
float batMaxC;
uint16_t batModuleTempCount;
float batModuleTempC[25];
float coolingWaterTempC;
float coolantTemp1C;
float coolantTemp2C;
float bmsUnknownTempA;
float bmsUnknownTempB;
float bmsUnknownTempC;
float bmsUnknownTempD;
float auxPerc;
float auxCurrentAmp;
float auxVoltage;
float indoorTemperature;
float outdoorTemperature;
float tireFrontLeftTempC;
float tireFrontLeftPressureBar;
float tireFrontRightTempC;
float tireFrontRightPressureBar;
float tireRearLeftTempC;
float tireRearLeftPressureBar;
float tireRearRightTempC;
float tireRearRightPressureBar;
uint16_t cellCount;
float cellVoltage[98]; // 1..98 has index 0..97
// Screen - charging graph
float chargingGraphMinKw[101]; // 0..100% .. Min power Kw
float chargingGraphMaxKw[101]; // 0..100% .. Max power Kw
float chargingGraphBatMinTempC[101]; // 0..100% .. Min bat.temp in.C
float chargingGraphBatMaxTempC[101]; // 0..100% .. Max bat.temp in.C
float chargingGraphHeaterTempC[101]; // 0..100% .. Heater temp in.C
float chargingGraphWaterCoolantTempC[101]; // 0..100% .. Heater temp in.C
// Screen - consumption info
float soc10ced[11]; // 0..10 (5%, 10%, 20%, 30%, 40%).. (never discharged soc% to 0)
float soc10cec[11]; // 0..10 (5%, 10%, 20%, 30%, 40%)..
float soc10odo[11]; // odo history
time_t soc10time[11]; // time for avg speed
// additional
char debugData[256];
char debugData2[256];
/*
uint8_t bmsMainRelay;
uint8_t highVoltageCharging;
float inverterCapacitorVoltage;
float normalChargePort;
float rapidChargePort;
;*/
} PARAMS_STRUC;
// Setting stored to flash
typedef struct {
byte initFlag; // 183 value
byte settingsVersion; // current 5
// === settings version 1
// =================================
uint16_t carType; // 0 - Kia eNiro 2020, 1 - Hyundai Kona 2020, 2 - Hyudai Ioniq 2018
char obdMacAddress[20];
char serviceUUID[40];
char charTxUUID[40];
char charRxUUID[40];
byte displayRotation; // 0 portrait, 1 landscape, 2.., 3..
char distanceUnit; // k - kilometers
char temperatureUnit; // c - celsius
char pressureUnit; // b - bar
// === settings version 3
// =================================
byte defaultScreen; // 1 .. 6
byte lcdBrightness; // 0 - auto, 1 .. 100%
byte debugScreen; // 0 - off, 1 - on
byte predrawnChargingGraphs; // 0 - off, 1 - on
// === settings version 4
// =================================
byte commType; // 0 - OBD2 BLE4 adapter, 1 - CAN, 2 - BT3
// Wifi
byte wifiEnabled; // 0/1
char wifiSsid[32];
char wifiPassword[32];
// NTP
byte ntpEnabled; // 0/1
byte ntpTimezone;
byte ntpDaySaveTime; // 0/1
// SDcard logging
byte sdcardEnabled; // 0/1
byte sdcardAutstartLog; // 0/1
// GPRS SIM800L
byte gprsEnabled; // 0/1
char gprsApn[64];
// Remote upload
byte remoteUploadEnabled; // 0/1
char remoteApiUrl[64];
char remoteApiKey[32];
//
byte headlightsReminder;
// === settings version 5
// =================================
byte gpsHwSerialPort; // 255-off, 0,1,2 - hw serial
//
} SETTINGS_STRUC;
//
class LiveData {
protected:
public:
// Command loop
uint16_t commandQueueCount;
uint16_t commandQueueLoopFrom;
String commandQueue[300];
String responseRow;
String responseRowMerged;
uint16_t commandQueueIndex;
bool canSendNextAtCommand = false;
String commandRequest = "";
String currentAtshRequest = "";
// Menu
bool menuVisible = false;
uint8_t menuItemsCount;
uint16_t menuCurrent = 0;
uint8_t menuItemSelected = 0;
uint8_t menuItemOffset = 0;
uint16_t scanningDeviceIndex = 0;
MENU_ITEM* menuItems;
// Bluetooth4
boolean bleConnect = true;
boolean bleConnected = false;
BLEAddress *pServerAddress;
BLERemoteCharacteristic* pRemoteCharacteristic;
BLERemoteCharacteristic* pRemoteCharacteristicWrite;
BLEAdvertisedDevice* foundMyBleDevice;
BLEClient* pClient;
BLEScan* pBLEScan;
// Params
PARAMS_STRUC params; // Realtime sensor values
// Settings
SETTINGS_STRUC settings, tmpSettings; // Settings stored into flash
//
void initParams();
float hexToDec(String hexString, byte bytes = 2, bool signedNum = true);
float hexToDecFromResponse(byte from, byte to, byte bytes = 2, bool signedNum = true);
float decFromResponse(byte from, byte to, char **str_end = 0, int base = 16);
float km2distance(float inKm);
float celsius2temperature(float inCelsius);
float bar2pressure(float inBar);
};
//
#endif // LIVEDATA_H