mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-28 08:37:22 +00:00
mesh/health_server: add acknowledged flag to perform health test event, don't block for reponse
This commit is contained in:
parent
13dcd34bad
commit
45f04363db
@ -2925,13 +2925,14 @@ typedef uint8_t sm_key_t[16];
|
||||
#define MESH_SUBEVENT_GENERIC_LEVEL_STATUS 0x32
|
||||
|
||||
/**
|
||||
* @format 1122221
|
||||
* @format 1222211
|
||||
* @param subevent_code
|
||||
* @param dest
|
||||
* @param netkey_index
|
||||
* @param appkey_index
|
||||
* @param company_id
|
||||
* @param test_id
|
||||
* @param acknowledged
|
||||
*/
|
||||
#define MESH_SUBEVENT_HEALTH_PERFORM_TEST 0x33
|
||||
|
||||
|
@ -7915,24 +7915,6 @@ static inline uint32_t mesh_subevent_generic_level_status_get_remaining_time_ms(
|
||||
return little_endian_read_32(event, 12);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get field element_index from event MESH_SUBEVENT_HEALTH_PERFORM_TEST
|
||||
* @param event packet
|
||||
* @return element_index
|
||||
* @note: btstack_type 1
|
||||
*/
|
||||
static inline uint8_t mesh_subevent_health_perform_test_get_element_index(const uint8_t * event){
|
||||
return event[3];
|
||||
}
|
||||
/**
|
||||
* @brief Get field model_identifier from event MESH_SUBEVENT_HEALTH_PERFORM_TEST
|
||||
* @param event packet
|
||||
* @return model_identifier
|
||||
* @note: btstack_type 4
|
||||
*/
|
||||
static inline uint32_t mesh_subevent_health_perform_test_get_model_identifier(const uint8_t * event){
|
||||
return little_endian_read_32(event, 4);
|
||||
}
|
||||
/**
|
||||
* @brief Get field dest from event MESH_SUBEVENT_HEALTH_PERFORM_TEST
|
||||
* @param event packet
|
||||
@ -7940,7 +7922,7 @@ static inline uint32_t mesh_subevent_health_perform_test_get_model_identifier(co
|
||||
* @note: btstack_type 2
|
||||
*/
|
||||
static inline uint16_t mesh_subevent_health_perform_test_get_dest(const uint8_t * event){
|
||||
return little_endian_read_16(event, 8);
|
||||
return little_endian_read_16(event, 3);
|
||||
}
|
||||
/**
|
||||
* @brief Get field netkey_index from event MESH_SUBEVENT_HEALTH_PERFORM_TEST
|
||||
@ -7949,7 +7931,7 @@ static inline uint16_t mesh_subevent_health_perform_test_get_dest(const uint8_t
|
||||
* @note: btstack_type 2
|
||||
*/
|
||||
static inline uint16_t mesh_subevent_health_perform_test_get_netkey_index(const uint8_t * event){
|
||||
return little_endian_read_16(event, 10);
|
||||
return little_endian_read_16(event, 5);
|
||||
}
|
||||
/**
|
||||
* @brief Get field appkey_index from event MESH_SUBEVENT_HEALTH_PERFORM_TEST
|
||||
@ -7958,7 +7940,7 @@ static inline uint16_t mesh_subevent_health_perform_test_get_netkey_index(const
|
||||
* @note: btstack_type 2
|
||||
*/
|
||||
static inline uint16_t mesh_subevent_health_perform_test_get_appkey_index(const uint8_t * event){
|
||||
return little_endian_read_16(event, 12);
|
||||
return little_endian_read_16(event, 7);
|
||||
}
|
||||
/**
|
||||
* @brief Get field company_id from event MESH_SUBEVENT_HEALTH_PERFORM_TEST
|
||||
@ -7967,7 +7949,7 @@ static inline uint16_t mesh_subevent_health_perform_test_get_appkey_index(const
|
||||
* @note: btstack_type 2
|
||||
*/
|
||||
static inline uint16_t mesh_subevent_health_perform_test_get_company_id(const uint8_t * event){
|
||||
return little_endian_read_16(event, 14);
|
||||
return little_endian_read_16(event, 9);
|
||||
}
|
||||
/**
|
||||
* @brief Get field test_id from event MESH_SUBEVENT_HEALTH_PERFORM_TEST
|
||||
@ -7976,7 +7958,16 @@ static inline uint16_t mesh_subevent_health_perform_test_get_company_id(const ui
|
||||
* @note: btstack_type 1
|
||||
*/
|
||||
static inline uint8_t mesh_subevent_health_perform_test_get_test_id(const uint8_t * event){
|
||||
return event[16];
|
||||
return event[11];
|
||||
}
|
||||
/**
|
||||
* @brief Get field acknowledged from event MESH_SUBEVENT_HEALTH_PERFORM_TEST
|
||||
* @param event packet
|
||||
* @return acknowledged
|
||||
* @note: btstack_type 1
|
||||
*/
|
||||
static inline uint8_t mesh_subevent_health_perform_test_get_acknowledged(const uint8_t * event){
|
||||
return event[12];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -57,9 +57,6 @@
|
||||
#include "mesh/mesh_network.h"
|
||||
#include "mesh/mesh_upper_transport.h"
|
||||
|
||||
// used for asynchronous calls in the done command to unblock the message queue
|
||||
static mesh_pdu_t * processed_pdu;
|
||||
|
||||
static void health_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();
|
||||
mesh_upper_transport_setup_access_pdu_header(pdu, netkey_index, appkey_index, ttl, src, dest, 0);
|
||||
@ -165,7 +162,7 @@ static void health_fault_clear_unacknowledged_handler(mesh_model_t *mesh_model,
|
||||
}
|
||||
|
||||
|
||||
static void health_fault_test_process_message(mesh_model_t *mesh_model, mesh_pdu_t * pdu){
|
||||
static void health_fault_test_process_message(mesh_model_t *mesh_model, mesh_pdu_t * pdu, bool acknowledged){
|
||||
mesh_access_parser_state_t parser;
|
||||
mesh_access_parser_init(&parser, (mesh_pdu_t*) pdu);
|
||||
uint8_t test_id = mesh_access_parser_get_u8(&parser);
|
||||
@ -178,20 +175,18 @@ static void health_fault_test_process_message(mesh_model_t *mesh_model, mesh_pdu
|
||||
// check if fault state exists for company id
|
||||
mesh_health_fault_t * fault = mesh_health_server_fault_for_company_id(mesh_model, company_id);
|
||||
if (fault == NULL){
|
||||
mesh_health_server_report_test_not_supported(dest, netkey_index, appkey_index, test_id, company_id);
|
||||
return;
|
||||
}
|
||||
|
||||
// short-cut if not packet handler set, but only for standard test
|
||||
if (mesh_model->model_packet_handler == NULL){
|
||||
if (test_id == 0) {
|
||||
mesh_health_server_report_test_done(dest, netkey_index, appkey_index, test_id, company_id);
|
||||
} else {
|
||||
mesh_health_server_report_test_not_supported(dest, netkey_index, appkey_index, test_id, company_id);
|
||||
mesh_health_server_report_test_done(dest, netkey_index, appkey_index, test_id, company_id, acknowledged);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t event[12];
|
||||
uint8_t event[13];
|
||||
int pos = 0;
|
||||
event[pos++] = HCI_EVENT_MESH_META;
|
||||
event[pos++] = sizeof(event) - 2;
|
||||
@ -205,19 +200,20 @@ static void health_fault_test_process_message(mesh_model_t *mesh_model, mesh_pdu
|
||||
pos += 2;
|
||||
little_endian_store_16(event, pos, company_id);
|
||||
pos += 2;
|
||||
|
||||
event[pos++] = test_id;
|
||||
event[pos++] = acknowledged;
|
||||
|
||||
(*mesh_model->model_packet_handler)(HCI_EVENT_PACKET, 0, event, pos);
|
||||
}
|
||||
|
||||
static void health_fault_test_handler(mesh_model_t *mesh_model, mesh_pdu_t * pdu){
|
||||
processed_pdu = pdu;
|
||||
health_fault_test_process_message(mesh_model, pdu);
|
||||
health_fault_test_process_message(mesh_model, pdu, true);
|
||||
mesh_access_message_processed(pdu);
|
||||
}
|
||||
|
||||
static void health_fault_test_unacknowledged_handler(mesh_model_t * mesh_model, mesh_pdu_t * pdu){
|
||||
processed_pdu = NULL;
|
||||
health_fault_test_process_message(mesh_model, pdu);
|
||||
health_fault_test_process_message(mesh_model, pdu, false);
|
||||
mesh_access_message_processed(pdu);
|
||||
}
|
||||
|
||||
@ -427,33 +423,15 @@ void mesh_health_server_set_publication_model(mesh_model_t * mesh_model, mesh_pu
|
||||
mesh_model->publication_model = publication_model;
|
||||
}
|
||||
|
||||
void mesh_health_server_report_test_not_supported(uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint8_t test_id, uint16_t company_id){
|
||||
UNUSED(dest);
|
||||
UNUSED(netkey_index);
|
||||
UNUSED(appkey_index);
|
||||
UNUSED(test_id);
|
||||
UNUSED(company_id);
|
||||
|
||||
// report acknowledged message processed
|
||||
if (processed_pdu != NULL){
|
||||
mesh_pdu_t * pdu = processed_pdu;
|
||||
processed_pdu = NULL;
|
||||
mesh_access_message_processed(pdu);
|
||||
}
|
||||
}
|
||||
|
||||
void mesh_health_server_report_test_done(uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint8_t test_id, uint16_t company_id){
|
||||
void mesh_health_server_report_test_done(uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint8_t test_id, uint16_t company_id, bool acknowledged){
|
||||
mesh_model_t * mesh_model = mesh_node_get_health_server();
|
||||
if (mesh_model == NULL) return;
|
||||
|
||||
mesh_health_fault_t * fault = mesh_health_server_fault_for_company_id(mesh_model, company_id);
|
||||
fault->test_id = test_id;
|
||||
|
||||
// response for acknowledged health fault test
|
||||
if (processed_pdu != NULL){
|
||||
mesh_pdu_t * pdu = processed_pdu;
|
||||
processed_pdu = NULL;
|
||||
mesh_access_message_processed(pdu);
|
||||
|
||||
if (acknowledged){
|
||||
mesh_transport_pdu_t * transport_pdu = (mesh_transport_pdu_t *) health_fault_status(mesh_model, MESH_FOUNDATION_OPERATION_HEALTH_FAULT_STATUS, company_id, company_id);
|
||||
if (!transport_pdu) return;
|
||||
health_server_send_message(mesh_node_get_primary_element_address(), dest, netkey_index, appkey_index, (mesh_pdu_t *) transport_pdu);
|
||||
|
@ -70,18 +70,9 @@ void mesh_health_server_set_publication_model(mesh_model_t * mesh_model, mesh_pu
|
||||
* @param appkey_index
|
||||
* @param test_id
|
||||
* @param company_id
|
||||
* @param acknowledged
|
||||
*/
|
||||
void mesh_health_server_report_test_done(uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint8_t test_id, uint16_t company_id);
|
||||
|
||||
/**
|
||||
* @brief Notify health server that test is not supported (wrong company or test id), params are from MESH_SUBEVENT_HEALTH_PERFORM_TEST
|
||||
* @param dest
|
||||
* @param netkey_index
|
||||
* @param appkey_index
|
||||
* @param test_id
|
||||
* @param company_id
|
||||
*/
|
||||
void mesh_health_server_report_test_not_supported(uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint8_t test_id, uint16_t company_id);
|
||||
void mesh_health_server_report_test_done(uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, uint8_t test_id, uint16_t company_id, bool acknowledged);
|
||||
|
||||
/**
|
||||
* @brief Provide fault state memory
|
||||
|
Loading…
x
Reference in New Issue
Block a user