mesh: move event_handler from generich on off server to model

This commit is contained in:
Milanka Ringwald 2019-06-18 10:41:50 +02:00 committed by Matthias Ringwald
parent b9ccacabde
commit 2b25ccf928
5 changed files with 25 additions and 14 deletions

View File

@ -1094,7 +1094,7 @@ int btstack_main(void)
mesh_generic_on_off_server_model.operations = mesh_generic_on_off_server_get_operations(); mesh_generic_on_off_server_model.operations = mesh_generic_on_off_server_get_operations();
mesh_element_add_model(mesh_primary_element(), &mesh_generic_on_off_server_model); mesh_element_add_model(mesh_primary_element(), &mesh_generic_on_off_server_model);
mesh_generic_on_off_server_model.model_data = (void *) &mesh_generic_on_off_state; mesh_generic_on_off_server_model.model_data = (void *) &mesh_generic_on_off_state;
mesh_generic_on_off_server_register_packet_handler(&mesh_state_update_message_handler); mesh_generic_on_off_server_register_packet_handler(&mesh_generic_on_off_server_model, &mesh_state_update_message_handler);
mesh_vendor_model.model_identifier = mesh_model_get_model_identifier(BLUETOOTH_COMPANY_ID_BLUEKITCHEN_GMBH, MESH_BLUEKITCHEN_MODEL_ID_TEST_SERVER); mesh_vendor_model.model_identifier = mesh_model_get_model_identifier(BLUETOOTH_COMPANY_ID_BLUEKITCHEN_GMBH, MESH_BLUEKITCHEN_MODEL_ID_TEST_SERVER);
mesh_model_reset_appkeys(&mesh_vendor_model); mesh_model_reset_appkeys(&mesh_vendor_model);

View File

@ -74,9 +74,9 @@ void mesh_access_init(void){
mesh_upper_transport_register_access_message_handler(&mesh_access_message_process_handler); mesh_upper_transport_register_access_message_handler(&mesh_access_message_process_handler);
} }
void mesh_access_emit_state_update_bool(btstack_packet_handler_t handler, uint8_t element_index, uint32_t model_identifier, void mesh_access_emit_state_update_bool(btstack_packet_handler_t * event_handler, uint8_t element_index, uint32_t model_identifier,
model_state_id_t state_identifier, model_state_update_reason_t reason, uint8_t value){ model_state_id_t state_identifier, model_state_update_reason_t reason, uint8_t value){
if (!handler) return; if (event_handler == NULL) return;
uint8_t event[14] = {HCI_EVENT_MESH_META, 13, MESH_SUBEVENT_STATE_UPDATE_BOOL}; uint8_t event[14] = {HCI_EVENT_MESH_META, 13, MESH_SUBEVENT_STATE_UPDATE_BOOL};
int pos = 3; int pos = 3;
event[pos++] = element_index; event[pos++] = element_index;
@ -86,7 +86,7 @@ void mesh_access_emit_state_update_bool(btstack_packet_handler_t handler, uint8_
pos += 4; pos += 4;
event[pos++] = (uint8_t)reason; event[pos++] = (uint8_t)reason;
event[pos++] = value; event[pos++] = value;
handler(HCI_EVENT_PACKET, 0, event, sizeof(event)); (*event_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
} }
mesh_element_t * mesh_primary_element(void){ mesh_element_t * mesh_primary_element(void){

View File

@ -114,6 +114,9 @@ typedef struct mesh_model {
// subscription list // subscription list
uint16_t subscriptions[MAX_NR_MESH_SUBSCRIPTION_PER_MODEL]; uint16_t subscriptions[MAX_NR_MESH_SUBSCRIPTION_PER_MODEL];
// packet handler for transition events
btstack_packet_handler_t * transition_events_packet_handler;
} mesh_model_t; } mesh_model_t;
typedef struct { typedef struct {
@ -211,7 +214,7 @@ mesh_model_t * mesh_model_get_configuration_server(void);
mesh_model_t * mesh_access_model_for_address_and_model_identifier(uint16_t element_address, uint32_t model_identifier, uint8_t * status); mesh_model_t * mesh_access_model_for_address_and_model_identifier(uint16_t element_address, uint32_t model_identifier, uint8_t * status);
void mesh_access_emit_state_update_bool(btstack_packet_handler_t handler, uint8_t element_index, uint32_t model_identifier, void mesh_access_emit_state_update_bool(btstack_packet_handler_t * event_handler, uint8_t element_index, uint32_t model_identifier,
model_state_id_t state_identifier, model_state_update_reason_t reason, uint8_t value); model_state_id_t state_identifier, model_state_update_reason_t reason, uint8_t value);
// Mesh PDU Getter // Mesh PDU Getter

View File

@ -50,9 +50,6 @@
#include "btstack_memory.h" #include "btstack_memory.h"
#include "btstack_debug.h" #include "btstack_debug.h"
// TODO handler in model?
static btstack_packet_handler_t mesh_packet_handler;
static void generic_server_send_message(uint16_t src, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, mesh_pdu_t *pdu){ static void generic_server_send_message(uint16_t src, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, mesh_pdu_t *pdu){
uint8_t ttl = mesh_foundation_default_ttl_get(); uint8_t ttl = mesh_foundation_default_ttl_get();
mesh_upper_transport_setup_access_pdu_header(pdu, netkey_index, appkey_index, ttl, src, dest, 0); mesh_upper_transport_setup_access_pdu_header(pdu, netkey_index, appkey_index, ttl, src, dest, 0);
@ -61,8 +58,16 @@ static void generic_server_send_message(uint16_t src, uint16_t dest, uint16_t ne
// Generic On Off State // Generic On Off State
void mesh_generic_on_off_server_register_packet_handler(btstack_packet_handler_t packet_handler){ void mesh_generic_on_off_server_register_packet_handler(mesh_model_t *generic_on_off_server_model, btstack_packet_handler_t transition_events_packet_handler){
mesh_packet_handler = packet_handler; if (transition_events_packet_handler == NULL){
log_error("mesh_generic_on_off_server_register_packet_handler called with NULL callback");
return;
}
if (generic_on_off_server_model == NULL){
log_error("mesh_generic_on_off_server_register_packet_handler called with NULL generic_on_off_server_model");
return;
}
generic_on_off_server_model->transition_events_packet_handler = &transition_events_packet_handler;
} }
const mesh_access_message_t mesh_generic_on_off_status_transition = { const mesh_access_message_t mesh_generic_on_off_status_transition = {
@ -179,7 +184,7 @@ static void generic_on_off_set_handler(mesh_model_t *generic_on_off_server_model
mesh_generic_on_off_status_message(generic_on_off_server_model, mesh_pdu_netkey_index(pdu), mesh_pdu_src(pdu), mesh_pdu_appkey_index(pdu)); mesh_generic_on_off_status_message(generic_on_off_server_model, mesh_pdu_netkey_index(pdu), mesh_pdu_src(pdu), mesh_pdu_appkey_index(pdu));
mesh_access_message_processed(pdu); mesh_access_message_processed(pdu);
mesh_access_emit_state_update_bool(mesh_packet_handler, mesh_access_emit_state_update_bool(generic_on_off_server_model->transition_events_packet_handler,
mesh_access_get_element_index(generic_on_off_server_model), mesh_access_get_element_index(generic_on_off_server_model),
generic_on_off_server_model->model_identifier, generic_on_off_server_model->model_identifier,
MODEL_STATE_ID_GENERIC_ON_OFF, MODEL_STATE_ID_GENERIC_ON_OFF,
@ -213,7 +218,7 @@ void mesh_generic_on_off_server_set_value(mesh_model_t *generic_on_off_server_mo
// TODO implement publication // TODO implement publication
generic_on_off_server_state->transition_data.current_value = on_off_value; generic_on_off_server_state->transition_data.current_value = on_off_value;
mesh_access_emit_state_update_bool(mesh_packet_handler, mesh_access_emit_state_update_bool(generic_on_off_server_model->transition_events_packet_handler,
mesh_access_get_element_index(generic_on_off_server_model), mesh_access_get_element_index(generic_on_off_server_model),
generic_on_off_server_model->model_identifier, generic_on_off_server_model->model_identifier,
MODEL_STATE_ID_GENERIC_ON_OFF, MODEL_STATE_ID_GENERIC_ON_OFF,
@ -312,3 +317,5 @@ static void mesh_server_transition_step_bool(mesh_model_t * mesh_model, mesh_tra
break; break;
} }
} }

View File

@ -83,9 +83,10 @@ typedef struct {
const mesh_operation_t * mesh_generic_on_off_server_get_operations(void); const mesh_operation_t * mesh_generic_on_off_server_get_operations(void);
/** /**
* @brief Register packet handler * @brief Register packet handler
* @param packet_handler * @param generic_on_off_server_model
* @param transition_events_packet_handler
*/ */
void mesh_generic_on_off_server_register_packet_handler(btstack_packet_handler_t packet_handler); void mesh_generic_on_off_server_register_packet_handler(mesh_model_t *generic_on_off_server_model, btstack_packet_handler_t transition_events_packet_handler);
/** /**
* @brief Set ON/OFF value * @brief Set ON/OFF value