mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-02 16:20:31 +00:00
mesh: move node->element management to mesh_node
This commit is contained in:
parent
683cf298e3
commit
e8625ff1d4
@ -37,10 +37,18 @@
|
|||||||
|
|
||||||
#define __BTSTACK_FILE__ "mesh_node.c"
|
#define __BTSTACK_FILE__ "mesh_node.c"
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
#include "mesh/mesh_node.h"
|
#include "mesh/mesh_node.h"
|
||||||
|
|
||||||
static uint16_t primary_element_address;
|
static uint16_t primary_element_address;
|
||||||
|
|
||||||
|
static mesh_element_t primary_element;
|
||||||
|
|
||||||
|
static uint16_t mesh_element_index_next;
|
||||||
|
|
||||||
|
static btstack_linked_list_t mesh_elements;
|
||||||
|
|
||||||
void mesh_node_primary_element_address_set(uint16_t unicast_address){
|
void mesh_node_primary_element_address_set(uint16_t unicast_address){
|
||||||
primary_element_address = unicast_address;
|
primary_element_address = unicast_address;
|
||||||
}
|
}
|
||||||
@ -48,3 +56,49 @@ void mesh_node_primary_element_address_set(uint16_t unicast_address){
|
|||||||
uint16_t mesh_node_primary_element_address_get(void){
|
uint16_t mesh_node_primary_element_address_get(void){
|
||||||
return primary_element_address;
|
return primary_element_address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mesh_node_init(void){
|
||||||
|
// dd Primary Element to list of elements
|
||||||
|
mesh_element_add(&primary_element);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mesh_element_add(mesh_element_t * element){
|
||||||
|
element->element_index = mesh_element_index_next++;
|
||||||
|
btstack_linked_list_add_tail(&mesh_elements, (void*) element);
|
||||||
|
}
|
||||||
|
|
||||||
|
mesh_element_t * mesh_primary_element(void){
|
||||||
|
return &primary_element;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mesh_access_set_primary_element_location(uint16_t location){
|
||||||
|
primary_element.loc = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
mesh_element_t * mesh_element_for_index(uint16_t element_index){
|
||||||
|
btstack_linked_list_iterator_t it;
|
||||||
|
btstack_linked_list_iterator_init(&it, &mesh_elements);
|
||||||
|
while (btstack_linked_list_iterator_has_next(&it)){
|
||||||
|
mesh_element_t * element = (mesh_element_t *) btstack_linked_list_iterator_next(&it);
|
||||||
|
if (element->element_index != element_index) continue;
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mesh_element_t * mesh_element_for_unicast_address(uint16_t unicast_address){
|
||||||
|
uint16_t element_index = unicast_address - mesh_node_primary_element_address_get();
|
||||||
|
return mesh_element_for_index(element_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mesh_element_iterator_init(mesh_element_iterator_t * iterator){
|
||||||
|
btstack_linked_list_iterator_init(&iterator->it, &mesh_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mesh_element_iterator_has_next(mesh_element_iterator_t * iterator){
|
||||||
|
return btstack_linked_list_iterator_has_next(&iterator->it);
|
||||||
|
}
|
||||||
|
|
||||||
|
mesh_element_t * mesh_element_iterator_next(mesh_element_iterator_t * iterator){
|
||||||
|
return (mesh_element_t *) btstack_linked_list_iterator_next(&iterator->it);
|
||||||
|
}
|
||||||
|
@ -43,6 +43,31 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "btstack_linked_list.h"
|
||||||
|
|
||||||
|
typedef struct mesh_element {
|
||||||
|
// linked list item
|
||||||
|
btstack_linked_item_t item;
|
||||||
|
|
||||||
|
// element index
|
||||||
|
uint16_t element_index;
|
||||||
|
|
||||||
|
// LOC
|
||||||
|
uint16_t loc;
|
||||||
|
|
||||||
|
// models
|
||||||
|
btstack_linked_list_t models;
|
||||||
|
uint16_t models_count_sig;
|
||||||
|
uint16_t models_count_vendor;
|
||||||
|
|
||||||
|
} mesh_element_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
btstack_linked_list_iterator_t it;
|
||||||
|
} mesh_element_iterator_t;
|
||||||
|
|
||||||
|
|
||||||
|
void mesh_node_init(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set unicast address of primary element
|
* @brief Set unicast address of primary element
|
||||||
@ -50,11 +75,50 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
void mesh_node_primary_element_address_set(uint16_t unicast_address);
|
void mesh_node_primary_element_address_set(uint16_t unicast_address);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set location of primary element
|
||||||
|
* @note Returned by Configuration Server Composite Data
|
||||||
|
* @param location
|
||||||
|
*/
|
||||||
|
void mesh_access_set_primary_element_location(uint16_t location);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get unicast address of primary element
|
* @brief Get unicast address of primary element
|
||||||
*/
|
*/
|
||||||
uint16_t mesh_node_primary_element_address_get(void);
|
uint16_t mesh_node_primary_element_address_get(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get Primary Element of this node
|
||||||
|
*/
|
||||||
|
mesh_element_t * mesh_primary_element(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Add secondary element
|
||||||
|
* @param element
|
||||||
|
*/
|
||||||
|
void mesh_element_add(mesh_element_t * element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get element for given unicast address
|
||||||
|
* @param unicast_address
|
||||||
|
*/
|
||||||
|
mesh_element_t * mesh_element_for_unicast_address(uint16_t unicast_address);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get element by index
|
||||||
|
* @param element_index
|
||||||
|
*/
|
||||||
|
mesh_element_t * mesh_element_for_index(uint16_t element_index);
|
||||||
|
|
||||||
|
// Mesh Element Iterator
|
||||||
|
|
||||||
|
void mesh_element_iterator_init(mesh_element_iterator_t * iterator);
|
||||||
|
|
||||||
|
int mesh_element_iterator_has_next(mesh_element_iterator_t * iterator);
|
||||||
|
|
||||||
|
mesh_element_t * mesh_element_iterator_next(mesh_element_iterator_t * iterator);
|
||||||
|
|
||||||
|
|
||||||
#if defined __cplusplus
|
#if defined __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -59,11 +59,6 @@ static void mesh_access_upper_transport_handler(mesh_transport_callback_type_t c
|
|||||||
static const mesh_operation_t * mesh_model_lookup_operation_by_opcode(mesh_model_t * model, uint32_t opcode);
|
static const mesh_operation_t * mesh_model_lookup_operation_by_opcode(mesh_model_t * model, uint32_t opcode);
|
||||||
static void mesh_persist_iv_index_and_sequence_number(void);
|
static void mesh_persist_iv_index_and_sequence_number(void);
|
||||||
|
|
||||||
static mesh_element_t primary_element;
|
|
||||||
static uint16_t mesh_element_index_next;
|
|
||||||
|
|
||||||
static btstack_linked_list_t mesh_elements;
|
|
||||||
|
|
||||||
// acknowledged messages
|
// acknowledged messages
|
||||||
static btstack_linked_list_t mesh_access_acknowledged_messages;
|
static btstack_linked_list_t mesh_access_acknowledged_messages;
|
||||||
static btstack_timer_source_t mesh_access_acknowledged_timer;
|
static btstack_timer_source_t mesh_access_acknowledged_timer;
|
||||||
@ -85,9 +80,6 @@ static void mesh_access_setup_tlv(void){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void mesh_access_init(void){
|
void mesh_access_init(void){
|
||||||
// Access layer - add Primary Element to list of elements
|
|
||||||
mesh_element_add(&primary_element);
|
|
||||||
|
|
||||||
// register with upper transport
|
// register with upper transport
|
||||||
mesh_upper_transport_register_access_message_handler(&mesh_access_message_process_handler);
|
mesh_upper_transport_register_access_message_handler(&mesh_access_message_process_handler);
|
||||||
mesh_upper_transport_set_higher_layer_handler(&mesh_access_upper_transport_handler);
|
mesh_upper_transport_set_higher_layer_handler(&mesh_access_upper_transport_handler);
|
||||||
@ -401,39 +393,10 @@ uint8_t mesh_access_transactions_get_next_transaction_id(void){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Mesh Node Element functions
|
// Mesh Node Element functions
|
||||||
mesh_element_t * mesh_primary_element(void){
|
|
||||||
return &primary_element;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t mesh_access_get_element_index(mesh_model_t * mesh_model){
|
uint8_t mesh_access_get_element_index(mesh_model_t * mesh_model){
|
||||||
return mesh_model->element->element_index;
|
return mesh_model->element->element_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mesh_access_set_primary_element_location(uint16_t location){
|
|
||||||
primary_element.loc = location;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mesh_element_add(mesh_element_t * element){
|
|
||||||
element->element_index = mesh_element_index_next++;
|
|
||||||
btstack_linked_list_add_tail(&mesh_elements, (void*) element);
|
|
||||||
}
|
|
||||||
|
|
||||||
mesh_element_t * mesh_element_for_unicast_address(uint16_t unicast_address){
|
|
||||||
uint16_t element_index = unicast_address - mesh_node_primary_element_address_get();
|
|
||||||
return mesh_element_for_index(element_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
mesh_element_t * mesh_element_for_index(uint16_t element_index){
|
|
||||||
btstack_linked_list_iterator_t it;
|
|
||||||
btstack_linked_list_iterator_init(&it, &mesh_elements);
|
|
||||||
while (btstack_linked_list_iterator_has_next(&it)){
|
|
||||||
mesh_element_t * element = (mesh_element_t *) btstack_linked_list_iterator_next(&it);
|
|
||||||
if (element->element_index != element_index) continue;
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t mesh_access_get_element_address(mesh_model_t * mesh_model){
|
uint16_t mesh_access_get_element_address(mesh_model_t * mesh_model){
|
||||||
return mesh_node_primary_element_address_get() + mesh_model->element->element_index;
|
return mesh_node_primary_element_address_get() + mesh_model->element->element_index;
|
||||||
}
|
}
|
||||||
@ -461,7 +424,7 @@ int mesh_model_is_bluetooth_sig(uint32_t model_identifier){
|
|||||||
}
|
}
|
||||||
|
|
||||||
mesh_model_t * mesh_model_get_configuration_server(void){
|
mesh_model_t * mesh_model_get_configuration_server(void){
|
||||||
return mesh_model_get_by_identifier(&primary_element, mesh_model_get_model_identifier_bluetooth_sig(MESH_SIG_MODEL_ID_CONFIGURATION_SERVER));
|
return mesh_model_get_by_identifier(mesh_primary_element(), mesh_model_get_model_identifier_bluetooth_sig(MESH_SIG_MODEL_ID_CONFIGURATION_SERVER));
|
||||||
}
|
}
|
||||||
|
|
||||||
void mesh_element_add_model(mesh_element_t * element, mesh_model_t * mesh_model){
|
void mesh_element_add_model(mesh_element_t * element, mesh_model_t * mesh_model){
|
||||||
@ -487,18 +450,6 @@ mesh_model_t * mesh_model_iterator_next(mesh_model_iterator_t * iterator){
|
|||||||
return (mesh_model_t *) btstack_linked_list_iterator_next(&iterator->it);
|
return (mesh_model_t *) btstack_linked_list_iterator_next(&iterator->it);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mesh_element_iterator_init(mesh_element_iterator_t * iterator){
|
|
||||||
btstack_linked_list_iterator_init(&iterator->it, &mesh_elements);
|
|
||||||
}
|
|
||||||
|
|
||||||
int mesh_element_iterator_has_next(mesh_element_iterator_t * iterator){
|
|
||||||
return btstack_linked_list_iterator_has_next(&iterator->it);
|
|
||||||
}
|
|
||||||
|
|
||||||
mesh_element_t * mesh_element_iterator_next(mesh_element_iterator_t * iterator){
|
|
||||||
return (mesh_element_t *) btstack_linked_list_iterator_next(&iterator->it);
|
|
||||||
}
|
|
||||||
|
|
||||||
mesh_model_t * mesh_model_get_by_identifier(mesh_element_t * element, uint32_t model_identifier){
|
mesh_model_t * mesh_model_get_by_identifier(mesh_element_t * element, uint32_t model_identifier){
|
||||||
mesh_model_iterator_t it;
|
mesh_model_iterator_t it;
|
||||||
mesh_model_iterator_init(&it, element);
|
mesh_model_iterator_init(&it, element);
|
||||||
@ -993,7 +944,7 @@ static void mesh_access_message_process_handler(mesh_pdu_t * pdu){
|
|||||||
}
|
}
|
||||||
if (deliver_to_primary_element){
|
if (deliver_to_primary_element){
|
||||||
mesh_model_iterator_t model_it;
|
mesh_model_iterator_t model_it;
|
||||||
mesh_model_iterator_init(&model_it, &primary_element);
|
mesh_model_iterator_init(&model_it, mesh_primary_element());
|
||||||
while (mesh_model_iterator_has_next(&model_it)){
|
while (mesh_model_iterator_has_next(&model_it)){
|
||||||
mesh_model_t * model = mesh_model_iterator_next(&model_it);
|
mesh_model_t * model = mesh_model_iterator_next(&model_it);
|
||||||
// find opcode in table
|
// find opcode in table
|
||||||
|
@ -163,10 +163,6 @@ typedef struct {
|
|||||||
btstack_linked_list_iterator_t it;
|
btstack_linked_list_iterator_t it;
|
||||||
} mesh_model_iterator_t;
|
} mesh_model_iterator_t;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
btstack_linked_list_iterator_t it;
|
|
||||||
} mesh_element_iterator_t;
|
|
||||||
|
|
||||||
#define MESH_MAX_NUM_FAULTS 3
|
#define MESH_MAX_NUM_FAULTS 3
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -178,23 +174,6 @@ typedef struct {
|
|||||||
uint8_t faults[MESH_MAX_NUM_FAULTS];
|
uint8_t faults[MESH_MAX_NUM_FAULTS];
|
||||||
} mesh_fault_t;
|
} mesh_fault_t;
|
||||||
|
|
||||||
typedef struct mesh_element {
|
|
||||||
// linked list item
|
|
||||||
btstack_linked_item_t item;
|
|
||||||
|
|
||||||
// element index
|
|
||||||
uint16_t element_index;
|
|
||||||
|
|
||||||
// LOC
|
|
||||||
uint16_t loc;
|
|
||||||
|
|
||||||
// models
|
|
||||||
btstack_linked_list_t models;
|
|
||||||
uint16_t models_count_sig;
|
|
||||||
uint16_t models_count_vendor;
|
|
||||||
|
|
||||||
} mesh_element_t;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t opcode;
|
uint32_t opcode;
|
||||||
uint8_t * data;
|
uint8_t * data;
|
||||||
@ -268,24 +247,6 @@ void mesh_access_send_unacknowledged_pdu(mesh_pdu_t * pdu);
|
|||||||
*/
|
*/
|
||||||
void mesh_access_send_acknowledged_pdu(mesh_pdu_t * pdu, uint8_t retransmissions, uint32_t ack_opcode);
|
void mesh_access_send_acknowledged_pdu(mesh_pdu_t * pdu, uint8_t retransmissions, uint32_t ack_opcode);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get Primary Element of this node
|
|
||||||
*/
|
|
||||||
mesh_element_t * mesh_primary_element(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set location of primary element
|
|
||||||
* @note Returned by Configuration Server Composite Data
|
|
||||||
* @param location
|
|
||||||
*/
|
|
||||||
void mesh_access_set_primary_element_location(uint16_t location);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Add secondary element
|
|
||||||
* @param element
|
|
||||||
*/
|
|
||||||
void mesh_element_add(mesh_element_t * element);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get element index for give model
|
* @brief Get element index for give model
|
||||||
* @param mesh_model
|
* @param mesh_model
|
||||||
@ -298,18 +259,6 @@ uint8_t mesh_access_get_element_index(mesh_model_t * mesh_model);
|
|||||||
*/
|
*/
|
||||||
uint16_t mesh_access_get_element_address(mesh_model_t * mesh_model);
|
uint16_t mesh_access_get_element_address(mesh_model_t * mesh_model);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get element for given unicast address
|
|
||||||
* @param unicast_address
|
|
||||||
*/
|
|
||||||
mesh_element_t * mesh_element_for_unicast_address(uint16_t unicast_address);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get element by index
|
|
||||||
* @param element_index
|
|
||||||
*/
|
|
||||||
mesh_element_t * mesh_element_for_index(uint16_t element_index);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Add model to element
|
* @brief Add model to element
|
||||||
* @param element
|
* @param element
|
||||||
@ -317,14 +266,6 @@ mesh_element_t * mesh_element_for_index(uint16_t element_index);
|
|||||||
*/
|
*/
|
||||||
void mesh_element_add_model(mesh_element_t * element, mesh_model_t * mesh_model);
|
void mesh_element_add_model(mesh_element_t * element, mesh_model_t * mesh_model);
|
||||||
|
|
||||||
// Mesh Element Iterator
|
|
||||||
|
|
||||||
void mesh_element_iterator_init(mesh_element_iterator_t * iterator);
|
|
||||||
|
|
||||||
int mesh_element_iterator_has_next(mesh_element_iterator_t * iterator);
|
|
||||||
|
|
||||||
mesh_element_t * mesh_element_iterator_next(mesh_element_iterator_t * iterator);
|
|
||||||
|
|
||||||
// Mesh Model Iterator
|
// Mesh Model Iterator
|
||||||
|
|
||||||
void mesh_model_iterator_init(mesh_model_iterator_t * iterator, mesh_element_t * element);
|
void mesh_model_iterator_init(mesh_model_iterator_t * iterator, mesh_element_t * element);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user