Three stering modes implemented 82/189682/6
authorMichal Skorupinski <m.skorupinsk@samsung.com>
Wed, 19 Sep 2018 18:20:28 +0000 (20:20 +0200)
committerKrzysztof Wieclaw <k.wieclaw@samsung.com>
Thu, 4 Oct 2018 13:14:16 +0000 (15:14 +0200)
TODO:
 * Adjust parameters
 * Connect with view

Change-Id: Ie9f8bcaea170e9dfffd5412d9dfe2d785032f0b8
Signed-off-by: Michal Skorupinski <m.skorupinsk@samsung.com>
inc/controller/controller_racing.h
inc/gear-racing-controller.h
inc/model/model_device_to_connection.h [new file with mode: 0644]
inc/model/model_hw.h
inc/model/model_sensors.h
src/controller/controller_racing.c
src/model/model_device_to_connection.c [new file with mode: 0644]
src/model/model_hw.c
src/model/model_sensors.c
src/view/view_racing.c

index 6380f7e..404f0c3 100644 (file)
@@ -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_ */
index be5c317..826c6ec 100644 (file)
@@ -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 (file)
index 0000000..28c5515
--- /dev/null
@@ -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_ */
index fa2ab41..dfc9b0b 100644 (file)
@@ -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);
index 73a2c36..427d065 100644 (file)
@@ -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);
index 5779cf3..35eeeed 100644 (file)
@@ -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 (file)
index 0000000..cb8b357
--- /dev/null
@@ -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);
+}
+
index 0674ff1..5078fe5 100644 (file)
@@ -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 <efl_extension.h>
 
@@ -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)
index 2a79775..f890c6e 100644 (file)
@@ -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();
 }
index f2468af..8a52567 100644 (file)
@@ -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);