2 * Copyright (c) 2017 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.
18 #include <sensor_private.h>
19 #include <sensor_internal.h>
23 #include "include/sensor_log.h"
25 #define RETV_IF(expr, val) \
26 do { if (expr) { return (val); } } while (0)
28 typedef struct _sensor_provider_s {
29 sensord_provider_h sensor;
30 sensor_provider_start_cb start_cb;
31 sensor_provider_stop_cb stop_cb;
32 sensor_provider_interval_changed_cb interval_cb;
33 void *start_user_data;
35 void *interval_user_data;
36 } sensor_provider_handle;
38 int sensor_create_provider(const char *uri, sensor_provider_h *provider)
40 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
42 *provider = new(std::nothrow) sensor_provider_handle();
43 RETV_IF(!*provider, SENSOR_ERROR_OUT_OF_MEMORY);
45 (*provider)->sensor = NULL;
46 (*provider)->stop_cb = NULL;
47 (*provider)->interval_cb = NULL;
48 (*provider)->start_cb = NULL;
49 (*provider)->start_user_data = NULL;
50 (*provider)->stop_user_data = NULL;
51 (*provider)->interval_user_data = NULL;
53 return sensord_create_provider(uri, &(*provider)->sensor);
56 int sensor_add_provider(sensor_provider_h provider)
58 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
61 result = sensord_add_provider(provider->sensor);
62 RETV_IF(result == -EINVAL, SENSOR_ERROR_INVALID_PARAMETER);
63 RETV_IF(result == -EACCES, SENSOR_ERROR_PERMISSION_DENIED);
64 RETV_IF(result < 0, SENSOR_ERROR_OPERATION_FAILED);
66 return SENSOR_ERROR_NONE;
69 int sensor_remove_provider(sensor_provider_h provider)
71 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
74 result = sensord_remove_provider(provider->sensor);
75 RETV_IF(result == -EINVAL, SENSOR_ERROR_INVALID_PARAMETER);
76 RETV_IF(result < 0, SENSOR_ERROR_OPERATION_FAILED);
78 return SENSOR_ERROR_NONE;
81 int sensor_destroy_provider(sensor_provider_h provider)
83 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
86 result = sensord_destroy_provider(provider->sensor);
88 if (result == SENSOR_ERROR_NONE)
94 int sensor_provider_set_name(sensor_provider_h provider, const char *name)
96 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
97 return sensord_provider_set_name(provider->sensor, name);
100 int sensor_provider_set_vendor(sensor_provider_h provider, const char *vendor)
102 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
103 return sensord_provider_set_vendor(provider->sensor, vendor);
106 int sensor_provider_set_range(sensor_provider_h provider, float min_range, float max_range)
108 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
109 return sensord_provider_set_range(provider->sensor, min_range, max_range);
112 int sensor_provider_set_resolution(sensor_provider_h provider, float resolution)
114 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
115 return sensord_provider_set_resolution(provider->sensor, resolution);
118 static void sensor_start_callback(sensord_provider_h provider, void *user_data)
120 sensor_provider_h p = (sensor_provider_h)user_data;
122 p->start_cb(p, p->start_user_data);
125 int sensor_provider_set_start_cb(sensor_provider_h provider,
126 sensor_provider_start_cb callback, void *user_data)
128 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
129 RETV_IF(!callback, SENSOR_ERROR_INVALID_PARAMETER);
131 provider->start_cb = callback;
132 provider->start_user_data = user_data;
134 return sensord_provider_set_start_cb(provider->sensor, sensor_start_callback, provider);
137 static void sensor_stop_callback(sensord_provider_h provider, void *user_data)
139 sensor_provider_h p = (sensor_provider_h)user_data;
141 p->stop_cb(p, p->stop_user_data);
144 int sensor_provider_set_stop_cb(sensor_provider_h provider,
145 sensor_provider_stop_cb callback, void *user_data)
147 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
148 RETV_IF(!callback, SENSOR_ERROR_INVALID_PARAMETER);
150 provider->stop_cb = callback;
151 provider->stop_user_data = user_data;
153 return sensord_provider_set_stop_cb(provider->sensor, sensor_stop_callback, provider);
156 static void sensor_interval_changed_callback(sensord_provider_h provider,
157 unsigned int interval_ms, void *user_data)
159 sensor_provider_h p = (sensor_provider_h)user_data;
161 p->interval_cb(p, interval_ms, p->interval_user_data);
164 int sensor_provider_set_interval_changed_cb(sensor_provider_h provider,
165 sensor_provider_interval_changed_cb callback, void *user_data)
167 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
168 RETV_IF(!callback, SENSOR_ERROR_INVALID_PARAMETER);
170 provider->interval_cb = callback;
171 provider->interval_user_data = user_data;
173 return sensord_provider_set_interval_changed_cb(provider->sensor,
174 sensor_interval_changed_callback, provider);
177 int sensor_provider_publish(sensor_provider_h provider, sensor_event_s event)
179 RETV_IF(!provider, SENSOR_ERROR_INVALID_PARAMETER);
183 memcpy(&data, &event, sizeof(data));
185 result = sensord_provider_publish(provider->sensor, data);
186 RETV_IF(result == -EINVAL, SENSOR_ERROR_INVALID_PARAMETER);
187 RETV_IF(result < 0, SENSOR_ERROR_OPERATION_FAILED);
189 return SENSOR_ERROR_NONE;