mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-27 03:39:56 +00:00
mesh: set model when adding transition
This commit is contained in:
parent
08c82f9b83
commit
07e07526f7
@ -114,10 +114,12 @@ static uint32_t mesh_get_transition_step_ms_from_gdtt(uint8_t transition_time_gd
|
||||
}
|
||||
|
||||
void mesh_access_transitions_add(mesh_transition_t * transition, uint8_t transition_time_gdtt, uint8_t delay_gdtt){
|
||||
if (transition_time_gdtt == 0 && delay_gdtt == 0) return;
|
||||
|
||||
// Only values of 0x00 through 0x3E shall be used to specify the value of the Transition Number of Steps field
|
||||
uint8_t num_steps = mesh_get_num_steps_from_gdtt(transition_time_gdtt);
|
||||
if (num_steps > 0x3E) return;
|
||||
|
||||
|
||||
transition->remaining_delay_time_ms = delay_gdtt * 5;
|
||||
transition->remaining_transition_time_ms = num_steps * mesh_get_transition_step_ms_from_gdtt(transition_time_gdtt);
|
||||
transition->phase_start_ms = 0;
|
||||
|
@ -66,9 +66,9 @@ typedef enum {
|
||||
|
||||
typedef enum {
|
||||
MODEL_STATE_UPDATE_REASON_SET = 0x00u,
|
||||
// MODEL_STATE_UPDATE_REASON_TRANSITION_START,
|
||||
MODEL_STATE_UPDATE_REASON_TRANSITION_START,
|
||||
// MODEL_STATE_UPDATE_REASON_TRANSITION_ACTIVE,
|
||||
// MODEL_STATE_UPDATE_REASON_TRANSITION_END,
|
||||
MODEL_STATE_UPDATE_REASON_TRANSITION_END,
|
||||
// MODEL_STATE_UPDATE_REASON_BOUND_STATE,
|
||||
MODEL_STATE_UPDATE_REASON_APPLICATION_CHANGE
|
||||
} model_state_update_reason_t;
|
||||
|
@ -50,7 +50,6 @@
|
||||
#include "btstack_memory.h"
|
||||
#include "btstack_debug.h"
|
||||
|
||||
static mesh_transition_t generic_server_on_off_value_transition;
|
||||
static void mesh_server_transition_step_bool(mesh_transition_bool_t * transition, transition_event_t event, uint32_t current_timestamp);
|
||||
|
||||
static void generic_server_send_message(uint16_t src, uint16_t dest, uint16_t netkey_index, uint16_t appkey_index, mesh_pdu_t *pdu){
|
||||
@ -133,19 +132,24 @@ static void generic_on_off_set_handler(mesh_model_t *generic_on_off_server_model
|
||||
return;
|
||||
}
|
||||
|
||||
generic_on_off_server_state->transition_data.target_value = on_off_value;
|
||||
|
||||
if (mesh_access_parser_available(&parser) == 2){
|
||||
// Generic Default Transition Time format - num_steps (higher 6 bits), step_resolution (lower 2 bits)
|
||||
uint8_t transition_time_gdtt = mesh_access_parser_get_u8(&parser);
|
||||
uint8_t delay_time_gdtt = mesh_access_parser_get_u8(&parser);
|
||||
|
||||
generic_server_on_off_value_transition.transition_callback = (void (*)(mesh_transition_t *, transition_event_t, uint32_t)) &mesh_server_transition_step_bool;
|
||||
mesh_access_transitions_add(&generic_server_on_off_value_transition, transition_time_gdtt, delay_time_gdtt);
|
||||
return;
|
||||
mesh_transition_t generic_server_on_off_value_transition = generic_on_off_server_state->transition_data.base_transition;
|
||||
|
||||
if (transition_time_gdtt != 0 || delay_time_gdtt != 0) {
|
||||
generic_server_on_off_value_transition.mesh_model = (mesh_model_t *) generic_on_off_server_model;
|
||||
generic_server_on_off_value_transition.transition_callback = (void (*)(mesh_transition_t *, transition_event_t, uint32_t)) &mesh_server_transition_step_bool;
|
||||
mesh_access_transitions_add(&generic_server_on_off_value_transition, transition_time_gdtt, delay_time_gdtt);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Instantanious update
|
||||
generic_on_off_server_state->transition_data.current_value = on_off_value;
|
||||
generic_on_off_server_state->transition_data.target_value = on_off_value;
|
||||
generic_on_off_server_state->transaction_identifier = tid;
|
||||
generic_on_off_server_state->transition_data.base_transition.remaining_transition_time_ms = 0;
|
||||
generic_on_off_server_state->transition_data.base_transition.remaining_delay_time_ms = 0;
|
||||
@ -199,15 +203,6 @@ uint8_t mesh_generic_on_off_server_get_value(mesh_model_t *generic_on_off_server
|
||||
return generic_on_off_server_state->transition_data.current_value;
|
||||
}
|
||||
|
||||
static void mesh_server_transition_bool_reset(mesh_transition_bool_t * transition){
|
||||
transition->base_transition.state = MESH_TRANSITION_STATE_IDLE;
|
||||
transition->base_transition.remaining_transition_time_ms = 0;
|
||||
transition->base_transition.remaining_delay_time_ms = 0;
|
||||
transition->base_transition.phase_start_ms = 0;
|
||||
transition->target_value = transition->current_value;
|
||||
mesh_access_transitions_remove(&generic_server_on_off_value_transition);
|
||||
}
|
||||
|
||||
static void mesh_server_transition_state_update(mesh_transition_bool_t * transition, uint32_t current_timestamp_ms){
|
||||
if (transition->base_transition.remaining_delay_time_ms != 0){
|
||||
transition->base_transition.state = MESH_TRANSITION_STATE_DELAYED;
|
||||
@ -216,20 +211,33 @@ static void mesh_server_transition_state_update(mesh_transition_bool_t * transit
|
||||
return;
|
||||
}
|
||||
|
||||
mesh_model_t * generic_on_off_server_model = transition->base_transition.mesh_model;
|
||||
if (transition->base_transition.remaining_transition_time_ms != 0){
|
||||
transition->base_transition.state = MESH_TRANSITION_STATE_ACTIVE;
|
||||
transition->base_transition.phase_start_ms = current_timestamp_ms;
|
||||
if (transition->target_value == 1){
|
||||
transition->current_value = 1;
|
||||
// TODO: emit event
|
||||
mesh_server_transition_bool_reset(transition);
|
||||
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),
|
||||
generic_on_off_server_model->model_identifier,
|
||||
MODEL_STATE_ID_GENERIC_ON_OFF,
|
||||
MODEL_STATE_UPDATE_REASON_TRANSITION_START,
|
||||
transition->current_value);
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
transition->current_value = transition->target_value;
|
||||
transition->base_transition.remaining_transition_time_ms = 0;
|
||||
// TODO: emit event
|
||||
mesh_server_transition_bool_reset(transition);
|
||||
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),
|
||||
generic_on_off_server_model->model_identifier,
|
||||
MODEL_STATE_ID_GENERIC_ON_OFF,
|
||||
MODEL_STATE_UPDATE_REASON_TRANSITION_END,
|
||||
transition->current_value);
|
||||
|
||||
mesh_access_transitions_remove((mesh_transition_t *)transition);
|
||||
}
|
||||
|
||||
static void mesh_server_transition_step_bool(mesh_transition_bool_t * transition, transition_event_t event, uint32_t current_timestamp){
|
||||
|
Loading…
x
Reference in New Issue
Block a user