2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
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.
19 #include <sensor_log.h>
21 #include "sensorhub.h"
22 #include "sensorhub_controller.h"
23 #include "sensorhub_manager.h"
24 #include "system_state.h"
28 sensorhub_device::sensorhub_device()
30 controller = &sensorhub_controller::get_instance();
32 ERR("Failed to allocated memory");
36 manager = &sensorhub_manager::get_instance();
38 ERR("Failed to allocated memory");
41 manager->set_controller(controller);
42 system_state_handler::get_instance().set_controller(controller);
44 INFO("sensorhub_device is created!");
47 sensorhub_device::~sensorhub_device()
49 INFO("sensorhub_device is destroyed!");
52 int sensorhub_device::get_poll_fd(void)
54 return controller->get_poll_fd();
57 int sensorhub_device::get_sensors(const sensor_info_t **sensors)
60 size = manager->get_sensors(sensors);
65 bool sensorhub_device::enable(uint32_t id)
67 system_state_handler::get_instance().initialize();
68 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
70 sensorhub_sensor *sensor = manager->get_sensor(id);
73 ERR("Failed to enable sensor(0x%x)", id);
77 return sensor->enable();
80 bool sensorhub_device::disable(uint32_t id)
82 system_state_handler::get_instance().finalize();
83 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
84 controller->disable();
85 sensorhub_sensor *sensor = manager->get_sensor(id);
88 ERR("Failed to disable sensor(0x%x)", id);
92 return sensor->disable();
95 bool sensorhub_device::set_interval(uint32_t id, unsigned long val)
97 sensorhub_sensor *sensor = NULL;
98 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
99 retvm_if(val < 0, false, "%s:Invalid value Received", SENSOR_NAME);
100 sensor = manager->get_sensor(id);
102 ERR("Failed to set interval to sensor(0x%x)", id);
106 return sensor->set_interval(val);
109 bool sensorhub_device::set_batch_latency(uint32_t id, unsigned long val)
111 sensorhub_sensor *sensor = NULL;
112 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
113 sensor = manager->get_sensor(id);
116 ERR("Failed to set batch latency to sensor(0x%x)", id);
120 return sensor->set_batch_latency(val);
123 bool sensorhub_device::set_attribute_int(uint32_t id, int32_t attribute, int32_t value)
127 sensorhub_sensor *sensor = NULL;
128 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
129 retvm_if(value < 0, false, "%s:Invalid value Received", SENSOR_NAME);
130 retvm_if(attribute < 0, false, "%s:Invalid attribute Received", SENSOR_NAME);
132 sensor = manager->get_sensor(id);
134 ERR("Failed to set attribute to sensor(0x%x)", id);
138 ret = sensor->set_attribute_int(attribute, value);
140 if ((ret < 0) && (ret != -EBUSY)) {
141 ERR("Failed to send sensorhub data");
146 WARN("Command is sent during sensorhub firmware update");
153 bool sensorhub_device::set_attribute_str(uint32_t id, int32_t attribute, char *value, int value_len)
157 sensorhub_sensor *sensor = NULL;
158 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
159 retvm_if(value == NULL || value == nullptr, false, "%s:Invalid string Received", SENSOR_NAME);
160 retvm_if(value_len <= 0, false, "%s:Invalid value_len Received", SENSOR_NAME);
161 sensor = manager->get_sensor(id);
164 ERR("Failed to set attribute to sensor(0x%x)", id);
168 ret = sensor->set_attribute_str(attribute, value, value_len);
170 if ((ret < 0) && (ret != -EBUSY)) {
171 ERR("Failed to send sensorhub data");
176 WARN("Command is sent during sensorhub firmware update");
183 int sensorhub_device::read_fd(uint32_t **ids)
185 sensorhub_data_t data;
186 retvm_if(ids == NULL || ids == nullptr, SENSOR_ERROR_INVALID_PARAMETER, "%s:NULL interface", SENSOR_NAME);
188 if (!controller->read_fd(data))
192 const char *hub_data = data.values;
193 int data_len = data.value_count;
198 while (data_len > 0) {
199 DBG("Remaining data length: %d", data_len);
200 int parsed = parse(hub_data, data_len);
202 ERR("Parsing failed");
211 int size = event_ids.size();
213 if (event_ids.empty())
216 *ids = &event_ids[0];
221 int sensorhub_device::get_data(uint32_t id, sensor_data_t **data, int *length)
224 retvm_if(data == NULL || data == nullptr, SENSOR_ERROR_INVALID_PARAMETER, "%s:NULL data interface", SENSOR_NAME);
225 retvm_if(length == NULL || length == nullptr, SENSOR_ERROR_INVALID_PARAMETER, "%s:NULL length interface", SENSOR_NAME);
226 retvm_if(id == 0 || id > MAX_ID, SENSOR_ERROR_INVALID_PARAMETER, "%s:Invalid ID Received", SENSOR_NAME);
228 sensorhub_sensor *sensor = manager->get_sensor(id);
230 ERR("Failed to get data from sensor(0x%x)", id);
234 remains = sensor->get_data(data, length);
239 bool sensorhub_device::flush(uint32_t id)
244 int sensorhub_device::parse(const char *hub_data, int data_len)
246 return parse_data(hub_data, data_len);
249 int sensorhub_device::parse_data(const char *hub_data, int data_len)
251 const char *cursor = hub_data;
254 sensorhub_sensor *sensor = manager->get_sensor(libtype);
256 ERR("Unknown Sensorhub lib type: %d", libtype);
260 event_ids.push_back(sensor->get_id());
262 return sensor->parse(cursor, data_len);
265 int sensorhub_device::parse_debug(const char *hub_data, int data_len)