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();
155 // Getting sensor information ------------------------------------------------------------------------------------------------- //
157 _SensorManagerImpl::IsAvailable(SensorType sensorType) const
159 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
169 _SensorManagerImpl::GetDescription(SensorType sensorType, Tizen::Base::String& description) const
171 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
177 return _ISensorCore::GetDescription(sensorType, description);
181 _SensorManagerImpl::GetVendor(SensorType sensorType, Tizen::Base::String& vendor) const
183 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
189 return _ISensorCore::GetVendor(sensorType, vendor);
193 _SensorManagerImpl::GetModelId(SensorType sensorType, Tizen::Base::String& modelId) const
195 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
201 return _ISensorCore::GetModelId(sensorType, modelId);
205 _SensorManagerImpl::GetMeasurementRange(SensorType sensorType, float& min, float& max, float& resolution) const
207 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
213 return _ISensorCore::GetMeasurementRange(sensorType, min, max, resolution);
217 _SensorManagerImpl::GetIntervalRange(SensorType sensorType, long& min, long& max) const
219 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
225 return _ISensorCore::GetIntervalRange(sensorType, min, max);
229 // Sensor event listener management ------------------------------------------------------------------------------------------- //
231 _SensorManagerImpl::AddSensorEventListener(ISensorEventListener& listener, SensorType sensorType, long interval, bool dataChanged)
233 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
239 r = _SensorUtil::CheckIntervalValidation(sensorType, interval);
245 if (IsSensorTypeRegistered(sensorType))
247 _SensorEventDelivererList* pDelivererList = null;
248 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
250 int tempIndex = INDEX_NONE;
251 SysTryReturn(NID_UIX, !IsListenerRegistered(*pDelivererList, listener, tempIndex), E_USER_ALREADY_REGISTERED, E_USER_ALREADY_REGISTERED, "Invalid ISensorEventListener [sensorType:%d, listener:%p]", sensorType, &listener);
253 std::unique_ptr<_SensorEventDeliverer> pDeliverer(CreateSensorDataDelivererN(sensorType));
254 SysTryReturn(NID_UIX, pDeliverer != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "Allocating new _SensorEventDeliverer failed.");
256 pDeliverer->SetDataEventInfo(listener, sensorType, interval, dataChanged);
258 r = pDeliverer->Start();
259 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Starting _SensorEventDeliverer failed."); // E_OUT_OF_MEMORY or E_DEVICE_UNAVAILABLE
261 r = pDelivererList->Add(*(pDeliverer.get()));
265 SysLogException(NID_UIX, r, "Adding _SensorEventDeliverer failed.");
270 pDeliverer.release();
274 std::unique_ptr<_SensorEventDelivererList> pDelivererList(new (std::nothrow) _SensorEventDelivererList());
275 SysTryReturn(NID_UIX, pDelivererList != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "Allocating new _SensorEventDelivererList failed.");
277 r = pDelivererList->Construct(sensorType);
278 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Constructing _SensorEventDelivererList failed.");
280 std::unique_ptr<_SensorEventDeliverer> pDeliverer(CreateSensorDataDelivererN(sensorType));
281 SysTryReturn(NID_UIX, pDeliverer != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "Allocating new _SensorEventDeliverer failed.");
283 r = pDelivererList->Add(*(pDeliverer.get()));
284 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Adding _SensorEventDeliverer failed."); // E_OUT_OF_MEMORY
286 pDeliverer->SetDataEventInfo(listener, sensorType, interval, dataChanged);
288 r = pDeliverer->Start();
289 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Starting _SensorEventDeliverer failed."); // E_OUT_OF_MEMORY or E_DEVICE_UNAVAILABLE
291 r = __pDelivererListHashMap->Add(sensorType, pDelivererList.get());
295 SysLogException(NID_UIX, r, "Adding _SensorEventDelivererList failed.");
300 pDeliverer.release();
301 pDelivererList.release();
308 _SensorManagerImpl::RemoveSensorEventListener(ISensorEventListener& listener)
310 result r = RemoveSensorEventListenerFromDelivererListHashMap(*__pDelivererListHashMap, listener);
320 _SensorManagerImpl::RemoveSensorEventListener(ISensorEventListener& listener, SensorType sensorType)
322 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
324 SysTryReturn(NID_UIX, _SensorUtil::IsSensorTypeValid(sensorType), E_INVALID_ARG, E_INVALID_ARG, "Invalid SensorType [sensorType:%d]", sensorType);
328 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
335 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_INVALID_ARG, E_INVALID_ARG, "Not registered SensorType [sensorType:%d]", sensorType);
337 _SensorEventDelivererList* pDelivererList = null;
338 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
339 result r = RemoveSensorEventListenerFromDelivererList(*pDelivererList, listener);
349 _SensorManagerImpl::SetInterval(SensorType sensorType, long interval)
351 // NOTE: This API was deprecated.
352 // It can change sensing interval for registered first listener only.
353 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
359 r = _SensorUtil::CheckIntervalValidation(sensorType, interval);
365 if (_AppInfo::GetApiVersion() == Tizen::Base::_API_VERSION_2_0 && _AppInfo::IsOspCompat())
367 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_DEVICE_UNAVAILABLE, E_DEVICE_UNAVAILABLE, "Not registered SensorType [sensorType:%d]", sensorType);
371 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_INVALID_ARG, E_INVALID_ARG, "Not registered SensorType [sensorType:%d]", sensorType);
374 _SensorEventDelivererList* pDelivererList = null;
375 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
377 SysTryReturn(NID_UIX, pDelivererList->GetCount() > 0, E_INVALID_ARG, E_INVALID_ARG, "Listener not registered yet [sensorType:%d]", sensorType);
379 _SensorEventDeliverer* pDeliverer = static_cast<_SensorEventDeliverer*>(pDelivererList->GetAt(INDEX_FIRST));
380 r = pDeliverer->ResetInterval(interval);
390 _SensorManagerImpl::SetInterval(ISensorEventListener& listener, SensorType sensorType, long interval)
392 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
398 r = _SensorUtil::CheckIntervalValidation(sensorType, interval);
404 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_INVALID_ARG, E_INVALID_ARG, "Not registered SensorType [sensorType:%d]", sensorType);
406 _SensorEventDelivererList* pDelivererList = null;
407 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
409 int index = INDEX_NONE;
410 SysTryReturn(NID_UIX, IsListenerRegistered(*pDelivererList, listener, index), E_INVALID_ARG, E_INVALID_ARG, "Invalid ISensorEventListener [sensorType:%d, listener:%p]", sensorType, &listener);
412 _SensorEventDeliverer* pDeliverer = static_cast<_SensorEventDeliverer*>(pDelivererList->GetAt(index));
413 r = pDeliverer->ResetInterval(interval);
422 // Sensor wake up management -------------------------------------------------------------------------------------------------- //
424 _SensorManagerImpl::IsWakeupSupported(SensorType sensorType) const
427 result r = _SensorUtil::CheckSensorTypeValidation(sensorType);
432 #if defined(_OSP_EMUL_)
435 return _ISensorCore::IsWakeupSupported(sensorType);
440 _SensorManagerImpl::SetWakeupEnabled(SensorType sensorType, bool enable)
443 bool isWakeupSupported = IsWakeupSupported(sensorType);
444 result r = GetLastResult();
449 #if defined(_OSP_EMUL_)
452 SysTryReturn(NID_UIX, isWakeupSupported, E_UNSUPPORTED_OPERATION, E_UNSUPPORTED_OPERATION, "Unsupported SensorType for wake up [sensorType:%d]", sensorType);
453 SysTryReturn(NID_UIX, IsSensorTypeRegistered(sensorType), E_INVALID_STATE, E_INVALID_STATE, "Not registered SensorType [sensorType:%d]", sensorType);
455 _SensorEventDelivererList* pDelivererList = null;
456 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
457 SysTryReturn(NID_UIX, pDelivererList->GetCount() > 0, E_INVALID_STATE, E_INVALID_STATE, "Listener not registered [sensorType:%d]", sensorType);
459 int tempIndex = INDEX_NONE;
460 bool isWakeupEnabled = IsListenerRegistered(*pDelivererList, INVALID_LISTENER, tempIndex);
461 if ((enable && isWakeupEnabled) || (!enable && !isWakeupEnabled))
468 std::unique_ptr<_SensorEventDeliverer> pDeliverer(new (std::nothrow) _SensorEventDeliverer());
469 SysTryReturn(NID_UIX, pDeliverer != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "Allocating new Deliverer failed.");
471 pDeliverer->SetWakeupEventInfo(INVALID_LISTENER, sensorType);
473 r = pDeliverer->Start();
474 SysTryReturn(NID_UIX, !IsFailed(r), r, r, "Starting Deliverer failed."); // E_OUT_OF_MEMORY or E_DEVICE_UNAVAILABLE
476 r = pDelivererList->Add(*(pDeliverer.get()));
480 SysLogException(NID_UIX, r, "Adding Deliverer failed.");
485 pDeliverer.release();
489 _SensorEventDeliverer* pDeliverer = static_cast<_SensorEventDeliverer*>(pDelivererList->GetAt(tempIndex));
490 result r = pDeliverer->Stop();
496 pDelivererList->RemoveAt(tempIndex, true);
504 _SensorManagerImpl::IsWakeupEnabled(SensorType sensorType) const
507 bool isWakeupSupported = IsWakeupSupported(sensorType);
508 result r = GetLastResult();
513 #if defined(_OSP_EMUL_)
516 SysTryReturn(NID_UIX, isWakeupSupported, E_UNSUPPORTED_OPERATION, E_UNSUPPORTED_OPERATION, "Unsupported SensorType for wake up [sensorType:%d]", sensorType);
518 if (!IsSensorTypeRegistered(sensorType))
523 _SensorEventDelivererList* pDelivererList = null;
524 __pDelivererListHashMap->GetValue(sensorType, pDelivererList);
526 int dummyIndex = INDEX_NONE;
527 return IsListenerRegistered(*pDelivererList, INVALID_LISTENER, dummyIndex);
531 // Management helpers --------------------------------------------------------------------------------------------------------- //
533 _SensorManagerImpl::IsSensorTypeRegistered(SensorType sensorType) const
535 bool isContains = false;
536 __pDelivererListHashMap->ContainsKey(sensorType, isContains);
541 _SensorManagerImpl::IsListenerRegistered(_SensorEventDelivererList& delivererList, ISensorEventListener& listener, int& index) const
543 int delivererCount = delivererList.GetCount();
545 _SensorEventDeliverer* pDeliverer = null;
546 for (int i = 0; i < delivererCount; i++)
548 pDeliverer = static_cast<_SensorEventDeliverer*>(delivererList.GetAt(i));
550 if (pDeliverer->IsListenerEquals(listener))
561 _SensorManagerImpl::RemoveSensorEventListenerFromDelivererListHashMap(_SensorEventDelivererListHashMap& delivererListHashMap, ISensorEventListener& listener)
563 bool isRemoved = false;
564 std::unique_ptr<_ISensorEventDelivererListHashMapEnumerator> pHashMapEnumeratorN(delivererListHashMap.GetMapEnumeratorN());
565 if (pHashMapEnumeratorN != null)
567 _SensorEventDelivererList* pDelivererList = null;
568 result r = E_SUCCESS;
569 while (pHashMapEnumeratorN->MoveNext() == E_SUCCESS)
571 pHashMapEnumeratorN->GetValue(pDelivererList);
573 r = RemoveSensorEventListenerFromDelivererList(*pDelivererList, listener);
574 if (r == E_INVALID_ARG)
578 else if (r == E_DEVICE_UNAVAILABLE)
590 _SensorEventDelivererList* pDelivererList = null;
591 result r = E_SUCCESS;
592 for (int i = SENSOR_TYPE_NONE+1; i < SENSOR_TYPE_MAX; i++)
594 if (IsFailed(delivererListHashMap.GetValue(static_cast<SensorType>(i), pDelivererList)))
599 r = RemoveSensorEventListenerFromDelivererList(*pDelivererList, listener);
600 if (r == E_INVALID_ARG)
604 else if (r == E_DEVICE_UNAVAILABLE)
617 SetLastResult(E_INVALID_ARG);
618 return E_INVALID_ARG;
625 _SensorManagerImpl::RemoveSensorEventListenerFromDelivererList(_SensorEventDelivererList& delivererList, ISensorEventListener& listener)
627 int index = INDEX_NONE;
628 if (!IsListenerRegistered(delivererList, listener, index))
630 SetLastResult(E_INVALID_ARG);
631 return E_INVALID_ARG;
634 _SensorEventDeliverer* pDeliverer = static_cast<_SensorEventDeliverer*>(delivererList.GetAt(index));
635 result r = pDeliverer->Stop();
641 r = delivererList.RemoveAt(index, true);
647 if (delivererList.GetCount() == 1 && IsListenerRegistered(delivererList, INVALID_LISTENER, index))
649 delivererList.RemoveAt(index, true);
655 // Getting implementation instance -------------------------------------------------------------------------------------------- //
657 _SensorManagerImpl::GetInstance(SensorManager& sensorManager)
659 return sensorManager.__pSensorManagerImpl;
662 const _SensorManagerImpl*
663 _SensorManagerImpl::GetInstance(const SensorManager& sensorManager)
665 return sensorManager.__pSensorManagerImpl;
667 } } }// Tizen::Uix::Sensor