Car params loaded using config api 85/191785/4
authorMichal Skorupinski <m.skorupinsk@samsung.com>
Tue, 23 Oct 2018 16:10:24 +0000 (18:10 +0200)
committerMichal Skorupinski <m.skorupinsk@samsung.com>
Tue, 30 Oct 2018 11:49:17 +0000 (12:49 +0100)
Change-Id: I21caf8f5c6eba2ee9295ce59a30769f7552eca13
Signed-off-by: Michal Skorupinski <m.skorupinsk@samsung.com>
inc/config.h
src/app.c
src/config.c
src/resource/resource_lap_counter.c

index 735b754..366cee7 100644 (file)
@@ -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 */
index 5c6a593..0de4182 100644 (file)
--- a/src/app.c
+++ b/src/app.c
 #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();
 
index f9c16c7..ecf730b 100644 (file)
@@ -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;
+}
index fd54e22..e6d5029 100644 (file)
 #include <time.h>
 #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;
 }