Browse Source

OTA Fine tuning - release

Sebastien 5 years ago
parent
commit
e02987f8df

+ 46 - 14
components/squeezelite-ota/squeezelite-ota.c

@@ -6,7 +6,7 @@
    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
    CONDITIONS OF ANY KIND, either express or implied.
    CONDITIONS OF ANY KIND, either express or implied.
 */
 */
-//#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
+#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG
 #include "freertos/FreeRTOS.h"
 #include "freertos/FreeRTOS.h"
 #include "freertos/task.h"
 #include "freertos/task.h"
 #include "esp_system.h"
 #include "esp_system.h"
@@ -38,7 +38,6 @@
 
 
 #include "esp_ota_ops.h"
 #include "esp_ota_ops.h"
 
 
-#define OTA_FLASH_ERASE_BLOCK (4096*10)
 static const char *TAG = "squeezelite-ota";
 static const char *TAG = "squeezelite-ota";
 extern const uint8_t server_cert_pem_start[] asm("_binary_github_pem_start");
 extern const uint8_t server_cert_pem_start[] asm("_binary_github_pem_start");
 extern const uint8_t server_cert_pem_end[] asm("_binary_github_pem_end");
 extern const uint8_t server_cert_pem_end[] asm("_binary_github_pem_end");
@@ -178,7 +177,6 @@ esp_err_t _http_event_handler(esp_http_client_event_t *evt)
 
 
 				ota_status.lastpct=ota_status.newpct;
 				ota_status.lastpct=ota_status.newpct;
 			}
 			}
-			taskYIELD();
         }
         }
         break;
         break;
     case HTTP_EVENT_ON_FINISH:
     case HTTP_EVENT_ON_FINISH:
@@ -208,7 +206,7 @@ esp_err_t _erase_last_boot_app_partition(void)
 {
 {
 	uint16_t num_passes=0;
 	uint16_t num_passes=0;
 	uint16_t remain_size=0;
 	uint16_t remain_size=0;
-	uint16_t single_pass_size=0;
+	uint32_t single_pass_size=0;
     const esp_partition_t *ota_partition=NULL;
     const esp_partition_t *ota_partition=NULL;
     const esp_partition_t *ota_data_partition=NULL;
     const esp_partition_t *ota_data_partition=NULL;
 	esp_err_t err=ESP_OK;
 	esp_err_t err=ESP_OK;
@@ -221,7 +219,7 @@ esp_err_t _erase_last_boot_app_partition(void)
 	else {
 	else {
 		ota_partition = (esp_partition_t *) esp_partition_get(it);
 		ota_partition = (esp_partition_t *) esp_partition_get(it);
 		if(ota_partition != NULL){
 		if(ota_partition != NULL){
-			ESP_LOGI(TAG, "Found OTA partition.");
+			ESP_LOGI(TAG, "Found OTA partition: %s.",ota_partition->label);
 		}
 		}
 		else {
 		else {
 			ESP_LOGE(TAG,"OTA partition not found!  Unable update application.");
 			ESP_LOGE(TAG,"OTA partition not found!  Unable update application.");
@@ -248,19 +246,31 @@ esp_err_t _erase_last_boot_app_partition(void)
 	if(ota_data_partition==NULL || ota_partition==NULL){
 	if(ota_data_partition==NULL || ota_partition==NULL){
 		return ESP_FAIL;
 		return ESP_FAIL;
 	}
 	}
-	ESP_LOGI(TAG,"Erasing flash ");
-	num_passes=ota_partition->size/OTA_FLASH_ERASE_BLOCK;
-	single_pass_size= ota_partition->size/num_passes;
 
 
-	remain_size=ota_partition->size-(num_passes*OTA_FLASH_ERASE_BLOCK);
 
 
+    char * ota_erase_size=config_alloc_get(NVS_TYPE_STR, "ota_erase_blk");
+	if(ota_erase_size!=NULL) {
+		single_pass_size = atol(ota_erase_size);
+		ESP_LOGD(TAG,"OTA Erase block size is %d (from string: %s)",single_pass_size, ota_erase_size );
+		free(ota_erase_size);
+	}
+	else {
+		ESP_LOGW(TAG,"OTA Erase block config not found");
+		single_pass_size = OTA_FLASH_ERASE_BLOCK;
+	}
+	ESP_LOGI(TAG,"Erasing flash partition of size %u", ota_partition->size);
+	num_passes=ota_partition->size/single_pass_size;
+	remain_size=ota_partition->size-(num_passes*single_pass_size);
+	ESP_LOGD(TAG,"Erasing in %d passes with blocks of %d bytes, ", num_passes,single_pass_size);
 	for(uint16_t i=0;i<num_passes;i++){
 	for(uint16_t i=0;i<num_passes;i++){
-		err=esp_partition_erase_range(ota_partition, i*single_pass_size, single_pass_size);
-		if(err!=ESP_OK) return err;
 		ESP_LOGD(TAG,"Erasing flash (%u%%)",i/num_passes);
 		ESP_LOGD(TAG,"Erasing flash (%u%%)",i/num_passes);
 		ESP_LOGD(TAG,"Pass %d of %d, with chunks of %d bytes, from %d to %d", i+1, num_passes,single_pass_size,i*single_pass_size,i*single_pass_size+single_pass_size);
 		ESP_LOGD(TAG,"Pass %d of %d, with chunks of %d bytes, from %d to %d", i+1, num_passes,single_pass_size,i*single_pass_size,i*single_pass_size+single_pass_size);
-		triggerStatusJsonRefresh(i%2==0?true:false,"Erasing flash (%u/%u)",i,num_passes);
-		taskYIELD();
+		err=esp_partition_erase_range(ota_partition, i*single_pass_size, single_pass_size);
+		if(err!=ESP_OK) return err;
+//		triggerStatusJsonRefresh(i%10==0?true:false,"Erasing flash (%u/%u)",i,num_passes);
+		if(i%10) {
+			triggerStatusJsonRefresh(false,"Erasing flash (%u/%u)",i,num_passes);
+		}
 	}
 	}
 	if(remain_size>0){
 	if(remain_size>0){
 		err=esp_partition_erase_range(ota_partition, ota_partition->size-remain_size, remain_size);
 		err=esp_partition_erase_range(ota_partition, ota_partition->size-remain_size, remain_size);
@@ -322,6 +332,7 @@ void ota_task(void *pvParameter)
 
 
 esp_err_t process_recovery_ota(const char * bin_url){
 esp_err_t process_recovery_ota(const char * bin_url){
 	int ret = 0;
 	int ret = 0;
+	uint16_t stack_size, task_priority;
     if(ota_status.bOTAThreadStarted){
     if(ota_status.bOTAThreadStarted){
 		ESP_LOGE(TAG,"OTA Already started. ");
 		ESP_LOGE(TAG,"OTA Already started. ");
 		return ESP_FAIL;
 		return ESP_FAIL;
@@ -340,7 +351,28 @@ esp_err_t process_recovery_ota(const char * bin_url){
 #define OTA_CORE 1
 #define OTA_CORE 1
 #endif
 #endif
     ESP_LOGI(TAG, "Starting ota on core %u for : %s", OTA_CORE,urlPtr);
     ESP_LOGI(TAG, "Starting ota on core %u for : %s", OTA_CORE,urlPtr);
-    ret=xTaskCreatePinnedToCore(&ota_task, "ota_task", 1024*20, (void *)urlPtr, ESP_TASK_MAIN_PRIO+1, NULL, OTA_CORE);
+    char * num_buffer=config_alloc_get(NVS_TYPE_STR, "ota_stack");
+  	if(num_buffer!=NULL) {
+  		stack_size= atol(num_buffer);
+  		free(num_buffer);
+  		num_buffer=NULL;
+  	}
+  	else {
+		ESP_LOGW(TAG,"OTA stack size config not found");
+  		stack_size = OTA_STACK_SIZE;
+  	}
+  	num_buffer=config_alloc_get(NVS_TYPE_STR, "ota_prio");
+	if(num_buffer!=NULL) {
+		task_priority= atol(num_buffer);
+		free(num_buffer);
+		num_buffer=NULL;
+	}
+	else {
+		ESP_LOGW(TAG,"OTA task priority not found");
+		task_priority= OTA_TASK_PRIOTITY;
+  	}
+  	ESP_LOGD(TAG,"OTA task stack size %d, priority %d (%d %s ESP_TASK_MAIN_PRIO)",stack_size , task_priority, abs(task_priority-ESP_TASK_MAIN_PRIO), task_priority-ESP_TASK_MAIN_PRIO>0?"above":"below");
+    ret=xTaskCreatePinnedToCore(&ota_task, "ota_task", stack_size , (void *)urlPtr, task_priority, NULL, OTA_CORE);
     //ret=xTaskCreate(&ota_task, "ota_task", 1024*20, (void *)urlPtr, ESP_TASK_MAIN_PRIO+2, NULL);
     //ret=xTaskCreate(&ota_task, "ota_task", 1024*20, (void *)urlPtr, ESP_TASK_MAIN_PRIO+2, NULL);
     if (ret != pdPASS)  {
     if (ret != pdPASS)  {
             ESP_LOGI(TAG, "create thread %s failed", "ota_task");
             ESP_LOGI(TAG, "create thread %s failed", "ota_task");

+ 4 - 1
components/squeezelite-ota/squeezelite-ota.h

@@ -12,7 +12,10 @@
 #else
 #else
 #define CODE_RAM_LOCATION
 #define CODE_RAM_LOCATION
 #endif
 #endif
-
+// ERASE BLOCK needs to be a multiple of wear leveling's sector size
+#define OTA_FLASH_ERASE_BLOCK (uint32_t)512000
+#define OTA_STACK_SIZE 5120
+#define OTA_TASK_PRIOTITY 6
 esp_err_t start_ota(const char * bin_url, bool bFromAppMain);
 esp_err_t start_ota(const char * bin_url, bool bFromAppMain);
 const char * ota_get_status();
 const char * ota_get_status();
 uint8_t ota_get_pct_complete();
 uint8_t ota_get_pct_complete();

+ 5 - 5
components/wifi-manager/http_server.c

@@ -51,11 +51,11 @@ static const char TAG[] = "http_server";
 /* @brief task handle for the http server */
 /* @brief task handle for the http server */
 static TaskHandle_t task_http_server = NULL;
 static TaskHandle_t task_http_server = NULL;
 static StaticTask_t task_http_buffer;
 static StaticTask_t task_http_buffer;
-#if RECOVERY_APPLICATION
-static StackType_t task_http_stack[HTTP_STACK_SIZE];
-#else
+//#if RECOVERY_APPLICATION
+//static StackType_t task_http_stack[HTTP_STACK_SIZE];
+//#else
 static StackType_t EXT_RAM_ATTR task_http_stack[HTTP_STACK_SIZE];
 static StackType_t EXT_RAM_ATTR task_http_stack[HTTP_STACK_SIZE];
-#endif
+//#endif
 SemaphoreHandle_t http_server_config_mutex = NULL;
 SemaphoreHandle_t http_server_config_mutex = NULL;
 
 
 /**
 /**
@@ -351,7 +351,7 @@ void http_server_netconn_serve(struct netconn *conn) {
 				ESP_LOGE(TAG,  "Unable to get host name. Error: %s",esp_err_to_name(err));
 				ESP_LOGE(TAG,  "Unable to get host name. Error: %s",esp_err_to_name(err));
 			}
 			}
 			else {
 			else {
-				ESP_LOGI(TAG,"System host name %s, http requested host: %s. They %s",host_name, host,strcasestr(host,host_name)?"match":"don't match" );
+				ESP_LOGI(TAG,"System host name %s, http requested host: %s.",host_name, host);
 			}
 			}
 
 
 			/* determine if Host is from the STA IP address */
 			/* determine if Host is from the STA IP address */

+ 15 - 1
main/esp_app_main.c

@@ -18,7 +18,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  *
  */
  */
-//#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
+#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG
 #include "platform_esp32.h"
 #include "platform_esp32.h"
 #include "led.h"
 #include "led.h"
 #include <stdio.h>
 #include <stdio.h>
@@ -192,6 +192,20 @@ void register_default_nvs(){
 	config_set_default(NVS_TYPE_STR, "a2dp_dev_name", CONFIG_A2DP_DEV_NAME, 0);
 	config_set_default(NVS_TYPE_STR, "a2dp_dev_name", CONFIG_A2DP_DEV_NAME, 0);
 	ESP_LOGD(TAG,"Registering default value for key %s, value %s", "bypass_wm", "0");
 	ESP_LOGD(TAG,"Registering default value for key %s, value %s", "bypass_wm", "0");
 	config_set_default(NVS_TYPE_STR, "bypass_wm", "0", 0);
 	config_set_default(NVS_TYPE_STR, "bypass_wm", "0", 0);
+
+	char number_buffer[101] = {};
+	snprintf(number_buffer,sizeof(number_buffer)-1,"%u",OTA_FLASH_ERASE_BLOCK);
+	ESP_LOGD(TAG,"Registering default value for key %s, value %s", "ota_erase_blk", number_buffer);
+	config_set_default(NVS_TYPE_STR, "ota_erase_blk", number_buffer, 0);
+
+	snprintf(number_buffer,sizeof(number_buffer)-1,"%u",OTA_STACK_SIZE);
+	ESP_LOGD(TAG,"Registering default value for key %s, value %s", "ota_stack", number_buffer);
+	config_set_default(NVS_TYPE_STR, "ota_stack", number_buffer, 0);
+
+	snprintf(number_buffer,sizeof(number_buffer)-1,"%d",OTA_TASK_PRIOTITY);
+	ESP_LOGD(TAG,"Registering default value for key %s, value %s", "ota_prio", number_buffer);
+	config_set_default(NVS_TYPE_STR, "ota_prio", number_buffer, 0);
+
 	ESP_LOGD(TAG,"Registering default value for key %s, value %s", "enable_bt_sink", STR(CONFIG_BT_SINK));
 	ESP_LOGD(TAG,"Registering default value for key %s, value %s", "enable_bt_sink", STR(CONFIG_BT_SINK));
 	char * flag = config_alloc_get_default(NVS_TYPE_STR, "enable_bt_sink", STR(CONFIG_BT_SINK), 0);
 	char * flag = config_alloc_get_default(NVS_TYPE_STR, "enable_bt_sink", STR(CONFIG_BT_SINK), 0);
 	if(flag !=NULL){
 	if(flag !=NULL){