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.
22 #include <linux/input.h>
23 #include <csensor_config.h>
25 #include <temperature_sensor_hal.h>
26 #include <sys/ioctl.h>
27 #include <iio_common.h>
31 #define SENSOR_TYPE_TEMPERATURE "TEMPERATURE"
32 #define ELEMENT_NAME "NAME"
33 #define ELEMENT_VENDOR "VENDOR"
34 #define ELEMENT_RAW_DATA_UNIT "RAW_DATA_UNIT"
36 #define TEMP_INPUT_NAME "temperature_sensor"
37 #define TEMP_IIO_ENABLE_NODE_NAME "temp_enable"
38 #define TEMP_SENSORHUB_POLL_NODE_NAME "temp_poll_delay"
39 #define INITIAL_TIME -1
41 temperature_sensor_hal::temperature_sensor_hal()
44 , m_polling_interval(POLL_1HZ_MS)
45 , m_fired_time(INITIAL_TIME)
47 const string sensorhub_interval_node_name = TEMP_SENSORHUB_POLL_NODE_NAME;
49 node_path_info_query query;
51 int input_method = IIO_METHOD;
53 if (!get_model_properties(SENSOR_TYPE_TEMPERATURE, m_model_id, input_method)) {
54 ERR("Failed to find model_properties");
58 query.input_method = input_method;
59 query.sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name);
60 query.sensor_type = SENSOR_TYPE_TEMPERATURE;
61 query.input_event_key = TEMP_INPUT_NAME;
62 query.iio_enable_node_name = TEMP_IIO_ENABLE_NODE_NAME;
63 query.sensorhub_interval_node_name = sensorhub_interval_node_name;
65 if (!get_node_path_info(query, info)) {
66 ERR("Failed to get node info");
70 show_node_path_info(info);
72 m_data_node = info.data_node_path;
73 m_enable_node = info.enable_node_path;
74 m_interval_node = info.interval_node_path;
76 if(input_method == IIO_METHOD) {
77 m_temperature_dir=info.base_dir;
78 m_temp_node = m_temperature_dir + string(TEMP_RAW);
79 INFO("m_temperature_dir = %s", m_temperature_dir.c_str());
80 INFO("m_temp_node = %s", m_temp_node.c_str());
82 csensor_config &config = csensor_config::get_instance();
84 if (!config.get(SENSOR_TYPE_TEMPERATURE, m_model_id, ELEMENT_VENDOR, m_vendor)) {
85 ERR("[VENDOR] is empty\n");
89 if (!config.get(SENSOR_TYPE_TEMPERATURE, m_model_id, ELEMENT_NAME, m_chip_name)) {
90 ERR("[NAME] is empty\n");
96 if (!config.get(SENSOR_TYPE_TEMPERATURE, m_model_id, ELEMENT_RAW_DATA_UNIT, raw_data_unit)) {
97 ERR("[RAW_DATA_UNIT] is empty\n");
101 m_raw_data_unit = (float)(raw_data_unit);
103 INFO("m_data_node = %s\n",m_data_node.c_str());
105 if ((m_node_handle = open(m_temp_node.c_str(),O_RDWR)) < 0) {
106 ERR("Failed to open handle(%d)", m_node_handle);
110 INFO("m_data_node = %s\n",m_data_node.c_str());
111 INFO("m_raw_data_unit = %f\n", m_raw_data_unit);
113 file_name = m_temperature_dir + string(TEMP_SCALE);
114 if (!read_node_value<int>(file_name, m_temp_scale))
117 file_name = m_temperature_dir + string(TEMP_OFFSET);
118 if (!read_node_value<float>(file_name, m_temp_offset))
121 INFO("m_temp_offset %f",m_temp_offset);
122 INFO("m_temp_scale %d",m_temp_scale);
123 INFO("m_vendor = %s", m_vendor.c_str());
124 INFO("m_chip_name = %s", m_chip_name.c_str());
125 INFO("m_raw_data_unit = %f\n", m_raw_data_unit);
126 INFO("temperature_sensor_hal is created!\n");
129 temperature_sensor_hal::~temperature_sensor_hal()
131 close(m_node_handle);
134 INFO("temperature_sensor_hal is destroyed!\n");
137 string temperature_sensor_hal::get_model_id(void)
142 sensor_type_t temperature_sensor_hal::get_type(void)
144 return TEMPERATURE_SENSOR;
147 bool temperature_sensor_hal::enable(void)
149 m_fired_time = INITIAL_TIME;
150 INFO("Temperature sensor real starting");
154 bool temperature_sensor_hal::disable(void)
156 INFO("Temperature sensor real stopping");
160 bool temperature_sensor_hal::set_interval(unsigned long val)
166 bool temperature_sensor_hal::update_value(bool wait)
170 if (!read_node_value<int>(m_temp_node, raw_temp_count))
172 m_temperature = m_temp_offset + ((float)raw_temp_count)/((float)m_temp_scale);
173 INFO("m_temperature %f",m_temperature);
174 INFO("m_temp_offset %f",m_temp_offset);
175 INFO("raw_temp_count %d",raw_temp_count);
176 INFO("m_temp_scale %d",m_temp_scale);
180 bool temperature_sensor_hal::is_data_ready(bool wait)
183 ret = update_value(wait);
187 int temperature_sensor_hal::get_sensor_data(sensor_data_t &data)
189 AUTOLOCK(m_value_mutex);
190 data.accuracy = SENSOR_ACCURACY_GOOD;
191 data.timestamp = m_fired_time ;
192 data.value_count = 1;
193 data.values[0] = (float) m_temperature;
199 bool temperature_sensor_hal::get_properties(sensor_properties_s &properties)
201 properties.name = m_chip_name;
202 properties.vendor = m_vendor;
203 properties.min_range = -45;
204 properties.max_range = 130;
205 properties.min_interval = 1;
206 properties.resolution = 1;
207 properties.fifo_count = 0;
208 properties.max_batch_count = 0;
213 extern "C" void *create(void)
215 temperature_sensor_hal *inst;
218 inst = new temperature_sensor_hal();
220 ERR("temperature_sensor_hal class create fail , errno : %d , errstr : %s\n", err, strerror(err));
227 extern "C" void destroy(void *inst)
229 delete (temperature_sensor_hal*)inst;