EEPROM changes
This commit is contained in:
		| @@ -21,6 +21,28 @@ | |||||||
|   <meta name="msapplication-config" content="static/img/browserconfig.xml"> |   <meta name="msapplication-config" content="static/img/browserconfig.xml"> | ||||||
|   <meta name="theme-color" content="#111111"> |   <meta name="theme-color" content="#111111"> | ||||||
|  |  | ||||||
|  |   <script type="text/javascript"> | ||||||
|  |     var opacity = 0; | ||||||
|  |     var intervalID = 0; | ||||||
|  |     window.onload = setTimeout(() => {  fadeout(); }, 4000); | ||||||
|  |     function fadeout() { | ||||||
|  |       intervalID = setInterval(hide, 200); | ||||||
|  |     } | ||||||
|  |     function hide() { | ||||||
|  |       var responseMessage = document.getElementById("responseMessage"); | ||||||
|  |       opacity = | ||||||
|  |         Number(window.getComputedStyle(responseMessage).getPropertyValue("opacity")) | ||||||
|  |       if (opacity > 0) { | ||||||
|  |         opacity = opacity - 0.1; | ||||||
|  |         responseMessage.style.opacity = opacity | ||||||
|  |       } | ||||||
|  |       else { | ||||||
|  |         responseMessage.remove() | ||||||
|  |         clearInterval(intervalID); | ||||||
|  |       } | ||||||
|  |     }  | ||||||
|  |   </script> | ||||||
|  |  | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
| @@ -61,8 +83,12 @@ | |||||||
|           </p> |           </p> | ||||||
|           <h3>%DEVICE_NAME%</h3> |           <h3>%DEVICE_NAME%</h3> | ||||||
|         </div> |         </div> | ||||||
|  |         <!-- AlertMessageBox--> | ||||||
|  |         <div id="responseMessage" class="alert alert-%RESP_MESSAGE_TYPE%" %SHOW_RESP_MESSAGE%> | ||||||
|  |           %RESP_MESSAGE% | ||||||
|  |         </div> | ||||||
|         <div class="container-fluid pb-5"> |         <div class="container-fluid pb-5"> | ||||||
|           <h4>Akku</h4> |           <h4>BATTERY: %BATTERY_TYPE%</h4> | ||||||
|           <div class="progress"> |           <div class="progress"> | ||||||
|             <div class="progress-bar text-light" role="progressbar" aria-valuenow="%BAT_REMAIN_CAPACITY%" |             <div class="progress-bar text-light" role="progressbar" aria-valuenow="%BAT_REMAIN_CAPACITY%" | ||||||
|               aria-valuemin="0" aria-valuemax="100" style="width: %BAT_REMAIN_CAPACITY%%"> |               aria-valuemin="0" aria-valuemax="100" style="width: %BAT_REMAIN_CAPACITY%%"> | ||||||
| @@ -71,13 +97,13 @@ | |||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|         <div class="container-fluid pb-5"> |         <div class="container-fluid pb-5"> | ||||||
|           <h4>Fraktionen</h4> |           <h4>FACTIONS</h4> | ||||||
|           <div class="table-responsive"> |           <div class="table-responsive"> | ||||||
|             <table class="table text-light text-center"> |             <table class="table text-light text-center"> | ||||||
|               <thead> |               <thead> | ||||||
|                 <tr> |                 <tr> | ||||||
|                   <th scope="col">Fraktion</td> |                   <th scope="col">Faction</td> | ||||||
|                   <th scope="col">Zeit</td> |                   <th scope="col">Time</td> | ||||||
|                 </tr> |                 </tr> | ||||||
|               </thead> |               </thead> | ||||||
|               <tbody> |               <tbody> | ||||||
| @@ -137,11 +163,12 @@ | |||||||
|       <div class="tab-pane fade" id="tab_settings" role="tabpanel"> |       <div class="tab-pane fade" id="tab_settings" role="tabpanel"> | ||||||
|         <h3>Settings</h3> |         <h3>Settings</h3> | ||||||
|         <hr> |         <hr> | ||||||
|         <form action="\post.htm" method="POST"> |         <form method="POST"> | ||||||
|           <div class="form-group row"> |           <div class="form-group row"> | ||||||
|             <label for="commandInput" class="col-sm-2 col-form-label">Command</label> |             <label for="commandInput" class="col-sm-2 col-form-label">Command</label> | ||||||
|             <div class="col-sm-10"> |             <div class="col-sm-10"> | ||||||
|               <input type="text" class="form-control bg-light" id="commandInput" placeholder="type command here..."> |               <input type="text" name="commandInput" class="form-control bg-light" id="commandInput" | ||||||
|  |                 placeholder="type command here..."> | ||||||
|             </div> |             </div> | ||||||
|           </div> |           </div> | ||||||
|           <div class="form-group row"> |           <div class="form-group row"> | ||||||
|   | |||||||
| @@ -22,9 +22,11 @@ board_build.ldscript = eagle.flash.4m1m.ld | |||||||
| monitor_filters = esp8266_exception_decoder | monitor_filters = esp8266_exception_decoder | ||||||
| monitor_speed = 115200 | monitor_speed = 115200 | ||||||
|  |  | ||||||
|  | ;upload_protocol = esptool | ||||||
|  | ;upload_speed = 921600 | ||||||
|  | upload_port = 10.0.1.49 | ||||||
| upload_protocol = espota | upload_protocol = espota | ||||||
| upload_port = 10.0.1.34 | upload_flags =   | ||||||
| upload_flags= |  | ||||||
|     --auth=${wifi_cred.admin_password} |     --auth=${wifi_cred.admin_password} | ||||||
|  |  | ||||||
| build_flags= | build_flags= | ||||||
|   | |||||||
							
								
								
									
										123
									
								
								src/config.cpp
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								src/config.cpp
									
									
									
									
									
								
							| @@ -1,28 +1,46 @@ | |||||||
| #include "config.h" | #include "config.h" | ||||||
|  |  | ||||||
| I2C_eeprom ee(0x50, EEPROM_SIZE_BYTES); | I2C_eeprom ee(0x50, EEPROM_SIZE_BYTES); | ||||||
|  |  | ||||||
| configData_t ConfigData; | configData_t ConfigData; | ||||||
| persistenceData_t PersistenceData; | persistenceData_t PersistenceData; | ||||||
| uint16_t eePersistenceMarker = 0; | const uint16_t eeVersion = 1; // inc | ||||||
| uint16_t eeVersion = 0; // inc |  | ||||||
| boolean eeAvailable = false; | boolean eeAvailable = false; | ||||||
|  |  | ||||||
| const uint16_t startofConfigData = 16; | const uint16_t persistencemarker_Adress = 0; // sizeof 4 | ||||||
| const uint16_t startofPersistence = 16 + sizeof(startofConfigData) + (sizeof(startofConfigData) % 16); | const uint16_t startofConfig_Adress = 16; | ||||||
|  | const uint16_t startofPersistence_Adress = startofConfig_Adress + sizeof(ConfigData) + (sizeof(ConfigData) % 16); | ||||||
|  |  | ||||||
|  | boolean checkEEPROMavailable(); | ||||||
|  |  | ||||||
| void InitEEPROM() | void InitEEPROM() | ||||||
| { | { | ||||||
|   #ifdef SERIAL_DEBUG |  | ||||||
|   Serial.printf("connecting I2C EEPROM"); |  | ||||||
|   #endif |  | ||||||
|   ee.begin(); |   ee.begin(); | ||||||
|   if (!ee.isConnected()) |   if (!checkEEPROMavailable()) | ||||||
|   { |   { | ||||||
|  |     globals.systemStatus = sysStat_Error; | ||||||
|     MaintainDTC(DTC_NO_EEPROM_FOUND, true); |     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(); | ||||||
|  | } | ||||||
|  |  | ||||||
| void EEPROM_Process() | void EEPROM_Process() | ||||||
| { | { | ||||||
| @@ -55,18 +73,18 @@ void StoreConfig_EEPROM() | |||||||
| { | { | ||||||
|   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()) | ||||||
|   if (!ee.isConnected()) |  | ||||||
|     return; |     return; | ||||||
|   ee.updateBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData)); |  | ||||||
|  |   ee.updateBlock(startofConfig_Adress, (uint8_t *)&ConfigData, sizeof(ConfigData)); | ||||||
| } | } | ||||||
|  |  | ||||||
| void GetConfig_EEPROM() | void GetConfig_EEPROM() | ||||||
| { | { | ||||||
|  |   if (!checkEEPROMavailable()) | ||||||
|   if (!ee.isConnected()) |  | ||||||
|     return; |     return; | ||||||
|   ee.readBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData)); |  | ||||||
|  |   ee.readBlock(startofConfig_Adress, (uint8_t *)&ConfigData, sizeof(ConfigData)); | ||||||
|  |  | ||||||
|   uint32_t checksum = ConfigData.checksum; |   uint32_t checksum = ConfigData.checksum; | ||||||
|   ConfigData.checksum = 0; |   ConfigData.checksum = 0; | ||||||
| @@ -79,14 +97,21 @@ void GetConfig_EEPROM() | |||||||
|   ConfigData.checksum = checksum; |   ConfigData.checksum = checksum; | ||||||
| } | } | ||||||
|  |  | ||||||
| uint16_t getPersistanceAddress() | uint32_t getPersistanceAddress() | ||||||
| { | { | ||||||
|   return startofPersistence + eePersistenceMarker; |   uint32_t eePersistenceMarker; | ||||||
|  |   ee.readBlock(persistencemarker_Adress, (uint8_t *)&eePersistenceMarker, sizeof(eePersistenceMarker)); | ||||||
|  |   return eePersistenceMarker; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void updatePersistanceAddress(uint32_t adress) | ||||||
|  | { | ||||||
|  |   ee.updateBlock(persistencemarker_Adress, (uint8_t *)&adress, sizeof(adress)); | ||||||
| } | } | ||||||
|  |  | ||||||
| void StorePersistence_EEPROM() | void StorePersistence_EEPROM() | ||||||
| { | { | ||||||
|   if (PersistenceData.writeCycleCounter >= 0xFFF0) |   if (PersistenceData.writeCycleCounter >= EEPROM_ENDURANCE) | ||||||
|     MovePersistencePage_EEPROM(false); |     MovePersistencePage_EEPROM(false); | ||||||
|   else |   else | ||||||
|     PersistenceData.writeCycleCounter++; |     PersistenceData.writeCycleCounter++; | ||||||
| @@ -94,17 +119,17 @@ 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 (!ee.isConnected()) |   if (!checkEEPROMavailable()) | ||||||
|     return; |     return; | ||||||
|  |  | ||||||
|   ee.updateBlock(getPersistanceAddress(), (uint8_t *)&PersistenceData, sizeof(PersistenceData)); |   ee.updateBlock(getPersistanceAddress(), (uint8_t *)&PersistenceData, sizeof(PersistenceData)); | ||||||
| } | } | ||||||
|  |  | ||||||
| void GetPersistence_EEPROM() | void GetPersistence_EEPROM() | ||||||
| { | { | ||||||
|  |   if (!checkEEPROMavailable()) | ||||||
|   if (!ee.isConnected()) |  | ||||||
|     return; |     return; | ||||||
|   eePersistenceMarker = (ee.readByte(0) << 8) | ee.readByte(1); |  | ||||||
|   ee.readBlock(getPersistanceAddress(), (uint8_t *)&PersistenceData, sizeof(PersistenceData)); |   ee.readBlock(getPersistanceAddress(), (uint8_t *)&PersistenceData, sizeof(PersistenceData)); | ||||||
|  |  | ||||||
|   uint32_t checksum = PersistenceData.checksum; |   uint32_t checksum = PersistenceData.checksum; | ||||||
| @@ -122,6 +147,7 @@ void FormatConfig_EEPROM() | |||||||
| { | { | ||||||
|   configData_t defaults; |   configData_t defaults; | ||||||
|   ConfigData = defaults; |   ConfigData = defaults; | ||||||
|  |   ConfigData.EEPROM_Version = eeVersion; | ||||||
|   StoreConfig_EEPROM(); |   StoreConfig_EEPROM(); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -129,19 +155,40 @@ void FormatPersistence_EEPROM() | |||||||
| { | { | ||||||
|   persistenceData_t defaults; |   persistenceData_t defaults; | ||||||
|   PersistenceData = defaults; |   PersistenceData = defaults; | ||||||
|   eePersistenceMarker = 0; |   updatePersistanceAddress(startofPersistence_Adress); | ||||||
|   StorePersistence_EEPROM(); |   StorePersistence_EEPROM(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void MovePersistencePage_EEPROM(boolean reset) | void MovePersistencePage_EEPROM(boolean reset) | ||||||
| { | { | ||||||
|   eePersistenceMarker = reset ? sizeof(PersistenceData) : eePersistenceMarker + sizeof(PersistenceData); |   if (!checkEEPROMavailable()) | ||||||
|   PersistenceData.writeCycleCounter = 0; |  | ||||||
|  |  | ||||||
|   if (!ee.isConnected()) |  | ||||||
|     return; |     return; | ||||||
|   ee.updateByte(0, (uint8_t)(eePersistenceMarker >> 8)); |  | ||||||
|   ee.updateByte(1, (uint8_t)(eePersistenceMarker & 0xFF)); |   if (reset) | ||||||
|  |   { | ||||||
|  |     updatePersistanceAddress(startofPersistence_Adress); | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |   { | ||||||
|  |     uint32_t newPersistenceMarker = getPersistanceAddress() + sizeof(PersistenceData); | ||||||
|  |  | ||||||
|  |     // 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; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint32_t GetEESize() | ||||||
|  | { | ||||||
|  |   return ee.getDeviceSize(); | ||||||
| } | } | ||||||
|  |  | ||||||
| uint32_t Checksum_EEPROM(uint8_t const *data, size_t len) | uint32_t Checksum_EEPROM(uint8_t const *data, size_t len) | ||||||
| @@ -167,7 +214,13 @@ void dumpEEPROM(uint16_t memoryAddress, uint16_t length) | |||||||
| { | { | ||||||
| #define BLOCK_TO_LENGTH 16 | #define BLOCK_TO_LENGTH 16 | ||||||
|  |  | ||||||
|   if (!ee.isConnected()) |   if (length > ee.getDeviceSize()) | ||||||
|  |     length = ee.getDeviceSize(); | ||||||
|  |  | ||||||
|  |   if (memoryAddress + length > ee.getDeviceSize()) | ||||||
|  |     return; | ||||||
|  |  | ||||||
|  |   if (!checkEEPROMavailable()) | ||||||
|     return; |     return; | ||||||
|  |  | ||||||
|   char ascii_buf[BLOCK_TO_LENGTH + 1]; |   char ascii_buf[BLOCK_TO_LENGTH + 1]; | ||||||
| @@ -196,3 +249,13 @@ void dumpEEPROM(uint16_t memoryAddress, uint16_t length) | |||||||
|   } |   } | ||||||
|   Serial.println(); |   Serial.println(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | boolean checkEEPROMavailable() | ||||||
|  | { | ||||||
|  |   if (!ee.isConnected()) | ||||||
|  |   { | ||||||
|  |     MaintainDTC(DTC_NO_EEPROM_FOUND, true); | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  |   return true; | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								src/config.h
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								src/config.h
									
									
									
									
									
								
							| @@ -8,7 +8,8 @@ | |||||||
| #include "globals.h" | #include "globals.h" | ||||||
| #include "dtc.h" | #include "dtc.h" | ||||||
|  |  | ||||||
| #define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC256 | #define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC01 | ||||||
|  | #define EEPROM_ENDURANCE 1000000 | ||||||
|  |  | ||||||
| typedef enum | typedef enum | ||||||
| { | { | ||||||
| @@ -20,7 +21,7 @@ typedef enum | |||||||
|  |  | ||||||
| typedef struct | typedef struct | ||||||
| { | { | ||||||
|   uint16_t writeCycleCounter = 0; |   uint32_t writeCycleCounter = 0; | ||||||
|   uint32_t faction_1_timer = 0; |   uint32_t faction_1_timer = 0; | ||||||
|   uint32_t faction_2_timer = 0; |   uint32_t faction_2_timer = 0; | ||||||
|   uint32_t faction_3_timer = 0; |   uint32_t faction_3_timer = 0; | ||||||
| @@ -28,8 +29,23 @@ typedef struct | |||||||
|   uint32_t checksum = 0; |   uint32_t checksum = 0; | ||||||
| } persistenceData_t; | } persistenceData_t; | ||||||
|  |  | ||||||
|  | typedef enum | ||||||
|  | { | ||||||
|  |   BATTERY_UNDEFINED, | ||||||
|  |   BATTERY_LIPO_2S, | ||||||
|  |   BATTERY_LIPO_3S | ||||||
|  | } batteryType_t; | ||||||
|  |  | ||||||
|  | const char BatteryString[][10]{ | ||||||
|  |   "Undefined", | ||||||
|  |   "LiPo 2S", | ||||||
|  |   "LiPo 3S" | ||||||
|  | }; | ||||||
|  |  | ||||||
| typedef struct | typedef struct | ||||||
| { | { | ||||||
|  |   uint8_t EEPROM_Version = 1; | ||||||
|  |   batteryType_t batteryType = BATTERY_UNDEFINED; | ||||||
|   uint32_t checksum = 0; |   uint32_t checksum = 0; | ||||||
| } configData_t; | } configData_t; | ||||||
|  |  | ||||||
| @@ -44,9 +60,10 @@ void FormatPersistence_EEPROM(); | |||||||
| uint32_t Checksum_EEPROM(uint8_t const *data, size_t len); | uint32_t Checksum_EEPROM(uint8_t const *data, size_t len); | ||||||
| void dumpEEPROM(uint16_t memoryAddress, uint16_t length); | void dumpEEPROM(uint16_t memoryAddress, uint16_t length); | ||||||
| void MovePersistencePage_EEPROM(boolean reset); | void MovePersistencePage_EEPROM(boolean reset); | ||||||
| uint16_t getPersistanceAddress(); | uint32_t getPersistanceAddress(); | ||||||
|  | void updatePersistanceAddress(uint32_t adress); | ||||||
|  | uint32_t GetEESize(); | ||||||
|  |  | ||||||
| extern configData_t ConfigData; | extern configData_t ConfigData; | ||||||
| extern persistenceData_t PersistenceData; | extern persistenceData_t PersistenceData; | ||||||
| extern uint16_t eePersistenceMarker; |  | ||||||
| #endif // _CONFIG_H_ | #endif // _CONFIG_H_ | ||||||
| @@ -10,6 +10,9 @@ typedef enum DTCNums_e | |||||||
|   DTC_NO_EEPROM_FOUND, |   DTC_NO_EEPROM_FOUND, | ||||||
|   DTC_EEPROM_CFG_BAD, |   DTC_EEPROM_CFG_BAD, | ||||||
|   DTC_EEPROM_PDS_BAD, |   DTC_EEPROM_PDS_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_LAST_DTC |   DTC_LAST_DTC | ||||||
| } DTCNums_t; | } DTCNums_t; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										43
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								src/main.cpp
									
									
									
									
									
								
							| @@ -44,6 +44,7 @@ void powerMonitorTicker_callback(); | |||||||
| void EEPROMCyclicPDS_callback(); | void EEPROMCyclicPDS_callback(); | ||||||
| void toggleWiFiAP(boolean shutdown = false); | void toggleWiFiAP(boolean shutdown = false); | ||||||
| void SystemShutdown(); | void SystemShutdown(); | ||||||
|  | void SetBatteryType(batteryType_t type); | ||||||
|  |  | ||||||
| #ifdef REMOTE_DEBUG | #ifdef REMOTE_DEBUG | ||||||
| RemoteDebug Debug; | RemoteDebug Debug; | ||||||
| @@ -141,8 +142,6 @@ void setup() | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   InitEEPROM(); |   InitEEPROM(); | ||||||
|   GetConfig_EEPROM(); |  | ||||||
|   GetPersistence_EEPROM(); |  | ||||||
|  |  | ||||||
|   ArduinoOTA.setPort(8266); |   ArduinoOTA.setPort(8266); | ||||||
|   ArduinoOTA.setHostname(globals.DeviceName_ID); |   ArduinoOTA.setHostname(globals.DeviceName_ID); | ||||||
| @@ -152,7 +151,7 @@ void setup() | |||||||
|                      { |                      { | ||||||
|                        const uint8_t seg_ota[] = {0x3F, 0x78, 0x77, 0x00}; |                        const uint8_t seg_ota[] = {0x3F, 0x78, 0x77, 0x00}; | ||||||
|                        const uint8_t seg_flsh[] = {0x71, 0x38, 0x6D, 0x76}; |                        const uint8_t seg_flsh[] = {0x71, 0x38, 0x6D, 0x76}; | ||||||
|                        const uint8_t seg_fs[] = {0x71, 0x6D, 0x00, 0x00}; |                        const uint8_t seg_file[] = {0x71, 0x30, 0x38, 0x79}; | ||||||
|  |  | ||||||
|                        disp_FAC_1.setBrightness(7); |                        disp_FAC_1.setBrightness(7); | ||||||
|                        disp_FAC_2.setBrightness(7); |                        disp_FAC_2.setBrightness(7); | ||||||
| @@ -166,7 +165,7 @@ void setup() | |||||||
|                        } |                        } | ||||||
|                        else |                        else | ||||||
|                        { |                        { | ||||||
|                          disp_FAC_2.setSegments(seg_fs); |                          disp_FAC_2.setSegments(seg_file); | ||||||
|                          LittleFS.end(); |                          LittleFS.end(); | ||||||
|                        } }); |                        } }); | ||||||
|  |  | ||||||
| @@ -319,6 +318,11 @@ void powerMonitorTicker_callback() | |||||||
| { | { | ||||||
|   // loadvoltage and percentage is global, because of battery Monitoring |   // loadvoltage and percentage is global, because of battery Monitoring | ||||||
|  |  | ||||||
|  |   const int bat_min_2s = 680; | ||||||
|  |   const int bat_max_2s = 840; | ||||||
|  |   const int bat_min_3s = 1020; | ||||||
|  |   const int bat_max_3s = 1260; | ||||||
|  |  | ||||||
|   float shuntvoltage = 0; |   float shuntvoltage = 0; | ||||||
|   float current_mA = 0; |   float current_mA = 0; | ||||||
|   float busvoltage = 0; |   float busvoltage = 0; | ||||||
| @@ -330,8 +334,20 @@ void powerMonitorTicker_callback() | |||||||
|   current_mA = ina219.getCurrent_mA(); |   current_mA = ina219.getCurrent_mA(); | ||||||
|   power_mW = ina219.getPower_mW(); |   power_mW = ina219.getPower_mW(); | ||||||
|   globals.loadvoltage = busvoltage + (shuntvoltage / 1000); |   globals.loadvoltage = busvoltage + (shuntvoltage / 1000); | ||||||
|   battery_level = map(globals.loadvoltage * 100, 655, 840, 0, 100); |   switch (ConfigData.batteryType) | ||||||
|  |   { | ||||||
|  |   case BATTERY_LIPO_2S: | ||||||
|  |     battery_level = map(globals.loadvoltage * 100, bat_min_2s, bat_max_2s, 0, 100); | ||||||
|     globals.battery_level = battery_level < 0 ? 0 : battery_level; |     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); | ||||||
|  |     globals.battery_level = battery_level < 0 ? 0 : battery_level; | ||||||
|  |     break; | ||||||
|  |   default: | ||||||
|  |     globals.battery_level = -1; | ||||||
|  |     break; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   debugV("Battery Level: %d %%", globals.battery_level); |   debugV("Battery Level: %d %%", globals.battery_level); | ||||||
|   debugV("Bus Voltage: %f V", busvoltage); |   debugV("Bus Voltage: %f V", busvoltage); | ||||||
| @@ -421,6 +437,10 @@ void processCmdRemoteDebug() | |||||||
|     StoreConfig_EEPROM(); |     StoreConfig_EEPROM(); | ||||||
|   else if (lastCmd == "showdtc") |   else if (lastCmd == "showdtc") | ||||||
|     RemoteDebug_ShowDTCs(); |     RemoteDebug_ShowDTCs(); | ||||||
|  |   else if (lastCmd == "bat_3s") | ||||||
|  |     SetBatteryType(BATTERY_LIPO_3S); | ||||||
|  |   else if (lastCmd == "bat_2s") | ||||||
|  |     SetBatteryType(BATTERY_LIPO_2S); | ||||||
| } | } | ||||||
|  |  | ||||||
| void RemoteDebug_formatCFG() | void RemoteDebug_formatCFG() | ||||||
| @@ -455,10 +475,13 @@ void RemotDebug_printSystemInfo() | |||||||
|                                                                                 : "UNKNOWN")); |                                                                                 : "UNKNOWN")); | ||||||
|   debugA("OTA-Pass: %s", QUOTE(ADMIN_PASSWORD)); |   debugA("OTA-Pass: %s", QUOTE(ADMIN_PASSWORD)); | ||||||
|   debugA("Git-Revison: %s", GIT_REV); |   debugA("Git-Revison: %s", GIT_REV); | ||||||
|  |   debugA("I2C EEPROM Size: %d", GetEESize()); | ||||||
| } | } | ||||||
|  |  | ||||||
| void RemoteDebug_dumpConfig() | void RemoteDebug_dumpConfig() | ||||||
| { | { | ||||||
|  |   debugA("EEPROM_Version: %d", ConfigData.EEPROM_Version); | ||||||
|  |   debugA("BatteryType: %d", ConfigData.batteryType); | ||||||
|   debugA("checksum: 0x%08X", ConfigData.checksum); |   debugA("checksum: 0x%08X", ConfigData.checksum); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -535,3 +558,13 @@ void RemoteDebug_ShowDTCs() | |||||||
|   } |   } | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | void SetBatteryType(batteryType_t type) | ||||||
|  | { | ||||||
|  |   if (ConfigData.batteryType != type) | ||||||
|  |   { | ||||||
|  |     ConfigData.batteryType = type; | ||||||
|  |     globals.requestEEAction = EE_CFG_SAVE; | ||||||
|  |     debugV("Set Batterytype to %s", type == BATTERY_LIPO_2S ? "2s Lipo" : "3s LiPo"); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -10,4 +10,7 @@ const char helpCmd[] = "sysinfo     - System Info\r\n" | |||||||
|                        "resetPageEE - Reset the PersistenceData Page\r\n" |                        "resetPageEE - Reset the PersistenceData Page\r\n" | ||||||
|                        "dumpCFG     - print Config struct\r\n" |                        "dumpCFG     - print Config struct\r\n" | ||||||
|                        "dumpPDS     - print PersistanceStruct\r\n" |                        "dumpPDS     - print PersistanceStruct\r\n" | ||||||
|                        "saveEE      - save EE-Data\r\n"; |                        "saveEE      - save EE-Data\r\n" | ||||||
|  |                        "bat_3s      - set BatteryType to 3S LiPo\r\n" | ||||||
|  |                        "bat_2s      - set BatteryType to 2S LiPo\r\n" | ||||||
|  |                        ; | ||||||
| @@ -2,12 +2,22 @@ | |||||||
|  |  | ||||||
| AsyncWebServer webServer(80); | AsyncWebServer webServer(80); | ||||||
|  |  | ||||||
| const char *PARAM_MESSAGE = "message"; | typedef enum | ||||||
|  | { | ||||||
|  |   RESPMSG_HIDE, | ||||||
|  |   RESPMSG_SUCCESS, | ||||||
|  |   RESPMSG_INFO, | ||||||
|  |   RESPMSG_WARNING, | ||||||
|  |   RESPMSG_DANGER | ||||||
|  | } statusResponseMessage_Type_t; | ||||||
|  | char StatusResponseMessage[64]; | ||||||
|  | statusResponseMessage_Type_t StatusResponseMessage_Type = RESPMSG_INFO; | ||||||
|  |  | ||||||
| String processor(const String &var); | String processor(const String &var); | ||||||
| void WebserverPOST_Callback(AsyncWebServerRequest *request); | void WebserverPOST_Callback(AsyncWebServerRequest *request); | ||||||
| void WebserverNotFound_Callback(AsyncWebServerRequest *request); | void WebserverNotFound_Callback(AsyncWebServerRequest *request); | ||||||
| void Webserver_Callback(AsyncWebServerRequest *request); | void Webserver_Callback(AsyncWebServerRequest *request); | ||||||
|  | void WebserverCommands_Callback(String input); | ||||||
|  |  | ||||||
| void initWebUI() | void initWebUI() | ||||||
| { | { | ||||||
| @@ -22,7 +32,7 @@ void initWebUI() | |||||||
|                { request->redirect("/index.htm"); }); |                { request->redirect("/index.htm"); }); | ||||||
|   webServer.onNotFound(WebserverNotFound_Callback); |   webServer.onNotFound(WebserverNotFound_Callback); | ||||||
|   webServer.on("/index.htm", HTTP_GET, Webserver_Callback); |   webServer.on("/index.htm", HTTP_GET, Webserver_Callback); | ||||||
|   webServer.on("/post.htm", HTTP_POST, WebserverPOST_Callback); |   webServer.on("/index.htm", HTTP_POST, WebserverPOST_Callback); | ||||||
|  |  | ||||||
|   webServer.begin(); |   webServer.begin(); | ||||||
| } | } | ||||||
| @@ -32,6 +42,29 @@ String processor(const String &var) | |||||||
|   if (var == "SHOW_DTC_TABLE") |   if (var == "SHOW_DTC_TABLE") | ||||||
|     return globals.systemStatus == sysStat_Error ? "" : "hidden"; |     return globals.systemStatus == sysStat_Error ? "" : "hidden"; | ||||||
|  |  | ||||||
|  |   if (var == "SHOW_RESP_MESSAGE") | ||||||
|  |     return StatusResponseMessage_Type != RESPMSG_HIDE ? "" : "hidden"; | ||||||
|  |  | ||||||
|  |   if (var == "RESP_MESSAGE_TYPE") | ||||||
|  |   { | ||||||
|  |     switch (StatusResponseMessage_Type) | ||||||
|  |     { | ||||||
|  |     case RESPMSG_SUCCESS: | ||||||
|  |       return "success"; | ||||||
|  |     case RESPMSG_INFO: | ||||||
|  |       return "info"; | ||||||
|  |     case RESPMSG_WARNING: | ||||||
|  |       return "warning"; | ||||||
|  |     case RESPMSG_DANGER: | ||||||
|  |       return "danger"; | ||||||
|  |     default: | ||||||
|  |       return "info"; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (var == "RESP_MESSAGE") | ||||||
|  |     return String(StatusResponseMessage); | ||||||
|  |  | ||||||
|   if (var == "BAT_REMAIN_CAPACITY") |   if (var == "BAT_REMAIN_CAPACITY") | ||||||
|     return String(globals.battery_level); |     return String(globals.battery_level); | ||||||
|  |  | ||||||
| @@ -122,6 +155,10 @@ String processor(const String &var) | |||||||
|   { |   { | ||||||
|     return String(globals.battery_level); |     return String(globals.battery_level); | ||||||
|   } |   } | ||||||
|  |   if (var == "BATTERY_TYPE") | ||||||
|  |   { | ||||||
|  |     return String(BatteryString[ConfigData.batteryType]); | ||||||
|  |   } | ||||||
|   if (var == "BATTERY_VOLTAGE") |   if (var == "BATTERY_VOLTAGE") | ||||||
|   { |   { | ||||||
|     return String(globals.loadvoltage); |     return String(globals.loadvoltage); | ||||||
| @@ -133,30 +170,39 @@ String processor(const String &var) | |||||||
| void Webserver_Callback(AsyncWebServerRequest *request) | void Webserver_Callback(AsyncWebServerRequest *request) | ||||||
| { | { | ||||||
|   request->send(LittleFS, "/index.htm", "text/html", false, processor); |   request->send(LittleFS, "/index.htm", "text/html", false, processor); | ||||||
|  |   StatusResponseMessage_Type = RESPMSG_HIDE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void WebserverPOST_Callback(AsyncWebServerRequest *request) | void WebserverPOST_Callback(AsyncWebServerRequest *request) | ||||||
| { | { | ||||||
|   request->send(LittleFS, "/post.htm", "text/html", false, processor); |  | ||||||
|  |  | ||||||
|   Serial.print("POST:\n"); |  | ||||||
|   int paramsNr = request->params(); |   int paramsNr = request->params(); | ||||||
|   for (int i = 0; i < paramsNr; i++) |   for (int i = 0; i < paramsNr; i++) | ||||||
|   { |   { | ||||||
|     AsyncWebParameter *p = request->getParam(i); |     AsyncWebParameter *p = request->getParam(i); | ||||||
|     Serial.printf("%s : %s\n", p->name().c_str(), p->value().c_str()); |     if (p->name() == "commandInput") | ||||||
|  |       WebserverCommands_Callback(p->value()); | ||||||
|     if (p->name() == "resetcount") |  | ||||||
|     { |  | ||||||
|       PersistenceData.faction_1_timer = 0; |  | ||||||
|       PersistenceData.faction_2_timer = 0; |  | ||||||
|       PersistenceData.faction_3_timer = 0; |  | ||||||
|       globals.requestEEAction = EE_PDS_SAVE; |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
|  |   request->send(LittleFS, "/index.htm", "text/html", false, processor); | ||||||
| } | } | ||||||
|  |  | ||||||
| void WebserverNotFound_Callback(AsyncWebServerRequest *request) | void WebserverNotFound_Callback(AsyncWebServerRequest *request) | ||||||
| { | { | ||||||
|   request->send(404, "text/html", "Not found"); |   request->send(404, "text/html", "Not found"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void WebserverCommands_Callback(String input) | ||||||
|  | { | ||||||
|  |   String command = input.substring(0, input.indexOf(' ')); | ||||||
|  |   StatusResponseMessage_Type = RESPMSG_HIDE; | ||||||
|  |  | ||||||
|  |   if (command == "reset") | ||||||
|  |   { | ||||||
|  |     strcpy(StatusResponseMessage, "Counter Reset done"); | ||||||
|  |     StatusResponseMessage_Type = RESPMSG_SUCCESS; | ||||||
|  |  | ||||||
|  |     PersistenceData.faction_1_timer = 0; | ||||||
|  |     PersistenceData.faction_2_timer = 0; | ||||||
|  |     PersistenceData.faction_3_timer = 0; | ||||||
|  |     PersistenceData.activeFaction = NONE; | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user