2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.tizenopensource.org/license
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUixSensor_ISensorCore.cpp
20 * @brief This is the implementation file for the %_ISensorCore interface class.
22 * This files contains implementation of the %_ISensorCore interface class.
28 #include <FBaseString.h>
29 #include <FBaseSysLog.h>
30 #include <FApp_AppInfo.h>
31 #include "FUixSensor_ISensorCore.h"
32 #include "FUixSensor_ISensorCoreEventReceiver.h"
33 #include "FUixSensor_SensorUtil.h"
35 using Tizen::App::_AppInfo;
37 namespace Tizen { namespace Uix { namespace Sensor
41 // Internal variables -------------------------------------------------------------------------------------------------------- //
42 static const sensor_type_e SENSOR_UNKNOWN = static_cast<sensor_type_e>(-1);
43 static const wchar_t W_MSG_EMUL_VENDOR[] = L"Emul_Vendor";
44 static const wchar_t W_MSG_EMUL_MODEL_ID_TILT[] = L"Emul_ModelId_Tilt";
45 static const wchar_t W_MSG_NOT_SUPPORTED[] = L"Not supported";
46 static const long SENSOR_MIN_INTERVALS[] = {
47 20L, // SENSOR_TYPE_ACCELERATION
48 20L, // SENSOR_TYPE_MAGNETIC
49 100L, // SENSOR_TYPE_PROXIMITY
50 20L, // SENSOR_TYPE_TILT
51 20L, // SENSOR_TYPE_GYRO
52 100L, // SENSOR_TYPE_LIGHT
53 20L, // SENSOR_TYPE_GRAVITY
54 20L, // SENSOR_TYPE_USER_ACCELERATION
55 20L, // SENSOR_TYPE_DEVICE_ORIENTATION
57 static const long SENSOR_MAX_INTERVALS[] = {
58 100L, // SENSOR_TYPE_ACCELERATION
59 100L, // SENSOR_TYPE_MAGNETIC
60 5000L, // SENSOR_TYPE_PROXIMITY
61 1000L, // SENSOR_TYPE_TILT
62 100L, // SENSOR_TYPE_GYRO
63 5000L, // SENSOR_TYPE_LIGHT
64 100L, // SENSOR_TYPE_GRAVITY
65 100L, // SENSOR_TYPE_USER_ACCELERATION
66 100L, // SENSOR_TYPE_DEVICE_ORIENTATION
68 static const float MIN_VALUE_TILT = 0.0F;
69 static const float MAX_VALUE_TILT = 360.0F;
70 static const float RESOLUTION_VALUE_TILT = 0.0F;
72 // Internal utility methods -------------------------------------------------------------------------------------------------- //
74 IsSuccess(int sensorResult)
76 return sensorResult == SENSOR_ERROR_NONE;
80 ConvertToSensorTypeEFromSensorType(SensorType sensorType)
84 case SENSOR_TYPE_ACCELERATION:
85 return SENSOR_ACCELEROMETER;
86 case SENSOR_TYPE_MAGNETIC:
87 return SENSOR_MAGNETIC;
88 case SENSOR_TYPE_PROXIMITY:
89 return SENSOR_PROXIMITY;
90 case SENSOR_TYPE_TILT:
91 return SENSOR_ORIENTATION;
92 case SENSOR_TYPE_GYRO:
93 return SENSOR_GYROSCOPE;
94 case SENSOR_TYPE_LIGHT:
96 case SENSOR_TYPE_GRAVITY:
97 return SENSOR_GRAVITY;
98 case SENSOR_TYPE_USER_ACCELERATION:
99 return SENSOR_LINEAR_ACCELERATION;
100 case SENSOR_TYPE_DEVICE_ORIENTATION:
101 return SENSOR_DEVICE_ORIENTATION;
103 SysAssertf(false, "ConvertToSensorTypeEFromSensorType() > Invalid SensorType [sensorType:%d]", sensorType);
104 SetLastResult(E_INVALID_ARG);
105 return SENSOR_UNKNOWN;
110 GetStaticIntervalRange(SensorType sensorType, int& min, int& max)
112 min = SENSOR_MIN_INTERVALS[sensorType];
113 max = SENSOR_MAX_INTERVALS[sensorType];
115 return SENSOR_ERROR_NONE;
119 GetSensorTypeEFromSensorCoreEventType(_SensorCoreEventType eventType)
123 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
125 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_SENSOR_WAKEUP:
126 return SENSOR_ACCELEROMETER;
127 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
128 return SENSOR_MAGNETIC;
129 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
130 return SENSOR_ORIENTATION;
131 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
132 return SENSOR_PROXIMITY;
133 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
134 return SENSOR_GYROSCOPE;
135 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
137 case _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA:
138 return SENSOR_GRAVITY;
139 case _SENSOR_CORE_EVENT_TYPE_USER_ACCELERATION_DATA:
140 return SENSOR_LINEAR_ACCELERATION;
141 case _SENSOR_CORE_EVENT_TYPE_DEVICE_ORIENTATION_DATA:
142 return SENSOR_DEVICE_ORIENTATION;
144 SysAssertf(false, "GetSensorTypeEFromSensorCoreEventType() > Invalid _SensorCoreEventType [eventType:%d]", eventType);
145 SetLastResult(E_INVALID_ARG);
146 return SENSOR_UNKNOWN;
151 IsStaticObjectDetected(float distance, bool& isObjectDetected)
153 isObjectDetected = (distance <= 4.0F);
154 return SENSOR_ERROR_NONE;
158 IsAccuracyValid(sensor_data_accuracy_e accuracy)
160 return accuracy >= SENSOR_DATA_ACCURACY_NORMAL;
164 CorrectTimestamp(long long timestamp)
166 return timestamp * MICROSECOND_TO_MILLISECOND;
169 // Internal callback methods ------------------------------------------------------------------------------------------------- //
171 OnAccelerationDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
172 float x, float y, float z, void* pUserData)
174 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
175 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
177 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
178 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA;
179 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
180 eventBuffer.eventKind.accelerationData.x = x * METER_PER_SECOND_SQUARE_TO_G;
181 eventBuffer.eventKind.accelerationData.y = y * METER_PER_SECOND_SQUARE_TO_G;
182 eventBuffer.eventKind.accelerationData.z = z * METER_PER_SECOND_SQUARE_TO_G;
183 receiver.OnSensorCoreEventReceived(eventBuffer);
187 OnMagneticFieldDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
188 float x, float y, float z, void* pUserData)
190 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
191 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
192 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
193 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA;
194 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
195 eventBuffer.eventKind.magneticFieldData.x = x;
196 eventBuffer.eventKind.magneticFieldData.y = y;
197 eventBuffer.eventKind.magneticFieldData.z = z;
198 receiver.OnSensorCoreEventReceived(eventBuffer);
202 OnProximityDistanceDataEventReceived(unsigned long long timestamp, float distance, void* pUserData)
204 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
205 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
206 eventBuffer.isEventValid = true;
207 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA;
208 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
209 eventBuffer.eventKind.proximityDistanceData.distance = distance;
210 receiver.OnSensorCoreEventReceived(eventBuffer);
214 OnTiltMagneticAzimuthDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
215 float azimuth, float pitch, float roll, void* pUserData)
217 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
218 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
219 eventBuffer.isEventValid = eventBuffer.isEventValid && IsAccuracyValid(accuracy);
220 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_TILT_DATA;
221 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
222 eventBuffer.eventKind.tiltData.azimuth = azimuth;
223 eventBuffer.eventKind.tiltData.roll = roll;
224 eventBuffer.eventKind.tiltData.pitch = pitch;
225 receiver.OnSensorCoreEventReceived(eventBuffer);
229 OnRotationRateDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
230 float x, float y, float z, void* pUserData)
232 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
233 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
234 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
235 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA;
236 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
237 eventBuffer.eventKind.rotationRateData.x = x;
238 eventBuffer.eventKind.rotationRateData.y = y;
239 eventBuffer.eventKind.rotationRateData.z = z;
240 receiver.OnSensorCoreEventReceived(eventBuffer);
244 OnLightLevelDataEventReceived(unsigned long long timestamp, float lux, void* pUserData)
246 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
247 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
248 eventBuffer.isEventValid = true;
249 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA;
250 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
251 eventBuffer.eventKind.lightLevelData.level = lux;
252 receiver.OnSensorCoreEventReceived(eventBuffer);
256 OnAccelerationSensorWakeupEventReceived(void *pUserData)
258 SysLog(NID_UIX, " OnAccelerationSensorWakeupEventReceived Device wake up by Acceleration sensor.");
262 OnGravityDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,float x, float y, float z, void* pUserData)
264 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
265 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
267 SysLog(NID_UIX, "taehwan.son OnGravityDataEventReceived.");
268 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
269 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA;
270 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
271 eventBuffer.eventKind.gravityData.x = x;
272 eventBuffer.eventKind.gravityData.y = y;
273 eventBuffer.eventKind.gravityData.z = z;
274 receiver.OnSensorCoreEventReceived(eventBuffer);
279 OnUserAccelerationDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,float x, float y, float z, void* pUserData)
281 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
282 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
284 SysLog(NID_UIX, "OnUserAccelerationDataEventReceived.");
285 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
286 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_USER_ACCELERATION_DATA;
287 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
288 eventBuffer.eventKind.userAccelerationData.x = x * METER_PER_SECOND_SQUARE_TO_G;
289 eventBuffer.eventKind.userAccelerationData.y = y * METER_PER_SECOND_SQUARE_TO_G;
290 eventBuffer.eventKind.userAccelerationData.z = z * METER_PER_SECOND_SQUARE_TO_G;
291 receiver.OnSensorCoreEventReceived(eventBuffer);
295 OnDeviceOrientationDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,float yaw, float pitch, float roll, void* pUserData)
297 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
298 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
300 SysLog(NID_UIX, "OnDeviceOrientationDataEventReceived.");
301 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
302 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_DEVICE_ORIENTATION_DATA;
303 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
304 eventBuffer.eventKind.deviceOrientationData.yaw = yaw;
305 eventBuffer.eventKind.deviceOrientationData.pitch = pitch;
306 eventBuffer.eventKind.deviceOrientationData.roll = roll;
307 receiver.OnSensorCoreEventReceived(eventBuffer);
310 // Internal management methods ----------------------------------------------------------------------------------------------- //
312 ConnectToSensorCore(sensor_h& sensorHandle)
314 sensor_h tempHandle = null;
315 int sensorResult = sensor_create(&tempHandle);
316 if (!IsSuccess(sensorResult))
318 // SENSOR_ERROR_OUT_OF_MEMORY
319 SysAssertf(false, "ConnectToSensorCore() > sensor_create() failed. [handle:%p, result:%d]", tempHandle, sensorResult);
320 SetLastResult(E_OUT_OF_MEMORY);
321 return E_OUT_OF_MEMORY;
324 sensorHandle = tempHandle;
330 DisconnectFromSensorCore(sensor_h& sensorHandle)
332 int sensorResult = sensor_destroy(sensorHandle);
333 if (!IsSuccess(sensorResult))
336 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
338 SysAssertf(false, "DisconnectFromSensorCore() > sensor_destroy() failed. [handle:%p, result:%d]", sensorHandle, sensorResult);
339 SetLastResult(E_DEVICE_UNAVAILABLE);
340 return E_DEVICE_UNAVAILABLE;
344 SysAssertf(false, "DisconnectFromSensorCore() > sensor_destroy() failed. [handle:%p, result:%d]", sensorHandle, sensorResult);
345 SetLastResult(E_OPERATION_FAILED);
346 return E_OPERATION_FAILED;
356 PrepareSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType, long interval, void* pUserData)
358 int sensorResult = SENSOR_ERROR_NONE;
361 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
363 sensorResult = sensor_accelerometer_set_cb(sensorHandle, interval, OnAccelerationDataEventReceived, pUserData);
366 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
368 sensorResult = sensor_magnetic_set_cb(sensorHandle, interval, OnMagneticFieldDataEventReceived, pUserData);
371 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
373 sensorResult = sensor_proximity_set_cb(sensorHandle, interval, OnProximityDistanceDataEventReceived, pUserData);
376 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
378 sensorResult = sensor_orientation_set_cb(sensorHandle, interval, OnTiltMagneticAzimuthDataEventReceived, pUserData);
381 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
383 sensorResult = sensor_gyroscope_set_cb(sensorHandle, interval, OnRotationRateDataEventReceived, pUserData);
386 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
388 sensorResult = sensor_light_set_cb(sensorHandle, interval, OnLightLevelDataEventReceived, pUserData);
391 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_SENSOR_WAKEUP:
393 sensorResult = sensor_awake_set_cb(sensorHandle, SENSOR_ACCELEROMETER, OnAccelerationSensorWakeupEventReceived, pUserData);
396 case _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA:
398 sensorResult = sensor_gravity_set_cb(sensorHandle, interval, OnGravityDataEventReceived, pUserData);
401 case _SENSOR_CORE_EVENT_TYPE_USER_ACCELERATION_DATA:
403 sensorResult = sensor_linear_acceleration_set_cb(sensorHandle, interval, OnUserAccelerationDataEventReceived, pUserData);
406 case _SENSOR_CORE_EVENT_TYPE_DEVICE_ORIENTATION_DATA:
408 sensorResult = sensor_device_orientation_set_cb(sensorHandle, interval, OnDeviceOrientationDataEventReceived, pUserData);
414 SysAssertf(false, "PrepareSensorCoreEventSensing() > [%s] PARADOX [eventType:%d]", GetErrorMessage(E_INVALID_ARG), eventType);
415 SetLastResult(E_INVALID_ARG);
416 return E_INVALID_ARG;
420 if (!IsSuccess(sensorResult))
422 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
423 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
425 SysAssertf(false, "PrepareSensorCoreEventSensing() > sensor_xxx_set_cb() failed. [handle:%p, eventType:%d, interval:%ld, result:%d]", sensorHandle, eventType, interval, sensorResult);
426 SetLastResult(E_DEVICE_UNAVAILABLE);
427 return E_DEVICE_UNAVAILABLE;
431 SysAssertf(false, "PrepareSensorCoreEventSensing() > sensor_xxx_set_cb() failed. [handle:%p, eventType:%d, interval:%ld, result:%d]", sensorHandle, eventType, interval, sensorResult);
432 SetLastResult(E_OPERATION_FAILED);
433 return E_OPERATION_FAILED;
442 UnprepareSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType)
444 int sensorResult = SENSOR_ERROR_NONE;
447 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
449 sensorResult = sensor_accelerometer_unset_cb(sensorHandle);
452 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
454 sensorResult = sensor_magnetic_unset_cb(sensorHandle);
457 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
459 sensorResult = sensor_proximity_unset_cb(sensorHandle);
462 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
464 sensorResult = sensor_orientation_unset_cb(sensorHandle);
467 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
469 sensorResult = sensor_gyroscope_unset_cb(sensorHandle);
472 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
474 sensorResult = sensor_light_unset_cb(sensorHandle);
477 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_SENSOR_WAKEUP:
479 sensorResult = sensor_awake_unset_cb(sensorHandle, SENSOR_ACCELEROMETER);
482 case _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA:
484 sensorResult = sensor_gravity_unset_cb(sensorHandle);
487 case _SENSOR_CORE_EVENT_TYPE_USER_ACCELERATION_DATA:
489 sensorResult = sensor_linear_acceleration_unset_cb(sensorHandle);
492 case _SENSOR_CORE_EVENT_TYPE_DEVICE_ORIENTATION_DATA:
494 sensorResult = sensor_device_orientation_unset_cb(sensorHandle);
500 SysAssertf(false, "UnprepareSensorCoreEventSensing() > [%s] PARADOX [eventType:%d]", GetErrorMessage(E_INVALID_ARG), eventType);
501 SetLastResult(E_INVALID_ARG);
502 return E_INVALID_ARG;
506 if (!IsSuccess(sensorResult))
508 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
509 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
511 SysAssertf(false, "UnprepareSensorCoreEventSensing() > sensor_xxx_unset_cb() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
512 SetLastResult(E_DEVICE_UNAVAILABLE);
513 return E_DEVICE_UNAVAILABLE;
517 SysAssertf(false, "UnprepareSensorCoreEventSensing() > sensor_xxx_unset_cb() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
518 SetLastResult(E_OPERATION_FAILED);
519 return E_OPERATION_FAILED;
529 StartSensorType(sensor_h sensorHandle, sensor_type_e sensorTypeE)
531 int sensorResult = sensor_start(sensorHandle, sensorTypeE);
532 if (!IsSuccess(sensorResult))
534 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
535 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
537 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
538 SetLastResult(E_DEVICE_UNAVAILABLE);
539 return E_DEVICE_UNAVAILABLE;
543 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
544 SetLastResult(E_OPERATION_FAILED);
545 return E_OPERATION_FAILED;
549 sensorResult = sensor_set_always_on(sensorHandle, sensorTypeE);
550 if (!IsSuccess(sensorResult))
552 // SENSOR_ERROR_IO_ERROR
553 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
555 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
556 SetLastResult(E_DEVICE_UNAVAILABLE);
557 return E_DEVICE_UNAVAILABLE;
561 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
562 SetLastResult(E_OPERATION_FAILED);
563 return E_OPERATION_FAILED;
570 StartSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType)
572 sensor_type_e sensorTypeE = GetSensorTypeEFromSensorCoreEventType(eventType);
573 StartSensorType(sensorHandle,sensorTypeE);
578 StopSensorType(sensor_h sensorHandle, sensor_type_e sensorTypeE)
580 int sensorResult = sensor_stop(sensorHandle,sensorTypeE );
581 if (!IsSuccess(sensorResult))
583 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
585 // SENSOR_ERROR_IO_ERROR
586 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
587 SetLastResult(E_DEVICE_UNAVAILABLE);
588 return E_DEVICE_UNAVAILABLE;
592 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
593 SetLastResult(E_OPERATION_FAILED);
594 return E_OPERATION_FAILED;
602 StopSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType)
605 sensor_type_e sensorTypeE = GetSensorTypeEFromSensorCoreEventType(eventType);
606 StopSensorType(sensorHandle,sensorTypeE);
611 ResetSensorCoreDataEventSensingInterval(sensor_h sensorHandle, _SensorCoreEventType eventType, long interval)
613 int sensorResult = SENSOR_ERROR_NONE;
616 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
618 sensorResult = sensor_accelerometer_set_interval(sensorHandle, interval);
621 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
623 sensorResult = sensor_magnetic_set_interval(sensorHandle, interval);
626 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
628 sensorResult = sensor_proximity_set_interval(sensorHandle, interval);
631 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
633 sensorResult = sensor_orientation_set_interval(sensorHandle, interval);
636 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
638 sensorResult = sensor_gyroscope_set_interval(sensorHandle, interval);
641 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
643 sensorResult = sensor_light_set_interval(sensorHandle, interval);
646 case _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA:
648 sensorResult = sensor_gravity_set_interval(sensorHandle, interval);
651 case _SENSOR_CORE_EVENT_TYPE_USER_ACCELERATION_DATA:
653 sensorResult = sensor_gravity_set_interval(sensorHandle, interval);
656 case _SENSOR_CORE_EVENT_TYPE_DEVICE_ORIENTATION_DATA:
658 sensorResult = sensor_gravity_set_interval(sensorHandle, interval);
664 SysAssertf(false, "ResetSensorCoreDataEventSensingInterval() > [%s] PARADOX [eventType:%d]", GetErrorMessage(E_INVALID_ARG), eventType);
665 SetLastResult(E_INVALID_ARG);
666 return E_INVALID_ARG;
670 if (!IsSuccess(sensorResult))
672 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
674 SysAssertf(false, "ResetSensorCoreDataEventSensingInterval() > sensor_xxx_set_interval() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
675 SetLastResult(E_DEVICE_UNAVAILABLE);
676 return E_DEVICE_UNAVAILABLE;
680 SysAssertf(false, "ResetSensorCoreDataEventSensingInterval() > sensor_xxx_set_interval() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
681 SetLastResult(E_OPERATION_FAILED);
682 return E_OPERATION_FAILED;
684 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
692 // Getting sensor information ------------------------------------------------------------------------------------------------ //
694 _ISensorCore::IsSupported(SensorType sensorType)
696 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
698 bool isSupported = false;
699 int sensorResult = sensor_is_supported(sensorTypeE, &isSupported);
700 if (!IsSuccess(sensorResult))
702 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
704 SysAssertf(false, "IsSupported() > sensor_is_supported() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
705 SetLastResult(E_DEVICE_UNAVAILABLE);
710 SysAssertf(false, "IsSupported() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
711 SetLastResult(E_OPERATION_FAILED);
720 _ISensorCore::GetDescription(SensorType sensorType, Tizen::Base::String& description)
722 description = L"In preparation...";
727 _ISensorCore::GetVendor(SensorType sensorType, Tizen::Base::String& vendor)
731 case SENSOR_TYPE_TILT:
734 vendor = W_MSG_EMUL_VENDOR;
736 vendor = W_MSG_NOT_SUPPORTED;
742 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
744 char* pTempStrVendor = null;
745 char* pDummyStrModelId = null;
746 float dummyMax = 0.0F;
747 float dummyMin = 0.0F;
748 float dummyResolution = 0.0F;
749 int sensorResult = sensor_get_spec(sensorTypeE, &pTempStrVendor, &pDummyStrModelId, &dummyMax, &dummyMin, &dummyResolution);
750 if (!IsSuccess(sensorResult))
753 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
755 SysAssertf(false, "GetVendor() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
756 SetLastResult(E_DEVICE_UNAVAILABLE);
757 return E_DEVICE_UNAVAILABLE;
761 SysAssertf(false, "GetVendor() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
762 SetLastResult(E_OPERATION_FAILED);
763 return E_OPERATION_FAILED;
768 vendor = pTempStrVendor;
770 free(pTempStrVendor);
771 free(pDummyStrModelId);
781 _ISensorCore::GetModelId(SensorType sensorType, Tizen::Base::String& modelId)
785 case SENSOR_TYPE_TILT:
788 modelId = W_MSG_EMUL_MODEL_ID_TILT;
790 modelId = W_MSG_NOT_SUPPORTED;
796 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
798 char* pDummyStrVendor = null;
799 char* pTempStrModelId = null;
800 float dummyMax = 0.0F;
801 float dummyMin = 0.0F;
802 float dummyResolution = 0.0F;
803 int sensorResult = sensor_get_spec(sensorTypeE, &pDummyStrVendor, &pTempStrModelId, &dummyMax, &dummyMin, &dummyResolution);
804 if (!IsSuccess(sensorResult))
807 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
809 SysAssertf(false, "GetModelId() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
810 SetLastResult(E_DEVICE_UNAVAILABLE);
811 return E_DEVICE_UNAVAILABLE;
815 SysAssertf(false, "GetModelId() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
816 SetLastResult(E_OPERATION_FAILED);
817 return E_OPERATION_FAILED;
824 modelId = pTempStrModelId;
826 free(pDummyStrVendor);
827 free(pTempStrModelId);
837 _ISensorCore::GetMeasurementRange(SensorType sensorType, float& min, float& max, float& resolution)
841 case SENSOR_TYPE_TILT:
843 min = MIN_VALUE_TILT;
844 max = MAX_VALUE_TILT;
845 resolution = RESOLUTION_VALUE_TILT;
850 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
852 char* pDummyStrVendor = null;
853 char* pDummyStrModelId = null;
854 float tempMax = 0.0F;
855 float tempMin = 0.0F;
856 float tempResolution = 0.0F;
857 int sensorResult = sensor_get_spec(sensorTypeE, &pDummyStrVendor, &pDummyStrModelId, &tempMax, &tempMin, &tempResolution);
858 if (!IsSuccess(sensorResult))
861 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
863 SysAssertf(false, "GetMeasurementRange() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
864 SetLastResult(E_DEVICE_UNAVAILABLE);
865 return E_DEVICE_UNAVAILABLE;
869 SysAssertf(false, "GetMeasurementRange() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
870 SetLastResult(E_OPERATION_FAILED);
871 return E_OPERATION_FAILED;
876 free(pDummyStrVendor);
877 free(pDummyStrModelId);
881 case SENSOR_ACCELEROMETER:
882 min = tempMin * METER_PER_SECOND_SQUARE_TO_G;
883 max = tempMax * METER_PER_SECOND_SQUARE_TO_G;
884 resolution = tempResolution * METER_PER_SECOND_SQUARE_TO_G;
886 case SENSOR_GYROSCOPE:
887 min = tempMin * DEGREE_TO_RADIAN;
888 max = tempMax * DEGREE_TO_RADIAN;
889 resolution = tempResolution * DEGREE_TO_RADIAN;
894 resolution = tempResolution;
905 _ISensorCore::GetIntervalRange(SensorType sensorType, long& min, long& max)
907 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
911 // int sensorResult = sensor_get_delay_boundary(sensorTypeE, &tempMin, &tempMax); // not implemented yet
912 int sensorResult = GetStaticIntervalRange(sensorType, tempMin, tempMax);
913 if (!IsSuccess(sensorResult))
915 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
917 SysAssertf(false, "GetIntervalRange() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
918 SetLastResult(E_DEVICE_UNAVAILABLE);
919 return E_DEVICE_UNAVAILABLE;
923 SysAssertf(false, "GetIntervalRange() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
924 SetLastResult(E_OPERATION_FAILED);
925 return E_OPERATION_FAILED;
927 // SENSOR_ERROR_IO_ERROR
938 _ISensorCore::IsWakeupSupported(SensorType sensorType)
940 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
942 bool isWakeupSupported = false;
943 int sensorResult = sensor_awake_is_supported(sensorTypeE, &isWakeupSupported);
944 if (!IsSuccess(sensorResult))
946 // SENSOR_ERROR_IO_ERROR
947 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
949 SysAssertf(false, "IsWakeupSupported() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
950 SetLastResult(E_DEVICE_UNAVAILABLE);
955 SysAssertf(false, "IsWakeupSupported() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
956 SetLastResult(E_UNSUPPORTED_OPERATION);
961 return isWakeupSupported;
965 _ISensorCore::IsObjectDetected(float distance)
967 bool isObjectDetected = false;
968 // int sensorResult = sensor_util_is_near(distance, &isNear);
969 int sensorResult = IsStaticObjectDetected(distance, isObjectDetected);
970 if (!IsSuccess(sensorResult))
973 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
975 SysAssertf(false, "IsObjectDetected() > sensor_util_is_near() failed. [distance:%f, result:%d]", distance, sensorResult);
980 SysAssertf(false, "IsObjectDetected() > sensor_util_is_near() failed. [distance:%f, result:%d]", distance, sensorResult);
985 return isObjectDetected;
988 // Sensor event listener management ------------------------------------------------------------------------------------------ //
990 _ISensorCore::AddSensorCoreEventReceiver(_ISensorCoreEventReceiver& receiver)
993 sensor_h sensorHandle = null;
994 result r = ConnectToSensorCore(sensorHandle);
1001 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_CONNECTED);
1002 _SensorCoreEventType eventType = receiver.GetSensorCoreEventType();
1003 long interval = receiver.GetSensorCoreDataEventInterval();
1004 void* pUserData = &receiver;
1005 r = PrepareSensorCoreEventSensing(sensorHandle, eventType, interval, pUserData);
1008 DisconnectFromSensorCore(sensorHandle);
1009 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_NONE);
1014 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_PREPARED);
1015 receiver.SetSensorCoreEventHandle(sensorHandle);
1016 r = StartSensorCoreEventSensing(sensorHandle, eventType);
1019 receiver.SetSensorCoreEventHandle(null);
1020 UnprepareSensorCoreEventSensing(sensorHandle, eventType);
1021 DisconnectFromSensorCore(sensorHandle);
1022 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_NONE);
1026 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_STARTED);
1032 _ISensorCore::RemoveSensorCoreEventReceiver(_ISensorCoreEventReceiver& receiver)
1034 sensor_h sensorHandle = static_cast<sensor_h>(receiver.GetSensorCoreEventHandle());
1035 _SensorCoreEventType eventType = receiver.GetSensorCoreEventType();
1036 result r = E_SUCCESS;
1039 if (receiver.GetSensorCoreEventReceiverState() == _ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_STARTED)
1041 r = StopSensorCoreEventSensing(sensorHandle, eventType);
1047 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_PREPARED);
1051 if (receiver.GetSensorCoreEventReceiverState() == _ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_PREPARED)
1053 r = UnprepareSensorCoreEventSensing(sensorHandle, eventType);
1059 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_CONNECTED);
1063 if (receiver.GetSensorCoreEventReceiverState() == _ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_CONNECTED)
1065 r = DisconnectFromSensorCore(sensorHandle);
1071 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_NONE);
1072 receiver.SetSensorCoreEventHandle(null);
1079 _ISensorCore::ResetSensorCoreEventReceivingInterval(_ISensorCoreEventReceiver& receiver)
1081 sensor_h sensorHandle = static_cast<sensor_h>(receiver.GetSensorCoreEventHandle());
1082 _SensorCoreEventType eventType = receiver.GetSensorCoreEventType();
1083 long interval = receiver.GetSensorCoreDataEventInterval();
1085 result r = ResetSensorCoreDataEventSensingInterval(sensorHandle, eventType, interval);
1094 // Sensor wake up management ------------------------------------------------------------------------------------------------- //
1096 _ISensorCore::SetWakeupEnabled(SensorType sensorType, bool enable)
1102 // not implemented yet
1103 return E_DEVICE_UNAVAILABLE;
1107 } } }// Tizen::Uix::Sensor