From 7c2dedba67ab69e4ea1276a13e5972a284d4c9f8 Mon Sep 17 00:00:00 2001 From: Michal Skorupinski Date: Tue, 23 Oct 2018 18:10:24 +0200 Subject: [PATCH] Car params loaded using config api Change-Id: I21caf8f5c6eba2ee9295ce59a30769f7552eca13 Signed-off-by: Michal Skorupinski --- inc/config.h | 3 + src/app.c | 164 +++++++++++++++++++++++++++++++----- src/config.c | 29 +++++++ src/resource/resource_lap_counter.c | 21 +++-- 4 files changed, 189 insertions(+), 28 deletions(-) diff --git a/inc/config.h b/inc/config.h index 735b754..366cee7 100644 --- a/inc/config.h +++ b/inc/config.h @@ -157,4 +157,7 @@ int config_remove_key(const char *group, const char *key); */ int config_remove_group(const char *group); +bool config_get_string_or_set_default(char *group, char *key, char *default_value, char **value); +bool config_get_int_with_default(char *group, char *key, int default_value, int *value); + #endif /* end of include guard: CONFIG_H */ diff --git a/src/app.c b/src/app.c index 5c6a593..0de4182 100644 --- a/src/app.c +++ b/src/app.c @@ -39,11 +39,35 @@ #define MAX_UDP_INPUT 10000 #define CONFIG_GRP_CAR "Car" +#define CONFIG_GRP_STEERING "Steering" +#define CONFIG_GRP_CAMERA "Camera" +#define CONFIG_GRP_ENGINE "Engine" +#define CONFIG_GRP_RPI "Rpi" + #define CONFIG_KEY_ID "Id" #define CONFIG_KEY_NAME "Name" + +#define CONFIG_KEY_STEERING_CENTER "Center" +#define CONFIG_KEY_STEERING_RANGE "Range" +#define CONFIG_KEY_CAMERA_AZIMUTH_CENTER "Azimuth.Center" +#define CONFIG_KEY_CAMERA_AZIMUTH_RANGE "Azimuth.Range" +#define CONFIG_KEY_CAMERA_ELEVATION_MIN "Elevation.Min" +#define CONFIG_KEY_CAMERA_ELEVATION_MAX "Elevation.Max" +#define CONFIG_KEY_CAMERA_ENGINE_MIN "Min" +#define CONFIG_KEY_CAMERA_ENGINE_MAX "Max" + +#define CONFIG_KEY_RPI_PIN_STERING "Stering" +#define CONFIG_KEY_RPI_PIN_CAMERA_AZIMUTH "Azimuth" +#define CONFIG_KEY_RPI_PIN_CAMERA_ELEVATION "Elevation" + +#define CONFIG_KEY_RPI_PIN_ENGINE_1_FORWARD "1.forward" +#define CONFIG_KEY_RPI_PIN_ENGINE_1_BACK "1.back" +#define CONFIG_KEY_RPI_ENGINE_CHANNEL_1 "Channel.1" +#define CONFIG_KEY_RPI_PIN_ENGINE_2_FORWARD "2.forward" +#define CONFIG_KEY_RPI_PIN_ENGINE_2_BACK "2.back" +#define CONFIG_KEY_RPI_ENGINE_CHANNEL_2 "Channel.2" + #define CLOUD_REQUESTS_FREQUENCY 15 -#define AZIMUTH_SERVO_PIN 15 -#define ELEVATION_SERVO_PIN 14 #define ELEVATION_MIN 200 #define ELEVATION_MAX 400 @@ -62,8 +86,60 @@ typedef struct app_data_s { unsigned int dir_state; const char *user_name; guint idle_h; + + int stering_center; + int stering_range; + + int camera_azimuth_center; + int camera_azimuth_range; + + int camera_elevation_min; + int camera_elevation_max; + + int engine_min; + int engine_max; + + int stering_pin; + + int elevation_pin; + int azimuth_pin; + + int engine_1_forward_pin; + int engine_1_back_pin; + int engine_1_channel; + + int engine_2_forward_pin; + int engine_2_back_pin; + int engine_2_channel; } app_data; +static app_data s_info = { + .stering_center = STERING_SERVO_CENTER, + .stering_range = STERING_SERVO_RANGE, + + .camera_azimuth_center = (AZIMUTH_MAX + AZIMUTH_MIN) /2, + .camera_azimuth_range = AZIMUTH_MAX - ((AZIMUTH_MAX + AZIMUTH_MIN) /2), + + .camera_elevation_min = ELEVATION_MIN, + .camera_elevation_max = ELEVATION_MAX, + + .engine_min = -4095, + .engine_max = 4095, + + .stering_pin = 0, + + .elevation_pin = 14, + .azimuth_pin = 15, + + .engine_1_forward_pin = 19, + .engine_1_back_pin = 16, + .engine_1_channel = 5, + + .engine_2_forward_pin = 24, + .engine_2_back_pin = 20, + .engine_2_channel = 4, +}; + static void _initialize_components(app_data *ad); static void _initialize_config(); @@ -108,12 +184,14 @@ static int __map_range_val(int v_min, int v_max, int d_min, int d_max, int val) static inline int ___map_speed_val(int speed) { - return __map_range_val(-MAX_UDP_INPUT, MAX_UDP_INPUT, -4095, 4095, speed); + return __map_range_val(-MAX_UDP_INPUT, MAX_UDP_INPUT, s_info.engine_min, s_info.engine_max, speed); } static inline int ___map_servo_val(int servo) { - return __map_range_val(-MAX_UDP_INPUT, MAX_UDP_INPUT, STERING_SERVO_CENTER - STERING_SERVO_RANGE, STERING_SERVO_CENTER + STERING_SERVO_RANGE, servo); + return __map_range_val(-MAX_UDP_INPUT, MAX_UDP_INPUT, + s_info.stering_center - s_info.stering_range, + s_info.stering_center + s_info.stering_range, servo); } static int __driving_motors(int servo, int speed) @@ -137,13 +215,16 @@ static int __driving_motors(int servo, int speed) static void __camera(int azimuth, int elevation) { - int val_azimuth = __map_range_val(-MAX_UDP_INPUT, MAX_UDP_INPUT, AZIMUTH_MIN, AZIMUTH_MAX, azimuth); - int val_elevation = __map_range_val(0, MAX_UDP_INPUT, ELEVATION_MIN, ELEVATION_MAX, elevation); // No need to look upside down + int val_azimuth = __map_range_val(-MAX_UDP_INPUT, MAX_UDP_INPUT, + s_info.camera_azimuth_center - s_info.camera_azimuth_range, + s_info.camera_azimuth_center + s_info.camera_azimuth_range, azimuth); + + int val_elevation = __map_range_val(0, MAX_UDP_INPUT, s_info.camera_elevation_min, s_info.camera_elevation_max, elevation); // No need to look upside down _D("camera - azimuth[%4d : %4d], elevation[%4d : %4d]", azimuth, val_azimuth, elevation, val_elevation); #if ENABLE_MOTOR - resource_set_servo_motor_value(ELEVATION_SERVO_PIN, val_elevation); - resource_set_servo_motor_value(AZIMUTH_SERVO_PIN, val_azimuth); + resource_set_servo_motor_value(s_info.elevation_pin, val_elevation); + resource_set_servo_motor_value(s_info.azimuth_pin, val_azimuth); #endif } @@ -183,19 +264,47 @@ static void _initialize_config() char *id = NULL; char *name = NULL; gboolean modified = false; + if (config_get_string(CONFIG_GRP_CAR, CONFIG_KEY_ID, &id) != 0) { char *uuid = g_uuid_string_random(); config_set_string(CONFIG_GRP_CAR, CONFIG_KEY_ID, uuid); g_free(uuid); modified = true; } - if (config_get_string(CONFIG_GRP_CAR, CONFIG_KEY_NAME, &id) != 0) { - config_set_string(CONFIG_GRP_CAR, CONFIG_KEY_NAME, "Passerati"); - modified = true; - } + + char *uuid = g_uuid_string_random(); + modified |= config_get_string_or_set_default(CONFIG_GRP_CAR, CONFIG_KEY_ID, uuid, &id); + g_free(uuid); + + modified |= config_get_string_or_set_default(CONFIG_GRP_CAR, CONFIG_KEY_NAME, "Passerati", &name); + + modified |= config_get_int_with_default(CONFIG_GRP_STEERING, CONFIG_KEY_STEERING_CENTER, s_info.stering_center, &s_info.stering_center); + modified |= config_get_int_with_default(CONFIG_GRP_STEERING, CONFIG_KEY_STEERING_RANGE, s_info.stering_range, &s_info.stering_range); + + modified |= config_get_int_with_default(CONFIG_GRP_CAMERA, CONFIG_KEY_CAMERA_AZIMUTH_CENTER, s_info.camera_azimuth_center, &s_info.camera_azimuth_center); + modified |= config_get_int_with_default(CONFIG_GRP_CAMERA, CONFIG_KEY_CAMERA_AZIMUTH_RANGE, s_info.camera_azimuth_range, &s_info.camera_azimuth_range); + modified |= config_get_int_with_default(CONFIG_GRP_CAMERA, CONFIG_KEY_CAMERA_ELEVATION_MIN, s_info.camera_elevation_min, &s_info.camera_elevation_min); + modified |= config_get_int_with_default(CONFIG_GRP_CAMERA, CONFIG_KEY_CAMERA_ELEVATION_MAX, s_info.camera_elevation_max, &s_info.camera_elevation_max); + + modified |= config_get_int_with_default(CONFIG_GRP_ENGINE, CONFIG_KEY_CAMERA_ENGINE_MIN, s_info.engine_min, &s_info.engine_min); + modified |= config_get_int_with_default(CONFIG_GRP_ENGINE, CONFIG_KEY_CAMERA_ENGINE_MAX, s_info.engine_max, &s_info.engine_max); + + modified |= config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_PIN_STERING, s_info.stering_pin, &s_info.stering_pin); + modified |= config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_PIN_CAMERA_AZIMUTH, s_info.azimuth_pin, &s_info.azimuth_pin); + modified |= config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_PIN_CAMERA_ELEVATION, s_info.elevation_pin, &s_info.elevation_pin); + + modified |= config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_PIN_ENGINE_1_FORWARD, s_info.engine_1_forward_pin, &s_info.engine_1_forward_pin); + modified |= config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_PIN_ENGINE_1_BACK, s_info.engine_1_back_pin, &s_info.engine_1_back_pin); + modified |= config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_ENGINE_CHANNEL_1, s_info.engine_1_channel, &s_info.engine_1_channel); + + modified |= config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_PIN_ENGINE_2_FORWARD, s_info.engine_2_forward_pin, &s_info.engine_2_forward_pin); + modified |= config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_PIN_ENGINE_2_BACK, s_info.engine_2_back_pin, &s_info.engine_2_back_pin); + modified |= config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_ENGINE_CHANNEL_2, s_info.engine_2_channel, &s_info.engine_2_channel); + if (modified == true) { config_save(); } + free(id); free(name); } @@ -208,6 +317,17 @@ static void _initialize_components(app_data *ad) message_manager_init(); controller_connection_manager_listen(); lap_counter_init(); + + _D("Car settings: Stering[%d +/- %d] Engine[%d - %d], CamAzimuth[%d +/- %d], CamElev[%d - %d]", + s_info.stering_center, s_info.stering_range, + s_info.engine_min, s_info.engine_max, + s_info.camera_azimuth_center, s_info.camera_azimuth_range, + s_info.camera_elevation_min, s_info.camera_elevation_max); + + _D("RPI: Stering[%d], Azimuth[%d], Elev[%d]; ENG_1[%d, %d, %d]; ENG_2[%d, %d, %d];", + s_info.stering_pin, s_info.azimuth_pin, s_info.elevation_pin, + s_info.engine_1_forward_pin, s_info.engine_1_back_pin, s_info.engine_1_channel, + s_info.engine_2_forward_pin, s_info.engine_2_back_pin, s_info.engine_2_channel); } static bool service_app_create(void *data) @@ -227,27 +347,25 @@ static bool service_app_create(void *data) * */ #if ENABLE_MOTOR - ret = resource_set_motor_driver_L298N_configuration(MOTOR_ID_1, 19, 16, 5); + ret = resource_set_motor_driver_L298N_configuration(MOTOR_ID_1, s_info.engine_1_forward_pin, s_info.engine_1_back_pin, s_info.engine_1_channel); if (ret) { _E("resource_set_motor_driver_L298N_configuration()"); service_app_exit(); } - ret = resource_set_motor_driver_L298N_configuration(MOTOR_ID_2, 26, 20, 4); + ret = resource_set_motor_driver_L298N_configuration(MOTOR_ID_2, s_info.engine_2_forward_pin, s_info.engine_2_back_pin, s_info.engine_2_channel); if (ret) { _E("resource_set_motor_driver_L298N_configuration()"); service_app_exit(); } #endif - resource_lap_counter_init(); - _initialize_components(ad); + resource_lap_counter_init(); cloud_communication_start(CLOUD_REQUESTS_FREQUENCY); controller_connection_manager_set_command_received_cb(__command_received_cb); controller_connection_manager_set_user_name_received_cb(__user_name_received_cb); - lap_counter_init(); return true; } @@ -258,9 +376,9 @@ static void service_app_control(app_control_h app_control, void *data) /* set speed 0, to reduce delay of initializing motor driver */ resource_set_motor_driver_L298N_speed(MOTOR_ID_1, 0); resource_set_motor_driver_L298N_speed(MOTOR_ID_2, 0); - resource_set_servo_motor_value(0, 450); - resource_set_servo_motor_value(ELEVATION_SERVO_PIN, ELEVATION_MIN); - resource_set_servo_motor_value(AZIMUTH_SERVO_PIN, (AZIMUTH_MIN + AZIMUTH_MAX) / 2); + resource_set_servo_motor_value(s_info.stering_pin, STERING_SERVO_CENTER); + resource_set_servo_motor_value(s_info.elevation_pin, ELEVATION_MIN); + resource_set_servo_motor_value(s_info.azimuth_pin, (AZIMUTH_MIN + AZIMUTH_MAX) / 2); #endif return; @@ -270,9 +388,9 @@ static void service_app_terminate(void *data) { app_data *ad = data; - resource_set_servo_motor_value(0, STERING_SERVO_CENTER); - resource_set_servo_motor_value(ELEVATION_SERVO_PIN, ELEVATION_MIN); - resource_set_servo_motor_value(AZIMUTH_SERVO_PIN, (AZIMUTH_MIN + AZIMUTH_MAX) / 2); + resource_set_servo_motor_value(s_info.stering_pin, STERING_SERVO_CENTER); + resource_set_servo_motor_value(s_info.elevation_pin, ELEVATION_MIN); + resource_set_servo_motor_value(s_info.azimuth_pin, (AZIMUTH_MIN + AZIMUTH_MAX) / 2); resource_lap_counter_destroy(); diff --git a/src/config.c b/src/config.c index f9c16c7..ecf730b 100644 --- a/src/config.c +++ b/src/config.c @@ -231,3 +231,32 @@ int config_remove_group(const char *group) return g_key_file_remove_group(gk, group, NULL) ? 0 : 1; } + +bool config_get_string_or_set_default(char *group, char *key, char *default_value, char **value) +{ + bool modified = false; + + if (config_get_string(group, key, value) != 0) { + config_set_string(group, key, default_value); + + *value = strdup(default_value); + + modified = true; + } + + return modified; +} + +bool config_get_int_with_default(char *group, char *key, int default_value, int *value) +{ + bool modified = false; + + if (config_get_int(group, key, value) != 0) { + config_set_int(group, key, default_value); + + *value = default_value; + modified = true; + } + + return modified; +} diff --git a/src/resource/resource_lap_counter.c b/src/resource/resource_lap_counter.c index fd54e22..e6d5029 100644 --- a/src/resource/resource_lap_counter.c +++ b/src/resource/resource_lap_counter.c @@ -21,9 +21,11 @@ #include #include "log.h" #include "lap_counter/lap_counter.h" +#include "config.h" -#define GPIO_PIN 26 - +#define DEFAULT_LAP_GPIO 26 +#define CONFIG_KEY_RPI_PIN_LAP_COUNTER "lap.counter" +#define CONFIG_GRP_RPI "Rpi" typedef struct _lap_counter_s { peripheral_gpio_h gpio; @@ -46,7 +48,7 @@ static void _gpio_interrupted_cb(peripheral_gpio_h gpio, peripheral_error_e erro int ret = peripheral_gpio_read(s_info.gpio, &gpio_value); CHECK_GPIO_ERROR(s_info.gpio, ret); - _D("GPIO_%d value: %d initial: %d, prev: %d", GPIO_PIN, gpio_value, s_info.gpio_initial_value, s_info.gpio_prev_value); + _D("value: %d initial: %d, prev: %d", gpio_value, s_info.gpio_initial_value, s_info.gpio_prev_value); if (gpio_value != s_info.gpio_initial_value && s_info.gpio_prev_value == s_info.gpio_initial_value) { lap_counter_get_lap_time(); @@ -59,8 +61,17 @@ static void _gpio_interrupted_cb(peripheral_gpio_h gpio, peripheral_error_e erro void resource_lap_counter_init(void) { int ret = PERIPHERAL_ERROR_NONE; + int pin = DEFAULT_LAP_GPIO; + + bool modified = config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_PIN_LAP_COUNTER, DEFAULT_LAP_GPIO, &pin); + + _D("Lap gpio: %d", pin); + + if (modified) { + config_save(); + } - ret = peripheral_gpio_open(GPIO_PIN, &s_info.gpio); + ret = peripheral_gpio_open(pin, &s_info.gpio); retv_error_message(ret != PERIPHERAL_ERROR_NONE, ret); ret = peripheral_gpio_set_direction(s_info.gpio, PERIPHERAL_GPIO_DIRECTION_IN); @@ -75,7 +86,7 @@ void resource_lap_counter_init(void) ret = peripheral_gpio_read(s_info.gpio, &s_info.gpio_initial_value); CHECK_GPIO_ERROR(s_info.gpio, ret); - _D("GPIO_%d initial value: %d", GPIO_PIN, s_info.gpio_initial_value); + _D("GPIO_%d initial value: %d", pin, s_info.gpio_initial_value); s_info.gpio_prev_value = s_info.gpio_initial_value; } -- 2.7.4