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.
21 #include <sf_common.h>
22 #include <proxi_sensor.h>
23 #include <sensor_plugin_loader.h>
25 #define SENSOR_NAME "PROXI_SENSOR"
27 proxi_sensor::proxi_sensor()
29 , m_state(PROXIMITY_STATE_FAR)
31 m_name = string(SENSOR_NAME);
33 register_supported_event(PROXIMITY_EVENT_CHANGE_STATE);
34 register_supported_event(PROXIMITY_EVENT_STATE_REPORT_ON_TIME);
35 register_supported_event(PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME);
37 physical_sensor::set_poller(proxi_sensor::working, this);
40 proxi_sensor::~proxi_sensor()
42 INFO("proxi_sensor is destroyed!\n");
45 bool proxi_sensor::init()
47 m_sensor_hal = sensor_plugin_loader::get_instance().get_sensor_hal(PROXIMITY_SENSOR);
50 ERR("cannot load sensor_hal[%s]", sensor_base::get_name());
54 INFO("%s is created!\n", sensor_base::get_name());
58 sensor_type_t proxi_sensor::get_type(void)
60 return PROXIMITY_SENSOR;
63 bool proxi_sensor::working(void *inst)
65 proxi_sensor *sensor = (proxi_sensor*)inst;
66 return sensor->process_event();
69 bool proxi_sensor::process_event(void)
74 if (!m_sensor_hal->is_data_ready(true))
77 m_sensor_hal->get_sensor_data(event.data);
79 AUTOLOCK(m_client_info_mutex);
82 event.sensor_id = get_id();
83 if (get_client_cnt(PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME)) {
84 event.event_type = PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME;
85 raw_to_base(event.data);
89 state = event.data.values[0];
91 if (m_state != state) {
92 AUTOLOCK(m_value_mutex);
95 if (get_client_cnt(PROXIMITY_EVENT_CHANGE_STATE)) {
96 event.event_type = PROXIMITY_EVENT_CHANGE_STATE;
97 raw_to_state(event.data);
105 bool proxi_sensor::on_start(void)
107 if (!m_sensor_hal->enable()) {
108 ERR("m_sensor_hal start fail\n");
115 bool proxi_sensor::on_stop(void)
117 if (!m_sensor_hal->disable()) {
118 ERR("m_sensor_hal stop fail\n");
125 bool proxi_sensor::get_properties(sensor_properties_s &properties)
127 m_sensor_hal->get_properties(properties);
129 properties.min_range = properties.min_range * 5;
130 properties.max_range = properties.max_range * 5;
135 int proxi_sensor::get_sensor_data(unsigned int type, sensor_data_t &data)
139 if ((type != PROXIMITY_BASE_DATA_SET) && (type != PROXIMITY_DISTANCE_DATA_SET))
142 state = m_sensor_hal->get_sensor_data(data);
145 ERR("m_sensor_hal get struct_data fail\n");
149 if (type == PROXIMITY_DISTANCE_DATA_SET) {
157 void proxi_sensor::raw_to_base(sensor_data_t &data)
159 data.values[0] = (float)((PROXIMITY_STATE_NEAR - data.values[0]) * 5);
162 void proxi_sensor::raw_to_state(sensor_data_t &data)
164 data.value_count = 1;
167 extern "C" void *create(void)
172 inst = new proxi_sensor();
174 ERR("proxi_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err));
181 extern "C" void destroy(void *inst)
183 delete (proxi_sensor*)inst;