dcf85d4b3705affec66e9bafec4c446a9639adec
[platform/core/system/sensord.git] / src / libsensord / client_common.cpp
1 /*
2  * libsensord
3  *
4  * Copyright (c) 2014 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 #include <client_common.h>
20 #include <stdio.h>
21 #include <sys/types.h>
22 #include <unistd.h>
23 #include <stdlib.h>
24 #include <unordered_map>
25 using std::unordered_map;
26
27 #define FILL_LOG_ELEMENT(ID, TYPE, CNT, PRINT_PER_CNT) {ID, TYPE, {#TYPE, CNT, PRINT_PER_CNT} }
28
29 log_element g_log_elements[] = {
30         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, UNKNOWN_SENSOR, 0, 1),
31         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, ACCELEROMETER_SENSOR, 0, 1),
32         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, GEOMAGNETIC_SENSOR, 0, 1),
33         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, LIGHT_SENSOR, 0, 1),
34         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, PROXIMITY_SENSOR, 0, 1),
35         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, GYROSCOPE_SENSOR, 0, 1),
36         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, PRESSURE_SENSOR, 0, 1),
37         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, CONTEXT_SENSOR, 0, 1),
38         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, GRAVITY_SENSOR, 0, 1),
39         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, LINEAR_ACCEL_SENSOR, 0, 1),
40         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, ORIENTATION_SENSOR, 0, 1),
41         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, TEMPERATURE_SENSOR, 0, 1),
42         FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, ROTATION_VECTOR_SENSOR, 0, 1),
43
44         FILL_LOG_ELEMENT(LOG_ID_EVENT, GEOMAGNETIC_EVENT_CALIBRATION_NEEDED, 0, 1),
45         FILL_LOG_ELEMENT(LOG_ID_EVENT, PROXIMITY_EVENT_CHANGE_STATE, 0,1),
46         FILL_LOG_ELEMENT(LOG_ID_EVENT, LIGHT_EVENT_CHANGE_LEVEL, 0, 1),
47
48         FILL_LOG_ELEMENT(LOG_ID_EVENT, PROXIMITY_EVENT_STATE_REPORT_ON_TIME, 0, 10),
49         FILL_LOG_ELEMENT(LOG_ID_EVENT, PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME, 0, 10),
50         FILL_LOG_ELEMENT(LOG_ID_EVENT, CONTEXT_EVENT_REPORT, 0, 1),
51
52         FILL_LOG_ELEMENT(LOG_ID_EVENT, ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
53         FILL_LOG_ELEMENT(LOG_ID_EVENT, GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
54         FILL_LOG_ELEMENT(LOG_ID_EVENT, GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
55         FILL_LOG_ELEMENT(LOG_ID_EVENT, PRESSURE_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
56         FILL_LOG_ELEMENT(LOG_ID_EVENT, LIGHT_EVENT_LEVEL_DATA_REPORT_ON_TIME, 0, 10),
57         FILL_LOG_ELEMENT(LOG_ID_EVENT, LIGHT_EVENT_LUX_DATA_REPORT_ON_TIME, 0, 10),
58         FILL_LOG_ELEMENT(LOG_ID_EVENT, GRAVITY_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
59         FILL_LOG_ELEMENT(LOG_ID_EVENT, LINEAR_ACCEL_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
60         FILL_LOG_ELEMENT(LOG_ID_EVENT, ORIENTATION_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
61         FILL_LOG_ELEMENT(LOG_ID_EVENT, PRESSURE_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
62         FILL_LOG_ELEMENT(LOG_ID_EVENT, TEMPERATURE_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
63         FILL_LOG_ELEMENT(LOG_ID_EVENT, ROTATION_VECTOR_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10),
64
65         FILL_LOG_ELEMENT(LOG_ID_DATA, ACCELEROMETER_BASE_DATA_SET, 0, 25),
66         FILL_LOG_ELEMENT(LOG_ID_DATA, GYRO_BASE_DATA_SET, 0, 25),
67         FILL_LOG_ELEMENT(LOG_ID_DATA, PROXIMITY_BASE_DATA_SET, 0, 25),
68         FILL_LOG_ELEMENT(LOG_ID_DATA, PROXIMITY_DISTANCE_DATA_SET, 0, 25),
69         FILL_LOG_ELEMENT(LOG_ID_DATA, PRESSURE_BASE_DATA_SET, 0, 25),
70         FILL_LOG_ELEMENT(LOG_ID_DATA, GEOMAGNETIC_BASE_DATA_SET, 0, 25),
71         FILL_LOG_ELEMENT(LOG_ID_DATA, LIGHT_BASE_DATA_SET, 0, 25),
72         FILL_LOG_ELEMENT(LOG_ID_DATA, LIGHT_LUX_DATA_SET, 0, 25),
73         FILL_LOG_ELEMENT(LOG_ID_DATA, CONTEXT_BASE_DATA_SET, 0, 25),
74         FILL_LOG_ELEMENT(LOG_ID_DATA, GRAVITY_BASE_DATA_SET, 0, 25),
75         FILL_LOG_ELEMENT(LOG_ID_DATA, LINEAR_ACCEL_BASE_DATA_SET, 0, 25),
76         FILL_LOG_ELEMENT(LOG_ID_DATA, ORIENTATION_BASE_DATA_SET, 0, 25),
77         FILL_LOG_ELEMENT(LOG_ID_DATA, PRESSURE_BASE_DATA_SET, 0, 25),
78         FILL_LOG_ELEMENT(LOG_ID_DATA, TEMPERATURE_BASE_DATA_SET, 0, 25),
79         FILL_LOG_ELEMENT(LOG_ID_DATA, ROTATION_VECTOR_BASE_DATA_SET, 0, 25),
80 };
81
82 typedef unordered_map<unsigned int, log_attr* > log_map;
83 log_map g_log_maps[LOG_ID_END];
84
85 extern void init_client(void);
86 static void init_log_maps(void);
87
88
89 class initiator
90 {
91 public:
92         initiator()
93         {
94                 init_log_maps();
95                 init_client();
96         }
97 } g_initiatior;
98
99 static void init_log_maps(void)
100 {
101         int cnt;
102
103         cnt = sizeof(g_log_elements) / sizeof(g_log_elements[0]);
104
105         for (int i = 0; i < cnt; ++i) {
106                 g_log_maps[g_log_elements[i].id][g_log_elements[i].type] = &g_log_elements[i].log_attr;
107         }
108
109 }
110
111
112 const char* get_log_element_name(log_id id, unsigned int type)
113 {
114         const char* p_unknown = "UNKNOWN";
115
116         auto iter = g_log_maps[id].find(type);
117
118         if (iter == g_log_maps[id].end()) {
119                 INFO("Unknown type value: 0x%x", type);
120                 return p_unknown;
121         }
122
123         return iter->second->name;
124 }
125
126 const char* get_sensor_name(sensor_id_t sensor_id)
127 {
128         const int SENSOR_TYPE_MASK = 0x0000FFFF;
129
130         sensor_type_t sensor_type = (sensor_type_t) (sensor_id & SENSOR_TYPE_MASK);
131
132         return get_log_element_name(LOG_ID_SENSOR_TYPE, sensor_type);
133 }
134
135 const char* get_event_name(unsigned int event_type)
136 {
137         return get_log_element_name(LOG_ID_EVENT, event_type);
138 }
139
140
141 const char* get_data_name(unsigned int data_id)
142 {
143         return get_log_element_name(LOG_ID_DATA, data_id);
144 }
145
146 bool is_one_shot_event(unsigned int event_type)
147 {
148         return false;
149 }
150
151 bool is_ontime_event(unsigned int event_type)
152 {
153         switch (event_type ) {
154         case ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME:
155         case PROXIMITY_EVENT_STATE_REPORT_ON_TIME:
156         case GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME:
157         case LIGHT_EVENT_LEVEL_DATA_REPORT_ON_TIME:
158         case GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME:
159         case LIGHT_EVENT_LUX_DATA_REPORT_ON_TIME:
160         case PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME:
161         case GRAVITY_EVENT_RAW_DATA_REPORT_ON_TIME:
162         case LINEAR_ACCEL_EVENT_RAW_DATA_REPORT_ON_TIME:
163         case ORIENTATION_EVENT_RAW_DATA_REPORT_ON_TIME:
164         case PRESSURE_EVENT_RAW_DATA_REPORT_ON_TIME:
165                 return true;
166                 break;
167         }
168
169         return false;
170 }
171
172 bool is_panning_event(unsigned int event_type)
173 {
174         return false;
175 }
176
177 bool is_single_state_event(unsigned int event_type)
178 {
179         switch (event_type) {
180         case GEOMAGNETIC_EVENT_CALIBRATION_NEEDED:
181         case LIGHT_EVENT_CHANGE_LEVEL:
182         case PROXIMITY_EVENT_CHANGE_STATE:
183                 return true;
184                 break;
185         }
186
187         return false;
188 }
189
190 unsigned int get_calibration_event_type(unsigned int event_type)
191 {
192         sensor_type_t sensor;
193
194         sensor = (sensor_type_t)(event_type >> SENSOR_TYPE_SHIFT);
195
196         switch (sensor) {
197         case GEOMAGNETIC_SENSOR:
198                 return GEOMAGNETIC_EVENT_CALIBRATION_NEEDED;
199         case ORIENTATION_SENSOR:
200                 return ORIENTATION_EVENT_CALIBRATION_NEEDED;
201         default:
202                 return 0;
203         }
204 }
205
206 unsigned long long get_timestamp(void)
207 {
208         struct timespec t;
209         clock_gettime(CLOCK_MONOTONIC, &t);
210         return ((unsigned long long)(t.tv_sec)*1000000000LL + t.tv_nsec) / 1000;
211 }
212
213 void print_event_occurrence_log(csensor_handle_info &sensor_handle_info, const creg_event_info *event_info)
214 {
215         log_attr *log_attr;
216
217         auto iter = g_log_maps[LOG_ID_EVENT].find(event_info->type);
218
219         if (iter == g_log_maps[LOG_ID_EVENT].end())
220                 return;
221
222         log_attr = iter->second;
223
224         log_attr->cnt++;
225
226         if ((log_attr->cnt != 1) && ((log_attr->cnt % log_attr->print_per_cnt) != 0)) {
227                 return;
228         }
229
230         INFO("%s receives %s with %s[%d][state: %d, option: %d count: %d]", get_client_name(), log_attr->name,
231                         get_sensor_name(sensor_handle_info.m_sensor_id), sensor_handle_info.m_handle, sensor_handle_info.m_sensor_state,
232                         sensor_handle_info.m_sensor_option, log_attr->cnt);
233
234         INFO("0x%x(cb_event_type = %s, &user_data, client_data = 0x%x)\n", event_info->m_cb,
235                         log_attr->name, event_info->m_user_data);
236 }
237
238 /*
239  *      To prevent user mistakenly freeing sensor_info using sensor_t
240  */
241 static const int SENSOR_TO_SENSOR_INFO = 4;
242 static const int SENSOR_INFO_TO_SENSOR = -SENSOR_TO_SENSOR_INFO;
243
244 sensor_info *sensor_to_sensor_info(sensor_t sensor)
245 {
246         if (!sensor)
247                 return NULL;
248
249         sensor_info* info = (sensor_info *)((char *)sensor + SENSOR_TO_SENSOR_INFO);
250
251         return info;
252 }
253
254 sensor_t sensor_info_to_sensor(const sensor_info *info)
255 {
256         if (!info)
257                 return NULL;
258
259         sensor_t sensor = (sensor_t)((char *)info + SENSOR_INFO_TO_SENSOR);
260
261         return sensor;
262 }