sensord: specify the appropriate sensor type based on URI
[platform/core/system/sensord.git] / src / shared / sensor_utils.cpp
1 /*
2  * sensord
3  *
4  * Copyright (c) 2017 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_utils.h"
21
22 #include <glib.h>
23 #include <unistd.h>
24 #include <fcntl.h>
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #include <string.h>
28 #include <stddef.h>
29 #include <map>
30
31 #include <sensor_log.h>
32 #include <sensor_types.h>
33 #include <sensor_types_private.h>
34
35 #ifndef PATH_MAX
36 #define PATH_MAX 256
37 #endif
38
39 /* TODO: move and define string type to sensor_type.h */
40 static std::map<sensor_type_t, const char *> types = {
41         {UNKNOWN_SENSOR,                 "http://tizen.org/sensor/general/unknown"},
42         {ALL_SENSOR,                     "http://tizen.org/sensor/general/all"},
43         {ACCELEROMETER_SENSOR,           "http://tizen.org/sensor/general/accelerometer"},
44         {GRAVITY_SENSOR,                 "http://tizen.org/sensor/general/gravity"},
45         {LINEAR_ACCEL_SENSOR,            "http://tizen.org/sensor/general/linear_acceleration"},
46         {GEOMAGNETIC_SENSOR,             "http://tizen.org/sensor/general/magnetic"},
47         {ROTATION_VECTOR_SENSOR,         "http://tizen.org/sensor/general/rotation_vector"},
48         {ORIENTATION_SENSOR,             "http://tizen.org/sensor/general/orientation"},
49         {GYROSCOPE_SENSOR,               "http://tizen.org/sensor/general/gyroscope"},
50         {LIGHT_SENSOR,                   "http://tizen.org/sensor/general/light"},
51         {PROXIMITY_SENSOR,               "http://tizen.org/sensor/general/proximity"},
52         {PRESSURE_SENSOR,                "http://tizen.org/sensor/general/pressure"},
53         {ULTRAVIOLET_SENSOR,             "http://tizen.org/sensor/general/ultraviolet"},
54         {TEMPERATURE_SENSOR,             "http://tizen.org/sensor/general/temperature"},
55         {HUMIDITY_SENSOR,                "http://tizen.org/sensor/general/humidity"},
56         {HRM_SENSOR,                     "http://tizen.org/sensor/healthinfo/heart_rate_monitor"},
57         {HRM_LED_GREEN_SENSOR,           "http://tizen.org/sensor/healthinfo/heart_rate_monitor.led_green"},
58         {HRM_LED_IR_SENSOR,              "http://tizen.org/sensor/healthinfo/heart_rate_monitor.led_ir"},
59         {HRM_LED_RED_SENSOR,             "http://tizen.org/sensor/healthinfo/heart_rate_monitor.led_red"},
60         {GYROSCOPE_UNCAL_SENSOR,         "http://tizen.org/sensor/general/gyroscope.uncalibrated"},
61         {GEOMAGNETIC_UNCAL_SENSOR,       "http://tizen.org/sensor/general/geomagnetic.uncalibrated"},
62         {GYROSCOPE_RV_SENSOR,            "http://tizen.org/sensor/general/gyroscope_rotation_vector"},
63         {GEOMAGNETIC_RV_SENSOR,          "http://tizen.org/sensor/general/geomagnetic_rotation_vector"},
64
65         {HUMAN_PEDOMETER_SENSOR,         "http://tizen.org/sensor/healthinfo/human_pedometer"},
66         {HUMAN_SLEEP_MONITOR_SENSOR,     "http://tizen.org/sensor/healthinfo/human_sleep_monitor"},
67         {HUMAN_SLEEP_DETECTOR_SENSOR,    "http://tizen.org/sensor/healthinfo/human_sleep_detector"},
68         {HUMAN_STRESS_MONITOR_SENSOR,    "http://tizen.org/sensor/healthinfo/human_stress_monitor"},
69
70         {EXERCISE_WALKING_SENSOR,        "http://tizen.org/sensor/general/exercise.walking"},
71         {EXERCISE_RUNNING_SENSOR,        "http://tizen.org/sensor/general/exercise.running"},
72         {EXERCISE_HIKING_SENSOR,         "http://tizen.org/sensor/general/exercise.hiking"},
73         {EXERCISE_CYCLING_SENSOR,        "http://tizen.org/sensor/general/exercise.cycling"},
74         {EXERCISE_ELLIPTICAL_SENSOR,     "http://tizen.org/sensor/general/exercise.elliptical"},
75         {EXERCISE_INDOOR_CYCLING_SENSOR, "http://tizen.org/sensor/general/exercise.indoor_cycling"},
76         {EXERCISE_ROWING_SENSOR,         "http://tizen.org/sensor/general/exercise.rowing"},
77         {EXERCISE_STEPPER_SENSOR,        "http://tizen.org/sensor/general/exercise.stepper"},
78
79         {EXTERNAL_EXERCISE_SENSOR,       "http://tizen.org/sensor/general/external_exercise"},
80
81         {FUSION_SENSOR,                  "http://tizen.org/sensor/general/fusion"},
82         {AUTO_ROTATION_SENSOR,           "http://tizen.org/sensor/general/auto_rotation"},
83         {AUTO_BRIGHTNESS_SENSOR,         "http://tizen.org/sensor/general/auto_brightness"},
84
85         {GESTURE_MOVEMENT_SENSOR,        "http://tizen.org/sensor/general/gesture_movement"},
86         {GESTURE_WRIST_UP_SENSOR,        "http://tizen.org/sensor/general/gesture_wrist_up"},
87         {GESTURE_WRIST_DOWN_SENSOR,      "http://tizen.org/sensor/general/gesture_wrist_down"},
88         {GESTURE_MOVEMENT_STATE_SENSOR,  "http://tizen.org/sensor/general/gesture_movement_state"},
89         {GESTURE_FACE_DOWN_SENSOR,       "http://tizen.org/sensor/general/gesture_face_down"},
90
91         {ACTIVITY_TRACKER_SENSOR,        "http://tizen.org/sensor/general/activity_tracker"},
92         {ACTIVITY_LEVEL_MONITOR_SENSOR,  "http://tizen.org/sensor/general/activity_level_monitor"},
93         {GPS_BATCH_SENSOR,               "http://tizen.org/sensor/general/gps_batch"},
94
95         {HRM_CTRL_SENSOR,                "http://tizen.org/sensor/general/hrm_ctrl"},
96
97         {WEAR_STATUS_SENSOR,             "http://tizen.org/sensor/general/wear_status"},
98         {WEAR_ON_MONITOR_SENSOR,         "http://tizen.org/sensor/general/wear_on_monitor"},
99         {NO_MOVE_DETECTOR_SENSOR,        "http://tizen.org/sensor/general/no_move_detector"},
100         {RESTING_HR_SENSOR,              "http://tizen.org/sensor/general/resting_hr"},
101         {STEP_LEVEL_MONITOR_SENSOR,      "http://tizen.org/sensor/general/step_level_monitor"},
102         {EXERCISE_STANDALONE_SENSOR,     "http://tizen.org/sensor/general/exercise_standalone"},
103         {EXERCISE_HR_SENSOR,             "http://tizen.org/sensor/healthinfo/general/exercise_hr"},
104         {WORKOUT_SENSOR,                 "http://tizen.org/sensor/general/workout"},
105         {CYCLE_MONITOR_SENSOR,           "http://tizen.org/sensor/general/cycle_monitor"},
106         {STAIR_TRACKER_SENSOR,           "http://tizen.org/sensor/general/stair_tracker"},
107         {PRESSURE_INDICATOR_SENSOR,      "http://tizen.org/sensor/general/pressure_indicator"},
108         {PRESSURE_ALERT_SENSOR,          "http://tizen.org/sensor/general/pressure_alert"},
109         {HR_CALORIE_SENSOR,              "http://tizen.org/sensor/general/hr_calorie"},
110
111         {CONTEXT_SENSOR,                 "http://tizen.org/sensor/general/context"},
112         {MOTION_SENSOR,                  "http://tizen.org/sensor/general/motion"},
113         {PIR_SENSOR,                     "http://tizen.org/sensor/general/pir"},
114         {PIR_LONG_SENSOR,                "http://tizen.org/sensor/general/pir_long"},
115         {DUST_SENSOR,                    "http://tizen.org/sensor/general/dust"},
116         {THERMOMETER_SENSOR,             "http://tizen.org/sensor/general/thermometer"},
117         {PEDOMETER_SENSOR,               "http://tizen.org/sensor/healthinfo/general/pedometer"},
118         {FLAT_SENSOR,                    "http://tizen.org/sensor/general/flat"},
119         {HRM_RAW_SENSOR,                 "http://tizen.org/sensor/healthinfo/general/hrm_raw"},
120         {TILT_SENSOR,                    "http://tizen.org/sensor/general/tilt"},
121         {RV_RAW_SENSOR,                  "http://tizen.org/sensor/general/rv_raw"},
122         {GSR_SENSOR,                     "http://tizen.org/sensor/healthinfo/general/gsr"},
123         {SIMSENSE_SENSOR,                "http://tizen.org/sensor/general/simsense"},
124         {PPG_SENSOR,                     "http://tizen.org/sensor/healthinfo/general/ppg"},
125 };
126
127 const char *sensor::utils::get_uri(sensor_type_t type)
128 {
129         auto it = types.find(type);
130         if (it == types.end())
131                 return "Unknown Type";
132         return it->second;
133 }
134
135 const char *sensor::utils::get_privilege(std::string uri)
136 {
137         std::size_t start = 0;
138         std::size_t end = uri.length();
139         std::size_t size = uri.size();
140
141         for (int i = 0; i < URI_PRIV_INDEX; ++i) {
142                 retv_if(start >= uri.length(), "");
143                 start = uri.find(URI_DELIMITER, start + 1);
144                 retv_if(start == std::string::npos, "");
145         }
146
147         end = uri.find(URI_DELIMITER, start + 1);
148         retv_if(end == std::string::npos, "");
149
150         size = end - (start + 1);
151
152         if (uri.substr(start + 1, size) == PRIVILEGE_HEALTHINFO_STR)
153                 return PRIVILEGE_HEALTHINFO_URI;
154
155         return "";
156 }
157
158 static void init_types(std::map<std::string, sensor_type_t> &sensor_types)
159 {
160         ret_if(!sensor_types.empty());
161
162         for (auto it = types.begin(); it != types.end(); ++it) {
163                 std::string uri(it->second);
164                 std::size_t found = uri.find_last_of("/");
165                 std::size_t len = uri.length() - (found + 1);
166
167                 sensor_types.emplace(uri.substr(found + 1, len), it->first);
168         }
169 }
170
171 sensor_type_t sensor::utils::get_type(std::string uri)
172 {
173         static std::map<std::string, sensor_type_t> sensor_types;
174         init_types(sensor_types);
175
176         std::size_t start = 0;
177         std::size_t end = uri.length();
178         std::size_t size = uri.size();
179
180         for (int i = 0; i < URI_SENSOR_TYPE_INDEX; ++i) {
181                 retv_if(start >= uri.length(), UNKNOWN_SENSOR);
182                 start = uri.find(URI_DELIMITER, start + 1);
183                 retv_if(start == std::string::npos, UNKNOWN_SENSOR);
184         }
185
186         end = uri.find(URI_DELIMITER, start + 1);
187         retv_if(end == std::string::npos, UNKNOWN_SENSOR);
188
189         size = end - (start + 1);
190
191         auto it = sensor_types.find(uri.substr(start + 1, size));
192         retv_if(it == sensor_types.end(), UNKNOWN_SENSOR);
193
194         return it->second;
195 }
196
197 unsigned long long sensor::utils::get_timestamp(void)
198 {
199         struct timespec t;
200         clock_gettime(CLOCK_MONOTONIC, &t);
201         return ((unsigned long long)(t.tv_sec)*1000000000LL + t.tv_nsec) / 1000;
202 }
203
204 unsigned long long sensor::utils::get_timestamp(timeval *t)
205 {
206         if (!t)
207                 return 0;
208
209         return ((unsigned long long)(t->tv_sec)*1000000LL +t->tv_usec);
210 }
211
212 #ifdef _DEBUG
213 bool sensor::utils::get_proc_name(pid_t pid, char *process_name)
214 {
215         FILE *fp;
216         char buf[NAME_MAX];
217         char filename[PATH_MAX];
218
219         sprintf(filename, "/proc/%d/stat", pid);
220         fp = fopen(filename, "r");
221
222         if (fp == NULL)
223                 return false;
224
225         if (fscanf(fp, "%*s (%[^)]", buf) < 1) {
226                 fclose(fp);
227                 return false;
228         }
229
230         strncpy(process_name, buf, NAME_MAX-1);
231         process_name[NAME_MAX-1] = '\0';
232         fclose(fp);
233
234         return true;
235 }
236 #else
237 bool sensor::utils::get_proc_name(pid_t pid, char *process_name)
238 {
239         char buf[NAME_MAX];
240
241         if (snprintf(buf, sizeof(buf), "%d process", pid) < 1) {
242                 return false;
243         }
244
245         strncpy(process_name, buf, NAME_MAX-1);
246         process_name[NAME_MAX-1] = '\0';
247
248         return true;
249 }
250 #endif
251
252 const char* sensor::utils::get_client_name(void)
253 {
254         const int pid_string_size = 10;
255         static pid_t pid = -1;
256         static char client_name[NAME_MAX + pid_string_size];
257
258         char proc_name[NAME_MAX];
259
260         if (pid == -1)
261         {
262                 pid = getpid();
263                 get_proc_name(pid, proc_name);
264                 snprintf(client_name, sizeof(client_name), "%s(%d)", proc_name, pid);
265         }
266
267         return client_name;
268 }
269
270 std::vector<std::string> sensor::utils::tokenize(const std::string &in, const char *delim)
271 {
272         std::vector<std::string> tokens;
273         char *input = g_strdup(in.c_str());
274
275         char *save = NULL;
276         char *token = strtok_r(input, delim, &save);
277
278         while (token != NULL) {
279                 tokens.push_back(token);
280                 token = strtok_r(NULL, delim, &save);
281         }
282
283         g_free(input);
284         return tokens;
285 }