diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c
index bda4be016..de889f3c5 100644
--- a/src/httpserver/http_fns.c
+++ b/src/httpserver/http_fns.c
@@ -1159,6 +1159,7 @@ int http_fn_cfg(http_request_t *request) {
poststr(request,htmlHeader);
poststr(request,g_header);
poststr(request,"
");
+ poststr(request,"");
poststr(request,"");
poststr(request,"");
poststr(request,"");
@@ -1321,6 +1322,42 @@ int http_fn_cfg_pins(http_request_t *request) {
return 0;
}
+int http_fn_cfg_generic(http_request_t *request) {
+ int iChanged = 0;
+ int iChangedRequested = 0;
+ int i;
+ char tmpA[128];
+ char tmpB[64];
+
+ http_setup(request, httpMimeTypeHTML);
+ poststr(request,htmlHeader);
+ poststr(request,g_header);
+
+ if( http_getArg(request->url,"boot_ok_delay",tmpA,sizeof(tmpA))) {
+ i = atoi(tmpA);
+ if(i <= 0) {
+ poststr(request,"Boot ok delay must be at least 1 second");
+ i = 1;
+ }
+ hprintf128(request,"Setting boot OK delay to %i",i);
+ CFG_SetBootOkSeconds(i);
+ }
+
+ poststr(request,"
");
+
+ poststr(request,htmlReturnToCfg);
+ HTTP_AddBuildFooter(request);
+ poststr(request,htmlEnd);
+
+ poststr(request, NULL);
+ return 0;
+}
+
void XR809_RequestOTAHTTP(const char *s);
int http_fn_ota_exec(http_request_t *request) {
diff --git a/src/httpserver/http_fns.h b/src/httpserver/http_fns.h
index 78056b54e..09975db85 100644
--- a/src/httpserver/http_fns.h
+++ b/src/httpserver/http_fns.h
@@ -29,3 +29,4 @@ int http_fn_empty_url(http_request_t *request);
int http_fn_other(http_request_t *request);
int http_fn_cm(http_request_t *request);
int http_fn_startup_command(http_request_t *request);
+int http_fn_cfg_generic(http_request_t *request);
diff --git a/src/httpserver/new_http.c b/src/httpserver/new_http.c
index 5236e6951..4bd7612fb 100644
--- a/src/httpserver/new_http.c
+++ b/src/httpserver/new_http.c
@@ -530,6 +530,7 @@ int HTTP_ProcessPacket(http_request_t *request) {
if(http_checkUrlBase(urlStr,"cmd_tool")) return http_fn_cmd_tool(request);
if(http_checkUrlBase(urlStr,"config_dump_table")) return http_fn_config_dump_table(request);
if(http_checkUrlBase(urlStr,"startup_command")) return http_fn_startup_command(request);
+ if(http_checkUrlBase(urlStr,"cfg_generic")) return http_fn_cfg_generic(request);
if(http_checkUrlBase(urlStr,"cfg_quick")) return http_fn_cfg_quick(request);
if(http_checkUrlBase(urlStr,"cfg_ha")) return http_fn_cfg_ha(request);
diff --git a/src/new_cfg.c b/src/new_cfg.c
index 5bf7b6c4f..7a1ac90cb 100644
--- a/src/new_cfg.c
+++ b/src/new_cfg.c
@@ -8,6 +8,7 @@
#include "hal/hal_flashConfig.h"
#include "cmnds/cmd_public.h"
+#define DEFAULT_BOOT_SUCCESS_TIME 30
mainConfig_t g_cfg;
int g_configInitialized = 0;
@@ -120,6 +121,7 @@ static void CFG_SetDefaultConfig() {
g_cfg.ident0 = CFG_IDENT_0;
g_cfg.ident1 = CFG_IDENT_1;
g_cfg.ident2 = CFG_IDENT_2;
+ g_cfg.timeRequiredToMarkBootSuccessfull = DEFAULT_BOOT_SUCCESS_TIME;
strcpy(g_cfg.ping_host,"192.168.0.1");
strcpy(g_cfg.mqtt_host, "192.168.0.113");
strcpy(g_cfg.mqtt_brokerName, "test");
@@ -144,6 +146,24 @@ const char *CFG_GetShortStartupCommand() {
return g_cfg.initCommandLine;
}
+void CFG_SetBootOkSeconds(int v) {
+ // at least 1 second, always
+ if(v < 1)
+ v = 1;
+ if(g_cfg.timeRequiredToMarkBootSuccessfull != v) {
+ g_cfg.timeRequiredToMarkBootSuccessfull = v;
+ g_cfg_pendingChanges++;
+ }
+}
+int CFG_GetBootOkSeconds() {
+ if(g_configInitialized==0){
+ return DEFAULT_BOOT_SUCCESS_TIME;
+ }
+ if(g_cfg.timeRequiredToMarkBootSuccessfull <= 0) {
+ return DEFAULT_BOOT_SUCCESS_TIME;
+ }
+ return g_cfg.timeRequiredToMarkBootSuccessfull;
+}
const char *CFG_GetPingHost() {
return g_cfg.ping_host;
}
diff --git a/src/new_cfg.h b/src/new_cfg.h
index 20212a36d..aec23ca6c 100644
--- a/src/new_cfg.h
+++ b/src/new_cfg.h
@@ -42,7 +42,8 @@ int CFG_GetPingIntervalSeconds();
void CFG_SetPingHost(const char *s);
void CFG_SetPingDisconnectedSecondsToRestart(int i);
void CFG_SetPingIntervalSeconds(int i);
-
+void CFG_SetBootOkSeconds(int v);
+int CFG_GetBootOkSeconds();
diff --git a/src/new_pins.h b/src/new_pins.h
index 5f0a37e7e..ebf5b4999 100644
--- a/src/new_pins.h
+++ b/src/new_pins.h
@@ -118,7 +118,8 @@ typedef struct mainConfig_s {
pinsState_t pins;
byte unusedSectorA[256];
byte unusedSectorB[128];
- byte unusedSectorC[56];
+ byte unusedSectorC[55];
+ byte timeRequiredToMarkBootSuccessfull;
int ping_interval;
int ping_seconds;
char ping_host[64];
diff --git a/src/user_main.c b/src/user_main.c
index 9fbb144e4..20b4f1edd 100644
--- a/src/user_main.c
+++ b/src/user_main.c
@@ -158,6 +158,7 @@ void CFG_Save_SetupTimer() {
void Main_OnPingCheckerReply(int ms) {
g_timeSinceLastPingReply = 0;
}
+int g_bBootMarkedOK = 0;
void Main_OnEverySecond()
{
int bMQTTconnected;
@@ -207,9 +208,14 @@ void Main_OnEverySecond()
}
// when we hit 30s, mark as boot complete.
- if (g_secondsElapsed == BOOT_COMPLETE_SECONDS){
- HAL_FlashVars_SaveBootComplete();
- g_bootFailures = HAL_FlashVars_GetBootFailures();
+ if(g_bBootMarkedOK==false) {
+ int bootCompleteSeconds = CFG_GetBootOkSeconds();
+ if (g_secondsElapsed > bootCompleteSeconds){
+ ADDLOGF_INFO("Boot complete time reached (%i seconds)\n",bootCompleteSeconds);
+ HAL_FlashVars_SaveBootComplete();
+ g_bootFailures = HAL_FlashVars_GetBootFailures();
+ g_bBootMarkedOK = true;
+ }
}
if (g_openAP){