@ -17,31 +17,31 @@ esp_err_t errBlinkyLEDInitialize()
//create queue to store led action created from BTN and mesh network events
queueBlinkyLEDPackets = xQueueCreate ( 5 , sizeof ( BLINKY_PACKET_t ) ) ;
if ( queueBlinkyLEDPackets = = 0 ) // Queue not created
{
ESP_LOGE ( LOG_TAG , " Unable to create Queue for Application Packets " ) ;
err = ESP_FAIL ;
}
{
ESP_LOGE ( LOG_TAG , " Unable to create Queue for Application Packets " ) ;
err = ESP_FAIL ;
}
//register the receiver handle in mesh network
ERROR_CHECK ( errMeshNetworkSetAppReceiveHandle ( rxHandle ) ) ;
if ( err = = ESP_OK )
{
xReturned = xTaskCreate ( vTaskReadUserInput , " vTaskReadUserInput " , 4096 , NULL , 5 , NULL ) ;
if ( xReturned ! = pdPASS )
{
err = ESP_FAIL ;
xReturned = xTaskCreate ( vTaskReadUserInput , " vTaskReadUserInput " , 4096 , NULL , 5 , NULL ) ;
if ( xReturned ! = pdPASS )
{
err = ESP_FAIL ;
}
}
}
if ( err = = ESP_OK )
{
xReturned = xTaskCreate ( vTaskReceiveData , " vTaskReceiveData " , 4096 , NULL , 5 , NULL ) ;
if ( xReturned ! = pdPASS )
{
err = ESP_FAIL ;
xReturned = xTaskCreate ( vTaskReceiveData , " vTaskReceiveData " , 4096 , NULL , 5 , NULL ) ;
if ( xReturned ! = pdPASS )
{
err = ESP_FAIL ;
}
}
}
return err ;
}
@ -69,9 +69,9 @@ void rxHandle(uint8_t* pu8Data, uint8_t* pu8Sender)
memcpy ( & bTmpPacket , ( uint8_t * ) pu8Data , sizeof ( BLINKY_PACKET_t ) ) ;
memcpy ( & bTmpPacket . meshSenderAddr , ( uint8_t * ) pu8Sender , 6 ) ; //copy MAC from sender into app packet
if ( xQueueSend ( queueBlinkyLEDPackets , & bTmpPacket , portMAX_DELAY ) ! = pdPASS )
{
ESP_LOGE ( LOG_TAG , " Unable to push packet from mesh into Queue " ) ;
}
{
ESP_LOGE ( LOG_TAG , " Unable to push packet from mesh into Queue " ) ;
}
}
void vTaskReadUserInput ( void * arg )
@ -84,48 +84,49 @@ void vTaskReadUserInput(void *arg)
meshPacket . type = APP_Data ; //this is a app packet
while ( true )
{ //check for BTN press
if ( gpio_get_level ( GPIO_BOOT_BTN ) = = 0 )
{
err = ESP_OK ;
if ( bLEDisOn = = false )
{
bTmpPacket . type = LED_ON ;
}
else
{
bTmpPacket . type = LED_OFF ;
}
//push led action into queue
if ( xQueueSend ( queueBlinkyLEDPackets , & bTmpPacket , portMAX_DELAY ) ! = pdPASS )
{
ESP_LOGE ( LOG_TAG , " Unable to push packet into queue " ) ;
}
memcpy ( meshPacket . au8Payload , & bTmpPacket , sizeof ( BLINKY_PACKET_t ) ) ;
if ( bIsRootNode ( ) = = false )
{
//this node is not root --> send led action to parent
ERROR_CHECK ( errGetParentNode ( & addrParent ) ) ;
ERROR_CHECK ( errSendMeshPacket ( & addrParent , & meshPacket ) ) ;
}
else
{
//this node is root --> send led action to children
ERROR_CHECK ( errGetChildren ( childrenAddr , & u16ChildrenSize ) ) ;
for ( uint16_t u16Index = 0 ; u16Index < u16ChildrenSize ; u16Index + + )
//check for BTN press
if ( gpio_get_level ( GPIO_BOOT_BTN ) = = 0 )
{
ERROR_CHECK ( errSendMeshPacket ( & childrenAddr [ u16Index ] , & meshPacket ) ) ;
err = ESP_OK ;
if ( bLEDisOn = = false )
{
bTmpPacket . type = LED_ON ;
}
else
{
bTmpPacket . type = LED_OFF ;
}
//push led action into queue
if ( xQueueSend ( queueBlinkyLEDPackets , & bTmpPacket , portMAX_DELAY ) ! = pdPASS )
{
ESP_LOGE ( LOG_TAG , " Unable to push packet into queue " ) ;
}
memcpy ( meshPacket . au8Payload , & bTmpPacket , sizeof ( BLINKY_PACKET_t ) ) ;
if ( bIsRootNode ( ) = = false )
{
//this node is not root --> send led action to parent
ERROR_CHECK ( errGetParentNode ( & addrParent ) ) ;
ERROR_CHECK ( errSendMeshPacket ( & addrParent , & meshPacket ) ) ;
}
else
{
//this node is root --> send led action to children
ERROR_CHECK ( errGetChildren ( childrenAddr , & u16ChildrenSize ) ) ;
for ( uint16_t u16Index = 0 ; u16Index < u16ChildrenSize ; u16Index + + )
{
ERROR_CHECK ( errSendMeshPacket ( & childrenAddr [ u16Index ] , & meshPacket ) ) ;
}
}
vTaskDelay ( 200 / portTICK_PERIOD_MS ) ;
}
}
vTaskDelay ( 200 / portTICK_PERIOD_MS ) ;
vTaskDelay ( 50 / portTICK_PERIOD_MS ) ;
}
vTaskDelay ( 50 / portTICK_PERIOD_MS ) ;
}
}
void vTaskReceiveData ( void * arg )
@ -138,47 +139,48 @@ void vTaskReceiveData(void *arg)
meshPacket . type = APP_Data ; //this is a app packet
while ( 1 )
{
if ( xQueueReceive ( queueBlinkyLEDPackets , & bTmpPacket , portMAX_DELAY ) ! = pdTRUE )
{
ESP_LOGE ( LOG_TAG , " Unable to receive packet from Queue " ) ;
}
else
{
err = ESP_OK ;
//Successfully RECEIVED the packet
switch ( bTmpPacket . type )
{
case LED_ON :
bLEDisOn = true ;
gpio_set_level ( GPIO_LED , 1 ) ; //switch on
ESP_LOGI ( LOG_TAG , " switch LED ON " ) ;
break ;
case LED_OFF :
bLEDisOn = false ;
gpio_set_level ( GPIO_LED , 0 ) ; //switch off
ESP_LOGI ( LOG_TAG , " switch LED OFF " ) ;
break ;
default :
bLEDisOn = false ;
gpio_set_level ( GPIO_LED , 0 ) ; //switch off
ESP_LOGI ( LOG_TAG , " switch LED OFF " ) ;
break ;
}
}
if ( xQueueReceive ( queueBlinkyLEDPackets , & bTmpPacket , portMAX_DELAY ) ! = pdTRUE )
{
ESP_LOGE ( LOG_TAG , " Unable to receive packet from Queue " ) ;
}
else
{
err = ESP_OK ;
//Successfully RECEIVED the packet
switch ( bTmpPacket . type )
{
case LED_ON :
bLEDisOn = true ;
gpio_set_level ( GPIO_LED , 1 ) ; //switch on
ESP_LOGI ( LOG_TAG , " switch LED ON " ) ;
break ;
case LED_OFF :
bLEDisOn = false ;
gpio_set_level ( GPIO_LED , 0 ) ; //switch off
ESP_LOGI ( LOG_TAG , " switch LED OFF " ) ;
break ;
default :
bLEDisOn = false ;
gpio_set_level ( GPIO_LED , 0 ) ; //switch off
ESP_LOGI ( LOG_TAG , " switch LED OFF " ) ;
break ;
}
}
ERROR_CHECK ( errGetChildren ( childrenAddr , & u16ChildrenSize ) ) ; //get all children attached to this node
memcpy ( meshPacket . au8Payload , & bTmpPacket , sizeof ( BLINKY_PACKET_t ) ) ; //copy led action in mesh packet payload
ERROR_CHECK ( errGetChildren ( childrenAddr , & u16ChildrenSize ) ) ; //get all children attached to this node
memcpy ( meshPacket . au8Payload , & bTmpPacket , sizeof ( BLINKY_PACKET_t ) ) ; //copy led action in mesh packet payload
for ( uint16_t u16Index = 0 ; u16Index < u16ChildrenSize ; u16Index + + )
{ //loop through children
if ( bCheckMACEquality ( bTmpPacket . meshSenderAddr . addr , childrenAddr [ u16Index ] . addr ) = = false ) //exclude the sender node
{
ERROR_CHECK ( errSendMeshPacket ( & childrenAddr [ u16Index ] , & meshPacket ) ) ; //send to child
}
for ( uint16_t u16Index = 0 ; u16Index < u16ChildrenSize ; u16Index + + )
{
//loop through children
if ( bCheckMACEquality ( bTmpPacket . meshSenderAddr . addr , childrenAddr [ u16Index ] . addr ) = = false ) //exclude the sender node
{
ERROR_CHECK ( errSendMeshPacket ( & childrenAddr [ u16Index ] , & meshPacket ) ) ; //send to child
}
}
vTaskDelay ( 200 / portTICK_PERIOD_MS ) ;
}
vTaskDelay ( 200 / portTICK_PERIOD_MS ) ;
}
}