diff --git a/test/mesh/mesh_generic_level_server.c b/test/mesh/mesh_generic_level_server.c index bb8f40d7f..27007bcdb 100644 --- a/test/mesh/mesh_generic_level_server.c +++ b/test/mesh/mesh_generic_level_server.c @@ -76,7 +76,11 @@ static mesh_transition_t * generic_level_server_get_base_transition(mesh_model_t static void mesh_server_transition_state_update_stepwise_value(mesh_transition_int16_t * transition){ mesh_model_t * generic_level_server_model = transition->base_transition.mesh_model; - transition->current_value = add_and_clip_int16(transition->current_value, transition->stepwise_value_increment); + if (transition->stepwise_value_increment){ + transition->current_value = add_and_clip_int16(transition->current_value, transition->stepwise_value_increment); + } else if (transition->delta_from_initial_value){ + transition->current_value = add_and_clip_int16(transition->initial_value, transition->delta_from_initial_value); + } // emit event mesh_access_emit_state_update_int16(generic_level_server_model->transition_events_packet_handler, mesh_access_get_element_index(generic_level_server_model), @@ -162,12 +166,13 @@ static void mesh_server_transition_setup_transition_or_instantaneous_update_int1 mesh_access_transitions_setup(&transition, mesh_model, transition_time_gdtt, delay_time_gdtt, &mesh_server_transition_step); mesh_access_transitions_add(&transition); } else { + // instantaneous update generic_level_server_state->transition_data.current_value = generic_level_server_state->transition_data.target_value; - transition.phase_start_ms = 0; - transition.remaining_delay_time_ms = 0; - transition.remaining_transition_time_ms = 0; - transition.state = MESH_TRANSITION_STATE_IDLE; - + generic_level_server_state->transition_data.stepwise_value_increment = 0; + generic_level_server_state->transition_data.delta_from_initial_value = 0; + generic_level_server_state->transition_data.transition_speed = 0; + mesh_access_transitions_setup(&transition, mesh_model, 0, 0, NULL); + mesh_access_emit_state_update_int16(mesh_model->transition_events_packet_handler, mesh_access_get_element_index(mesh_model), mesh_model->model_identifier, @@ -210,7 +215,6 @@ static void mesh_generic_level_status_message(mesh_model_t *generic_level_server // setup message mesh_transport_pdu_t * transport_pdu = NULL; - if (state->transition_data.base_transition.remaining_transition_time_ms != 0) { transport_pdu = mesh_access_setup_segmented_message(&mesh_generic_level_status_transition, state->transition_data.current_value, state->transition_data.target_value, state->transition_data.base_transition.remaining_transition_time_ms); @@ -252,9 +256,11 @@ static void generic_level_handle_set_target_level_message(mesh_model_t *mesh_mod default: mesh_access_transitions_setup_transaction(base_transition, tid, mesh_pdu_src(pdu), mesh_pdu_dst(pdu)); + generic_level_server_state->transition_data.initial_value = generic_level_server_state->transition_data.current_value; generic_level_server_state->transition_data.target_value = level_value; generic_level_server_state->transition_data.stepwise_value_increment = 0; - + generic_level_server_state->transition_data.delta_from_initial_value = 0; + if (mesh_access_parser_available(&parser) == 2){ // Generic Default Transition Time format - num_steps (higher 6 bits), step_resolution (lower 2 bits) transition_time_gdtt = mesh_access_parser_get_u8(&parser); @@ -300,9 +306,11 @@ static void generic_level_handle_set_move_message(mesh_model_t *mesh_model, mesh default: mesh_access_transitions_setup_transaction(base_transition, tid, mesh_pdu_src(pdu), mesh_pdu_dst(pdu)); + generic_level_server_state->transition_data.initial_value = generic_level_server_state->transition_data.current_value; generic_level_server_state->transition_data.target_value = add_and_clip_int16(generic_level_server_state->transition_data.current_value, increment_value); generic_level_server_state->transition_data.stepwise_value_increment = increment_value; - + generic_level_server_state->transition_data.delta_from_initial_value = 0; + if (mesh_access_parser_available(&parser) == 2){ // Generic Default Transition Time format - num_steps (higher 6 bits), step_resolution (lower 2 bits) transition_time_gdtt = mesh_access_parser_get_u8(&parser); @@ -345,6 +353,8 @@ static void generic_level_handle_set_delta_message(mesh_model_t *mesh_model, mes case MESH_TRANSACTION_STATUS_DIFFERENT_DST_OR_SRC: // abort transaction mesh_access_transitions_abort_transaction(base_transition); + transition->current_value = transition->initial_value; + mesh_server_transition_setup_transition_or_instantaneous_update_int16(mesh_model, 0, 0, MODEL_STATE_UPDATE_REASON_TRANSITION_ABORT); break; case MESH_TRANSACTION_STATUS_RETRANSMISSION: // ignore @@ -352,8 +362,10 @@ static void generic_level_handle_set_delta_message(mesh_model_t *mesh_model, mes case MESH_TRANSACTION_STATUS_NEW: mesh_access_transitions_setup_transaction(base_transition, tid, mesh_pdu_src(pdu), mesh_pdu_dst(pdu)); + generic_level_server_state->transition_data.initial_value = generic_level_server_state->transition_data.current_value; generic_level_server_state->transition_data.target_value = add_and_clip_int16(generic_level_server_state->transition_data.current_value, delta_value); - generic_level_server_state->transition_data.stepwise_value_increment = delta_value; + generic_level_server_state->transition_data.delta_from_initial_value = delta_value; + generic_level_server_state->transition_data.stepwise_value_increment = 0; if (mesh_access_parser_available(&parser) == 2){ // Generic Default Transition Time format - num_steps (higher 6 bits), step_resolution (lower 2 bits) diff --git a/test/mesh/mesh_generic_level_server.h b/test/mesh/mesh_generic_level_server.h index c8878c8a0..6efc5b288 100644 --- a/test/mesh/mesh_generic_level_server.h +++ b/test/mesh/mesh_generic_level_server.h @@ -59,8 +59,8 @@ extern "C" typedef struct { mesh_transition_t base_transition; - int16_t initial_value; int16_t current_value; + int16_t initial_value; int16_t target_value; int16_t stepwise_value_increment; int16_t delta_from_initial_value; diff --git a/test/mesh/mesh_generic_server.c b/test/mesh/mesh_generic_server.c index 78db1b286..a51c4ec82 100644 --- a/test/mesh/mesh_generic_server.c +++ b/test/mesh/mesh_generic_server.c @@ -139,12 +139,12 @@ static void mesh_server_transition_step_bool(mesh_transition_t * base_transition } } -static void mesh_server_transition_setup_transition_or_instantaneous_update(mesh_model_t *generic_on_off_server_model, uint8_t transition_time_gdtt, uint8_t delay_time_gdtt, model_state_update_reason_t reason){ - mesh_generic_on_off_state_t * generic_on_off_server_state = (mesh_generic_on_off_state_t *)generic_on_off_server_model->model_data; +static void mesh_server_transition_setup_transition_or_instantaneous_update(mesh_model_t *mesh_state, uint8_t transition_time_gdtt, uint8_t delay_time_gdtt, model_state_update_reason_t reason){ + mesh_generic_on_off_state_t * generic_on_off_server_state = (mesh_generic_on_off_state_t *)mesh_state->model_data; mesh_transition_t transition = generic_on_off_server_state->transition_data.base_transition; if (transition_time_gdtt != 0 || delay_time_gdtt != 0) { - mesh_access_transitions_setup(&transition, (mesh_model_t *) generic_on_off_server_model, + mesh_access_transitions_setup(&transition, (mesh_model_t *) mesh_state, transition_time_gdtt, delay_time_gdtt, &mesh_server_transition_step_bool); mesh_access_transitions_add(&transition); } else { @@ -154,9 +154,9 @@ static void mesh_server_transition_setup_transition_or_instantaneous_update(mesh transition.remaining_transition_time_ms = 0; transition.state = MESH_TRANSITION_STATE_IDLE; - 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, + mesh_access_emit_state_update_bool(mesh_state->transition_events_packet_handler, + mesh_access_get_element_index(mesh_state), + mesh_state->model_identifier, MODEL_STATE_ID_GENERIC_ON_OFF, reason, generic_on_off_server_state->transition_data.current_value);