From: Michal Skorupinski Date: Wed, 19 Sep 2018 18:20:28 +0000 (+0200) Subject: Three stering modes implemented X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e7ef745002f73f7e3f79ccf11c6d97e996320830;p=apps%2Fnative%2Fgear-racing-controller.git Three stering modes implemented TODO: * Adjust parameters * Connect with view Change-Id: Ie9f8bcaea170e9dfffd5412d9dfe2d785032f0b8 Signed-off-by: Michal Skorupinski --- diff --git a/inc/controller/controller_racing.h b/inc/controller/controller_racing.h index 6380f7e..404f0c3 100644 --- a/inc/controller/controller_racing.h +++ b/inc/controller/controller_racing.h @@ -31,6 +31,6 @@ void controller_racing_destroy(void); void controller_racing_back(void); void controller_racing_next(); void controller_racing_set_stop(bool stop); -void controller_racing_set_cam_azimuth(float cam_azimuth); +void controller_racing_set_button_value(float button_value); #endif /* CONTROLLER_CONTROLLER_RACING_H_ */ diff --git a/inc/gear-racing-controller.h b/inc/gear-racing-controller.h index be5c317..826c6ec 100644 --- a/inc/gear-racing-controller.h +++ b/inc/gear-racing-controller.h @@ -31,7 +31,5 @@ #define EDJ_FILE "edje/gear-racing-controller.edj" #define GRP_MAIN "main" -//#define STERING_MODE_SENSOR_BEZEL //direction, velocity -#define STERING_MODE_SENSOR_SENSOR #endif /* __gear-racing-controller_H__ */ diff --git a/inc/model/model_device_to_connection.h b/inc/model/model_device_to_connection.h new file mode 100644 index 0000000..28c5515 --- /dev/null +++ b/inc/model/model_device_to_connection.h @@ -0,0 +1,34 @@ +/* +* Copyright (c) 2018 Samsung Electronics Co., Ltd. +* +* Licensed under the Flora License, Version 1.1 (the License); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://floralicense.org/license/ +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an AS IS BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +#ifndef MODEL_DEVICE_TO_CONNECTION_H_ +#define MODEL_DEVICE_TO_CONNECTION_H_ + +typedef enum _e_device { + STERING_MODE_DIRETION, + STERING_MODE_THROTTLE, + STERING_MODE_CAM_AZIMUTH, + STERING_MODE_CAM_ELEVATION, + STERING_MODE_NONE, +} e_device; + +void model_device_to_connection_axis_x(float value); +void model_device_to_connection_axis_y(float value); +void model_device_to_connection_bezel(float value); +void model_device_to_connection_buttons(float value); + +#endif /* MODEL_DEVICE_TO_CONNECTION_H_ */ diff --git a/inc/model/model_hw.h b/inc/model/model_hw.h index fa2ab41..dfc9b0b 100644 --- a/inc/model/model_hw.h +++ b/inc/model/model_hw.h @@ -22,7 +22,7 @@ #include "model/model_base.h" typedef struct _s_model_hw_cb_data { - float throttle; + float bezel_position; } s_model_hw_cb_data; typedef void (*t_model_hw_update_cb)(s_model_hw_cb_data *data); diff --git a/inc/model/model_sensors.h b/inc/model/model_sensors.h index 73a2c36..427d065 100644 --- a/inc/model/model_sensors.h +++ b/inc/model/model_sensors.h @@ -22,9 +22,8 @@ typedef struct _s_model_sensors_cb_data { e_model_type type; - float velocity; - float cam_elevation; - float direction; + float axis_x; + float axis_y; } s_model_sensors_cb_data; typedef void (*t_model_sensors_update_cb)(s_model_sensors_cb_data *data); diff --git a/src/controller/controller_racing.c b/src/controller/controller_racing.c index 5779cf3..35eeeed 100644 --- a/src/controller/controller_racing.c +++ b/src/controller/controller_racing.c @@ -18,6 +18,7 @@ #include "model/model_car_connection.h" #include "model/model_sensors.h" #include "model/model_hw.h" +#include "model/model_device_to_connection.h" #include "controller/controller_racing.h" #include "view_manager/view_manager.h" @@ -43,18 +44,14 @@ static void _model_connected_cb(s_model_car_connection_cb_data *model_data) static void _sensors_cb(s_model_sensors_cb_data *model_data) { - s_info.controller_data.direction = model_data->direction; - -#ifdef STERING_MODE_SENSOR_SENSOR - s_info.controller_data.throttle = model_data->velocity; -#endif - s_info.controller_data.cam_elevation = model_data->cam_elevation; + s_info.controller_data.direction = model_data->axis_x; + s_info.controller_data.throttle = model_data->axis_y; s_info.base_controller.view_update_cb(&s_info.controller_data); } static void _hw_cb(s_model_hw_cb_data *model_data) { - s_info.controller_data.throttle = model_data->throttle; + s_info.controller_data.throttle = model_data->bezel_position; s_info.base_controller.view_update_cb(&s_info.controller_data); } @@ -64,9 +61,9 @@ void controller_racing_set_stop(bool stop) model_hw_deactivate_rotatry(stop); } -void controller_racing_set_cam_azimuth(float cam_azimuth) +void controller_racing_set_button_value(float button_value) { - model_car_connection_send_cam_azimuth(cam_azimuth); + model_device_to_connection_buttons(button_value); } void controller_racing_init(t_view_update_cb view_update_cb) @@ -75,10 +72,7 @@ void controller_racing_init(t_view_update_cb view_update_cb) model_car_connection_subscribe_event(_model_connected_cb); model_sensors_subscribe_event(_sensors_cb); - -#ifdef STERING_MODE_SENSOR_BEZEL model_hw_subscribe_event(_hw_cb); -#endif model_sensors_set_initial_values(); model_car_connection_ready_to_drive(true); diff --git a/src/model/model_device_to_connection.c b/src/model/model_device_to_connection.c new file mode 100644 index 0000000..cb8b357 --- /dev/null +++ b/src/model/model_device_to_connection.c @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2018 Samsung Electronics Co., Ltd. +* +* Licensed under the Flora License, Version 1.1 (the License); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://floralicense.org/license/ +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an AS IS BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + + +#include "gear-racing-controller.h" +#include "model/model_device_to_connection.h" +#include "model/model_car_connection.h" + +typedef struct _s_model_device_to_connection { + e_device axis_x; + e_device axis_y; + e_device bezel; + e_device buttons; + +} s_model_device_to_connection; + +static s_model_device_to_connection s_info = { + .axis_x = STERING_MODE_CAM_AZIMUTH, + .axis_y = STERING_MODE_THROTTLE, + .bezel = STERING_MODE_DIRETION, + .buttons = STERING_MODE_CAM_ELEVATION +}; + +inline static void _send_data(e_device device, float value) +{ + switch (device) { + case STERING_MODE_DIRETION: + model_car_connection_send_direction(value); + break; + case STERING_MODE_THROTTLE: + model_car_connection_send_throttle(value); + break; + case STERING_MODE_CAM_AZIMUTH: + model_car_connection_send_cam_azimuth(value); + break; + case STERING_MODE_CAM_ELEVATION: + model_car_connection_send_cam_elevation(value); + break; + default: + break; + } +} + +void model_device_to_connection_axis_x(float value) +{ + _send_data(s_info.axis_x, value); +} + +void model_device_to_connection_axis_y(float value) +{ + _send_data(s_info.axis_y, value); +} + +void model_device_to_connection_bezel(float value) +{ + _send_data(s_info.bezel, -value); +} + +void model_device_to_connection_buttons(float value) +{ + _send_data(s_info.buttons, value); +} + diff --git a/src/model/model_hw.c b/src/model/model_hw.c index 0674ff1..5078fe5 100644 --- a/src/model/model_hw.c +++ b/src/model/model_hw.c @@ -17,6 +17,7 @@ #include "gear-racing-controller.h" #include "model/model_hw.h" #include "model/model_car_connection.h" +#include "model/model_device_to_connection.h" #include @@ -37,19 +38,18 @@ typedef enum _e_movement_direction { typedef struct _s_model_hw { t_model_hw_update_cb hw_update_cb; - float throttle; + float bezel_position; bool rotary_deactivated; } s_model_hw; static s_model_hw s_info = { 0, }; -#ifdef STERING_MODE_SENSOR_BEZEL #ifdef USE_DIRECTION_BLOCKER static inline void _update_direction_blocker(e_movement_direction *last_movement_dir, int step, int direction, e_movement_direction new_dir) { if (*last_movement_dir * direction > DIR_STOP) { *last_movement_dir += step; - s_info.throttle = 0; + s_info.bezel_position = 0; } else { *last_movement_dir = new_dir; } @@ -61,7 +61,7 @@ static Eina_Bool _rotary_cb(void *data, Eext_Rotary_Event_Info *info) static s_model_hw_cb_data cb_data = { 0, }; #ifndef USE_DIRECTION_BLOCKER - float prev = s_info.throttle; + float prev = s_info.bezel_position; #endif if (s_info.rotary_deactivated) { @@ -69,62 +69,63 @@ static Eina_Bool _rotary_cb(void *data, Eext_Rotary_Event_Info *info) } if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) { - s_info.throttle += THROTTLE_STEP; + s_info.bezel_position += THROTTLE_STEP; } else { - s_info.throttle -= THROTTLE_STEP; + s_info.bezel_position -= THROTTLE_STEP; + } + + if (s_info.bezel_position > 1) { + s_info.bezel_position = 1; + } else if (s_info.bezel_position < -1) { + s_info.bezel_position = -1; } #ifdef USE_DIRECTION_BLOCKER static e_movement_direction last_movement_dir = DIR_STOP; - if (fabsf(s_info.throttle) < THROTTLE_DEADZONE) { - s_info.throttle = 0; - } if (s_info.throttle < 0.0f) { + if (fabsf(s_info.bezel_position) < THROTTLE_DEADZONE) { + s_info.bezel_position = 0; + } if (s_info.bezel_position < 0.0f) { _update_direction_blocker(&last_movement_dir, -1, 1, DIR_BACKWARD); - } else if(s_info.throttle > 0.0f) { + } else if(s_info.bezel_position > 0.0f) { _update_direction_blocker(&last_movement_dir, 1, -1, DIR_FORWARD); } #else - if (fabsf(s_info.throttle) < THROTTLE_DEADZONE) { - s_info.throttle = 0; - } else if (s_info.throttle * prev < 0.0f) { - s_info.throttle = 0; + if (fabsf(s_info.bezel_position) < THROTTLE_DEADZONE) { + s_info.bezel_position = 0; + } else if (s_info.bezel_position * prev < 0.0f) { + s_info.bezel_position = 0; } #endif - cb_data.throttle = s_info.throttle; + cb_data.bezel_position = s_info.bezel_position; s_info.hw_update_cb(&cb_data); - _D("THROTTLE: %f", cb_data.throttle); - model_car_connection_send_throttle(s_info.throttle); + _D("THROTTLE: %f", cb_data.bezel_position); + model_device_to_connection_bezel(s_info.bezel_position); return true; } -#endif void model_hw_deactivate_rotatry(bool deactivate) { -#ifdef STERING_MODE_SENSOR_BEZEL static s_model_hw_cb_data cb_data = { 0, }; s_info.rotary_deactivated = deactivate; - s_info.throttle = 0; + s_info.bezel_position = 0; if (s_info.hw_update_cb) { s_info.hw_update_cb(&cb_data); } -#endif } void model_hw_init(void) { -#ifdef STERING_MODE_SENSOR_BEZEL Eina_Bool ret = eext_rotary_event_handler_add(_rotary_cb, NULL); ASSERT_FUNCTION(!ret); -#endif } void model_hw_subscribe_event(t_model_hw_update_cb model_update_cb) diff --git a/src/model/model_sensors.c b/src/model/model_sensors.c index 2a79775..f890c6e 100644 --- a/src/model/model_sensors.c +++ b/src/model/model_sensors.c @@ -18,6 +18,7 @@ #include "gear-racing-controller.h" #include "model/model_sensors.h" #include "model/model_car_connection.h" +#include "model/model_device_to_connection.h" #include "log.h" #include "math_helper.h" @@ -111,29 +112,17 @@ static void _sensor_accelerometer_event_cb(sensor_h sensor_accelerometer, sensor vector_diff(event->values, s_info.initial_sensor_accelerometer_data, &vector[0], 3); float direction = vector[0]; - float cam_elevation = vector[1]; direction = _get_average_parameter_from_history(direction, &s_info.direction); - cam_elevation = _get_average_parameter_from_history(cam_elevation, &s_info.cam_elevation); direction = _get_position_in_deadzone(direction, DIRECTION_DEADZONE); - cam_elevation = _get_position_in_deadzone(cam_elevation, CAM_ELEVATION_DEADZONE); - s_info.last_model_data.direction = math_helper_range_map(direction, -MAX_DIRECTION_WITH_DEADZONE, MAX_DIRECTION_WITH_DEADZONE, -1.0f, 1.0f); - s_info.last_model_data.cam_elevation += math_helper_range_map(cam_elevation, -MAX_CAM_ELEVATION_WITH_DEADZONE, MAX_CAM_ELEVATION_WITH_DEADZONE, -0.03f, 0.03f); + s_info.last_model_data.axis_x = math_helper_range_map(direction, -MAX_DIRECTION_WITH_DEADZONE, MAX_DIRECTION_WITH_DEADZONE, -1.0f, 1.0f); s_model_sensors_cb_data model_data = s_info.last_model_data; - if (model_data.cam_elevation < 0) { - model_data.cam_elevation = 0; - } else if (model_data.cam_elevation > 1) { - model_data.cam_elevation = 1; - } - - model_car_connection_send_direction(model_data.direction); - model_car_connection_send_cam_elevation(-model_data.cam_elevation); + model_device_to_connection_axis_x(model_data.axis_x); - _D("MODEL VALUES: dir:% .4f ranged:% .4f", direction, model_data.direction); - _D("MODEL VALUES: cam_elevation:% .4f ranged:% .4f", cam_elevation, model_data.cam_elevation); + _D("MODEL VALUES: dir:% .4f ranged:% .4f", direction, model_data.axis_x); if (s_info.sensors_update_cb) { s_info.sensors_update_cb(&model_data); } @@ -142,15 +131,11 @@ static void _sensor_accelerometer_event_cb(sensor_h sensor_accelerometer, sensor void model_sensors_set_initial_values(void) { model_sensors_sensor_accelerometer_set_initial_values(); - -#ifdef STERING_MODE_SENSOR_SENSOR model_sensors_sensor_gravity_set_initial_values(); -#endif s_info.last_model_data.type = MODEL_TYPE_UPDATE; - s_info.last_model_data.direction = 0.0f; - s_info.last_model_data.velocity = 0.0f; - s_info.last_model_data.cam_elevation = 0.0f; + s_info.last_model_data.axis_x = 0.0f; + s_info.last_model_data.axis_y = 0.0f; } void model_sensors_sensor_accelerometer_set_initial_values(void) @@ -166,8 +151,6 @@ void model_sensors_sensor_accelerometer_set_initial_values(void) s_info.initial_sensor_accelerometer_data[2]); } -#ifdef STERING_MODE_SENSOR_SENSOR - static void _sensor_gravity_event_cb(sensor_h sensor_gravity, sensor_event_s *event, void *data) { float vector[3] = { 0, 0, 0}; @@ -177,15 +160,15 @@ static void _sensor_gravity_event_cb(sensor_h sensor_gravity, sensor_event_s *ev vector_normalize(&vector[0], &vector[0], 3); - float velocity = vector_dot_product(vector, s_info.velocity_reference_vector, 3); - velocity = _get_average_parameter_from_history(velocity, &s_info.velocity); - velocity = _get_position_in_deadzone(velocity, GRAVITY_DEADZONE); - s_info.last_model_data.velocity = math_helper_range_map(velocity, -MAX_GRAVITY_WITH_DEADZONE, MAX_GRAVITY_WITH_DEADZONE, -1.0f, 1.0f); + float axis_y = vector_dot_product(vector, s_info.velocity_reference_vector, 3); + axis_y = _get_average_parameter_from_history(axis_y, &s_info.velocity); + axis_y = _get_position_in_deadzone(axis_y, GRAVITY_DEADZONE); + s_info.last_model_data.axis_y = math_helper_range_map(axis_y, -MAX_GRAVITY_WITH_DEADZONE, MAX_GRAVITY_WITH_DEADZONE, -1.0f, 1.0f); s_model_sensors_cb_data model_data = s_info.last_model_data; - model_car_connection_send_throttle(model_data.velocity); - _D("MODEL VALUES: velocity:% .4f ranged:% .4f", velocity, model_data.velocity); + model_device_to_connection_axis_y(model_data.axis_y); + _D("MODEL VALUES: axis_y:% .4f ranged:% .4f", axis_y, model_data.axis_y); if (s_info.sensors_update_cb) { s_info.sensors_update_cb(&model_data); } @@ -223,7 +206,6 @@ void model_sensors_sensor_gravity_set_initial_values(void) s_info.initial_sensor_gravity_data[2]); _D("Initial velovity refernce vector: {%f, %f, %f}", s_info.velocity_reference_vector[0], s_info.velocity_reference_vector[1], s_info.velocity_reference_vector[2]); } -#endif void model_sensors_init(void) { @@ -244,8 +226,6 @@ void model_sensors_init(void) sensor_listener_start(s_info.listener_accelerometer); -#ifdef STERING_MODE_SENSOR_SENSOR - ret = sensor_is_supported(SENSOR_GRAVITY, &supported); ASSERT_FUNCTION(ret != SENSOR_ERROR_NONE); ASSERT(!supported, "Sensor %d is not supported", SENSOR_GRAVITY) @@ -275,7 +255,6 @@ void model_sensors_init(void) ASSERT_FUNCTION(ret != SENSOR_ERROR_NONE); sensor_listener_start(s_info.listener_linear); -#endif model_sensors_set_initial_values(); } diff --git a/src/view/view_racing.c b/src/view/view_racing.c index f2468af..8a52567 100644 --- a/src/view/view_racing.c +++ b/src/view/view_racing.c @@ -47,8 +47,8 @@ typedef struct _s_view_racing { bool stop_longpress; - Ecore_Animator *cam_animator; - bool cam_buttons_pressed[2]; + Ecore_Animator *button_value_animator; + bool buttons_pressed[2]; float cam_azimuth; } s_view_racing; @@ -154,13 +154,13 @@ static void _stop_logpress_up(void *data, Evas_Object *obj, const char *emission ASSERT_FUNCTION_END; } -static Eina_Bool _camera_azimuth_animator_cb(void *data) +static Eina_Bool _button_value_animator_cb(void *data) { float prev = s_info.cam_azimuth; - if (s_info.cam_buttons_pressed[0] && !s_info.cam_buttons_pressed[1]) { + if (s_info.buttons_pressed[0] && !s_info.buttons_pressed[1]) { s_info.cam_azimuth -= CAM_AZIMUTH_STEP; - } else if (!s_info.cam_buttons_pressed[0] && s_info.cam_buttons_pressed[1]) { + } else if (!s_info.buttons_pressed[0] && s_info.buttons_pressed[1]) { s_info.cam_azimuth += CAM_AZIMUTH_STEP; } @@ -174,14 +174,12 @@ static Eina_Bool _camera_azimuth_animator_cb(void *data) s_info.cam_azimuth = 1; } - controller_racing_set_cam_azimuth(s_info.cam_azimuth); + controller_racing_set_button_value(s_info.cam_azimuth); float angle = math_helper_range_map(s_info.cam_azimuth, -1, 1, -90.0f, 90.0f); view_base_set_angle(s_info.camera_azimuth_indicator, angle, 180.0, 180.0); _D("[CAM] AZIMUTH: % f", s_info.cam_azimuth); - - return ECORE_CALLBACK_RENEW; } @@ -191,26 +189,26 @@ void _camera_button_cb(void *data, Evas_Object *obj, const char *emission, const switch (camera_button) { case CAMERA_BUTTON_RIGHT_UP: - s_info.cam_buttons_pressed[1] = false; + s_info.buttons_pressed[1] = false; break; case CAMERA_BUTTON_RIGHT_DOWN: - s_info.cam_buttons_pressed[1] = true; + s_info.buttons_pressed[1] = true; break; case CAMERA_BUTTON_LEFT_UP: - s_info.cam_buttons_pressed[0] = false; + s_info.buttons_pressed[0] = false; break; case CAMERA_BUTTON_LEFT_DOWN: - s_info.cam_buttons_pressed[0] = true; + s_info.buttons_pressed[0] = true; break; default: break; } - if ((s_info.cam_buttons_pressed[0] || s_info.cam_buttons_pressed[1]) && !s_info.cam_animator) { - s_info.cam_animator = ecore_animator_add(_camera_azimuth_animator_cb, NULL); - } else if (s_info.cam_animator) { - ecore_animator_del(s_info.cam_animator); - s_info.cam_animator= NULL; + if ((s_info.buttons_pressed[0] || s_info.buttons_pressed[1]) && !s_info.button_value_animator) { + s_info.button_value_animator = ecore_animator_add(_button_value_animator_cb, NULL); + } else if (s_info.button_value_animator) { + ecore_animator_del(s_info.button_value_animator); + s_info.button_value_animator= NULL; } _D("Camera button action: %d", camera_button);