b05ca7eabe98cb1cb9427c1761b8be79cff9a7ae
[apps/native/gear-racing-car.git] / src / resource / resource_led.c
1 /*
2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
3 *
4 * Licensed under the Flora License, Version 1.1 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://floralicense.org/license/
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <glib.h>
18 #include <stdio.h>
19 #include <limits.h>
20 #include <stdlib.h>
21 #include <peripheral_io.h>
22 #include <time.h>
23 #include "log.h"
24 #include "resource/resource_led.h"
25 #include "config.h"
26
27 #define DEFAULT_LED_RED 17
28 #define DEFAULT_LED_GREEN 27
29 #define CONFIG_KEY_RPI_PIN_LED_RED "bi.red"
30 #define CONFIG_KEY_RPI_PIN_LED_GREEN "bi.green"
31 #define CONFIG_KEY_RPI_USE_BI_LED "bi.use"
32 #define CONFIG_GRP_RPI "Rpi.led"
33
34
35 typedef struct _led_s {
36         peripheral_gpio_h gpio_bi_led[2];
37         led_color_e current_color;
38
39         int use_bi_led;
40 } led_s;
41
42 static led_s s_info = {
43         .current_color = LED_COLOR_NONE,
44         0, };
45
46 #define  CHECK_GPIO_ERROR(pin, ret) \
47         if (ret != PERIPHERAL_ERROR_NONE) { \
48                 peripheral_gpio_close(pin); \
49                 _E("GPIO ERROR: %s, %s[%d]", get_error_message(ret), __FILE__, __LINE__); \
50                 return ; \
51         }
52
53
54 static inline void _led_set(led_color_e color)
55 {
56         int red;
57         int green;
58
59         if (!s_info.use_bi_led) {
60                 _D("Bi led is turned OFF");
61                 return;
62         }
63
64         switch (color) {
65                 case LED_COLOR_RED:
66                         red = 1;
67                         green = 0;
68                         break;
69                 case LED_COLOR_GREEN:
70                         red = 0;
71                         green = 1;
72                         break;
73                 default:
74                         red = 0;
75                         green = 0;
76                         break;
77         }
78
79         _D("Colors: %d %d", red, green);
80
81         int ret = peripheral_gpio_write(s_info.gpio_bi_led[LED_COLOR_RED], red);
82         ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
83
84         peripheral_gpio_write(s_info.gpio_bi_led[LED_COLOR_GREEN], green);
85         ret_error_message(ret != PERIPHERAL_ERROR_NONE, ret);
86 }
87
88 static gboolean _restore_color_cb(gpointer data)
89 {
90         _led_set(s_info.current_color);
91         return false;
92 }
93
94 static peripheral_gpio_h _init_gpio(int default_gpio, char *key)
95 {
96         peripheral_gpio_h gpio;
97         int ret = PERIPHERAL_ERROR_NONE;
98         int pin = 0;
99         bool modified = config_get_int_with_default(CONFIG_GRP_RPI, key, default_gpio, &pin);
100
101         _D("gpio: %d", pin);
102
103         if (modified) {
104                 config_save();
105         }
106
107         peripheral_gpio_open(pin, &gpio);
108         retv_error_message(ret != PERIPHERAL_ERROR_NONE, ret, 0);
109
110         peripheral_gpio_set_direction(gpio, PERIPHERAL_GPIO_DIRECTION_OUT_INITIALLY_LOW);
111         retv_error_message(ret != PERIPHERAL_ERROR_NONE, ret, 0);
112
113         return gpio;
114
115 }
116
117 static void _init_bi_led(void)
118 {
119         bool modified = config_get_int_with_default(CONFIG_GRP_RPI, CONFIG_KEY_RPI_USE_BI_LED, 1, &s_info.use_bi_led);
120
121         if (s_info.use_bi_led) {
122                 s_info.gpio_bi_led[LED_COLOR_RED] = _init_gpio(DEFAULT_LED_RED, CONFIG_KEY_RPI_PIN_LED_RED);
123                 s_info.gpio_bi_led[LED_COLOR_GREEN] = _init_gpio(DEFAULT_LED_GREEN, CONFIG_KEY_RPI_PIN_LED_GREEN);
124         } else {
125                 _D("BI-Led is turned OFF");
126         }
127
128         if (modified) {
129                 config_save();
130         }
131 }
132
133 void resource_led_init(void)
134 {
135         _D("Initialize Led");
136         _init_bi_led();
137 }
138
139 void resource_led_destroy(void)
140 {
141         peripheral_gpio_close(s_info.gpio_bi_led[LED_COLOR_RED]);
142         peripheral_gpio_close(s_info.gpio_bi_led[LED_COLOR_GREEN]);
143 }
144
145 void resource_led_set(led_color_e color)
146 {
147         _D("Set led to: %d", color);
148         if (color == s_info.current_color) {
149                 return;
150         }
151
152         s_info.current_color = color;
153         _led_set(color);
154 }
155
156 void resource_led_blink(led_color_e color, unsigned timeout)
157 {
158         if (color == s_info.current_color) {
159                 return;
160         }
161
162         _led_set(color);
163         g_timeout_add(timeout, _restore_color_cb, NULL);
164 }
165