#include "model/model_hw.h"
#include "model/model_device_to_connection.h"
+#include "model/model_sensors.h"
#include "gear-racing-controller.h"
+#define GRAVITY_DEADZONE 0.2f
+#define MAX_GRAVITY 0.7f
+
+#define DIRECTION_DEADZONE 1.0f
+#define MAX_DIRECTION 8.0f
+
+#define CAM_ELEVATION_DEADZONE 3.0f
+#define MAX_CAM_ELEVATION 5.0f
+
void config_set_sensor_steering_bezel_velocity()
{
model_device_to_connection_set_control_roles(STERING_MODE_DIRETION, STERING_MODE_CAM_ELEVATION, STERING_MODE_THROTTLE, STERING_MODE_CAM_AZIMUTH);
model_hw_set_bezel_params(0.03f, 0.001f, true, 15, true);
+ model_hw_set_bezel_max_min(-1.0f, 1.0f);
+
+ model_sensors_set_acceleration_sensor_params(MAX_DIRECTION, 1.0f, DIRECTION_DEADZONE, 1.0f);
+ model_sensors_set_gravity_sensor_params(MAX_GRAVITY, 1.0f, 0.5f, 1.0f); //camera
}
void config_set_bezel_steering_sensor_velocity()
{
model_device_to_connection_set_control_roles(STERING_MODE_CAM_AZIMUTH, STERING_MODE_THROTTLE, STERING_MODE_DIRETION, STERING_MODE_CAM_ELEVATION);
model_hw_set_bezel_params(-0.1f, 0.001f, false, 0, false);
+ model_hw_set_bezel_max_min(-1.0f, 1.0f);
+
+ model_sensors_set_acceleration_sensor_params(MAX_DIRECTION, 1.0f, 4.0, -1.0f); //camera
+ model_sensors_set_gravity_sensor_params(MAX_GRAVITY, 1.0f, GRAVITY_DEADZONE, 1.0f);
}
void config_set_sensor_stering_sensor_velocity()
{
model_device_to_connection_set_control_roles(STERING_MODE_DIRETION, STERING_MODE_THROTTLE, STERING_MODE_CAM_ELEVATION, STERING_MODE_CAM_AZIMUTH);
model_hw_set_bezel_params(0.03f, 0.001f, false, 0, false);
+ model_hw_set_bezel_max_min(-1.0f, 0.0f);
+
+ model_sensors_set_acceleration_sensor_params(MAX_DIRECTION, 1.0f, DIRECTION_DEADZONE, 1.0f);
+ model_sensors_set_gravity_sensor_params(MAX_GRAVITY, 1.0f, GRAVITY_DEADZONE, 1.0f);
}
#define ACCELEROMETER_LISTENER_INTERVAL 10
#define LINEAR_LISTENER_INTERVAL 10
-#define GRAVITY_DEADZONE 0.2f
-#define MAX_GRAVITY 0.7f
-#define MAX_GRAVITY_WITH_DEADZONE (MAX_GRAVITY - GRAVITY_DEADZONE)
-
-#define DIRECTION_DEADZONE 1.0f
-#define MAX_DIRECTION 8.0f
-#define MAX_DIRECTION_WITH_DEADZONE (MAX_DIRECTION - DIRECTION_DEADZONE)
-
-#define DEADZONE 1.0f
-#define MAX_ROTATION 8.0f
-#define MAX_ROTATION_WITH_DEADZONE (MAX_ROTATION - DEADZONE)
-
-#define CAM_ELEVATION_DEADZONE 3.0f
-#define MAX_CAM_ELEVATION 5.0f
-#define MAX_CAM_ELEVATION_WITH_DEADZONE (MAX_CAM_ELEVATION - CAM_ELEVATION_DEADZONE)
-
typedef struct _s_data_history {
int current_index;
float sum;
float array[VALUE_LIST_SIZE];
} s_data_history;
+typedef struct _s_axis_params {
+ float deadzone;
+ float input_range;
+ float output_range;
+ float multiplier;
+} s_axis_params;
+
typedef struct _s_model_sensors {
t_model_sensors_update_cb sensors_update_cb;
float last_linear_event_values[3];
float velocity_reference_vector[3];
s_model_sensors_cb_data last_model_data;
- s_data_history velocity;
- s_data_history direction;
- s_data_history cam_elevation;
+
+ s_data_history acceleration_sensor;
+ s_data_history gravity_sensor;
+
+ s_axis_params acceleration_sensor_params;
+ s_axis_params gravity_sensor_params;
} s_model_sensors;
static s_model_sensors s_info = {
vector_diff(event->values, s_info.initial_sensor_accelerometer_data, &vector[0], 3);
- float direction = vector[0];
- direction = _get_average_parameter_from_history(direction, &s_info.direction);
+ float acceleration = vector[0];
+ acceleration = _get_average_parameter_from_history(acceleration, &s_info.acceleration_sensor);
- direction = _get_position_in_deadzone(direction, DIRECTION_DEADZONE);
+ acceleration = _get_position_in_deadzone(acceleration, s_info.acceleration_sensor_params.deadzone);
- 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_info.last_model_data.axis_x = math_helper_range_map(acceleration,
+ -(s_info.acceleration_sensor_params.input_range - s_info.acceleration_sensor_params.deadzone),
+ (s_info.acceleration_sensor_params.input_range - s_info.acceleration_sensor_params.deadzone),
+ -s_info.acceleration_sensor_params.output_range, s_info.acceleration_sensor_params.output_range);
+ s_info.last_model_data.axis_x *= s_info.acceleration_sensor_params.multiplier;
s_model_sensors_cb_data model_data = s_info.last_model_data;
model_device_to_connection_axis_x(model_data.axis_x);
- _D("MODEL VALUES: dir:% .4f ranged:% .4f", direction, model_data.axis_x);
+ _D("MODEL VALUES: acceleration:% .4f ranged:% .4f", acceleration, model_data.axis_x);
if (s_info.sensors_update_cb) {
s_info.sensors_update_cb(&model_data);
}
vector_normalize(&vector[0], &vector[0], 3);
- 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);
+ float gravity = vector_dot_product(vector, s_info.velocity_reference_vector, 3);
+ gravity = _get_average_parameter_from_history(gravity, &s_info.gravity_sensor);
+ gravity = _get_position_in_deadzone(gravity, s_info.gravity_sensor_params.deadzone);
+ s_info.last_model_data.axis_y = math_helper_range_map(gravity,
+ -(s_info.gravity_sensor_params.input_range - s_info.gravity_sensor_params.deadzone),
+ (s_info.gravity_sensor_params.input_range - s_info.gravity_sensor_params.deadzone),
+ -s_info.gravity_sensor_params.output_range, s_info.gravity_sensor_params.output_range);
+
+ s_info.last_model_data.axis_x *= s_info.gravity_sensor_params.multiplier;
s_model_sensors_cb_data model_data = s_info.last_model_data;
model_device_to_connection_axis_y(model_data.axis_y);
- _D("MODEL VALUES: axis_y:% .4f ranged:% .4f", axis_y, model_data.axis_y);
+ _D("MODEL VALUES: axis_y:% .4f ranged:% .4f", gravity, model_data.axis_y);
if (s_info.sensors_update_cb) {
s_info.sensors_update_cb(&model_data);
}
vector_matrix_multiply(&rotation_matrix[0][0], &reference_vector[0], &s_info.velocity_reference_vector[0], 3);
_D("Initial sensor_gravity data: {%f, %f, %f}", s_info.initial_sensor_gravity_data[0], s_info.initial_sensor_gravity_data[1],
- s_info.initial_sensor_gravity_data[2]);
+ 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]);
}
model_sensors_set_initial_values();
}
+
+static void _set_axis_params(s_axis_params *axis, float input_range, float output_range, float deadzone, float multiplier)
+{
+ axis->input_range = input_range;
+ axis->output_range = output_range;
+ axis->deadzone = deadzone;
+ axis->multiplier = multiplier;
+}
+
+void model_sensors_set_acceleration_sensor_params(float input_range, float output_range, float deadzone, float multiplier)
+{
+ _set_axis_params(&s_info.acceleration_sensor_params, input_range, output_range, deadzone, multiplier);
+}
+
+void model_sensors_set_gravity_sensor_params(float input_range, float output_range, float deadzone, float multiplier)
+{
+ _set_axis_params(&s_info.gravity_sensor_params, input_range, output_range, deadzone, multiplier);
+}
+
void model_sensors_subscribe_event(t_model_sensors_update_cb model_update_cb)
{
s_info.sensors_update_cb = model_update_cb;