migrated lot of stuff from Chainoiler-Project
This commit is contained in:
parent
8884e995ca
commit
ae29e23812
@ -12,6 +12,8 @@
|
||||
|
||||
#define HOST_NAME "AirsoftTimer_%08X"
|
||||
|
||||
#define SHUTDOWN_DELAY_MS 5000
|
||||
|
||||
#define GPIO_LORA_TX D3
|
||||
#define GPIO_LORA_RX D4
|
||||
#define GPIO_LORA_AUX D0
|
||||
|
@ -7,61 +7,63 @@ persistenceData_t PersistenceData;
|
||||
const uint16_t eeVersion = 1; // inc
|
||||
boolean eeAvailable = false;
|
||||
|
||||
const uint16_t persistencemarker_Adress = 0; // sizeof 4
|
||||
const uint16_t startofConfig_Adress = 16;
|
||||
const uint16_t startofPersistence_Adress = startofConfig_Adress + sizeof(ConfigData) + (sizeof(ConfigData) % 16);
|
||||
const uint16_t startofConfigData = 16;
|
||||
const uint16_t startofPersistence = 16 + sizeof(ConfigData) + (sizeof(ConfigData) % 16);
|
||||
|
||||
boolean checkEEPROMavailable();
|
||||
|
||||
void InitEEPROM()
|
||||
{
|
||||
ee.begin();
|
||||
if (!checkEEPROMavailable())
|
||||
{
|
||||
globals.systemStatus = sysStat_Error;
|
||||
MaintainDTC(DTC_NO_EEPROM_FOUND, true);
|
||||
return;
|
||||
}
|
||||
GetConfig_EEPROM();
|
||||
|
||||
if (ConfigData.EEPROM_Version != eeVersion)
|
||||
{
|
||||
FormatConfig_EEPROM();
|
||||
globals.systemStatus = sysStat_Error;
|
||||
MaintainDTC(DTC_EEPROM_VERSION_BAD, true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (getPersistanceAddress() > ee.getDeviceSize())
|
||||
{
|
||||
FormatPersistence_EEPROM();
|
||||
globals.systemStatus = sysStat_Error;
|
||||
MaintainDTC(DTC_EEPROM_PDS_MARKER_INVALID, true);
|
||||
return;
|
||||
}
|
||||
GetPersistence_EEPROM();
|
||||
checkEEPROMavailable();
|
||||
}
|
||||
|
||||
void EEPROM_Process()
|
||||
{
|
||||
|
||||
switch (globals.requestEEAction)
|
||||
{
|
||||
case EE_CFG_SAVE:
|
||||
StoreConfig_EEPROM();
|
||||
globals.requestEEAction = EE_IDLE;
|
||||
Serial.println("Stored EEPROM CFG");
|
||||
break;
|
||||
case EE_CFG_LOAD:
|
||||
GetConfig_EEPROM();
|
||||
globals.requestEEAction = EE_IDLE;
|
||||
Serial.println("Loaded EEPROM CFG");
|
||||
break;
|
||||
case EE_CFG_FORMAT:
|
||||
FormatConfig_EEPROM();
|
||||
globals.requestEEAction = EE_IDLE;
|
||||
globals.systemStatus = sysStat_Shutdown;
|
||||
Serial.println("Formated EEPROM CFG");
|
||||
break;
|
||||
case EE_PDS_SAVE:
|
||||
StorePersistence_EEPROM();
|
||||
globals.requestEEAction = EE_IDLE;
|
||||
Serial.println("Stored EEPROM PDS");
|
||||
break;
|
||||
case EE_PDS_LOAD:
|
||||
GetPersistence_EEPROM();
|
||||
globals.requestEEAction = EE_IDLE;
|
||||
Serial.println("Loaded EEPROM PDS");
|
||||
break;
|
||||
case EE_PDS_FORMAT:
|
||||
FormatPersistence_EEPROM();
|
||||
globals.requestEEAction = EE_IDLE;
|
||||
Serial.println("Formated EEPROM PDS");
|
||||
break;
|
||||
case EE_FORMAT_ALL:
|
||||
FormatConfig_EEPROM();
|
||||
FormatPersistence_EEPROM();
|
||||
globals.requestEEAction = EE_IDLE;
|
||||
Serial.println("Formated EEPROM ALL");
|
||||
break;
|
||||
case EE_ALL_SAVE:
|
||||
StorePersistence_EEPROM();
|
||||
StoreConfig_EEPROM();
|
||||
globals.requestEEAction = EE_IDLE;
|
||||
Serial.println("Stored EEPROM ALL");
|
||||
break;
|
||||
case EE_IDLE:
|
||||
default:
|
||||
@ -76,7 +78,7 @@ void StoreConfig_EEPROM()
|
||||
if (!checkEEPROMavailable())
|
||||
return;
|
||||
|
||||
ee.updateBlock(startofConfig_Adress, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||
ee.updateBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||
}
|
||||
|
||||
void GetConfig_EEPROM()
|
||||
@ -84,34 +86,29 @@ void GetConfig_EEPROM()
|
||||
if (!checkEEPROMavailable())
|
||||
return;
|
||||
|
||||
ee.readBlock(startofConfig_Adress, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||
ee.readBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||
|
||||
uint32_t checksum = ConfigData.checksum;
|
||||
ConfigData.checksum = 0;
|
||||
|
||||
if (Checksum_EEPROM((uint8_t *)&ConfigData, sizeof(ConfigData)) != checksum)
|
||||
{
|
||||
MaintainDTC(DTC_EEPROM_CFG_BAD, true);
|
||||
FormatConfig_EEPROM();
|
||||
MaintainDTC(DTC_EEPROM_CFG_BAD, DTC_CRITICAL, true);
|
||||
}
|
||||
ConfigData.checksum = checksum;
|
||||
}
|
||||
|
||||
uint32_t getPersistanceAddress()
|
||||
{
|
||||
uint32_t eePersistenceMarker;
|
||||
ee.readBlock(persistencemarker_Adress, (uint8_t *)&eePersistenceMarker, sizeof(eePersistenceMarker));
|
||||
return eePersistenceMarker;
|
||||
}
|
||||
uint32_t ConfigSanityCheckResult = ConfigSanityCheck(false);
|
||||
|
||||
void updatePersistanceAddress(uint32_t adress)
|
||||
{
|
||||
ee.updateBlock(persistencemarker_Adress, (uint8_t *)&adress, sizeof(adress));
|
||||
if (ConfigSanityCheckResult > 0)
|
||||
{
|
||||
MaintainDTC(DTC_EEPROM_CFG_SANITY, DTC_WARN, true, ConfigSanityCheckResult);
|
||||
globals.requestEEAction = EE_CFG_SAVE;
|
||||
}
|
||||
}
|
||||
|
||||
void StorePersistence_EEPROM()
|
||||
{
|
||||
if (PersistenceData.writeCycleCounter >= EEPROM_ENDURANCE)
|
||||
if (PersistenceData.writeCycleCounter >= 0xFFF0)
|
||||
MovePersistencePage_EEPROM(false);
|
||||
else
|
||||
PersistenceData.writeCycleCounter++;
|
||||
@ -122,7 +119,7 @@ void StorePersistence_EEPROM()
|
||||
if (!checkEEPROMavailable())
|
||||
return;
|
||||
|
||||
ee.updateBlock(getPersistanceAddress(), (uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
||||
ee.updateBlock(globals.eePersistanceAdress, (uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
||||
}
|
||||
|
||||
void GetPersistence_EEPROM()
|
||||
@ -130,32 +127,42 @@ void GetPersistence_EEPROM()
|
||||
if (!checkEEPROMavailable())
|
||||
return;
|
||||
|
||||
ee.readBlock(getPersistanceAddress(), (uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
||||
|
||||
uint32_t checksum = PersistenceData.checksum;
|
||||
PersistenceData.checksum = 0;
|
||||
|
||||
if (Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)) != checksum)
|
||||
ee.readBlock(0, (uint8_t *)&globals.eePersistanceAdress, sizeof(globals.eePersistanceAdress));
|
||||
// if we got the StartAdress of Persistance and it's out of Range - we Reset it and store defaults
|
||||
// otherwise we Read from eeprom and check if everything is correct
|
||||
if (globals.eePersistanceAdress < startofPersistence || globals.eePersistanceAdress > ee.getDeviceSize())
|
||||
{
|
||||
MaintainDTC(DTC_EEPROM_PDS_BAD, true);
|
||||
MovePersistencePage_EEPROM(true);
|
||||
FormatPersistence_EEPROM();
|
||||
MaintainDTC(DTC_EEPROM_PDSADRESS_BAD, DTC_CRITICAL, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ee.readBlock(globals.eePersistanceAdress, (uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
||||
|
||||
uint32_t checksum = PersistenceData.checksum;
|
||||
PersistenceData.checksum = 0;
|
||||
|
||||
if (Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)) != checksum)
|
||||
{
|
||||
MaintainDTC(DTC_EEPROM_PDS_BAD, DTC_CRITICAL, true);
|
||||
}
|
||||
PersistenceData.checksum = checksum;
|
||||
}
|
||||
PersistenceData.checksum = checksum;
|
||||
}
|
||||
|
||||
void FormatConfig_EEPROM()
|
||||
{
|
||||
configData_t defaults;
|
||||
ConfigData = defaults;
|
||||
Serial.println("Formatting Config-Partition");
|
||||
ConfigData = ConfigData_defaults;
|
||||
ConfigData.EEPROM_Version = eeVersion;
|
||||
StoreConfig_EEPROM();
|
||||
}
|
||||
|
||||
void FormatPersistence_EEPROM()
|
||||
{
|
||||
persistenceData_t defaults;
|
||||
PersistenceData = defaults;
|
||||
updatePersistanceAddress(startofPersistence_Adress);
|
||||
Serial.println("Formatting Persistance-Partition");
|
||||
memset(&PersistenceData, 0, sizeof(PersistenceData));
|
||||
StorePersistence_EEPROM();
|
||||
}
|
||||
|
||||
@ -164,31 +171,16 @@ void MovePersistencePage_EEPROM(boolean reset)
|
||||
if (!checkEEPROMavailable())
|
||||
return;
|
||||
|
||||
if (reset)
|
||||
{
|
||||
updatePersistanceAddress(startofPersistence_Adress);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32_t newPersistenceMarker = getPersistanceAddress() + sizeof(PersistenceData);
|
||||
globals.eePersistanceAdress = +sizeof(PersistenceData);
|
||||
PersistenceData.writeCycleCounter = 0;
|
||||
|
||||
// check if we reached the End of the EEPROM and Startover at the beginning
|
||||
if ((newPersistenceMarker + sizeof(PersistenceData)) > ee.getDeviceSize())
|
||||
{
|
||||
MaintainDTC(DTC_EEPROM_WORNOUT, true);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
updatePersistanceAddress(newPersistenceMarker);
|
||||
PersistenceData.writeCycleCounter = 0;
|
||||
}
|
||||
// check if we reached the End of the EEPROM and Startover at the beginning
|
||||
if ((globals.eePersistanceAdress + sizeof(PersistenceData)) > ee.getDeviceSize() || reset)
|
||||
{
|
||||
globals.eePersistanceAdress = startofPersistence;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t GetEESize()
|
||||
{
|
||||
return ee.getDeviceSize();
|
||||
ee.updateBlock(0, (uint8_t *)&globals.eePersistanceAdress, sizeof(globals.eePersistanceAdress));
|
||||
}
|
||||
|
||||
uint32_t Checksum_EEPROM(uint8_t const *data, size_t len)
|
||||
@ -214,12 +206,6 @@ void dumpEEPROM(uint16_t memoryAddress, uint16_t length)
|
||||
{
|
||||
#define BLOCK_TO_LENGTH 16
|
||||
|
||||
if (length > ee.getDeviceSize())
|
||||
length = ee.getDeviceSize();
|
||||
|
||||
if (memoryAddress + length > ee.getDeviceSize())
|
||||
return;
|
||||
|
||||
if (!checkEEPROMavailable())
|
||||
return;
|
||||
|
||||
@ -254,8 +240,24 @@ boolean checkEEPROMavailable()
|
||||
{
|
||||
if (!ee.isConnected())
|
||||
{
|
||||
MaintainDTC(DTC_NO_EEPROM_FOUND, true);
|
||||
MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, true);
|
||||
globals.systemStatus = sysStat_Error;
|
||||
return false;
|
||||
}
|
||||
MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32_t ConfigSanityCheck(bool autocorrect)
|
||||
{
|
||||
uint32_t setting_reset_bits = 0;
|
||||
|
||||
if ((ConfigData.batteryType != BATTERY_LIPO_2S) || (ConfigData.batteryType != BATTERY_LIPO_3S))
|
||||
{
|
||||
setting_reset_bits = setting_reset_bits | (1 << 0);
|
||||
if (autocorrect)
|
||||
ConfigData.batteryType = ConfigData_defaults.batteryType;
|
||||
}
|
||||
|
||||
return setting_reset_bits;
|
||||
}
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include "globals.h"
|
||||
#include "dtc.h"
|
||||
#include "common.h"
|
||||
|
||||
#define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC01
|
||||
#define EEPROM_ENDURANCE 1000000
|
||||
@ -49,6 +50,10 @@ typedef struct
|
||||
uint32_t checksum = 0;
|
||||
} configData_t;
|
||||
|
||||
const configData_t ConfigData_defaults = {
|
||||
0, BATTERY_LIPO_3S, 0
|
||||
};
|
||||
|
||||
void InitEEPROM();
|
||||
void EEPROM_Process();
|
||||
void StoreConfig_EEPROM();
|
||||
@ -60,9 +65,7 @@ void FormatPersistence_EEPROM();
|
||||
uint32_t Checksum_EEPROM(uint8_t const *data, size_t len);
|
||||
void dumpEEPROM(uint16_t memoryAddress, uint16_t length);
|
||||
void MovePersistencePage_EEPROM(boolean reset);
|
||||
uint32_t getPersistanceAddress();
|
||||
void updatePersistanceAddress(uint32_t adress);
|
||||
uint32_t GetEESize();
|
||||
uint32_t ConfigSanityCheck(bool autocorrect = false);
|
||||
|
||||
extern configData_t ConfigData;
|
||||
extern persistenceData_t PersistenceData;
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
DTCEntry_s DTCStorage[MAX_DTC_STORAGE];
|
||||
|
||||
void MaintainDTC(DTCNums_t DTC_no, boolean active)
|
||||
void MaintainDTC(DTCNums_t DTC_no, DTCSeverity_t DTC_severity, boolean active, uint32_t DebugValue)
|
||||
{
|
||||
for (int i = 0; i < MAX_DTC_STORAGE; i++)
|
||||
{
|
||||
@ -10,13 +10,15 @@ void MaintainDTC(DTCNums_t DTC_no, boolean active)
|
||||
{
|
||||
if (active && DTCStorage[i].active != DTC_ACTIVE)
|
||||
{
|
||||
Serial.printf("DTC gone active: %d", DTC_no);
|
||||
Serial.printf("DTC gone active: %d, DebugVal: %d\n", DTC_no, DebugValue);
|
||||
DTCStorage[i].timestamp = millis();
|
||||
DTCStorage[i].active = DTC_ACTIVE;
|
||||
DTCStorage[i].severity = DTC_severity;
|
||||
DTCStorage[i].debugVal = DebugValue;
|
||||
}
|
||||
if (!active && DTCStorage[i].active == DTC_ACTIVE)
|
||||
{
|
||||
Serial.printf("DTC gone previous: %d", DTC_no);
|
||||
Serial.printf("DTC gone previous: %d\n", DTC_no);
|
||||
DTCStorage[i].active = DTC_PREVIOUS;
|
||||
}
|
||||
return;
|
||||
@ -31,10 +33,11 @@ void MaintainDTC(DTCNums_t DTC_no, boolean active)
|
||||
{
|
||||
if (DTCStorage[i].Number == DTC_LAST_DTC)
|
||||
{
|
||||
Serial.printf("new DTC registered: %d", DTC_no);
|
||||
Serial.printf("new DTC registered: %d, DebugVal: %d\n", DTC_no, DebugValue);
|
||||
DTCStorage[i].Number = DTC_no;
|
||||
DTCStorage[i].timestamp = millis();
|
||||
DTCStorage[i].active = DTC_ACTIVE;
|
||||
DTCStorage[i].debugVal = DebugValue;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -81,5 +84,25 @@ DTCNums_t getlastDTC(boolean only_active)
|
||||
}
|
||||
}
|
||||
|
||||
return pointer >= 0 ? DTCStorage[pointer].Number : DTC_LAST_DTC;
|
||||
}
|
||||
|
||||
DTCNums_t getlastDTC_Severity(boolean only_active, DTCSeverity_t severity)
|
||||
{
|
||||
int8_t pointer = -1;
|
||||
uint32_t lasttimestamp = 0;
|
||||
|
||||
for (int i = 0; i < MAX_DTC_STORAGE; i++)
|
||||
{
|
||||
if (DTCStorage[i].Number > 0 && DTCStorage[i].timestamp > lasttimestamp)
|
||||
{
|
||||
if ((only_active == false || DTCStorage[i].active == DTC_ACTIVE) && DTCStorage[i].severity == severity)
|
||||
{
|
||||
pointer = i;
|
||||
lasttimestamp = DTCStorage[i].timestamp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return pointer >= 0 ? DTCStorage[pointer].Number : DTC_LAST_DTC;
|
||||
}
|
@ -10,9 +10,11 @@ typedef enum DTCNums_e
|
||||
DTC_NO_EEPROM_FOUND,
|
||||
DTC_EEPROM_CFG_BAD,
|
||||
DTC_EEPROM_PDS_BAD,
|
||||
DTC_EEPROM_PDSADRESS_BAD,
|
||||
DTC_EEPROM_VERSION_BAD,
|
||||
DTC_EEPROM_WORNOUT, // this will happen if the EEPROM-cells are all overwritten 1 million times!
|
||||
DTC_EEPROM_PDS_MARKER_INVALID, // This happens if the Marker of the PersistanceData was pointing to an EE-Adress bigger than the used EEPROM-IC
|
||||
DTC_FLASHFS_ERROR,
|
||||
DTC_FLASHFS_VERSION_ERROR,
|
||||
DTC_EEPROM_CFG_SANITY,
|
||||
DTC_LAST_DTC
|
||||
} DTCNums_t;
|
||||
|
||||
@ -23,17 +25,27 @@ typedef enum DTCActive_e
|
||||
DTC_NONE
|
||||
} DTCActive_t;
|
||||
|
||||
typedef enum DTCSeverity_e
|
||||
{
|
||||
DTC_INFO,
|
||||
DTC_WARN,
|
||||
DTC_CRITICAL
|
||||
} DTCSeverity_t;
|
||||
|
||||
typedef struct DTCEntry_s
|
||||
{
|
||||
DTCNums_t Number;
|
||||
uint32_t timestamp;
|
||||
DTCActive_t active;
|
||||
DTCSeverity_t severity;
|
||||
uint32_t debugVal;
|
||||
} DTCEntry_t;
|
||||
|
||||
void MaintainDTC(DTCNums_t DTC_no, boolean active);
|
||||
void MaintainDTC(DTCNums_t DTC_no, DTCSeverity_t DTC_severity, boolean active, uint32_t DebugValue = 0);
|
||||
void ClearDTC(DTCNums_t DTC_no);
|
||||
void ClearAllDTC();
|
||||
DTCNums_t getlastDTC(boolean only_active);
|
||||
DTCNums_t getlastDTC_Severity(boolean only_active, DTCSeverity_t severity);
|
||||
|
||||
extern DTCEntry_s DTCStorage[MAX_DTC_STORAGE];
|
||||
#endif
|
@ -16,18 +16,27 @@ typedef enum eEERequest
|
||||
EE_IDLE,
|
||||
EE_CFG_SAVE,
|
||||
EE_CFG_LOAD,
|
||||
EE_CFG_FORMAT,
|
||||
EE_PDS_SAVE,
|
||||
EE_PDS_LOAD
|
||||
EE_PDS_LOAD,
|
||||
EE_PDS_FORMAT,
|
||||
EE_FORMAT_ALL,
|
||||
EE_ALL_SAVE
|
||||
|
||||
} tEERequest;
|
||||
|
||||
typedef struct Globals_s
|
||||
{
|
||||
char DeviceName[33];
|
||||
char DeviceName_ID[43];
|
||||
char FlashVersion[10];
|
||||
tSystem_Status systemStatus = sysStat_Startup;
|
||||
tSystem_Status resumeStatus = sysStat_Startup;
|
||||
char systemStatustxt[16] = "";
|
||||
eEERequest requestEEAction = EE_IDLE;
|
||||
float loadvoltage = 0;
|
||||
uint16_t eePersistanceAdress;
|
||||
bool hasDTC;
|
||||
int loadvoltage_mV = 0;
|
||||
int battery_level = 0;
|
||||
} Globals_t;
|
||||
|
||||
|
161
Software/src/lora_net.cpp
Normal file
161
Software/src/lora_net.cpp
Normal file
@ -0,0 +1,161 @@
|
||||
#include "lora_net.h"
|
||||
|
||||
LoRa_E220 e220ttl(GPIO_LORA_TX, GPIO_LORA_RX, GPIO_LORA_AUX, 3, 4); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX AUX M0 M1
|
||||
|
||||
void printParameters(struct Configuration configuration);
|
||||
void printModuleInformation(struct ModuleInformation moduleInformation);
|
||||
|
||||
void InitLoRa(void (*MPinHelper)(int, int))
|
||||
{
|
||||
e220ttl.setMPins = MPinHelper;
|
||||
e220ttl.begin();
|
||||
|
||||
ResponseStructContainer c;
|
||||
c = e220ttl.getConfiguration();
|
||||
// It's important get configuration pointer before all other operation
|
||||
Configuration configuration = *(Configuration *)c.data;
|
||||
Serial.println(c.status.getResponseDescription());
|
||||
Serial.println(c.status.code);
|
||||
|
||||
ResponseStructContainer cMi;
|
||||
cMi = e220ttl.getModuleInformation();
|
||||
// It's important get information pointer before all other operation
|
||||
// ModuleInformation mi = *(ModuleInformation *)cMi.data;
|
||||
|
||||
Serial.println(cMi.status.getResponseDescription());
|
||||
Serial.println(cMi.status.code);
|
||||
|
||||
// ----------------------- DEFAULT TRANSPARENT WITH RSSI -----------------------
|
||||
configuration.ADDL = 0x02;
|
||||
configuration.ADDH = 0x00;
|
||||
|
||||
configuration.CHAN = 23;
|
||||
|
||||
configuration.SPED.uartBaudRate = UART_BPS_9600;
|
||||
configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
|
||||
configuration.SPED.uartParity = MODE_00_8N1;
|
||||
|
||||
configuration.OPTION.subPacketSetting = SPS_200_00;
|
||||
configuration.OPTION.RSSIAmbientNoise = RSSI_AMBIENT_NOISE_ENABLED;
|
||||
configuration.OPTION.transmissionPower = POWER_22;
|
||||
|
||||
configuration.TRANSMISSION_MODE.enableRSSI = RSSI_ENABLED;
|
||||
configuration.TRANSMISSION_MODE.fixedTransmission = FT_FIXED_TRANSMISSION;
|
||||
configuration.TRANSMISSION_MODE.enableLBT = LBT_ENABLED;
|
||||
configuration.TRANSMISSION_MODE.WORPeriod = WOR_2000_011;
|
||||
|
||||
// Set configuration changed and set to not hold the configuration
|
||||
ResponseStatus rs = e220ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE);
|
||||
Serial.println(rs.getResponseDescription());
|
||||
Serial.println(rs.code);
|
||||
c.close();
|
||||
|
||||
printParameters(configuration);
|
||||
}
|
||||
|
||||
void LoRa_Process()
|
||||
{
|
||||
if (e220ttl.available() > 1)
|
||||
{
|
||||
ResponseContainer rc = e220ttl.receiveMessageRSSI();
|
||||
// Is something goes wrong print error
|
||||
if (rc.status.code != 1)
|
||||
{
|
||||
Serial.println(rc.status.getResponseDescription());
|
||||
}
|
||||
else
|
||||
{
|
||||
// Print the data received
|
||||
Serial.println(rc.status.getResponseDescription());
|
||||
Serial.println(rc.data);
|
||||
Serial.print("RSSI: ");
|
||||
Serial.println(rc.rssi, DEC);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sendStatus_LoRa()
|
||||
{
|
||||
struct
|
||||
{
|
||||
MessageType_t type = "STATUS";
|
||||
MessageStatus_t status;
|
||||
} __attribute__((packed)) sendStatus;
|
||||
|
||||
sendStatus.status.nodeid = 0x0002;
|
||||
sendStatus.status.millis = millis();
|
||||
sendStatus.status.faction_active = 1;
|
||||
sendStatus.status.faction_1_timer = 0xBBBBBBBB;
|
||||
sendStatus.status.faction_2_timer = 0xCCCCCCCC;
|
||||
sendStatus.status.faction_3_timer = 0xDDDDDDDD;
|
||||
|
||||
ResponseStatus rs = e220ttl.sendFixedMessage(0xFF, 0xFF, 23, (byte *)&sendStatus, sizeof(sendStatus));
|
||||
Serial.println(rs.getResponseDescription());
|
||||
}
|
||||
|
||||
void printParameters(struct Configuration configuration)
|
||||
{
|
||||
Serial.println("----------------------------------------");
|
||||
|
||||
Serial.print(F("HEAD : "));
|
||||
Serial.print(configuration.COMMAND, HEX);
|
||||
Serial.print(" ");
|
||||
Serial.print(configuration.STARTING_ADDRESS, HEX);
|
||||
Serial.print(" ");
|
||||
Serial.println(configuration.LENGHT, HEX);
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("AddH : "));
|
||||
Serial.println(configuration.ADDH, HEX);
|
||||
Serial.print(F("AddL : "));
|
||||
Serial.println(configuration.ADDL, HEX);
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("Chan : "));
|
||||
Serial.print(configuration.CHAN, DEC);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.getChannelDescription());
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("SpeedParityBit : "));
|
||||
Serial.print(configuration.SPED.uartParity, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.SPED.getUARTParityDescription());
|
||||
Serial.print(F("SpeedUARTDatte : "));
|
||||
Serial.print(configuration.SPED.uartBaudRate, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.SPED.getUARTBaudRateDescription());
|
||||
Serial.print(F("SpeedAirDataRate : "));
|
||||
Serial.print(configuration.SPED.airDataRate, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.SPED.getAirDataRateDescription());
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("OptionSubPacketSett: "));
|
||||
Serial.print(configuration.OPTION.subPacketSetting, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.OPTION.getSubPacketSetting());
|
||||
Serial.print(F("OptionTranPower : "));
|
||||
Serial.print(configuration.OPTION.transmissionPower, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.OPTION.getTransmissionPowerDescription());
|
||||
Serial.print(F("OptionRSSIAmbientNo: "));
|
||||
Serial.print(configuration.OPTION.RSSIAmbientNoise, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.OPTION.getRSSIAmbientNoiseEnable());
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("TransModeWORPeriod : "));
|
||||
Serial.print(configuration.TRANSMISSION_MODE.WORPeriod, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.TRANSMISSION_MODE.getWORPeriodByParamsDescription());
|
||||
Serial.print(F("TransModeEnableLBT : "));
|
||||
Serial.print(configuration.TRANSMISSION_MODE.enableLBT, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.TRANSMISSION_MODE.getLBTEnableByteDescription());
|
||||
Serial.print(F("TransModeEnableRSSI: "));
|
||||
Serial.print(configuration.TRANSMISSION_MODE.enableRSSI, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.TRANSMISSION_MODE.getRSSIEnableByteDescription());
|
||||
Serial.print(F("TransModeFixedTrans: "));
|
||||
Serial.print(configuration.TRANSMISSION_MODE.fixedTransmission, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.TRANSMISSION_MODE.getFixedTransmissionDescription());
|
||||
|
||||
Serial.println("----------------------------------------");
|
||||
}
|
21
Software/src/lora_net.h
Normal file
21
Software/src/lora_net.h
Normal file
@ -0,0 +1,21 @@
|
||||
#ifndef _LORA_NET_H_
|
||||
#define _LORA_NET_H_
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <LoRa_E220.h>
|
||||
|
||||
// local includes
|
||||
#include "lora_messages.h"
|
||||
#include "defaults.h"
|
||||
#include "config.h"
|
||||
#include "globals.h"
|
||||
#include "dtc.h"
|
||||
#include "common.h"
|
||||
|
||||
#define FREQUENCY_868
|
||||
|
||||
void InitLoRa(void (*MPinHelper)(int, int));
|
||||
void LoRa_Process();
|
||||
void sendStatus_LoRa();
|
||||
|
||||
#endif
|
@ -1,29 +1,23 @@
|
||||
#define FREQUENCY_868
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <TM1637.h>
|
||||
#include <Ticker.h>
|
||||
#include <DNSServer.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESPAsyncTCP.h>
|
||||
#include <ESP8266mDNS.h>
|
||||
#include <ArduinoOTA.h>
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include <LittleFS.h>
|
||||
#include <PCF8574.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_INA219.h>
|
||||
#include <ArduinoJson.h>
|
||||
#include <LoRa_E220.h>
|
||||
|
||||
// local includes
|
||||
#include "lora_messages.h"
|
||||
#include "defaults.h"
|
||||
#include "webui.h"
|
||||
#include "config.h"
|
||||
#include "globals.h"
|
||||
#include "dtc.h"
|
||||
#include "common.h"
|
||||
#include "lora_net.h"
|
||||
|
||||
#ifdef WIFI_CLIENT
|
||||
#include <WiFiMulti.h>
|
||||
@ -37,27 +31,19 @@ WiFiMulti wifiMulti;
|
||||
|
||||
PCF8574 i2c_io(I2C_IO_ADDRESS);
|
||||
Adafruit_INA219 ina219;
|
||||
LoRa_E220 e220ttl(GPIO_LORA_TX, GPIO_LORA_RX, GPIO_LORA_AUX, 3, 4); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX AUX M0 M1
|
||||
|
||||
TM1637 disp_FAC_1(GPIO_7SEG_CLK, GPIO_7SEG_EN_FAC1);
|
||||
TM1637 disp_FAC_2(GPIO_7SEG_CLK, GPIO_7SEG_EN_FAC2);
|
||||
TM1637 disp_FAC_3(GPIO_7SEG_CLK, GPIO_7SEG_EN_FAC3);
|
||||
|
||||
#ifdef CAPTIVE
|
||||
DNSServer dnsServer;
|
||||
#endif
|
||||
AsyncWebServer server(80);
|
||||
|
||||
void printParameters(struct Configuration configuration);
|
||||
void printModuleInformation(struct ModuleInformation moduleInformation);
|
||||
void displayInfo();
|
||||
void SevenSeg_Output();
|
||||
void toggleWiFiAP(boolean shutdown = false);
|
||||
void SystemShutdown();
|
||||
void SetBatteryType(batteryType_t type);
|
||||
void ProcessKeyCombos(bool *btnState);
|
||||
void OverrideDisplay(const uint8_t *message, uint32_t time);
|
||||
uint32_t getESPChipID();
|
||||
void initGlobals();
|
||||
void setMPins_Helper(int pin, int status);
|
||||
|
||||
void tmrCallback_StatusSender();
|
||||
Ticker tmrStatusSender(tmrCallback_StatusSender, 30000, 0, MILLIS);
|
||||
@ -80,6 +66,13 @@ char DisplayOverrideValue[5] = {0};
|
||||
|
||||
Globals_t globals;
|
||||
|
||||
void initGlobals()
|
||||
{
|
||||
globals.requestEEAction = EE_IDLE;
|
||||
globals.resumeStatus = sysStat_Normal;
|
||||
globals.systemStatus = sysStat_Startup;
|
||||
}
|
||||
|
||||
void setMPins_Helper(int pin, int status)
|
||||
{
|
||||
i2c_io.write(pin, status);
|
||||
@ -88,19 +81,22 @@ void setMPins_Helper(int pin, int status)
|
||||
void setup()
|
||||
{
|
||||
system_update_cpu_freq(SYS_CPU_80MHZ);
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.print("\n\n\n");
|
||||
|
||||
#ifdef SERIAL_DEBUG
|
||||
Serial.setDebugOutput(true);
|
||||
#endif
|
||||
|
||||
strcpy(globals.DeviceName, DEVICE_NAME);
|
||||
snprintf(globals.DeviceName_ID, 42, "%s_%08X", globals.DeviceName, ESP.getChipId());
|
||||
WiFi.persistent(false);
|
||||
WiFi.disconnect();
|
||||
|
||||
strcpy(globals.DeviceName, DEVICE_NAME);
|
||||
snprintf(globals.DeviceName_ID, 42, "%s_%08X", globals.DeviceName, getESPChipID());
|
||||
Serial.begin(115200);
|
||||
Serial.setDebugOutput(false);
|
||||
|
||||
Serial.println("\n\nDark Emergency Timer - by Hiabuto Defense");
|
||||
Serial.println(globals.DeviceName);
|
||||
|
||||
ClearAllDTC(); // Init DTC-Storage
|
||||
|
||||
InitEEPROM();
|
||||
GetConfig_EEPROM();
|
||||
GetPersistence_EEPROM();
|
||||
|
||||
if (i2c_io.begin())
|
||||
{
|
||||
@ -121,54 +117,9 @@ void setup()
|
||||
Serial.print("INA219 not Initialized\n");
|
||||
}
|
||||
|
||||
e220ttl.setMPins = &setMPins_Helper;
|
||||
e220ttl.begin();
|
||||
|
||||
ResponseStructContainer c;
|
||||
c = e220ttl.getConfiguration();
|
||||
// It's important get configuration pointer before all other operation
|
||||
Configuration configuration = *(Configuration *)c.data;
|
||||
Serial.println(c.status.getResponseDescription());
|
||||
Serial.println(c.status.code);
|
||||
|
||||
ResponseStructContainer cMi;
|
||||
cMi = e220ttl.getModuleInformation();
|
||||
// It's important get information pointer before all other operation
|
||||
// ModuleInformation mi = *(ModuleInformation *)cMi.data;
|
||||
|
||||
Serial.println(cMi.status.getResponseDescription());
|
||||
Serial.println(cMi.status.code);
|
||||
|
||||
// ----------------------- DEFAULT TRANSPARENT WITH RSSI -----------------------
|
||||
configuration.ADDL = 0x02;
|
||||
configuration.ADDH = 0x00;
|
||||
|
||||
configuration.CHAN = 23;
|
||||
|
||||
configuration.SPED.uartBaudRate = UART_BPS_9600;
|
||||
configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
|
||||
configuration.SPED.uartParity = MODE_00_8N1;
|
||||
|
||||
configuration.OPTION.subPacketSetting = SPS_200_00;
|
||||
configuration.OPTION.RSSIAmbientNoise = RSSI_AMBIENT_NOISE_ENABLED;
|
||||
configuration.OPTION.transmissionPower = POWER_22;
|
||||
|
||||
configuration.TRANSMISSION_MODE.enableRSSI = RSSI_ENABLED;
|
||||
configuration.TRANSMISSION_MODE.fixedTransmission = FT_FIXED_TRANSMISSION;
|
||||
configuration.TRANSMISSION_MODE.enableLBT = LBT_ENABLED;
|
||||
configuration.TRANSMISSION_MODE.WORPeriod = WOR_2000_011;
|
||||
|
||||
// Set configuration changed and set to not hold the configuration
|
||||
ResponseStatus rs = e220ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE);
|
||||
Serial.println(rs.getResponseDescription());
|
||||
Serial.println(rs.code);
|
||||
c.close();
|
||||
|
||||
printParameters(configuration);
|
||||
InitLoRa(&setMPins_Helper);
|
||||
tmrStatusSender.start();
|
||||
|
||||
LittleFS.begin();
|
||||
|
||||
#ifdef WIFI_CLIENT
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.setHostname(globals.DeviceName_ID);
|
||||
@ -177,14 +128,9 @@ void setup()
|
||||
#else
|
||||
WiFi.mode(WIFI_AP);
|
||||
WiFi.begin(QUOTE(DEVICE_NAME), QUOTE(WIFI_AP_PASSWORD));
|
||||
#if defined(ESP32)
|
||||
WiFi.sleep(true);
|
||||
#endif
|
||||
WiFi.mode(WIFI_OFF);
|
||||
#endif
|
||||
|
||||
InitEEPROM();
|
||||
|
||||
ArduinoOTA.setPort(8266);
|
||||
ArduinoOTA.setHostname(globals.DeviceName_ID);
|
||||
ArduinoOTA.setPassword(QUOTE(ADMIN_PASSWORD));
|
||||
@ -236,6 +182,7 @@ void setup()
|
||||
#endif
|
||||
|
||||
initWebUI();
|
||||
initGlobals();
|
||||
|
||||
disp_FAC_1.init();
|
||||
disp_FAC_1.setBrightness(5);
|
||||
@ -247,30 +194,13 @@ void setup()
|
||||
tmrEEPROMCyclicPDS.start();
|
||||
tmrFactionTicker.start();
|
||||
tmrInputGetter.start();
|
||||
|
||||
Serial.println("Setup Done");
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
|
||||
if (e220ttl.available() > 1)
|
||||
{
|
||||
ResponseContainer rc = e220ttl.receiveMessageRSSI();
|
||||
// Is something goes wrong print error
|
||||
if (rc.status.code != 1)
|
||||
{
|
||||
Serial.println(rc.status.getResponseDescription());
|
||||
}
|
||||
else
|
||||
{
|
||||
// Print the data received
|
||||
Serial.println(rc.status.getResponseDescription());
|
||||
Serial.println(rc.data);
|
||||
Serial.print("RSSI: ");
|
||||
Serial.println(rc.rssi, DEC);
|
||||
}
|
||||
}
|
||||
|
||||
tmrEEPROMCyclicPDS.update();
|
||||
tmrFactionTicker.update();
|
||||
tmrInputGetter.update();
|
||||
@ -280,6 +210,7 @@ void loop()
|
||||
ArduinoOTA.handle();
|
||||
SevenSeg_Output();
|
||||
EEPROM_Process();
|
||||
LoRa_Process();
|
||||
|
||||
#ifdef CAPTIVE
|
||||
dnsServer.processNextRequest();
|
||||
@ -321,7 +252,7 @@ void SevenSeg_Output()
|
||||
if (millis() % 3000 < 1500)
|
||||
snprintf(sevenSegBuff, sizeof(sevenSegBuff), "%4d", globals.battery_level);
|
||||
else
|
||||
snprintf(sevenSegBuff, sizeof(sevenSegBuff), "%4s", String(globals.loadvoltage, 1).c_str());
|
||||
snprintf(sevenSegBuff, sizeof(sevenSegBuff), "%2d.%1d", (globals.loadvoltage_mV / 1000), ((globals.loadvoltage_mV % 1000) / 100));
|
||||
|
||||
disp_FAC_1.setBrightness(1);
|
||||
disp_FAC_1.display(" BAT");
|
||||
@ -423,90 +354,9 @@ void tmrCallback_InputGetter()
|
||||
}
|
||||
}
|
||||
|
||||
void printParameters(struct Configuration configuration)
|
||||
{
|
||||
Serial.println("----------------------------------------");
|
||||
|
||||
Serial.print(F("HEAD : "));
|
||||
Serial.print(configuration.COMMAND, HEX);
|
||||
Serial.print(" ");
|
||||
Serial.print(configuration.STARTING_ADDRESS, HEX);
|
||||
Serial.print(" ");
|
||||
Serial.println(configuration.LENGHT, HEX);
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("AddH : "));
|
||||
Serial.println(configuration.ADDH, HEX);
|
||||
Serial.print(F("AddL : "));
|
||||
Serial.println(configuration.ADDL, HEX);
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("Chan : "));
|
||||
Serial.print(configuration.CHAN, DEC);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.getChannelDescription());
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("SpeedParityBit : "));
|
||||
Serial.print(configuration.SPED.uartParity, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.SPED.getUARTParityDescription());
|
||||
Serial.print(F("SpeedUARTDatte : "));
|
||||
Serial.print(configuration.SPED.uartBaudRate, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.SPED.getUARTBaudRateDescription());
|
||||
Serial.print(F("SpeedAirDataRate : "));
|
||||
Serial.print(configuration.SPED.airDataRate, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.SPED.getAirDataRateDescription());
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("OptionSubPacketSett: "));
|
||||
Serial.print(configuration.OPTION.subPacketSetting, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.OPTION.getSubPacketSetting());
|
||||
Serial.print(F("OptionTranPower : "));
|
||||
Serial.print(configuration.OPTION.transmissionPower, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.OPTION.getTransmissionPowerDescription());
|
||||
Serial.print(F("OptionRSSIAmbientNo: "));
|
||||
Serial.print(configuration.OPTION.RSSIAmbientNoise, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.OPTION.getRSSIAmbientNoiseEnable());
|
||||
Serial.println(F(" "));
|
||||
Serial.print(F("TransModeWORPeriod : "));
|
||||
Serial.print(configuration.TRANSMISSION_MODE.WORPeriod, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.TRANSMISSION_MODE.getWORPeriodByParamsDescription());
|
||||
Serial.print(F("TransModeEnableLBT : "));
|
||||
Serial.print(configuration.TRANSMISSION_MODE.enableLBT, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.TRANSMISSION_MODE.getLBTEnableByteDescription());
|
||||
Serial.print(F("TransModeEnableRSSI: "));
|
||||
Serial.print(configuration.TRANSMISSION_MODE.enableRSSI, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.TRANSMISSION_MODE.getRSSIEnableByteDescription());
|
||||
Serial.print(F("TransModeFixedTrans: "));
|
||||
Serial.print(configuration.TRANSMISSION_MODE.fixedTransmission, BIN);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(configuration.TRANSMISSION_MODE.getFixedTransmissionDescription());
|
||||
|
||||
Serial.println("----------------------------------------");
|
||||
}
|
||||
|
||||
void tmrCallback_StatusSender()
|
||||
{
|
||||
struct
|
||||
{
|
||||
MessageType_t type = "STATUS";
|
||||
MessageStatus_t status;
|
||||
} __attribute__((packed)) sendStatus;
|
||||
|
||||
sendStatus.status.nodeid = 0x0002;
|
||||
sendStatus.status.millis = millis();
|
||||
sendStatus.status.faction_active = 1;
|
||||
sendStatus.status.faction_1_timer = 0xBBBBBBBB;
|
||||
sendStatus.status.faction_2_timer = 0xCCCCCCCC;
|
||||
sendStatus.status.faction_3_timer = 0xDDDDDDDD;
|
||||
|
||||
ResponseStatus rs = e220ttl.sendFixedMessage(0xFF, 0xFF, 23, (byte *)&sendStatus, sizeof(sendStatus));
|
||||
Serial.println(rs.getResponseDescription());
|
||||
sendStatus_LoRa();
|
||||
}
|
||||
|
||||
void tmrCallback_PowerMonitor()
|
||||
@ -528,15 +378,15 @@ void tmrCallback_PowerMonitor()
|
||||
busvoltage = ina219.getBusVoltage_V();
|
||||
// current_mA = ina219.getCurrent_mA();
|
||||
// power_mW = ina219.getPower_mW();
|
||||
globals.loadvoltage = busvoltage + (shuntvoltage / 1000);
|
||||
globals.loadvoltage_mV = (busvoltage * 1000) + shuntvoltage;
|
||||
switch (ConfigData.batteryType)
|
||||
{
|
||||
case BATTERY_LIPO_2S:
|
||||
battery_level = map(globals.loadvoltage * 100, bat_min_2s, bat_max_2s, 0, 100);
|
||||
battery_level = map(globals.loadvoltage_mV / 10, bat_min_2s, bat_max_2s, 0, 100);
|
||||
globals.battery_level = battery_level < 0 ? 0 : battery_level;
|
||||
break;
|
||||
case BATTERY_LIPO_3S:
|
||||
battery_level = map(globals.loadvoltage * 100, bat_min_3s, bat_max_3s, 0, 100);
|
||||
battery_level = map(globals.loadvoltage_mV / 10, bat_min_3s, bat_max_3s, 0, 100);
|
||||
globals.battery_level = battery_level < 0 ? 0 : battery_level;
|
||||
break;
|
||||
default:
|
||||
@ -547,7 +397,7 @@ void tmrCallback_PowerMonitor()
|
||||
// Serial.printf("Battery Level: %d %%\n", globals.battery_level);
|
||||
// Serial.printf("Bus Voltage: %f V\n", busvoltage);
|
||||
// Serial.printf("Shunt Voltage: %f mV\n", shuntvoltage);
|
||||
// Serial.printf("Load Voltage: %f V\n", globals.loadvoltage);
|
||||
// Serial.printf("Load Voltage: %d mV\n", globals.loadvoltage_mV;
|
||||
// Serial.printf("Current: %f mA\n", current_mA);
|
||||
// Serial.printf("Power: %f mW\n", power_mW);
|
||||
}
|
||||
@ -599,8 +449,19 @@ void toggleWiFiAP(boolean shutdown)
|
||||
|
||||
void SystemShutdown()
|
||||
{
|
||||
StoreConfig_EEPROM();
|
||||
ESP.restart();
|
||||
static uint32_t shutdown_delay = 0;
|
||||
|
||||
if (shutdown_delay == 0)
|
||||
{
|
||||
shutdown_delay = millis() + SHUTDOWN_DELAY_MS;
|
||||
Serial.printf("Shutdown requested - Restarting in %d seconds\n", SHUTDOWN_DELAY_MS / 1000);
|
||||
}
|
||||
if (shutdown_delay < millis())
|
||||
{
|
||||
StoreConfig_EEPROM();
|
||||
StorePersistence_EEPROM();
|
||||
ESP.restart();
|
||||
}
|
||||
}
|
||||
|
||||
void SetBatteryType(batteryType_t type)
|
||||
@ -619,20 +480,6 @@ void OverrideDisplay(const char *message, uint32_t time)
|
||||
strcpy(DisplayOverrideValue, message);
|
||||
}
|
||||
|
||||
uint32_t getESPChipID()
|
||||
{
|
||||
#if defined(ESP8266)
|
||||
return ESP.getChipId();
|
||||
#elif defined(ESP32)
|
||||
uint32_t chipId;
|
||||
for (int i = 0; i < 17; i = i + 8)
|
||||
{
|
||||
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
|
||||
}
|
||||
return chipId;
|
||||
#endif
|
||||
}
|
||||
|
||||
void ProcessKeyCombos(bool *btnState)
|
||||
{
|
||||
typedef enum
|
||||
|
@ -13,26 +13,52 @@ typedef enum
|
||||
char StatusResponseMessage[64];
|
||||
statusResponseMessage_Type_t StatusResponseMessage_Type = RESPMSG_INFO;
|
||||
|
||||
#ifdef CAPTIVE
|
||||
DNSServer dnsServer;
|
||||
#endif
|
||||
AsyncWebServer server(80);
|
||||
|
||||
String processor(const String &var);
|
||||
void WebserverPOST_Callback(AsyncWebServerRequest *request);
|
||||
void WebserverNotFound_Callback(AsyncWebServerRequest *request);
|
||||
void Webserver_Callback(AsyncWebServerRequest *request);
|
||||
void WebserverCommands_Callback(String input);
|
||||
void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final);
|
||||
void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final);
|
||||
void WebServerEEJSON_Callback(AsyncWebServerRequest *request);
|
||||
void GetFlashVersion(char *buff, size_t buff_size);
|
||||
|
||||
void initWebUI()
|
||||
{
|
||||
if (!LittleFS.begin())
|
||||
{
|
||||
Serial.println("An Error has occurred while mounting LittleFS");
|
||||
MaintainDTC(DTC_FLASHFS_ERROR, DTC_CRITICAL, true);
|
||||
return;
|
||||
}
|
||||
|
||||
GetFlashVersion(globals.FlashVersion, sizeof(globals.FlashVersion));
|
||||
|
||||
if (strcmp(globals.FlashVersion, QUOTE(FLASH_FS_VERSION)))
|
||||
{
|
||||
MaintainDTC(DTC_FLASHFS_VERSION_ERROR, DTC_WARN, true);
|
||||
}
|
||||
|
||||
MDNS.begin(globals.DeviceName);
|
||||
MDNS.addService("telnet", "tcp", 23);
|
||||
MDNS.addService("http", "tcp", 80);
|
||||
|
||||
webServer.serveStatic("/static/", LittleFS, "/static/").setCacheControl("max-age=360000");
|
||||
webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
|
||||
{ request->redirect("/index.htm"); });
|
||||
webServer.onNotFound(WebserverNotFound_Callback);
|
||||
webServer.on("/index.htm", HTTP_GET, Webserver_Callback);
|
||||
webServer.on("/index.htm", HTTP_POST, WebserverPOST_Callback);
|
||||
webServer.on("/post.htm", HTTP_POST, WebserverPOST_Callback);
|
||||
webServer.on("/eejson", HTTP_GET, WebServerEEJSON_Callback);
|
||||
webServer.on(
|
||||
"/doUpdate", HTTP_POST, [](AsyncWebServerRequest *request) {}, WebserverFirmwareUpdate_Callback);
|
||||
webServer.on(
|
||||
"/eeRestore", HTTP_POST, [](AsyncWebServerRequest *request) {}, WebserverEERestore_Callback);
|
||||
|
||||
webServer.begin();
|
||||
}
|
||||
@ -72,7 +98,7 @@ String processor(const String &var)
|
||||
return String(globals.DeviceName);
|
||||
|
||||
if (var == "BAT_VOLTAGE")
|
||||
return String(globals.loadvoltage);
|
||||
return String((float)globals.loadvoltage_mV / 1000.0);
|
||||
|
||||
if (var == "DTC_TABLE")
|
||||
{
|
||||
@ -161,7 +187,7 @@ String processor(const String &var)
|
||||
}
|
||||
if (var == "BATTERY_VOLTAGE")
|
||||
{
|
||||
return String(globals.loadvoltage);
|
||||
return String((float)globals.loadvoltage_mV / 1000.0);
|
||||
}
|
||||
|
||||
return String();
|
||||
@ -222,4 +248,138 @@ void WebserverCommands_Callback(String input)
|
||||
ConfigData.batteryType = BATTERY_LIPO_2S;
|
||||
globals.requestEEAction = EE_CFG_SAVE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GetFlashVersion(char *buff, size_t buff_size)
|
||||
{
|
||||
File this_file = LittleFS.open("version", "r");
|
||||
if (!this_file)
|
||||
{ // failed to open the file, retrn empty result
|
||||
buff[0] = '\0';
|
||||
return;
|
||||
}
|
||||
if (this_file.available())
|
||||
{
|
||||
int bytes_read;
|
||||
bytes_read = this_file.readBytesUntil('\r', buff, buff_size - 1);
|
||||
buff[bytes_read] = '\0';
|
||||
}
|
||||
this_file.close();
|
||||
}
|
||||
|
||||
void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final)
|
||||
{
|
||||
|
||||
if (!index)
|
||||
{
|
||||
Serial.println("Update");
|
||||
size_t content_len = request->contentLength();
|
||||
int cmd = (filename.indexOf(".fs") > -1) ? U_FS : U_FLASH;
|
||||
Update.runAsync(true);
|
||||
if (!Update.begin(content_len, cmd))
|
||||
{
|
||||
Update.printError(Serial);
|
||||
}
|
||||
}
|
||||
|
||||
if (Update.write(data, len) != len)
|
||||
{
|
||||
Update.printError(Serial);
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.printf("Progress: %d%%\n", (Update.progress() * 100) / Update.size());
|
||||
}
|
||||
|
||||
if (final)
|
||||
{
|
||||
AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "Please wait while the device reboots");
|
||||
response->addHeader("Refresh", "20");
|
||||
response->addHeader("Location", "/");
|
||||
request->send(response);
|
||||
if (!Update.end(true))
|
||||
{
|
||||
Update.printError(Serial);
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Update complete");
|
||||
Serial.flush();
|
||||
globals.systemStatus = sysStat_Shutdown;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final)
|
||||
{
|
||||
|
||||
bool ee_done = false;
|
||||
bool validext = false;
|
||||
|
||||
if (!index)
|
||||
{
|
||||
Serial.println("EEPROM restore");
|
||||
validext = (filename.indexOf(".ee.json") > -1);
|
||||
}
|
||||
|
||||
if (validext)
|
||||
{
|
||||
Serial.println("Restoring EEPROM-Stuff");
|
||||
}
|
||||
|
||||
if (final)
|
||||
{
|
||||
AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "Please wait while the device reboots");
|
||||
response->addHeader("Refresh", "20");
|
||||
response->addHeader("Location", "/");
|
||||
request->send(response);
|
||||
if (ee_done)
|
||||
{
|
||||
Serial.println("Update complete");
|
||||
Serial.flush();
|
||||
globals.systemStatus = sysStat_Shutdown;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WebServerEEJSON_Callback(AsyncWebServerRequest *request)
|
||||
{
|
||||
AsyncResponseStream *response = request->beginResponseStream("application/json");
|
||||
DynamicJsonDocument json(1024);
|
||||
JsonObject fwinfo = json.createNestedObject("info");
|
||||
|
||||
char buffer[16];
|
||||
|
||||
fwinfo["DeviceName"] = globals.DeviceName;
|
||||
fwinfo["FW-Version"] = QUOTE(SW_VERSION);
|
||||
fwinfo["FS-Version"] = globals.FlashVersion;
|
||||
|
||||
JsonObject config = json.createNestedObject("config");
|
||||
|
||||
config["EEPROM_Version"] = ConfigData.EEPROM_Version;
|
||||
|
||||
sprintf(buffer, "0x%08X", ConfigData.checksum);
|
||||
config["checksum"] = buffer;
|
||||
|
||||
JsonObject eepart = json.createNestedObject("eepart");
|
||||
|
||||
sprintf(buffer, "0x%04X", globals.eePersistanceAdress);
|
||||
eepart["PersistanceAddress"] = buffer;
|
||||
|
||||
JsonObject persis = json.createNestedObject("persis");
|
||||
|
||||
persis["writeCycleCounter"] = PersistenceData.writeCycleCounter;
|
||||
|
||||
sprintf(buffer, "0x%08X", PersistenceData.checksum);
|
||||
persis["checksum"] = buffer;
|
||||
|
||||
serializeJsonPretty(json, *response);
|
||||
|
||||
response->addHeader("Content-disposition", "attachment; filename=backup.ee.json");
|
||||
|
||||
request->send(response);
|
||||
}
|
@ -6,10 +6,15 @@
|
||||
#include <LittleFS.h>
|
||||
#include <ESPAsyncTCP.h>
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include <Updater.h>
|
||||
#include <ESP8266mDNS.h>
|
||||
#include <AsyncJson.h>
|
||||
#include <ArduinoJson.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "globals.h"
|
||||
#include "dtc.h"
|
||||
#include "defaults.h"
|
||||
#include "common.h"
|
||||
|
||||
void initWebUI();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user