added control for http_ota task

This commit is contained in:
Hendrik Schutter 2021-01-17 23:27:01 +01:00
parent 62d16a437a
commit c6829f0483
7 changed files with 665 additions and 472 deletions

View File

@ -1,5 +1,153 @@
#include "Mesh_OTA.h" #include "Mesh_OTA.h"
static const char *LOG_TAG = "mesh_ota";
xQueueHandle queueNodes; //nodes that should be checked for ota update (contains children and parent)
xQueueHandle queueMessageOTA; //mesh ota controll messages like "OTA_Version_Response" "OTA_ACK"
SemaphoreHandle_t bsStartStopServerWorker; //binary semaphore
esp_err_t errMeshOTAInitialize()
{
esp_err_t err = ESP_OK;
BaseType_t xReturned;
//create queue to store nodes for ota worker task
queueNodes = xQueueCreate(QUEUE_NODES_SIZE, sizeof(mesh_addr_t));
if (queueNodes == 0) // Queue not created
{
ESP_LOGE(LOG_TAG, "Unable to create Queue for Nodes");
err = ESP_FAIL;
}
if(err == ESP_OK)
{
//create queue to store ota messages
queueMessageOTA = xQueueCreate(QUEUE_MESSAGE_OTA_SIZE, sizeof(MESH_PACKET_t));
if (queueMessageOTA == 0) // Queue not created
{
ESP_LOGE(LOG_TAG, "Unable to create Queue for OTA Messages");
err = ESP_FAIL;
}
}
if(err == ESP_OK)
{
bsStartStopServerWorker = xSemaphoreCreateBinary();
if( bsStartStopServerWorker == NULL )
{
ESP_LOGE(LOG_TAG, "Unable to create Mutex to represent state of Server worker");
err = ESP_FAIL;
}
}
ERROR_CHECK(errMeshNetworkSetChildConnectedHandle(vAddNodeToPossibleUpdatableQueue));
ERROR_CHECK(errMeshNetworkSetOTAMessageHandleHandle(vAddOTAControllMessageToQueue));
ERROR_CHECK(errMeshNetworkSetChangeStateOfServerWorkerHandle(vChangeStateOfServerWorker));
if(err == ESP_OK)
{
xReturned = xTaskCreate(vTaskServerWorker, "vTaskServerWorker", 4096, NULL, 5, NULL);
if(xReturned != pdPASS)
{
ESP_LOGE(LOG_TAG, "Unable to create the server worker task");
err = ESP_FAIL;
}
}
return err;
}
void vAddNodeToPossibleUpdatableQueue(uint8_t* pu8Data)
{
//send payload to node queue
mesh_addr_t addrNode;
memcpy(&addrNode.addr, (uint8_t *)pu8Data, 6); //copy MAC
if (xQueueSend(queueNodes, &addrNode, portMAX_DELAY) != pdPASS)
{
ESP_LOGE(LOG_TAG, "Unable to push node into node queue");
}
else
{
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]);
}
}
void vAddOTAControllMessageToQueue(MESH_PACKET_t* puMeshPacket)
{
//send ota packet to packet queue
if (xQueueSend(queueMessageOTA, puMeshPacket, portMAX_DELAY) != pdPASS)
{
ESP_LOGE(LOG_TAG, "Unable to push ota packet into packet queue");
}
else
{
ESP_LOGI(LOG_TAG, "added ota controll message to queue");
}
}
void vChangeStateOfServerWorker(bool bState) //allow access via function ptn to networl_handler
{
static bool bLastState = false;
if(bState != bLastState) //change only if necessary
{
ESP_LOGI(LOG_TAG, "server worker change handler");
if(bState == true)
{
if (xSemaphoreGive(bsStartStopServerWorker) != pdTRUE)
{
ESP_LOGE(LOG_TAG, "Unable to give mutex to activate the server worker");
}
}
else
{
if (xSemaphoreTake(bsStartStopServerWorker,( TickType_t ) 10 ) != pdTRUE)
{
ESP_LOGE(LOG_TAG, "Unable to obtain mutex to deactivate the server worker");
}
}
bLastState = bState;
}
}
void vTaskOTAWorker(void *arg)
{
}
void vTaskServerWorker(void *arg)
{
while(true)
{
xSemaphoreTake(bsStartStopServerWorker, portMAX_DELAY); //wait for binary semaphore that allows to start the worker
xSemaphoreGive(bsStartStopServerWorker); //free binary semaphore, this allows the handler to change is to taken
if (esp_mesh_is_root()) //check again that this node is the root node
{
ESP_LOGI(LOG_TAG, "DEMO HTTP request");
//server get version
//ota update if newer
//lock ota mutex
vTaskDelay( (SERVER_CHECK_INTERVAL*1000) / portTICK_PERIOD_MS); //sleep till next server check
}
}
}
/* /*
* 999.999.999 * 999.999.999
* Return true if remote version is newer (higher) than local version * Return true if remote version is newer (higher) than local version
@ -128,8 +276,6 @@ esp_err_t errExtractVersionNumber(const char* pu8Data, uint32_t* pu32DataLenght,
} }
/* /*
esp_err_t esp_mesh_ota_send(mesh_addr_t* dest) esp_err_t esp_mesh_ota_send(mesh_addr_t* dest)
{ {
esp_err_t err = ESP_OK; esp_err_t err = ESP_OK;

View File

@ -10,7 +10,9 @@ bool bIsMeshConnected;
int32_t i32MeshLayer; int32_t i32MeshLayer;
mesh_addr_t meshParentAddr; mesh_addr_t meshParentAddr;
void (*pAppRxHandle)(uint8_t*, uint8_t* ); void (*pAppRxHandle)(uint8_t*, uint8_t* );
void (*pOTAChildConnectHandle)(uint8_t* );
void (*pOTAMessageHandle)(MESH_PACKET_t* );
void (*pChangeStateOfServerWorkerHandle)(bool );
esp_err_t errMeshNetworkInitialize() esp_err_t errMeshNetworkInitialize()
{ {
@ -185,6 +187,24 @@ esp_err_t errMeshNetworkSetAppReceiveHandle(void (*pAppRxHandleTmp)(uint8_t * pu
return ESP_OK; return ESP_OK;
} }
esp_err_t errMeshNetworkSetChildConnectedHandle(void (*pChildConnectHandleTmp)(uint8_t * pu8Data))
{
pOTAChildConnectHandle = pChildConnectHandleTmp;
return ESP_OK;
}
esp_err_t errMeshNetworkSetOTAMessageHandleHandle(void (*pOTAMessageHandleTmp)(MESH_PACKET_t* puMeshPacket))
{
pOTAMessageHandle = pOTAMessageHandleTmp;
return ESP_OK;
}
esp_err_t errMeshNetworkSetChangeStateOfServerWorkerHandle(void (*pChangeStateOfServerWorkerHandleTmp)(bool bState))
{
pChangeStateOfServerWorkerHandle = pChangeStateOfServerWorkerHandleTmp;
return ESP_OK;
}
esp_err_t errSendMeshPacket(mesh_addr_t* pAddrDest, MESH_PACKET_t* pPacket) esp_err_t errSendMeshPacket(mesh_addr_t* pAddrDest, MESH_PACKET_t* pPacket)
{ {
esp_err_t err; esp_err_t err;

View File

@ -7,6 +7,10 @@ void vIPEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventID,
{ {
ip_event_got_ip_t *event = (ip_event_got_ip_t *) vpEventData; ip_event_got_ip_t *event = (ip_event_got_ip_t *) vpEventData;
ESP_LOGI(LOG_TAG, "<IP_EVENT_STA_GOT_IP>IP:" IPSTR, IP2STR(&event->ip_info.ip)); ESP_LOGI(LOG_TAG, "<IP_EVENT_STA_GOT_IP>IP:" IPSTR, IP2STR(&event->ip_info.ip));
if(pChangeStateOfServerWorkerHandle)
{
pChangeStateOfServerWorkerHandle(true); //signal that this node (root node) has access to internet
}
} }
void vMeshEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventID, void* vpEventData) void vMeshEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventID, void* vpEventData)
@ -20,200 +24,205 @@ void vMeshEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventI
{ {
esp_mesh_get_id(&id); esp_mesh_get_id(&id);
ESP_LOGI(LOG_TAG, "<MESH_EVENT_MESH_STARTED>ID:"MACSTR"", MAC2STR(id.addr)); ESP_LOGI(LOG_TAG, "<MESH_EVENT_MESH_STARTED>ID:"MACSTR"", MAC2STR(id.addr));
bIsMeshConnected = false; bIsMeshConnected = false;
i32MeshLayer = esp_mesh_get_layer(); i32MeshLayer = esp_mesh_get_layer();
} }
break; break;
case MESH_EVENT_STOPPED: case MESH_EVENT_STOPPED:
{ {
ESP_LOGI(LOG_TAG, "<MESH_EVENT_STOPPED>"); ESP_LOGI(LOG_TAG, "<MESH_EVENT_STOPPED>");
bIsMeshConnected = false; bIsMeshConnected = false;
i32MeshLayer = esp_mesh_get_layer(); i32MeshLayer = esp_mesh_get_layer();
} }
break; break;
case MESH_EVENT_CHILD_CONNECTED: case MESH_EVENT_CHILD_CONNECTED:
{ {
mesh_event_child_connected_t *child_connected = (mesh_event_child_connected_t *)vpEventData; mesh_event_child_connected_t *child_connected = (mesh_event_child_connected_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_CHILD_CONNECTED>aid:%d, "MACSTR"", ESP_LOGI(LOG_TAG, "<MESH_EVENT_CHILD_CONNECTED>aid:%d, "MACSTR"", child_connected->aid, MAC2STR(child_connected->mac));
child_connected->aid,
MAC2STR(child_connected->mac)); if(pOTAChildConnectHandle){pOTAChildConnectHandle(child_connected->mac);}//add this child to queue using handle
}
break; }
break;
case MESH_EVENT_CHILD_DISCONNECTED: case MESH_EVENT_CHILD_DISCONNECTED:
{ {
mesh_event_child_disconnected_t *child_disconnected = (mesh_event_child_disconnected_t *)vpEventData; mesh_event_child_disconnected_t *child_disconnected = (mesh_event_child_disconnected_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_CHILD_DISCONNECTED>aid:%d, "MACSTR"", ESP_LOGI(LOG_TAG, "<MESH_EVENT_CHILD_DISCONNECTED>aid:%d, "MACSTR"",
child_disconnected->aid, child_disconnected->aid,
MAC2STR(child_disconnected->mac)); MAC2STR(child_disconnected->mac));
} }
break; break;
case MESH_EVENT_ROUTING_TABLE_ADD: case MESH_EVENT_ROUTING_TABLE_ADD:
{ {
mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)vpEventData; mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)vpEventData;
ESP_LOGW(LOG_TAG, "<MESH_EVENT_ROUTING_TABLE_ADD>add %d, new:%d, layer:%d", ESP_LOGW(LOG_TAG, "<MESH_EVENT_ROUTING_TABLE_ADD>add %d, new:%d, layer:%d",
routing_table->rt_size_change, routing_table->rt_size_change,
routing_table->rt_size_new, i32MeshLayer); routing_table->rt_size_new, i32MeshLayer);
} }
break; break;
case MESH_EVENT_ROUTING_TABLE_REMOVE: case MESH_EVENT_ROUTING_TABLE_REMOVE:
{ {
mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)vpEventData; mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)vpEventData;
ESP_LOGW(LOG_TAG, "<MESH_EVENT_ROUTING_TABLE_REMOVE>remove %d, new:%d, layer:%d", ESP_LOGW(LOG_TAG, "<MESH_EVENT_ROUTING_TABLE_REMOVE>remove %d, new:%d, layer:%d",
routing_table->rt_size_change, routing_table->rt_size_change,
routing_table->rt_size_new, i32MeshLayer); routing_table->rt_size_new, i32MeshLayer);
} }
break; break;
case MESH_EVENT_NO_PARENT_FOUND: case MESH_EVENT_NO_PARENT_FOUND:
{ {
mesh_event_no_parent_found_t *no_parent = (mesh_event_no_parent_found_t *)vpEventData; mesh_event_no_parent_found_t *no_parent = (mesh_event_no_parent_found_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_NO_PARENT_FOUND>scan times:%d", ESP_LOGI(LOG_TAG, "<MESH_EVENT_NO_PARENT_FOUND>scan times:%d",
no_parent->scan_times); no_parent->scan_times);
/* TODO handler for the failure, maybe nominate themselves */ /* TODO handler for the failure, maybe nominate themselves */
} }
break; break;
case MESH_EVENT_PARENT_CONNECTED: case MESH_EVENT_PARENT_CONNECTED:
{ {
mesh_event_connected_t *connected = (mesh_event_connected_t *)vpEventData; mesh_event_connected_t *connected = (mesh_event_connected_t *)vpEventData;
esp_mesh_get_id(&id); esp_mesh_get_id(&id);
i32MeshLayer = connected->self_layer; i32MeshLayer = connected->self_layer;
memcpy(&meshParentAddr.addr, connected->connected.bssid, 6); memcpy(&meshParentAddr.addr, connected->connected.bssid, 6);
ESP_LOGI(LOG_TAG, "<MESH_EVENT_PARENT_CONNECTED>layer:%d-->%d, parent:"MACSTR"%s, ID:"MACSTR", duty:%d", ESP_LOGI(LOG_TAG, "<MESH_EVENT_PARENT_CONNECTED>layer:%d-->%d, parent:"MACSTR"%s, ID:"MACSTR", duty:%d",
last_layer, i32MeshLayer, MAC2STR(meshParentAddr.addr), last_layer, i32MeshLayer, MAC2STR(meshParentAddr.addr),
esp_mesh_is_root() ? "<ROOT>" : (i32MeshLayer == 2) ? "<layer2>" : "", //print own node title esp_mesh_is_root() ? "<ROOT>" : (i32MeshLayer == 2) ? "<layer2>" : "", //print own node title
MAC2STR(id.addr), connected->duty); MAC2STR(id.addr), connected->duty);
last_layer = i32MeshLayer; last_layer = i32MeshLayer;
bIsMeshConnected = true; bIsMeshConnected = true;
if (esp_mesh_is_root()) if (esp_mesh_is_root())
{ {
ESP_ERROR_CHECK(esp_netif_dhcpc_start(netif_sta)); //get a IP from router if(esp_netif_dhcpc_start(netif_sta) == ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED) //get a IP from router
} {
errStartReceiveTask();//start receiving if(pChangeStateOfServerWorkerHandle){pChangeStateOfServerWorkerHandle(true);}// signal reconnect
} }
break; }
errStartReceiveTask();//start receiving
}
break;
case MESH_EVENT_PARENT_DISCONNECTED: case MESH_EVENT_PARENT_DISCONNECTED:
{ {
mesh_event_disconnected_t *disconnected = (mesh_event_disconnected_t *)vpEventData; mesh_event_disconnected_t *disconnected = (mesh_event_disconnected_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_PARENT_DISCONNECTED>reason:%d", disconnected->reason); ESP_LOGI(LOG_TAG, "<MESH_EVENT_PARENT_DISCONNECTED>reason:%d", disconnected->reason);
bIsMeshConnected = false; bIsMeshConnected = false;
i32MeshLayer = esp_mesh_get_layer(); if(pChangeStateOfServerWorkerHandle){pChangeStateOfServerWorkerHandle(false);}
} i32MeshLayer = esp_mesh_get_layer();
break; }
break;
case MESH_EVENT_LAYER_CHANGE: case MESH_EVENT_LAYER_CHANGE:
{ {
mesh_event_layer_change_t *layer_change = (mesh_event_layer_change_t *)vpEventData; mesh_event_layer_change_t *layer_change = (mesh_event_layer_change_t *)vpEventData;
i32MeshLayer = layer_change->new_layer; i32MeshLayer = layer_change->new_layer;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_LAYER_CHANGE>layer:%d-->%d%s", ESP_LOGI(LOG_TAG, "<MESH_EVENT_LAYER_CHANGE>layer:%d-->%d%s",
last_layer, i32MeshLayer, last_layer, i32MeshLayer,
esp_mesh_is_root() ? "<ROOT>" : (i32MeshLayer == 2) ? "<layer2>" : ""); esp_mesh_is_root() ? "<ROOT>" : (i32MeshLayer == 2) ? "<layer2>" : "");
last_layer = i32MeshLayer; last_layer = i32MeshLayer;
} }
break; break;
case MESH_EVENT_ROOT_ADDRESS: case MESH_EVENT_ROOT_ADDRESS:
{ {
mesh_event_root_address_t *root_addr = (mesh_event_root_address_t *)vpEventData; mesh_event_root_address_t *root_addr = (mesh_event_root_address_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_ADDRESS>root address:"MACSTR"", ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_ADDRESS>root address:"MACSTR"",
MAC2STR(root_addr->addr)); MAC2STR(root_addr->addr));
} }
break; break;
case MESH_EVENT_VOTE_STARTED: case MESH_EVENT_VOTE_STARTED:
{ {
mesh_event_vote_started_t *vote_started = (mesh_event_vote_started_t *)vpEventData; mesh_event_vote_started_t *vote_started = (mesh_event_vote_started_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_VOTE_STARTED>attempts:%d, reason:%d, rc_addr:"MACSTR"", ESP_LOGI(LOG_TAG, "<MESH_EVENT_VOTE_STARTED>attempts:%d, reason:%d, rc_addr:"MACSTR"",
vote_started->attempts, vote_started->attempts,
vote_started->reason, vote_started->reason,
MAC2STR(vote_started->rc_addr.addr)); MAC2STR(vote_started->rc_addr.addr));
} }
break; break;
case MESH_EVENT_VOTE_STOPPED: case MESH_EVENT_VOTE_STOPPED:
{ {
ESP_LOGI(LOG_TAG, "<MESH_EVENT_VOTE_STOPPED>"); ESP_LOGI(LOG_TAG, "<MESH_EVENT_VOTE_STOPPED>");
} }
break; break;
case MESH_EVENT_ROOT_SWITCH_REQ: case MESH_EVENT_ROOT_SWITCH_REQ:
{ {
mesh_event_root_switch_req_t *switch_req = (mesh_event_root_switch_req_t *)vpEventData; mesh_event_root_switch_req_t *switch_req = (mesh_event_root_switch_req_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_SWITCH_REQ>reason:%d, rc_addr:"MACSTR"", switch_req->reason, ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_SWITCH_REQ>reason:%d, rc_addr:"MACSTR"", switch_req->reason,
MAC2STR( switch_req->rc_addr.addr)); MAC2STR( switch_req->rc_addr.addr));
} }
break; break;
case MESH_EVENT_ROOT_SWITCH_ACK: case MESH_EVENT_ROOT_SWITCH_ACK:
{ {
//new root //new root
i32MeshLayer = esp_mesh_get_layer(); i32MeshLayer = esp_mesh_get_layer();
esp_mesh_get_parent_bssid(&meshParentAddr); esp_mesh_get_parent_bssid(&meshParentAddr);
ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_SWITCH_ACK>layer:%d, parent:"MACSTR"", i32MeshLayer, MAC2STR(meshParentAddr.addr)); ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_SWITCH_ACK>layer:%d, parent:"MACSTR"", i32MeshLayer, MAC2STR(meshParentAddr.addr));
} }
break; break;
case MESH_EVENT_TODS_STATE: case MESH_EVENT_TODS_STATE:
{ {
mesh_event_toDS_state_t *toDs_state = (mesh_event_toDS_state_t *)vpEventData; mesh_event_toDS_state_t *toDs_state = (mesh_event_toDS_state_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_TODS_REACHABLE>state:%d", *toDs_state); ESP_LOGI(LOG_TAG, "<MESH_EVENT_TODS_REACHABLE>state:%d", *toDs_state);
} }
break; break;
case MESH_EVENT_ROOT_FIXED: case MESH_EVENT_ROOT_FIXED:
{ {
mesh_event_root_fixed_t *root_fixed = (mesh_event_root_fixed_t *)vpEventData; mesh_event_root_fixed_t *root_fixed = (mesh_event_root_fixed_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_FIXED>%s", ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_FIXED>%s",
root_fixed->is_fixed ? "fixed" : "not fixed"); root_fixed->is_fixed ? "fixed" : "not fixed");
} }
break; break;
case MESH_EVENT_ROOT_ASKED_YIELD: case MESH_EVENT_ROOT_ASKED_YIELD:
{ {
mesh_event_root_conflict_t *root_conflict = (mesh_event_root_conflict_t *)vpEventData; mesh_event_root_conflict_t *root_conflict = (mesh_event_root_conflict_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_ASKED_YIELD>"MACSTR", rssi:%d, capacity:%d", ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_ASKED_YIELD>"MACSTR", rssi:%d, capacity:%d",
MAC2STR(root_conflict->addr), root_conflict->rssi, root_conflict->capacity); MAC2STR(root_conflict->addr), root_conflict->rssi, root_conflict->capacity);
} }
break; break;
case MESH_EVENT_CHANNEL_SWITCH: case MESH_EVENT_CHANNEL_SWITCH:
{ {
mesh_event_channel_switch_t *channel_switch = (mesh_event_channel_switch_t *)vpEventData; mesh_event_channel_switch_t *channel_switch = (mesh_event_channel_switch_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_CHANNEL_SWITCH>new channel:%d", channel_switch->channel); ESP_LOGI(LOG_TAG, "<MESH_EVENT_CHANNEL_SWITCH>new channel:%d", channel_switch->channel);
} }
break; break;
case MESH_EVENT_SCAN_DONE: case MESH_EVENT_SCAN_DONE:
{ {
mesh_event_scan_done_t *scan_done = (mesh_event_scan_done_t *)vpEventData; mesh_event_scan_done_t *scan_done = (mesh_event_scan_done_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_SCAN_DONE>number:%d", scan_done->number); ESP_LOGI(LOG_TAG, "<MESH_EVENT_SCAN_DONE>number:%d", scan_done->number);
} }
break; break;
case MESH_EVENT_NETWORK_STATE: case MESH_EVENT_NETWORK_STATE:
{ {
mesh_event_network_state_t *network_state = (mesh_event_network_state_t *)vpEventData; mesh_event_network_state_t *network_state = (mesh_event_network_state_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_NETWORK_STATE>is_rootless:%d", network_state->is_rootless); ESP_LOGI(LOG_TAG, "<MESH_EVENT_NETWORK_STATE>is_rootless:%d", network_state->is_rootless);
} }
break; break;
case MESH_EVENT_STOP_RECONNECTION: case MESH_EVENT_STOP_RECONNECTION:
{ {
ESP_LOGI(LOG_TAG, "<MESH_EVENT_STOP_RECONNECTION>"); ESP_LOGI(LOG_TAG, "<MESH_EVENT_STOP_RECONNECTION>");
} }
break; break;
case MESH_EVENT_FIND_NETWORK: case MESH_EVENT_FIND_NETWORK:
{ {
mesh_event_find_network_t *find_network = (mesh_event_find_network_t *)vpEventData; mesh_event_find_network_t *find_network = (mesh_event_find_network_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_FIND_NETWORK>new channel:%d, router BSSID:"MACSTR"", ESP_LOGI(LOG_TAG, "<MESH_EVENT_FIND_NETWORK>new channel:%d, router BSSID:"MACSTR"",
find_network->channel, MAC2STR(find_network->router_bssid)); find_network->channel, MAC2STR(find_network->router_bssid));
} }
break; break;
case MESH_EVENT_ROUTER_SWITCH: case MESH_EVENT_ROUTER_SWITCH:
{ {
mesh_event_router_switch_t *router_switch = (mesh_event_router_switch_t *)vpEventData; mesh_event_router_switch_t *router_switch = (mesh_event_router_switch_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROUTER_SWITCH>new router:%s, channel:%d, "MACSTR"", ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROUTER_SWITCH>new router:%s, channel:%d, "MACSTR"",
router_switch->ssid, router_switch->channel, MAC2STR(router_switch->bssid)); router_switch->ssid, router_switch->channel, MAC2STR(router_switch->bssid));
} }
break; break;
case MESH_EVENT_PS_PARENT_DUTY: case MESH_EVENT_PS_PARENT_DUTY:
{ {
mesh_event_ps_duty_t *ps_duty = (mesh_event_ps_duty_t *)vpEventData; mesh_event_ps_duty_t *ps_duty = (mesh_event_ps_duty_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_PS_PARENT_DUTY>duty:%d", ps_duty->duty); ESP_LOGI(LOG_TAG, "<MESH_EVENT_PS_PARENT_DUTY>duty:%d", ps_duty->duty);
} }
break; break;
case MESH_EVENT_PS_CHILD_DUTY: case MESH_EVENT_PS_CHILD_DUTY:
{ {
mesh_event_ps_duty_t *ps_duty = (mesh_event_ps_duty_t *)vpEventData; mesh_event_ps_duty_t *ps_duty = (mesh_event_ps_duty_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_PS_CHILD_DUTY>cidx:%d, "MACSTR", duty:%d", ps_duty->child_connected.aid-1, ESP_LOGI(LOG_TAG, "<MESH_EVENT_PS_CHILD_DUTY>cidx:%d, "MACSTR", duty:%d", ps_duty->child_connected.aid-1,
MAC2STR(ps_duty->child_connected.mac), ps_duty->duty); MAC2STR(ps_duty->child_connected.mac), ps_duty->duty);
} }
break; break;
default: default:
ESP_LOGI(LOG_TAG, "unknown id:%d", i32EventID); ESP_LOGI(LOG_TAG, "unknown id:%d", i32EventID);
break; break;

View File

@ -132,7 +132,8 @@ https_client_ret_t https_clientDeinitialize()
return i32RetHTTPClient; return i32RetHTTPClient;
} }
https_client_ret_t https_clientInitEmbedTLS() { https_client_ret_t https_clientInitEmbedTLS()
{
https_client_ret_t i32RetHTTPClient = HTTPS_CLIENT_OK; https_client_ret_t i32RetHTTPClient = HTTPS_CLIENT_OK;
int32_t i32RetEmbedTLS = ESP_OK; int32_t i32RetEmbedTLS = ESP_OK;
@ -278,7 +279,9 @@ https_client_ret_t https_clientSendRequest()
{ {
//bytes written //bytes written
u32WrittenBytes += i32RetSendRequest; u32WrittenBytes += i32RetSendRequest;
} else if (i32RetSendRequest != MBEDTLS_ERR_SSL_WANT_WRITE && i32RetSendRequest != MBEDTLS_ERR_SSL_WANT_READ) { }
else if (i32RetSendRequest != MBEDTLS_ERR_SSL_WANT_WRITE && i32RetSendRequest != MBEDTLS_ERR_SSL_WANT_READ)
{
ESP_LOGE(TAG, "mbedtls_ssl_write returned 0x%x", i32RetSendRequest); ESP_LOGE(TAG, "mbedtls_ssl_write returned 0x%x", i32RetSendRequest);
bWrite = false; bWrite = false;
} }

View File

@ -16,17 +16,9 @@
#include "Mesh_network.h" #include "Mesh_network.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_MESSAGE_OTA_SIZE 10
enum ota_packet_type #define SERVER_CHECK_INTERVAL 30 //in seconds
{
APP_Version_Request,
APP_Version_Response,
OTA_Data,
OTA_ACK,
OTA_Complete
};
*/
#define ERROR_CHECK(x) if (err == ESP_OK) \ #define ERROR_CHECK(x) if (err == ESP_OK) \
{ \ { \
@ -37,9 +29,21 @@ enum ota_packet_type
} \ } \
} \ } \
esp_err_t errMeshOTAInitialize();
//helper functions
bool bNewerVersion(const char* pu8Local, const char* pu8Remote); bool bNewerVersion(const char* pu8Local, const char* pu8Remote);
esp_err_t errExtractVersionNumber(const char* pu8Data, uint32_t* pu32DataLenght, char* pc8RemoteVersionNumber); esp_err_t errExtractVersionNumber(const char* pu8Data, uint32_t* pu32DataLenght, char* pc8RemoteVersionNumber);
esp_err_t errFindImageStart(const char* pu8Data, uint32_t* pu32DataLenght, uint32_t* pu32StartOffset); esp_err_t errFindImageStart(const char* pu8Data, uint32_t* pu32DataLenght, uint32_t* pu32StartOffset);
//Handler
void vAddNodeToPossibleUpdatableQueue(uint8_t* pu8Data);
void vAddOTAControllMessageToQueue(MESH_PACKET_t* puMeshPacket);
void vChangeStateOfServerWorker(bool state);
//Tasks
void vTaskServerWorker(void *arg);
#endif /* H_MESH_OTA */ #endif /* H_MESH_OTA */

View File

@ -59,6 +59,7 @@ struct meshPacket
OTA_Complete //signal end of image OTA_Complete //signal end of image
} type; } type;
uint8_t au8Payload[1024]; uint8_t au8Payload[1024];
mesh_addr_t meshSenderAddr;
}; };
typedef struct meshPacket MESH_PACKET_t; typedef struct meshPacket MESH_PACKET_t;
@ -68,12 +69,18 @@ extern int32_t i32MeshLayer;
extern mesh_addr_t meshParentAddr; extern mesh_addr_t meshParentAddr;
extern esp_netif_t* netif_sta; extern esp_netif_t* netif_sta;
extern uint8_t u8ownMAC[6]; extern uint8_t u8ownMAC[6];
extern void (*pOTAChildConnectHandle)(uint8_t* );
extern void (*pChangeStateOfServerWorkerHandle)(bool );
esp_err_t errMeshNetworkInitialize(); esp_err_t errMeshNetworkInitialize();
esp_err_t errMeshNetworkInitializeWiFi(); esp_err_t errMeshNetworkInitializeWiFi();
esp_err_t errMeshNetworkInitializeRouter(mesh_cfg_t* cfg); esp_err_t errMeshNetworkInitializeRouter(mesh_cfg_t* cfg);
esp_err_t errMeshNetworkSetAppReceiveHandle(void (*pFuncParam)(uint8_t * pu8Data, uint8_t* pu8Sender)); esp_err_t errMeshNetworkSetAppReceiveHandle(void (*pAppRxHandleTmp)(uint8_t * pu8Data, uint8_t* pu8Sender));
esp_err_t errMeshNetworkSetChildConnectedHandle(void (*pChildConnectHandleTmp)(uint8_t * pu8Data));
esp_err_t errMeshNetworkSetOTAMessageHandleHandle(void (*pOTAMessageHandleTmp)(MESH_PACKET_t* puMeshPacket));
esp_err_t errMeshNetworkSetChangeStateOfServerWorkerHandle(void (*pChangeStateOfServerWorkerHandleTmp)(bool bState));
bool bCheckMACEquality(uint8_t* pu8aMAC, uint8_t* pu8bMAC); bool bCheckMACEquality(uint8_t* pu8aMAC, uint8_t* pu8bMAC);
void vGetOwnAddr(mesh_addr_t* pMeshOwnAddr); void vGetOwnAddr(mesh_addr_t* pMeshOwnAddr);

View File

@ -20,14 +20,18 @@ void app_main(void)
{ {
esp_err_t err = ESP_OK; esp_err_t err = ESP_OK;
ESP_LOGI(LOG_TAG, "hardcoded: 0.0.1"); ESP_LOGI(LOG_TAG, "hardcoded: 0.0.1");
ESP_LOGI(LOG_TAG, "start mesh network");
err = errMeshNetworkInitialize(); err = errMeshNetworkInitialize();
ESP_ERROR_CHECK(err); ESP_ERROR_CHECK(err);
//start ota ESP_LOGI(LOG_TAG, "start ota");
err = errMeshOTAInitialize();
//start app ESP_ERROR_CHECK(err);
errBlinkyLEDInitialize();
ESP_LOGI(LOG_TAG, "start app");
err = errBlinkyLEDInitialize();
ESP_ERROR_CHECK(err);
} }