Compare commits
	
		
			4 Commits
		
	
	
		
			ae8eef52ef
			...
			a2aa302121
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a2aa302121 | |||
| d04489819d | |||
| 52026296f2 | |||
| a22f71649a | 
@@ -1,7 +1,3 @@
 | 
				
			|||||||
# SCRIPT TO GZIP CRITICAL FILES FOR ACCELERATED WEBSERVING
 | 
					 | 
				
			||||||
# see also https://community.platformio.org/t/question-esp32-compress-files-in-data-to-gzip-before-upload-possible-to-spiffs/6274/10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import glob
 | 
					import glob
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import gzip
 | 
					import gzip
 | 
				
			||||||
@@ -169,8 +165,13 @@ def gzip_webfiles(source, target, env):
 | 
				
			|||||||
    return
 | 
					    return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def gzip_binffiles(source, target, env):
 | 
					def gzip_binffiles(source, target, env):
 | 
				
			||||||
 | 
					    git_revision = popen('git rev-parse --short HEAD').read().strip()
 | 
				
			||||||
 | 
					    custom_flash_version = env.GetProjectOption("custom_flash_version", "0.99")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Format the target file name
 | 
				
			||||||
 | 
					    target_filename = f"filesystem_{custom_flash_version}_{git_revision}.fs"
 | 
				
			||||||
    littlefsbin = target[0].get_abspath()
 | 
					    littlefsbin = target[0].get_abspath()
 | 
				
			||||||
    targetbin = os.path.join(os.path.dirname(littlefsbin), 'filesystem.fs')
 | 
					    targetbin = os.path.join(os.path.dirname(littlefsbin), target_filename)
 | 
				
			||||||
    shutil.copyfile(littlefsbin, targetbin)
 | 
					    shutil.copyfile(littlefsbin, targetbin)
 | 
				
			||||||
    gzip_file(targetbin, os.path.join(str(targetbin) + '.gz'))
 | 
					    gzip_file(targetbin, os.path.join(str(targetbin) + '.gz'))
 | 
				
			||||||
    os.remove(targetbin)
 | 
					    os.remove(targetbin)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,8 +7,27 @@ from os import popen
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
git_revision = popen('git rev-parse --short HEAD').read().strip()
 | 
					git_revision = popen('git rev-parse --short HEAD').read().strip()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
env.Replace(PROGNAME="firmware_%s.fw" % git_revision)
 | 
					# Versionsnummern aus platformio.ini holen
 | 
				
			||||||
env.Append(CPPDEFINES=[('GIT_REV', '\\"{}\\"'.format(git_revision))])
 | 
					custom_firmware_version = env.GetProjectOption("custom_firmware_version", "0.99")
 | 
				
			||||||
 | 
					custom_flash_version = env.GetProjectOption("custom_flash_version", "0.99")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Versionsnummern aufteilen in Major und Minor
 | 
				
			||||||
 | 
					fw_major, fw_minor = custom_firmware_version.split('.')
 | 
				
			||||||
 | 
					fl_major, fl_minor = custom_flash_version.split('.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Version in Datei "version" im Ordner "data_src" überschreiben
 | 
				
			||||||
 | 
					with open('data_src/version', 'w') as version_file:
 | 
				
			||||||
 | 
					    version_file.write(custom_flash_version)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					# Build-Flags setzen
 | 
				
			||||||
 | 
					env.Replace(PROGNAME="firmware_%s_%s.fw" % (custom_firmware_version, git_revision))
 | 
				
			||||||
 | 
					env.Append(CPPDEFINES=[
 | 
				
			||||||
 | 
					    ('GIT_REV', '\\"{}\\"'.format(git_revision)),
 | 
				
			||||||
 | 
					    ('FW_MAJOR', fw_major),
 | 
				
			||||||
 | 
					    ('FW_MINOR', fw_minor),
 | 
				
			||||||
 | 
					    ('FL_MAJOR', fl_major),
 | 
				
			||||||
 | 
					    ('FL_MINOR', fl_minor)
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct2json.struct2json()
 | 
					struct2json.struct2json()
 | 
				
			||||||
dtcs.build_dtcs()
 | 
					dtcs.build_dtcs()
 | 
				
			||||||
@@ -35,7 +35,7 @@
 | 
				
			|||||||
  <nav class="navbar fixed-top navbar-dark bg-primary" id="navbar1">
 | 
					  <nav class="navbar fixed-top navbar-dark bg-primary" id="navbar1">
 | 
				
			||||||
    <a class="navbar-brand" href="#">
 | 
					    <a class="navbar-brand" href="#">
 | 
				
			||||||
      <img src="static/img/logo.png" width="30" height="30" class="d-inline-block align-top mr-1" alt="">
 | 
					      <img src="static/img/logo.png" width="30" height="30" class="d-inline-block align-top mr-1" alt="">
 | 
				
			||||||
      DE Airsoft Timer
 | 
					      <span class="data-devicename">DE Airsoft Timer</span>
 | 
				
			||||||
    </a>
 | 
					    </a>
 | 
				
			||||||
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsingNavbar"
 | 
					    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsingNavbar"
 | 
				
			||||||
      aria-controls="collapsingNavbar" aria-expanded="false" aria-label="Toggle navigation">
 | 
					      aria-controls="collapsingNavbar" aria-expanded="false" aria-label="Toggle navigation">
 | 
				
			||||||
@@ -63,7 +63,7 @@
 | 
				
			|||||||
        <div class="col text-center">
 | 
					        <div class="col text-center">
 | 
				
			||||||
          <div class="jumbotron">
 | 
					          <div class="jumbotron">
 | 
				
			||||||
            <img src="static/img/logo.png" width="120" height="120" class="img-fluid" alt="">
 | 
					            <img src="static/img/logo.png" width="120" height="120" class="img-fluid" alt="">
 | 
				
			||||||
            <h3 class="pt-3">Dark Emergency Timer</h3>
 | 
					            <h3 class="pt-3"><span class="data-devicename">DE Airsoft Timer</span></h3>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <!-- Div Group Battery remain -->
 | 
					        <!-- Div Group Battery remain -->
 | 
				
			||||||
@@ -96,14 +96,14 @@
 | 
				
			|||||||
            <div id="header_faction3" class="col text-center data-name_faction3 text-white p-3">%NAME_FAC_3%</div>
 | 
					            <div id="header_faction3" class="col text-center data-name_faction3 text-white p-3">%NAME_FAC_3%</div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
          <div class="row">
 | 
					          <div class="row">
 | 
				
			||||||
            <div class="col bg-dark text-white p-3"><img src="static/img/logo_fac1.png"
 | 
					            <div class="col bg-dark text-white p-3 data-activefaction faction-logo faction1">
 | 
				
			||||||
                class="rounded mx-auto img-fluid d-block" alt="...">
 | 
					              <img src="static/img/logo_fac1.png" class="rounded mx-auto img-fluid d-block" alt="...">
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="col bg-dark text-white p-3"><img src="static/img/logo_fac2.png"
 | 
					            <div class="col bg-dark text-white p-3 data-activefaction faction-logo faction2">
 | 
				
			||||||
                class="rounded mx-auto img-fluid d-block" alt="...">
 | 
					              <img src="static/img/logo_fac2.png" class="rounded mx-auto img-fluid d-block" alt="...">
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="col bg-dark text-white p-3"><img src="static/img/logo_fac3.png"
 | 
					            <div class="col bg-dark text-white p-3 data-activefaction faction-logo faction3">
 | 
				
			||||||
                class="rounded mx-auto img-fluid d-block" alt="...">
 | 
					              <img src="static/img/logo_fac3.png" class="rounded mx-auto img-fluid d-block" alt="...">
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
          <div class="row">
 | 
					          <div class="row">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8439,3 +8439,22 @@ a.text-dark:hover {
 | 
				
			|||||||
.navbar-dark.bg-primary {
 | 
					.navbar-dark.bg-primary {
 | 
				
			||||||
    background-color: #111 !important
 | 
					    background-color: #111 !important
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.glow-active-faction {
 | 
				
			||||||
 | 
					    border: 3px solid #FFD700; /* Goldene Umrandung */
 | 
				
			||||||
 | 
					    box-shadow: 0 0 20px #FFD700; /* Leuchtender Glüheffekt */
 | 
				
			||||||
 | 
					    animation: glow 1.5s infinite alternate;
 | 
				
			||||||
 | 
					    border-radius: 10px; /* Abgerundete Ecken */
 | 
				
			||||||
 | 
					    margin-bottom: 10px; /* Abstand nach unten */
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  @keyframes glow {
 | 
				
			||||||
 | 
					    from {
 | 
				
			||||||
 | 
					      box-shadow: 0 0 10px #FFD700;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    to {
 | 
				
			||||||
 | 
					      box-shadow: 0 0 20px #FFD700;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
@@ -3,6 +3,13 @@ const jsonFilePath = "static/dtc_table.json";
 | 
				
			|||||||
var dtcState = {};
 | 
					var dtcState = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function processDTCNotifications(dtcArray) {
 | 
					async function processDTCNotifications(dtcArray) {
 | 
				
			||||||
 | 
					  // Entferne DTCs aus dtcState, die nicht im dtcArray enthalten sind
 | 
				
			||||||
 | 
					  for (var key in dtcState) {
 | 
				
			||||||
 | 
					    if (!dtcArray.some((dtc) => parseInt(dtc.split(",")[1]) == key)) {
 | 
				
			||||||
 | 
					      delete dtcState[key];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (dtcArray.length === 0 || dtcArray[0] == "0") {
 | 
					  if (dtcArray.length === 0 || dtcArray[0] == "0") {
 | 
				
			||||||
    dtcState = {};
 | 
					    dtcState = {};
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
@@ -31,14 +38,14 @@ async function processDTCNotifications(dtcArray) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      if (dtcState[errorCode]) {
 | 
					      if (dtcState[errorCode]) {
 | 
				
			||||||
        // Überprüfen, ob sich der Zustand von "previous" auf "active" geändert hat
 | 
					        // Überprüfen, ob sich der Zustand von "previous" auf "active" geändert hat
 | 
				
			||||||
        if (activity !== dtcState[errorCode]) {
 | 
					        if (activity !== dtcState[errorCode].activity) {
 | 
				
			||||||
          dtcState[errorCode] = activity;
 | 
					          dtcState[errorCode].activity = activity;
 | 
				
			||||||
          if (activity === 1) showNotification(description, severity);
 | 
					          if (activity === 1) showNotification(description, severity);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        // DTC ist neu, Zustand speichern und Benachrichtigung anzeigen
 | 
					        // DTC ist neu, Zustand speichern und wenn active, Benachrichtigung anzeigen
 | 
				
			||||||
        dtcState[errorCode] = activity;
 | 
					        dtcState[errorCode] = { activity: activity };
 | 
				
			||||||
        showNotification(description, severity);
 | 
					        if (activity === 1) showNotification(description, severity);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } catch (error) {
 | 
					    } catch (error) {
 | 
				
			||||||
      console.error("Error processing DTC:", error);
 | 
					      console.error("Error processing DTC:", error);
 | 
				
			||||||
@@ -89,14 +96,15 @@ async function showDTCModal(event) {
 | 
				
			|||||||
  } catch (error) {
 | 
					  } catch (error) {
 | 
				
			||||||
    console.error("Fehler beim Abrufen der Beschreibung:", error);
 | 
					    console.error("Fehler beim Abrufen der Beschreibung:", error);
 | 
				
			||||||
    modal.find(".modal-title").text("Fehler");
 | 
					    modal.find(".modal-title").text("Fehler");
 | 
				
			||||||
    modal.find(".dtc-desc").text("DTC-Beschreibung konnte nicht geladen werden");
 | 
					    modal
 | 
				
			||||||
 | 
					      .find(".dtc-desc")
 | 
				
			||||||
 | 
					      .text("DTC-Beschreibung konnte nicht geladen werden");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Modal anzeigen
 | 
					  // Modal anzeigen
 | 
				
			||||||
  modal.modal("show");
 | 
					  modal.modal("show");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
function fillDTCTable(dtcArray) {
 | 
					function fillDTCTable(dtcArray) {
 | 
				
			||||||
  // Referenz auf das Tabellen-Element
 | 
					  // Referenz auf das Tabellen-Element
 | 
				
			||||||
  var table = document.getElementById("dtc_table");
 | 
					  var table = document.getElementById("dtc_table");
 | 
				
			||||||
@@ -108,10 +116,27 @@ function fillDTCTable(dtcArray) {
 | 
				
			|||||||
    tablediv.hidden = true;
 | 
					    tablediv.hidden = true;
 | 
				
			||||||
    table.innerHTML = "";
 | 
					    table.innerHTML = "";
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  } else {
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Prüfen, ob sich der Inhalt der Tabelle geändert hat
 | 
				
			||||||
 | 
					  var tableContentChanged = false;
 | 
				
			||||||
 | 
					  for (var i = 0; i < dtcArray.length; i++) {
 | 
				
			||||||
 | 
					    var dtcInfo = dtcArray[i].split(",");
 | 
				
			||||||
 | 
					    var errorCode = parseInt(dtcInfo[1]);
 | 
				
			||||||
 | 
					    var activity = parseInt(dtcInfo[3]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!dtcState[errorCode] || dtcState[errorCode].activity !== activity) {
 | 
				
			||||||
 | 
					      tableContentChanged = true;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!tableContentChanged) {
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Zeige das Tabellen-Div, wenn DTC vorhanden sind
 | 
					  // Zeige das Tabellen-Div, wenn DTC vorhanden sind
 | 
				
			||||||
  tablediv.hidden = false;
 | 
					  tablediv.hidden = false;
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Tabelle leeren, bevor sie neu gefüllt wird
 | 
					  // Tabelle leeren, bevor sie neu gefüllt wird
 | 
				
			||||||
  table.innerHTML = "";
 | 
					  table.innerHTML = "";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -178,9 +178,12 @@ function fillValuesToHTML(dataset) {
 | 
				
			|||||||
          // Wenn das Element ein Settingsabschnitt-div ist
 | 
					          // Wenn das Element ein Settingsabschnitt-div ist
 | 
				
			||||||
          if (dataset[key] == 0) element.style.display = "none";
 | 
					          if (dataset[key] == 0) element.style.display = "none";
 | 
				
			||||||
          else element.style.display = "";
 | 
					          else element.style.display = "";
 | 
				
			||||||
        } else if (element.tagName === "DIV") {
 | 
					        } else if (element.tagName === "DIV" || element.tagName === "SPAN") {
 | 
				
			||||||
          if (element.classList.contains("format-time")) {
 | 
					          if (element.classList.contains("format-time")) {
 | 
				
			||||||
            element.innerText = formatTime(dataset[key]);
 | 
					            element.innerText = formatTime(dataset[key]);
 | 
				
			||||||
 | 
					          } else if (element.classList.contains("faction-logo")) {
 | 
				
			||||||
 | 
					            // Faction-Logo-Logik
 | 
				
			||||||
 | 
					            updateFactionLogo(element, dataset[key]);
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            element.innerText = dataset[key];
 | 
					            element.innerText = dataset[key];
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -190,6 +193,10 @@ function fillValuesToHTML(dataset) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    // Aktualisiere den <title>-Tag, wenn der Schlüssel 'devicename' im dataset vorhanden ist
 | 
				
			||||||
 | 
					    if (key === "devicename") {
 | 
				
			||||||
 | 
					      document.title = dataset[key];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -207,6 +214,22 @@ function formatTime(seconds) {
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function updateFactionLogo(element, faction) {
 | 
				
			||||||
 | 
					  const glowClass = "glow-active-faction";
 | 
				
			||||||
 | 
					  const factionClasses = ["faction1", "faction2", "faction3"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  factionClasses.forEach((factionClass) => {
 | 
				
			||||||
 | 
					    if (
 | 
				
			||||||
 | 
					      factionClass === "faction" + faction &&
 | 
				
			||||||
 | 
					      element.classList.contains(factionClass)
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					      element.classList.add(glowClass);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      element.classList.remove(glowClass);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Funktion zum Setzen des ausgewählten Werts für Dropdowns
 | 
					// Funktion zum Setzen des ausgewählten Werts für Dropdowns
 | 
				
			||||||
function setDropdownValue(selectElement, value) {
 | 
					function setDropdownValue(selectElement, value) {
 | 
				
			||||||
  for (var i = 0; i < selectElement.options.length; i++) {
 | 
					  for (var i = 0; i < selectElement.options.length; i++) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,8 +12,10 @@
 | 
				
			|||||||
#define TRUE 1
 | 
					#define TRUE 1
 | 
				
			||||||
#define FALSE 0
 | 
					#define FALSE 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef HOST_NAME
 | 
					#ifndef DEVICE_NAME
 | 
				
			||||||
#define HOST_NAME "AirsoftTimer_%08X"
 | 
					#define HOST_NAME "AirsoftTimer"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define HOST_NAME DEVICE_NAME
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SHUTDOWN_DELAY_MS 5000
 | 
					#define SHUTDOWN_DELAY_MS 5000
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@ typedef struct Globals_s
 | 
				
			|||||||
  char systemStatustxt[16] = "";                 /**< Text representation of system status */
 | 
					  char systemStatustxt[16] = "";                 /**< Text representation of system status */
 | 
				
			||||||
  EERequest_t requestEEAction = EE_IDLE;         /**< EEPROM-related request */
 | 
					  EERequest_t requestEEAction = EE_IDLE;         /**< EEPROM-related request */
 | 
				
			||||||
  char DeviceName[33];                           /**< Device name */
 | 
					  char DeviceName[33];                           /**< Device name */
 | 
				
			||||||
 | 
					  char DeviceNameId[sizeof(DeviceName) + 8];     /**< Device name plus 8 chars chipID */
 | 
				
			||||||
  char FlashVersion[10];                         /**< Flash version */
 | 
					  char FlashVersion[10];                         /**< Flash version */
 | 
				
			||||||
  uint16_t eePersistanceAdress;                  /**< EEPROM persistence address */
 | 
					  uint16_t eePersistanceAdress;                  /**< EEPROM persistence address */
 | 
				
			||||||
  bool hasDTC;
 | 
					  bool hasDTC;
 | 
				
			||||||
@@ -31,8 +32,8 @@ typedef struct Constants_s
 | 
				
			|||||||
} Constants_t;
 | 
					} Constants_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Constants_t constants PROGMEM = {
 | 
					const Constants_t constants PROGMEM = {
 | 
				
			||||||
    1, 5,   // Firmware_Version
 | 
					    FW_MAJOR, FW_MINOR,   // Firmware_Version
 | 
				
			||||||
    1, 5,   // Required Flash Version
 | 
					    FL_MAJOR, FL_MINOR,   // Required Flash Version
 | 
				
			||||||
    GIT_REV // Git-Hash-String
 | 
					    GIT_REV // Git-Hash-String
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,9 @@ platform = espressif8266
 | 
				
			|||||||
framework = arduino
 | 
					framework = arduino
 | 
				
			||||||
board = d1_mini
 | 
					board = d1_mini
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					custom_firmware_version = 1.05 
 | 
				
			||||||
 | 
					custom_flash_version = 1.05 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
upload_protocol = esptool
 | 
					upload_protocol = esptool
 | 
				
			||||||
upload_speed = 921600
 | 
					upload_speed = 921600
 | 
				
			||||||
;upload_port = 10.0.1.48
 | 
					;upload_port = 10.0.1.48
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,7 +84,8 @@ void setup()
 | 
				
			|||||||
	system_update_cpu_freq(SYS_CPU_80MHZ);
 | 
						system_update_cpu_freq(SYS_CPU_80MHZ);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Generate a unique device name based on ESP chip ID
 | 
						// Generate a unique device name based on ESP chip ID
 | 
				
			||||||
	snprintf(globals.DeviceName, 32, HOST_NAME, ESP.getChipId());
 | 
						strncpy(globals.DeviceName, HOST_NAME, sizeof(globals.DeviceName));
 | 
				
			||||||
 | 
						snprintf(globals.DeviceNameId, sizeof(globals.DeviceNameId), "%s_%08X", globals.DeviceName, ESP.getChipId());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Disable WiFi persistent storage
 | 
						// Disable WiFi persistent storage
 | 
				
			||||||
	WiFi.persistent(false);
 | 
						WiFi.persistent(false);
 | 
				
			||||||
@@ -95,7 +96,7 @@ void setup()
 | 
				
			|||||||
#ifdef FEATURE_ENABLE_WIFI_CLIENT
 | 
					#ifdef FEATURE_ENABLE_WIFI_CLIENT
 | 
				
			||||||
	// Configure WiFi settings for client mode if enabled
 | 
						// Configure WiFi settings for client mode if enabled
 | 
				
			||||||
	WiFi.mode(WIFI_STA);
 | 
						WiFi.mode(WIFI_STA);
 | 
				
			||||||
	WiFi.setHostname(globals.DeviceName);
 | 
						WiFi.setHostname(globals.DeviceNameId);
 | 
				
			||||||
	wifiMulti.addAP(QUOTE(WIFI_SSID_CLIENT), QUOTE(WIFI_PASSWORD_CLIENT));
 | 
						wifiMulti.addAP(QUOTE(WIFI_SSID_CLIENT), QUOTE(WIFI_PASSWORD_CLIENT));
 | 
				
			||||||
	tmrWiFiMaintainConnection.start();
 | 
						tmrWiFiMaintainConnection.start();
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
@@ -108,7 +109,7 @@ void setup()
 | 
				
			|||||||
	Serial.setDebugOutput(false);
 | 
						Serial.setDebugOutput(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Serial.print("\n\n-------------------START-------------------\n");
 | 
						Serial.print("\n\n-------------------START-------------------\n");
 | 
				
			||||||
	Serial.print(globals.DeviceName);
 | 
						Serial.print(globals.DeviceNameId);
 | 
				
			||||||
	Serial.print("\nby Hiabuto Defense\n");
 | 
						Serial.print("\nby Hiabuto Defense\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Initialize EEPROM, load configuration, and persistence data from EEPROM
 | 
						// Initialize EEPROM, load configuration, and persistence data from EEPROM
 | 
				
			||||||
@@ -150,7 +151,7 @@ void setup()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Set up OTA updates
 | 
						// Set up OTA updates
 | 
				
			||||||
	ArduinoOTA.setPort(8266);
 | 
						ArduinoOTA.setPort(8266);
 | 
				
			||||||
	ArduinoOTA.setHostname(globals.DeviceName);
 | 
						ArduinoOTA.setHostname(globals.DeviceNameId);
 | 
				
			||||||
	ArduinoOTA.setPassword(QUOTE(ADMIN_PASSWORD));
 | 
						ArduinoOTA.setPassword(QUOTE(ADMIN_PASSWORD));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ArduinoOTA.onStart([]()
 | 
						ArduinoOTA.onStart([]()
 | 
				
			||||||
@@ -583,7 +584,7 @@ void toggleWiFiAP(bool shutdown)
 | 
				
			|||||||
		// Start WiFi in Access Point (AP) mode
 | 
							// Start WiFi in Access Point (AP) mode
 | 
				
			||||||
		WiFi.mode(WIFI_AP);
 | 
							WiFi.mode(WIFI_AP);
 | 
				
			||||||
		WiFi.softAPConfig(IPAddress(WIFI_AP_IP_GW), IPAddress(WIFI_AP_IP_GW), IPAddress(255, 255, 255, 0));
 | 
							WiFi.softAPConfig(IPAddress(WIFI_AP_IP_GW), IPAddress(WIFI_AP_IP_GW), IPAddress(255, 255, 255, 0));
 | 
				
			||||||
		WiFi.softAP(globals.DeviceName, QUOTE(WIFI_AP_PASSWORD));
 | 
							WiFi.softAP(globals.DeviceNameId, QUOTE(WIFI_AP_PASSWORD));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Stop WiFi maintenance connection ticker if enabled and display debug messages
 | 
							// Stop WiFi maintenance connection ticker if enabled and display debug messages
 | 
				
			||||||
#ifdef FEATURE_ENABLE_WIFI_CLIENT
 | 
					#ifdef FEATURE_ENABLE_WIFI_CLIENT
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,7 +71,7 @@ void initWebUI()
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Initialize mDNS and add service
 | 
					  // Initialize mDNS and add service
 | 
				
			||||||
  MDNS.begin(globals.DeviceName);
 | 
					  MDNS.begin(globals.DeviceNameId);
 | 
				
			||||||
  MDNS.addService("http", "tcp", 80);
 | 
					  MDNS.addService("http", "tcp", 80);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Set up WebSocket event handler and attach to web server
 | 
					  // Set up WebSocket event handler and attach to web server
 | 
				
			||||||
@@ -342,7 +342,7 @@ void WebServerEEJSON_Callback(AsyncWebServerRequest *request)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  char buffer[16];
 | 
					  char buffer[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  info["DeviceName"] = globals.DeviceName;
 | 
					  info["DeviceNameId"] = globals.DeviceNameId;
 | 
				
			||||||
  sprintf(buffer, "%d.%02d", constants.Required_Flash_Version_major, constants.Required_Flash_Version_minor);
 | 
					  sprintf(buffer, "%d.%02d", constants.Required_Flash_Version_major, constants.Required_Flash_Version_minor);
 | 
				
			||||||
  info["FW-Version"] = buffer;
 | 
					  info["FW-Version"] = buffer;
 | 
				
			||||||
  info["FS-Version"] = globals.FlashVersion;
 | 
					  info["FS-Version"] = globals.FlashVersion;
 | 
				
			||||||
@@ -653,6 +653,7 @@ void Websocket_RefreshClientData_Static(uint32_t client_id, bool send_mapping)
 | 
				
			|||||||
  if (send_mapping)
 | 
					  if (send_mapping)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    const char mapping[] = "MAPPING_STATIC:"
 | 
					    const char mapping[] = "MAPPING_STATIC:"
 | 
				
			||||||
 | 
					                           "devicename;"
 | 
				
			||||||
                           "active_faction_on_reboot;"
 | 
					                           "active_faction_on_reboot;"
 | 
				
			||||||
                           "batteryType;"
 | 
					                           "batteryType;"
 | 
				
			||||||
                           "name_faction1;"
 | 
					                           "name_faction1;"
 | 
				
			||||||
@@ -669,6 +670,7 @@ void Websocket_RefreshClientData_Static(uint32_t client_id, bool send_mapping)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  String temp = "STATIC:";
 | 
					  String temp = "STATIC:";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  temp.concat(String(globals.DeviceName) + ";");
 | 
				
			||||||
  temp.concat(String(ConfigData.active_faction_on_reboot) + ";");
 | 
					  temp.concat(String(ConfigData.active_faction_on_reboot) + ";");
 | 
				
			||||||
  temp.concat(String(ConfigData.batteryType) + ";");
 | 
					  temp.concat(String(ConfigData.batteryType) + ";");
 | 
				
			||||||
  temp.concat(String(ConfigData.Faction_1_Name) + ";");
 | 
					  temp.concat(String(ConfigData.Faction_1_Name) + ";");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user