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_ */
#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__ */
--- /dev/null
+/*
+* 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_ */
#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);
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);
#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"
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);
}
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)
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);
--- /dev/null
+/*
+* 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);
+}
+
#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>
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;
}
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) {
}
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)
#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"
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);
}
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)
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};
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);
}
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)
{
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)
ASSERT_FUNCTION(ret != SENSOR_ERROR_NONE);
sensor_listener_start(s_info.listener_linear);
-#endif
model_sensors_set_initial_values();
}
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;
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;
}
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;
}
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);