Compare commits
22 Commits
b8c79955a8
...
1.02
Author | SHA1 | Date | |
---|---|---|---|
e6f1283aae | |||
a92b1edfd9 | |||
4cce7c1c86 | |||
0a1625e9b8 | |||
c24829ed70 | |||
a102405596 | |||
1b7157dbdc | |||
cad34d6b84 | |||
701bf9f457 | |||
0a895a00b9 | |||
22a62e3d1e | |||
f48b5a09ed | |||
7f6c486eab | |||
3e77f89538 | |||
f33076a0a3 | |||
7e58db489d | |||
eb771d07d3 | |||
e2059cb587 | |||
6702154ef5 | |||
a899cf4dcf | |||
ea230bcee7 | |||
c059d7d085 |
@@ -77,31 +77,28 @@
|
|||||||
<hr />
|
<hr />
|
||||||
<p>
|
<p>
|
||||||
<h4>aktueller Punktestand</h4>
|
<h4>aktueller Punktestand</h4>
|
||||||
<div class="table-responsive">
|
<div class="container-fluid">
|
||||||
<table class="table table-borderless table-dark">
|
<div class="row">
|
||||||
<thead>
|
<div class="col text-center %FACTION_1_ACTIVE% text-white p-3">%NAME_FAC_1%</div>
|
||||||
<tr>
|
<div class="col text-center %FACTION_2_ACTIVE% text-white p-3">%NAME_FAC_2%</div>
|
||||||
<th class="text-center" scope="col">%NAME_FAC_1%</th>
|
<div class="col text-center %FACTION_3_ACTIVE% text-white p-3">%NAME_FAC_3%</div>
|
||||||
<th class="text-center" scope="col">%NAME_FAC_2%</th>
|
</div>
|
||||||
<th class="text-center" scope="col">%NAME_FAC_3%</th>
|
<div class="row">
|
||||||
</tr>
|
<div class="col bg-dark text-white p-3"><img src="static/img/logo_fac1.png"
|
||||||
</thead>
|
class="rounded mx-auto img-fluid d-block" alt="...">
|
||||||
<tbody>
|
</div>
|
||||||
<tr>
|
<div class="col bg-dark text-white p-3"><img src="static/img/logo_fac2.png"
|
||||||
<td class="mx-auto"><img src="static/img/logo_fac1.png" class="rounded mx-auto img-fluid d-block"
|
class="rounded mx-auto img-fluid d-block" alt="...">
|
||||||
alt="..."></td>
|
</div>
|
||||||
<td class="mx-auto"><img src="static/img/logo_fac2.png" class="rounded mx-auto img-fluid d-block"
|
<div class="col bg-dark text-white p-3"><img src="static/img/logo_fac3.png"
|
||||||
alt="..."></td>
|
class="rounded mx-auto img-fluid d-block" alt="...">
|
||||||
<td class="mx-auto"><img src="static/img/logo_fac3.png" class="rounded mx-auto img-fluid d-block"
|
</div>
|
||||||
alt="..."></td>
|
</div>
|
||||||
</tr>
|
<div class="row">
|
||||||
<tr>
|
<div class="col text-center bg-secondary text-white p-3">%POINTS_FAC_1%</div>
|
||||||
<td class="text-center">%POINTS_FAC_1%</td>
|
<div class="col text-center bg-secondary text-white p-3">%POINTS_FAC_2%</div>
|
||||||
<td class="text-center">%POINTS_FAC_2%</td>
|
<div class="col text-center bg-secondary text-white p-3">%POINTS_FAC_3%</div>
|
||||||
<td class="text-center">%POINTS_FAC_3%</td>
|
</div>
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
<!-- Div GroupFaction Points -->
|
<!-- Div GroupFaction Points -->
|
||||||
@@ -198,15 +195,14 @@
|
|||||||
<!-- Div Group Device Reboot -->
|
<!-- Div Group Device Reboot -->
|
||||||
</div>
|
</div>
|
||||||
<!-- Div Tab Maintenance -->
|
<!-- Div Tab Maintenance -->
|
||||||
|
|
||||||
<!-- Div Tab Settings-->
|
<!-- Div Tab Settings-->
|
||||||
<div id="tab_source" class="tab-pane fade" role="tabpanel">
|
<div id="tab_source" class="tab-pane fade" role="tabpanel">
|
||||||
<h3>Einstellungen</h3>
|
<h3>Einstellungen</h3>
|
||||||
<!-- Div Group Battery Type -->
|
<!-- Div Group Battery Type -->
|
||||||
<hr />
|
<hr />
|
||||||
<p>
|
<p>
|
||||||
<h4>Akku-Variante</h4>
|
|
||||||
<form action="post.htm" method="POST" class="form-horizontal">
|
<form action="post.htm" method="POST" class="form-horizontal">
|
||||||
|
<h4>Akku-Variante</h4>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="battery_select" class="control-label col-4">Akku</label>
|
<label for="battery_select" class="control-label col-4">Akku</label>
|
||||||
<div class="col-8">
|
<div class="col-8">
|
||||||
@@ -215,6 +211,60 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<h4>Timer-Einstellungen</h4>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="factionreboot_cont" class="control-label col-4">active Faction Recovery</label>
|
||||||
|
<div class="col-8">
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" name="factionreboot_cont" id="factionreboot_cont"
|
||||||
|
%FACTIONREBOOT_CHECKED%>
|
||||||
|
<label class="form-check-label" for="factionreboot_cont">
|
||||||
|
aktive Faktion beim booten wiederherstellen ?
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h4>Faktionsbezeichnungen</h4>
|
||||||
|
<div class="alert alert-primary alert-dismissable show fade" role="alert">
|
||||||
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
<strong>Achtung!</strong><br>
|
||||||
|
Faktionsbezeichnungen können nur aus ASCII-Zeichen bestehen, also A-Z, a-z und 0-9
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="faction_1_name" class="control-label col-4">Faktion 1</label>
|
||||||
|
<div class="col-8">
|
||||||
|
<div class="input-group">
|
||||||
|
<input id="faction_1_name" name="faction_1_name" value="%NAME_FAC_1%" type="text" class="form-control" pattern="[A-Za-z0-9 _-]{1,32}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">max 32 Zeichen</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="faction_2_name" class="control-label col-4">Faktion 2</label>
|
||||||
|
<div class="col-8">
|
||||||
|
<div class="input-group">
|
||||||
|
<input id="faction_2_name" name="faction_2_name" value="%NAME_FAC_2%" type="text" class="form-control" pattern="[A-Za-z0-9 _-]{1,32}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">max 32 Zeichen</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="faction_3_name" class="control-label col-4">Faktion 3</label>
|
||||||
|
<div class="col-8">
|
||||||
|
<div class="input-group">
|
||||||
|
<input id="faction_3_name" name="faction_3_name" value="%NAME_FAC_3%" type="text" class="form-control" pattern="[A-Za-z0-9 _-]{1,32}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">max 32 Zeichen</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="col text-center">
|
<div class="col text-center">
|
||||||
<button name="settingssave" type="submit" class="btn btn-outline-primary">Übernehmen</button>
|
<button name="settingssave" type="submit" class="btn btn-outline-primary">Übernehmen</button>
|
||||||
@@ -243,6 +293,18 @@
|
|||||||
<td>Hostname</td>
|
<td>Hostname</td>
|
||||||
<td>%HOSTNAME%</td>
|
<td>%HOSTNAME%</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Device-ID</td>
|
||||||
|
<td>%DEVICENAME_ID%</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Battery Voltage</td>
|
||||||
|
<td>%BAT_VOLTAGE%V</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Battery Remain</td>
|
||||||
|
<td>%BAT_REMAIN_CAPACITY%%</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</p>
|
</p>
|
||||||
<!-- Div Group Sysinfo:Geraeteinfo -->
|
<!-- Div Group Sysinfo:Geraeteinfo -->
|
||||||
@@ -260,6 +322,10 @@
|
|||||||
<td>Battery_type</td>
|
<td>Battery_type</td>
|
||||||
<td>%BATTERY_TYPE%</td>
|
<td>%BATTERY_TYPE%</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Faction_recovery</td>
|
||||||
|
<td>%FACTION_RECOVERY%</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>EEPROM Version</td>
|
<td>EEPROM Version</td>
|
||||||
<td>%EEPROM_VERSION%</td>
|
<td>%EEPROM_VERSION%</td>
|
||||||
@@ -423,7 +489,7 @@
|
|||||||
<div class="container-fluid text-center">
|
<div class="container-fluid text-center">
|
||||||
<div class="footer-copyright text-center py-3">
|
<div class="footer-copyright text-center py-3">
|
||||||
<span class="text-muted">© 2023 -
|
<span class="text-muted">© 2023 -
|
||||||
<a class="text-reset fw-bold" href="https://hiabuto.de/">Hiabuto Defence Systems</a></span>
|
<a class="text-reset fw-bold" href="https://hiabuto.de/">Hiabuto Defense Systems</a></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 34 KiB |
Binary file not shown.
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 37 KiB |
4
Software/data_src/static/tt_dtc/dtc_13.json
Normal file
4
Software/data_src/static/tt_dtc/dtc_13.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"title": "EEPROM-Migration failed",
|
||||||
|
"description": "Migration of EEPROM-Image from an other FW-Version failed - you need to reset everything manually!"
|
||||||
|
}
|
@@ -1 +1 @@
|
|||||||
1.01
|
1.02
|
@@ -19,6 +19,7 @@ typedef enum DTCNums_e
|
|||||||
DTC_NO_BATMNON_FOUND,
|
DTC_NO_BATMNON_FOUND,
|
||||||
DTC_BAT_LOW,
|
DTC_BAT_LOW,
|
||||||
DTC_BAT_CRITICAL,
|
DTC_BAT_CRITICAL,
|
||||||
|
DTC_EEPROM_MIGRATE_FAILED,
|
||||||
DTC_LAST_DTC
|
DTC_LAST_DTC
|
||||||
} DTCNums_t;
|
} DTCNums_t;
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
#ifndef _CONFIG_H_
|
#ifndef _EEPROM_H_
|
||||||
#define _CONFIG_H_
|
#define _EEPROM_H_
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
@@ -8,7 +8,9 @@
|
|||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "dtc.h"
|
#include "dtc.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "debugger.h"
|
||||||
|
|
||||||
|
#define I2C_EE_ADDRESS 0x50
|
||||||
#define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC64
|
#define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC64
|
||||||
#define EEPROM_ENDURANCE 1000000
|
#define EEPROM_ENDURANCE 1000000
|
||||||
|
|
||||||
@@ -30,6 +32,7 @@ typedef struct
|
|||||||
uint32_t checksum = 0;
|
uint32_t checksum = 0;
|
||||||
} persistenceData_t;
|
} persistenceData_t;
|
||||||
|
|
||||||
|
extern persistenceData_t PersistenceData;
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
BATTERY_UNDEFINED,
|
BATTERY_UNDEFINED,
|
||||||
@@ -40,22 +43,36 @@ typedef enum
|
|||||||
const char BatteryString[][10]{
|
const char BatteryString[][10]{
|
||||||
"Undefined",
|
"Undefined",
|
||||||
"LiPo 2S",
|
"LiPo 2S",
|
||||||
"LiPo 3S"
|
"LiPo 3S"};
|
||||||
};
|
|
||||||
|
|
||||||
const size_t BatteryString_Elements = sizeof(BatteryString) / sizeof(BatteryString[0]);
|
const size_t BatteryString_Elements = sizeof(BatteryString) / sizeof(BatteryString[0]);
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t EEPROM_Version = 1;
|
uint8_t EEPROM_Version;
|
||||||
batteryType_t batteryType = BATTERY_UNDEFINED;
|
batteryType_t batteryType;
|
||||||
uint32_t checksum = 0;
|
bool active_faction_on_reboot;
|
||||||
|
char Faction_1_Name[33];
|
||||||
|
char Faction_2_Name[33];
|
||||||
|
char Faction_3_Name[33];
|
||||||
|
uint32_t checksum;
|
||||||
} configData_t;
|
} configData_t;
|
||||||
|
|
||||||
|
extern configData_t ConfigData;
|
||||||
|
|
||||||
const configData_t ConfigData_defaults = {
|
const configData_t ConfigData_defaults = {
|
||||||
0, BATTERY_LIPO_3S, 0
|
2, // EEPROM_Version (incerease this if anything on Layout changes!)
|
||||||
|
BATTERY_LIPO_3S, // batteryType
|
||||||
|
false, // active_faction_on_reboot
|
||||||
|
"FACTION 1", // Faction_1_Name
|
||||||
|
"FACTION 2", // Faction_2_Name
|
||||||
|
"FACTION 3", // Faction_3_Name
|
||||||
|
0 // checksum
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const uint16_t startofConfigData = 16;
|
||||||
|
const uint16_t startofPersistence = 16 + sizeof(ConfigData) + (sizeof(ConfigData) % 16);
|
||||||
|
|
||||||
void InitEEPROM();
|
void InitEEPROM();
|
||||||
void EEPROM_Process();
|
void EEPROM_Process();
|
||||||
void StoreConfig_EEPROM();
|
void StoreConfig_EEPROM();
|
||||||
@@ -69,6 +86,4 @@ void dumpEEPROM(uint16_t memoryAddress, uint16_t length);
|
|||||||
void MovePersistencePage_EEPROM(boolean reset);
|
void MovePersistencePage_EEPROM(boolean reset);
|
||||||
uint32_t ConfigSanityCheck(bool autocorrect = false);
|
uint32_t ConfigSanityCheck(bool autocorrect = false);
|
||||||
|
|
||||||
extern configData_t ConfigData;
|
#endif // _EEPROM_H_
|
||||||
extern persistenceData_t PersistenceData;
|
|
||||||
#endif // _CONFIG_H_
|
|
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
typedef enum eSystem_Status
|
typedef enum eSystem_Status
|
||||||
{
|
{
|
||||||
|
sysStat_null,
|
||||||
sysStat_Startup,
|
sysStat_Startup,
|
||||||
sysStat_Normal,
|
sysStat_Normal,
|
||||||
sysStat_Error,
|
sysStat_Error,
|
||||||
@@ -12,6 +13,7 @@ typedef enum eSystem_Status
|
|||||||
} tSystem_Status;
|
} tSystem_Status;
|
||||||
|
|
||||||
const char sSystem_Status_txt[][9] = {
|
const char sSystem_Status_txt[][9] = {
|
||||||
|
"Null",
|
||||||
"Startup",
|
"Startup",
|
||||||
"Normal",
|
"Normal",
|
||||||
"Error",
|
"Error",
|
||||||
@@ -56,8 +58,8 @@ typedef struct Constants_s
|
|||||||
} Constants_t;
|
} Constants_t;
|
||||||
|
|
||||||
const Constants_t constants PROGMEM = {
|
const Constants_t constants PROGMEM = {
|
||||||
1,1, // Firmware_Version
|
1,2, // Firmware_Version
|
||||||
1,1, // Required Flash Version
|
1,2, // Required Flash Version
|
||||||
GIT_REV // Git-Hash-String
|
GIT_REV // Git-Hash-String
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
#include <Adafruit_GFX.h>
|
#include <Adafruit_GFX.h>
|
||||||
#include <Adafruit_SSD1306.h>
|
#include <Adafruit_SSD1306.h>
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "config.h"
|
#include "eeprom.h"
|
||||||
|
|
||||||
#define OLED_SDA 4
|
#define OLED_SDA 4
|
||||||
#define OLED_SCL 15
|
#define OLED_SCL 15
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
#include <AsyncJson.h>
|
#include <AsyncJson.h>
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "eeprom.h"
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "dtc.h"
|
#include "dtc.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
@@ -27,7 +27,7 @@ upload_speed = 921600
|
|||||||
build_flags=
|
build_flags=
|
||||||
!python git_rev_macro.py
|
!python git_rev_macro.py
|
||||||
-DATOMIC_FS_UPDATE
|
-DATOMIC_FS_UPDATE
|
||||||
-DFEATURE_ENABLE_WIFI_CLIENT
|
;-DFEATURE_ENABLE_WIFI_CLIENT
|
||||||
;-DFEATURE_ENABLE_LORA
|
;-DFEATURE_ENABLE_LORA
|
||||||
;-DCAPTIVE
|
;-DCAPTIVE
|
||||||
-DWIFI_AP_IP_GW=10,0,0,1
|
-DWIFI_AP_IP_GW=10,0,0,1
|
||||||
@@ -37,9 +37,6 @@ build_flags=
|
|||||||
-DWIFI_AP_SSID=${wifi_cred.wifi_ap_ssid}
|
-DWIFI_AP_SSID=${wifi_cred.wifi_ap_ssid}
|
||||||
-DWIFI_AP_PASSWORD=${wifi_cred.wifi_ap_password}
|
-DWIFI_AP_PASSWORD=${wifi_cred.wifi_ap_password}
|
||||||
-DDEVICE_NAME='"Dark Emergency Timer"'
|
-DDEVICE_NAME='"Dark Emergency Timer"'
|
||||||
-DFACTION_1_NAME='"GOF"'
|
|
||||||
-DFACTION_2_NAME='"KGG"'
|
|
||||||
-DFACTION_3_NAME='"MILIZ"'
|
|
||||||
|
|
||||||
;build_type = debug
|
;build_type = debug
|
||||||
|
|
||||||
|
@@ -293,7 +293,7 @@ void Debug_printHelp()
|
|||||||
{
|
{
|
||||||
char buff[64];
|
char buff[64];
|
||||||
|
|
||||||
for (int i = sizeof(helpCmd) / 63; i < sizeof(helpCmd) / 63; i++)
|
for (unsigned int i = sizeof(helpCmd) / 63; i < sizeof(helpCmd) / 63; i++)
|
||||||
{
|
{
|
||||||
memcpy_P(buff, (helpCmd + (i * 63)), 63);
|
memcpy_P(buff, (helpCmd + (i * 63)), 63);
|
||||||
buff[63] = 0;
|
buff[63] = 0;
|
||||||
|
@@ -1,25 +1,28 @@
|
|||||||
#include "config.h"
|
#include "eeprom.h"
|
||||||
|
|
||||||
I2C_eeprom ee(0x50, EEPROM_SIZE_BYTES);
|
I2C_eeprom ee(I2C_EE_ADDRESS, EEPROM_SIZE_BYTES);
|
||||||
|
|
||||||
configData_t ConfigData;
|
configData_t ConfigData;
|
||||||
persistenceData_t PersistenceData;
|
persistenceData_t PersistenceData;
|
||||||
const uint16_t eeVersion = 1; // inc
|
bool eeAvailable = false;
|
||||||
boolean eeAvailable = false;
|
|
||||||
|
|
||||||
const uint16_t startofConfigData = 16;
|
bool checkEEPROMavailable();
|
||||||
const uint16_t startofPersistence = 16 + sizeof(ConfigData) + (sizeof(ConfigData) % 16);
|
bool ValidateEEPROM_Version();
|
||||||
|
bool MigrateEEPROM(uint8_t fromVersion);
|
||||||
boolean checkEEPROMavailable();
|
|
||||||
|
|
||||||
void InitEEPROM()
|
void InitEEPROM()
|
||||||
{
|
{
|
||||||
ee.begin();
|
ee.begin();
|
||||||
checkEEPROMavailable();
|
eeAvailable = checkEEPROMavailable();
|
||||||
|
eeAvailable = ValidateEEPROM_Version();
|
||||||
|
Serial.printf("Initialized EEPROM at Address 0x%02X\n", I2C_EE_ADDRESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EEPROM_Process()
|
void EEPROM_Process()
|
||||||
{
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (globals.requestEEAction)
|
switch (globals.requestEEAction)
|
||||||
{
|
{
|
||||||
case EE_CFG_SAVE:
|
case EE_CFG_SAVE:
|
||||||
@@ -73,17 +76,18 @@ void EEPROM_Process()
|
|||||||
|
|
||||||
void StoreConfig_EEPROM()
|
void StoreConfig_EEPROM()
|
||||||
{
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return;
|
||||||
|
|
||||||
ConfigData.checksum = 0;
|
ConfigData.checksum = 0;
|
||||||
ConfigData.checksum = Checksum_EEPROM((uint8_t *)&ConfigData, sizeof(ConfigData));
|
ConfigData.checksum = Checksum_EEPROM((uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||||
if (!checkEEPROMavailable())
|
|
||||||
return;
|
|
||||||
|
|
||||||
ee.updateBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
ee.updateBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetConfig_EEPROM()
|
void GetConfig_EEPROM()
|
||||||
{
|
{
|
||||||
if (!checkEEPROMavailable())
|
if (eeAvailable == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ee.readBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
ee.readBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||||
@@ -108,6 +112,9 @@ void GetConfig_EEPROM()
|
|||||||
|
|
||||||
void StorePersistence_EEPROM()
|
void StorePersistence_EEPROM()
|
||||||
{
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return;
|
||||||
|
|
||||||
if (PersistenceData.writeCycleCounter >= 0xFFF0)
|
if (PersistenceData.writeCycleCounter >= 0xFFF0)
|
||||||
MovePersistencePage_EEPROM(false);
|
MovePersistencePage_EEPROM(false);
|
||||||
else
|
else
|
||||||
@@ -116,15 +123,12 @@ void StorePersistence_EEPROM()
|
|||||||
PersistenceData.checksum = 0;
|
PersistenceData.checksum = 0;
|
||||||
PersistenceData.checksum = Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
PersistenceData.checksum = Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
||||||
|
|
||||||
if (!checkEEPROMavailable())
|
|
||||||
return;
|
|
||||||
|
|
||||||
ee.updateBlock(globals.eePersistanceAdress, (uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
ee.updateBlock(globals.eePersistanceAdress, (uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetPersistence_EEPROM()
|
void GetPersistence_EEPROM()
|
||||||
{
|
{
|
||||||
if (!checkEEPROMavailable())
|
if (eeAvailable == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ee.readBlock(0, (uint8_t *)&globals.eePersistanceAdress, sizeof(globals.eePersistanceAdress));
|
ee.readBlock(0, (uint8_t *)&globals.eePersistanceAdress, sizeof(globals.eePersistanceAdress));
|
||||||
@@ -153,22 +157,29 @@ void GetPersistence_EEPROM()
|
|||||||
|
|
||||||
void FormatConfig_EEPROM()
|
void FormatConfig_EEPROM()
|
||||||
{
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return;
|
||||||
|
|
||||||
Serial.println("Formatting Config-Partition");
|
Serial.println("Formatting Config-Partition");
|
||||||
ConfigData = ConfigData_defaults;
|
ConfigData = ConfigData_defaults;
|
||||||
ConfigData.EEPROM_Version = eeVersion;
|
|
||||||
StoreConfig_EEPROM();
|
StoreConfig_EEPROM();
|
||||||
|
GetConfig_EEPROM();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormatPersistence_EEPROM()
|
void FormatPersistence_EEPROM()
|
||||||
{
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return;
|
||||||
|
|
||||||
Serial.println("Formatting Persistance-Partition");
|
Serial.println("Formatting Persistance-Partition");
|
||||||
memset(&PersistenceData, 0, sizeof(PersistenceData));
|
PersistenceData = {0};
|
||||||
StorePersistence_EEPROM();
|
StorePersistence_EEPROM();
|
||||||
|
GetPersistence_EEPROM();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MovePersistencePage_EEPROM(boolean reset)
|
void MovePersistencePage_EEPROM(boolean reset)
|
||||||
{
|
{
|
||||||
if (!checkEEPROMavailable())
|
if (eeAvailable == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
globals.eePersistanceAdress = +sizeof(PersistenceData);
|
globals.eePersistanceAdress = +sizeof(PersistenceData);
|
||||||
@@ -206,7 +217,7 @@ void dumpEEPROM(uint16_t memoryAddress, uint16_t length)
|
|||||||
{
|
{
|
||||||
#define BLOCK_TO_LENGTH 16
|
#define BLOCK_TO_LENGTH 16
|
||||||
|
|
||||||
if (!checkEEPROMavailable())
|
if (eeAvailable == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
char ascii_buf[BLOCK_TO_LENGTH + 1];
|
char ascii_buf[BLOCK_TO_LENGTH + 1];
|
||||||
@@ -236,15 +247,13 @@ void dumpEEPROM(uint16_t memoryAddress, uint16_t length)
|
|||||||
Serial.println();
|
Serial.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean checkEEPROMavailable()
|
bool checkEEPROMavailable()
|
||||||
{
|
{
|
||||||
if (!ee.isConnected())
|
if (!ee.isConnected())
|
||||||
{
|
{
|
||||||
MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, true);
|
MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, true);
|
||||||
globals.systemStatus = sysStat_Error;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, false);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,3 +270,89 @@ uint32_t ConfigSanityCheck(bool autocorrect)
|
|||||||
|
|
||||||
return setting_reset_bits;
|
return setting_reset_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ValidateEEPROM_Version()
|
||||||
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint8_t EEPROMVersionOnChip = ee.readByte(startofConfigData);
|
||||||
|
|
||||||
|
if (EEPROMVersionOnChip < ConfigData_defaults.EEPROM_Version)
|
||||||
|
{
|
||||||
|
Serial.printf("EEPROM Image Version is %d, but %d expected - trying to migrate\n", EEPROMVersionOnChip, ConfigData_defaults.EEPROM_Version);
|
||||||
|
if (!MigrateEEPROM(EEPROMVersionOnChip))
|
||||||
|
{
|
||||||
|
Serial.print("Error\n");
|
||||||
|
MaintainDTC(DTC_EEPROM_MIGRATE_FAILED, DTC_CRITICAL, true, EEPROMVersionOnChip);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.print("Success\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MigrateEEPROM(uint8_t fromVersion)
|
||||||
|
{
|
||||||
|
uint16_t persistanceMarker_onChip;
|
||||||
|
|
||||||
|
switch (fromVersion)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Version 1 EEPROM Layout: startAdress size (byte)
|
||||||
|
// const uint16_t startofConfigData = 16 16
|
||||||
|
// const uint16_t startofPersistence = 32 24
|
||||||
|
//
|
||||||
|
// typedef struct
|
||||||
|
// {
|
||||||
|
// uint8_t EEPROM_Version = 1; 16 1
|
||||||
|
// batteryType_t batteryType = BATTERY_UNDEFINED; 17 4
|
||||||
|
// bool active_faction_on_reboot = false; 21 1
|
||||||
|
// uint32_t checksum = 0; 22 4
|
||||||
|
// } configData_t;
|
||||||
|
//
|
||||||
|
// typedef struct offset
|
||||||
|
// {
|
||||||
|
// uint32_t writeCycleCounter = 0; 0 4
|
||||||
|
// uint32_t faction_1_timer = 0; 4 4
|
||||||
|
// uint32_t faction_2_timer = 0; 8 4
|
||||||
|
// uint32_t faction_3_timer = 0; 12 4
|
||||||
|
// factions_t activeFaction = NONE; 16 4
|
||||||
|
// uint32_t checksum = 0; 20 4
|
||||||
|
// } persistenceData_t;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
// Migrate Persistance-Data
|
||||||
|
ee.readBlock(0, (uint8_t *)&persistanceMarker_onChip, sizeof(uint16_t));
|
||||||
|
if (persistanceMarker_onChip < startofPersistence)
|
||||||
|
{
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 0, (uint8_t *)&PersistenceData.writeCycleCounter, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 4, (uint8_t *)&PersistenceData.faction_1_timer, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 8, (uint8_t *)&PersistenceData.faction_2_timer, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 12, (uint8_t *)&PersistenceData.faction_3_timer, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 16, (uint8_t *)&PersistenceData.activeFaction, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 20, (uint8_t *)&PersistenceData.checksum, 4);
|
||||||
|
MovePersistencePage_EEPROM(true);
|
||||||
|
StorePersistence_EEPROM();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Migrate Config-Data and set defaults for Values which doesn't exists in this earlier Version
|
||||||
|
ConfigData.EEPROM_Version = ConfigData_defaults.EEPROM_Version;
|
||||||
|
strncpy(ConfigData.Faction_1_Name, ConfigData_defaults.Faction_1_Name, sizeof(ConfigData.Faction_1_Name));
|
||||||
|
strncpy(ConfigData.Faction_2_Name, ConfigData_defaults.Faction_2_Name, sizeof(ConfigData.Faction_2_Name));
|
||||||
|
strncpy(ConfigData.Faction_3_Name, ConfigData_defaults.Faction_3_Name, sizeof(ConfigData.Faction_3_Name));
|
||||||
|
ee.readBlock(17, (uint8_t *)&ConfigData.batteryType, 4);
|
||||||
|
ee.readBlock(21, (uint8_t *)&ConfigData.active_faction_on_reboot, 1);
|
||||||
|
StoreConfig_EEPROM();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
@@ -45,8 +45,9 @@ void toggleWiFiAP(boolean shutdown = false);
|
|||||||
void SystemShutdown();
|
void SystemShutdown();
|
||||||
void SetBatteryType(batteryType_t type);
|
void SetBatteryType(batteryType_t type);
|
||||||
void ProcessKeyCombos(bool *btnState);
|
void ProcessKeyCombos(bool *btnState);
|
||||||
void OverrideDisplay(const uint8_t *message, uint32_t time);
|
void OverrideDisplay(uint32_t time, const char *message1, const char *message2, const char *message3);
|
||||||
void initGlobals();
|
void initGlobals();
|
||||||
|
void maintainSysStat();
|
||||||
|
|
||||||
#ifdef FEATURE_ENABLE_LORA
|
#ifdef FEATURE_ENABLE_LORA
|
||||||
void setMPins_Helper(int pin, int status);
|
void setMPins_Helper(int pin, int status);
|
||||||
@@ -69,7 +70,7 @@ Ticker tmrWiFiMaintainConnection(tmrCallback_WiFiMaintainConnection, 1000, 0, MI
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t DisplayOverrideFlag = 0;
|
uint32_t DisplayOverrideFlag = 0;
|
||||||
char DisplayOverrideValue[5] = {0};
|
char DisplayOverrideValue[3][5] = {0};
|
||||||
|
|
||||||
#ifdef FEATURE_ENABLE_LORA
|
#ifdef FEATURE_ENABLE_LORA
|
||||||
void setMPins_Helper(int pin, int status)
|
void setMPins_Helper(int pin, int status)
|
||||||
@@ -98,7 +99,6 @@ void setup()
|
|||||||
InitEEPROM();
|
InitEEPROM();
|
||||||
GetConfig_EEPROM();
|
GetConfig_EEPROM();
|
||||||
GetPersistence_EEPROM();
|
GetPersistence_EEPROM();
|
||||||
Serial.print("EE-Init done\n");
|
|
||||||
|
|
||||||
if (i2c_io.begin())
|
if (i2c_io.begin())
|
||||||
{
|
{
|
||||||
@@ -122,7 +122,7 @@ void setup()
|
|||||||
#ifdef FEATURE_ENABLE_LORA
|
#ifdef FEATURE_ENABLE_LORA
|
||||||
if (InitLoRa(&setMPins_Helper))
|
if (InitLoRa(&setMPins_Helper))
|
||||||
{
|
{
|
||||||
Serial.printf("Initialized LoRa_Transceiver");
|
Serial.print("Initialized LoRa_Transceiver\n");
|
||||||
tmrStatusSender.start();
|
tmrStatusSender.start();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -207,11 +207,15 @@ void setup()
|
|||||||
tmrFactionTicker.start();
|
tmrFactionTicker.start();
|
||||||
tmrInputGetter.start();
|
tmrInputGetter.start();
|
||||||
|
|
||||||
|
if (ConfigData.active_faction_on_reboot == false)
|
||||||
|
PersistenceData.activeFaction = NONE;
|
||||||
|
|
||||||
Serial.print("\nSetup Done\n");
|
Serial.print("\nSetup Done\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
|
maintainSysStat();
|
||||||
|
|
||||||
tmrEEPROMCyclicPDS.update();
|
tmrEEPROMCyclicPDS.update();
|
||||||
tmrFactionTicker.update();
|
tmrFactionTicker.update();
|
||||||
@@ -237,26 +241,6 @@ void loop()
|
|||||||
tmrWiFiMaintainConnection.update();
|
tmrWiFiMaintainConnection.update();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (globals.systemStatus)
|
|
||||||
{
|
|
||||||
case sysStat_Error:
|
|
||||||
/* code */
|
|
||||||
break;
|
|
||||||
case sysStat_Normal:
|
|
||||||
/* code */
|
|
||||||
break;
|
|
||||||
case sysStat_Shutdown:
|
|
||||||
SystemShutdown();
|
|
||||||
break;
|
|
||||||
case sysStat_Startup:
|
|
||||||
if (millis() > STARTUP_DELAY_MS)
|
|
||||||
globals.systemStatus = sysStat_Normal;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
yield();
|
yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,9 +261,9 @@ void SevenSeg_Output()
|
|||||||
disp_FAC_1.setBrightness(5);
|
disp_FAC_1.setBrightness(5);
|
||||||
disp_FAC_2.setBrightness(5);
|
disp_FAC_2.setBrightness(5);
|
||||||
disp_FAC_3.setBrightness(5);
|
disp_FAC_3.setBrightness(5);
|
||||||
disp_FAC_1.display(String(DisplayOverrideValue));
|
disp_FAC_1.display(String(DisplayOverrideValue[0]));
|
||||||
disp_FAC_2.clearScreen();
|
disp_FAC_2.display(String(DisplayOverrideValue[1]));
|
||||||
disp_FAC_3.clearScreen();
|
disp_FAC_3.display(String(DisplayOverrideValue[2]));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -305,16 +289,19 @@ void SevenSeg_Output()
|
|||||||
disp_FAC_1.refresh();
|
disp_FAC_1.refresh();
|
||||||
snprintf(sevenSegBuff, sizeof(sevenSegBuff), "%4d", PersistenceData.faction_1_timer / 60);
|
snprintf(sevenSegBuff, sizeof(sevenSegBuff), "%4d", PersistenceData.faction_1_timer / 60);
|
||||||
disp_FAC_1.display(String(sevenSegBuff), false, false);
|
disp_FAC_1.display(String(sevenSegBuff), false, false);
|
||||||
|
disp_FAC_1.setDp((PersistenceData.activeFaction == FACTION_1) && (millis() % 1000 > 500) ? 0x08 : 0x00);
|
||||||
|
|
||||||
disp_FAC_2.setBrightness(PersistenceData.activeFaction == FACTION_2 ? 5 : 1);
|
disp_FAC_2.setBrightness(PersistenceData.activeFaction == FACTION_2 ? 5 : 1);
|
||||||
disp_FAC_2.refresh();
|
disp_FAC_2.refresh();
|
||||||
snprintf(sevenSegBuff, sizeof(sevenSegBuff), "%4d", PersistenceData.faction_2_timer / 60);
|
snprintf(sevenSegBuff, sizeof(sevenSegBuff), "%4d", PersistenceData.faction_2_timer / 60);
|
||||||
disp_FAC_2.display(String(sevenSegBuff), false, false);
|
disp_FAC_2.display(String(sevenSegBuff), false, false);
|
||||||
|
disp_FAC_2.setDp((PersistenceData.activeFaction == FACTION_2) && (millis() % 1000 > 500) ? 0x08 : 0x00);
|
||||||
|
|
||||||
disp_FAC_3.setBrightness(PersistenceData.activeFaction == FACTION_3 ? 5 : 1);
|
disp_FAC_3.setBrightness(PersistenceData.activeFaction == FACTION_3 ? 5 : 1);
|
||||||
disp_FAC_3.refresh();
|
disp_FAC_3.refresh();
|
||||||
snprintf(sevenSegBuff, sizeof(sevenSegBuff), "%4d", PersistenceData.faction_3_timer / 60);
|
snprintf(sevenSegBuff, sizeof(sevenSegBuff), "%4d", PersistenceData.faction_3_timer / 60);
|
||||||
disp_FAC_3.display(String(sevenSegBuff), false, false);
|
disp_FAC_3.display(String(sevenSegBuff), false, false);
|
||||||
|
disp_FAC_3.setDp((PersistenceData.activeFaction == FACTION_3) && (millis() % 1000 > 500) ? 0x08 : 0x00);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -357,7 +344,7 @@ void tmrCallback_InputGetter()
|
|||||||
|
|
||||||
if (keysPressed > 1)
|
if (keysPressed > 1)
|
||||||
{
|
{
|
||||||
Serial.println("ERROR: More than one Flag active - setting no Faction active");
|
Debug_pushMessage("ERROR: More than one Flag active - setting no Faction active");
|
||||||
PersistenceData.activeFaction = NONE;
|
PersistenceData.activeFaction = NONE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -366,7 +353,8 @@ void tmrCallback_InputGetter()
|
|||||||
{
|
{
|
||||||
if (PersistenceData.activeFaction != FACTION_1)
|
if (PersistenceData.activeFaction != FACTION_1)
|
||||||
{
|
{
|
||||||
Serial.println("Faction 1 captured !");
|
Debug_pushMessage("Faction 1 captured !");
|
||||||
|
globals.requestEEAction = EE_PDS_SAVE;
|
||||||
}
|
}
|
||||||
PersistenceData.activeFaction = FACTION_1;
|
PersistenceData.activeFaction = FACTION_1;
|
||||||
}
|
}
|
||||||
@@ -375,7 +363,8 @@ void tmrCallback_InputGetter()
|
|||||||
{
|
{
|
||||||
if (PersistenceData.activeFaction != FACTION_2)
|
if (PersistenceData.activeFaction != FACTION_2)
|
||||||
{
|
{
|
||||||
Serial.println("Faction 2 captured !");
|
Debug_pushMessage("Faction 2 captured !");
|
||||||
|
globals.requestEEAction = EE_PDS_SAVE;
|
||||||
}
|
}
|
||||||
PersistenceData.activeFaction = FACTION_2;
|
PersistenceData.activeFaction = FACTION_2;
|
||||||
}
|
}
|
||||||
@@ -384,7 +373,8 @@ void tmrCallback_InputGetter()
|
|||||||
{
|
{
|
||||||
if (PersistenceData.activeFaction != FACTION_3)
|
if (PersistenceData.activeFaction != FACTION_3)
|
||||||
{
|
{
|
||||||
Serial.println("Faction 3 captured !");
|
Debug_pushMessage("Faction 3 captured !");
|
||||||
|
globals.requestEEAction = EE_PDS_SAVE;
|
||||||
}
|
}
|
||||||
PersistenceData.activeFaction = FACTION_3;
|
PersistenceData.activeFaction = FACTION_3;
|
||||||
}
|
}
|
||||||
@@ -524,10 +514,12 @@ void SetBatteryType(batteryType_t type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OverrideDisplay(const char *message, uint32_t time)
|
void OverrideDisplay(uint32_t time, const char *message1, const char *message2, const char *message3)
|
||||||
{
|
{
|
||||||
DisplayOverrideFlag = millis() + time;
|
DisplayOverrideFlag = millis() + time;
|
||||||
strcpy(DisplayOverrideValue, message);
|
strcpy(DisplayOverrideValue[0], message1);
|
||||||
|
strcpy(DisplayOverrideValue[1], message2);
|
||||||
|
strcpy(DisplayOverrideValue[2], message3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProcessKeyCombos(bool *btnState)
|
void ProcessKeyCombos(bool *btnState)
|
||||||
@@ -572,20 +564,20 @@ void ProcessKeyCombos(bool *btnState)
|
|||||||
if (btnState[0] != FAC_1_TRG_PRESSED && keyStatus_Fac1 == KEY_PRESSED)
|
if (btnState[0] != FAC_1_TRG_PRESSED && keyStatus_Fac1 == KEY_PRESSED)
|
||||||
{
|
{
|
||||||
if (keyCount_Fac2 > 0 || keyCount_Fac3 > 0)
|
if (keyCount_Fac2 > 0 || keyCount_Fac3 > 0)
|
||||||
Serial.printf("KeyCombo 2: %d | 3: %d\n", keyCount_Fac2, keyCount_Fac3);
|
Debug_pushMessage("KeyCombo 2: %d | 3: %d\n", keyCount_Fac2, keyCount_Fac3);
|
||||||
|
|
||||||
if (keyCount_Fac2 == 2 && keyCount_Fac3 == 0)
|
if (keyCount_Fac2 == 2 && keyCount_Fac3 == 0)
|
||||||
{
|
{
|
||||||
Serial.println("KeyCombo: WiFi AP ON");
|
Debug_pushMessage("KeyCombo: WiFi AP ON");
|
||||||
OverrideDisplay("NET ", 5000);
|
OverrideDisplay(5000, "NET ", " ", " ");
|
||||||
toggleWiFiAP(false);
|
toggleWiFiAP(false);
|
||||||
}
|
}
|
||||||
else if (keyCount_Fac2 == 4 && keyCount_Fac3 == 0)
|
else if (keyCount_Fac2 == 4 && keyCount_Fac3 == 0)
|
||||||
{
|
{
|
||||||
Serial.printf("KeyCombo: Reset Timer\n");
|
Debug_pushMessage("KeyCombo: Reset Timer\n");
|
||||||
if (globals.systemStatus == sysStat_Startup)
|
if (globals.systemStatus == sysStat_Startup)
|
||||||
{
|
{
|
||||||
OverrideDisplay("RST ", 5000);
|
OverrideDisplay(5000, "RST ", " ", " ");
|
||||||
PersistenceData.faction_1_timer = 0;
|
PersistenceData.faction_1_timer = 0;
|
||||||
PersistenceData.faction_2_timer = 0;
|
PersistenceData.faction_2_timer = 0;
|
||||||
PersistenceData.faction_3_timer = 0;
|
PersistenceData.faction_3_timer = 0;
|
||||||
@@ -594,8 +586,8 @@ void ProcessKeyCombos(bool *btnState)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OverrideDisplay("ERR ", 5000);
|
OverrideDisplay(5000, "ERR ", " ", " ");
|
||||||
Serial.printf("ERROR: only %d seconds after Startup!\n", STARTUP_DELAY_MS / 1000);
|
Debug_pushMessage("ERROR: only %d seconds after Startup!\n", STARTUP_DELAY_MS / 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -606,3 +598,51 @@ void ProcessKeyCombos(bool *btnState)
|
|||||||
keyStatus_Fac3 = KEY_RELEASED;
|
keyStatus_Fac3 = KEY_RELEASED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void maintainSysStat()
|
||||||
|
{
|
||||||
|
|
||||||
|
static tSystem_Status lastStat = sysStat_null;
|
||||||
|
|
||||||
|
// system Status Transistions
|
||||||
|
switch (globals.systemStatus)
|
||||||
|
{
|
||||||
|
case sysStat_Shutdown:
|
||||||
|
SystemShutdown();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case sysStat_Startup:
|
||||||
|
if (millis() > STARTUP_DELAY_MS)
|
||||||
|
globals.systemStatus = sysStat_Normal;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case sysStat_Error:
|
||||||
|
case sysStat_Normal:
|
||||||
|
case sysStat_null:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// system Status Changed Actions
|
||||||
|
if (lastStat != globals.systemStatus)
|
||||||
|
{
|
||||||
|
switch (globals.systemStatus)
|
||||||
|
{
|
||||||
|
case sysStat_Shutdown:
|
||||||
|
OverrideDisplay(SHUTDOWN_DELAY_MS, " re", "boot", " ");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case sysStat_Startup:
|
||||||
|
OverrideDisplay(STARTUP_DELAY_MS, "star", "t up", " ");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case sysStat_Error:
|
||||||
|
case sysStat_Normal:
|
||||||
|
case sysStat_null:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastStat = globals.systemStatus;
|
||||||
|
}
|
||||||
|
}
|
@@ -33,10 +33,10 @@ void OLED_Process()
|
|||||||
display.setCursor(0, 0);
|
display.setCursor(0, 0);
|
||||||
display.printf("LiPo: %d%%\n", globals.battery_level);
|
display.printf("LiPo: %d%%\n", globals.battery_level);
|
||||||
display.print(PersistenceData.activeFaction == FACTION_1 ? "> " : " ");
|
display.print(PersistenceData.activeFaction == FACTION_1 ? "> " : " ");
|
||||||
display.printf("%-5s: %02d:%02d:%02d\n", FACTION_1_NAME, PersistenceData.faction_1_timer / 3600, (PersistenceData.faction_1_timer / 60) % 60, PersistenceData.faction_1_timer % 60);
|
display.printf("%-5s: %02d:%02d:%02d\n", PersistenceData.faction_1_timer, PersistenceData.faction_1_timer / 3600, (PersistenceData.faction_1_timer / 60) % 60, PersistenceData.faction_1_timer % 60);
|
||||||
display.print(PersistenceData.activeFaction == FACTION_2 ? "> " : " ");
|
display.print(PersistenceData.activeFaction == FACTION_2 ? "> " : " ");
|
||||||
display.printf("%-5s: %02d:%02d:%02d\n", FACTION_2_NAME, PersistenceData.faction_2_timer / 3600, (PersistenceData.faction_2_timer / 60) % 60, PersistenceData.faction_2_timer % 60);
|
display.printf("%-5s: %02d:%02d:%02d\n", PersistenceData.faction_2_timer, PersistenceData.faction_2_timer / 3600, (PersistenceData.faction_2_timer / 60) % 60, PersistenceData.faction_2_timer % 60);
|
||||||
display.print(PersistenceData.activeFaction == FACTION_3 ? "> " : " ");
|
display.print(PersistenceData.activeFaction == FACTION_3 ? "> " : " ");
|
||||||
display.printf("%-5s: %02d:%02d:%02d\n", FACTION_3_NAME, PersistenceData.faction_3_timer / 3600, (PersistenceData.faction_3_timer / 60) % 60, PersistenceData.faction_3_timer % 60);
|
display.printf("%-5s: %02d:%02d:%02d\n", PersistenceData.faction_3_timer, PersistenceData.faction_3_timer / 3600, (PersistenceData.faction_3_timer / 60) % 60, PersistenceData.faction_3_timer % 60);
|
||||||
display.display();
|
display.display();
|
||||||
}
|
}
|
@@ -84,6 +84,8 @@ String processor(const String &var)
|
|||||||
return String(globals.battery_level);
|
return String(globals.battery_level);
|
||||||
if (var == "DEVICENAME")
|
if (var == "DEVICENAME")
|
||||||
return String(globals.DeviceName);
|
return String(globals.DeviceName);
|
||||||
|
if (var == "DEVICENAME_ID")
|
||||||
|
return String(globals.DeviceName_ID);
|
||||||
if (var == "BATTERY_TYPE")
|
if (var == "BATTERY_TYPE")
|
||||||
return String(ConfigData.batteryType);
|
return String(ConfigData.batteryType);
|
||||||
if (var == "BAT_VOLTAGE")
|
if (var == "BAT_VOLTAGE")
|
||||||
@@ -180,14 +182,21 @@ String processor(const String &var)
|
|||||||
if (var == "ACTIVE_FACTION")
|
if (var == "ACTIVE_FACTION")
|
||||||
return String(PersistenceData.activeFaction);
|
return String(PersistenceData.activeFaction);
|
||||||
|
|
||||||
|
if (var == "FACTION_1_ACTIVE")
|
||||||
|
return String(PersistenceData.activeFaction == FACTION_1 ? "bg-primary" : "bg-secondary");
|
||||||
|
if (var == "FACTION_2_ACTIVE")
|
||||||
|
return String(PersistenceData.activeFaction == FACTION_2 ? "bg-primary" : "bg-secondary");
|
||||||
|
if (var == "FACTION_3_ACTIVE")
|
||||||
|
return String(PersistenceData.activeFaction == FACTION_3 ? "bg-primary" : "bg-secondary");
|
||||||
|
|
||||||
if (var == "NAME_FAC_1")
|
if (var == "NAME_FAC_1")
|
||||||
return FACTION_1_NAME;
|
return String(ConfigData.Faction_1_Name);
|
||||||
|
|
||||||
if (var == "NAME_FAC_2")
|
if (var == "NAME_FAC_2")
|
||||||
return FACTION_2_NAME;
|
return String(ConfigData.Faction_2_Name);
|
||||||
|
|
||||||
if (var == "NAME_FAC_3")
|
if (var == "NAME_FAC_3")
|
||||||
return FACTION_3_NAME;
|
return String(ConfigData.Faction_3_Name);
|
||||||
|
|
||||||
if (var == "BATTERY_SELECT_OPTIONS")
|
if (var == "BATTERY_SELECT_OPTIONS")
|
||||||
{
|
{
|
||||||
@@ -200,6 +209,12 @@ String processor(const String &var)
|
|||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (var == "FACTIONREBOOT_CHECKED")
|
||||||
|
return String(ConfigData.active_faction_on_reboot == true ? "checked" : "");
|
||||||
|
|
||||||
|
if (var == "FACTION_RECOVERY")
|
||||||
|
return String(ConfigData.active_faction_on_reboot);
|
||||||
|
|
||||||
return String();
|
return String();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,6 +271,30 @@ void WebserverPOST_Callback(AsyncWebServerRequest *request)
|
|||||||
ConfigData.batteryType = temp;
|
ConfigData.batteryType = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (request->hasParam("factionreboot_cont", true))
|
||||||
|
{
|
||||||
|
AsyncWebParameter *param = request->getParam("factionreboot_cont", true);
|
||||||
|
if (param->value() == "on")
|
||||||
|
ConfigData.active_faction_on_reboot = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ConfigData.active_faction_on_reboot = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p->name() == "faction_1_name")
|
||||||
|
{
|
||||||
|
strncpy(ConfigData.Faction_1_Name, p->value().c_str(), sizeof(ConfigData.Faction_1_Name));
|
||||||
|
}
|
||||||
|
if (p->name() == "faction_2_name")
|
||||||
|
{
|
||||||
|
strncpy(ConfigData.Faction_2_Name, p->value().c_str(), sizeof(ConfigData.Faction_2_Name));
|
||||||
|
}
|
||||||
|
if (p->name() == "faction_3_name")
|
||||||
|
{
|
||||||
|
strncpy(ConfigData.Faction_3_Name, p->value().c_str(), sizeof(ConfigData.Faction_3_Name));
|
||||||
|
}
|
||||||
|
|
||||||
if (p->name() == "settingssave")
|
if (p->name() == "settingssave")
|
||||||
globals.requestEEAction = EE_CFG_SAVE;
|
globals.requestEEAction = EE_CFG_SAVE;
|
||||||
// end: POST Form Settings
|
// end: POST Form Settings
|
||||||
@@ -368,6 +407,9 @@ void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &f
|
|||||||
|
|
||||||
ConfigData.batteryType = (batteryType_t)doc["config"]["batteryType"].as<uint32_t>();
|
ConfigData.batteryType = (batteryType_t)doc["config"]["batteryType"].as<uint32_t>();
|
||||||
ConfigData.EEPROM_Version = doc["config"]["EEPROM_Version"].as<uint32_t>();
|
ConfigData.EEPROM_Version = doc["config"]["EEPROM_Version"].as<uint32_t>();
|
||||||
|
strncpy(ConfigData.Faction_1_Name, doc["config"]["Faction_1_Name"].as<String>().c_str(), sizeof(ConfigData.Faction_1_Name));
|
||||||
|
strncpy(ConfigData.Faction_2_Name, doc["config"]["Faction_2_Name"].as<String>().c_str(), sizeof(ConfigData.Faction_2_Name));
|
||||||
|
strncpy(ConfigData.Faction_3_Name, doc["config"]["Faction_3_Name"].as<String>().c_str(), sizeof(ConfigData.Faction_3_Name));
|
||||||
|
|
||||||
PersistenceData.writeCycleCounter = doc["persis"]["writeCycleCounter"].as<uint16_t>();
|
PersistenceData.writeCycleCounter = doc["persis"]["writeCycleCounter"].as<uint16_t>();
|
||||||
PersistenceData.activeFaction = (factions_t)doc["persis"]["activeFaction"].as<uint32_t>();
|
PersistenceData.activeFaction = (factions_t)doc["persis"]["activeFaction"].as<uint32_t>();
|
||||||
@@ -417,6 +459,9 @@ void WebServerEEJSON_Callback(AsyncWebServerRequest *request)
|
|||||||
|
|
||||||
config["EEPROM_Version"] = ConfigData.EEPROM_Version;
|
config["EEPROM_Version"] = ConfigData.EEPROM_Version;
|
||||||
config["batteryType"] = ConfigData.batteryType;
|
config["batteryType"] = ConfigData.batteryType;
|
||||||
|
config["Faction_1_Name"] = ConfigData.Faction_1_Name;
|
||||||
|
config["Faction_2_Name"] = ConfigData.Faction_2_Name;
|
||||||
|
config["Faction_3_Name"] = ConfigData.Faction_3_Name;
|
||||||
sprintf(buffer, "0x%08X", ConfigData.checksum);
|
sprintf(buffer, "0x%08X", ConfigData.checksum);
|
||||||
config["checksum"] = buffer;
|
config["checksum"] = buffer;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user