sensord: replace 0x% with %#
[platform/core/system/sensord.git] / src / server / sensor_event_dispatcher.cpp
1 /*
2  * sensord
3  *
4  * Copyright (c) 2013 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <sensor_common.h>
21 #include <command_common.h>
22 #include <sensor_event_dispatcher.h>
23 #include <sensor_log.h>
24 #include <thread>
25
26 using std::thread;
27 using std::vector;
28 using std::pair;
29
30 #define MAX_PENDING_CONNECTION 32
31
32 sensor_event_dispatcher::sensor_event_dispatcher()
33 {
34 }
35
36 sensor_event_dispatcher::~sensor_event_dispatcher() { }
37
38
39 sensor_event_dispatcher& sensor_event_dispatcher::get_instance()
40 {
41         static sensor_event_dispatcher inst;
42         return inst;
43 }
44
45 bool sensor_event_dispatcher::run(void)
46 {
47         thread dispatcher(&sensor_event_dispatcher::dispatch_event, this);
48         dispatcher.detach();
49
50         return true;
51 }
52
53 void sensor_event_dispatcher::accept_event_channel(csocket client_socket)
54 {
55         int client_id;
56         channel_ready_t event_channel_ready;
57         client_info_manager& client_info_manager = get_client_info_manager();
58
59         client_socket.set_connection_mode();
60
61         if (client_socket.recv(&client_id, sizeof(client_id)) <= 0) {
62                 _E("Failed to receive client id on socket fd[%d]", client_socket.get_socket_fd());
63                 return;
64         }
65
66         client_socket.set_transfer_mode();
67
68         if(!get_client_info_manager().set_event_socket(client_id, client_socket)) {
69                 _E("Failed to store event socket[%d] for %s", client_socket.get_socket_fd(),
70                         client_info_manager.get_client_info(client_id));
71                 return;
72         }
73
74         event_channel_ready.magic = CHANNEL_MAGIC_NUM;
75         event_channel_ready.client_id = client_id;
76
77         _I("Event channel is accepted for %s on socket[%d]",
78                 client_info_manager.get_client_info(client_id), client_socket.get_socket_fd());
79
80         if (client_socket.send(&event_channel_ready, sizeof(event_channel_ready)) <= 0) {
81                 _E("Failed to send event_channel_ready packet to %s on socket fd[%d]",
82                         client_info_manager.get_client_info(client_id), client_socket.get_socket_fd());
83                 return;
84         }
85 }
86
87 void sensor_event_dispatcher::accept_event_connections(csocket client_socket)
88 {
89         thread event_channel_creator(&sensor_event_dispatcher::accept_event_channel, this, client_socket);
90         event_channel_creator.detach();
91 }
92
93 void sensor_event_dispatcher::dispatch_event(void)
94 {
95         const int MAX_SYNTH_PER_SENSOR = 5;
96
97         vector<sensor_event_t> v_sensor_events(MAX_SYNTH_PER_SENSOR);
98
99         _I("Event Dispatcher started");
100
101         while (true) {
102                 void *seed_event = get_event_queue().pop();
103
104                 vector<void *> sensor_events;
105                 sensor_events.push_back(seed_event);
106
107                 virtual_sensors v_sensors = get_active_virtual_sensors();
108
109                 auto it_v_sensor = v_sensors.begin();
110
111                 while (it_v_sensor != v_sensors.end()) {
112                         int synthesized_cnt;
113                         v_sensor_events.clear();
114                         (*it_v_sensor)->synthesize(*((sensor_event_t *)seed_event));
115                         synthesized_cnt = v_sensor_events.size();
116
117                         for (int i = 0; i < synthesized_cnt; ++i) {
118                                 sensor_event_t *v_event = (sensor_event_t*)malloc(sizeof(sensor_event_t));
119                                 if (!v_event) {
120                                         _E("Failed to allocate memory");
121                                         continue;
122                                 }
123
124                                 memcpy(v_event, &v_sensor_events[i], sizeof(sensor_event_t));
125                                 sensor_events.push_back(v_event);
126                         }
127
128                         ++it_v_sensor;
129                 }
130
131                 sort_sensor_events(sensor_events);
132
133                 for (unsigned int i = 0; i < sensor_events.size(); ++i) {
134                         if (is_record_event(((sensor_event_t *)(sensor_events[i]))->event_type))
135                                 put_last_event(((sensor_event_t *)(sensor_events[i]))->event_type, *((sensor_event_t *)(sensor_events[i])));
136                 }
137
138                 send_sensor_events(sensor_events);
139         }
140 }
141
142
143 void sensor_event_dispatcher::send_sensor_events(vector<void *> &events)
144 {
145         sensor_event_t *sensor_event = NULL;
146         client_info_manager& client_info_manager = get_client_info_manager();
147
148         const int RESERVED_CLIENT_CNT = 20;
149         static client_id_vec id_vec(RESERVED_CLIENT_CNT);
150
151         for (unsigned int i = 0; i < events.size(); ++i) {
152                 sensor_id_t sensor_id;
153                 unsigned int event_type;
154
155                 sensor_event = (sensor_event_t*)events[i];
156                 sensor_id = sensor_event->sensor_id;
157                 event_type = sensor_event->event_type;
158
159                 id_vec.clear();
160                 client_info_manager.get_listener_ids(sensor_id, event_type, id_vec);
161
162                 auto it_client_id = id_vec.begin();
163
164                 while (it_client_id != id_vec.end()) {
165                         csocket client_socket;
166                         client_info_manager.get_event_socket(*it_client_id, client_socket);
167                         bool ret = (client_socket.send(sensor_event, sizeof(sensor_event_t)) > 0);
168
169                         ret = (ret & (client_socket.send(sensor_event->data, sensor_event->data_length) > 0));
170
171                         if (ret)
172                                 _D("Event[%#x] sent to %s on socket[%d]", event_type, client_info_manager.get_client_info(*it_client_id), client_socket.get_socket_fd());
173                         else
174                                 _E("Failed to send event[%#x] to %s on socket[%d]", event_type, client_info_manager.get_client_info(*it_client_id), client_socket.get_socket_fd());
175
176                         ++it_client_id;
177                 }
178
179                 free(sensor_event->data);
180                 free(sensor_event);
181         }
182 }
183
184 client_info_manager& sensor_event_dispatcher::get_client_info_manager(void)
185 {
186         return client_info_manager::get_instance();
187 }
188
189 sensor_event_queue& sensor_event_dispatcher::get_event_queue(void)
190 {
191         return sensor_event_queue::get_instance();
192 }
193
194 bool sensor_event_dispatcher::is_record_event(unsigned int event_type)
195 {
196         return false;
197 }
198
199 void sensor_event_dispatcher::put_last_event(unsigned int event_type, const sensor_event_t &event)
200 {
201         AUTOLOCK(m_last_events_mutex);
202         m_last_events[event_type] = event;
203 }
204
205 bool sensor_event_dispatcher::get_last_event(unsigned int event_type, sensor_event_t &event)
206 {
207         AUTOLOCK(m_last_events_mutex);
208
209         auto it_event = m_last_events.find(event_type);
210
211         if (it_event == m_last_events.end())
212                 return false;
213
214         event = it_event->second;
215         return true;
216 }
217
218 bool sensor_event_dispatcher::has_active_virtual_sensor(virtual_sensor *sensor)
219 {
220         AUTOLOCK(m_active_virtual_sensors_mutex);
221
222         auto it_v_sensor = find(m_active_virtual_sensors.begin(), m_active_virtual_sensors.end(), sensor);
223
224         return (it_v_sensor != m_active_virtual_sensors.end());
225 }
226
227
228 virtual_sensors sensor_event_dispatcher::get_active_virtual_sensors(void)
229 {
230         AUTOLOCK(m_active_virtual_sensors_mutex);
231
232         return m_active_virtual_sensors;
233 }
234
235 struct sort_comp {
236         bool operator()(const void *left, const void *right) {
237                 return ((sensor_event_t *)left)->data->timestamp < ((sensor_event_t *)right)->data->timestamp;
238         }
239 };
240
241 void sensor_event_dispatcher::sort_sensor_events(vector<void *> &events)
242 {
243         std::sort(events.begin(), events.end(), sort_comp());
244 }
245
246 void sensor_event_dispatcher::request_last_event(int client_id, sensor_id_t sensor_id)
247 {
248         client_info_manager& client_info_manager = get_client_info_manager();
249         event_type_vector event_vec;
250         csocket client_socket;
251
252         if (client_info_manager.get_registered_events(client_id, sensor_id, event_vec)) {
253                 if (!client_info_manager.get_event_socket(client_id, client_socket)) {
254                         _E("Failed to get event socket from %s",
255                                         client_info_manager.get_client_info(client_id));
256                         return;
257                 }
258
259                 auto it_event = event_vec.begin();
260                 while (it_event != event_vec.end()) {
261                         sensor_event_t event;
262                         if (is_record_event(*it_event) && get_last_event(*it_event, event)) {
263                                 if (client_socket.send(&event, sizeof(event)) > 0)
264                                         _I("Send the last event[%#x] to %s on socket[%d]", event.event_type,
265                                                 client_info_manager.get_client_info(client_id), client_socket.get_socket_fd());
266                                 else
267                                         _E("Failed to send event[%#x] to %s on socket[%d]", event.event_type,
268                                                 client_info_manager.get_client_info(client_id), client_socket.get_socket_fd());
269                         }
270                         ++it_event;
271                 }
272         }
273 }
274
275 bool sensor_event_dispatcher::add_active_virtual_sensor(virtual_sensor *sensor)
276 {
277         AUTOLOCK(m_active_virtual_sensors_mutex);
278
279         if (has_active_virtual_sensor(sensor)) {
280                 _E("[%s] sensor is already added on active virtual sensors", sensor->get_name());
281                 return false;
282         }
283
284         m_active_virtual_sensors.push_back(sensor);
285
286         return true;
287 }
288
289 bool sensor_event_dispatcher::delete_active_virtual_sensor(virtual_sensor *sensor)
290 {
291         AUTOLOCK(m_active_virtual_sensors_mutex);
292
293         auto it_v_sensor = find(m_active_virtual_sensors.begin(), m_active_virtual_sensors.end(), sensor);
294
295         if (it_v_sensor == m_active_virtual_sensors.end()) {
296                 _E("Fail to delete non-existent [%s] sensor on active virtual sensors", sensor->get_name());
297                 return false;
298         }
299
300         m_active_virtual_sensors.erase(it_v_sensor);
301
302         return true;
303 }