Fix in led colors when a new lap event is detected
[apps/native/gear-racing-car.git] / src / cloud / cloud_communication.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 "cloud/cloud_communication.h"
18 #include <glib.h>
19 #include <wifi-manager.h>
20 #include <stdlib.h>
21 #include "cloud/car_info.h"
22 #include "cloud/cloud_request.h"
23 #include "cloud/cloud_lap_request.h"
24 #include "cloud/lap_info.h"
25 #include "log.h"
26 #include "config.h"
27 #include "net-util.h"
28 #include "resource/resource_led.h"
29
30 #define CONFIG_LED_STATE_KEY_READY "ready"
31 #define CONFIG_DEFAULT_LED_3BIT_READY 1, 0, 1
32 #define CONFIG_DEFAULT_LED_24BIT_READY 215, 15, 96
33
34 #define CONFIG_LED_STATE_KEY_FAIL "fail"
35 #define CONFIG_DEFAULT_LED_3BIT_FAIL 1, 0, 0
36 #define CONFIG_DEFAULT_LED_24BIT_FAIL 255, 0, 0
37
38 typedef struct communication_data_ {
39     gboolean is_initialized;
40     gboolean is_running;
41     gboolean is_connected;
42     car_info_t *car_info;
43     guint source_id;
44 } communication_data_t;
45
46 static communication_data_t _communication;
47
48 static void post_response_cb(request_result_e result, void *user_data);
49 static gboolean post_timer_cb(gpointer data);
50 static void wifi_changed_cb(const char *ap_mac, const char *ap_ssid, char *ip_addr, void *user_data);
51
52 static int set_car_id();
53 static int set_car_ip();
54 static int set_car_name();
55 static int set_ap_mac();
56 static int set_ap_ssid();
57
58 int cloud_communication_init()
59 {
60     retvm_if(_communication.is_initialized, -1, "Cloud communication is already initialized");
61     _communication.car_info = car_info_create();
62
63     set_car_id();
64     set_car_ip();
65     set_car_name();
66     set_ap_mac();
67     set_ap_ssid();
68
69     net_util_set_wifi_connection_changed_cb(wifi_changed_cb, NULL);
70
71     _communication.is_connected = car_info_get_ap_mac(_communication.car_info) && car_info_get_ap_ssid(_communication.car_info);
72     _communication.is_initialized = true;
73     return 0;
74 }
75
76 void cloud_communication_start(int interval)
77 {
78     retm_if(!_communication.is_initialized, "Cloud communication is not initialized");
79     retm_if(_communication.is_running, "Cloud communication is already running");
80
81     _communication.source_id = g_timeout_add_seconds(interval, post_timer_cb, _communication.car_info);
82     _communication.is_running = TRUE;
83 }
84
85 void cloud_communication_stop()
86 {
87     retm_if(!_communication.is_initialized, "Cloud communication is not initialized");
88     retm_if(!_communication.is_running, "Cloud communication is already stopped");
89
90     g_source_remove(_communication.source_id);
91     _communication.is_running = FALSE;
92 }
93
94 void cloud_communication_fini()
95 {
96     retm_if(!_communication.is_initialized, "Cloud communication is already finalized");
97
98     cloud_communication_stop();
99     car_info_destroy(_communication.car_info);
100 }
101
102 void cloud_communication_post_lap(const long laptime, const char *driver_name)
103 {
104         retm_if(!_communication.is_connected, "Car is not connected to network");
105         lap_info_t *lap = lap_info_create();
106
107         lap_info_set_car_id(lap, car_info_get_car_id(_communication.car_info));
108         lap_info_set_user_name(lap, driver_name);
109         lap_info_set_lap_time(lap,  laptime);
110
111         _D("POST lap");
112         cloud_lap_request_api_racing_post(lap, (cloud_request_lap_post_finish_cb)post_response_cb, NULL);
113
114         lap_info_destroy(lap);
115 }
116
117 static void post_response_cb(request_result_e result, void *user_data)
118 {
119     if (result == SUCCESS) {
120         _I("POST SUCCESS");
121         resource_led_set_rgb_colors(CONFIG_LED_STATE_KEY_READY,
122                         CONFIG_DEFAULT_LED_3BIT_READY,
123                                 CONFIG_DEFAULT_LED_24BIT_READY,
124                                 LED_COLOR_GREEN);
125     }
126     else {
127         _I("POST FAILURE");
128         resource_led_set_rgb_colors(CONFIG_LED_STATE_KEY_FAIL,
129                         CONFIG_DEFAULT_LED_3BIT_FAIL,
130                                 CONFIG_DEFAULT_LED_24BIT_FAIL,
131                                 LED_COLOR_RED);
132     }
133 }
134
135 static gboolean post_timer_cb(gpointer data)
136 {
137     retv_if(!data, FALSE);
138         retvm_if(!_communication.is_connected, TRUE, "Car is not connected to network");
139     car_info_t *car = (car_info_t *)data;
140     cloud_request_api_racing_post(car, post_response_cb, NULL);
141     return TRUE;
142 }
143
144 static int set_car_id()
145 {
146     char *id = NULL;
147     int ret = 0;
148     ret = config_get_string("Car", "Id", &id);
149     if (ret != 0) {
150         _E("Getting car ID from config failed!");
151         return -1;
152     }
153
154     car_info_set_car_id(_communication.car_info, id);
155     g_free(id);
156     return 0;
157 }
158
159 static int set_car_ip()
160 {
161     char *ip;
162     int ret = net_util_get_ip_addr(&ip);
163     if (ret != 0) {
164         return -1;
165     }
166     car_info_set_car_ip(_communication.car_info, ip);
167     g_free(ip);
168     return 0;
169 }
170
171 static int set_car_name()
172 {
173     char *name;
174     int ret = 0;
175
176     ret = config_get_string("Car", "Name", &name);
177     if (ret != 0) {
178         _E("Getting car name from config failed!");
179         return -1;
180     }
181     car_info_set_car_name(_communication.car_info, name);
182     g_free(name);
183     return 0;
184 }
185
186 static int set_ap_mac()
187 {
188     char *mac;
189     int ret = net_util_get_ap_mac(&mac);
190     if (ret != 0) {
191         return -1;
192     }
193     car_info_set_car_ap_mac(_communication.car_info, mac);
194     g_free(mac);
195     return 0;
196 }
197
198 static int set_ap_ssid()
199 {
200     char *ssid;
201     int ret = net_util_get_ap_ssid(&ssid);
202     if (ret != 0) {
203         return -1;
204     }
205     car_info_set_ap_ssid(_communication.car_info, ssid);
206     g_free(ssid);
207     return 0;
208 }
209
210 static void wifi_changed_cb(const char *ap_mac, const char *ap_ssid, char *ip_addr, void *user_data)
211 {
212         car_info_set_car_ap_mac(_communication.car_info, ap_mac);
213         car_info_set_ap_ssid(_communication.car_info, ap_ssid);
214         car_info_set_car_ip(_communication.car_info, ip_addr);
215         _communication.is_connected = ap_mac && ap_ssid;
216
217         if (_communication.is_connected) {
218                 resource_led_set_rgb_colors(CONFIG_LED_STATE_KEY_READY,
219                                 CONFIG_DEFAULT_LED_3BIT_READY,
220                                 CONFIG_DEFAULT_LED_24BIT_READY,
221                                 LED_COLOR_GREEN);
222         } else {
223                 resource_led_set_rgb_colors(CONFIG_LED_STATE_KEY_FAIL,
224                                 CONFIG_DEFAULT_LED_3BIT_FAIL,
225                                 CONFIG_DEFAULT_LED_24BIT_FAIL,
226                                 LED_COLOR_RED);
227         }
228 }
229