4 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 #include "sensor_utils.h"
25 #include <sys/types.h>
31 #include <sensor_log.h>
32 #include <sensor_types.h>
33 #include <sensor_types_private.h>
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"},
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"},
70 {EXERCISE_WALKING_SENSOR, "http://tizen.org/sensor/healthinfo/exercise.walking"},
71 {EXERCISE_RUNNING_SENSOR, "http://tizen.org/sensor/healthinfo/exercise.running"},
72 {EXERCISE_HIKING_SENSOR, "http://tizen.org/sensor/healthinfo/exercise.hiking"},
73 {EXERCISE_CYCLING_SENSOR, "http://tizen.org/sensor/healthinfo/exercise.cycling"},
74 {EXERCISE_ELLIPTICAL_SENSOR, "http://tizen.org/sensor/healthinfo/exercise.elliptical"},
75 {EXERCISE_INDOOR_CYCLING_SENSOR, "http://tizen.org/sensor/healthinfo/exercise.indoor_cycling"},
76 {EXERCISE_ROWING_SENSOR, "http://tizen.org/sensor/healthinfo/exercise.rowing"},
77 {EXERCISE_STEPPER_SENSOR, "http://tizen.org/sensor/healthinfo/exercise.stepper"},
79 {EXTERNAL_EXERCISE_SENSOR, "http://tizen.org/sensor/healthinfo/external_exercise"},
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"},
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"},
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/location/gps_batch"},
95 {HRM_CTRL_SENSOR, "http://tizen.org/sensor/general/hrm_ctrl"},
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/healthinfo/resting_hr"},
101 {STEP_LEVEL_MONITOR_SENSOR, "http://tizen.org/sensor/healthinfo/step_level_monitor"},
102 {EXERCISE_STANDALONE_SENSOR, "http://tizen.org/sensor/healthinfo/exercise_standalone"},
103 {EXERCISE_HR_SENSOR, "http://tizen.org/sensor/healthinfo/exercise_hr"},
104 {WORKOUT_SENSOR, "http://tizen.org/sensor/healthinfo/workout"},
105 {CYCLE_MONITOR_SENSOR, "http://tizen.org/sensor/healthinfo/cycle_monitor"},
106 {STAIR_TRACKER_SENSOR, "http://tizen.org/sensor/healthinfo/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/healthinfo/hr_calorie"},
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/pedometer"},
118 {FLAT_SENSOR, "http://tizen.org/sensor/general/flat"},
119 {HRM_RAW_SENSOR, "http://tizen.org/sensor/healthinfo/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/gsr"},
123 {SIMSENSE_SENSOR, "http://tizen.org/sensor/healthinfo/simsense"},
124 {PPG_SENSOR, "http://tizen.org/sensor/healthinfo/ppg"},
127 const char *sensor::utils::get_uri(sensor_type_t type)
129 auto it = types.find(type);
130 if (it == types.end())
131 return "Unknown Type";
135 const char *sensor::utils::get_privilege(std::string uri)
137 std::size_t start = 0;
138 std::size_t end = uri.length();
139 std::size_t size = uri.size();
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, "");
147 end = uri.find(URI_DELIMITER, start + 1);
148 retv_if(end == std::string::npos, "");
150 size = end - (start + 1);
152 if (uri.substr(start + 1, size) == PRIVILEGE_HEALTHINFO_STR)
153 return PRIVILEGE_HEALTHINFO_URI;
154 else if (uri.substr(start + 1, size) == PRIVILEGE_LOCATION_STR)
155 return PRIVILEGE_LOCATION_URI;
160 static void init_types(std::map<std::string, sensor_type_t> &sensor_types)
162 ret_if(!sensor_types.empty());
164 for (auto it = types.begin(); it != types.end(); ++it) {
165 std::string uri(it->second);
166 std::size_t found = uri.find_last_of("/");
167 std::size_t len = uri.length() - (found + 1);
169 sensor_types.emplace(uri.substr(found + 1, len), it->first);
173 sensor_type_t sensor::utils::get_type(std::string uri)
175 static std::map<std::string, sensor_type_t> sensor_types;
176 init_types(sensor_types);
178 std::size_t start = 0;
179 std::size_t end = uri.length();
180 std::size_t size = uri.size();
182 for (int i = 0; i < URI_SENSOR_TYPE_INDEX; ++i) {
183 retv_if(start >= uri.length(), UNKNOWN_SENSOR);
184 start = uri.find(URI_DELIMITER, start + 1);
185 retv_if(start == std::string::npos, UNKNOWN_SENSOR);
188 end = uri.find(URI_DELIMITER, start + 1);
189 retv_if(end == std::string::npos, UNKNOWN_SENSOR);
191 size = end - (start + 1);
193 auto it = sensor_types.find(uri.substr(start + 1, size));
194 retv_if(it == sensor_types.end(), UNKNOWN_SENSOR);
199 unsigned long long sensor::utils::get_timestamp(void)
202 clock_gettime(CLOCK_MONOTONIC, &t);
203 return ((unsigned long long)(t.tv_sec)*1000000000LL + t.tv_nsec) / 1000;
206 unsigned long long sensor::utils::get_timestamp(timeval *t)
211 return ((unsigned long long)(t->tv_sec)*1000000LL +t->tv_usec);
215 bool sensor::utils::get_proc_name(pid_t pid, char *process_name)
219 char filename[PATH_MAX];
221 sprintf(filename, "/proc/%d/stat", pid);
222 fp = fopen(filename, "r");
227 if (fscanf(fp, "%*s (%[^)]", buf) < 1) {
232 strncpy(process_name, buf, NAME_MAX-1);
233 process_name[NAME_MAX-1] = '\0';
239 bool sensor::utils::get_proc_name(pid_t pid, char *process_name)
243 if (snprintf(buf, sizeof(buf), "%d process", pid) < 1) {
247 strncpy(process_name, buf, NAME_MAX-1);
248 process_name[NAME_MAX-1] = '\0';
254 const char* sensor::utils::get_client_name(void)
256 const int pid_string_size = 10;
257 static pid_t pid = -1;
258 static char client_name[NAME_MAX + pid_string_size];
260 char proc_name[NAME_MAX];
265 get_proc_name(pid, proc_name);
266 snprintf(client_name, sizeof(client_name), "%s(%d)", proc_name, pid);
272 std::vector<std::string> sensor::utils::tokenize(const std::string &in, const char *delim)
274 std::vector<std::string> tokens;
275 char *input = g_strdup(in.c_str());
278 char *token = strtok_r(input, delim, &save);
280 while (token != NULL) {
281 tokens.push_back(token);
282 token = strtok_r(NULL, delim, &save);