2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
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
8 * http://floralicense.org/license/
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.
17 #include "cloud/cloud_communication.h"
19 #include <wifi-manager.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"
28 #include "resource/resource_led.h"
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
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
38 typedef struct communication_data_ {
39 gboolean is_initialized;
41 gboolean is_connected;
44 } communication_data_t;
46 static communication_data_t _communication;
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);
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();
58 int cloud_communication_init()
60 retvm_if(_communication.is_initialized, -1, "Cloud communication is already initialized");
61 _communication.car_info = car_info_create();
69 net_util_set_wifi_connection_changed_cb(wifi_changed_cb, NULL);
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;
76 void cloud_communication_start(int interval)
78 retm_if(!_communication.is_initialized, "Cloud communication is not initialized");
79 retm_if(_communication.is_running, "Cloud communication is already running");
81 _communication.source_id = g_timeout_add_seconds(interval, post_timer_cb, _communication.car_info);
82 _communication.is_running = TRUE;
85 void cloud_communication_stop()
87 retm_if(!_communication.is_initialized, "Cloud communication is not initialized");
88 retm_if(!_communication.is_running, "Cloud communication is already stopped");
90 g_source_remove(_communication.source_id);
91 _communication.is_running = FALSE;
94 void cloud_communication_fini()
96 retm_if(!_communication.is_initialized, "Cloud communication is already finalized");
98 cloud_communication_stop();
99 car_info_destroy(_communication.car_info);
102 void cloud_communication_post_lap(const long laptime, const char *driver_name)
104 retm_if(!_communication.is_connected, "Car is not connected to network");
105 lap_info_t *lap = lap_info_create();
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);
112 cloud_lap_request_api_racing_post(lap, (cloud_request_lap_post_finish_cb)post_response_cb, NULL);
114 lap_info_destroy(lap);
117 static void post_response_cb(request_result_e result, void *user_data)
119 if (result == SUCCESS) {
121 resource_led_set_rgb_colors(CONFIG_LED_STATE_KEY_READY,
122 CONFIG_DEFAULT_LED_3BIT_READY,
123 CONFIG_DEFAULT_LED_24BIT_READY,
128 resource_led_set_rgb_colors(CONFIG_LED_STATE_KEY_FAIL,
129 CONFIG_DEFAULT_LED_3BIT_FAIL,
130 CONFIG_DEFAULT_LED_24BIT_FAIL,
135 static gboolean post_timer_cb(gpointer data)
138 retv_if(!data, FALSE);
139 retvm_if(!_communication.is_connected, TRUE, "Car is not connected to network");
140 car_info_t *car = (car_info_t *)data;
141 cloud_request_api_racing_post(car, post_response_cb, NULL);
146 static int set_car_id()
150 ret = config_get_string("Car", "Id", &id);
152 _E("Getting car ID from config failed!");
156 car_info_set_car_id(_communication.car_info, id);
161 static int set_car_ip()
164 int ret = net_util_get_ip_addr(&ip);
168 car_info_set_car_ip(_communication.car_info, ip);
173 static int set_car_name()
178 ret = config_get_string("Car", "Name", &name);
180 _E("Getting car name from config failed!");
183 car_info_set_car_name(_communication.car_info, name);
188 static int set_ap_mac()
191 int ret = net_util_get_ap_mac(&mac);
195 car_info_set_car_ap_mac(_communication.car_info, mac);
200 static int set_ap_ssid()
203 int ret = net_util_get_ap_ssid(&ssid);
207 car_info_set_ap_ssid(_communication.car_info, ssid);
212 static void wifi_changed_cb(const char *ap_mac, const char *ap_ssid, char *ip_addr, void *user_data)
214 car_info_set_car_ap_mac(_communication.car_info, ap_mac);
215 car_info_set_ap_ssid(_communication.car_info, ap_ssid);
216 car_info_set_car_ip(_communication.car_info, ip_addr);
217 _communication.is_connected = ap_mac && ap_ssid;
219 if (_communication.is_connected) {
220 resource_led_set_rgb_colors(CONFIG_LED_STATE_KEY_READY,
221 CONFIG_DEFAULT_LED_3BIT_READY,
222 CONFIG_DEFAULT_LED_24BIT_READY,
225 resource_led_set_rgb_colors(CONFIG_LED_STATE_KEY_FAIL,
226 CONFIG_DEFAULT_LED_3BIT_FAIL,
227 CONFIG_DEFAULT_LED_24BIT_FAIL,