2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (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://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <ErrorTypes.h>
22 #include <DBusClient.h>
23 #include <ProviderTypes.h>
24 #include <SensorRecorderTypes.h>
25 #include <ScopeMutex.h>
30 #include "include/sensor_log.h"
32 static ctx::DBusClient dbusClient;
33 static GMutex info_mutex;
35 static std::map<sensor_type_e, std::string> sensor_keys = {
36 {SENSOR_HRM, SUBJ_SENSOR_HEART_RATE},
37 {SENSOR_HUMAN_PEDOMETER, SUBJ_SENSOR_PEDOMETER},
38 {SENSOR_HUMAN_SLEEP_MONITOR, SUBJ_SENSOR_SLEEP_MONITOR},
39 {SENSOR_PRESSURE, SUBJ_SENSOR_PRESSURE},
42 static std::map<sensor_recorder_option_e, std::string> option_keys = {
43 {SENSOR_RECORDER_OPTION_RETENTION_PERIOD, KEY_RETENTION},
44 {SENSOR_RECORDER_OPTION_INTERVAL, KEY_INTERVAL}
47 static std::map<sensor_recorder_query_e, std::string> query_keys = {
48 {SENSOR_RECORDER_QUERY_START_TIME, KEY_START_TIME},
49 {SENSOR_RECORDER_QUERY_END_TIME, KEY_END_TIME},
50 {SENSOR_RECORDER_QUERY_ANCHOR_TIME, KEY_ANCHOR},
51 {SENSOR_RECORDER_QUERY_TIME_INTERVAL, KEY_INTERVAL},
54 static std::map<sensor_recorder_data_e, std::string> data_keys = {
55 {SENSOR_RECORDER_DATA_STEPS, KEY_STEPS},
56 {SENSOR_RECORDER_DATA_WALK_STEPS, KEY_WALK_STEPS},
57 {SENSOR_RECORDER_DATA_RUN_STEPS, KEY_RUN_STEPS},
58 {SENSOR_RECORDER_DATA_DISTANCE, KEY_DISTANCE},
59 {SENSOR_RECORDER_DATA_CALORIE, KEY_CALORIES},
60 {SENSOR_RECORDER_DATA_HEART_RATE, KEY_HEART_RATE},
61 {SENSOR_RECORDER_DATA_SLEEP_STATE, KEY_SLEEP_STATE},
62 {SENSOR_RECORDER_DATA_PRESSURE, KEY_PRESSURE},
63 {SENSOR_RECORDER_DATA_MAX_PRESSURE, KEY_MAX_PRESSURE},
64 {SENSOR_RECORDER_DATA_MIN_PRESSURE, KEY_MIN_PRESSURE},
65 {SENSOR_RECORDER_DATA_AVERAGE_PRESSURE, KEY_AVG_PRESSURE}
68 static sensor_error_e convert_error(int error)
72 case ERR_INVALID_PARAMETER:
73 case ERR_OUT_OF_MEMORY:
74 case ERR_PERMISSION_DENIED:
75 case ERR_NOT_SUPPORTED:
77 return (sensor_error_e)error;
78 case ERR_ALREADY_STARTED:
79 return SENSOR_ERROR_NOT_AVAILABLE;
83 return SENSOR_ERROR_OPERATION_FAILED;
93 sensor_recorder_data_cb cb;
97 class DBusListener : public ctx::IDBusClientListener {
99 void onPublish(std::string subject, int reqId, int error, ctx::Json event);
100 void setCallbackInfo(int reqid, callback_info *info);
103 std::map<int, std::shared_ptr<callback_info>> infos;
106 void DBusListener::onPublish(std::string subject, int reqId, int error, ctx::Json event)
113 ctx::ScopeMutex sm(&info_mutex);
114 if (infos.find(reqId) == infos.end())
118 ret = event.get(NULL, KEY_RESULT_SIZE, &size);
124 infos[reqId]->cb(infos[reqId]->type, (sensor_recorder_data_h)&data, 0, SENSOR_ERROR_NO_DATA, infos[reqId]->user_data);
130 for (int i = 0; i < size; ++i) {
132 ret = infos[reqId]->cb(infos[reqId]->type, (sensor_recorder_data_h)&data, (size - (i + 1)), convert_error(error), infos[reqId]->user_data);
139 _D("Succeeded to call DBusListener::onPublish() with reqId[%d]", reqId);
144 void DBusListener::setCallbackInfo(int reqId, callback_info *info)
146 infos[reqId] = std::shared_ptr<callback_info>(info);
149 int sensor_recorder_is_supported(sensor_type_e type, bool *supported)
151 int ret = SENSOR_ERROR_NONE;
153 if (type <= SENSOR_ALL)
154 return SENSOR_ERROR_INVALID_PARAMETER;
156 return SENSOR_ERROR_INVALID_PARAMETER;
158 ret = dbusClient.isSupported(sensor_keys[type]);
162 else if (ret == ERR_NOT_SUPPORTED)
165 return convert_error(ret);
167 _D("sensor[%#x] is %s", type, (*supported ? "supported" : "not supported"));
169 return SENSOR_ERROR_NONE;
172 int sensor_recorder_start(sensor_type_e type, sensor_recorder_option_h option)
174 int ret = SENSOR_ERROR_NONE;
177 if (type <= SENSOR_ALL)
178 return SENSOR_ERROR_INVALID_PARAMETER;
180 operation.set(NULL, KEY_OPERATION, VAL_START);
183 operation.set(NULL, KEY_OPTION, *static_cast<ctx::Json *>(option));
185 ret = dbusClient.write(sensor_keys[type], operation.str(), NULL);
187 _D("Started to record sensor[%#x] data with operation : %s", type, operation.str().c_str());
189 return convert_error(ret);
192 int sensor_recorder_stop(sensor_type_e type)
194 int ret = SENSOR_ERROR_NONE;
197 if (type <= SENSOR_ALL)
198 return SENSOR_ERROR_INVALID_PARAMETER;
200 operation.set(NULL, KEY_OPERATION, VAL_STOP);
202 ret = dbusClient.write(sensor_keys[type], operation.str(), NULL);
204 _D("Stopped to record sensor[%#x] data with operation : %s", type, operation.str().c_str());
206 return convert_error(ret);
209 int sensor_recorder_create_option(sensor_recorder_option_h *option)
212 return SENSOR_ERROR_INVALID_PARAMETER;
214 *option = static_cast<sensor_recorder_option_h>(new(std::nothrow) ctx::Json());
217 _D("Failed to create option handle");
218 return SENSOR_ERROR_OUT_OF_MEMORY;
221 _D("Created option handle[%p]", *option);
223 return SENSOR_ERROR_NONE;
226 int sensor_recorder_destroy_option(sensor_recorder_option_h option)
229 return SENSOR_ERROR_INVALID_PARAMETER;
231 delete static_cast<ctx::Json *>(option);
234 _D("Destroyed option handle");
236 return SENSOR_ERROR_NONE;
239 int sensor_recorder_option_set_int(sensor_recorder_option_h option, sensor_recorder_option_e attribute, int value)
242 return SENSOR_ERROR_INVALID_PARAMETER;
244 return SENSOR_ERROR_INVALID_PARAMETER;
245 if (option_keys.find(attribute) == option_keys.end())
246 return SENSOR_ERROR_INVALID_PARAMETER;
248 static_cast<ctx::Json *>(option)->set(NULL, option_keys[attribute].c_str(), value);
250 _D("Set attribute[%d] with value[%d] to option[%p]", attribute, value, option);
252 return SENSOR_ERROR_NONE;
255 int sensor_recorder_create_query(sensor_recorder_query_h *query)
258 return SENSOR_ERROR_INVALID_PARAMETER;
260 *query = static_cast<sensor_recorder_query_h>(new(std::nothrow) ctx::Json());
263 _D("Failed to create query handle");
264 return SENSOR_ERROR_OUT_OF_MEMORY;
267 _D("Created query handle[%p]", *query);
269 return SENSOR_ERROR_NONE;
272 int sensor_recorder_destroy_query(sensor_recorder_query_h query)
275 return SENSOR_ERROR_INVALID_PARAMETER;
277 delete static_cast<ctx::Json *>(query);
280 _D("Destroyed query handle");
282 return SENSOR_ERROR_NONE;
285 int sensor_recorder_query_set_int(sensor_recorder_query_h query, sensor_recorder_query_e attribute, int value)
288 return SENSOR_ERROR_INVALID_PARAMETER;
290 return SENSOR_ERROR_INVALID_PARAMETER;
291 if (query_keys.find(attribute) == query_keys.end())
292 return SENSOR_ERROR_INVALID_PARAMETER;
293 if (attribute == SENSOR_RECORDER_QUERY_TIME_INTERVAL && value < 0)
294 return SENSOR_ERROR_INVALID_PARAMETER;
296 static_cast<ctx::Json *>(query)->set(NULL, query_keys[attribute].c_str(), (int)value);
298 _D("Set attribute[%d] with value[%d] to query[%p]", attribute, value, query);
300 return SENSOR_ERROR_NONE;
303 int sensor_recorder_query_set_time(sensor_recorder_query_h query, sensor_recorder_query_e attribute, time_t t)
305 ctx::Json *time_query = static_cast<ctx::Json *>(query);
310 return SENSOR_ERROR_INVALID_PARAMETER;
312 return SENSOR_ERROR_INVALID_PARAMETER;
313 if (query_keys.find(attribute) == query_keys.end())
314 return SENSOR_ERROR_INVALID_PARAMETER;
316 return SENSOR_ERROR_INVALID_PARAMETER;
317 if (time_query->get(NULL, KEY_END_TIME, &endTime))
318 if (attribute == SENSOR_RECORDER_QUERY_START_TIME && t >= endTime)
319 return SENSOR_ERROR_INVALID_PARAMETER;
320 if (time_query->get(NULL, KEY_START_TIME, &startTime))
321 if (attribute == SENSOR_RECORDER_QUERY_END_TIME && t <= startTime)
322 return SENSOR_ERROR_INVALID_PARAMETER;
324 time_query->set(NULL, query_keys[attribute].c_str(), (int64_t)t);
326 _D("Set attribute[%d] with value[%ld] to query[%p]", attribute, t, query);
328 return SENSOR_ERROR_NONE;
331 int sensor_recorder_read(sensor_type_e type, sensor_recorder_query_h query, sensor_recorder_data_cb cb, void *user_data)
333 int ret = SENSOR_ERROR_NONE;
335 callback_info *info = NULL;
337 if (type <= SENSOR_ALL)
338 return SENSOR_ERROR_INVALID_PARAMETER;
340 return SENSOR_ERROR_INVALID_PARAMETER;
342 /* Lazy creating listener */
343 static DBusListener listener;
345 dbusClient.addListener(sensor_keys[type], &listener);
348 ctx::ScopeMutex sm(&info_mutex);
350 ret = dbusClient.read(sensor_keys[type], *static_cast<ctx::Json *>(query), &reqId, NULL);
352 if (ret != SENSOR_ERROR_NONE)
353 return convert_error(ret);
355 info = new(std::nothrow) callback_info();
357 _D("Failed to create callback info");
358 return SENSOR_ERROR_OUT_OF_MEMORY;
363 info->user_data = user_data;
365 listener.setCallbackInfo(reqId, info);
368 _D("succeeded to read sensor[%#x] data with query : %s", type, static_cast<ctx::Json *>(query)->str().c_str());
370 return SENSOR_ERROR_NONE;
373 int sensor_recorder_read_sync(sensor_type_e type, sensor_recorder_query_h query, sensor_recorder_data_cb cb, void *user_data)
375 int ret = SENSOR_ERROR_NONE;
381 if (type <= SENSOR_ALL)
382 return SENSOR_ERROR_INVALID_PARAMETER;
384 return SENSOR_ERROR_INVALID_PARAMETER;
386 ret = dbusClient.readSync(sensor_keys[type], *static_cast<ctx::Json *>(query), &reqId, &output);
389 return convert_error(ret);
391 ret = output.get(NULL, KEY_RESULT_SIZE, &size);
394 return SENSOR_ERROR_INVALID_PARAMETER;
396 return SENSOR_ERROR_NO_DATA;
400 for (int i = 0; i < size; ++i) {
402 ret = cb(type, (sensor_recorder_data_h)&data, (size - (i + 1)), SENSOR_ERROR_NONE, user_data);
408 _D("succeeded to read sensor[%#x] data with query : %s", type, static_cast<ctx::Json *>(query)->str().c_str());
410 return SENSOR_ERROR_NONE;
413 int sensor_recorder_data_get_time(sensor_recorder_data_h data, time_t *start_time, time_t *end_time)
415 int64_t start = 0, end = 0;
416 tuple_info *tuple = NULL;
417 ctx::Json *json = NULL;
419 if (!data || !start_time || !end_time)
420 return SENSOR_ERROR_INVALID_PARAMETER;
422 tuple = static_cast<tuple_info *>(data);
426 return SENSOR_ERROR_INVALID_PARAMETER;
428 if (!json->getAt(NULL, KEY_START_TIME, tuple->index, &start))
429 return SENSOR_ERROR_INVALID_PARAMETER;
431 if (!json->getAt(NULL, KEY_END_TIME, tuple->index, &end))
432 return SENSOR_ERROR_INVALID_PARAMETER;
434 *start_time = static_cast<time_t>(start / 1000);
435 *end_time = static_cast<time_t>(end / 1000);
437 _D("Get start_time[%ld] and end_time[%ld] from data[%p]", *start_time, *end_time, data);
439 return SENSOR_ERROR_NONE;
442 int sensor_recorder_data_get_int(sensor_recorder_data_h data, sensor_recorder_data_e key, int *value)
444 tuple_info *tuple = NULL;
445 ctx::Json *json = NULL;
448 return SENSOR_ERROR_INVALID_PARAMETER;
450 return SENSOR_ERROR_INVALID_PARAMETER;
451 if (data_keys.find(key) == data_keys.end())
452 return SENSOR_ERROR_INVALID_PARAMETER;
454 tuple = static_cast<tuple_info *>(data);
458 return SENSOR_ERROR_INVALID_PARAMETER;
460 if (!json->getAt(NULL, data_keys[key].c_str(), tuple->index, value))
461 return SENSOR_ERROR_INVALID_PARAMETER;
463 _D("Get value[%d] from data[%p]", *value, data);
465 return SENSOR_ERROR_NONE;
468 int sensor_recorder_data_get_double(sensor_recorder_data_h data, sensor_recorder_data_e key, double *value)
470 tuple_info *tuple = NULL;
471 ctx::Json *json = NULL;
474 return SENSOR_ERROR_INVALID_PARAMETER;
476 return SENSOR_ERROR_INVALID_PARAMETER;
477 if (data_keys.find(key) == data_keys.end())
478 return SENSOR_ERROR_INVALID_PARAMETER;
480 tuple = static_cast<tuple_info *>(data);
484 return SENSOR_ERROR_INVALID_PARAMETER;
486 if (!json->getAt(NULL, data_keys[key].c_str(), tuple->index, value))
487 return SENSOR_ERROR_INVALID_PARAMETER;
489 _D("Get value[%f] from data[%p]", *value, data);
491 return SENSOR_ERROR_NONE;