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
54 static const long SENSOR_MAX_INTERVALS[] = {
55 100L, // SENSOR_TYPE_ACCELERATION
56 100L, // SENSOR_TYPE_MAGNETIC
57 5000L, // SENSOR_TYPE_PROXIMITY
58 1000L, // SENSOR_TYPE_TILT
59 100L, // SENSOR_TYPE_GYRO
60 5000L, // SENSOR_TYPE_LIGHT
62 static const float MIN_VALUE_TILT = 0.0F;
63 static const float MAX_VALUE_TILT = 360.0F;
64 static const float RESOLUTION_VALUE_TILT = 0.0F;
66 // Internal utility methods -------------------------------------------------------------------------------------------------- //
68 IsSuccess(int sensorResult)
70 return sensorResult == SENSOR_ERROR_NONE;
74 ConvertToSensorTypeEFromSensorType(SensorType sensorType)
78 case SENSOR_TYPE_ACCELERATION:
79 return SENSOR_ACCELEROMETER;
80 case SENSOR_TYPE_MAGNETIC:
81 return SENSOR_MAGNETIC;
82 case SENSOR_TYPE_PROXIMITY:
83 return SENSOR_PROXIMITY;
84 case SENSOR_TYPE_TILT:
85 return SENSOR_ORIENTATION;
86 case SENSOR_TYPE_GYRO:
87 return SENSOR_GYROSCOPE;
88 case SENSOR_TYPE_LIGHT:
91 SysAssertf(false, "ConvertToSensorTypeEFromSensorType() > Invalid SensorType [sensorType:%d]", sensorType);
92 SetLastResult(E_INVALID_ARG);
93 return SENSOR_UNKNOWN;
98 GetStaticIntervalRange(SensorType sensorType, int& min, int& max)
100 min = SENSOR_MIN_INTERVALS[sensorType];
101 max = SENSOR_MAX_INTERVALS[sensorType];
103 return SENSOR_ERROR_NONE;
107 GetSensorTypeEFromSensorCoreEventType(_SensorCoreEventType eventType)
111 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
113 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_SENSOR_WAKEUP:
114 return SENSOR_ACCELEROMETER;
115 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
116 return SENSOR_MAGNETIC;
117 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
118 return SENSOR_ORIENTATION;
119 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
120 return SENSOR_PROXIMITY;
121 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
122 return SENSOR_GYROSCOPE;
123 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
126 SysAssertf(false, "GetSensorTypeEFromSensorCoreEventType() > Invalid _SensorCoreEventType [eventType:%d]", eventType);
127 SetLastResult(E_INVALID_ARG);
128 return SENSOR_UNKNOWN;
133 IsStaticObjectDetected(float distance, bool& isObjectDetected)
135 isObjectDetected = (distance <= 4.0F);
136 return SENSOR_ERROR_NONE;
140 IsAccuracyValid(sensor_data_accuracy_e accuracy)
142 return accuracy >= SENSOR_DATA_ACCURACY_NORMAL;
146 CorrectTimestamp(long long timestamp)
148 return timestamp * MICROSECOND_TO_MILLISECOND;
151 // Internal callback methods ------------------------------------------------------------------------------------------------- //
153 OnAccelerationDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
154 float x, float y, float z, void* pUserData)
156 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
157 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
159 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
160 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA;
161 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
162 eventBuffer.eventKind.accelerationData.x = x * METER_PER_SECOND_SQUARE_TO_G;
163 eventBuffer.eventKind.accelerationData.y = y * METER_PER_SECOND_SQUARE_TO_G;
164 eventBuffer.eventKind.accelerationData.z = z * METER_PER_SECOND_SQUARE_TO_G;
165 receiver.OnSensorCoreEventReceived(eventBuffer);
169 OnMagneticFieldDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
170 float x, float y, float z, void* pUserData)
172 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
173 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
174 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
175 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA;
176 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
177 eventBuffer.eventKind.magneticFieldData.x = x;
178 eventBuffer.eventKind.magneticFieldData.y = y;
179 eventBuffer.eventKind.magneticFieldData.z = z;
180 receiver.OnSensorCoreEventReceived(eventBuffer);
184 OnProximityDistanceDataEventReceived(unsigned long long timestamp, float distance, void* pUserData)
186 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
187 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
188 eventBuffer.isEventValid = true;
189 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA;
190 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
191 eventBuffer.eventKind.proximityDistanceData.distance = distance;
192 receiver.OnSensorCoreEventReceived(eventBuffer);
196 OnTiltAccelerationDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
197 float x, float y, float z, void* pUserData)
199 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
200 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
201 eventBuffer.isEventValid = !(IsEquals(x, 0.0F) && (IsEquals(y, 0.0F) || IsEquals(z, 0.0F)));
202 eventBuffer.eventKind.tiltData.roll = _SensorUtil::Atan2(-x, z) * RADIAN_TO_DEGREE;
203 eventBuffer.eventKind.tiltData.pitch = _SensorUtil::Atan2(-x, y) * RADIAN_TO_DEGREE;
207 OnTiltMagneticAzimuthDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
208 float azimuth, float pitch, float roll, void* pUserData)
210 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
211 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
212 eventBuffer.isEventValid = eventBuffer.isEventValid && IsAccuracyValid(accuracy);
213 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_TILT_DATA;
214 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
215 eventBuffer.eventKind.tiltData.azimuth = azimuth;
216 receiver.OnSensorCoreEventReceived(eventBuffer);
220 OnRotationRateDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
221 float x, float y, float z, void* pUserData)
223 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
224 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
225 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
226 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA;
227 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
228 eventBuffer.eventKind.rotationRateData.x = x * DEGREE_TO_RADIAN;
229 eventBuffer.eventKind.rotationRateData.y = y * DEGREE_TO_RADIAN;
230 eventBuffer.eventKind.rotationRateData.z = z * DEGREE_TO_RADIAN;
231 receiver.OnSensorCoreEventReceived(eventBuffer);
235 OnLightLevelDataEventReceived(unsigned long long timestamp, float lux, void* pUserData)
237 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
238 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
239 eventBuffer.isEventValid = true;
240 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA;
241 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
242 eventBuffer.eventKind.lightLevelData.level = lux;
243 receiver.OnSensorCoreEventReceived(eventBuffer);
247 OnAccelerationSensorWakeupEventReceived(void *pUserData)
249 SysLog(NID_UIX, "Device wake up by Acceleration sensor.");
252 // Internal management methods ----------------------------------------------------------------------------------------------- //
254 ConnectToSensorCore(sensor_h& sensorHandle)
256 sensor_h tempHandle = null;
257 int sensorResult = sensor_create(&tempHandle);
258 if (!IsSuccess(sensorResult))
260 // SENSOR_ERROR_OUT_OF_MEMORY
261 SysAssertf(false, "ConnectToSensorCore() > sensor_create() failed. [handle:%p, result:%d]", tempHandle, sensorResult);
262 SetLastResult(E_OUT_OF_MEMORY);
263 return E_OUT_OF_MEMORY;
266 sensorHandle = tempHandle;
272 DisconnectFromSensorCore(sensor_h& sensorHandle)
274 int sensorResult = sensor_destroy(sensorHandle);
275 if (!IsSuccess(sensorResult))
278 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
280 SysAssertf(false, "DisconnectFromSensorCore() > sensor_destroy() failed. [handle:%p, result:%d]", sensorHandle, sensorResult);
281 SetLastResult(E_DEVICE_UNAVAILABLE);
282 return E_DEVICE_UNAVAILABLE;
286 SysAssertf(false, "DisconnectFromSensorCore() > sensor_destroy() failed. [handle:%p, result:%d]", sensorHandle, sensorResult);
287 SetLastResult(E_OPERATION_FAILED);
288 return E_OPERATION_FAILED;
298 PrepareSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType, long interval, void* pUserData)
300 int sensorResult = SENSOR_ERROR_NONE;
303 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
305 sensorResult = sensor_accelerometer_set_cb(sensorHandle, interval, OnAccelerationDataEventReceived, pUserData);
308 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
310 sensorResult = sensor_magnetic_set_cb(sensorHandle, interval, OnMagneticFieldDataEventReceived, pUserData);
313 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
315 sensorResult = sensor_proximity_set_cb(sensorHandle, interval, OnProximityDistanceDataEventReceived, pUserData);
318 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
320 sensorResult = sensor_accelerometer_set_cb(sensorHandle, interval, OnTiltAccelerationDataEventReceived, pUserData);
321 if (!IsSuccess(sensorResult))
325 sensorResult = sensor_orientation_set_cb(sensorHandle, interval, OnTiltMagneticAzimuthDataEventReceived, pUserData);
326 if (!IsSuccess(sensorResult))
328 sensor_accelerometer_unset_cb(sensorHandle);
332 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
334 sensorResult = sensor_gyroscope_set_cb(sensorHandle, interval, OnRotationRateDataEventReceived, pUserData);
337 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
339 sensorResult = sensor_light_set_cb(sensorHandle, interval, OnLightLevelDataEventReceived, pUserData);
342 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_SENSOR_WAKEUP:
344 sensorResult = sensor_awake_set_cb(sensorHandle, SENSOR_ACCELEROMETER, OnAccelerationSensorWakeupEventReceived, pUserData);
350 SysAssertf(false, "PrepareSensorCoreEventSensing() > [%s] PARADOX [eventType:%d]", GetErrorMessage(E_INVALID_ARG), eventType);
351 SetLastResult(E_INVALID_ARG);
352 return E_INVALID_ARG;
356 if (!IsSuccess(sensorResult))
358 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
359 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
361 SysAssertf(false, "PrepareSensorCoreEventSensing() > sensor_xxx_set_cb() failed. [handle:%p, eventType:%d, interval:%ld, result:%d]", sensorHandle, eventType, interval, sensorResult);
362 SetLastResult(E_DEVICE_UNAVAILABLE);
363 return E_DEVICE_UNAVAILABLE;
367 SysAssertf(false, "PrepareSensorCoreEventSensing() > sensor_xxx_set_cb() failed. [handle:%p, eventType:%d, interval:%ld, result:%d]", sensorHandle, eventType, interval, sensorResult);
368 SetLastResult(E_OPERATION_FAILED);
369 return E_OPERATION_FAILED;
378 UnprepareSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType)
380 int sensorResult = SENSOR_ERROR_NONE;
383 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
385 sensorResult = sensor_accelerometer_unset_cb(sensorHandle);
388 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
390 sensorResult = sensor_magnetic_unset_cb(sensorHandle);
393 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
395 sensorResult = sensor_proximity_unset_cb(sensorHandle);
398 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
400 sensorResult = sensor_orientation_unset_cb(sensorHandle);
401 if (!IsSuccess(sensorResult))
405 sensorResult = sensor_accelerometer_unset_cb(sensorHandle);
408 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
410 sensorResult = sensor_gyroscope_unset_cb(sensorHandle);
413 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
415 sensorResult = sensor_light_unset_cb(sensorHandle);
418 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_SENSOR_WAKEUP:
420 sensorResult = sensor_awake_unset_cb(sensorHandle, SENSOR_ACCELEROMETER);
426 SysAssertf(false, "UnprepareSensorCoreEventSensing() > [%s] PARADOX [eventType:%d]", GetErrorMessage(E_INVALID_ARG), eventType);
427 SetLastResult(E_INVALID_ARG);
428 return E_INVALID_ARG;
432 if (!IsSuccess(sensorResult))
434 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
435 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
437 SysAssertf(false, "UnprepareSensorCoreEventSensing() > sensor_xxx_unset_cb() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
438 SetLastResult(E_DEVICE_UNAVAILABLE);
439 return E_DEVICE_UNAVAILABLE;
443 SysAssertf(false, "UnprepareSensorCoreEventSensing() > sensor_xxx_unset_cb() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
444 SetLastResult(E_OPERATION_FAILED);
445 return E_OPERATION_FAILED;
455 StartSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType)
459 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
461 int sensorResult = sensor_start(sensorHandle, SENSOR_ACCELEROMETER);
462 if (!IsSuccess(sensorResult))
464 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
465 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
467 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ACCELEROMETER, sensorResult);
468 SetLastResult(E_DEVICE_UNAVAILABLE);
469 return E_DEVICE_UNAVAILABLE;
473 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ACCELEROMETER, sensorResult);
474 SetLastResult(E_OPERATION_FAILED);
475 return E_OPERATION_FAILED;
479 sensorResult = sensor_start(sensorHandle, SENSOR_ORIENTATION);
480 if (!IsSuccess(sensorResult))
482 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
483 sensor_stop(sensorHandle, SENSOR_ACCELEROMETER);
485 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
487 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ORIENTATION, sensorResult);
488 SetLastResult(E_DEVICE_UNAVAILABLE);
489 return E_DEVICE_UNAVAILABLE;
493 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ORIENTATION, sensorResult);
494 SetLastResult(E_OPERATION_FAILED);
495 return E_OPERATION_FAILED;
499 sensorResult = sensor_set_always_on(sensorHandle, SENSOR_ACCELEROMETER);
500 if (!IsSuccess(sensorResult))
502 // SENSOR_ERROR_IO_ERROR
503 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
505 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ACCELEROMETER, sensorResult);
506 SetLastResult(E_DEVICE_UNAVAILABLE);
507 return E_DEVICE_UNAVAILABLE;
511 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ACCELEROMETER, sensorResult);
512 SetLastResult(E_OPERATION_FAILED);
513 return E_OPERATION_FAILED;
516 sensorResult = sensor_set_always_on(sensorHandle, SENSOR_ORIENTATION);
517 if (!IsSuccess(sensorResult))
519 // SENSOR_ERROR_IO_ERROR
520 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
522 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ORIENTATION, sensorResult);
523 SetLastResult(E_DEVICE_UNAVAILABLE);
524 return E_DEVICE_UNAVAILABLE;
528 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ORIENTATION, sensorResult);
529 SetLastResult(E_OPERATION_FAILED);
530 return E_OPERATION_FAILED;
538 sensor_type_e sensorTypeE = GetSensorTypeEFromSensorCoreEventType(eventType);
540 int sensorResult = sensor_start(sensorHandle, sensorTypeE);
541 if (!IsSuccess(sensorResult))
543 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
544 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
546 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
547 SetLastResult(E_DEVICE_UNAVAILABLE);
548 return E_DEVICE_UNAVAILABLE;
552 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
553 SetLastResult(E_OPERATION_FAILED);
554 return E_OPERATION_FAILED;
557 sensorResult = sensor_set_always_on(sensorHandle, sensorTypeE);
558 if (!IsSuccess(sensorResult))
560 // SENSOR_ERROR_IO_ERROR
561 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
563 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
564 SetLastResult(E_DEVICE_UNAVAILABLE);
565 return E_DEVICE_UNAVAILABLE;
569 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
570 SetLastResult(E_OPERATION_FAILED);
571 return E_OPERATION_FAILED;
582 StopSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType)
586 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
588 int sensorResult = sensor_stop(sensorHandle, SENSOR_ORIENTATION);
589 if (!IsSuccess(sensorResult))
591 // SENSOR_ERROR_IO_ERROR
592 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
594 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ORIENTATION, sensorResult);
595 SetLastResult(E_DEVICE_UNAVAILABLE);
596 return E_DEVICE_UNAVAILABLE;
600 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ACCELEROMETER, sensorResult);
601 SetLastResult(E_OPERATION_FAILED);
602 return E_OPERATION_FAILED;
607 sensorResult = sensor_stop(sensorHandle, SENSOR_ACCELEROMETER);
608 if (!IsSuccess(sensorResult))
610 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
612 // SENSOR_ERROR_IO_ERROR
613 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ACCELEROMETER, sensorResult);
614 SetLastResult(E_DEVICE_UNAVAILABLE);
615 return E_DEVICE_UNAVAILABLE;
619 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, SENSOR_ACCELEROMETER, sensorResult);
620 SetLastResult(E_OPERATION_FAILED);
621 return E_OPERATION_FAILED;
629 sensor_type_e sensorTypeE = GetSensorTypeEFromSensorCoreEventType(eventType);
631 int sensorResult = sensor_stop(sensorHandle, sensorTypeE);
632 if (!IsSuccess(sensorResult))
634 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
636 SysAssertf(false, "StopSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
637 SetLastResult(E_DEVICE_UNAVAILABLE);
638 return E_DEVICE_UNAVAILABLE;
642 SysAssertf(false, "StopSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
643 SetLastResult(E_OPERATION_FAILED);
644 return E_OPERATION_FAILED;
646 // SENSOR_ERROR_IO_ERROR
656 ResetSensorCoreDataEventSensingInterval(sensor_h sensorHandle, _SensorCoreEventType eventType, long interval)
658 int sensorResult = SENSOR_ERROR_NONE;
661 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
663 sensorResult = sensor_accelerometer_set_interval(sensorHandle, interval);
666 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
668 sensorResult = sensor_magnetic_set_interval(sensorHandle, interval);
671 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
673 sensorResult = sensor_proximity_set_interval(sensorHandle, interval);
676 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
678 sensorResult = sensor_orientation_set_interval(sensorHandle, interval);
679 if (!IsSuccess(sensorResult))
683 sensorResult = sensor_accelerometer_set_interval(sensorHandle, interval);
686 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
688 sensorResult = sensor_gyroscope_set_interval(sensorHandle, interval);
691 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
693 sensorResult = sensor_light_set_interval(sensorHandle, interval);
699 SysAssertf(false, "ResetSensorCoreDataEventSensingInterval() > [%s] PARADOX [eventType:%d]", GetErrorMessage(E_INVALID_ARG), eventType);
700 SetLastResult(E_INVALID_ARG);
701 return E_INVALID_ARG;
705 if (!IsSuccess(sensorResult))
707 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
709 SysAssertf(false, "ResetSensorCoreDataEventSensingInterval() > sensor_xxx_set_interval() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
710 SetLastResult(E_DEVICE_UNAVAILABLE);
711 return E_DEVICE_UNAVAILABLE;
715 SysAssertf(false, "ResetSensorCoreDataEventSensingInterval() > sensor_xxx_set_interval() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
716 SetLastResult(E_OPERATION_FAILED);
717 return E_OPERATION_FAILED;
719 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
727 // Getting sensor information ------------------------------------------------------------------------------------------------ //
729 _ISensorCore::IsSupported(SensorType sensorType)
731 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
733 bool isSupported = false;
734 int sensorResult = sensor_is_supported(sensorTypeE, &isSupported);
735 if (!IsSuccess(sensorResult))
737 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
739 SysAssertf(false, "IsSupported() > sensor_is_supported() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
740 SetLastResult(E_DEVICE_UNAVAILABLE);
745 SysAssertf(false, "IsSupported() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
746 SetLastResult(E_OPERATION_FAILED);
755 _ISensorCore::GetDescription(SensorType sensorType, Tizen::Base::String& description)
757 description = L"In preparation...";
762 _ISensorCore::GetVendor(SensorType sensorType, Tizen::Base::String& vendor)
766 case SENSOR_TYPE_TILT:
769 vendor = W_MSG_EMUL_VENDOR;
771 vendor = W_MSG_NOT_SUPPORTED;
777 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
779 char* pTempStrVendor = null;
780 char* pDummyStrModelId = null;
781 float dummyMax = 0.0F;
782 float dummyMin = 0.0F;
783 float dummyResolution = 0.0F;
784 int sensorResult = sensor_get_spec(sensorTypeE, &pTempStrVendor, &pDummyStrModelId, &dummyMax, &dummyMin, &dummyResolution);
785 if (!IsSuccess(sensorResult))
788 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
790 SysAssertf(false, "GetVendor() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
791 SetLastResult(E_DEVICE_UNAVAILABLE);
792 return E_DEVICE_UNAVAILABLE;
796 SysAssertf(false, "GetVendor() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
797 SetLastResult(E_OPERATION_FAILED);
798 return E_OPERATION_FAILED;
803 vendor = pTempStrVendor;
805 free(pTempStrVendor);
806 free(pDummyStrModelId);
816 _ISensorCore::GetModelId(SensorType sensorType, Tizen::Base::String& modelId)
820 case SENSOR_TYPE_TILT:
823 modelId = W_MSG_EMUL_MODEL_ID_TILT;
825 modelId = W_MSG_NOT_SUPPORTED;
831 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
833 char* pDummyStrVendor = null;
834 char* pTempStrModelId = null;
835 float dummyMax = 0.0F;
836 float dummyMin = 0.0F;
837 float dummyResolution = 0.0F;
838 int sensorResult = sensor_get_spec(sensorTypeE, &pDummyStrVendor, &pTempStrModelId, &dummyMax, &dummyMin, &dummyResolution);
839 if (!IsSuccess(sensorResult))
842 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
844 SysAssertf(false, "GetModelId() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
845 SetLastResult(E_DEVICE_UNAVAILABLE);
846 return E_DEVICE_UNAVAILABLE;
850 SysAssertf(false, "GetModelId() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
851 SetLastResult(E_OPERATION_FAILED);
852 return E_OPERATION_FAILED;
859 modelId = pTempStrModelId;
861 free(pDummyStrVendor);
862 free(pTempStrModelId);
872 _ISensorCore::GetMeasurementRange(SensorType sensorType, float& min, float& max, float& resolution)
876 case SENSOR_TYPE_TILT:
878 min = MIN_VALUE_TILT;
879 max = MAX_VALUE_TILT;
880 resolution = RESOLUTION_VALUE_TILT;
885 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
887 char* pDummyStrVendor = null;
888 char* pDummyStrModelId = null;
889 float tempMax = 0.0F;
890 float tempMin = 0.0F;
891 float tempResolution = 0.0F;
892 int sensorResult = sensor_get_spec(sensorTypeE, &pDummyStrVendor, &pDummyStrModelId, &tempMax, &tempMin, &tempResolution);
893 if (!IsSuccess(sensorResult))
896 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
898 SysAssertf(false, "GetMeasurementRange() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
899 SetLastResult(E_DEVICE_UNAVAILABLE);
900 return E_DEVICE_UNAVAILABLE;
904 SysAssertf(false, "GetMeasurementRange() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
905 SetLastResult(E_OPERATION_FAILED);
906 return E_OPERATION_FAILED;
911 free(pDummyStrVendor);
912 free(pDummyStrModelId);
916 case SENSOR_ACCELEROMETER:
917 min = tempMin * METER_PER_SECOND_SQUARE_TO_G;
918 max = tempMax * METER_PER_SECOND_SQUARE_TO_G;
919 resolution = tempResolution * METER_PER_SECOND_SQUARE_TO_G;
921 case SENSOR_GYROSCOPE:
922 min = tempMin * DEGREE_TO_RADIAN;
923 max = tempMax * DEGREE_TO_RADIAN;
924 resolution = tempResolution * DEGREE_TO_RADIAN;
929 resolution = tempResolution;
940 _ISensorCore::GetIntervalRange(SensorType sensorType, long& min, long& max)
942 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
946 // int sensorResult = sensor_get_delay_boundary(sensorTypeE, &tempMin, &tempMax); // not implemented yet
947 int sensorResult = GetStaticIntervalRange(sensorType, tempMin, tempMax);
948 if (!IsSuccess(sensorResult))
950 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
952 SysAssertf(false, "GetIntervalRange() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
953 SetLastResult(E_DEVICE_UNAVAILABLE);
954 return E_DEVICE_UNAVAILABLE;
958 SysAssertf(false, "GetIntervalRange() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
959 SetLastResult(E_OPERATION_FAILED);
960 return E_OPERATION_FAILED;
962 // SENSOR_ERROR_IO_ERROR
973 _ISensorCore::IsWakeupSupported(SensorType sensorType)
975 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
977 bool isWakeupSupported = false;
978 int sensorResult = sensor_awake_is_supported(sensorTypeE, &isWakeupSupported);
979 if (!IsSuccess(sensorResult))
981 // SENSOR_ERROR_IO_ERROR
982 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
984 SysAssertf(false, "IsWakeupSupported() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
985 SetLastResult(E_DEVICE_UNAVAILABLE);
990 SysAssertf(false, "IsWakeupSupported() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
991 SetLastResult(E_OPERATION_FAILED);
996 return isWakeupSupported;
1000 _ISensorCore::IsObjectDetected(float distance)
1002 bool isObjectDetected = false;
1003 // int sensorResult = sensor_util_is_near(distance, &isNear);
1004 int sensorResult = IsStaticObjectDetected(distance, isObjectDetected);
1005 if (!IsSuccess(sensorResult))
1008 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
1010 SysAssertf(false, "IsObjectDetected() > sensor_util_is_near() failed. [distance:%f, result:%d]", distance, sensorResult);
1015 SysAssertf(false, "IsObjectDetected() > sensor_util_is_near() failed. [distance:%f, result:%d]", distance, sensorResult);
1020 return isObjectDetected;
1023 // Sensor event listener management ------------------------------------------------------------------------------------------ //
1025 _ISensorCore::AddSensorCoreEventReceiver(_ISensorCoreEventReceiver& receiver)
1028 sensor_h sensorHandle = null;
1029 result r = ConnectToSensorCore(sensorHandle);
1036 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_CONNECTED);
1037 _SensorCoreEventType eventType = receiver.GetSensorCoreEventType();
1038 long interval = receiver.GetSensorCoreDataEventInterval();
1039 void* pUserData = &receiver;
1040 r = PrepareSensorCoreEventSensing(sensorHandle, eventType, interval, pUserData);
1043 DisconnectFromSensorCore(sensorHandle);
1044 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_NONE);
1049 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_PREPARED);
1050 receiver.SetSensorCoreEventHandle(sensorHandle);
1051 r = StartSensorCoreEventSensing(sensorHandle, eventType);
1054 receiver.SetSensorCoreEventHandle(null);
1055 UnprepareSensorCoreEventSensing(sensorHandle, eventType);
1056 DisconnectFromSensorCore(sensorHandle);
1057 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_NONE);
1061 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_STARTED);
1067 _ISensorCore::RemoveSensorCoreEventReceiver(_ISensorCoreEventReceiver& receiver)
1069 sensor_h sensorHandle = static_cast<sensor_h>(receiver.GetSensorCoreEventHandle());
1070 _SensorCoreEventType eventType = receiver.GetSensorCoreEventType();
1071 result r = E_SUCCESS;
1074 if (receiver.GetSensorCoreEventReceiverState() == _ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_STARTED)
1076 r = StopSensorCoreEventSensing(sensorHandle, eventType);
1082 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_PREPARED);
1086 if (receiver.GetSensorCoreEventReceiverState() == _ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_PREPARED)
1088 r = UnprepareSensorCoreEventSensing(sensorHandle, eventType);
1094 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_CONNECTED);
1098 if (receiver.GetSensorCoreEventReceiverState() == _ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_CONNECTED)
1100 r = DisconnectFromSensorCore(sensorHandle);
1106 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_NONE);
1107 receiver.SetSensorCoreEventHandle(null);
1114 _ISensorCore::ResetSensorCoreEventReceivingInterval(_ISensorCoreEventReceiver& receiver)
1116 sensor_h sensorHandle = static_cast<sensor_h>(receiver.GetSensorCoreEventHandle());
1117 _SensorCoreEventType eventType = receiver.GetSensorCoreEventType();
1118 long interval = receiver.GetSensorCoreDataEventInterval();
1120 result r = ResetSensorCoreDataEventSensingInterval(sensorHandle, eventType, interval);
1129 // Sensor wake up management ------------------------------------------------------------------------------------------------- //
1131 _ISensorCore::SetWakeupEnabled(SensorType sensorType, bool enable)
1137 // not implemented yet
1138 return E_DEVICE_UNAVAILABLE;
1142 } } }// Tizen::Uix::Sensor