4 * Copyright (c) 2016 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>
29 #include <sensor_log.h>
30 #include <sensor_types.h>
32 #include <sensor_common.h>
33 #include <virtual_sensor.h>
34 #include <face_down_sensor.h>
35 #include <sensor_loader.h>
36 #include <fusion_util.h>
37 #include <face_down_alg_impl.h>
39 #define SENSOR_NAME "SENSOR_FACE_DOWN"
41 #define SENSOR_FREQUENCY 50
43 face_down_sensor::face_down_sensor()
44 : m_gravity_sensor(NULL)
48 , m_interval(SENSOR_INTERVAL_NORMAL)
52 face_down_sensor::~face_down_sensor()
54 _I("%s is destroyed!", SENSOR_NAME);
57 bool face_down_sensor::init(void)
59 m_gravity_sensor = sensor_loader::get_instance().get_sensor(GRAVITY_SENSOR);
61 if (!m_gravity_sensor) {
62 _W("cannot load gravity sensor sensor[%s]", SENSOR_NAME);
70 _I("%s is created!", SENSOR_NAME);
74 sensor_type_t face_down_sensor::get_type(void)
76 return GESTURE_FACE_DOWN_SENSOR;
79 unsigned int face_down_sensor::get_event_type(void)
81 return CONVERT_TYPE_EVENT(GESTURE_FACE_DOWN_SENSOR);
84 const char *face_down_sensor::get_name(void)
89 bool face_down_sensor::get_sensor_info(sensor_info & info)
91 info.set_type(get_type());
92 info.set_id(get_id());
93 info.set_privilege(SENSOR_PRIVILEGE_PUBLIC);
94 info.set_name(get_name());
95 info.set_vendor("Samsung Electronics");
96 info.set_min_range(0);
97 info.set_max_range(1);
98 info.set_resolution(1);
99 info.set_min_interval(1);
100 info.set_fifo_count(0);
101 info.set_max_batch_count(0);
102 info.set_supported_event(get_event_type());
103 info.set_wakeup_supported(false);
108 void face_down_sensor::synthesize(const sensor_event_t & event)
110 if (event.event_type != GRAVITY_EVENT_RAW_DATA_REPORT_ON_TIME)
113 m_time = event.data->timestamp;
114 m_alg->push_event(event);
115 m_state = m_alg->get_face_down();
119 sensor_event_t *face_down_event;
120 sensor_data_t *face_down_data;
123 face_down_event = (sensor_event_t *)malloc(sizeof(sensor_event_t));
124 retm_if(!face_down_event, "Failed to allocate memory");
126 get_data(&face_down_data, &data_length);
127 face_down_event->sensor_id = get_id();
128 face_down_event->event_type = FACE_DOWN_RAW_DATA_EVENT;
129 face_down_event->data_length = data_length;
130 face_down_event->data = face_down_data;
132 push(face_down_event);
134 _I("[face_down_sensor] : True");
137 int face_down_sensor::get_data(sensor_data_t ** data, int *length)
139 sensor_data_t *sensor_data;
140 sensor_data = (sensor_data_t *)malloc(sizeof(sensor_data_t));
141 retvm_if(!sensor_data, -ENOMEM, "Failed to allocate memory");
143 sensor_data->accuracy = SENSOR_ACCURACY_GOOD;
144 sensor_data->timestamp = m_time;
145 sensor_data->value_count = 1;
146 sensor_data->values[0] = m_state;
149 *length = sizeof(sensor_data_t);
154 bool face_down_sensor::set_interval(unsigned long interval)
156 m_interval = interval;
160 bool face_down_sensor::set_batch_latency(unsigned long latency)
165 bool face_down_sensor::on_start(void)
167 if (m_gravity_sensor)
168 m_gravity_sensor->start();
175 bool face_down_sensor::on_stop(void)
177 if (m_gravity_sensor)
178 m_gravity_sensor->stop();
186 bool face_down_sensor::add_interval(int client_id, unsigned int interval, bool is_processor)
188 m_gravity_sensor->add_interval(client_id, interval, true);
189 return sensor_base::add_interval(client_id, interval, is_processor);
192 bool face_down_sensor::delete_interval(int client_id, bool is_processor)
194 m_gravity_sensor->delete_interval(client_id, true);
195 return sensor_base::delete_interval(client_id, is_processor);
198 face_down_alg_impl *face_down_sensor::get_alg(void)
200 face_down_alg_impl *alg = new(std::nothrow) face_down_alg_impl();
201 retvm_if(!alg, NULL, "Failed to allocate memory");