Changed the way that the led colors are stored in the config file
[apps/native/gear-racing-car.git] / src / resource / resource_led.c
index dcfef73..df11e7c 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <glib.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <limits.h>
 #include <stdlib.h>
 #include <peripheral_io.h>
@@ -43,9 +44,9 @@
 #define CONFIG_KEY_RPI_USE_L2C_RGB "rgb.l2c.use"
 
 
-#define DEFAULT_RGB_GPIO_R 14
-#define DEFAULT_RGB_GPIO_G 15
-#define DEFAULT_RGB_GPIO_B 18
+#define DEFAULT_RGB_GPIO_R 23
+#define DEFAULT_RGB_GPIO_G 24
+#define DEFAULT_RGB_GPIO_B 25
 
 #define DEFAULT_RGB_L2C_R 8
 #define DEFAULT_RGB_L2C_G 9
@@ -119,6 +120,13 @@ static inline void _led_bi_set(bi_led_color_e color)
 
 static inline void _rgb_gpio_set(bool red, bool green, bool blue)
 {
+       if (!s_info.use_rgb_gpio) {
+               _D("gpio rgb led is turned OFF");
+               return;
+       }
+
+       _D("RGB GPIO: [%d, %d, %d]", red, green, blue);
+
        int ret = peripheral_gpio_write(s_info.rgb_gpio[0], red);
        ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
 
@@ -127,20 +135,15 @@ static inline void _rgb_gpio_set(bool red, bool green, bool blue)
 
        ret = peripheral_gpio_write(s_info.rgb_gpio[2], blue);
        ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
-
-       _D("RGB GPIO: [%d, %d, %d]", red, green, blue);
 }
 
-static inline void _rgb_l2c_set(bool red, bool green, bool blue)
+static inline void _rgb_l2c_set(int red, int green, int blue)
 {
-//#define R 51
-//#define G 231
-//#define B 157
-
-//#define R 88
-//#define G 51
-//#define B 231
-
+       FUNCTION_START;
+       if (!s_info.use_rgb_l2c) {
+               _D("l2c rgb led is turned OFF");
+               return;
+       }
 
        int ret = resource_pca9685_set_value_to_channel(DEFAULT_RGB_L2C_R, 0, RGB_TO_REGISTER(red));
        ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
@@ -152,6 +155,7 @@ static inline void _rgb_l2c_set(bool red, bool green, bool blue)
        ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
 
        _D("RGB L2C: [%d, %d, %d] -> [%d, %d, %d]", red, green, blue, RGB_TO_REGISTER(red), RGB_TO_REGISTER(green), RGB_TO_REGISTER(blue));
+       FUNCTION_END;
 }
 
 static gboolean _restore_bi_color_cb(gpointer data)
@@ -168,27 +172,42 @@ static gboolean _restore_rgb_gpio_color_cb(gpointer data)
 
 static gboolean _restore_rgb_l2c_color_cb(gpointer data)
 {
+       FUNCTION_START;
        _rgb_l2c_set(s_info.current_rgb_l2c_color[0], s_info.current_rgb_l2c_color[1], s_info.current_rgb_l2c_color[2]);
+       FUNCTION_END;
+       return false;
+}
+
+static gboolean _restore_rgb_color_cb(gpointer data)
+{
+       FUNCTION_START;
+
+       _restore_bi_color_cb(data);
+       _restore_rgb_gpio_color_cb(data);
+       _restore_rgb_l2c_color_cb(data);
+
+       FUNCTION_END;
+
        return false;
 }
 
 static peripheral_gpio_h _init_gpio(int default_gpio, char *key)
 {
        peripheral_gpio_h gpio;
-       int ret = PERIPHERAL_ERROR_NONE;
+
        int pin = 0;
        bool modified = config_get_int_with_default(CONFIG_GRP_RPI, key, default_gpio, &pin);
 
-       _D("gpio: %d", pin);
+       _D("Initializing gpio: %d", pin);
 
        if (modified) {
                config_save();
        }
 
-       peripheral_gpio_open(pin, &gpio);
+       int ret = peripheral_gpio_open(pin, &gpio);
        retv_error_message(ret != PERIPHERAL_ERROR_NONE, ret, 0);
 
-       peripheral_gpio_set_direction(gpio, PERIPHERAL_GPIO_DIRECTION_OUT_INITIALLY_LOW);
+       ret = peripheral_gpio_set_direction(gpio, PERIPHERAL_GPIO_DIRECTION_OUT_INITIALLY_LOW);
        retv_error_message(ret != PERIPHERAL_ERROR_NONE, ret, 0);
 
        return gpio;
@@ -202,6 +221,9 @@ static void _init_bi_led(void)
                config_save();
        }
 
+       _D("Use bi_led: %d", s_info.use_bi_led);
+
+
        if (s_info.use_bi_led) {
                s_info.gpio_bi_led[LED_COLOR_RED] = _init_gpio(DEFAULT_BI_LED_RED, CONFIG_KEY_RPI_BI_LED_RED);
                s_info.gpio_bi_led[LED_COLOR_GREEN] = _init_gpio(DEFAULT_BI_LED_GREEN, CONFIG_KEY_RPI_BI_LED_GREEN);
@@ -217,6 +239,8 @@ static void _init_rgb_gpio_led(void)
                config_save();
        }
 
+       _D("Use rgb_gpio_led: %d", s_info.use_rgb_gpio);
+
        if (!s_info.use_rgb_gpio) {
                _D("RGB GPIO is turned off");
                return;
@@ -227,6 +251,18 @@ static void _init_rgb_gpio_led(void)
        s_info.rgb_gpio[2] = _init_gpio(DEFAULT_RGB_GPIO_B, CONFIG_KEY_RPI_RGB_GPIO_B);
 }
 
+void _init_l2c(int default_channel, char *config_key)
+{
+       int channel;
+       bool modified = config_get_int_with_default(CONFIG_GRP_RPI, config_key, default_channel, &channel);
+       if (modified) {
+               config_save();
+       }
+
+       int ret = resource_pca9685_init(channel, 60);
+       ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
+}
+
 static void _init_rgb_l2c_led(void)
 {
        bool modified = config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_USE_L2C_RGB, 1, &s_info.use_rgb_l2c);
@@ -234,27 +270,26 @@ static void _init_rgb_l2c_led(void)
                config_save();
        }
 
+       _D("Use rgb_l2c_led: %d", s_info.use_rgb_l2c);
+
        if (!s_info.use_rgb_l2c) {
                _D("RGB L2C is turned off");
                return;
        }
 
-       int ret = resource_pca9685_init(DEFAULT_RGB_L2C_R, 60);
-       ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
-
-       ret = resource_pca9685_init(DEFAULT_RGB_L2C_G, 60);
-       ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
-
-       ret = resource_pca9685_init(DEFAULT_RGB_L2C_B, 60);
-       ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
+       _init_l2c(DEFAULT_RGB_L2C_R, CONFIG_KEY_RPI_RGB_L2C_R);
+       _init_l2c(DEFAULT_RGB_L2C_G, CONFIG_KEY_RPI_RGB_L2C_G);
+       _init_l2c(DEFAULT_RGB_L2C_B, CONFIG_KEY_RPI_RGB_L2C_B);
 }
 
 void resource_led_init(void)
 {
+       FUNCTION_START;
        _D("Initialize Led");
-       _init_bi_led();
        _init_rgb_gpio_led();
+       _init_bi_led();
        _init_rgb_l2c_led();
+       FUNCTION_END;
 }
 
 void resource_led_destroy(void)
@@ -262,27 +297,33 @@ void resource_led_destroy(void)
        peripheral_gpio_close(s_info.gpio_bi_led[LED_COLOR_RED]);
        peripheral_gpio_close(s_info.gpio_bi_led[LED_COLOR_GREEN]);
 
+       peripheral_gpio_close(s_info.rgb_gpio[0]);
+       peripheral_gpio_close(s_info.rgb_gpio[1]);
+       peripheral_gpio_close(s_info.rgb_gpio[2]);
+
+       resource_led_rgb_l2c_set(0, 0, 0);
+
        resource_pca9685_fini(DEFAULT_RGB_L2C_R);
        resource_pca9685_fini(DEFAULT_RGB_L2C_G);
        resource_pca9685_fini(DEFAULT_RGB_L2C_B);
 }
 
-void resource_bi_led_set(bi_led_color_e color)
+void resource_led_bi_set(bi_led_color_e color)
 {
        _D("Set led to: %d", color);
        if (color == s_info.current_color) {
+               _D("No change in bi led");
                return;
        }
 
        s_info.current_color = color;
        _led_bi_set(color);
-
-       peripheral_gpio_write(s_info.rgb_gpio[LED_COLOR_RED], 1);
 }
 
-void resource_bi_led_blink(bi_led_color_e color, unsigned timeout)
+void resource_led_bi_blink(bi_led_color_e color, unsigned timeout)
 {
        if (color == s_info.current_color) {
+               _D("No change in bi led");
                return;
        }
 
@@ -290,11 +331,12 @@ void resource_bi_led_blink(bi_led_color_e color, unsigned timeout)
        g_timeout_add(timeout, _restore_bi_color_cb, NULL);
 }
 
-void resource_rgb_gpio_set(bool red, bool green, bool blue)
+void resource_led_rgb_gpio_set(bool red, bool green, bool blue)
 {
        if (red == s_info.current_rgb_gpio_color[0] &&
                        green == s_info.current_rgb_gpio_color[1] &&
                        blue == s_info.current_rgb_gpio_color[2]) {
+               _D("No change in gpio led");
                return;
        }
 
@@ -306,11 +348,12 @@ void resource_rgb_gpio_set(bool red, bool green, bool blue)
        _rgb_gpio_set(red, green, blue);
 }
 
-void resource_gpio_rgb_blink(bool red, bool green, bool blue, unsigned timeout)
+void resource_led_gpio_rgb_blink(bool red, bool green, bool blue, unsigned timeout)
 {
        if (red == s_info.current_rgb_gpio_color[0] &&
                        green == s_info.current_rgb_gpio_color[1] &&
                        blue == s_info.current_rgb_gpio_color[2]) {
+               _D("No change in gpio led");
                return;
        }
 
@@ -318,15 +361,15 @@ void resource_gpio_rgb_blink(bool red, bool green, bool blue, unsigned timeout)
        g_timeout_add(timeout, _restore_rgb_gpio_color_cb, NULL);
 }
 
-void resource_rgb_l2c_set(bool red, bool green, bool blue)
+void resource_led_rgb_l2c_set(int red, int green, int blue)
 {
        if (red == s_info.current_rgb_l2c_color[0] &&
                        green == s_info.current_rgb_l2c_color[1] &&
                        blue == s_info.current_rgb_l2c_color[2]) {
+               _D("No change in l2c led");
                return;
        }
 
-
        s_info.current_rgb_l2c_color[0] = red;
        s_info.current_rgb_l2c_color[1] = green;
        s_info.current_rgb_l2c_color[2] = blue;
@@ -334,11 +377,12 @@ void resource_rgb_l2c_set(bool red, bool green, bool blue)
        _rgb_l2c_set(red, green, blue);
 }
 
-void resource_rgb_l2c_blink(bool red, bool green, bool blue, unsigned timeout)
+void resource_led_rgb_l2c_blink(int red, int green, int blue, unsigned timeout)
 {
        if (red == s_info.current_rgb_l2c_color[0] &&
                        green == s_info.current_rgb_l2c_color[1] &&
                        blue == s_info.current_rgb_l2c_color[2]) {
+               _D("No change in l2c led");
                return;
        }
 
@@ -346,3 +390,53 @@ void resource_rgb_l2c_blink(bool red, bool green, bool blue, unsigned timeout)
        g_timeout_add(timeout, _restore_rgb_l2c_color_cb, NULL);
 }
 
+void resource_led_set_rgb_colors(char *key,
+               int def_r_3bit, int def_g_3bit, int def_b_3bit,
+               int def_r_24bit, int def_g_24bit, int def_b_24bit,
+               bi_led_color_e bi_led)
+{
+       FUNCTION_START;
+
+       int red, green, blue;
+       char final_key[PATH_MAX];
+
+       snprintf(final_key, PATH_MAX, "3bit.%s", key);
+       bool modified = config_get_rgb_with_default("Rpi.led", final_key, def_r_3bit, def_g_3bit, def_b_3bit, &red, &green, &blue);
+       resource_led_rgb_gpio_set(red, green, blue);
+
+       _D("%s: 3bit color: [%d, %d, %d]", final_key, red, green, blue);
+
+       snprintf(final_key, PATH_MAX, "24bit.%s", key);
+       modified |= config_get_rgb_with_default("Rpi.led", final_key, def_r_24bit, def_g_24bit, def_b_24bit, &red, &green, &blue);
+       resource_led_rgb_l2c_set(red, green, blue);
+
+       _D("%s: 24bit color: [%d, %d, %d]", final_key, red, green, blue);
+
+       int value;
+       snprintf(final_key, PATH_MAX, "bicolor.%s", key);
+       modified |= config_get_int_with_default("Rpi.led", final_key, bi_led, &value);
+       resource_led_bi_set(value);
+
+       if (modified) {
+               config_save();
+       }
+
+       _D("%s: bicolor: [%d]", final_key, value);
+
+       FUNCTION_END;
+}
+
+void resource_led_blink_rgb_colors(char *key,
+               int def_r_3bit, int def_g_3bit, int def_b_3bit,
+               int def_r_24bit, int def_g_24bit, int def_b_24bit,
+               bi_led_color_e bi_led, int timeout)
+{
+       FUNCTION_START;
+
+       resource_led_set_rgb_colors(key, def_r_3bit, def_g_3bit, def_b_3bit, def_r_24bit, def_g_24bit, def_b_24bit, bi_led);
+
+       g_timeout_add(timeout, _restore_rgb_color_cb, NULL);
+
+
+       FUNCTION_END;
+}