浏览代码

Firmware update UI revamp with support for local proxy

Sebastien 4 年之前
父节点
当前提交
4a529d6fbd

+ 6 - 2
components/platform_console/cmd_config.c

@@ -1001,8 +1001,12 @@ void register_config_cmd(void){
 	register_audio_config();
 	register_audio_config();
 //	register_squeezelite_config();
 //	register_squeezelite_config();
 	register_bt_source_config();
 	register_bt_source_config();
-	register_i2s_config();
-	register_spdif_config();
+	if(!is_dac_config_locked()){
+		register_i2s_config();
+	}
+	if(!is_spdif_config_locked()){
+		register_spdif_config();
+	}
 	register_rotary_config();
 	register_rotary_config();
 }
 }
 
 

+ 2 - 2
components/squeezelite-ota/squeezelite-ota.c

@@ -633,7 +633,7 @@ void ota_task(void *pvParameter)
 				gettimeofday(&tv, NULL);
 				gettimeofday(&tv, NULL);
 				uint32_t elapsed_ms= (tv.tv_sec-ota_status->OTA_start.tv_sec )*1000+(tv.tv_usec-ota_status->OTA_start.tv_usec)/1000;
 				uint32_t elapsed_ms= (tv.tv_sec-ota_status->OTA_start.tv_sec )*1000+(tv.tv_usec-ota_status->OTA_start.tv_usec)/1000;
 				ESP_LOGI(TAG,"OTA progress : %d/%.0f (%d pct), %d KB/s", ota_status->actual_image_len, ota_status->total_image_len, ota_status->newpct, elapsed_ms>0?ota_status->actual_image_len*1000/elapsed_ms/1024:0);
 				ESP_LOGI(TAG,"OTA progress : %d/%.0f (%d pct), %d KB/s", ota_status->actual_image_len, ota_status->total_image_len, ota_status->newpct, elapsed_ms>0?ota_status->actual_image_len*1000/elapsed_ms/1024:0);
-				sendMessaging(MESSAGING_INFO,"Writing binary file %%%3d.",ota_status->newpct);
+				sendMessaging(MESSAGING_INFO,"Writing binary file %3d %%.",ota_status->newpct);
 				ota_status->lastpct=ota_status->newpct;
 				ota_status->lastpct=ota_status->newpct;
 			}
 			}
 			taskYIELD();
 			taskYIELD();
@@ -662,7 +662,7 @@ void ota_task(void *pvParameter)
     	ESP_LOGI(TAG,"OTA Process completed successfully!");
     	ESP_LOGI(TAG,"OTA Process completed successfully!");
     	sendMessaging(MESSAGING_INFO,"Success!");
     	sendMessaging(MESSAGING_INFO,"Success!");
     	IF_DISPLAY(GDS_TextLine(display, 2, GDS_TEXT_LEFT, GDS_TEXT_CLEAR | GDS_TEXT_UPDATE, "Success!"));
     	IF_DISPLAY(GDS_TextLine(display, 2, GDS_TEXT_LEFT, GDS_TEXT_CLEAR | GDS_TEXT_UPDATE, "Success!"));
-    	vTaskDelay(1500/ portTICK_PERIOD_MS);  // wait here to give the UI a chance to refresh
+    	vTaskDelay(3500/ portTICK_PERIOD_MS);  // wait here to give the UI a chance to refresh
     	IF_DISPLAY(GDS_Clear(display,GDS_COLOR_BLACK));
     	IF_DISPLAY(GDS_Clear(display,GDS_COLOR_BLACK));
         esp_restart();
         esp_restart();
     } else {
     } else {

+ 1 - 1
components/wifi-manager/webapp/.eslintcache

@@ -1 +1 @@
-[{"C:\\Users\\sle11\\Documents\\VSCode\\squeezelite-esp32\\components\\wifi-manager\\webapp\\src\\js\\test.js":"1","C:\\Users\\sle11\\Documents\\VSCode\\squeezelite-esp32\\components\\wifi-manager\\webapp\\src\\js\\custom.js":"2"},{"size":4775,"mtime":1608244817341,"results":"3","hashOfConfig":"4"},{"size":57729,"mtime":1618063084495,"results":"5","hashOfConfig":"4"},{"filePath":"6","messages":"7","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"8"},"1lj4yrw",{"filePath":"9","messages":"10","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"C:\\Users\\sle11\\Documents\\VSCode\\squeezelite-esp32\\components\\wifi-manager\\webapp\\src\\js\\test.js",[],[],"C:\\Users\\sle11\\Documents\\VSCode\\squeezelite-esp32\\components\\wifi-manager\\webapp\\src\\js\\custom.js",[]]
+[{"C:\\Users\\sle11\\Documents\\VSCode\\squeezelite-esp32\\components\\wifi-manager\\webapp\\src\\js\\test.js":"1","C:\\Users\\sle11\\Documents\\VSCode\\squeezelite-esp32\\components\\wifi-manager\\webapp\\src\\js\\custom.js":"2"},{"size":4775,"mtime":1608244817341,"results":"3","hashOfConfig":"4"},{"size":61704,"mtime":1618437799595,"results":"5","hashOfConfig":"4"},{"filePath":"6","messages":"7","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"8"},"1275pne",{"filePath":"9","messages":"10","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"C:\\Users\\sle11\\Documents\\VSCode\\squeezelite-esp32\\components\\wifi-manager\\webapp\\src\\js\\test.js",[],[],"C:\\Users\\sle11\\Documents\\VSCode\\squeezelite-esp32\\components\\wifi-manager\\webapp\\src\\js\\custom.js",[]]

+ 93 - 21
components/wifi-manager/webapp/mock/messages_ota.json

@@ -1,51 +1,123 @@
-[{
+[
+	{
+		"message":	"Save Success",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_SYSTEM",
+		"sent_time":	14084,
+		"current_time":	16958
+	}, {
 		"message":	"{\"ota_dsc\":\"Initializing...\",\"ota_pct\":0}",
 		"message":	"{\"ota_dsc\":\"Initializing...\",\"ota_pct\":0}",
 		"type":	"MESSAGING_INFO",
 		"type":	"MESSAGING_INFO",
 		"class":	"MESSAGING_CLASS_OTA",
 		"class":	"MESSAGING_CLASS_OTA",
-		"sent_time":	119203,
-		"current_time":	121837
+		"sent_time":	14110,
+		"current_time":	16958
 	}, {
 	}, {
 		"message":	"{\"ota_dsc\":\"Starting OTA...\",\"ota_pct\":0}",
 		"message":	"{\"ota_dsc\":\"Starting OTA...\",\"ota_pct\":0}",
 		"type":	"MESSAGING_INFO",
 		"type":	"MESSAGING_INFO",
 		"class":	"MESSAGING_CLASS_OTA",
 		"class":	"MESSAGING_CLASS_OTA",
-		"sent_time":	119255,
-		"current_time":	121838
+		"sent_time":	14146,
+		"current_time":	16958
 	}, {
 	}, {
-		"message":	"{\"ota_dsc\":\"Erasing...\",\"ota_pct\":0}",
+		"message":	"{\"ota_dsc\":\"Downloading firmware\",\"ota_pct\":0}",
 		"type":	"MESSAGING_INFO",
 		"type":	"MESSAGING_INFO",
 		"class":	"MESSAGING_CLASS_OTA",
 		"class":	"MESSAGING_CLASS_OTA",
-		"sent_time":	119255,
-		"current_time":	121838
+		"sent_time":	15208,
+		"current_time":	16958
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Download success\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	18825,
+		"current_time":	22219
 	}, {
 	}, {
-		"message":	"{\"ota_dsc\":\"Erasing...\",\"ota_pct\":10}",
+		"message":	"{\"ota_dsc\":\"New version is : mock version \",\"ota_pct\":0}",
 		"type":	"MESSAGING_INFO",
 		"type":	"MESSAGING_INFO",
 		"class":	"MESSAGING_CLASS_OTA",
 		"class":	"MESSAGING_CLASS_OTA",
-		"sent_time":	119255,
-		"current_time":	121838
+		"sent_time":	18849,
+		"current_time":	22220
 	}, {
 	}, {
-		"message":	"{\"ota_dsc\":\"Erasing...\",\"ota_pct\":100}",
+		"message":	"{\"ota_dsc\":\"Formatting OTA partition\",\"ota_pct\":0}",
 		"type":	"MESSAGING_INFO",
 		"type":	"MESSAGING_INFO",
 		"class":	"MESSAGING_CLASS_OTA",
 		"class":	"MESSAGING_CLASS_OTA",
-		"sent_time":	119255,
-		"current_time":	121838
+		"sent_time":	18850,
+		"current_time":	22220
 	}, {
 	}, {
-		"message":	"{\"ota_dsc\":\"Flashing...\",\"ota_pct\":10}",
+		"message":	"{\"ota_dsc\":\"Erasing flash (1/11)\",\"ota_pct\":0}",
 		"type":	"MESSAGING_INFO",
 		"type":	"MESSAGING_INFO",
 		"class":	"MESSAGING_CLASS_OTA",
 		"class":	"MESSAGING_CLASS_OTA",
-		"sent_time":	119255,
-		"current_time":	121838
+		"sent_time":	22217,
+		"current_time":	22220
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Erasing flash (5/11)\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	29896,
+		"current_time":	29902
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Erasing flash (7/11)\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	33395,
+		"current_time":	33408
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Erasing flash (9/11)\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	36843,
+		"current_time":	54597
 	}, {
 	}, {
-		"message":	"{\"ota_dsc\":\"Erasing...\",\"ota_pct\":90}",
+		"message":	"{\"ota_dsc\":\"Erasing flash complete.\",\"ota_pct\":0}",
 		"type":	"MESSAGING_INFO",
 		"type":	"MESSAGING_INFO",
 		"class":	"MESSAGING_CLASS_OTA",
 		"class":	"MESSAGING_CLASS_OTA",
-		"sent_time":	119255,
-		"current_time":	121838
+		"sent_time":	39463,
+		"current_time":	54597
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":5}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	41862,
+		"current_time":	54597
 	}, {
 	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":10}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	44003,
+		"current_time":	54597
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":40}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	56678,
+		"current_time":	65185
+	},  {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":70}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	69407,
+		"current_time":	77858
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":95}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	80010,
+		"current_time":	82592
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":100}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	82084,
+		"current_time":	82592
+	},
+	{
 		"message":	"{\"ota_dsc\":\"Success!\",\"ota_pct\":100}",
 		"message":	"{\"ota_dsc\":\"Success!\",\"ota_pct\":100}",
 		"type":	"MESSAGING_INFO",
 		"type":	"MESSAGING_INFO",
 		"class":	"MESSAGING_CLASS_OTA",
 		"class":	"MESSAGING_CLASS_OTA",
 		"sent_time":	119255,
 		"sent_time":	119255,
 		"current_time":	121838
 		"current_time":	121838
 	}
 	}
-	
+
 	]
 	]

+ 117 - 0
components/wifi-manager/webapp/mock/messages_ota_flash.json

@@ -0,0 +1,117 @@
+[
+	{
+		"message":	"{\"ota_dsc\":\"Initializing...\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	14110,
+		"current_time":	16958
+	}, {
+		"message":	"{\"ota_dsc\":\"Starting OTA...\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	14146,
+		"current_time":	16958
+	}, {
+		"message":	"{\"ota_dsc\":\"New version is : mock version \",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	18849,
+		"current_time":	22220
+	}, {
+		"message":	"{\"ota_dsc\":\"Formatting OTA partition\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	18850,
+		"current_time":	22220
+	}, {
+		"message":	"{\"ota_dsc\":\"Erasing flash (1/11)\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	22217,
+		"current_time":	22220
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Erasing flash (5/11)\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	29896,
+		"current_time":	29902
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Erasing flash (7/11)\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	33395,
+		"current_time":	33408
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Erasing flash (9/11)\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	36843,
+		"current_time":	54597
+	}, {
+		"message":	"{\"ota_dsc\":\"Erasing flash complete.\",\"ota_pct\":0}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	39463,
+		"current_time":	54597
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":5}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	41862,
+		"current_time":	54597
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":25}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	50307,
+		"current_time":	54598
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":30}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	52455,
+		"current_time":	54598
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":35}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	54603,
+		"current_time":	65184
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":55}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	63042,
+		"current_time":	65185
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":60}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	65190,
+		"current_time":	77858
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":95}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	80010,
+		"current_time":	82592
+	}, {
+		"message":	"{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":100}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	82084,
+		"current_time":	82592
+	},
+	{
+		"message":	"{\"ota_dsc\":\"Success!\",\"ota_pct\":100}",
+		"type":	"MESSAGING_INFO",
+		"class":	"MESSAGING_CLASS_OTA",
+		"sent_time":	119255,
+		"current_time":	121838
+	}
+	]

+ 4 - 1
components/wifi-manager/webapp/mock/status.json

@@ -18,6 +18,9 @@
 	"lms_cport": 9090,
 	"lms_cport": 9090,
 	"lms_port": 9100,
 	"lms_port": 9100,
 	"lms_ip": "127.0.0.1",
 	"lms_ip": "127.0.0.1",
+	"platform_name": "SqueezeAmp",
 	"mock_plugin_has_proxy": "x",
 	"mock_plugin_has_proxy": "x",
-	"platform_name": "SqueezeAmp"
+	"mock_fail_fw_update":"",
+	"mock_fail_recovery":"",
+	"mock_old_recovery":""
 }
 }

+ 10 - 14
components/wifi-manager/webapp/src/index.ejs

@@ -26,11 +26,11 @@
 		<div class="collapse navbar-collapse" id="navbarSupportedContent">
 		<div class="collapse navbar-collapse" id="navbarSupportedContent">
 			<ul class="nav navbar-nav mr-auto">
 			<ul class="nav navbar-nav mr-auto">
 				<li class="nav-item"><a class="nav-link active" data-toggle="tab" href="#tab-wifi">WiFi</a></li>
 				<li class="nav-item"><a class="nav-link active" data-toggle="tab" href="#tab-wifi">WiFi</a></li>
-				<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-syslog">Status<span
+				<li class="nav-item omsg"><a class="nav-link" data-toggle="tab" href="#tab-syslog">Status<span
 							class="badge badge-pill badge-success" id="msgcnt"></span></a></li>
 							class="badge badge-pill badge-success" id="msgcnt"></span></a></li>
-				<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-cfg-audio">Audio</a></li>
-				<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-cfg-syst">System</a></li>
-				<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-cfg-hw">Hardware</a></li>
+				<li class="nav-item orec"><a class="nav-link" data-toggle="tab" href="#tab-cfg-audio">Audio</a></li>
+				<li class="nav-item orec"><a class="nav-link" data-toggle="tab" href="#tab-cfg-syst">System</a></li>
+				<li class="nav-item orec"><a class="nav-link" data-toggle="tab" href="#tab-cfg-hw">Hardware</a></li>
 				<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-cfg-fw">Updates</a></li>
 				<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-cfg-fw">Updates</a></li>
 				<div class="dropdown-divider"></div>
 				<div class="dropdown-divider"></div>
 				<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-nvs">NVS Editor</a></li>
 				<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-nvs">NVS Editor</a></li>
@@ -78,7 +78,7 @@
 
 
 		</div>
 		</div>
 	</header>
 	</header>
-	<main role="main" class="flex-grow mt-1 mb-5" id="content">
+	<main role="main" class="flex-grow mt-1 mb-12" style="margin-bottom: 7rem;" id="content">
 		<!-- Button trigger modal -->
 		<!-- Button trigger modal -->
   
   
   <!-- Modal -->
   <!-- Modal -->
@@ -185,10 +185,10 @@
 						</div>
 						</div>
 					</div>
 					</div>
 				</div>
 				</div>
-				<div class="card text-white mb-3 recovery_element" style="display: none;">
+				<div class="card text-white mb-3" >
 					<div class="card-header">Local Firmware Upload</div>
 					<div class="card-header">Local Firmware Upload</div>
 					<div class="card-body">
 					<div class="card-body">
-							<div id="uploaddiv" class="recovery_element form-group row">
+							<div id="uploaddiv" class="form-group row">
 									<label for="flashfilename" class="col-auto col-form-label">Local File</label>
 									<label for="flashfilename" class="col-auto col-form-label">Local File</label>
 									<div class="col">
 									<div class="col">
 										<input type="file" class="form-control-file" id="flashfilename" aria-describedby="fileHelp">
 										<input type="file" class="form-control-file" id="flashfilename" aria-describedby="fileHelp">
@@ -217,12 +217,8 @@
 				<tbody id="nvsTable">
 				<tbody id="nvsTable">
 				</tbody>
 				</tbody>
 			</table>
 			</table>
-			<div class="buttons">
-				<div id="boot-div">
-					<form id="reboot-form" action="/reboot.json" method="post" target="dummyframe">
-						<button id="reboot-button" type="submit" class="btn btn-primary">Reboot</button>
-					</form>
-				</div>
+			<div class="d-flex justify-content-between ">
+				<button button id="reboot-button"  class="btn btn-primary"  type="submit" onclick="handleReboot('reboot');" >Reboot</button>
 				<input id="save-nvs" type="button" class="btn btn-success" value="Commit">
 				<input id="save-nvs" type="button" class="btn btn-success" value="Commit">
 				<input id="save-as-nvs" type="button" class="btn btn-success" value="Download config">
 				<input id="save-as-nvs" type="button" class="btn btn-success" value="Download config">
 				<input id="load-nvs" type="button" class="btn btn-success" value="Load File">
 				<input id="load-nvs" type="button" class="btn btn-success" value="Load File">
@@ -411,7 +407,7 @@
 					</div>
 					</div>
 				</div>
 				</div>
 			</div>
 			</div>
-			<div class="card border-primary mb-3">
+			<div class="card border-primary mb-3" id="pins" style="display: none;">
 				<div class="card-header">Pin Assignments</div>
 				<div class="card-header">Pin Assignments</div>
 				<div class="card-body">
 				<div class="card-body">
 					<table class="table table-hover">
 					<table class="table table-hover">

+ 193 - 79
components/wifi-manager/webapp/src/js/custom.js

@@ -112,14 +112,16 @@ const flash_status_codes = {
   REBOOT_TO_RECOVERY: 2,
   REBOOT_TO_RECOVERY: 2,
   SET_FWURL: 5,
   SET_FWURL: 5,
   FLASHING: 6,
   FLASHING: 6,
-  DONE: 7
+  DONE: 7,
+  UPLOADING: 8,
+  ERROR: 9
 };
 };
 let flash_state=flash_status_codes.FLASH_NONE;
 let flash_state=flash_status_codes.FLASH_NONE;
 let flash_ota_dsc='';
 let flash_ota_dsc='';
 let flash_ota_pct=0;
 let flash_ota_pct=0;
 let older_recovery=false;
 let older_recovery=false;
 function isFlashExecuting(data){
 function isFlashExecuting(data){
-  return data.ota_dsc!='' || data.ota_pct>0;
+  return (flash_state!=flash_status_codes.UPLOADING ) && (data.ota_dsc!='' || data.ota_pct>0);
 }
 }
 function post_config(data){
 function post_config(data){
   let confPayload={
   let confPayload={
@@ -140,16 +142,21 @@ function process_ota_event(data){
   if(data.ota_dsc){
   if(data.ota_dsc){
     flash_ota_dsc=data.ota_dsc;
     flash_ota_dsc=data.ota_dsc;
   }
   }
-  if(data.ota_pct){
+  if( data.ota_pct != undefined){
     flash_ota_pct=data.ota_pct;
     flash_ota_pct=data.ota_pct;
   }
   }
-  if(isFlashExecuting(data)){
+  
+  if(flash_state==flash_status_codes.ERROR){
+    return;
+  }
+  else if(isFlashExecuting(data)){
     flash_state=flash_status_codes.FLASHING;
     flash_state=flash_status_codes.FLASHING;
   }  
   }  
-  if(flash_state==flash_status_codes.FLASHING){
+  else if(flash_state==flash_status_codes.FLASHING ){
     if(flash_ota_pct ==100){
     if(flash_ota_pct ==100){
       // we were processing OTA, and we've reached 100%
       // we were processing OTA, and we've reached 100%
       flash_state=flash_status_codes.DONE;
       flash_state=flash_status_codes.DONE;
+      $('#flashfilename').val('');
     } 
     } 
     else if(flash_ota_pct<0 && older_recovery){
     else if(flash_ota_pct<0 && older_recovery){
       // we were processing OTA on an older recovery and we missed the 
       // we were processing OTA on an older recovery and we missed the 
@@ -161,11 +168,48 @@ function process_ota_event(data){
       flash_state=flash_status_codes.DONE;
       flash_state=flash_status_codes.DONE;
     }
     }
   }
   }
+  else if(flash_state ==flash_status_codes.UPLOADING){ 
+    if(flash_ota_pct ==100){
+      // we were processing OTA, and we've reached 100%
+      // reset the progress bar 
+      flash_ota_pct = 0;
+      flash_state=flash_status_codes.FLASHING;
+    } 
+  }
+}
+function set_ota_error(message){
+  flash_state=flash_status_codes.ERROR;
+  handle_flash_state({
+    ota_pct: 0,
+    ota_dsc: message,
+    event: flash_events.SET_ERROR
+  });  
+}
+function show_update_dialog(){
+  $('#otadiv').modal();
+    if (flash_ota_pct >= 0) {
+      update_progress();
+    }
+    if (flash_ota_dsc !== '') {
+      $('span#flash-status').html(flash_ota_dsc);
+    }
 }
 }
 const flash_events={
 const flash_events={
+  SET_ERROR: function(data){
+    if(data.ota_dsc){
+      flash_ota_dsc=data.ota_dsc;
+    }
+    else {
+      flash_ota_dsc = 'Error';
+    }
+    flash_ota_pct=data.ota_pct??0;
+    $('#fwProgressLabel').parent().addClass('bg-danger');
+    update_progress();
+    show_update_dialog();
+  },
   START_OTA : function() {
   START_OTA : function() {
-    if (flash_state == flash_status_codes.NONE || flash_state == undefined) {
-      console.log('Starting OTA process');
+    if (flash_state == flash_status_codes.NONE || flash_state == flash_status_codes.ERROR || flash_state == undefined) {
+      $('#fwProgressLabel').parent().removeClass('bg-danger');
       flash_state=flash_status_codes.REBOOT_TO_RECOVERY;
       flash_state=flash_status_codes.REBOOT_TO_RECOVERY;
       if(!recovery){
       if(!recovery){
         flash_ota_dsc = 'Starting recovery mode...';
         flash_ota_dsc = 'Starting recovery mode...';
@@ -181,13 +225,19 @@ const flash_events={
           cache: false,
           cache: false,
           contentType: 'application/json; charset=utf-8',
           contentType: 'application/json; charset=utf-8',
           data: JSON.stringify(data),
           data: JSON.stringify(data),
-          error: handleExceptionResponse,
+          error:  function(xhr, _ajaxOptions, thrownError){
+            set_ota_error(`Unexpected error while trying to restart to recovery. (status=${xhr.status??''}, error=${thrownError??''} ) `);
+          },
           complete: function(response) {
           complete: function(response) {
             console.log(response.responseText);
             console.log(response.responseText);
           },
           },
         });     
         });     
       }
       }
-
+      else {
+        flash_ota_dsc='Starting Update';
+      }
+      show_update_dialog();
+      
     }
     }
     else {
     else {
       console.warn('Unexpected status while starting flashing');
       console.warn('Unexpected status while starting flashing');
@@ -195,17 +245,49 @@ const flash_events={
   },
   },
   FOUND_RECOVERY: function(data) {
   FOUND_RECOVERY: function(data) {
     console.log(JSON.stringify(data));
     console.log(JSON.stringify(data));
+    const url=$('#fw-url-input').val();
     if(flash_state == flash_status_codes.REBOOT_TO_RECOVERY){
     if(flash_state == flash_status_codes.REBOOT_TO_RECOVERY){
-        flash_ota_dsc = 'Recovery mode found. Flashing device.';
-        flash_state= flash_status_codes.SET_FWURL;
-        let confData= { fwurl: {
-              value: $('#fw-url-input').val(),
-              type: 33,
-          }
-        };
-        post_config(confData);
+        const fileInput = $('#flashfilename')[0].files;
+        if (fileInput.length > 0) {
+          flash_ota_dsc = 'Sending file to device.';
+          flash_state= flash_status_codes.UPLOADING;
+          const uploadPath = '/flash.json';
+          const xhttp = new XMLHttpRequest();
+    //      xhrObj.upload.addEventListener("loadstart", loadStartFunction, false);  
+          xhttp.upload.addEventListener("progress", progressFunction, false);  
+          //xhrObj.upload.addEventListener("load", transferCompleteFunction, false);  
+          xhttp.onreadystatechange = function() {
+            if (xhttp.readyState === 4) {
+              if(xhttp.status === 0 || xhttp.status === 404) {
+                set_ota_error(`Upload Failed. Recovery version might not support uploading. Please use web update instead.`);
+                $('#flashfilename').val('');
+              }
+            }
+          };
+          xhttp.open('POST', uploadPath, true);
+          xhttp.send(fileInput[0] );
+        }
+        else if(url==''){
+          flash_state= flash_status_codes.NONE;
+        }
+        else {
+          flash_ota_dsc = 'Saving firmware URL location.';
+          flash_state= flash_status_codes.SET_FWURL;
+          let confData= { fwurl: {
+                value: $('#fw-url-input').val(),
+                type: 33,
+            }
+          };
+          post_config(confData);          
+        }
+        show_update_dialog();
     }
     }
   },
   },
+  PROCESS_OTA_UPLOAD: function(data){
+    flash_state= flash_status_codes.UPLOADING;
+    process_ota_event(data);
+    show_update_dialog();
+  },
   PROCESS_OTA_STATUS: function(data){
   PROCESS_OTA_STATUS: function(data){
     if(data.ota_pct>0){
     if(data.ota_pct>0){
       older_recovery = true;
       older_recovery = true;
@@ -218,22 +300,33 @@ const flash_events={
       flash_state=flash_status_codes.NONE;
       flash_state=flash_status_codes.NONE;
       $('#rTable tr.release').removeClass('table-success table-warning');
       $('#rTable tr.release').removeClass('table-success table-warning');
       $('#fw-url-input').val('');
       $('#fw-url-input').val('');
-      $('#otadiv').modal('hide');
     }
     }
 
 
     else {
     else {
       process_ota_event(data);
       process_ota_event(data);
-    }
-    
+      if(flash_state && (flash_state >flash_status_codes.NONE && flash_ota_pct>=0) ) {
+        show_update_dialog();
+      }
+    } 
   },
   },
   PROCESS_OTA: function(data) {
   PROCESS_OTA: function(data) {
     process_ota_event(data);
     process_ota_event(data);
+    if(flash_state && (flash_state >flash_status_codes.NONE && flash_ota_pct>=0) ) {
+      show_update_dialog();
+    }
   }
   }
 };
 };
 window.hideSurrounding = function(obj){
 window.hideSurrounding = function(obj){
   $(obj).parent().parent().hide();
   $(obj).parent().parent().hide();
 }
 }
+function update_progress(){
+  $('.progress-bar')
+    .css('width', flash_ota_pct + '%')
+    .attr('aria-valuenow', flash_ota_pct)
+    .text(flash_ota_pct+'%')
+  $('.progress-bar').html((flash_state==flash_status_codes.DONE?100:flash_ota_pct) + '%');
 
 
+}
 function handle_flash_state(data) {
 function handle_flash_state(data) {
   if(data.event)  {
   if(data.event)  {
     data.event(data);
     data.event(data);
@@ -243,37 +336,33 @@ function handle_flash_state(data) {
     return;
     return;
   }
   }
 
 
-  if(flash_state && flash_state >flash_status_codes.NONE && flash_ota_pct>=0) {
-
-    $('#otadiv').modal();
-    if (flash_ota_pct !== 0) {
-      $('.progress-bar')
-        .css('width', flash_ota_pct + '%')
-        .attr('aria-valuenow', flash_ota_pct)
-        .text(flash_ota_pct+'%')
-      $('.progress-bar').html((flash_state==flash_status_codes.DONE?100:flash_ota_pct) + '%');
-    }
-    if (flash_ota_dsc !== '') {
-      $('span#flash-status').html(flash_ota_dsc);
-    }      
-  }
-  else {
-    flash_ota_pct=0;
-    flash_ota_dsc='';
-  }
 }
 }
 window.hFlash = function(){
 window.hFlash = function(){
+  // reset file upload selection if any;
+  $('#flashfilename').val('');
   handle_flash_state({ event: flash_events.START_OTA, url: $('#fw-url-input').val() });
   handle_flash_state({ event: flash_events.START_OTA, url: $('#fw-url-input').val() });
 }
 }
 window.handleReboot = function(link){
 window.handleReboot = function(link){
+  
   if(link=='reboot_ota'){
   if(link=='reboot_ota'){
-    $('#reboot_ota_nav').removeClass('active'); delayReboot(500,'', 'reboot_ota');
+    $('#reboot_ota_nav').removeClass('active').prop("disabled",true); delayReboot(500,'', 'reboot_ota');
   }
   }
   else {
   else {
     $('#reboot_nav').removeClass('active'); delayReboot(500,'',link);
     $('#reboot_nav').removeClass('active'); delayReboot(500,'',link);
   }
   }
 }
 }
-
+function progressFunction(evt){  
+  // if (evt.lengthComputable) {  
+  //   progressBar.max = evt.total;  
+  //   progressBar.value = evt.loaded;  
+  //   percentageDiv.innerHTML = Math.round(evt.loaded / evt.total * 100) + "%";  
+  // }  
+  handle_flash_state({
+    ota_pct: ( Math.round(evt.loaded / evt.total * 100)),
+    ota_dsc: ('Uploading file to device'),
+    event: flash_events.PROCESS_OTA_UPLOAD
+  });  
+}  
 function handlebtstate(data) {
 function handlebtstate(data) {
   let icon = '';
   let icon = '';
   let tt = '';
   let tt = '';
@@ -373,6 +462,7 @@ let LastCommandsState = null;
 var output = '';
 var output = '';
 let hostName = '';
 let hostName = '';
 let versionName='Squeezelite-ESP32';
 let versionName='Squeezelite-ESP32';
+let prevmessage='';
 let project_name=versionName;
 let project_name=versionName;
 let platform_name=versionName;
 let platform_name=versionName;
 let btSinkNamesOptSel='#cfg-audio-bt_source-sink_name';
 let btSinkNamesOptSel='#cfg-audio-bt_source-sink_name';
@@ -515,6 +605,7 @@ function delayReboot(duration, cmdname, ota = 'reboot') {
         showLocalMessage('System is rebooting.\n', 'MESSAGING_WARNING');
         showLocalMessage('System is rebooting.\n', 'MESSAGING_WARNING');
       }
       }
       console.log('now triggering reboot');
       console.log('now triggering reboot');
+      $("button[onclick*='handleReboot']").addClass('rebooting');
       $.ajax({
       $.ajax({
         url: data.url,
         url: data.url,
         dataType: 'text',
         dataType: 'text',
@@ -619,7 +710,13 @@ window.handleDisconnect = function(){
        }),
        }),
      });
      });
 }
 }
-
+function setPlatformFilter(val){
+  if($('.upf').filter(function(){ return $(this).text().toUpperCase()===val.toUpperCase()}).length>0){
+    $('#splf').val(val).trigger('input');
+    return true;
+  }
+  return false;
+}
 window.handleConnect = function(){
 window.handleConnect = function(){
   ConnectingToSSID.ssid = $('#manual_ssid').val();
   ConnectingToSSID.ssid = $('#manual_ssid').val();
   ConnectingToSSID.pwd = $('#manual_pwd').val();
   ConnectingToSSID.pwd = $('#manual_pwd').val();
@@ -777,40 +874,15 @@ $(document).ready(function() {
   $('#save-nvs').on('click', function() {
   $('#save-nvs').on('click', function() {
     post_config(getConfigJson(false));
     post_config(getConfigJson(false));
   });
   });
+  
   $('#fwUpload').on('click', function() {
   $('#fwUpload').on('click', function() {
-    const uploadPath = '/flash.json';
-
-    if (!recovery) {
-      $('#flash-status').text('Rebooting to recovery.  Please try again');
-      window.handleReboot(false);
-    }
-
     const fileInput = document.getElementById('flashfilename').files;
     const fileInput = document.getElementById('flashfilename').files;
     if (fileInput.length === 0) {
     if (fileInput.length === 0) {
       alert('No file selected!');
       alert('No file selected!');
     } else {
     } else {
-      const file = fileInput[0];
-      const xhttp = new XMLHttpRequest();
-      xhttp.onreadystatechange = function() {
-        if (xhttp.readyState === 4) {
-          if (xhttp.status === 200) {
-            showLocalMessage(xhttp.responseText, 'MESSAGING_INFO');
-          } else if (xhttp.status === 0) {
-            showLocalMessage(
-              'Upload connection was closed abruptly!',
-              'MESSAGING_ERROR'
-            );
-          } else {
-            showLocalMessage(
-              xhttp.status + ' Error!\n' + xhttp.responseText,
-              'MESSAGING_ERROR'
-            );
-          }
-        }
-      };
-      xhttp.open('POST', uploadPath, true);
-      xhttp.send(file);
+      handle_flash_state({ event: flash_events.START_OTA, file: fileInput[0] });
     }
     }
+    
   });
   });
    $('[name=output-tmpl]').on('click', function() {
    $('[name=output-tmpl]').on('click', function() {
     handleTemplateTypeRadio(this.id);
     handleTemplateTypeRadio(this.id);
@@ -874,13 +946,9 @@ $(document).ready(function() {
         });
         });
       }
       }
       $('#searchfw').css('display', 'inline');
       $('#searchfw').css('display', 'inline');
-      if(platform_name!=='' && $('.upf').filter(function(){ return $(this).text().toUpperCase()===platform_name.toUpperCase()}).length>0){
-        $('#splf').val(platform_name).trigger('input');
-      }
-      else if($('.upf').filter(function(){ return $(this).text().toUpperCase()===project_name.toUpperCase()}).length>0){
-        $('#splf').val(project_name).trigger('input');
+      if(!setPlatformFilter(platform_name)){
+        setPlatformFilter(project_name)
       }
       }
-      
       $('#rTable tr.release').on('click', function() {
       $('#rTable tr.release').on('click', function() {
         var url=this.attributes['fwurl'].value;
         var url=this.attributes['fwurl'].value;
         if (lmsBaseUrl) {
         if (lmsBaseUrl) {
@@ -1221,7 +1289,16 @@ function getMessages() {
           break;
           break;
       }
       }
     }
     }
-  }).fail(handleExceptionResponse);
+  }).fail(function(xhr, ajaxOptions, thrownError){
+      if(xhr.status==404){
+        $('.orec').hide(); // system commands won't be available either
+      } 
+      else {
+        handleExceptionResponse(xhr, ajaxOptions, thrownError);
+      }
+      
+    }
+  );
 
 
   /*
   /*
     Minstk is minimum stack space left
     Minstk is minimum stack space left
@@ -1408,6 +1485,12 @@ function checkStatus() {
     } else {
     } else {
       $('#battery').hide();
       $('#battery').hide();
     }
     }
+    if((data.message??'')!='' && prevmessage != data.message){
+      // supporting older recovery firmwares - messages will come from the status.json structure
+      prevmessage = data.message;
+      showLocalMessage(data.message, 'MESSAGING_INFO')
+    }
+    $("button[onclick*='handleReboot']").removeClass('rebooting');
 
 
     if (typeof lmsBaseUrl == "undefined" || data.lms_ip != prevLMSIP && data.lms_ip && data.lms_port) {
     if (typeof lmsBaseUrl == "undefined" || data.lms_ip != prevLMSIP && data.lms_ip && data.lms_port) {
       const baseUrl = 'http://' + data.lms_ip + ':' + data.lms_port;
       const baseUrl = 'http://' + data.lms_ip + ':' + data.lms_port;
@@ -1489,9 +1572,29 @@ window.runCommand = function(button, reboot) {
     cache: false,
     cache: false,
     contentType: 'application/json; charset=utf-8',
     contentType: 'application/json; charset=utf-8',
     data: JSON.stringify(data),
     data: JSON.stringify(data),
-    error: handleExceptionResponse,
-    complete: function(response) {
+    error: function(xhr, _ajaxOptions, thrownError){
+      var cmd=JSON.parse(this.data  ).command;
+      if(xhr.status==404){
+        showCmdMessage(
+          cmd.substr(0,cmd.indexOf(' ')),
+          'MESSAGING_ERROR',
+          `${recovery?'Limited recovery mode active. Unsupported action ':'Unexpected error while processing command'}`,
+          true
+        );
+      }
+      else {
+        handleExceptionResponse(xhr, _ajaxOptions, thrownError);
+        showCmdMessage(
+          cmd.substr(0,cmd.indexOf(' ')-1),
+          'MESSAGING_ERROR',
+          `Unexpected error ${(thrownError !== '')?thrownError:'with return status = '+xhr.status}`,
+          true
+        );        
+      }
+    },
+    success: function(response) {
       // var returnedResponse = JSON.parse(response.responseText);
       // var returnedResponse = JSON.parse(response.responseText);
+      $('.orec').show();
       console.log(response.responseText);
       console.log(response.responseText);
       if (
       if (
         response.responseText &&
         response.responseText &&
@@ -1509,6 +1612,7 @@ function getLongOps(data, name, longopts){
 function getCommands() {
 function getCommands() {
   $.getJSON('/commands.json', function(data) {
   $.getJSON('/commands.json', function(data) {
     console.log(data);
     console.log(data);
+    $('.orec').show();
     data.commands.forEach(function(command) {
     data.commands.forEach(function(command) {
       if ($('#flds-' + command.name).length === 0) {
       if ($('#flds-' + command.name).length === 0) {
         const cmdParts = command.name.split('-');
         const cmdParts = command.name.split('-');
@@ -1664,7 +1768,13 @@ function getCommands() {
       }
       }
     });
     });
   }).fail(function(xhr, ajaxOptions, thrownError) {
   }).fail(function(xhr, ajaxOptions, thrownError) {
-    handleExceptionResponse(xhr, ajaxOptions, thrownError);
+    if(xhr.status==404){
+      $('.orec').hide();
+    } 
+    else {
+      handleExceptionResponse(xhr, ajaxOptions, thrownError);
+    }
+    
     $('#commands-list').empty();
     $('#commands-list').empty();
     blockAjax = false;
     blockAjax = false;
   });
   });
@@ -1725,6 +1835,7 @@ function getConfig() {
       "<tr><td><input type='text' class='form-control' id='nvs-new-key' placeholder='new key'></td><td><input type='text' class='form-control' id='nvs-new-value' placeholder='new value' nvs_type=33 ></td></tr>"
       "<tr><td><input type='text' class='form-control' id='nvs-new-key' placeholder='new key'></td><td><input type='text' class='form-control' id='nvs-new-value' placeholder='new value' nvs_type=33 ></td></tr>"
     );
     );
     if (entries.gpio) {
     if (entries.gpio) {
+      $('#pins').show();
       $('tbody#gpiotable tr').remove();
       $('tbody#gpiotable tr').remove();
       entries.gpio.forEach(function(gpioEntry) {
       entries.gpio.forEach(function(gpioEntry) {
         $('tbody#gpiotable').append(
         $('tbody#gpiotable').append(
@@ -1742,6 +1853,9 @@ function getConfig() {
         );
         );
       });
       });
     }
     }
+    else {
+      $('#pins').hide();
+    }
   }).fail(function(xhr, ajaxOptions, thrownError) {
   }).fail(function(xhr, ajaxOptions, thrownError) {
     handleExceptionResponse(xhr, ajaxOptions, thrownError);
     handleExceptionResponse(xhr, ajaxOptions, thrownError);
     blockAjax = false;
     blockAjax = false;

+ 3 - 0
components/wifi-manager/webapp/src/sass/utils/_style.css

@@ -13,6 +13,9 @@ body {
 tr.hide {
 tr.hide {
     display: none;
     display: none;
 }
 }
+.rebooting {
+    display: none;
+}
 /* body {
 /* body {
     border: 0;
     border: 0;
     margin: 0;
     margin: 0;

+ 3 - 3
components/wifi-manager/webapp/webapp.cmake

@@ -1,5 +1,5 @@
 target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/favicon-32x32.png BINARY)
 target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/favicon-32x32.png BINARY)
 target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/index.html.gz BINARY)
 target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/index.html.gz BINARY)
-target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/js/index.5b6fcc.bundle.js.gz BINARY)
-target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/js/node-modules.5b6fcc.bundle.js.gz BINARY)
-target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/js/runtime.5b6fcc.bundle.js.gz BINARY)
+target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/js/index.abeafc.bundle.js.gz BINARY)
+target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/js/node-modules.abeafc.bundle.js.gz BINARY)
+target_add_binary_data( __idf_wifi-manager ./webapp/webpack/dist/js/runtime.abeafc.bundle.js.gz BINARY)

+ 15 - 15
components/wifi-manager/webapp/webpack.c

@@ -4,31 +4,31 @@ extern const uint8_t _favicon_32x32_png_start[] asm("_binary_favicon_32x32_png_s
 extern const uint8_t _favicon_32x32_png_end[] asm("_binary_favicon_32x32_png_end");
 extern const uint8_t _favicon_32x32_png_end[] asm("_binary_favicon_32x32_png_end");
 extern const uint8_t _index_html_gz_start[] asm("_binary_index_html_gz_start");
 extern const uint8_t _index_html_gz_start[] asm("_binary_index_html_gz_start");
 extern const uint8_t _index_html_gz_end[] asm("_binary_index_html_gz_end");
 extern const uint8_t _index_html_gz_end[] asm("_binary_index_html_gz_end");
-extern const uint8_t _index_5b6fcc_bundle_js_gz_start[] asm("_binary_index_5b6fcc_bundle_js_gz_start");
-extern const uint8_t _index_5b6fcc_bundle_js_gz_end[] asm("_binary_index_5b6fcc_bundle_js_gz_end");
-extern const uint8_t _node_modules_5b6fcc_bundle_js_gz_start[] asm("_binary_node_modules_5b6fcc_bundle_js_gz_start");
-extern const uint8_t _node_modules_5b6fcc_bundle_js_gz_end[] asm("_binary_node_modules_5b6fcc_bundle_js_gz_end");
-extern const uint8_t _runtime_5b6fcc_bundle_js_gz_start[] asm("_binary_runtime_5b6fcc_bundle_js_gz_start");
-extern const uint8_t _runtime_5b6fcc_bundle_js_gz_end[] asm("_binary_runtime_5b6fcc_bundle_js_gz_end");
+extern const uint8_t _index_abeafc_bundle_js_gz_start[] asm("_binary_index_abeafc_bundle_js_gz_start");
+extern const uint8_t _index_abeafc_bundle_js_gz_end[] asm("_binary_index_abeafc_bundle_js_gz_end");
+extern const uint8_t _node_modules_abeafc_bundle_js_gz_start[] asm("_binary_node_modules_abeafc_bundle_js_gz_start");
+extern const uint8_t _node_modules_abeafc_bundle_js_gz_end[] asm("_binary_node_modules_abeafc_bundle_js_gz_end");
+extern const uint8_t _runtime_abeafc_bundle_js_gz_start[] asm("_binary_runtime_abeafc_bundle_js_gz_start");
+extern const uint8_t _runtime_abeafc_bundle_js_gz_end[] asm("_binary_runtime_abeafc_bundle_js_gz_end");
 const char * resource_lookups[] = {
 const char * resource_lookups[] = {
 	"/dist/favicon-32x32.png",
 	"/dist/favicon-32x32.png",
 	"/dist/index.html.gz",
 	"/dist/index.html.gz",
-	"/js/index.5b6fcc.bundle.js.gz",
-	"/js/node-modules.5b6fcc.bundle.js.gz",
-	"/js/runtime.5b6fcc.bundle.js.gz",
+	"/js/index.abeafc.bundle.js.gz",
+	"/js/node-modules.abeafc.bundle.js.gz",
+	"/js/runtime.abeafc.bundle.js.gz",
 ""
 ""
 };
 };
 const uint8_t * resource_map_start[] = {
 const uint8_t * resource_map_start[] = {
 	_favicon_32x32_png_start,
 	_favicon_32x32_png_start,
 	_index_html_gz_start,
 	_index_html_gz_start,
-	_index_5b6fcc_bundle_js_gz_start,
-	_node_modules_5b6fcc_bundle_js_gz_start,
-	_runtime_5b6fcc_bundle_js_gz_start
+	_index_abeafc_bundle_js_gz_start,
+	_node_modules_abeafc_bundle_js_gz_start,
+	_runtime_abeafc_bundle_js_gz_start
 };
 };
 const uint8_t * resource_map_end[] = {
 const uint8_t * resource_map_end[] = {
 	_favicon_32x32_png_end,
 	_favicon_32x32_png_end,
 	_index_html_gz_end,
 	_index_html_gz_end,
-	_index_5b6fcc_bundle_js_gz_end,
-	_node_modules_5b6fcc_bundle_js_gz_end,
-	_runtime_5b6fcc_bundle_js_gz_end
+	_index_abeafc_bundle_js_gz_end,
+	_node_modules_abeafc_bundle_js_gz_end,
+	_runtime_abeafc_bundle_js_gz_end
 };
 };

+ 25 - 25
components/wifi-manager/webapp/webpack.h

@@ -1,26 +1,26 @@
 /***********************************
 /***********************************
 webpack_headers
 webpack_headers
-Hash: 5b6fcca7137c495bebc9
-Version: webpack 4.44.2
-Time: 8665ms
-Built at: 2021-04-10 09 h 58 min 36 s
+Hash: abeafc790ab5fbef1c83
+Version: webpack 4.46.0
+Time: 11034ms
+Built at: 2021-04-14 18 h 05 min 54 s
                                 Asset       Size  Chunks                                Chunk Names
                                 Asset       Size  Chunks                                Chunk Names
-          ./js/index.5b6fcc.bundle.js    229 KiB       0  [emitted] [immutable]         index
-       ./js/index.5b6fcc.bundle.js.br   31.3 KiB          [emitted]                     
-       ./js/index.5b6fcc.bundle.js.gz   40.6 KiB          [emitted]                     
-   ./js/node-modules.5b6fcc.bundle.js    265 KiB       1  [emitted] [immutable]  [big]  node-modules
-./js/node-modules.5b6fcc.bundle.js.br   76.2 KiB          [emitted]                     
-./js/node-modules.5b6fcc.bundle.js.gz   88.6 KiB          [emitted]                     
-        ./js/runtime.5b6fcc.bundle.js   1.46 KiB       2  [emitted] [immutable]         runtime
-     ./js/runtime.5b6fcc.bundle.js.br  644 bytes          [emitted]                     
-     ./js/runtime.5b6fcc.bundle.js.gz  722 bytes          [emitted]                     
+          ./js/index.abeafc.bundle.js    231 KiB       0  [emitted] [immutable]         index
+       ./js/index.abeafc.bundle.js.br     32 KiB          [emitted]                     
+       ./js/index.abeafc.bundle.js.gz   41.2 KiB          [emitted]                     
+   ./js/node-modules.abeafc.bundle.js    266 KiB       1  [emitted] [immutable]  [big]  node-modules
+./js/node-modules.abeafc.bundle.js.br   76.3 KiB          [emitted]                     
+./js/node-modules.abeafc.bundle.js.gz   88.7 KiB          [emitted]                     
+        ./js/runtime.abeafc.bundle.js   1.46 KiB       2  [emitted] [immutable]         runtime
+     ./js/runtime.abeafc.bundle.js.br  644 bytes          [emitted]                     
+     ./js/runtime.abeafc.bundle.js.gz  722 bytes          [emitted]                     
                     favicon-32x32.png  578 bytes          [emitted]                     
                     favicon-32x32.png  578 bytes          [emitted]                     
                            index.html   21.7 KiB          [emitted]                     
                            index.html   21.7 KiB          [emitted]                     
-                        index.html.br   4.78 KiB          [emitted]                     
-                        index.html.gz   5.78 KiB          [emitted]                     
+                        index.html.br   4.75 KiB          [emitted]                     
+                        index.html.gz   5.76 KiB          [emitted]                     
                            sprite.svg    4.4 KiB          [emitted]                     
                            sprite.svg    4.4 KiB          [emitted]                     
                         sprite.svg.br  912 bytes          [emitted]                     
                         sprite.svg.br  912 bytes          [emitted]                     
-Entrypoint index [big] = ./js/runtime.5b6fcc.bundle.js ./js/node-modules.5b6fcc.bundle.js ./js/index.5b6fcc.bundle.js
+Entrypoint index [big] = ./js/runtime.abeafc.bundle.js ./js/node-modules.abeafc.bundle.js ./js/index.abeafc.bundle.js
  [6] ./node_modules/bootstrap/dist/js/bootstrap-exposed.js 437 bytes {1} [built]
  [6] ./node_modules/bootstrap/dist/js/bootstrap-exposed.js 437 bytes {1} [built]
 [11] ./src/sass/main.scss 1.55 KiB {0} [built]
 [11] ./src/sass/main.scss 1.55 KiB {0} [built]
 [16] ./node_modules/remixicon/icons/Device/signal-wifi-fill.svg 340 bytes {1} [built]
 [16] ./node_modules/remixicon/icons/Device/signal-wifi-fill.svg 340 bytes {1} [built]
@@ -35,22 +35,22 @@ Entrypoint index [big] = ./js/runtime.5b6fcc.bundle.js ./js/node-modules.5b6fcc.
 [25] ./node_modules/remixicon/icons/Device/device-recover-fill.svg 346 bytes {1} [built]
 [25] ./node_modules/remixicon/icons/Device/device-recover-fill.svg 346 bytes {1} [built]
 [26] ./node_modules/remixicon/icons/Device/bluetooth-fill.svg 336 bytes {1} [built]
 [26] ./node_modules/remixicon/icons/Device/bluetooth-fill.svg 336 bytes {1} [built]
 [27] ./node_modules/remixicon/icons/Device/bluetooth-connect-fill.svg 352 bytes {1} [built]
 [27] ./node_modules/remixicon/icons/Device/bluetooth-connect-fill.svg 352 bytes {1} [built]
-[37] ./src/index.ts + 1 modules 58.4 KiB {0} [built]
+[37] ./src/index.ts + 1 modules 62.5 KiB {0} [built]
      | ./src/index.ts 1.36 KiB [built]
      | ./src/index.ts 1.36 KiB [built]
-     | ./src/js/custom.js 57 KiB [built]
+     | ./src/js/custom.js 61 KiB [built]
     + 23 hidden modules
     + 23 hidden modules
 
 
 WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
 WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
 This can impact web performance.
 This can impact web performance.
 Assets: 
 Assets: 
-  ./js/node-modules.5b6fcc.bundle.js (265 KiB)
+  ./js/node-modules.abeafc.bundle.js (266 KiB)
 
 
 WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
 WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
 Entrypoints:
 Entrypoints:
-  index (496 KiB)
-      ./js/runtime.5b6fcc.bundle.js
-      ./js/node-modules.5b6fcc.bundle.js
-      ./js/index.5b6fcc.bundle.js
+  index (499 KiB)
+      ./js/runtime.abeafc.bundle.js
+      ./js/node-modules.abeafc.bundle.js
+      ./js/index.abeafc.bundle.js
 
 
 
 
 WARNING in webpack performance recommendations: 
 WARNING in webpack performance recommendations: 
@@ -58,10 +58,10 @@ You can limit the size of your bundles by using import() or require.ensure to la
 For more info visit https://webpack.js.org/guides/code-splitting/
 For more info visit https://webpack.js.org/guides/code-splitting/
 Child html-webpack-plugin for "index.html":
 Child html-webpack-plugin for "index.html":
          Asset     Size  Chunks  Chunk Names
          Asset     Size  Chunks  Chunk Names
-    index.html  559 KiB       0  
+    index.html  560 KiB       0  
     Entrypoint undefined = index.html
     Entrypoint undefined = index.html
     [0] ./node_modules/html-webpack-plugin/lib/loader.js!./src/index.ejs 23.9 KiB {0} [built]
     [0] ./node_modules/html-webpack-plugin/lib/loader.js!./src/index.ejs 23.9 KiB {0} [built]
-    [1] ./node_modules/lodash/lodash.js 530 KiB {0} [built]
+    [1] ./node_modules/lodash/lodash.js 531 KiB {0} [built]
     [2] (webpack)/buildin/global.js 472 bytes {0} [built]
     [2] (webpack)/buildin/global.js 472 bytes {0} [built]
     [3] (webpack)/buildin/module.js 497 bytes {0} [built]
     [3] (webpack)/buildin/module.js 497 bytes {0} [built]
 ***********************************/
 ***********************************/

文件差异内容过多而无法显示
+ 0 - 0
components/wifi-manager/webapp/webpack/dist/index.html


二进制
components/wifi-manager/webapp/webpack/dist/index.html.br


二进制
components/wifi-manager/webapp/webpack/dist/index.html.gz


+ 110 - 23
components/wifi-manager/webapp/webpack/webpack.dev.js

@@ -15,7 +15,9 @@ const data = {
     messages: require("../mock/messages.json"),
     messages: require("../mock/messages.json"),
     messagequeue: require("../mock/messages.json"),
     messagequeue: require("../mock/messages.json"),
     message_queue_sequence: [],
     message_queue_sequence: [],
+    status_queue_sequence:[],
     message_queue_sequence_post_empty: null,
     message_queue_sequence_post_empty: null,
+    status_queue_sequence_post_empty: null,
     commands: require("../mock/commands.json"),
     commands: require("../mock/commands.json"),
     scan: require("../mock/scan.json"),
     scan: require("../mock/scan.json"),
     ap: require("../mock/ap.json"),
     ap: require("../mock/ap.json"),
@@ -23,6 +25,7 @@ const data = {
     statusdefinition: require("../mock/statusdefinition.json"),
     statusdefinition: require("../mock/statusdefinition.json"),
     status: require("../mock/status.json"),
     status: require("../mock/status.json"),
     messages_ota_fail: require("../mock/messages_ota_fail.json"),
     messages_ota_fail: require("../mock/messages_ota_fail.json"),
+    messages_ota_flash: require("../mock/messages_ota_flash.json"),
     messages_ota: require("../mock/messages_ota.json")
     messages_ota: require("../mock/messages_ota.json")
 };
 };
 const messagingTypes= {
 const messagingTypes= {
@@ -123,8 +126,47 @@ module.exports = merge(common, {
             app.use(bodyParser.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
             app.use(bodyParser.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
             app.get('/ap.json', function(req, res) { res.json( data.ap ); });
             app.get('/ap.json', function(req, res) { res.json( data.ap ); });
             app.get('/scan.json', function(req, res) { res.json( data.scan ); });
             app.get('/scan.json', function(req, res) { res.json( data.scan ); });
-            app.get('/config.json', function(req, res) { res.json( data.config ); });
-            app.get('/status.json', function(req, res) { res.json( data.status ); });
+            app.get('/config.json', function(req, res) { 
+                if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
+                    res.json( data.config.config ); 
+                    console.log('Mock old recovery - return config structure without gpio');
+                }
+                else {
+                    res.json( data.config ); 
+                }
+            });
+
+            app.get('/status.json', function(req, res) { 
+                if(data.status_queue_sequence.length>0){
+                    const curstatus = JSON.parse(data.status_queue_sequence_queue_sequence.shift());
+                    data.status.ota_pct=curstatus.ota_pct??0;
+                    data.status.ota_dsc=curstatus.ota_dsc??'';
+                    console.log(`Mock firmware update @${data.status.ota_pct}%, ${data.status.ota_dsc}`)
+                }
+                else if (data.status_queue_sequence_post_empty){
+                    data.status_queue_sequence_post_emptyy();
+                    console.log(`Mock old firmware update: simulating a restart`);
+                    data.status_queue_sequence_post_empty = null;
+                }
+                else if(data.status.ota_pct!=undefined || data.status.ota_dsc!=undefined) {
+                    if(data.status.ota_pct!=undefined) delete data.status.ota_pct;
+                    if(data.status.ota_dsc!=undefined) delete data.status.ota_dsc;
+                }
+                if(data.status.message) delete data.status.message;
+                if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
+                    if(data.message_queue_sequence.length>0){
+                        
+                        const msgpayload = JSON.parse(data.message_queue_sequence.shift());
+                        data.status.message = msgpayload.message??'';
+                        console.log(`Mocking recovery, setting status message to ${data.status.message}`)
+                    }
+                    else if (data.message_queue_sequence_post_empty){
+                        data.message_queue_sequence_post_empty();
+                        data.message_queue_sequence_post_empty = null;
+                    }
+                }                                
+                res.json( data.status ); 
+            });
             app.get('/plugins/SqueezeESP32/firmware/-99', function(req, res) { 
             app.get('/plugins/SqueezeESP32/firmware/-99', function(req, res) { 
                 let has_proxy=  data.status.mock_plugin_has_proxy ?? 'n';
                 let has_proxy=  data.status.mock_plugin_has_proxy ?? 'n';
                 const statusCode='xy'.includes((has_proxy).toLowerCase())?200:500;
                 const statusCode='xy'.includes((has_proxy).toLowerCase())?200:500;
@@ -132,6 +174,11 @@ module.exports = merge(common, {
                 res.status(statusCode ).json(); 
                 res.status(statusCode ).json(); 
             });
             });
             app.get('/messages.json', function(req, res) { 
             app.get('/messages.json', function(req, res) { 
+                if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
+                    console.log('Mocking old recovery, with no commands backend' );
+                    res.status(404).end(); 
+                    return;
+                }
                 if(data.message_queue_sequence.length>0){
                 if(data.message_queue_sequence.length>0){
                     data.messagequeue.push(data.message_queue_sequence.shift());
                     data.messagequeue.push(data.message_queue_sequence.shift());
                 }
                 }
@@ -144,8 +191,22 @@ module.exports = merge(common, {
             });
             });
             
             
             app.get('/statusdefinition.json', function(req, res) { res.json( data.statusdefinition ); });
             app.get('/statusdefinition.json', function(req, res) { res.json( data.statusdefinition ); });
-            app.get('/commands.json', function(req, res) { res.json( data.commands ); });
+            app.get('/commands.json', function(req, res) { 
+                if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
+                    console.log('Mocking old recovery, with no commands backend' );
+                    res.status(404).end(); 
+                }
+                else {
+                    res.json( data.commands ); 
+                }
+                
+            });
             app.post('/commands.json', function(req, res) { 
             app.post('/commands.json', function(req, res) { 
+                if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
+                    console.log('Mocking old recovery, with no commands backend' );
+                    res.status(404).end(); 
+                    return;
+                }
                 console.log(req.body.command);
                 console.log(req.body.command);
                 try {
                 try {
                     const cmdName=req.body.command.split(" ")[0];
                     const cmdName=req.body.command.split(" ")[0];
@@ -189,23 +250,29 @@ module.exports = merge(common, {
                   }
                   }
                 res.json( {} ); 
                 res.json( {} ); 
                 if(fwurl!=='' ){
                 if(fwurl!=='' ){
+                    const ota_msg_list= ((data.status.mock_fail_fw_update ?? '')!=='')?data.messages_ota_fail:data.messages_ota;
                     if(data.status.recovery!=1) {
                     if(data.status.recovery!=1) {
                         // we're not yet in recovery. Simulate reboot to recovery 
                         // we're not yet in recovery. Simulate reboot to recovery 
                         data.status.recovery=1;
                         data.status.recovery=1;
-                        requeueMessages();
+                        if((data.status.mock_old_recovery??'')===''){
+                            // older recovery partitions possibly aren't 
+                            // sending messages
+                            requeueMessages();
+                        }
+                        
                     }
                     }
-                    if(fwurl.toLowerCase().includes('fail')){
-                        console.log(`queuing ${data.messages_ota_fail.length} ota messages `);
-                        data.message_queue_sequence.push(...data.messages_ota_fail);
-
+                    var targetQueue='message_queue_sequence';
+                    var targetPostEmpty='message_queue_sequence_post_empty';
+                    if((data.status.mock_old_recovery??'')!==''){
+                            console.log('Mocking old firmware flashing mechanism.  Starting!');
+                            targetQueue='status_queue_sequence';
+                            targetPostEmpty='status_queue_sequence_post_empty';
                     }
                     }
-                    else {
-                        console.log(`queuing ${data.messages_ota.length} ota messages `);
-                        data.message_queue_sequence.push(...data.messages_ota);
-                        data.message_queue_sequence_post_empty = function(){
-                            data.status.recovery=0;
-                            requeueMessages();
-                        }                        
+                    console.log(`queuing ${ota_msg_list.length} ota messages `);
+                    data[targetQueue].push(...ota_msg_list);
+                    data[targetPostEmpty] = function(){
+                        data.status.recovery=0;
+                        requeueMessages();
                     }
                     }
                 }
                 }
             });
             });
@@ -220,7 +287,7 @@ module.exports = merge(common, {
                         console.log(`Updated status value ${property}\nFrom: ${data.status[property]}\nTo: ${req.body.status[property]}`);
                         console.log(`Updated status value ${property}\nFrom: ${data.status[property]}\nTo: ${req.body.status[property]}`);
                         data.status[property]=req.body.status[property];
                         data.status[property]=req.body.status[property];
                     }
                     }
-                  }
+                }
                 res.json( {} ); 
                 res.json( {} ); 
             });            
             });            
             app.post('/connect.json', function(req, res) { 
             app.post('/connect.json', function(req, res) { 
@@ -251,17 +318,37 @@ module.exports = merge(common, {
                 requeueMessages();
                 requeueMessages();
             });
             });
             app.post('/recovery.json', function(req, res) { 
             app.post('/recovery.json', function(req, res) { 
-                data.status.recovery=1;
-                requeueMessages();
-                res.json( { } ); 
+                if((data.status.mock_fail_recovery ?? '')!==''){
+                    res.status(404).end(); 
+                }
+                else {
+                    data.status.recovery=1;
+                    requeueMessages();
+                    res.json( { } ); 
+                }                
             });
             });
             app.post('/flash.json', function(req, res) { 
             app.post('/flash.json', function(req, res) { 
+                
                 if(data.status.recovery>0){
                 if(data.status.recovery>0){
-                    res.json({});
-                  }
-                  else {
+                    if((data.status.mock_fail_fw_update ?? '')!=='' || (data.status.mock_old_recovery??'')!==''){
+                        console.log('Old recovery mock, or fw fail requested' );
+                        res.status(404).end(); 
+                    }
+                    else {
+                        console.log(`queuing ${data.messages_ota_flash.length} flash ota messages `);
+                        data.message_queue_sequence.push(...data.messages_ota_flash);
+                        data.message_queue_sequence_post_empty = function(){
+                            data.status.recovery=0;
+                            requeueMessages();
+                            
+                        }   
+                        res.json({});                  
+                    }
+                    
+                }
+                else {
                     res.status(404).end(); 
                     res.status(404).end(); 
-                  }  
+                }  
             });                  
             });                  
             app.delete('/connect.json', function(req, res) { 
             app.delete('/connect.json', function(req, res) { 
                 data.status.ssid='';
                 data.status.ssid='';

部分文件因为文件数量过多而无法显示