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_SensorManagerImpl.cpp
20 * @brief This is the implementation file for the %_SensorManagerImpl class.
22 * This files contains implementation of the %_SensorManagerImpl class.
26 #include <unique_ptr.h>
28 #include <FBaseString.h>
29 #include <FBaseColHashMapT.h>
30 #include <FBaseColIMapEnumeratorT.h>
31 #include <FBaseSysLog.h>
33 #include <FUixSensorSensorManager.h>
34 #include <FUixSensorISensorEventListener.h>
35 #include <FUixSensorAccelerationSensorData.h>
36 #include <FUixSensorMagneticSensorData.h>
37 #include <FUixSensorProximitySensorData.h>
38 #include <FUixSensorTiltSensorData.h>
39 #include <FUixSensorGyroSensorData.h>
40 #include <FUixSensorLightSensorData.h>
41 #include <FUixSensorGravitySensorData.h>
42 #include <FUixSensorUserAccelerationSensorData.h>
43 #include <FUixSensorDeviceOrientationSensorData.h>
45 #include <FApp_AppInfo.h>
46 #include <FUixSensor_SensorManagerImpl.h>
47 #include "FUixSensor_SensorUtil.h"
48 #include "FUixSensor_ISensorCore.h"
49 #include "FUixSensor_SpecifiedSensorDataEventDelivererT.h"
51 using Tizen::App::_AppInfo;
53 namespace Tizen { namespace Uix { namespace Sensor
57 static const int INDEX_NONE = -1;
58 static const int INDEX_FIRST = 0;
59 static ISensorEventListener& INVALID_LISTENER = *static_cast<ISensorEventListener*>(0);
61 _SensorEventDeliverer*
62 CreateSensorDataDelivererN(SensorType sensorType)
66 case SENSOR_TYPE_ACCELERATION:
67 return new (std::nothrow) _SpecifiedSensorDataEventDelivererT<AccelerationSensorData>();
68 case SENSOR_TYPE_MAGNETIC:
69 return new (std::nothrow) _SpecifiedSensorDataEventDelivererT<MagneticSensorData>();
70 case SENSOR_TYPE_PROXIMITY:
71 return new (std::nothrow) _SpecifiedSensorDataEventDelivererT<ProximitySensorData>();
72 case SENSOR_TYPE_TILT:
73 return new (std::nothrow) _SpecifiedSensorDataEventDelivererT<TiltSensorData>();
74 case SENSOR_TYPE_GYRO:
75 return new (std::nothrow) _SpecifiedSensorDataEventDelivererT<GyroSensorData>();
76 case SENSOR_TYPE_LIGHT:
77 return new (std::nothrow) _SpecifiedSensorDataEventDelivererT<LightSensorData>();
78 case SENSOR_TYPE_GRAVITY:
79 return new (std::nothrow) _SpecifiedSensorDataEventDelivererT<GravitySensorData>();
80 case SENSOR_TYPE_USER_ACCELERATION:
81 return new (std::nothrow) _SpecifiedSensorDataEventDelivererT<UserAccelerationSensorData>();
82 case SENSOR_TYPE_DEVICE_ORIENTATION:
83 return new (std::nothrow) _SpecifiedSensorDataEventDelivererT<DeviceOrientationSensorData>();
85 SysAssertf(false, "CreateSensorDataDelivererN() > Invalid SensorType [sensorType:%d]", sensorType);
91 // _SensorManagerImpl life-cycle ---------------------------------------------------------------------------------------------- //
92 _SensorManagerImpl::_SensorManagerImpl(void)
93 : __pDelivererListHashMap(null)
98 _SensorManagerImpl::~_SensorManagerImpl(void)
104 _SensorManagerImpl::Construct(void)
106 std::unique_ptr<_SensorEventDelivererListHashMap> pHashMap(new (std::nothrow) _SensorEventDelivererListHashMap());
107 SysTryReturn(NID_UIX, pHashMap != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "Allocating new _SensorEventDelivererListHashMap failed.");
109 result r = pHashMap->Construct();
110 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Constructing _SensorEventDelivererListHashMap failed."); // E_OUT_OF_MEMORY
112 __pDelivererListHashMap = pHashMap.release();
118 _SensorManagerImpl::Destruct(void)
120 if (__pDelivererListHashMap != null)
122 std::unique_ptr<_ISensorEventDelivererListHashMapEnumerator> pHashMapEnumeratorN(__pDelivererListHashMap->GetMapEnumeratorN());
123 if (pHashMapEnumeratorN != null)
125 _SensorEventDelivererList* pDelivererList = null;
126 while (pHashMapEnumeratorN->MoveNext() == E_SUCCESS)
128 pHashMapEnumeratorN->GetValue(pDelivererList);
130 pDelivererList->RemoveAll(true);
132 delete pDelivererList;
137 _SensorEventDelivererList* pDelivererList = null;
138 for (int i = SENSOR_TYPE_NONE+1; i < SENSOR_TYPE_MAX; i++)
140 if (IsFailed(__pDelivererListHashMap->GetValue(static_cast<SensorType>(i), pDelivererList)))
145 pDelivererList->RemoveAll(true);
147 delete pDelivererList;
151 __pDelivererListHashMap->RemoveAll();
152 delete __pDelivererListHashMap;
156 // Getting sensor information ------------------------------------------------------------------------------------------------- //
158 _SensorManagerImpl::IsAvailable(SensorType sensorType) const
160 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
170 _SensorManagerImpl::GetDescription(SensorType sensorType, Tizen::Base::String& description) const
172 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
178 return _ISensorCore::GetDescription(sensorType, description);
182 _SensorManagerImpl::GetVendor(SensorType sensorType, Tizen::Base::String& vendor) const
184 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
190 return _ISensorCore::GetVendor(sensorType, vendor);
194 _SensorManagerImpl::GetModelId(SensorType sensorType, Tizen::Base::String& modelId) const
196 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
202 return _ISensorCore::GetModelId(sensorType, modelId);
206 _SensorManagerImpl::GetMeasurementRange(SensorType sensorType, float& min, float& max, float& resolution) const
208 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
214 return _ISensorCore::GetMeasurementRange(sensorType, min, max, resolution);
218 _SensorManagerImpl::GetIntervalRange(SensorType sensorType, long& min, long& max) const
220 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
226 return _ISensorCore::GetIntervalRange(sensorType, min, max);
230 // Sensor event listener management ------------------------------------------------------------------------------------------- //
232 _SensorManagerImpl::AddSensorEventListener(ISensorEventListener& listener, SensorType sensorType, long interval, bool dataChanged)
234 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
240 r = _SensorUtil::CheckIntervalValidation(sensorType, interval);
246 if (IsSensorTypeRegistered(sensorType))
248 _SensorEventDelivererList* pDelivererList = null;
249 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
251 int tempIndex = INDEX_NONE;
252 SysTryReturn(NID_UIX, !IsListenerRegistered(*pDelivererList, listener, tempIndex), E_USER_ALREADY_REGISTERED, E_USER_ALREADY_REGISTERED, "Invalid ISensorEventListener [sensorType:%d, listener:%p]", sensorType, &listener);
254 std::unique_ptr<_SensorEventDeliverer> pDeliverer(CreateSensorDataDelivererN(sensorType));
255 SysTryReturn(NID_UIX, pDeliverer != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "Allocating new _SensorEventDeliverer failed.");
257 pDeliverer->SetDataEventInfo(listener, sensorType, interval, dataChanged);
259 r = pDeliverer->Start();
260 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Starting _SensorEventDeliverer failed."); // E_OUT_OF_MEMORY or E_DEVICE_UNAVAILABLE
262 r = pDelivererList->Add(*(pDeliverer.get()));
266 SysLogException(NID_UIX, r, "Adding _SensorEventDeliverer failed.");
271 pDeliverer.release();
275 std::unique_ptr<_SensorEventDelivererList> pDelivererList(new (std::nothrow) _SensorEventDelivererList());
276 SysTryReturn(NID_UIX, pDelivererList != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "Allocating new _SensorEventDelivererList failed.");
278 r = pDelivererList->Construct(sensorType);
279 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Constructing _SensorEventDelivererList failed.");
281 std::unique_ptr<_SensorEventDeliverer> pDeliverer(CreateSensorDataDelivererN(sensorType));
282 SysTryReturn(NID_UIX, pDeliverer != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "Allocating new _SensorEventDeliverer failed.");
284 r = pDelivererList->Add(*(pDeliverer.get()));
285 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Adding _SensorEventDeliverer failed."); // E_OUT_OF_MEMORY
287 pDeliverer->SetDataEventInfo(listener, sensorType, interval, dataChanged);
289 r = pDeliverer->Start();
290 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Starting _SensorEventDeliverer failed."); // E_OUT_OF_MEMORY or E_DEVICE_UNAVAILABLE
292 r = __pDelivererListHashMap->Add(sensorType, pDelivererList.get());
296 SysLogException(NID_UIX, r, "Adding _SensorEventDelivererList failed.");
301 pDeliverer.release();
302 pDelivererList.release();
309 _SensorManagerImpl::RemoveSensorEventListener(ISensorEventListener& listener)
311 result r = RemoveSensorEventListenerFromDelivererListHashMap(*__pDelivererListHashMap, listener);
321 _SensorManagerImpl::RemoveSensorEventListener(ISensorEventListener& listener, SensorType sensorType)
323 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
325 SysTryReturn(NID_UIX, _SensorUtil::IsSensorTypeValid(sensorType), E_INVALID_ARG, E_INVALID_ARG, "Invalid SensorType [sensorType:%d]", sensorType);
329 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
336 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_INVALID_ARG, E_INVALID_ARG, "Not registered SensorType [sensorType:%d]", sensorType);
338 _SensorEventDelivererList* pDelivererList = null;
339 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
340 result r = RemoveSensorEventListenerFromDelivererList(*pDelivererList, listener);
350 _SensorManagerImpl::SetInterval(SensorType sensorType, long interval)
352 // NOTE: This API was deprecated.
353 // It can change sensing interval for registered first listener only.
354 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
360 r = _SensorUtil::CheckIntervalValidation(sensorType, interval);
366 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
368 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_DEVICE_UNAVAILABLE, E_DEVICE_UNAVAILABLE, "Not registered SensorType [sensorType:%d]", sensorType);
372 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_INVALID_ARG, E_INVALID_ARG, "Not registered SensorType [sensorType:%d]", sensorType);
375 _SensorEventDelivererList* pDelivererList = null;
376 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
378 SysTryReturn(NID_UIX, pDelivererList->GetCount() > 0, E_INVALID_ARG, E_INVALID_ARG, "Listener not registered yet [sensorType:%d]", sensorType);
380 _SensorEventDeliverer* pDeliverer = static_cast<_SensorEventDeliverer*>(pDelivererList->GetAt(INDEX_FIRST));
381 r = pDeliverer->ResetInterval(interval);
391 _SensorManagerImpl::SetInterval(ISensorEventListener& listener, SensorType sensorType, long interval)
393 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
399 r = _SensorUtil::CheckIntervalValidation(sensorType, interval);
405 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_INVALID_ARG, E_INVALID_ARG, "Not registered SensorType [sensorType:%d]", sensorType);
407 _SensorEventDelivererList* pDelivererList = null;
408 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
410 int index = INDEX_NONE;
411 SysTryReturn(NID_UIX, IsListenerRegistered(*pDelivererList, listener, index), E_INVALID_ARG, E_INVALID_ARG, "Invalid ISensorEventListener [sensorType:%d, listener:%p]", sensorType, &listener);
413 _SensorEventDeliverer* pDeliverer = static_cast<_SensorEventDeliverer*>(pDelivererList->GetAt(index));
414 r = pDeliverer->ResetInterval(interval);
423 // Sensor wake up management -------------------------------------------------------------------------------------------------- //
425 _SensorManagerImpl::IsWakeupSupported(SensorType sensorType) const
428 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
433 #if defined(_OSP_EMUL_)
436 return _ISensorCore::IsWakeupSupported(sensorType);
441 _SensorManagerImpl::SetWakeupEnabled(SensorType sensorType, bool enable)
444 bool isWakeupSupported = IsWakeupSupported(sensorType);
445 result r = GetLastResult();
450 #if defined(_OSP_EMUL_)
453 SysTryReturn(NID_UIX, isWakeupSupported, E_UNSUPPORTED_OPERATION, E_UNSUPPORTED_OPERATION, "Unsupported SensorType for wake up [sensorType:%d]", sensorType);
454 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_INVALID_STATE, E_INVALID_STATE, "Not registered SensorType [sensorType:%d]", sensorType);
456 _SensorEventDelivererList* pDelivererList = null;
457 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
458 SysTryReturn(NID_UIX, pDelivererList->GetCount() > 0, E_INVALID_STATE, E_INVALID_STATE, "Listener not registered [sensorType:%d]", sensorType);
460 int tempIndex = INDEX_NONE;
461 bool isWakeupEnabled = IsListenerRegistered(*pDelivererList, INVALID_LISTENER, tempIndex);
462 if ((enable && isWakeupEnabled) || (!enable && !isWakeupEnabled))
469 std::unique_ptr<_SensorEventDeliverer> pDeliverer(new (std::nothrow) _SensorEventDeliverer());
470 SysTryReturn(NID_UIX, pDeliverer != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "Allocating new Deliverer failed.");
472 pDeliverer->SetWakeupEventInfo(INVALID_LISTENER, sensorType);
474 r = pDeliverer->Start();
475 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Starting Deliverer failed."); // E_OUT_OF_MEMORY or E_DEVICE_UNAVAILABLE
477 r = pDelivererList->Add(*(pDeliverer.get()));
481 SysLogException(NID_UIX, r, "Adding Deliverer failed.");
486 pDeliverer.release();
490 _SensorEventDeliverer* pDeliverer = static_cast<_SensorEventDeliverer*>(pDelivererList->GetAt(tempIndex));
491 result r = pDeliverer->Stop();
497 pDelivererList->RemoveAt(tempIndex, true);
505 _SensorManagerImpl::IsWakeupEnabled(SensorType sensorType) const
508 bool isWakeupSupported = IsWakeupSupported(sensorType);
509 result r = GetLastResult();
514 #if defined(_OSP_EMUL_)
517 SysTryReturn(NID_UIX, isWakeupSupported, E_UNSUPPORTED_OPERATION, E_UNSUPPORTED_OPERATION, "Unsupported SensorType for wake up [sensorType:%d]", sensorType);
519 if (!IsSensorTypeRegistered(sensorType))
524 _SensorEventDelivererList* pDelivererList = null;
525 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
527 int dummyIndex = INDEX_NONE;
528 return IsListenerRegistered(*pDelivererList, INVALID_LISTENER, dummyIndex);
532 // Management helpers --------------------------------------------------------------------------------------------------------- //
534 _SensorManagerImpl::IsSensorTypeRegistered(SensorType sensorType) const
536 bool isContains = false;
537 __pDelivererListHashMap->ContainsKey(sensorType, isContains);
542 _SensorManagerImpl::IsListenerRegistered(_SensorEventDelivererList& delivererList, ISensorEventListener& listener, int& index) const
544 int delivererCount = delivererList.GetCount();
546 _SensorEventDeliverer* pDeliverer = null;
547 for (int i = 0; i < delivererCount; i++)
549 pDeliverer = static_cast<_SensorEventDeliverer*>(delivererList.GetAt(i));
551 if (pDeliverer->IsListenerEquals(listener))
562 _SensorManagerImpl::RemoveSensorEventListenerFromDelivererListHashMap(_SensorEventDelivererListHashMap& delivererListHashMap, ISensorEventListener& listener)
564 bool isRemoved = false;
565 std::unique_ptr<_ISensorEventDelivererListHashMapEnumerator> pHashMapEnumeratorN(delivererListHashMap.GetMapEnumeratorN());
566 if (pHashMapEnumeratorN != null)
568 _SensorEventDelivererList* pDelivererList = null;
569 result r = E_SUCCESS;
570 while (pHashMapEnumeratorN->MoveNext() == E_SUCCESS)
572 pHashMapEnumeratorN->GetValue(pDelivererList);
574 r = RemoveSensorEventListenerFromDelivererList(*pDelivererList, listener);
575 if (r == E_INVALID_ARG)
579 else if (r == E_DEVICE_UNAVAILABLE)
591 _SensorEventDelivererList* pDelivererList = null;
592 result r = E_SUCCESS;
593 for (int i = SENSOR_TYPE_NONE+1; i < SENSOR_TYPE_MAX; i++)
595 if (IsFailed(delivererListHashMap.GetValue(static_cast<SensorType>(i), pDelivererList)))
600 r = RemoveSensorEventListenerFromDelivererList(*pDelivererList, listener);
601 if (r == E_INVALID_ARG)
605 else if (r == E_DEVICE_UNAVAILABLE)
618 SetLastResult(E_INVALID_ARG);
619 return E_INVALID_ARG;
626 _SensorManagerImpl::RemoveSensorEventListenerFromDelivererList(_SensorEventDelivererList& delivererList, ISensorEventListener& listener)
628 int index = INDEX_NONE;
629 if (!IsListenerRegistered(delivererList, listener, index))
631 SetLastResult(E_INVALID_ARG);
632 return E_INVALID_ARG;
635 _SensorEventDeliverer* pDeliverer = static_cast<_SensorEventDeliverer*>(delivererList.GetAt(index));
636 result r = pDeliverer->Stop();
642 r = delivererList.RemoveAt(index, true);
648 if (delivererList.GetCount() == 1 && IsListenerRegistered(delivererList, INVALID_LISTENER, index))
650 delivererList.RemoveAt(index, true);
656 // Getting implementation instance -------------------------------------------------------------------------------------------- //
658 _SensorManagerImpl::GetInstance(SensorManager& sensorManager)
660 return sensorManager.__pSensorManagerImpl;
663 const _SensorManagerImpl*
664 _SensorManagerImpl::GetInstance(const SensorManager& sensorManager)
666 return sensorManager.__pSensorManagerImpl;
668 } } }// Tizen::Uix::Sensor