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_info.h"
22 #include <sensor_types.h>
23 #include <sensor_types_private.h>
24 #include <sensor_log.h>
30 #include "sensor_utils.h"
32 #define MIN_RANGE -FLT_MAX
33 #define MAX_RANGE FLT_MAX
35 using namespace sensor;
37 sensor_info::sensor_info()
38 : m_type(UNKNOWN_SENSOR)
39 , m_uri(SENSOR_UNKNOWN_NAME)
40 , m_model(SENSOR_UNKNOWN_NAME)
41 , m_vendor(SENSOR_UNKNOWN_NAME)
46 , m_max_batch_count(0)
47 , m_wakeup_supported(false)
52 sensor_info::sensor_info(const sensor_info &info)
55 , m_model(info.m_model)
56 , m_vendor(info.m_vendor)
57 , m_min_range(info.m_min_range)
58 , m_max_range(info.m_max_range)
59 , m_resolution(info.m_resolution)
60 , m_min_interval(info.m_min_interval)
61 , m_max_batch_count(info.m_max_batch_count)
62 , m_wakeup_supported(info.m_wakeup_supported)
63 , m_privilege(info.m_privilege)
67 sensor_info::sensor_info(const sensor_info_t &info)
69 /* TODO: HAL should change name from single name to URI */
70 const char *type = sensor::utils::get_uri((sensor_type_t)info.type);
71 std::string uri(type);
72 uri.append("/").append(info.name);
74 set_type((sensor_type_t)info.type);
76 set_model(info.model_name);
77 set_vendor(info.vendor);
78 set_min_range(info.min_range);
79 set_max_range(info.max_range);
80 set_resolution(info.resolution);
81 set_min_interval(info.min_interval);
82 set_max_batch_count(info.max_batch_count);
83 set_wakeup_supported(info.wakeup_supported);
84 /* TODO: sensor_info_t should have privilege string */
88 sensor_info::sensor_info(const sensor_info2_t &info)
90 std::string uri(info.uri);
91 std::size_t found = uri.find_last_of("/\\");
95 set_model(uri.substr(found + 1, uri.length()).c_str());
96 set_vendor(info.vendor);
97 set_min_range(info.min_range);
98 set_max_range(info.max_range);
99 set_resolution(info.resolution);
100 set_min_interval(info.min_interval);
101 set_max_batch_count(info.max_batch_count);
102 set_wakeup_supported(info.wakeup_supported);
103 set_privilege(info.privilege);
106 sensor_type_t sensor_info::get_type(void)
111 std::string &sensor_info::get_uri(void)
116 std::string &sensor_info::get_model(void)
121 std::string &sensor_info::get_vendor(void)
126 float sensor_info::get_min_range(void)
131 float sensor_info::get_max_range(void)
136 float sensor_info::get_resolution(void)
141 int sensor_info::get_min_interval(void)
143 return m_min_interval;
146 int sensor_info::get_max_batch_count(void)
148 return m_max_batch_count;
151 bool sensor_info::is_wakeup_supported(void)
153 return m_wakeup_supported;
156 std::string &sensor_info::get_privilege(void)
161 void sensor_info::set_type(sensor_type_t type)
166 void sensor_info::set_uri(const char *name)
171 void sensor_info::set_model(const char *model)
176 void sensor_info::set_vendor(const char *vendor)
181 void sensor_info::set_min_range(float min_range)
183 m_min_range = min_range;
185 if (!std::isnormal(m_min_range))
186 m_min_range = 0; /* set value to 0 when the value is NaN, infinity, zero or subnormal */
187 if (m_min_range < MIN_RANGE)
188 m_min_range = MIN_RANGE;
189 if (m_min_range > MAX_RANGE)
190 m_min_range = MAX_RANGE;
193 void sensor_info::set_max_range(float max_range)
195 m_max_range = max_range;
197 if (!std::isnormal(m_max_range))
198 m_max_range = 0; /* set value to 0 when the value is NaN, infinity, zero or subnormal */
199 if (m_max_range < MIN_RANGE)
200 m_max_range = MIN_RANGE;
201 if (m_max_range > MAX_RANGE)
202 m_max_range = MAX_RANGE;
205 void sensor_info::set_resolution(float resolution)
207 m_resolution = resolution;
210 void sensor_info::set_min_interval(int min_interval)
212 m_min_interval = min_interval;
215 void sensor_info::set_max_batch_count(int max_batch_count)
217 m_max_batch_count = max_batch_count;
220 void sensor_info::set_wakeup_supported(bool supported)
222 m_wakeup_supported = supported;
225 void sensor_info::set_privilege(const char *privilege)
227 m_privilege = privilege;
230 void sensor_info::add_privilege(const char *privilege)
232 if (!m_privilege.empty())
233 m_privilege.append(PRIV_DELIMITER);
234 m_privilege.append(privilege);
237 void sensor_info::serialize(raw_data_t &data)
243 put(data, m_min_range);
244 put(data, m_max_range);
245 put(data, m_resolution);
246 put(data, m_min_interval);
247 put(data, m_max_batch_count);
248 put(data, m_wakeup_supported);
249 put(data, m_privilege);
252 void sensor_info::deserialize(const char *data, int data_len)
256 raw_data_t raw_data(&data[0], &data[data_len]);
257 auto it = raw_data.begin();
259 m_type = (sensor_type_t)type;
262 it = get(it, m_model);
263 it = get(it, m_vendor);
264 it = get(it, m_min_range);
265 it = get(it, m_max_range);
266 it = get(it, m_resolution);
267 it = get(it, m_min_interval);
268 it = get(it, m_max_batch_count);
269 it = get(it, m_wakeup_supported);
270 it = get(it, m_privilege);
273 void sensor_info::show(void)
275 _I("URI = %s", m_uri.c_str());
276 _I("Model = %s", m_model.c_str());
277 _I("Vendor = %s", m_vendor.c_str());
278 _I("Min_range = %f", m_min_range);
279 _I("Max_range = %f", m_max_range);
280 _I("Resolution = %f", m_resolution);
281 _I("Min_interval = %d", m_min_interval);
282 _I("Max_batch_count = %d", m_max_batch_count);
283 _I("Wakeup_supported = %d", m_wakeup_supported);
284 _I("Privilege = %s", m_privilege.c_str());
287 void sensor_info::clear(void)
289 m_type = UNKNOWN_SENSOR;
297 m_max_batch_count = 0;
298 m_wakeup_supported = false;
302 void sensor_info::put(raw_data_t &data, int value)
304 char buffer[sizeof(value)];
306 int *temp = reinterpret_cast<int *>(buffer);
309 copy(&buffer[0], &buffer[sizeof(buffer)], back_inserter(data));
312 void sensor_info::put(raw_data_t &data, unsigned int value)
314 char buffer[sizeof(value)];
316 unsigned int *temp = reinterpret_cast<unsigned int *>(buffer);
319 copy(&buffer[0], &buffer[sizeof(buffer)], back_inserter(data));
322 void sensor_info::put(raw_data_t &data, int64_t value)
324 char buffer[sizeof(value)];
326 int64_t *temp = reinterpret_cast<int64_t *>(buffer);
329 copy(&buffer[0], &buffer[sizeof(buffer)], back_inserter(data));
332 void sensor_info::put(raw_data_t &data, float value)
334 char buffer[sizeof(value)];
336 float *temp = reinterpret_cast<float *>(buffer);
339 copy(&buffer[0], &buffer[sizeof(buffer)], back_inserter(data));
342 void sensor_info::put(raw_data_t &data, std::string &value)
344 put(data, (int) value.size());
346 copy(value.begin(), value.end(), back_inserter(data));
349 void sensor_info::put(raw_data_t &data, bool value)
351 char buffer[sizeof(value)];
353 bool *temp = (bool *) buffer;
356 copy(&buffer[0], &buffer[sizeof(buffer)], back_inserter(data));
359 raw_data_iterator sensor_info::get(raw_data_iterator it, int &value)
361 copy(it, it + sizeof(value), (char*) &value);
363 return it + sizeof(value);
366 raw_data_iterator sensor_info::get(raw_data_iterator it, unsigned int &value)
368 copy(it, it + sizeof(value), (char*) &value);
370 return it + sizeof(value);
373 raw_data_iterator sensor_info::get(raw_data_iterator it, int64_t &value)
375 copy(it, it + sizeof(value), (char*) &value);
377 return it + sizeof(value);
380 raw_data_iterator sensor_info::get(raw_data_iterator it, float &value)
382 copy(it, it + sizeof(value), (char*) &value);
384 return it + sizeof(value);
387 raw_data_iterator sensor_info::get(raw_data_iterator it, std::string &value)
393 copy(it, it + len, back_inserter(value));
398 raw_data_iterator sensor_info::get(raw_data_iterator it, bool &value)
400 copy(it, it + sizeof(value), (char*) &value);
402 return it + sizeof(value);