fix in clear Neighbours Queue

This commit is contained in:
Hendrik Schutter 2021-01-26 21:59:25 +01:00
parent a62d3265ca
commit e73a05fc42
6 changed files with 27 additions and 14 deletions

View File

@ -161,7 +161,6 @@ void vMeshOtaTaskServerWorker(void *arg)
//set want reboot //set want reboot
ESP_LOGI(LOG_TAG, "Updated successfully via HTTPS, set pending reboot"); ESP_LOGI(LOG_TAG, "Updated successfully via HTTPS, set pending reboot");
bWantReboot = true; bWantReboot = true;
vMeshOtaUtilAddAllNeighboursToQueue(); //add all existing neighbours to queue (aparent will not be added because this node is the root)
} }
vTaskDelay( (SERVER_CHECK_INTERVAL*1000) / portTICK_PERIOD_MS); //sleep till next server checks vTaskDelay( (SERVER_CHECK_INTERVAL*1000) / portTICK_PERIOD_MS); //sleep till next server checks
} }
@ -181,6 +180,7 @@ void vMeshOtaTaskOTAWorker(void *arg)
esp_err_t err = ESP_OK; esp_err_t err = ESP_OK;
bool bNewOTAImage; //true if a new ota image was downloaded and validated bool bNewOTAImage; //true if a new ota image was downloaded and validated
mesh_addr_t meshNodeAddr; //node that should be checked for ota update mesh_addr_t meshNodeAddr; //node that should be checked for ota update
BaseType_t xReturned;
while(true) while(true)
{ {
@ -189,25 +189,30 @@ void vMeshOtaTaskOTAWorker(void *arg)
if((uxQueueSpacesAvailable(queueNodes) - QUEUE_NODES_SIZE) == 0) if((uxQueueSpacesAvailable(queueNodes) - QUEUE_NODES_SIZE) == 0)
{ {
//nodes queue is empty ESP_LOGI(LOG_TAG, "//nodes queue is empty");
if((bWantReboot == true) && (OTA_ALLOW_REBOOT == 1))
xReturned = xSemaphoreTake(bsOTAProcess, portMAX_DELAY); //wait for binary semaphore that allows to start the OTA process
if((xReturned == pdTRUE) && (bWantReboot == true) && (OTA_ALLOW_REBOOT == 1))
{ {
ESP_LOGE(LOG_TAG, "ESP32 Reboot ..."); ESP_LOGE(LOG_TAG, "ESP32 Reboot ...");
vTaskDelay( (1000) / portTICK_PERIOD_MS); vTaskDelay( (1000) / portTICK_PERIOD_MS);
esp_restart(); esp_restart();
} }
xSemaphoreGive(bsOTAProcess); //free binary semaphore, this allows other tasks to start the OTA process
ERROR_CHECK(errMeshOtaSlaveEndpoint(&bNewOTAImage)); ERROR_CHECK(errMeshOtaSlaveEndpoint(&bNewOTAImage));
} }
else else
{ {
//queue not empty ESP_LOGI(LOG_TAG, "//queue not empty %i", (uxQueueSpacesAvailable(queueNodes) - QUEUE_NODES_SIZE));
if (xQueueReceive(queueNodes, &meshNodeAddr, ((100) / portTICK_PERIOD_MS)) != pdTRUE) if (xQueueReceive(queueNodes, &meshNodeAddr, ((100) / portTICK_PERIOD_MS)) != pdTRUE)
{ {
ESP_LOGE(LOG_TAG, "Unable to receive OTA Messages from Queue"); ESP_LOGE(LOG_TAG, "Unable to receive OTA Messages from Queue");
err = ESP_FAIL; err = ESP_FAIL;
} }
ESP_LOGI(LOG_TAG, "//handle node %x", meshNodeAddr.addr[5]);
ERROR_CHECK(errMeshOtaMasterEndpoint(&bNewOTAImage, &meshNodeAddr)); ERROR_CHECK(errMeshOtaMasterEndpoint(&bNewOTAImage, &meshNodeAddr));
if (err != ESP_OK) if (err != ESP_OK)

View File

@ -89,6 +89,7 @@ esp_err_t errMeshOtaPartitionAccessHttps(bool* const cpbNewOTAImage)
if(err == ESP_OK) if(err == ESP_OK)
{ {
*cpbNewOTAImage = true; //image validated *cpbNewOTAImage = true; //image validated
vMeshOtaUtilAddAllNeighboursToQueue(); //add all existing neighbours to queue (aparent will not be added because this node is the root)
} }
} }
else else

View File

@ -328,17 +328,24 @@ void vMeshOtaUtilClearOtaMessageQueue(const mesh_addr_t* const cpcMeshNodeAddr)
void vMeshOtaUtilClearNeighboursQueue(const mesh_addr_t* const cpcMeshNodeAddr) void vMeshOtaUtilClearNeighboursQueue(const mesh_addr_t* const cpcMeshNodeAddr)
{ {
mesh_addr_t sNode; //packet for sending and receiving mesh_addr_t sNode; //packet for sending and receiving
for (uint32_t u32Index = 0; (u32Index < QUEUE_MESSAGE_OTA_SIZE); u32Index++) //loop through all OTA messages for (uint32_t u32Index = 0; (u32Index < QUEUE_NODES_SIZE); u32Index++) //loop through all node queue
{ {
if (xQueueReceive(queueNodes, &sNode, 0) == pdTRUE) if (xQueueReceive(queueNodes, &sNode, 0) == pdTRUE)
{ {
if(!(bMeshNetworkCheckMacEquality(sNode.addr, cpcMeshNodeAddr->addr))) if((bMeshNetworkCheckMacEquality(sNode.addr, cpcMeshNodeAddr->addr)))
{ {
//node is NOT cpcMeshNodeAddr --> keep it in queue ESP_LOGI(LOG_TAG, "REMOVE_NODE: remove node %x", sNode.addr[5]);
vMeshOtaUtilAddNodeToPossibleUpdatableQueue(cpcMeshNodeAddr->addr);
} }
else
{
ESP_LOGI(LOG_TAG, "//node is NOT cpcMeshNodeAddr: %i --> keep it in queue", sNode.addr[5]);
vMeshOtaUtilAddNodeToPossibleUpdatableQueue(sNode.addr);
}
}else{
ESP_LOGI(LOG_TAG, "REMOVE_NODE: queue leer");
} }
}//end OTA message loop }//end nodes
} }
/** /**
@ -361,7 +368,7 @@ void vMeshOtaUtilAddNodeToPossibleUpdatableQueue(const uint8_t* const cpcu8MAC)
} }
else else
{ {
ESP_LOGD(LOG_TAG, "added node \"%x:%x:%x:%x:%x:%x\" to possible updatable queue", addrNode.addr[0], addrNode.addr[1], addrNode.addr[2], addrNode.addr[3], addrNode.addr[4], addrNode.addr[5]); ESP_LOGI(LOG_TAG, "added node \"%x:%x:%x:%x:%x:%x\" to possible updatable queue", addrNode.addr[0], addrNode.addr[1], addrNode.addr[2], addrNode.addr[3], addrNode.addr[4], addrNode.addr[5]);
} }
} }

View File

@ -18,8 +18,8 @@
#include "HTTPS_Client.h" #include "HTTPS_Client.h"
#define ERASE_NVS //erase non volatile storage if full #define ERASE_NVS //erase non volatile storage if full
#define QUEUE_NODES_SIZE 10 #define QUEUE_NODES_SIZE 20
#define QUEUE_MESSAGE_OTA_SIZE 10 #define QUEUE_MESSAGE_OTA_SIZE 20
#define SERVER_CHECK_INTERVAL 30 //in seconds #define SERVER_CHECK_INTERVAL 30 //in seconds
#define OTA_HTTPS_SEGMENT_SIZE 2048U #define OTA_HTTPS_SEGMENT_SIZE 2048U
#define OTA_PROGRESS_LOG_INTERVAL 7U #define OTA_PROGRESS_LOG_INTERVAL 7U

View File

@ -20,7 +20,7 @@
#include "Mesh_OTA.h" #include "Mesh_OTA.h"
#define NEW_VERSION //#define NEW_VERSION
#define GPIO_BOOT_BTN 0 //GPIO0 (Boot BTN) #define GPIO_BOOT_BTN 0 //GPIO0 (Boot BTN)
#define GPIO_LED_BLUE 2 //GPIO2 (internal blue LED in DevKit V1.0) #define GPIO_LED_BLUE 2 //GPIO2 (internal blue LED in DevKit V1.0)

View File

@ -32,7 +32,7 @@ CONFIG_APP_COMPILE_TIME_DATE=y
# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set # CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set
# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set # CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set
CONFIG_APP_PROJECT_VER_FROM_CONFIG=y CONFIG_APP_PROJECT_VER_FROM_CONFIG=y
CONFIG_APP_PROJECT_VER="0.0.7" CONFIG_APP_PROJECT_VER="0.0.26"
CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16
# end of Application manager # end of Application manager