#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
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();
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)
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
}
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);
}
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)
*
*/
#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;
}
/* 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;
{
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();