2 * ultraviolet_sensor_hal
4 * Copyright (c) 2014 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.
22 #include <linux/input.h>
23 #include <csensor_config.h>
24 #include <ultraviolet_sensor_hal.h>
25 #include <sys/ioctl.h>
30 #define SENSOR_TYPE_ULTRAVIOLET "ULTRAVIOLET"
31 #define ELEMENT_NAME "NAME"
32 #define ELEMENT_VENDOR "VENDOR"
33 #define ELEMENT_RAW_DATA_UNIT "RAW_DATA_UNIT"
34 #define ELEMENT_MIN_RANGE "MIN_RANGE"
35 #define ELEMENT_MAX_RANGE "MAX_RANGE"
36 #define ATTR_VALUE "value"
40 ultraviolet_sensor_hal::ultraviolet_sensor_hal()
41 : m_polling_interval(POLL_1HZ_MS)
46 const string sensorhub_interval_node_name = "uv_poll_delay";
47 csensor_config &config = csensor_config::get_instance();
49 node_info_query query;
52 if (!find_model_id(SENSOR_TYPE_ULTRAVIOLET, m_model_id)) {
53 ERR("Failed to find model id");
58 query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name);
59 query.sensor_type = SENSOR_TYPE_ULTRAVIOLET;
60 query.key = "uv_sensor";
61 query.iio_enable_node_name = "uv_enable";
62 query.sensorhub_interval_node_name = sensorhub_interval_node_name;
64 if (!get_node_info(query, info)) {
65 ERR("Failed to get node info");
71 m_data_node = info.data_node_path;
72 m_enable_node = info.enable_node_path;
73 m_interval_node = info.interval_node_path;
75 if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_VENDOR, m_vendor)) {
76 ERR("[VENDOR] is empty\n");
80 INFO("m_vendor = %s", m_vendor.c_str());
82 if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_NAME, m_chip_name)) {
83 ERR("[NAME] is empty\n");
87 INFO("m_chip_name = %s\n",m_chip_name.c_str());
91 if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_MIN_RANGE, min_range)) {
92 ERR("[MIN_RANGE] is empty\n");
96 m_min_range = (float)min_range;
97 INFO("m_min_range = %f\n",m_min_range);
101 if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_MAX_RANGE, max_range)) {
102 ERR("[MAX_RANGE] is empty\n");
106 m_max_range = (float)max_range;
107 INFO("m_max_range = %f\n",m_max_range);
109 double raw_data_unit;
111 if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_RAW_DATA_UNIT, raw_data_unit)) {
112 ERR("[RAW_DATA_UNIT] is empty\n");
116 m_raw_data_unit = (float)(raw_data_unit);
118 if ((m_node_handle = open(m_data_node.c_str(),O_RDWR)) < 0) {
119 ERR("Failed to open handle(%d)", m_node_handle);
123 int clockId = CLOCK_MONOTONIC;
124 if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0)
125 ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str());
127 INFO("m_raw_data_unit = %f\n", m_raw_data_unit);
128 INFO("ultraviolet_sensor_hal is created!\n");
132 ultraviolet_sensor_hal::~ultraviolet_sensor_hal()
134 close(m_node_handle);
137 INFO("ultraviolet_sensor_hal is destroyed!\n");
140 string ultraviolet_sensor_hal::get_model_id(void)
146 sensor_type_t ultraviolet_sensor_hal::get_type(void)
148 return ULTRAVIOLET_SENSOR;
151 bool ultraviolet_sensor_hal::enable(void)
155 set_enable_node(m_enable_node, m_sensorhub_controlled, true, SENSORHUB_UV_SENSOR);
156 set_interval(m_polling_interval);
159 INFO("ultraviolet sensor real starting");
163 bool ultraviolet_sensor_hal::disable(void)
167 set_enable_node(m_enable_node, m_sensorhub_controlled, false, SENSORHUB_UV_SENSOR);
169 INFO("ultraviolet sensor real stopping");
173 bool ultraviolet_sensor_hal::set_interval(unsigned long val)
175 unsigned long long polling_interval_ns;
179 polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu);
181 if (!set_node_value(m_interval_node, polling_interval_ns)) {
182 ERR("Failed to set polling resource: %s\n", m_interval_node.c_str());
186 INFO("Interval is changed from %dms to %dms]", m_polling_interval, val);
187 m_polling_interval = val;
193 bool ultraviolet_sensor_hal::update_value(bool wait)
195 int ultraviolet_raw = -1;
196 bool ultraviolet = false;
197 int read_input_cnt = 0;
198 const int INPUT_MAX_BEFORE_SYN = 10;
199 unsigned long long fired_time = 0;
202 struct input_event ultraviolet_event;
203 DBG("ultraviolet event detection!");
205 while ((syn == false) && (read_input_cnt < INPUT_MAX_BEFORE_SYN)) {
206 int len = read(m_node_handle, &ultraviolet_event, sizeof(ultraviolet_event));
207 if (len != sizeof(ultraviolet_event)) {
208 ERR("ultraviolet file read fail, read_len = %d\n",len);
214 if (ultraviolet_event.type == EV_REL && ultraviolet_event.code == REL_MISC) {
215 ultraviolet_raw = (int)ultraviolet_event.value - BIAS;
217 } else if (ultraviolet_event.type == EV_SYN) {
219 fired_time = sensor_hal::get_timestamp(&ultraviolet_event.time);
221 ERR("ultraviolet event[type = %d, code = %d] is unknown.", ultraviolet_event.type, ultraviolet_event.code);
226 AUTOLOCK(m_value_mutex);
229 m_ultraviolet = ultraviolet_raw;
231 m_fired_time = fired_time;
233 DBG("m_ultraviolet = %d, time = %lluus", m_ultraviolet, m_fired_time);
238 bool ultraviolet_sensor_hal::is_data_ready(bool wait)
241 ret = update_value(wait);
245 int ultraviolet_sensor_hal::get_sensor_data(sensor_data_t &data)
247 AUTOLOCK(m_value_mutex);
248 data.accuracy = SENSOR_ACCURACY_GOOD;
249 data.timestamp = m_fired_time ;
250 data.value_count = 1;
251 data.values[0] = (float) m_ultraviolet;
257 bool ultraviolet_sensor_hal::get_properties(sensor_properties_t &properties)
259 properties.name = m_chip_name;
260 properties.vendor = m_vendor;
261 properties.min_range = m_min_range;
262 properties.max_range = m_max_range;
263 properties.min_interval = 1;
264 properties.resolution = m_raw_data_unit;
265 properties.fifo_count = 0;
266 properties.max_batch_count = 0;
271 extern "C" sensor_module* create(void)
273 ultraviolet_sensor_hal *sensor;
276 sensor = new(std::nothrow) ultraviolet_sensor_hal;
278 ERR("Failed to create module, err: %d, cause: %s", err, strerror(err));
282 sensor_module *module = new(std::nothrow) sensor_module;
283 retvm_if(!module || !sensor, NULL, "Failed to allocate memory");
285 module->sensors.push_back(sensor);