sensord: add/change enums and types for avoiding build-break
[platform/core/system/sensord.git] / src / geo / geo_sensor.cpp
1 /*
2  * sensord
3  *
4  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19
20 #include <common.h>
21 #include <sf_common.h>
22
23 #include <geo_sensor.h>
24 #include <sensor_plugin_loader.h>
25
26 #define SENSOR_NAME "GEOMAGNETIC_SENSOR"
27
28 geo_sensor::geo_sensor()
29 : m_sensor_hal(NULL)
30 , m_resolution(0.0f)
31 {
32         m_name = string(SENSOR_NAME);
33
34         register_supported_event(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME);
35         register_supported_event(GEOMAGNETIC_EVENT_CALIBRATION_NEEDED);
36
37         physical_sensor::set_poller(geo_sensor::working, this);
38 }
39
40 geo_sensor::~geo_sensor()
41 {
42         INFO("geo_sensor is destroyed!\n");
43 }
44
45 bool geo_sensor::init()
46 {
47         m_sensor_hal = sensor_plugin_loader::get_instance().get_sensor_hal(GEOMAGNETIC_SENSOR);
48
49         if (!m_sensor_hal) {
50                 ERR("cannot load sensor_hal[%s]", sensor_base::get_name());
51                 return false;
52         }
53
54         sensor_properties_s properties;
55
56         if (m_sensor_hal->get_properties(properties) == false) {
57                 ERR("sensor->get_properties() is failed!\n");
58                 return false;
59         }
60
61         m_resolution = properties.resolution;
62
63         INFO("%s is created!\n", sensor_base::get_name());
64
65         return true;
66 }
67
68 sensor_type_t geo_sensor::get_type(void)
69 {
70         return GEOMAGNETIC_SENSOR;
71 }
72
73 bool geo_sensor::working(void *inst)
74 {
75         geo_sensor *sensor = (geo_sensor*)inst;
76         return sensor->process_event();;
77 }
78
79 bool geo_sensor::process_event(void)
80 {
81         sensor_event_t event;
82
83         if (!m_sensor_hal->is_data_ready(true))
84                 return true;
85
86         m_sensor_hal->get_sensor_data(event.data);
87
88         AUTOLOCK(m_client_info_mutex);
89         AUTOLOCK(m_mutex);
90
91         if (get_client_cnt(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME)) {
92                 event.sensor_id = get_id();
93                 event.event_type = GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME;
94                 raw_to_base(event.data);
95                 push(event);
96         }
97
98         return true;
99 }
100
101 bool geo_sensor::on_start(void)
102 {
103         if (!m_sensor_hal->enable()) {
104                 ERR("m_sensor_hal start fail\n");
105                 return false;
106         }
107
108         return start_poll();
109 }
110
111 bool geo_sensor::on_stop(void)
112 {
113         if (!m_sensor_hal->disable()) {
114                 ERR("m_sensor_hal stop fail\n");
115                 return false;
116         }
117
118         return stop_poll();
119 }
120
121 bool geo_sensor::get_properties(sensor_properties_s &properties)
122 {
123         return m_sensor_hal->get_properties(properties);
124 }
125
126 int geo_sensor::get_sensor_data(unsigned int type, sensor_data_t &data)
127 {
128         int state;
129
130         if (type != GEOMAGNETIC_BASE_DATA_SET)
131                 return -1;
132
133         state = m_sensor_hal->get_sensor_data(data);
134
135         if (state < 0) {
136                 ERR("m_sensor_hal get struct_data fail\n");
137                 return -1;
138         }
139
140         return 0;
141 }
142
143 bool geo_sensor::set_interval(unsigned long interval)
144 {
145         AUTOLOCK(m_mutex);
146
147         INFO("Polling interval is set to %dms", interval);
148
149         return m_sensor_hal->set_interval(interval);
150 }
151
152 void geo_sensor::raw_to_base(sensor_data_t &data)
153 {
154         data.value_count = 3;
155         data.values[0] = data.values[0] * m_resolution;
156         data.values[1] = data.values[1] * m_resolution;
157         data.values[2] = data.values[2] * m_resolution;
158 }
159
160 extern "C" void *create(void)
161 {
162         geo_sensor *inst;
163
164         try {
165                 inst = new geo_sensor();
166         } catch (int err) {
167                 ERR("geo_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err));
168                 return NULL;
169         }
170
171         return (void*)inst;
172 }
173
174 extern "C" void destroy(void *inst)
175 {
176         delete (geo_sensor*)inst;;
177 }