2 * temperature_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.
21 #include <linux/input.h>
22 #include <csensor_config.h>
23 #include <temperature_sensor_hal.h>
24 #include <sys/ioctl.h>
28 #define SENSOR_TYPE_TEMPERATURE "TEMPERATURE"
29 #define ELEMENT_NAME "NAME"
30 #define ELEMENT_VENDOR "VENDOR"
31 #define ELEMENT_RAW_DATA_UNIT "RAW_DATA_UNIT"
33 #define TEMP_INPUT_NAME "temperature_sensor"
34 #define TEMP_IIO_ENABLE_NODE_NAME "temp_enable"
35 #define TEMP_SENSORHUB_POLL_NODE_NAME "temp_poll_delay"
36 #define INITIAL_TIME -1
38 temperature_sensor_hal::temperature_sensor_hal()
41 , m_polling_interval(POLL_1HZ_MS)
42 , m_fired_time(INITIAL_TIME)
44 const string sensorhub_interval_node_name = TEMP_SENSORHUB_POLL_NODE_NAME;
46 node_info_query query;
49 if (!find_model_id(SENSOR_TYPE_TEMPERATURE, m_model_id)) {
50 ERR("Failed to find model id");
54 query.sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name);
55 query.sensor_type = SENSOR_TYPE_TEMPERATURE;
56 query.key = TEMP_INPUT_NAME;
57 query.iio_enable_node_name = TEMP_IIO_ENABLE_NODE_NAME;
58 query.sensorhub_interval_node_name = sensorhub_interval_node_name;
60 if (!get_node_info(query, info)) {
61 ERR("Failed to get node info");
67 m_data_node = info.data_node_path;
68 m_enable_node = info.enable_node_path;
69 m_interval_node = info.interval_node_path;
71 csensor_config &config = csensor_config::get_instance();
73 if (!config.get(SENSOR_TYPE_TEMPERATURE, m_model_id, ELEMENT_VENDOR, m_vendor)) {
74 ERR("[VENDOR] is empty\n");
78 if (!config.get(SENSOR_TYPE_TEMPERATURE, m_model_id, ELEMENT_NAME, m_chip_name)) {
79 ERR("[NAME] is empty\n");
85 if (!config.get(SENSOR_TYPE_TEMPERATURE, m_model_id, ELEMENT_RAW_DATA_UNIT, raw_data_unit)) {
86 ERR("[RAW_DATA_UNIT] is empty\n");
90 m_raw_data_unit = (float)(raw_data_unit);
92 if ((m_node_handle = open(m_data_node.c_str(),O_RDWR)) < 0) {
93 ERR("Failed to open handle(%d)", m_node_handle);
97 int clockId = CLOCK_MONOTONIC;
98 if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0)
99 ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str());
101 INFO("m_vendor = %s", m_vendor.c_str());
102 INFO("m_chip_name = %s", m_chip_name.c_str());
103 INFO("m_raw_data_unit = %f\n", m_raw_data_unit);
104 INFO("temperature_sensor_hal is created!\n");
107 temperature_sensor_hal::~temperature_sensor_hal()
109 close(m_node_handle);
112 INFO("temperature_sensor_hal is destroyed!\n");
115 string temperature_sensor_hal::get_model_id(void)
120 sensor_hal_type_t temperature_sensor_hal::get_type(void)
122 return SENSOR_HAL_TYPE_TEMPERATURE;
125 bool temperature_sensor_hal::enable(void)
129 set_enable_node(m_enable_node, m_sensorhub_controlled, true,
130 SENSORHUB_TEMPERATURE_HUMIDITY_ENABLE_BIT);
131 set_interval(m_polling_interval);
134 INFO("Temperature sensor real starting");
138 bool temperature_sensor_hal::disable(void)
142 set_enable_node(m_enable_node, m_sensorhub_controlled, false,
143 SENSORHUB_TEMPERATURE_HUMIDITY_ENABLE_BIT);
145 INFO("Temperature sensor real stopping");
149 bool temperature_sensor_hal::set_interval(unsigned long val)
151 unsigned long long polling_interval_ns;
155 polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu);
157 if (!set_node_value(m_interval_node, polling_interval_ns)) {
158 ERR("Failed to set polling node: %s\n", m_interval_node.c_str());
162 INFO("Interval is changed from %dms to %dms]", m_polling_interval, val);
163 m_polling_interval = val;
167 bool temperature_sensor_hal::update_value(void)
169 int temperature_raw = 0;
170 bool temperature = false;
171 int read_input_cnt = 0;
172 const int INPUT_MAX_BEFORE_SYN = 10;
173 unsigned long long fired_time = 0;
176 struct input_event temperature_event;
177 DBG("temperature event detection!");
179 while ((syn == false) && (read_input_cnt < INPUT_MAX_BEFORE_SYN)) {
180 int len = read(m_node_handle, &temperature_event, sizeof(temperature_event));
181 if (len != sizeof(temperature_event)) {
182 ERR("temperature_file read fail, read_len = %d\n",len);
188 if (temperature_event.type == EV_REL) {
189 switch (temperature_event.code) {
191 temperature_raw = (int)temperature_event.value;
195 ERR("temperature_event event[type = %d, code = %d] is unknown.", temperature_event.type, temperature_event.code);
199 } else if (temperature_event.type == EV_SYN) {
201 fired_time = sensor_hal_base::get_timestamp(&temperature_event.time);
203 ERR("temperature_event event[type = %d, code = %d] is unknown.", temperature_event.type, temperature_event.code);
209 ERR("EV_SYN didn't come until %d inputs had come", read_input_cnt);
213 AUTOLOCK(m_value_mutex);
216 m_temperature = temperature_raw;
218 m_fired_time = fired_time;
220 DBG("m_temperature = %d, time = %lluus", m_temperature, m_fired_time);
225 bool temperature_sensor_hal::is_data_ready(void)
228 ret = update_value();
232 int temperature_sensor_hal::get_sensor_data(sensor_data_t &data)
234 AUTOLOCK(m_value_mutex);
235 data.accuracy = SENSOR_ACCURACY_GOOD;
236 data.timestamp = m_fired_time ;
237 data.value_count = 1;
238 data.values[0] = (float) m_temperature;
243 bool temperature_sensor_hal::get_properties(sensor_properties_s &properties)
245 properties.name = m_chip_name;
246 properties.vendor = m_vendor;
247 properties.min_range = -45;
248 properties.max_range = 130;
249 properties.min_interval = 1;
250 properties.resolution = 1;
251 properties.fifo_count = 0;
252 properties.max_batch_count = 0;