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)
61 retvm_if(sensors == NULL || sensors == nullptr, SENSOR_ERROR_INVALID_PARAMETER, "sensorhub_device:NULL interface");
62 size = manager->get_sensors(sensors);
67 bool sensorhub_device::enable(uint32_t id)
69 system_state_handler::get_instance().initialize();
70 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
72 sensorhub_sensor *sensor = manager->get_sensor(id);
75 ERR("Failed to enable sensor(0x%x)", id);
79 return sensor->enable();
82 bool sensorhub_device::disable(uint32_t id)
84 system_state_handler::get_instance().finalize();
85 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
86 controller->disable();
87 sensorhub_sensor *sensor = manager->get_sensor(id);
90 ERR("Failed to disable sensor(0x%x)", id);
94 return sensor->disable();
97 bool sensorhub_device::set_interval(uint32_t id, unsigned long val)
99 sensorhub_sensor *sensor = NULL;
100 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
101 retvm_if(val < 0, false, "%s:Invalid value Received", SENSOR_NAME);
102 sensor = manager->get_sensor(id);
104 ERR("Failed to set interval to sensor(0x%x)", id);
108 return sensor->set_interval(val);
111 bool sensorhub_device::set_batch_latency(uint32_t id, unsigned long val)
113 sensorhub_sensor *sensor = NULL;
114 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
115 sensor = manager->get_sensor(id);
118 ERR("Failed to set batch latency to sensor(0x%x)", id);
122 return sensor->set_batch_latency(val);
125 bool sensorhub_device::set_attribute_int(uint32_t id, int32_t attribute, int32_t value)
129 sensorhub_sensor *sensor = NULL;
130 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
131 retvm_if(value < 0, false, "%s:Invalid value Received", SENSOR_NAME);
132 retvm_if(attribute < 0, false, "%s:Invalid attribute Received", SENSOR_NAME);
134 sensor = manager->get_sensor(id);
136 ERR("Failed to set attribute to sensor(0x%x)", id);
140 ret = sensor->set_attribute_int(attribute, value);
142 if ((ret < 0) && (ret != -EBUSY)) {
143 ERR("Failed to send sensorhub data");
148 WARN("Command is sent during sensorhub firmware update");
155 bool sensorhub_device::set_attribute_str(uint32_t id, int32_t attribute, char *value, int value_len)
159 sensorhub_sensor *sensor = NULL;
160 retvm_if(id == 0 || id > MAX_ID, false, "%s:Invalid ID Received", SENSOR_NAME);
161 retvm_if(value == NULL || value == nullptr, false, "%s:Invalid string Received", SENSOR_NAME);
162 retvm_if(value_len <= 0, false, "%s:Invalid value_len Received", SENSOR_NAME);
163 sensor = manager->get_sensor(id);
166 ERR("Failed to set attribute to sensor(0x%x)", id);
170 ret = sensor->set_attribute_str(attribute, value, value_len);
172 if ((ret < 0) && (ret != -EBUSY)) {
173 ERR("Failed to send sensorhub data");
178 WARN("Command is sent during sensorhub firmware update");
185 int sensorhub_device::read_fd(uint32_t **ids)
187 sensorhub_data_t data;
188 retvm_if(ids == NULL || ids == nullptr, SENSOR_ERROR_INVALID_PARAMETER, "%s:NULL interface", SENSOR_NAME);
190 if (!controller->read_fd(data))
194 const char *hub_data = data.values;
195 int data_len = data.value_count;
200 while (data_len > 0) {
201 DBG("Remaining data length: %d", data_len);
202 int parsed = parse(hub_data, data_len);
204 ERR("Parsing failed");
213 int size = event_ids.size();
215 if (event_ids.empty())
218 *ids = &event_ids[0];
223 int sensorhub_device::get_data(uint32_t id, sensor_data_t **data, int *length)
226 retvm_if(data == NULL || data == nullptr, SENSOR_ERROR_INVALID_PARAMETER, "%s:NULL data interface", SENSOR_NAME);
227 retvm_if(length == NULL || length == nullptr, SENSOR_ERROR_INVALID_PARAMETER, "%s:NULL length interface", SENSOR_NAME);
228 retvm_if(id == 0 || id > MAX_ID, SENSOR_ERROR_INVALID_PARAMETER, "%s:Invalid ID Received", SENSOR_NAME);
230 sensorhub_sensor *sensor = manager->get_sensor(id);
232 ERR("Failed to get data from sensor(0x%x)", id);
236 remains = sensor->get_data(data, length);
241 bool sensorhub_device::flush(uint32_t id)
246 int sensorhub_device::parse(const char *hub_data, int data_len)
248 return parse_data(hub_data, data_len);
251 int sensorhub_device::parse_data(const char *hub_data, int data_len)
253 const char *cursor = hub_data;
256 sensorhub_sensor *sensor = manager->get_sensor(libtype);
258 ERR("Unknown Sensorhub lib type: %d", libtype);
262 event_ids.push_back(sensor->get_id());
264 return sensor->parse(cursor, data_len);
267 int sensorhub_device::parse_debug(const char *hub_data, int data_len)