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.
26 #include <sys/types.h>
30 #include <sf_common.h>
31 #include <virtual_sensor.h>
32 #include <linear_accel_sensor.h>
33 #include <sensor_plugin_loader.h>
35 #define SENSOR_NAME "LINEAR_ACCEL_SENSOR"
37 #define INITIAL_VALUE -1
38 #define INITIAL_TIME 0
39 #define GRAVITY 9.80665
41 linear_accel_sensor::linear_accel_sensor()
42 : m_gravity_sensor(NULL)
46 , m_time(INITIAL_TIME)
48 m_name = string(SENSOR_NAME);
49 register_supported_event(LINEAR_ACCEL_EVENT_RAW_DATA_REPORT_ON_TIME);
52 linear_accel_sensor::~linear_accel_sensor()
54 INFO("linear_accel_sensor is destroyed!");
57 bool linear_accel_sensor::init()
59 m_gravity_sensor = sensor_plugin_loader::get_instance().get_sensor(GRAVITY_SENSOR);
60 m_accel_sensor = sensor_plugin_loader::get_instance().get_sensor(ACCELEROMETER_SENSOR);
62 if (!m_accel_sensor || !m_gravity_sensor) {
63 ERR("Failed to load sensors, accel: 0x%x, gravity: 0x%x",
64 m_accel_sensor, m_gravity_sensor);
68 INFO("%s is created!", sensor_base::get_name());
72 sensor_type_t linear_accel_sensor::get_type(void)
74 return LINEAR_ACCEL_SENSOR;
77 bool linear_accel_sensor::on_start(void)
80 m_gravity_sensor->add_client(GRAVITY_EVENT_RAW_DATA_REPORT_ON_TIME);
81 m_gravity_sensor->start();
86 bool linear_accel_sensor::on_stop(void)
89 m_gravity_sensor->delete_client(GRAVITY_EVENT_RAW_DATA_REPORT_ON_TIME);
90 m_gravity_sensor->stop();
95 bool linear_accel_sensor::add_interval(int client_id, unsigned int interval)
98 m_gravity_sensor->add_interval(client_id, interval, true);
99 return sensor_base::add_interval(client_id, interval, true);
102 bool linear_accel_sensor::delete_interval(int client_id)
105 m_gravity_sensor->delete_interval(client_id, true);
106 return sensor_base::delete_interval(client_id, true);
109 void linear_accel_sensor::synthesize(const sensor_event_t &event, vector<sensor_event_t> &outs)
111 vector<sensor_event_t> gravity_event;
112 sensor_event_t lin_accel_event;
113 ((virtual_sensor *)m_gravity_sensor)->synthesize(event, gravity_event);
115 if (!gravity_event.empty() && event.event_type == ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME) {
116 AUTOLOCK(m_value_mutex);
118 lin_accel_event.data.values_num = 3;
119 lin_accel_event.data.timestamp = gravity_event[0].data.timestamp;
120 lin_accel_event.event_type = LINEAR_ACCEL_EVENT_RAW_DATA_REPORT_ON_TIME;
121 lin_accel_event.data.data_accuracy = SENSOR_ACCURACY_GOOD;
122 lin_accel_event.data.data_unit_idx = SENSOR_UNIT_METRE_PER_SECOND_SQUARED;
123 lin_accel_event.data.values[0] = event.data.values[0] - gravity_event[0].data.values[0];
124 lin_accel_event.data.values[1] = event.data.values[1] - gravity_event[0].data.values[1];
125 lin_accel_event.data.values[2] = event.data.values[2] - gravity_event[0].data.values[2];
126 outs.push_back(lin_accel_event);
132 int linear_accel_sensor::get_sensor_data(const unsigned int event_type, sensor_data_t &data)
134 sensor_data_t gravity_data, accel_data;
135 ((virtual_sensor *)m_gravity_sensor)->get_sensor_data(GRAVITY_EVENT_RAW_DATA_REPORT_ON_TIME, gravity_data);
136 m_accel_sensor->get_sensor_data(ACCELEROMETER_BASE_DATA_SET, accel_data);
138 if (event_type != LINEAR_ACCEL_EVENT_RAW_DATA_REPORT_ON_TIME)
141 data.data_accuracy = SENSOR_ACCURACY_GOOD;
142 data.data_unit_idx = SENSOR_UNIT_METRE_PER_SECOND_SQUARED;
143 data.timestamp = gravity_data.timestamp;
144 data.values[0] = accel_data.values[0] - gravity_data.values[0];
145 data.values[1] = accel_data.values[1] - gravity_data.values[1];
146 data.values[2] = accel_data.values[2] - gravity_data.values[2];
151 bool linear_accel_sensor::get_properties(const unsigned int type, sensor_properties_t &properties)
153 m_gravity_sensor->get_properties(type, properties);
155 if (type != LINEAR_ACCEL_EVENT_RAW_DATA_REPORT_ON_TIME)
158 strncpy(properties.sensor_name, "Linear Accelerometer Sensor", MAX_KEY_LENGTH);
162 extern "C" void *create(void)
164 linear_accel_sensor *inst;
167 inst = new linear_accel_sensor();
169 ERR("Failed to create linear_accel_sensor class, errno : %d, errstr : %s", err, strerror(err));
176 extern "C" void destroy(void *inst)
178 delete (linear_accel_sensor *)inst;