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 OnTiltAccelerationDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
215 float x, float y, float z, void* pUserData)
217 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
218 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
219 eventBuffer.isEventValid = !(IsEquals(x, 0.0F) && (IsEquals(y, 0.0F) || IsEquals(z, 0.0F)));
220 eventBuffer.eventKind.tiltData.roll = _SensorUtil::Atan2(-x, z) * RADIAN_TO_DEGREE;
221 eventBuffer.eventKind.tiltData.pitch = _SensorUtil::Atan2(-x, y) * RADIAN_TO_DEGREE;
225 OnTiltMagneticAzimuthDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
226 float azimuth, float pitch, float roll, void* pUserData)
228 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
229 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
230 eventBuffer.isEventValid = eventBuffer.isEventValid && IsAccuracyValid(accuracy);
231 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_TILT_DATA;
232 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
233 eventBuffer.eventKind.tiltData.azimuth = azimuth;
234 receiver.OnSensorCoreEventReceived(eventBuffer);
238 OnRotationRateDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,
239 float x, float y, float z, void* pUserData)
241 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
242 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
243 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
244 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA;
245 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
246 eventBuffer.eventKind.rotationRateData.x = x;
247 eventBuffer.eventKind.rotationRateData.y = y;
248 eventBuffer.eventKind.rotationRateData.z = z;
249 receiver.OnSensorCoreEventReceived(eventBuffer);
253 OnLightLevelDataEventReceived(unsigned long long timestamp, float lux, void* pUserData)
255 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
256 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
257 eventBuffer.isEventValid = true;
258 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA;
259 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
260 eventBuffer.eventKind.lightLevelData.level = lux;
261 receiver.OnSensorCoreEventReceived(eventBuffer);
265 OnAccelerationSensorWakeupEventReceived(void *pUserData)
267 SysLog(NID_UIX, " OnAccelerationSensorWakeupEventReceived Device wake up by Acceleration sensor.");
271 OnGravityDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,float x, float y, float z, void* pUserData)
273 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
274 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
276 SysLog(NID_UIX, "taehwan.son OnGravityDataEventReceived.");
277 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
278 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA;
279 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
280 eventBuffer.eventKind.gravityData.x = x;
281 eventBuffer.eventKind.gravityData.y = y;
282 eventBuffer.eventKind.gravityData.z = z;
283 receiver.OnSensorCoreEventReceived(eventBuffer);
288 OnUserAccelerationDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,float x, float y, float z, void* pUserData)
290 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
291 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
293 SysLog(NID_UIX, "OnUserAccelerationDataEventReceived.");
294 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
295 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_USER_ACCELERATION_DATA;
296 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
297 eventBuffer.eventKind.userAccelerationData.x = x * METER_PER_SECOND_SQUARE_TO_G;
298 eventBuffer.eventKind.userAccelerationData.y = y * METER_PER_SECOND_SQUARE_TO_G;
299 eventBuffer.eventKind.userAccelerationData.z = z * METER_PER_SECOND_SQUARE_TO_G;
300 receiver.OnSensorCoreEventReceived(eventBuffer);
304 OnDeviceOrientationDataEventReceived(unsigned long long timestamp, sensor_data_accuracy_e accuracy,float yaw, float pitch, float roll, void* pUserData)
306 _ISensorCoreEventReceiver& receiver= *static_cast<_ISensorCoreEventReceiver*>(pUserData);
307 _SensorCoreEvent& eventBuffer = receiver.GetSensorCoreEventBuffer();
309 SysLog(NID_UIX, "OnDeviceOrientationDataEventReceived.");
310 eventBuffer.isEventValid = IsAccuracyValid(accuracy);
311 eventBuffer.eventType = _SENSOR_CORE_EVENT_TYPE_DEVICE_ORIENTATION_DATA;
312 eventBuffer.eventTimestamp = CorrectTimestamp(timestamp);
313 eventBuffer.eventKind.deviceOrientationData.yaw = yaw;
314 eventBuffer.eventKind.deviceOrientationData.pitch = pitch;
315 eventBuffer.eventKind.deviceOrientationData.roll = roll;
316 receiver.OnSensorCoreEventReceived(eventBuffer);
319 // Internal management methods ----------------------------------------------------------------------------------------------- //
321 ConnectToSensorCore(sensor_h& sensorHandle)
323 sensor_h tempHandle = null;
324 int sensorResult = sensor_create(&tempHandle);
325 if (!IsSuccess(sensorResult))
327 // SENSOR_ERROR_OUT_OF_MEMORY
328 SysAssertf(false, "ConnectToSensorCore() > sensor_create() failed. [handle:%p, result:%d]", tempHandle, sensorResult);
329 SetLastResult(E_OUT_OF_MEMORY);
330 return E_OUT_OF_MEMORY;
333 sensorHandle = tempHandle;
339 DisconnectFromSensorCore(sensor_h& sensorHandle)
341 int sensorResult = sensor_destroy(sensorHandle);
342 if (!IsSuccess(sensorResult))
345 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
347 SysAssertf(false, "DisconnectFromSensorCore() > sensor_destroy() failed. [handle:%p, result:%d]", sensorHandle, sensorResult);
348 SetLastResult(E_DEVICE_UNAVAILABLE);
349 return E_DEVICE_UNAVAILABLE;
353 SysAssertf(false, "DisconnectFromSensorCore() > sensor_destroy() failed. [handle:%p, result:%d]", sensorHandle, sensorResult);
354 SetLastResult(E_OPERATION_FAILED);
355 return E_OPERATION_FAILED;
365 PrepareSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType, long interval, void* pUserData)
367 int sensorResult = SENSOR_ERROR_NONE;
370 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
372 sensorResult = sensor_accelerometer_set_cb(sensorHandle, interval, OnAccelerationDataEventReceived, pUserData);
375 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
377 sensorResult = sensor_magnetic_set_cb(sensorHandle, interval, OnMagneticFieldDataEventReceived, pUserData);
380 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
382 sensorResult = sensor_proximity_set_cb(sensorHandle, interval, OnProximityDistanceDataEventReceived, pUserData);
385 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
387 sensorResult = sensor_accelerometer_set_cb(sensorHandle, interval, OnTiltAccelerationDataEventReceived, pUserData);
388 if (!IsSuccess(sensorResult))
392 sensorResult = sensor_orientation_set_cb(sensorHandle, interval, OnTiltMagneticAzimuthDataEventReceived, pUserData);
393 if (!IsSuccess(sensorResult))
395 sensor_accelerometer_unset_cb(sensorHandle);
399 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
401 sensorResult = sensor_gyroscope_set_cb(sensorHandle, interval, OnRotationRateDataEventReceived, pUserData);
404 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
406 sensorResult = sensor_light_set_cb(sensorHandle, interval, OnLightLevelDataEventReceived, pUserData);
409 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_SENSOR_WAKEUP:
411 sensorResult = sensor_awake_set_cb(sensorHandle, SENSOR_ACCELEROMETER, OnAccelerationSensorWakeupEventReceived, pUserData);
414 case _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA:
416 sensorResult = sensor_gravity_set_cb(sensorHandle, interval, OnGravityDataEventReceived, pUserData);
419 case _SENSOR_CORE_EVENT_TYPE_USER_ACCELERATION_DATA:
421 sensorResult = sensor_linear_acceleration_set_cb(sensorHandle, interval, OnUserAccelerationDataEventReceived, pUserData);
424 case _SENSOR_CORE_EVENT_TYPE_DEVICE_ORIENTATION_DATA:
426 sensorResult = sensor_device_orientation_set_cb(sensorHandle, interval, OnDeviceOrientationDataEventReceived, pUserData);
432 SysAssertf(false, "PrepareSensorCoreEventSensing() > [%s] PARADOX [eventType:%d]", GetErrorMessage(E_INVALID_ARG), eventType);
433 SetLastResult(E_INVALID_ARG);
434 return E_INVALID_ARG;
438 if (!IsSuccess(sensorResult))
440 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
441 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
443 SysAssertf(false, "PrepareSensorCoreEventSensing() > sensor_xxx_set_cb() failed. [handle:%p, eventType:%d, interval:%ld, result:%d]", sensorHandle, eventType, interval, sensorResult);
444 SetLastResult(E_DEVICE_UNAVAILABLE);
445 return E_DEVICE_UNAVAILABLE;
449 SysAssertf(false, "PrepareSensorCoreEventSensing() > sensor_xxx_set_cb() failed. [handle:%p, eventType:%d, interval:%ld, result:%d]", sensorHandle, eventType, interval, sensorResult);
450 SetLastResult(E_OPERATION_FAILED);
451 return E_OPERATION_FAILED;
460 UnprepareSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType)
462 int sensorResult = SENSOR_ERROR_NONE;
465 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
467 sensorResult = sensor_accelerometer_unset_cb(sensorHandle);
470 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
472 sensorResult = sensor_magnetic_unset_cb(sensorHandle);
475 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
477 sensorResult = sensor_proximity_unset_cb(sensorHandle);
480 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
482 sensorResult = sensor_orientation_unset_cb(sensorHandle);
483 if (!IsSuccess(sensorResult))
487 sensorResult = sensor_accelerometer_unset_cb(sensorHandle);
490 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
492 sensorResult = sensor_gyroscope_unset_cb(sensorHandle);
495 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
497 sensorResult = sensor_light_unset_cb(sensorHandle);
500 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_SENSOR_WAKEUP:
502 sensorResult = sensor_awake_unset_cb(sensorHandle, SENSOR_ACCELEROMETER);
505 case _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA:
507 sensorResult = sensor_gravity_unset_cb(sensorHandle);
510 case _SENSOR_CORE_EVENT_TYPE_USER_ACCELERATION_DATA:
512 sensorResult = sensor_linear_acceleration_unset_cb(sensorHandle);
515 case _SENSOR_CORE_EVENT_TYPE_DEVICE_ORIENTATION_DATA:
517 sensorResult = sensor_device_orientation_unset_cb(sensorHandle);
523 SysAssertf(false, "UnprepareSensorCoreEventSensing() > [%s] PARADOX [eventType:%d]", GetErrorMessage(E_INVALID_ARG), eventType);
524 SetLastResult(E_INVALID_ARG);
525 return E_INVALID_ARG;
529 if (!IsSuccess(sensorResult))
531 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
532 if(_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
534 SysAssertf(false, "UnprepareSensorCoreEventSensing() > sensor_xxx_unset_cb() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
535 SetLastResult(E_DEVICE_UNAVAILABLE);
536 return E_DEVICE_UNAVAILABLE;
540 SysAssertf(false, "UnprepareSensorCoreEventSensing() > sensor_xxx_unset_cb() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
541 SetLastResult(E_OPERATION_FAILED);
542 return E_OPERATION_FAILED;
552 StartSensorType(sensor_h sensorHandle, sensor_type_e sensorTypeE)
554 int sensorResult = sensor_start(sensorHandle, sensorTypeE);
555 if (!IsSuccess(sensorResult))
557 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
558 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
560 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
561 SetLastResult(E_DEVICE_UNAVAILABLE);
562 return E_DEVICE_UNAVAILABLE;
566 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_start() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
567 SetLastResult(E_OPERATION_FAILED);
568 return E_OPERATION_FAILED;
572 sensorResult = sensor_set_always_on(sensorHandle, sensorTypeE);
573 if (!IsSuccess(sensorResult))
575 // SENSOR_ERROR_IO_ERROR
576 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
578 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
579 SetLastResult(E_DEVICE_UNAVAILABLE);
580 return E_DEVICE_UNAVAILABLE;
584 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_set_always_on() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
585 SetLastResult(E_OPERATION_FAILED);
586 return E_OPERATION_FAILED;
593 StartSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType)
597 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
599 StartSensorType(sensorHandle,SENSOR_ACCELEROMETER);
600 StartSensorType(sensorHandle,SENSOR_ORIENTATION);
603 case _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA:
605 SysLog(NID_UIX,"taehwan.son ");
606 StartSensorType(sensorHandle,SENSOR_GRAVITY);
611 sensor_type_e sensorTypeE = GetSensorTypeEFromSensorCoreEventType(eventType);
612 StartSensorType(sensorHandle,sensorTypeE);
620 StopSensorType(sensor_h sensorHandle, sensor_type_e sensorTypeE)
622 int sensorResult = sensor_stop(sensorHandle,sensorTypeE );
623 if (!IsSuccess(sensorResult))
625 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
627 // SENSOR_ERROR_IO_ERROR
628 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
629 SetLastResult(E_DEVICE_UNAVAILABLE);
630 return E_DEVICE_UNAVAILABLE;
634 SysAssertf(false, "StartSensorCoreEventSensing() > sensor_stop() failed. [handle:%p, sensorTypeE:%d, result:%d]", sensorHandle, sensorTypeE, sensorResult);
635 SetLastResult(E_OPERATION_FAILED);
636 return E_OPERATION_FAILED;
644 StopSensorCoreEventSensing(sensor_h sensorHandle, _SensorCoreEventType eventType)
648 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
650 StopSensorType(sensorHandle,SENSOR_ORIENTATION );
651 StopSensorType(sensorHandle,SENSOR_ACCELEROMETER );
654 case _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA:
656 StopSensorType(sensorHandle,SENSOR_GRAVITY);
661 sensor_type_e sensorTypeE = GetSensorTypeEFromSensorCoreEventType(eventType);
662 StopSensorType(sensorHandle,sensorTypeE);
671 ResetSensorCoreDataEventSensingInterval(sensor_h sensorHandle, _SensorCoreEventType eventType, long interval)
673 int sensorResult = SENSOR_ERROR_NONE;
676 case _SENSOR_CORE_EVENT_TYPE_ACCELERATION_DATA:
678 sensorResult = sensor_accelerometer_set_interval(sensorHandle, interval);
681 case _SENSOR_CORE_EVENT_TYPE_MAGNETIC_FIELD_DATA:
683 sensorResult = sensor_magnetic_set_interval(sensorHandle, interval);
686 case _SENSOR_CORE_EVENT_TYPE_PROXIMITY_DISTANCE_DATA:
688 sensorResult = sensor_proximity_set_interval(sensorHandle, interval);
691 case _SENSOR_CORE_EVENT_TYPE_TILT_DATA:
693 sensorResult = sensor_orientation_set_interval(sensorHandle, interval);
694 if (!IsSuccess(sensorResult))
698 sensorResult = sensor_accelerometer_set_interval(sensorHandle, interval);
701 case _SENSOR_CORE_EVENT_TYPE_ROTATION_RATE_DATA:
703 sensorResult = sensor_gyroscope_set_interval(sensorHandle, interval);
706 case _SENSOR_CORE_EVENT_TYPE_LIGHT_LEVEL_DATA:
708 sensorResult = sensor_light_set_interval(sensorHandle, interval);
711 case _SENSOR_CORE_EVENT_TYPE_GRAVITY_DATA:
713 sensorResult = sensor_gravity_set_interval(sensorHandle, interval);
716 case _SENSOR_CORE_EVENT_TYPE_USER_ACCELERATION_DATA:
718 sensorResult = sensor_gravity_set_interval(sensorHandle, interval);
721 case _SENSOR_CORE_EVENT_TYPE_DEVICE_ORIENTATION_DATA:
723 sensorResult = sensor_gravity_set_interval(sensorHandle, interval);
729 SysAssertf(false, "ResetSensorCoreDataEventSensingInterval() > [%s] PARADOX [eventType:%d]", GetErrorMessage(E_INVALID_ARG), eventType);
730 SetLastResult(E_INVALID_ARG);
731 return E_INVALID_ARG;
735 if (!IsSuccess(sensorResult))
737 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
739 SysAssertf(false, "ResetSensorCoreDataEventSensingInterval() > sensor_xxx_set_interval() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
740 SetLastResult(E_DEVICE_UNAVAILABLE);
741 return E_DEVICE_UNAVAILABLE;
745 SysAssertf(false, "ResetSensorCoreDataEventSensingInterval() > sensor_xxx_set_interval() failed. [handle:%p, eventType:%d, result:%d]", sensorHandle, eventType, sensorResult);
746 SetLastResult(E_OPERATION_FAILED);
747 return E_OPERATION_FAILED;
749 // SENSOR_ERROR_IO_ERROR or SENSOR_ERROR_OPERATION_FAILED
757 // Getting sensor information ------------------------------------------------------------------------------------------------ //
759 _ISensorCore::IsSupported(SensorType sensorType)
761 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
763 bool isSupported = false;
764 int sensorResult = sensor_is_supported(sensorTypeE, &isSupported);
765 if (!IsSuccess(sensorResult))
767 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
769 SysAssertf(false, "IsSupported() > sensor_is_supported() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
770 SetLastResult(E_DEVICE_UNAVAILABLE);
775 SysAssertf(false, "IsSupported() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
776 SetLastResult(E_OPERATION_FAILED);
785 _ISensorCore::GetDescription(SensorType sensorType, Tizen::Base::String& description)
787 description = L"In preparation...";
792 _ISensorCore::GetVendor(SensorType sensorType, Tizen::Base::String& vendor)
796 case SENSOR_TYPE_TILT:
799 vendor = W_MSG_EMUL_VENDOR;
801 vendor = W_MSG_NOT_SUPPORTED;
807 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
809 char* pTempStrVendor = null;
810 char* pDummyStrModelId = null;
811 float dummyMax = 0.0F;
812 float dummyMin = 0.0F;
813 float dummyResolution = 0.0F;
814 int sensorResult = sensor_get_spec(sensorTypeE, &pTempStrVendor, &pDummyStrModelId, &dummyMax, &dummyMin, &dummyResolution);
815 if (!IsSuccess(sensorResult))
818 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
820 SysAssertf(false, "GetVendor() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
821 SetLastResult(E_DEVICE_UNAVAILABLE);
822 return E_DEVICE_UNAVAILABLE;
826 SysAssertf(false, "GetVendor() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
827 SetLastResult(E_OPERATION_FAILED);
828 return E_OPERATION_FAILED;
833 vendor = pTempStrVendor;
835 free(pTempStrVendor);
836 free(pDummyStrModelId);
846 _ISensorCore::GetModelId(SensorType sensorType, Tizen::Base::String& modelId)
850 case SENSOR_TYPE_TILT:
853 modelId = W_MSG_EMUL_MODEL_ID_TILT;
855 modelId = W_MSG_NOT_SUPPORTED;
861 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
863 char* pDummyStrVendor = null;
864 char* pTempStrModelId = null;
865 float dummyMax = 0.0F;
866 float dummyMin = 0.0F;
867 float dummyResolution = 0.0F;
868 int sensorResult = sensor_get_spec(sensorTypeE, &pDummyStrVendor, &pTempStrModelId, &dummyMax, &dummyMin, &dummyResolution);
869 if (!IsSuccess(sensorResult))
872 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
874 SysAssertf(false, "GetModelId() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
875 SetLastResult(E_DEVICE_UNAVAILABLE);
876 return E_DEVICE_UNAVAILABLE;
880 SysAssertf(false, "GetModelId() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
881 SetLastResult(E_OPERATION_FAILED);
882 return E_OPERATION_FAILED;
889 modelId = pTempStrModelId;
891 free(pDummyStrVendor);
892 free(pTempStrModelId);
902 _ISensorCore::GetMeasurementRange(SensorType sensorType, float& min, float& max, float& resolution)
906 case SENSOR_TYPE_TILT:
908 min = MIN_VALUE_TILT;
909 max = MAX_VALUE_TILT;
910 resolution = RESOLUTION_VALUE_TILT;
915 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
917 char* pDummyStrVendor = null;
918 char* pDummyStrModelId = null;
919 float tempMax = 0.0F;
920 float tempMin = 0.0F;
921 float tempResolution = 0.0F;
922 int sensorResult = sensor_get_spec(sensorTypeE, &pDummyStrVendor, &pDummyStrModelId, &tempMax, &tempMin, &tempResolution);
923 if (!IsSuccess(sensorResult))
926 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
928 SysAssertf(false, "GetMeasurementRange() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
929 SetLastResult(E_DEVICE_UNAVAILABLE);
930 return E_DEVICE_UNAVAILABLE;
934 SysAssertf(false, "GetMeasurementRange() > sensor_get_spec() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
935 SetLastResult(E_OPERATION_FAILED);
936 return E_OPERATION_FAILED;
941 free(pDummyStrVendor);
942 free(pDummyStrModelId);
946 case SENSOR_ACCELEROMETER:
947 min = tempMin * METER_PER_SECOND_SQUARE_TO_G;
948 max = tempMax * METER_PER_SECOND_SQUARE_TO_G;
949 resolution = tempResolution * METER_PER_SECOND_SQUARE_TO_G;
951 case SENSOR_GYROSCOPE:
952 min = tempMin * DEGREE_TO_RADIAN;
953 max = tempMax * DEGREE_TO_RADIAN;
954 resolution = tempResolution * DEGREE_TO_RADIAN;
959 resolution = tempResolution;
970 _ISensorCore::GetIntervalRange(SensorType sensorType, long& min, long& max)
972 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
976 // int sensorResult = sensor_get_delay_boundary(sensorTypeE, &tempMin, &tempMax); // not implemented yet
977 int sensorResult = GetStaticIntervalRange(sensorType, tempMin, tempMax);
978 if (!IsSuccess(sensorResult))
980 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
982 SysAssertf(false, "GetIntervalRange() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
983 SetLastResult(E_DEVICE_UNAVAILABLE);
984 return E_DEVICE_UNAVAILABLE;
988 SysAssertf(false, "GetIntervalRange() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
989 SetLastResult(E_OPERATION_FAILED);
990 return E_OPERATION_FAILED;
992 // SENSOR_ERROR_IO_ERROR
1003 _ISensorCore::IsWakeupSupported(SensorType sensorType)
1005 sensor_type_e sensorTypeE = ConvertToSensorTypeEFromSensorType(sensorType);
1007 bool isWakeupSupported = false;
1008 int sensorResult = sensor_awake_is_supported(sensorTypeE, &isWakeupSupported);
1009 if (!IsSuccess(sensorResult))
1011 // SENSOR_ERROR_IO_ERROR
1012 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
1014 SysAssertf(false, "IsWakeupSupported() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
1015 SetLastResult(E_DEVICE_UNAVAILABLE);
1020 SysAssertf(false, "IsWakeupSupported() > sensor_get_delay_boundary() failed. [sensorTypeE:%d, result:%d]", sensorTypeE, sensorResult);
1021 SetLastResult(E_OPERATION_FAILED);
1026 return isWakeupSupported;
1030 _ISensorCore::IsObjectDetected(float distance)
1032 bool isObjectDetected = false;
1033 // int sensorResult = sensor_util_is_near(distance, &isNear);
1034 int sensorResult = IsStaticObjectDetected(distance, isObjectDetected);
1035 if (!IsSuccess(sensorResult))
1038 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
1040 SysAssertf(false, "IsObjectDetected() > sensor_util_is_near() failed. [distance:%f, result:%d]", distance, sensorResult);
1045 SysAssertf(false, "IsObjectDetected() > sensor_util_is_near() failed. [distance:%f, result:%d]", distance, sensorResult);
1050 return isObjectDetected;
1053 // Sensor event listener management ------------------------------------------------------------------------------------------ //
1055 _ISensorCore::AddSensorCoreEventReceiver(_ISensorCoreEventReceiver& receiver)
1058 sensor_h sensorHandle = null;
1059 result r = ConnectToSensorCore(sensorHandle);
1066 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_CONNECTED);
1067 _SensorCoreEventType eventType = receiver.GetSensorCoreEventType();
1068 long interval = receiver.GetSensorCoreDataEventInterval();
1069 void* pUserData = &receiver;
1070 r = PrepareSensorCoreEventSensing(sensorHandle, eventType, interval, pUserData);
1073 DisconnectFromSensorCore(sensorHandle);
1074 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_NONE);
1079 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_PREPARED);
1080 receiver.SetSensorCoreEventHandle(sensorHandle);
1081 r = StartSensorCoreEventSensing(sensorHandle, eventType);
1084 receiver.SetSensorCoreEventHandle(null);
1085 UnprepareSensorCoreEventSensing(sensorHandle, eventType);
1086 DisconnectFromSensorCore(sensorHandle);
1087 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_NONE);
1091 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_STARTED);
1097 _ISensorCore::RemoveSensorCoreEventReceiver(_ISensorCoreEventReceiver& receiver)
1099 sensor_h sensorHandle = static_cast<sensor_h>(receiver.GetSensorCoreEventHandle());
1100 _SensorCoreEventType eventType = receiver.GetSensorCoreEventType();
1101 result r = E_SUCCESS;
1104 if (receiver.GetSensorCoreEventReceiverState() == _ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_STARTED)
1106 r = StopSensorCoreEventSensing(sensorHandle, eventType);
1112 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_PREPARED);
1116 if (receiver.GetSensorCoreEventReceiverState() == _ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_PREPARED)
1118 r = UnprepareSensorCoreEventSensing(sensorHandle, eventType);
1124 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_CONNECTED);
1128 if (receiver.GetSensorCoreEventReceiverState() == _ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_CONNECTED)
1130 r = DisconnectFromSensorCore(sensorHandle);
1136 receiver.SetSensorCoreEventReceiverState(_ISensorCoreEventReceiver::SENSOR_CORE_EVENT_RECEIVER_STATE_NONE);
1137 receiver.SetSensorCoreEventHandle(null);
1144 _ISensorCore::ResetSensorCoreEventReceivingInterval(_ISensorCoreEventReceiver& receiver)
1146 sensor_h sensorHandle = static_cast<sensor_h>(receiver.GetSensorCoreEventHandle());
1147 _SensorCoreEventType eventType = receiver.GetSensorCoreEventType();
1148 long interval = receiver.GetSensorCoreDataEventInterval();
1150 result r = ResetSensorCoreDataEventSensingInterval(sensorHandle, eventType, interval);
1159 // Sensor wake up management ------------------------------------------------------------------------------------------------- //
1161 _ISensorCore::SetWakeupEnabled(SensorType sensorType, bool enable)
1167 // not implemented yet
1168 return E_DEVICE_UNAVAILABLE;
1172 } } }// Tizen::Uix::Sensor