From e29fdd29677d1a91b010e5ab84b5f7e3d5fe44eb Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Tue, 6 Jan 2015 20:17:44 +0900 Subject: [PATCH 01/16] sensord: move systemd-related files to systemd directory add directory structure and build system file - it would be better to put them in systemd directory. Change-Id: I60dc53a09de117e52355a3dcb849b2adf0e5661f Signed-off-by: Kibak Yoon --- CMakeLists.txt | 1 + systemd/CMakeLists.txt | 5 +++++ {packaging => systemd}/sensord.service | 0 {packaging => systemd}/sensord.socket | 0 4 files changed, 6 insertions(+) create mode 100644 systemd/CMakeLists.txt rename {packaging => systemd}/sensord.service (100%) rename {packaging => systemd}/sensord.socket (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5228178..3aae422 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,7 @@ IF("${TEST_SUITE}" STREQUAL "ON") INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.APLv2 DESTINATION share/license RENAME test) ENDIF() +add_subdirectory(systemd) add_subdirectory(src) IF("${TEST_SUITE}" STREQUAL "ON") diff --git a/systemd/CMakeLists.txt b/systemd/CMakeLists.txt new file mode 100644 index 0000000..233e8ba --- /dev/null +++ b/systemd/CMakeLists.txt @@ -0,0 +1,5 @@ +INSTALL(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/sensord.service + ${CMAKE_CURRENT_SOURCE_DIR}/sensord.socket + DESTINATION lib/systemd/system) + diff --git a/packaging/sensord.service b/systemd/sensord.service similarity index 100% rename from packaging/sensord.service rename to systemd/sensord.service diff --git a/packaging/sensord.socket b/systemd/sensord.socket similarity index 100% rename from packaging/sensord.socket rename to systemd/sensord.socket -- 2.7.4 From 204d913d2a8b389f29a5fda50cda85757f1d9a94 Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Tue, 6 Jan 2015 21:05:38 +0900 Subject: [PATCH 02/16] sensord: move manifest files to packaging directory Change-Id: Ida30ea320f5aec3522c13467f093c5aa1f1c1b59 Signed-off-by: Kibak Yoon --- libsensord.manifest => packaging/libsensord.manifest | 0 sensord.manifest => packaging/sensord.manifest | 0 packaging/sensord.spec | 10 ++++++---- 3 files changed, 6 insertions(+), 4 deletions(-) rename libsensord.manifest => packaging/libsensord.manifest (100%) rename sensord.manifest => packaging/sensord.manifest (100%) diff --git a/libsensord.manifest b/packaging/libsensord.manifest similarity index 100% rename from libsensord.manifest rename to packaging/libsensord.manifest diff --git a/sensord.manifest b/packaging/sensord.manifest similarity index 100% rename from sensord.manifest rename to packaging/sensord.manifest diff --git a/packaging/sensord.spec b/packaging/sensord.spec index 86e131e..c7070c7 100755 --- a/packaging/sensord.spec +++ b/packaging/sensord.spec @@ -5,8 +5,8 @@ Release: 0 Group: System/Sensor Framework License: Apache-2.0 Source0: %{name}-%{version}.tar.gz -Source1: sensord.service -Source2: sensord.socket +Source1: sensord.manifest +Source2: libsensord.manifest %define accel_state ON %define gyro_state ON @@ -72,6 +72,8 @@ Sensor functional testing %prep %setup -q +cp %{SOURCE1} . +cp %{SOURCE2} . %build #CFLAGS+=" -fvisibility=hidden "; export CFLAGS @@ -105,11 +107,11 @@ systemctl daemon-reload systemctl daemon-reload %files -n sensord -%manifest sensord.manifest %{_bindir}/sensord %attr(0644,root,root)/usr/etc/sensor_plugins.xml %attr(0644,root,root)/usr/etc/sensors.xml %attr(0644,root,root)/usr/etc/virtual_sensors.xml +%manifest sensord.manifest %{_unitdir}/sensord.service %{_unitdir}/sensord.socket %{_unitdir}/multi-user.target.wants/sensord.service @@ -118,8 +120,8 @@ systemctl daemon-reload %{_datadir}/license/sensord %files -n libsensord -%manifest libsensord.manifest %defattr(-,root,root,-) +%manifest libsensord.manifest %{_libdir}/libsensor.so.* %{_libdir}/sensord/*.so* %{_libdir}/libsensord-share.so -- 2.7.4 From 4ab24efb7a849c862c8644e17f7ed9aeeb51a5e9 Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Tue, 6 Jan 2015 21:06:29 +0900 Subject: [PATCH 03/16] sensord: add motion api temporarily for avoiding build-break motion API is replaced by context gesture api after tizen 2.3. because there are the packages which use motion API still, sensor motion API should be restored temporarily. - they are not operated. only for avoiding build-break Signed-off-by: Kibak Yoon Change-Id: I8384ef30abf90623704908c8a537e62437a75ff2 --- src/libsensord/CMakeLists.txt | 1 + src/libsensord/sensor_internal_deprecated.h | 1 + src/libsensord/sensor_motion.h | 152 ++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100755 src/libsensord/sensor_motion.h diff --git a/src/libsensord/CMakeLists.txt b/src/libsensord/CMakeLists.txt index 50550ee..81f759f 100755 --- a/src/libsensord/CMakeLists.txt +++ b/src/libsensord/CMakeLists.txt @@ -71,4 +71,5 @@ install(FILES sensor_linear_accel.h DESTINATION ${INCLUDEDIR}/sensor/) install(FILES sensor_orientation.h DESTINATION ${INCLUDEDIR}/sensor/) install(FILES sensor_rv.h DESTINATION ${INCLUDEDIR}/sensor/) install(FILES sensor_temperature.h DESTINATION ${INCLUDEDIR}/sensor/) +install(FILES sensor_motion.h DESTINATION ${INCLUDEDIR}/sensor/) install(FILES ${PROJECT_NAME}.pc DESTINATION ${LIBDIR}/pkgconfig) diff --git a/src/libsensord/sensor_internal_deprecated.h b/src/libsensord/sensor_internal_deprecated.h index c2fab32..9f3910d 100755 --- a/src/libsensord/sensor_internal_deprecated.h +++ b/src/libsensord/sensor_internal_deprecated.h @@ -49,6 +49,7 @@ extern "C" #include #include #include +#include typedef struct { condition_op_t cond_op; diff --git a/src/libsensord/sensor_motion.h b/src/libsensord/sensor_motion.h new file mode 100755 index 0000000..205def6 --- /dev/null +++ b/src/libsensord/sensor_motion.h @@ -0,0 +1,152 @@ +/* + * libsensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SENSOR_MOTION_H__ +#define __SENSOR_MOTION_H__ + +//! Pre-defined events for the motion sensor +//! Sensor Plugin developer can add more event to their own headers + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define MOTION_SENSOR 0xFF + +enum motion_event_type { + MOTION_ENGINE_EVENT_SNAP = (MOTION_SENSOR << 16) | 0x0001, + MOTION_ENGINE_EVENT_SHAKE = (MOTION_SENSOR << 16) | 0x0002, + MOTION_ENGINE_EVENT_DOUBLETAP = (MOTION_SENSOR << 16) | 0x0004, + MOTION_ENGINE_EVENT_PANNING = (MOTION_SENSOR << 16) | 0x0008, + MOTION_ENGINE_EVENT_TOP_TO_BOTTOM = (MOTION_SENSOR << 16) | 0x0010, + MOTION_ENGINE_EVENT_DIRECT_CALL = (MOTION_SENSOR << 16) | 0x0020, + MOTION_ENGINE_EVENT_TILT_TO_UNLOCK = (MOTION_SENSOR << 16) | 0x0040, + MOTION_ENGINE_EVENT_LOCK_EXECUTE_CAMERA = (MOTION_SENSOR << 16) | 0x0080, + MOTION_ENGINE_EVENT_SMART_ALERT = (MOTION_SENSOR << 16) | 0x0100, + MOTION_ENGINE_EVENT_TILT = (MOTION_SENSOR << 16) | 0x0200, + MOTION_ENGINE_EVENT_PANNING_BROWSE = (MOTION_SENSOR << 16) | 0x0400, + MOTION_ENGINE_EVENT_NO_MOVE = (MOTION_SENSOR << 16) | 0x0800, + MOTION_ENGINE_EVENT_SHAKE_ALWAYS_ON = (MOTION_SENSOR << 16) | 0x1000, + MOTION_ENGINE_EVENT_SMART_RELAY = (MOTION_SENSOR << 16) | 0x2000, +}; + +enum motion_snap_event { + MOTION_ENGIEN_SNAP_NONE = 0, + MOTION_ENGIEN_NEGATIVE_SNAP_X = 1, + MOTION_ENGIEN_POSITIVE_SNAP_X = 2, + MOTION_ENGIEN_NEGATIVE_SNAP_Y = 3, + MOTION_ENGIEN_POSITIVE_SNAP_Y = 4, + MOTION_ENGIEN_NEGATIVE_SNAP_Z = 5, + MOTION_ENGIEN_POSITIVE_SNAP_Z = 6, + MOTION_ENGIEN_SNAP_LEFT = MOTION_ENGIEN_NEGATIVE_SNAP_X, + MOTION_ENGIEN_SNAP_RIGHT = MOTION_ENGIEN_POSITIVE_SNAP_X, + MOTION_ENGINE_SNAP_NONE = 0, + MOTION_ENGINE_NEGATIVE_SNAP_X = 1, + MOTION_ENGINE_POSITIVE_SNAP_X = 2, + MOTION_ENGINE_NEGATIVE_SNAP_Y = 3, + MOTION_ENGINE_POSITIVE_SNAP_Y = 4, + MOTION_ENGINE_NEGATIVE_SNAP_Z = 5, + MOTION_ENGINE_POSITIVE_SNAP_Z = 6, + MOTION_ENGINE_SNAP_LEFT = MOTION_ENGINE_NEGATIVE_SNAP_X, + MOTION_ENGINE_SNAP_RIGHT = MOTION_ENGINE_POSITIVE_SNAP_X, +}; + +enum motion_shake_event { + MOTION_ENGIEN_SHAKE_NONE = 0, + MOTION_ENGIEN_SHAKE_DETECTION = 1, + MOTION_ENGIEN_SHAKE_CONTINUING = 2, + MOTION_ENGIEN_SHAKE_FINISH = 3, + MOTION_ENGINE_SHAKE_BREAK = 4, + MOTION_ENGINE_SHAKE_NONE = 0, + MOTION_ENGINE_SHAKE_DETECTION = 1, + MOTION_ENGINE_SHAKE_CONTINUING = 2, + MOTION_ENGINE_SHAKE_FINISH = 3, +}; + +enum motion_doubletap_event { + MOTION_ENGIEN_DOUBLTAP_NONE = 0, + MOTION_ENGIEN_DOUBLTAP_DETECTION = 1, + MOTION_ENGINE_DOUBLTAP_NONE = 0, + MOTION_ENGINE_DOUBLTAP_DETECTION = 1, +}; + +enum motion_top_to_bottom_event { + MOTION_ENGIEN_TOP_TO_BOTTOM_NONE = 0, + MOTION_ENGIEN_TOP_TO_BOTTOM_WAIT = 1, + MOTION_ENGIEN_TOP_TO_BOTTOM_DETECTION = 2, + MOTION_ENGINE_TOP_TO_BOTTOM_NONE = 0, + MOTION_ENGINE_TOP_TO_BOTTOM_WAIT = 1, + MOTION_ENGINE_TOP_TO_BOTTOM_DETECTION = 2, +}; + +enum motion_direct_call_event_t { + MOTION_ENGINE_DIRECT_CALL_NONE, + MOTION_ENGINE_DIRECT_CALL_DETECTION, +}; + +enum motion_smart_relay_event_t { + MOTION_ENGINE_SMART_RELAY_NONE, + MOTION_ENGINE_SMART_RELAY_DETECTION, +}; + +enum motion_tilt_to_unlock_event_t { + MOTION_ENGINE_TILT_TO_UNLOCK_NONE, + MOTION_ENGINE_TILT_TO_UNLOCK_DETECTION, +}; + +enum motion_lock_execute_camera_event_t { + MOTION_ENGINE_LOCK_EXECUTE_CAMERA_NONE, + MOTION_ENGINE_LOCK_EXECUTE_CAMERA_L_DETECTION, + MOTION_ENGINE_LOCK_EXECUTE_CAMERA_R_DETECTION, +}; + +enum motion_smart_alert_t { + MOTION_ENGINE_SMART_ALERT_NONE, + MOTION_ENGINE_SMART_ALERT_DETECTION, +}; + +enum motion_no_move_t { + MOTION_ENGINE_NO_MOVE_NONE, + MOTION_ENGINE_NO_MOVE_DETECTION, +}; + +enum motion_property_id { + MOTION_PROPERTY_UNKNOWN = 0, + MOTION_PROPERTY_CHECK_ACCEL_SENSOR, + MOTION_PROPERTY_CHECK_GYRO_SENSOR, + MOTION_PROPERTY_CHECK_GEO_SENSOR, + MOTION_PROPERTY_CHECK_PRIXI_SENSOR, + MOTION_PROPERTY_CHECK_LIGHT_SENSOR, + MOTION_PROPERTY_CHECK_BARO_SENSOR, + MOTION_PROPERTY_LCD_TOUCH_ON, + MOTION_PROPERTY_LCD_TOUCH_OFF, + MOTION_PROPERTY_CHECK_GYRO_CAL_STATUS, +}; + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif +//! End of a file -- 2.7.4 From ee3fbaf31ddba8cfa3883d804e9cecf73cc43052 Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Tue, 6 Jan 2015 21:12:08 +0900 Subject: [PATCH 04/16] sensord: change the permission of some files it's for unifying the permission of all files. Change-Id: I86e2d1dc11ffd39581ef1631bdab3e7e603e630a Signed-off-by: Kibak Yoon --- src/libsensord/sensor_rv.h | 0 src/shared/cconfig.cpp | 0 src/shared/cconfig.h | 0 src/shared/iio_common.cpp | 0 src/shared/iio_common.h | 0 virtual_sensors.xml.in | 0 6 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 src/libsensord/sensor_rv.h mode change 100644 => 100755 src/shared/cconfig.cpp mode change 100644 => 100755 src/shared/cconfig.h mode change 100644 => 100755 src/shared/iio_common.cpp mode change 100644 => 100755 src/shared/iio_common.h mode change 100644 => 100755 virtual_sensors.xml.in diff --git a/src/libsensord/sensor_rv.h b/src/libsensord/sensor_rv.h old mode 100644 new mode 100755 diff --git a/src/shared/cconfig.cpp b/src/shared/cconfig.cpp old mode 100644 new mode 100755 diff --git a/src/shared/cconfig.h b/src/shared/cconfig.h old mode 100644 new mode 100755 diff --git a/src/shared/iio_common.cpp b/src/shared/iio_common.cpp old mode 100644 new mode 100755 diff --git a/src/shared/iio_common.h b/src/shared/iio_common.h old mode 100644 new mode 100755 diff --git a/virtual_sensors.xml.in b/virtual_sensors.xml.in old mode 100644 new mode 100755 -- 2.7.4 From ea7faf6b9ffa181c03dab481d44598fcc1853e09 Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Tue, 6 Jan 2015 21:24:23 +0900 Subject: [PATCH 05/16] sensord: changing group in spec file refered by the below url: https://wiki.tizen.org/wiki/Packaging/Guidelines#Group_Tag Change-Id: I7c42fb9ee2707980a1135c9c1d2747f2072b4308 Signed-off-by: Kibak Yoon --- packaging/sensord.spec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packaging/sensord.spec b/packaging/sensord.spec index c7070c7..d5f859c 100755 --- a/packaging/sensord.spec +++ b/packaging/sensord.spec @@ -45,7 +45,7 @@ Sensor daemon %package -n libsensord Summary: Sensord library -Group: System/Sensor Framework +Group: System/Libraries Requires: %{name} = %{version}-%{release} %description -n libsensord @@ -53,7 +53,7 @@ Sensord library %package -n libsensord-devel Summary: Sensord library (devel) -Group: System/Sensor Framework +Group: System/Development Requires: %{name} = %{version}-%{release} %description -n libsensord-devel @@ -62,7 +62,7 @@ Sensord library (devel) %if %{build_test_suite} == "ON" %package -n sensor-tc Summary: Sensord library -Group: System/Sensor Framework +Group: System/Testing Requires: %{name} = %{version}-%{release} %description -n sensor-tc -- 2.7.4 From 6d71d42e29de7c45ac5922f22fb22df7dbb1ecce Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Tue, 6 Jan 2015 21:28:58 +0900 Subject: [PATCH 06/16] sensord: clean up the spec file - remove useless code. - replace hardcoded path by macro. - code clean. Change-Id: Iabeb35cdb1a5ec4684352da39d4bccbf05f51f8b Signed-off-by: Kibak Yoon --- packaging/sensord.spec | 73 +++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/packaging/sensord.spec b/packaging/sensord.spec index d5f859c..4289d7b 100755 --- a/packaging/sensord.spec +++ b/packaging/sensord.spec @@ -8,6 +8,16 @@ Source0: %{name}-%{version}.tar.gz Source1: sensord.manifest Source2: libsensord.manifest +BuildRequires: cmake +BuildRequires: vconf-keys-devel +BuildRequires: libattr-devel +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(libxml-2.0) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(libsystemd-daemon) +BuildRequires: pkgconfig(capi-system-info) + %define accel_state ON %define gyro_state ON %define proxi_state ON @@ -19,19 +29,8 @@ Source2: libsensord.manifest %define gravity_state ON %define linear_accel_state ON %define rv_state ON - %define build_test_suite OFF -BuildRequires: cmake -BuildRequires: vconf-keys-devel -BuildRequires: libattr-devel -BuildRequires: pkgconfig(dlog) -BuildRequires: pkgconfig(libxml-2.0) -BuildRequires: pkgconfig(glib-2.0) -BuildRequires: pkgconfig(vconf) -BuildRequires: pkgconfig(libsystemd-daemon) -BuildRequires: pkgconfig(capi-system-info) - %description Sensor daemon @@ -60,12 +59,12 @@ Requires: %{name} = %{version}-%{release} Sensord library (devel) %if %{build_test_suite} == "ON" -%package -n sensor-tc +%package -n sensor-test Summary: Sensord library Group: System/Testing Requires: %{name} = %{version}-%{release} -%description -n sensor-tc +%description -n sensor-test Sensor functional testing %endif @@ -75,9 +74,6 @@ Sensor functional testing cp %{SOURCE1} . cp %{SOURCE2} . -%build -#CFLAGS+=" -fvisibility=hidden "; export CFLAGS -#CXXFLAGS+=" -fvisibility=hidden -fvisibility-inlines-hidden ";export CXXFLAGS cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DACCEL=%{accel_state} \ -DGYRO=%{gyro_state} -DPROXI=%{proxi_state} -DLIGHT=%{light_state} \ -DGEO=%{geo_state} -DPRESSURE=%{pressure_state} -DTEMPERATURE=%{temperature_state} \ @@ -86,32 +82,32 @@ cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DACCEL=%{accel_state} \ -DTEST_SUITE=%{build_test_suite} \ -DLIBDIR=%{_libdir} -DINCLUDEDIR=%{_includedir} +%build make %{?jobs:-j%jobs} %install rm -rf %{buildroot} %make_install -mkdir -p %{buildroot}/usr/share/license -mkdir -p %{buildroot}%{_unitdir}/sockets.target.wants -mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants -install -m 0644 %SOURCE1 %{buildroot}%{_unitdir} -install -m 0644 %SOURCE2 %{buildroot}%{_unitdir} -ln -s ../sensord.socket %{buildroot}%{_unitdir}/sockets.target.wants/sensord.socket -ln -s ../sensord.service %{buildroot}%{_unitdir}/multi-user.target.wants/sensord.service +%install_service multi-user.target.wants sensord.service +%install_service sockets.target.wants sensord.socket -%post -p /sbin/ldconfig +%post systemctl daemon-reload -%postun -p /sbin/ldconfig +%postun systemctl daemon-reload +%post -n libsensord -p /sbin/ldconfig + +%postun -n libsensord -p /sbin/ldconfig + %files -n sensord -%{_bindir}/sensord %attr(0644,root,root)/usr/etc/sensor_plugins.xml %attr(0644,root,root)/usr/etc/sensors.xml %attr(0644,root,root)/usr/etc/virtual_sensors.xml %manifest sensord.manifest +%{_bindir}/sensord %{_unitdir}/sensord.service %{_unitdir}/sensord.socket %{_unitdir}/multi-user.target.wants/sensord.service @@ -139,20 +135,19 @@ systemctl daemon-reload %{_libdir}/pkgconfig/sensord-server.pc %if %{build_test_suite} == "ON" -%files -n sensor-tc +%files -n sensor-test %defattr(-,root,root,-) -/usr/bin/accelerometer -/usr/bin/geomagnetic -/usr/bin/orientation -/usr/bin/gravity -/usr/bin/linear_acceleration -/usr/bin/gyro -/usr/bin/proxi -/usr/bin/pressure -/usr/bin/temperature -/usr/bin/light -/usr/bin/rotation_vector - +%{_bindir}/accelerometer +%{_bindir}/geomagnetic +%{_bindir}/orientation +%{_bindir}/gravity +%{_bindir}/linear_acceleration +%{_bindir}/gyro +%{_bindir}/proxi +%{_bindir}/pressure +%{_bindir}/temperature +%{_bindir}/light +%{_bindir}/rotation_vector %license LICENSE.APLv2 %{_datadir}/license/test %endif -- 2.7.4 From 79b1f05f6dcc60868b3814c09d66bcb1e6edf6b3 Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Tue, 6 Jan 2015 22:51:31 +0900 Subject: [PATCH 07/16] sensord: remove useless xml file sensor_plugins xml for simulator is not neccessary anymore. Change-Id: I91f8f816c08ab2ca53790fe4ae6bd7ab0e7b689f Signed-off-by: Kibak Yoon --- sensor_plugins_sim.xml.in | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100755 sensor_plugins_sim.xml.in diff --git a/sensor_plugins_sim.xml.in b/sensor_plugins_sim.xml.in deleted file mode 100755 index 8f7b40b..0000000 --- a/sensor_plugins_sim.xml.in +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - -- 2.7.4 From f6acc913f97a4dac9ab37cc6468dec2055777fd6 Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Tue, 6 Jan 2015 22:53:11 +0900 Subject: [PATCH 08/16] sensord: clean CMakeList.txt - remove useless code/macro - for building on x86_64, use macro CMAKE_INSTALL_* in GNUInstallDirs Change-Id: I6298368a9e2af00c35ebf4f37b483a00a8d5e1aa Signed-off-by: Kibak Yoon --- CMakeLists.txt | 59 ++++++++++-------------- src/CMakeLists.txt | 19 -------- src/accel/CMakeLists.txt | 45 ++++++------------- src/geo/CMakeLists.txt | 42 +++++------------ src/gravity/CMakeLists.txt | 40 +++++------------ src/gyro/CMakeLists.txt | 42 +++++------------ src/libsensord/CMakeLists.txt | 85 +++++++++++++++-------------------- src/light/CMakeLists.txt | 42 +++++------------ src/linear_accel/CMakeLists.txt | 37 +++++---------- src/orientation/CMakeLists.txt | 37 +++++---------- src/pressure/CMakeLists.txt | 42 +++++------------ src/proxi/CMakeLists.txt | 42 +++++------------ src/rotation_vector/rv/CMakeLists.txt | 40 +++++------------ src/sensor_fusion/CMakeLists.txt | 2 +- src/server/CMakeLists.txt | 20 ++++++--- src/shared/CMakeLists.txt | 52 ++++++++------------- src/temperature/CMakeLists.txt | 42 +++++------------ 17 files changed, 220 insertions(+), 468 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3aae422..9ecff83 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,54 +1,42 @@ cmake_minimum_required(VERSION 2.6) project(sensord_main CXX) +include(GNUInstallDirs) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED glib-2.0 gio-2.0 vconf dlog libxml-2.0 libsystemd-daemon capi-system-info) -add_definitions(${rpkgs_CFLAGS}) - -# to install pkgconfig setup file. +# Setup For pkgconfig File SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -SET(EXEC_PREFIX "\${prefix}") +SET(EXEC_PREFIX "${PREFIX}/bin") +SET(LIBDIR "${PREFIX}/${CMAKE_INSTALL_LIBDIR}") +SET(INCLUDEDIR "${PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}") SET(VERSION 1.0) -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "2") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) -add_definitions(-Wall -O3 -omit-frame-pointer) +# Common Options +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2 -omit-frame-pointer -std=gnu++0x") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -ffunction-sections") +SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-section -Wl,--print-gc-section") +MESSAGE("FLAGS: ${CMAKE_CXX_FLAGS}") +MESSAGE("FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") + add_definitions(-DUSE_DLOG_LOG) -add_definitions(-DLIBDIR="${LIBDIR}") + +# Internal Debugging Options #add_definitions(-Wall -g -D_DEBUG) +# For Emulator FIND_PROGRAM(UNAME NAMES uname) EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET") - MESSAGE("add -DTARGET") + ADD_DEFINITIONS("-DTARGET") + MESSAGE("add -DTARGET") ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") + ADD_DEFINITIONS("-DSIMULATOR") + MESSAGE("add -DSIMULATOR") ENDIF("${ARCH}" MATCHES "^arm.*") -IF("${ARCH}" MATCHES "^arm.*") - CONFIGURE_FILE(sensor_plugins.xml.in sensor_plugins.xml @ONLY) - CONFIGURE_FILE(sensors.xml.in sensors.xml @ONLY) - CONFIGURE_FILE(virtual_sensors.xml.in virtual_sensors.xml @ONLY) - install(FILES - sensor_plugins.xml - sensors.xml - virtual_sensors.xml - DESTINATION etc) -ELSE("${ARCH}" MATCHES "^arm.*") - CONFIGURE_FILE(sensor_plugins_sim.xml.in sensor_plugins.xml @ONLY) - CONFIGURE_FILE(sensors.xml.in sensors.xml @ONLY) - CONFIGURE_FILE(virtual_sensors.xml.in virtual_sensors.xml @ONLY) - install(FILES - sensor_plugins.xml - sensors.xml - virtual_sensors.xml - DESTINATION etc) -ENDIF("${ARCH}" MATCHES "^arm.*") +# Installing files +CONFIGURE_FILE(sensor_plugins.xml.in sensor_plugins.xml @ONLY) +CONFIGURE_FILE(sensors.xml.in sensors.xml @ONLY) +INSTALL(FILES sensor_plugins.xml sensors.xml DESTINATION etc) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.APLv2 DESTINATION share/license RENAME sensord) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.APLv2 DESTINATION share/license RENAME libsensord) @@ -56,6 +44,7 @@ IF("${TEST_SUITE}" STREQUAL "ON") INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.APLv2 DESTINATION share/license RENAME test) ENDIF() +# Sub-directory add_subdirectory(systemd) add_subdirectory(src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ff35867..984f729 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,28 +1,9 @@ cmake_minimum_required(VERSION 2.6) project(sensord_src CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - include_directories(${CMAKE_SOURCE_DIR}/src/shared) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED glib-2.0 gio-2.0 vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE) -add_definitions(-Wall -std=gnu++0x) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - -set(SENSOR_FUSION_ENABLE "0") -set(ORIENTATION_ENABLE "0") -set(GRAVITY_ENABLE "0") -set(LINEAR_ACCELERATION_ENABLE "0") - IF("${ACCEL}" STREQUAL "ON") add_subdirectory(accel) ENDIF() diff --git a/src/accel/CMakeLists.txt b/src/accel/CMakeLists.txt index 948d42a..a37c89c 100755 --- a/src/accel/CMakeLists.txt +++ b/src/accel/CMakeLists.txt @@ -1,39 +1,22 @@ cmake_minimum_required(VERSION 2.6) project(accel CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME accel_sensor) SET(SENSOR_HAL_NAME accel_sensor_hal) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE -DUSE_LCD_TYPE_CHECK) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET -DHWREV_CHECK") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") - -add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-DUSE_DLOG_LOG) -add_definitions(-Iinclude) +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(accel_pkgs REQUIRED vconf) + +FOREACH(flag ${accel_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +FOREACH(flag ${accel_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED accel_sensor.cpp @@ -43,8 +26,8 @@ add_library(${SENSOR_HAL_NAME} SHARED accel_sensor_hal.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") -target_link_libraries(${SENSOR_HAL_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS}) +target_link_libraries(${SENSOR_NAME} ${accel_pkgs_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_HAL_NAME} ${accel_pkgs_LDFLAGS}) -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) -install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) +install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/geo/CMakeLists.txt b/src/geo/CMakeLists.txt index e089fbe..c6d4aa1 100755 --- a/src/geo/CMakeLists.txt +++ b/src/geo/CMakeLists.txt @@ -1,40 +1,22 @@ cmake_minimum_required(VERSION 2.6) project(geo CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME geo_sensor) SET(SENSOR_HAL_NAME geo_sensor_hal) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE -DUSE_LCD_TYPE_CHECK) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(geo_pkgs REQUIRED vconf) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET") - MESSAGE("add -DTARGET") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") +FOREACH(flag ${geo_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-Wall -O3 -omit-frame-pointer) -add_definitions(-DUSE_DLOG_LOG) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-Iinclude) +FOREACH(flag ${geo_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED geo_sensor.cpp @@ -44,8 +26,8 @@ add_library(${SENSOR_HAL_NAME} SHARED geo_sensor_hal.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") -target_link_libraries(${SENSOR_HAL_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS}) +target_link_libraries(${SENSOR_NAME} ${geo_pkgs_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_HAL_NAME} ${geo_pkgs_LDFLAGS}) -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) -install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) +install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/gravity/CMakeLists.txt b/src/gravity/CMakeLists.txt index 42cf604..e66964e 100755 --- a/src/gravity/CMakeLists.txt +++ b/src/gravity/CMakeLists.txt @@ -1,42 +1,26 @@ cmake_minimum_required(VERSION 2.6) project(gravity CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME gravity_sensor) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET -DHWREV_CHECK") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") - -add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-DUSE_DLOG_LOG) -add_definitions(-Iinclude) +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(gravity_pkgs REQUIRED vconf) + +FOREACH(flag ${gravity_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +FOREACH(flag ${gravity_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED gravity_sensor.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_NAME} ${gravity_pkgs_LDFLAGS} "-lm") -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/gyro/CMakeLists.txt b/src/gyro/CMakeLists.txt index b8af818..228fac9 100755 --- a/src/gyro/CMakeLists.txt +++ b/src/gyro/CMakeLists.txt @@ -1,40 +1,22 @@ cmake_minimum_required(VERSION 2.6) project(gyro CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME gyro_sensor) SET(SENSOR_HAL_NAME gyro_sensor_hal) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(gyro_pkgs REQUIRED vconf) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET -DHWREV_CHECK") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") +FOREACH(flag ${gyro_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-DUSE_DLOG_LOG) -add_definitions(-Iinclude) +FOREACH(flag ${gyro_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED gyro_sensor.cpp @@ -43,8 +25,8 @@ add_library(${SENSOR_HAL_NAME} SHARED gyro_sensor_hal.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") -target_link_libraries(${SENSOR_HAL_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS}) +target_link_libraries(${SENSOR_NAME} ${gyro_pkgs_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_HAL_NAME} ${gyro_pkgs_LDFLAGS}) -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) -install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) +install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/libsensord/CMakeLists.txt b/src/libsensord/CMakeLists.txt index 81f759f..5a59254 100755 --- a/src/libsensord/CMakeLists.txt +++ b/src/libsensord/CMakeLists.txt @@ -1,33 +1,21 @@ cmake_minimum_required(VERSION 2.6) project(sensor CXX) -# to install pkgconfig setup file. -SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -SET(EXEC_PREFIX "\${prefix}") SET(VERSION_MAJOR 1) SET(VERSION "${VERSION_MAJOR}.1.0") -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf glib-2.0) -add_definitions(${rpkgs_CFLAGS}) +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(lib_pkgs REQUIRED vconf glib-2.0) -#add_definitions(-Wall -O3 -omit-frame-pointer -lm) -#add_definitions(-Wall -g -lma -DUSE_FILE_DEBUG) -#add_definitions(-D_DEBUG) -add_definitions(-Wall -g -lma -fPIC -DUSE_DLOG_LOG -std=c++0x) -#add_definitions(-fvisibility=hidden -lm -DUSE_DLOG_LOG) -#add_definitions(-fvisibility=hidden -lm) +FOREACH(flag ${lib_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" STREQUAL "arm") -# ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK -DUSE_MPU3050_GYRO") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET") -ELSE("${ARCH}" STREQUAL "arm") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" STREQUAL "arm") +FOREACH(flag ${lib_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden -g -fPIC") include_directories(${CMAKE_CURRENT_SOURCE_DIR}) @@ -41,35 +29,32 @@ add_library(${PROJECT_NAME} SHARED poller.cpp ) -target_link_libraries(${PROJECT_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "sensord-share") +target_link_libraries(${PROJECT_NAME} ${lib_pkgs_LDFLAGS} "sensord-share") SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR}) SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${VERSION}) configure_file(${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc @ONLY) - -#install(DIRECTORY include/ DESTINATION ${INCLUDEDIR} FILES_MATCHING PATTERN "*.h") -install(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR} COMPONENT RuntimeLibraries) - -install(FILES sensor.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_internal_deprecated.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_internal.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES poller.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES creg_event_info.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES csensor_event_listener.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_info_manager.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES csensor_handle_info.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES client_common.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_accel.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_geomag.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_light.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_proxi.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_gyro.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_pressure.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_context.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_gravity.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_linear_accel.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_orientation.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_rv.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_temperature.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES sensor_motion.h DESTINATION ${INCLUDEDIR}/sensor/) -install(FILES ${PROJECT_NAME}.pc DESTINATION ${LIBDIR}/pkgconfig) +install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT RuntimeLibraries) +install(FILES sensor.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_internal_deprecated.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_internal.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES poller.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES creg_event_info.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES csensor_event_listener.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_info_manager.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES csensor_handle_info.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES client_common.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_accel.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_geomag.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_light.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_proxi.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_gyro.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_pressure.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_context.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_gravity.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_linear_accel.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_orientation.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_rv.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_temperature.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_motion.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES ${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/src/light/CMakeLists.txt b/src/light/CMakeLists.txt index ca8cd53..099ff82 100755 --- a/src/light/CMakeLists.txt +++ b/src/light/CMakeLists.txt @@ -1,40 +1,22 @@ cmake_minimum_required(VERSION 2.6) project(light CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME light_sensor) SET(SENSOR_HAL_NAME light_sensor_hal) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(light_pkgs REQUIRED vconf) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET -DHWREV_CHECK") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") +FOREACH(flag ${light_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-DUSE_DLOG_LOG) -add_definitions(-Iinclude) +FOREACH(flag ${light_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED light_sensor.cpp @@ -44,8 +26,8 @@ add_library(${SENSOR_HAL_NAME} SHARED light_sensor_hal.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") -target_link_libraries(${SENSOR_HAL_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS}) +target_link_libraries(${SENSOR_NAME} ${light_pkgs_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_HAL_NAME} ${light_pkgs_LDFLAGS}) -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) -install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) +install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/linear_accel/CMakeLists.txt b/src/linear_accel/CMakeLists.txt index 2295b67..986fb11 100755 --- a/src/linear_accel/CMakeLists.txt +++ b/src/linear_accel/CMakeLists.txt @@ -1,44 +1,27 @@ cmake_minimum_required(VERSION 2.6) project(linear_accel CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME linear_accel_sensor) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) include_directories(${CMAKE_SOURCE_DIR}/src/sensor_fusion) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(linear_accel_pkgs REQUIRED vconf) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET -DHWREV_CHECK") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") +FOREACH(flag ${linear_accel_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-DUSE_DLOG_LOG) -add_definitions(-Iinclude) +FOREACH(flag ${linear_accel_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED linear_accel_sensor.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_NAME} ${linear_accel_pkgs_LDFLAGS} "-lm") -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/orientation/CMakeLists.txt b/src/orientation/CMakeLists.txt index 0896f56..6f02e9a 100755 --- a/src/orientation/CMakeLists.txt +++ b/src/orientation/CMakeLists.txt @@ -1,44 +1,27 @@ cmake_minimum_required(VERSION 2.6) project(orientation CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME orientation_sensor) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) include_directories(${CMAKE_SOURCE_DIR}/src/sensor_fusion) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(orientation_pkgs REQUIRED vconf) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET -DHWREV_CHECK") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") +FOREACH(flag ${orientation_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-DUSE_DLOG_LOG) -add_definitions(-Iinclude) +FOREACH(flag ${orientation_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED orientation_sensor.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_NAME} ${orientation_pkgs_LDFLAGS} "-lm") -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/pressure/CMakeLists.txt b/src/pressure/CMakeLists.txt index 090d748..e61aca4 100755 --- a/src/pressure/CMakeLists.txt +++ b/src/pressure/CMakeLists.txt @@ -1,40 +1,22 @@ cmake_minimum_required(VERSION 2.6) project(pressure CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME pressure_sensor) SET(SENSOR_HAL_NAME pressure_sensor_hal) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE -DUSE_LCD_TYPE_CHECK) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(pressure_pkgs REQUIRED vconf) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET -DHWREV_CHECK") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") +FOREACH(flag ${pressure_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-DUSE_DLOG_LOG) -add_definitions(-Iinclude) +FOREACH(flag ${pressure_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED pressure_sensor.cpp @@ -44,8 +26,8 @@ add_library(${SENSOR_HAL_NAME} SHARED pressure_sensor_hal.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") -target_link_libraries(${SENSOR_HAL_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS}) +target_link_libraries(${SENSOR_NAME} ${pressure_pkgs_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_HAL_NAME} ${pressure_pkgs_LDFLAGS}) -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) -install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) +install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/proxi/CMakeLists.txt b/src/proxi/CMakeLists.txt index d41eb8d..7cd4517 100755 --- a/src/proxi/CMakeLists.txt +++ b/src/proxi/CMakeLists.txt @@ -1,40 +1,22 @@ cmake_minimum_required(VERSION 2.6) project(proxi CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME proxi_sensor) SET(SENSOR_HAL_NAME proxi_sensor_hal) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE -DUSE_LCD_TYPE_CHECK) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(proxi_pkgs REQUIRED vconf) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET -DHWREV_CHECK") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") +FOREACH(flag ${proxi_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-DUSE_DLOG_LOG) -add_definitions(-Iinclude) +FOREACH(flag ${proxi_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED proxi_sensor.cpp @@ -44,8 +26,8 @@ add_library(${SENSOR_HAL_NAME} SHARED proxi_sensor_hal.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") -target_link_libraries(${SENSOR_HAL_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS}) +target_link_libraries(${SENSOR_NAME} ${proxi_pkgs_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_HAL_NAME} ${proxi_pkgs_LDFLAGS}) -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) -install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) +install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/rotation_vector/rv/CMakeLists.txt b/src/rotation_vector/rv/CMakeLists.txt index 33ac289..d26d4f9 100755 --- a/src/rotation_vector/rv/CMakeLists.txt +++ b/src/rotation_vector/rv/CMakeLists.txt @@ -1,47 +1,27 @@ cmake_minimum_required(VERSION 2.6) project(rv CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(LIBDIR "\${prefix}/lib") -SET(INCLUDEDIR "\${prefix}/include") -SET(VERSION 1.0) - SET(SENSOR_NAME rv_sensor) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) include_directories(${CMAKE_SOURCE_DIR}/src/sensor_fusion) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE -DUSE_LCD_TYPE_CHECK) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(rv_pkgs REQUIRED vconf) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET") - MESSAGE("add -DTARGET") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") +FOREACH(flag ${rv_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-Wall -O3 -omit-frame-pointer) -add_definitions(-DUSE_DLOG_LOG) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-Iinclude) +FOREACH(flag ${rv_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED rv_sensor.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_NAME} ${rv_pkgs_LDFLAGS} "-lm") -install(TARGETS ${SENSOR_NAME} DESTINATION lib/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/sensor_fusion/CMakeLists.txt b/src/sensor_fusion/CMakeLists.txt index 0a753db..2505fe5 100755 --- a/src/sensor_fusion/CMakeLists.txt +++ b/src/sensor_fusion/CMakeLists.txt @@ -45,4 +45,4 @@ add_library(${SENSOR_FUSION_NAME} SHARED target_link_libraries(${SENSOR_FUSION_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") -install(TARGETS ${SENSOR_FUSION_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_FUSION_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 88e83da..2b01530 100755 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -1,14 +1,23 @@ cmake_minimum_required(VERSION 2.6) project(sensord CXX) -#add_definitions(-Wall -g -DUSE_FILE_DEBUG) -#add_definitions(-Wall -g -D_DEBUG) -#add_definitions(-Wall -g -pg) -add_definitions(-Wall -std=gnu++0x) +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(server_pkgs REQUIRED vconf glib-2.0 gio-2.0 dlog libsystemd-daemon) + +FOREACH(flag ${server_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +FOREACH(flag ${server_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lrt -ldl -pthread -fPIE") +SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie") + SET(SERVER_SRCS dbus_util.cpp server.cpp @@ -18,7 +27,6 @@ SET(SERVER_SRCS add_executable(${PROJECT_NAME} ${SERVER_SRCS}) -target_link_libraries(${PROJECT_NAME} ${rpkgs_LDFLAGS} "sensord-server") -set(CMAKE_CXX_FLAGS "-lrt -ldl -pthread ${CMAKE_CXX_FLAGS}") +target_link_libraries(${PROJECT_NAME} ${server_pkgs_LDFLAGS} "sensord-server") install(TARGETS ${PROJECT_NAME} DESTINATION bin) diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index 8c5d1c8..f400944 100755 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -1,34 +1,18 @@ cmake_minimum_required(VERSION 2.6) project(sf_common CXX) -# to install pkgconfig setup file. -SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) -#set(CMAKE_INSTALL_PREFIX "$ENV{DATAFS}") -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "2") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(shared_pkgs REQUIRED vconf dlog libxml-2.0) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED dlog libxml-2.0) -add_definitions(${rpkgs_CFLAGS}) +FOREACH(flag ${shared_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-DPREFIX="${CMAKE_INSTALL_PREFIX}") -add_definitions(-DLOCALEDIR="$ENV{DATAFS}/share/locale") -add_definitions(-DFACTORYFS="$ENV{FACTORYFS}") -add_definitions(-DDATAFS="$ENV{DATAFS}") -add_definitions(-Wall -fPIC -std=gnu++0x) -add_definitions(-DUSE_DLOG_LOG) -#add_definitions(-DX1_PROF) -#add_definitions(-D_GETTEXT) -#add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-D_DEFAULT_FONT_NAME="Vera") -#add_definitions(-Wall -g -DUSE_FILE_DEBUG) -#add_definitions(-Wall -g -D_DEBUG) -#add_definitions(-Wl,--as-needed -Wl,-O1) -#add_definitions(-finstrument-functions) +FOREACH(flag ${shared_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) @@ -62,15 +46,15 @@ add_library(sensord-share SHARED sensor_info.cpp ) -target_link_libraries(sensord-server ${rpkgs_LDFLAGS} "-lrt -ldl -pthread" "sensord-share") -target_link_libraries(sensord-share ${rpkgs_LDFLAGS} "-lrt -ldl -pthread") +target_link_libraries(sensord-server ${shared_pkgs_LDFLAGS} "-lrt -ldl -pthread" "sensord-share") +target_link_libraries(sensord-share ${shared_pkgs_LDFLAGS} "-lrt -ldl -pthread") configure_file(sensord-server.pc.in ${CMAKE_CURRENT_SOURCE_DIR}/sensord-server.pc @ONLY) configure_file(${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc @ONLY) -install(TARGETS sensord-server DESTINATION ${LIBDIR}) -install(TARGETS sensord-share DESTINATION ${LIBDIR}) -install(FILES sensord-server.pc DESTINATION ${LIBDIR}/pkgconfig) -install(FILES ${PROJECT_NAME}.pc DESTINATION ${LIBDIR}/pkgconfig) +install(TARGETS sensord-server DESTINATION ${CMAKE_INSTALL_LIBDIR}) +install(TARGETS sensord-share DESTINATION ${CMAKE_INSTALL_LIBDIR}) +install(FILES sensord-server.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +install(FILES ${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) install(FILES crw_lock.h worker_thread.h @@ -92,11 +76,11 @@ install(FILES common.h sensor_info.h iio_common.h - DESTINATION ${INCLUDEDIR}/${PROJECT_NAME} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} ) install(FILES sensor_common.h - DESTINATION ${INCLUDEDIR}/sensor + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor ) diff --git a/src/temperature/CMakeLists.txt b/src/temperature/CMakeLists.txt index f67773e..87dab53 100755 --- a/src/temperature/CMakeLists.txt +++ b/src/temperature/CMakeLists.txt @@ -1,40 +1,22 @@ cmake_minimum_required(VERSION 2.6) project(temperature CXX) -# to install pkgconfig setup file. -SET(EXEC_PREFIX "\${prefix}") -SET(VERSION 1.0) - SET(SENSOR_NAME temperature_sensor) SET(SENSOR_HAL_NAME temperature_sensor_hal) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) -include(FindPkgConfig) -pkg_check_modules(rpkgs REQUIRED vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE -DUSE_LCD_TYPE_CHECK) - -set(PROJECT_MAJOR_VERSION "0") -set(PROJECT_MINOR_VERSION "0") -set(PROJECT_RELEASE_VERSION "1") -set(CMAKE_VERBOSE_MAKEFILE OFF) - +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(temp_pkgs REQUIRED vconf) -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET -DHWREV_CHECK") - MESSAGE("add -DTARGET -DHWREV_CHECK") -ELSE("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DSIMULATOR") - MESSAGE("add -DSIMULATOR") -ENDIF("${ARCH}" MATCHES "^arm.*") +FOREACH(flag ${temp_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) -add_definitions(-Wall -O3 -omit-frame-pointer) -#add_definitions(-Wall -g -D_DEBUG) -add_definitions(-DUSE_DLOG_LOG) -add_definitions(-Iinclude) +FOREACH(flag ${temp_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) add_library(${SENSOR_NAME} SHARED temperature_sensor.cpp @@ -44,8 +26,8 @@ add_library(${SENSOR_HAL_NAME} SHARED temperature_sensor_hal.cpp ) -target_link_libraries(${SENSOR_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS} "-lm") -target_link_libraries(${SENSOR_HAL_NAME} ${rpkgs_LDFLAGS} ${GLES_LDFLAGS}) +target_link_libraries(${SENSOR_NAME} ${temp_pkgs_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_HAL_NAME} ${temp_pkgs_LDFLAGS}) -install(TARGETS ${SENSOR_NAME} DESTINATION ${LIBDIR}/sensord) -install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${LIBDIR}/sensord) +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) +install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) -- 2.7.4 From c11bf0cd00080a1a74a7bc28a3dbb1db0d6aa92e Mon Sep 17 00:00:00 2001 From: Ramasamy Date: Wed, 7 Jan 2015 10:06:16 +0530 Subject: [PATCH 09/16] Adapting estimate_orientation to support geomagnetic_RV Restructuring estimate_orientation octave code to support both quaternion generation using accel/gyro/mag or only using accel/mag hardware sensors. Change-Id: I0976df35d488d6bafb9ce064027ff7fd6e352dbd --- .../design/lib/estimate_orientation.m | 305 +++++++++++---------- 1 file changed, 155 insertions(+), 150 deletions(-) diff --git a/src/sensor_fusion/design/lib/estimate_orientation.m b/src/sensor_fusion/design/lib/estimate_orientation.m index 187ef38..0094b04 100755 --- a/src/sensor_fusion/design/lib/estimate_orientation.m +++ b/src/sensor_fusion/design/lib/estimate_orientation.m @@ -25,6 +25,11 @@ function [quat_driv, quat_aid, quat_error] = estimate_orientation(Accel_data, G PLOT_INDIVIDUAL_SENSOR_INPUT_DATA = 0; MAGNETIC_ALIGNMENT_FACTOR = -1; + GYRO_DATA_DISABLED = 0; + + if Gyro_data(4,1) == 0 + GYRO_DATA_DISABLED = 1; + end GRAVITY = 9.80665; PI = 3.141593; @@ -35,15 +40,8 @@ function [quat_driv, quat_aid, quat_error] = estimate_orientation(Accel_data, G DEG2RAD = 0.0174532925; US2S = 1.0 / 1000000.0; - % Gyro Types - % Systron-donner "Horizon" - ZigmaW = 0.05 * DEG2RAD; %deg/s - TauW = 1000; %secs - % Crossbow DMU-6X - %ZigmaW = 0.05 * DEG2RAD; %deg/s - %TauW = 300; %secs - %FOGs (KVH Autogyro and Crossbow DMU-FOG) - %ZigmaW = 0; %deg/s + ZigmaW = 0.05 * DEG2RAD; + TauW = 1000; BUFFER_SIZE = size(Accel_data,2); Ax = Accel_data(1,:); @@ -51,66 +49,70 @@ function [quat_driv, quat_aid, quat_error] = estimate_orientation(Accel_data, G Az = Accel_data(3,:); ATime = Accel_data(4,:); - Gx = Gyro_data(1,:); - Gy = Gyro_data(2,:); - Gz = Gyro_data(3,:); - GTime = Gyro_data(4,:); - Mx = Mag_data(1,:); My = Mag_data(2,:); Mz = Mag_data(3,:); MTime = Mag_data(4,:); - % Gyroscope Bias Variables - Bx = 0; By = 0; Bz = 0; - acc_x = zeros(1,BUFFER_SIZE); acc_y = zeros(1,BUFFER_SIZE); acc_z = zeros(1,BUFFER_SIZE); - gyr_x = zeros(1,BUFFER_SIZE); - gyr_y = zeros(1,BUFFER_SIZE); - gyr_z = zeros(1,BUFFER_SIZE); mag_x = zeros(1,BUFFER_SIZE); mag_y = zeros(1,BUFFER_SIZE); mag_z = zeros(1,BUFFER_SIZE); - % User Acceleration mean and Variance - A_T = zeros(1,BUFFER_SIZE); - G_T = zeros(1,BUFFER_SIZE); - M_T = zeros(1,BUFFER_SIZE); - var_roll = zeros(1,BUFFER_SIZE); - var_pitch = zeros(1,BUFFER_SIZE); - var_yaw = zeros(1,BUFFER_SIZE); - var_Gx = zeros(1,BUFFER_SIZE); - var_Gy = zeros(1,BUFFER_SIZE); - var_Gz = zeros(1,BUFFER_SIZE); - - roll = zeros(1,BUFFER_SIZE); - pitch = zeros(1,BUFFER_SIZE); - yaw = zeros(1,BUFFER_SIZE); - quat_driv = zeros(BUFFER_SIZE,4); quat_aid = zeros(BUFFER_SIZE,4); + quat_driv = zeros(BUFFER_SIZE,4); quat_error = zeros(BUFFER_SIZE,4); - - % system covariance matrix - Q = zeros(6,6); - - % measurement covariance matrix - R = zeros(6,6); - - A_T(1) = 100000; - G_T(1) = 100000; - M_T(1) = 100000; - + acc_e = [0.0;0.0;1.0]; % gravity vector in earth frame mag_e = [0.0;MAGNETIC_ALIGNMENT_FACTOR;0.0]; % magnetic field vector in earth frame - H = [eye(3) zeros(3,3); zeros(3,6)]; - x = zeros(6,BUFFER_SIZE); - e = zeros(1,6); - P = 1 * eye(6);% state covariance matrix - - quat_driv(1,:) = [1 0 0 0]; + if GYRO_DATA_DISABLED != 1 + % Gyroscope Bias Variables + Bx = 0; By = 0; Bz = 0; + + Gx = Gyro_data(1,:); + Gy = Gyro_data(2,:); + Gz = Gyro_data(3,:); + GTime = Gyro_data(4,:); + + gyr_x = zeros(1,BUFFER_SIZE); + gyr_y = zeros(1,BUFFER_SIZE); + gyr_z = zeros(1,BUFFER_SIZE); + + % User Acceleration mean and Variance + A_T = zeros(1,BUFFER_SIZE); + G_T = zeros(1,BUFFER_SIZE); + M_T = zeros(1,BUFFER_SIZE); + var_roll = zeros(1,BUFFER_SIZE); + var_pitch = zeros(1,BUFFER_SIZE); + var_yaw = zeros(1,BUFFER_SIZE); + var_Gx = zeros(1,BUFFER_SIZE); + var_Gy = zeros(1,BUFFER_SIZE); + var_Gz = zeros(1,BUFFER_SIZE); + + roll = zeros(1,BUFFER_SIZE); + pitch = zeros(1,BUFFER_SIZE); + yaw = zeros(1,BUFFER_SIZE); + + % system covariance matrix + Q = zeros(6,6); + + % measurement covariance matrix + R = zeros(6,6); + + A_T(1) = 100000; + G_T(1) = 100000; + M_T(1) = 100000; + + H = [eye(3) zeros(3,3); zeros(3,6)]; + x = zeros(6,BUFFER_SIZE); + e = zeros(1,6); + P = 1 * eye(6);% state covariance matrix + + quat_driv(1,:) = [1 0 0 0]; + end % first order filtering for i = 1:BUFFER_SIZE @@ -126,16 +128,8 @@ function [quat_driv, quat_aid, quat_error] = estimate_orientation(Accel_data, G mag_y(i) = norm_mag * My(i); mag_z(i) = norm_mag * Mz(i); - gyr_x(i) = Gx(i) * PI; - gyr_y(i) = Gy(i) * PI; - gyr_z(i) = Gz(i) * PI; - UA(i) = sqrt(acc_x(i)^2 + acc_y(i)^2 + acc_z(i)^2) - GRAVITY; - gyr_x(i) = gyr_x(i) - Bx; - gyr_y(i) = gyr_y(i) - By; - gyr_z(i) = gyr_z(i) - Bz; - % Aiding System (Accelerometer + Geomagnetic) quaternion generation % gravity vector in body frame acc_b =[acc_x(i);acc_y(i);acc_z(i)]; @@ -150,98 +144,109 @@ function [quat_driv, quat_aid, quat_error] = estimate_orientation(Accel_data, G Rot_m = M_e * M_b'; quat_aid(i,:) = rot_mat2quat(Rot_m); - euler = quat2euler(quat_aid(i,:)); - roll(i) = euler(2); - pitch(i) = euler(1); - yaw(i) = euler(3); - - if i <= MOVING_AVERAGE_WINDOW_LENGTH - var_Gx(i) = NON_ZERO_VAL; - var_Gy(i) = NON_ZERO_VAL; - var_Gz(i) = NON_ZERO_VAL; - var_roll(i) = NON_ZERO_VAL; - var_pitch(i) = NON_ZERO_VAL; - var_yaw(i) = NON_ZERO_VAL; - else - var_Gx(i) = var(gyr_x((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); - var_Gy(i) = var(gyr_y((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); - var_Gz(i) = var(gyr_z((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); - var_roll(i) = var(roll((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); - var_pitch(i) = var(pitch((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); - var_yaw(i) = var(yaw((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); - end - if i > 1 - A_T(i) = ATime(i) - ATime(i-1); - G_T(i) = GTime(i) - GTime(i-1); - M_T(i) = MTime(i) - MTime(i-1); + if GYRO_DATA_DISABLED != 1 + gyr_x(i) = Gx(i) * PI; + gyr_y(i) = Gy(i) * PI; + gyr_z(i) = Gz(i) * PI; + + gyr_x(i) = gyr_x(i) - Bx; + gyr_y(i) = gyr_y(i) - By; + gyr_z(i) = gyr_z(i) - Bz; + + euler = quat2euler(quat_aid(i,:)); + roll(i) = euler(2); + pitch(i) = euler(1); + yaw(i) = euler(3); + + if i <= MOVING_AVERAGE_WINDOW_LENGTH + var_Gx(i) = NON_ZERO_VAL; + var_Gy(i) = NON_ZERO_VAL; + var_Gz(i) = NON_ZERO_VAL; + var_roll(i) = NON_ZERO_VAL; + var_pitch(i) = NON_ZERO_VAL; + var_yaw(i) = NON_ZERO_VAL; + else + var_Gx(i) = var(gyr_x((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); + var_Gy(i) = var(gyr_y((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); + var_Gz(i) = var(gyr_z((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); + var_roll(i) = var(roll((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); + var_pitch(i) = var(pitch((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); + var_yaw(i) = var(yaw((i-MOVING_AVERAGE_WINDOW_LENGTH):i)); + end + if i > 1 + A_T(i) = ATime(i) - ATime(i-1); + G_T(i) = GTime(i) - GTime(i-1); + M_T(i) = MTime(i) - MTime(i-1); + end + + dt = G_T(i) * US2S; + + Qwn = [var_Gx(i) 0 0;0 var_Gy(i) 0;0 0 var_Gz(i);]; + Qwb = (2 * (ZigmaW^2) / TauW) * eye(3); + + % Process Noise Covariance + Q = [Qwn zeros(3,3);zeros(3,3) Qwb]; + + % Measurement Noise Covariance + R = [[var_roll(i) 0 0;0 var_pitch(i) 0;0 0 var_yaw(i)] zeros(3,3); zeros(3,3) zeros(3,3)]; + + % initialization for q + if i == 1 + q = quat_aid(i,:); + end + + q_t = [q(2) q(3) q(4)]'; + Rtan = (q(1)^2 - q_t'*q_t)*eye(3) + 2*q_t*q_t' - 2*q(1)*[0 -q(4) q(3);q(4) 0 -q(2);-q(3) q(2) 0]; + F = [[0 gyr_z(i) -gyr_y(i);-gyr_z(i) 0 gyr_x(i);gyr_y(i) -gyr_x(i) 0] Rtan; zeros(3,3) (-(1/TauW) * eye(3))]; + + % Time Update + if i > 1 + x(:,i) = F * x(:,i-1); + end + + % compute covariance of prediction + P = (F * P * F') + Q; + + % Driving System (Gyroscope) quaternion generation + % convert scaled gyro data to rad/s + qDot = 0.5 * quat_prod(q, [0 gyr_x(i) gyr_y(i) gyr_z(i)]); + + % Integrate to yield quaternion + q = q + qDot * dt * PI; + + % normalise quaternion + quat_driv(i,:) = q / norm(q); + + % Kalman Filtering + quat_error(i,:) = quat_prod(quat_aid(i,:), quat_driv(i,:)); + + euler_e = quat2euler(quat_error(i,:)); + x1 = euler_e(1)'/PI; + x2 = euler_e(2)'/PI; + x3 = euler_e(3)'/PI; + + q = quat_prod(quat_driv(i,:), [1 x1 x2 x3]) * PI; + q = q / norm(q); + + if i > 1 + e = [x1 x2 x3 x(4,i) x(5,i) x(6,i)]; + end + + for j =1:6 + % compute Kalman gain + K(:,j) = P(j ,:)./(P(j,j)+R(j,j)); + % update state vector + x(:,i) = x(:,i) + K(:,j) * e(j); + % update covariance matrix + P = (eye(6) - (K(:,j) * H(j,:))) * P; + end + + Bx = x(4,i); + By = x(5,i); + Bz = x(6,i); end - - dt = G_T(i) * US2S; - - Qwn = [var_Gx(i) 0 0;0 var_Gy(i) 0;0 0 var_Gz(i);]; - Qwb = (2 * (ZigmaW^2) / TauW) * eye(3); - - % Process Noise Covariance - Q = [Qwn zeros(3,3);zeros(3,3) Qwb]; - - % Measurement Noise Covariance - R = [[var_roll(i) 0 0;0 var_pitch(i) 0;0 0 var_yaw(i)] zeros(3,3); zeros(3,3) zeros(3,3)]; - - % initialization for q - if i == 1 - q = quat_aid(i,:); - end - - q_t = [q(2) q(3) q(4)]'; - Rtan = (q(1)^2 - q_t'*q_t)*eye(3) + 2*q_t*q_t' - 2*q(1)*[0 -q(4) q(3);q(4) 0 -q(2);-q(3) q(2) 0]; - F = [[0 gyr_z(i) -gyr_y(i);-gyr_z(i) 0 gyr_x(i);gyr_y(i) -gyr_x(i) 0] Rtan; zeros(3,3) (-(1/TauW) * eye(3))]; - - % Time Update - if i > 1 - x(:,i) = F * x(:,i-1); - end - - % compute covariance of prediction - P = (F * P * F') + Q; - - % Driving System (Gyroscope) quaternion generation - % convert scaled gyro data to rad/s - qDot = 0.5 * quat_prod(q, [0 gyr_x(i) gyr_y(i) gyr_z(i)]); - - % Integrate to yield quaternion - q = q + qDot * dt * PI; - - % normalise quaternion - quat_driv(i,:) = q / norm(q); - - % Kalman Filtering - quat_error(i,:) = quat_prod(quat_aid(i,:), quat_driv(i,:)); - - euler_e = quat2euler(quat_error(i,:)); - x1 = euler_e(1)'/PI; - x2 = euler_e(2)'/PI; - x3 = euler_e(3)'/PI; - - q = quat_prod(quat_driv(i,:), [1 x1 x2 x3]) * PI; - q = q / norm(q); - - if i > 1 - e = [x1 x2 x3 x(4,i) x(5,i) x(6,i)]; - end - - for j =1:6 - % compute Kalman gain - K(:,j) = P(j ,:)./(P(j,j)+R(j,j)); - % update state vector - x(:,i) = x(:,i) + K(:,j) * e(j); - % update covariance matrix - P = (eye(6) - (K(:,j) * H(j,:))) * P; - end - - Bx = x(4,i); - By = x(5,i); - Bz = x(6,i); end + if PLOT_SCALED_SENSOR_COMPARISON_DATA == 1 % Accelerometer/Gyroscope/Magnetometer scaled Plot results hfig=(figure); -- 2.7.4 From af570ceee703763db5a1dc22eb0b9fdb41bb0ec9 Mon Sep 17 00:00:00 2001 From: Ramasamy Date: Wed, 7 Jan 2015 10:22:04 +0530 Subject: [PATCH 10/16] Modifying geomagnetic_RV files for new estimate_orientation - Adapting geomagnetic_RV octave files to the restructured estmate_orientation ocateve implementation - cleanup Change-Id: I84ce43db89cddbb7f664b67608e90ef9c2068d99 --- src/sensor_fusion/design/lib/estimate_geomagnetic_rv.m | 6 +----- src/sensor_fusion/design/sf_geomagnetic_rv.m | 10 ++++------ 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/sensor_fusion/design/lib/estimate_geomagnetic_rv.m b/src/sensor_fusion/design/lib/estimate_geomagnetic_rv.m index a3ac4da..340f4d0 100755 --- a/src/sensor_fusion/design/lib/estimate_geomagnetic_rv.m +++ b/src/sensor_fusion/design/lib/estimate_geomagnetic_rv.m @@ -26,16 +26,12 @@ function [Quat_aid] = estimate_geomagnetic_rv(Accel_data, Mag_data) GRAVITY = 9.80665; RAD2DEG = 57.2957795; -PITCH_PHASE_CORRECTION = -1; -ROLL_PHASE_CORRECTION = -1; -YAW_PHASE_CORRECTION = -1; - BUFFER_SIZE = size(Accel_data,2); Gravity = zeros(3,BUFFER_SIZE); OR_driv = zeros(3,BUFFER_SIZE); -Gyro_data = zeros(3,BUFFER_SIZE); +Gyro_data = zeros(4,BUFFER_SIZE); Quat_driv = zeros(4,BUFFER_SIZE); Quat_aid = zeros(4,BUFFER_SIZE); diff --git a/src/sensor_fusion/design/sf_geomagnetic_rv.m b/src/sensor_fusion/design/sf_geomagnetic_rv.m index 595ca75..78802eb 100755 --- a/src/sensor_fusion/design/sf_geomagnetic_rv.m +++ b/src/sensor_fusion/design/sf_geomagnetic_rv.m @@ -42,7 +42,7 @@ Sign_Mx = 1; Sign_My = 1; Sign_Mz = 1; -BUFFER_SIZE = 100; +BUFFER_SIZE = 1095; Accel_data = zeros(4,BUFFER_SIZE); Mag_data = zeros(4,BUFFER_SIZE); @@ -67,13 +67,14 @@ Mag_data(4,:) = ((dlmread("data/100ms/orientation/roll_pitch_yaw/magnetic.txt")( % estimate orientation Geo_RV = estimate_geomagnetic_rv(Accel_data, Mag_data); -Orientation_RV = quat2euler(Geo_RV); +for i = 1:BUFFER_SIZE + Orientation_RV(:,i) = quat2euler(Geo_RV(i,:)); +end hfig=(figure); scrsz = get(0,'ScreenSize'); set(hfig,'position',scrsz); % Geomagnetic Rotation Vector Plot Results -subplot(2,1,2) UA = Orientation_RV(1,:); p1 = plot(1:length(UA),UA(1,1:length(UA)),'k'); hold on; @@ -87,6 +88,3 @@ p3 = plot(1:length(UA),UA(1,1:length(UA)),'r'); title(['Geomagnetic Rotation Vector']); legend([p1 p2 p3],'x-axis', 'y-axis', 'z-axis'); - - - -- 2.7.4 From e60cd9cf11fddd18ad58a2ed235012f09cd0e36d Mon Sep 17 00:00:00 2001 From: Ramasamy Date: Wed, 7 Jan 2015 10:25:38 +0530 Subject: [PATCH 11/16] Modifying sf_orientation for new estimate_orientation - Adapting sf_orientation octave file to the restructured estmate_orientation ocatave implementation Change-Id: I4febde2c476182ebd6df9b186efc3ad7cbdc0dd2 --- src/sensor_fusion/design/sf_orientation.m | 34 +++++++++++++++++-------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/sensor_fusion/design/sf_orientation.m b/src/sensor_fusion/design/sf_orientation.m index a14916a..140487a 100755 --- a/src/sensor_fusion/design/sf_orientation.m +++ b/src/sensor_fusion/design/sf_orientation.m @@ -62,7 +62,9 @@ OR_driv = zeros(3,BUFFER_SIZE); OR_aid = zeros(3,BUFFER_SIZE); OR_err = zeros(3,BUFFER_SIZE); -euler = zeros(BUFFER_SIZE,3); +euler_driv = zeros(BUFFER_SIZE,3); +euler_aid = zeros(BUFFER_SIZE,3); +euler_err = zeros(BUFFER_SIZE,3); % Sensor Data simulating orientation motions @@ -92,20 +94,22 @@ Mag_data(4,:) = ((dlmread("data/100ms/orientation/roll_pitch_yaw/magnetic.txt")( % estimate orientation [Quat_driv, Quat_aid, Quat_err] = estimate_orientation(Accel_data, Gyro_data, Mag_data); -euler = quat2euler(Quat_aid); -OR_aid(1,:) = euler(:,2)' * RAD2DEG; -OR_aid(2,:) = euler(:,1)' * RAD2DEG; -OR_aid(3,:) = euler(:,3)' * RAD2DEG; - -euler = quat2euler(Quat_driv); -OR_driv(1,:) = ROLL_PHASE_CORRECTION * euler(:,2)' * RAD2DEG; -OR_driv(2,:) = PITCH_PHASE_CORRECTION * euler(:,1)' * RAD2DEG; -OR_driv(3,:) = YAW_PHASE_CORRECTION * euler(:,3)' * RAD2DEG; - -euler = quat2euler(Quat_err); -OR_err(1,:) = euler(:,2)' * RAD2DEG; -OR_err(2,:) = euler(:,1)' * RAD2DEG; -OR_err(3,:) = euler(:,3)' * RAD2DEG; +for i = 1:BUFFER_SIZE + euler_aid(i,:) = quat2euler(Quat_aid(i,:)); + OR_aid(1,i) = euler_aid(i,2)' * RAD2DEG; + OR_aid(2,i) = euler_aid(i,1)' * RAD2DEG; + OR_aid(3,i) = euler_aid(i,3)' * RAD2DEG; + + euler_driv(i,:) = quat2euler(Quat_driv(i,:)); + OR_driv(1,i) = ROLL_PHASE_CORRECTION * euler_driv(i,2)' * RAD2DEG; + OR_driv(2,i) = PITCH_PHASE_CORRECTION * euler_driv(i,1)' * RAD2DEG; + OR_driv(3,i) = YAW_PHASE_CORRECTION * euler_driv(i,3)' * RAD2DEG; + + euler_err(i,:) = quat2euler(Quat_err(i,:)); + OR_err(1,i) = euler_err(i,2)' * RAD2DEG; + OR_err(2,i) = euler_err(i,1)' * RAD2DEG; + OR_err(3,i) = euler_err(i,3)' * RAD2DEG; +end % Rotation Plot Results hfig=(figure); -- 2.7.4 From 46598dfc35a601ad38c8277d35d291b5e1fa9aa2 Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Wed, 7 Jan 2015 14:05:17 +0900 Subject: [PATCH 12/16] sensord: fix CMakeList.txt for avoiding build-break - define LIBDIR - install virtual_sensors.xml Change-Id: I4b3e65c6a0fa25dbf9e312e744087b4174a21620 Signed-off-by: Kibak Yoon --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ecff83..eb4beee 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ MESSAGE("FLAGS: ${CMAKE_CXX_FLAGS}") MESSAGE("FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") add_definitions(-DUSE_DLOG_LOG) +add_definitions(-DLIBDIR="${CMAKE_INSTALL_LIBDIR}") # Internal Debugging Options #add_definitions(-Wall -g -D_DEBUG) @@ -35,8 +36,10 @@ ENDIF("${ARCH}" MATCHES "^arm.*") # Installing files CONFIGURE_FILE(sensor_plugins.xml.in sensor_plugins.xml @ONLY) CONFIGURE_FILE(sensors.xml.in sensors.xml @ONLY) +CONFIGURE_FILE(virtual_sensors.xml.in virtual_sensors.xml @ONLY) INSTALL(FILES sensor_plugins.xml sensors.xml DESTINATION etc) +INSTALL(FILES virtual_sensors.xml virtual_sensors.xml DESTINATION etc) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.APLv2 DESTINATION share/license RENAME sensord) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.APLv2 DESTINATION share/license RENAME libsensord) -- 2.7.4 From 21194b013a3cbd1a2f129ed51a2fb47edeaabdf1 Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Wed, 7 Jan 2015 15:24:37 +0900 Subject: [PATCH 13/16] sensord: add/change enums and types for avoiding build-break this patch would be reverted. However enumerations and types are added for avoiding build-break until sensor capi is replaced by Tizen 2.3 API. all packages which use tizen 2.2.1 api doesn't have a problem about building, but some APIs don't work from now. Change-Id: I8511158d977304b738fb33c9842a749e0f3519d1 Signed-off-by: Kibak Yoon --- src/accel/accel_sensor.cpp | 4 +- src/accel/accel_sensor.h | 2 +- src/accel/accel_sensor_hal.cpp | 2 +- src/accel/accel_sensor_hal.h | 2 +- src/geo/geo_sensor.cpp | 4 +- src/geo/geo_sensor.h | 2 +- src/geo/geo_sensor_hal.cpp | 2 +- src/geo/geo_sensor_hal.h | 2 +- src/gravity/gravity_sensor.cpp | 2 +- src/gravity/gravity_sensor.h | 2 +- src/gyro/gyro_sensor.cpp | 4 +- src/gyro/gyro_sensor.h | 2 +- src/gyro/gyro_sensor_hal.cpp | 2 +- src/gyro/gyro_sensor_hal.h | 2 +- src/libsensord/CMakeLists.txt | 1 + src/libsensord/client.cpp | 15 ++++++++ src/libsensord/sensor_deprecated.h | 58 +++++++++++++++++++++++++++++ src/libsensord/sensor_internal_deprecated.h | 37 +++++++++++------- src/libsensord/sensor_motion.h | 2 - src/light/light_sensor.cpp | 2 +- src/light/light_sensor.h | 2 +- src/light/light_sensor_hal.cpp | 2 +- src/light/light_sensor_hal.h | 2 +- src/linear_accel/linear_accel_sensor.cpp | 2 +- src/linear_accel/linear_accel_sensor.h | 2 +- src/orientation/orientation_sensor.cpp | 2 +- src/orientation/orientation_sensor.h | 2 +- src/pressure/pressure_sensor.cpp | 4 +- src/pressure/pressure_sensor.h | 2 +- src/pressure/pressure_sensor_hal.cpp | 2 +- src/pressure/pressure_sensor_hal.h | 2 +- src/proxi/proxi_sensor.cpp | 2 +- src/proxi/proxi_sensor.h | 2 +- src/proxi/proxi_sensor_hal.cpp | 2 +- src/proxi/proxi_sensor_hal.h | 2 +- src/rotation_vector/rv/rv_sensor.cpp | 2 +- src/rotation_vector/rv/rv_sensor.h | 2 +- src/shared/sensor_base.cpp | 4 +- src/shared/sensor_base.h | 2 +- src/shared/sensor_common.h | 8 +++- src/shared/sensor_hal.h | 2 +- src/shared/sf_common.h | 2 +- src/temperature/temperature_sensor.cpp | 4 +- src/temperature/temperature_sensor.h | 2 +- src/temperature/temperature_sensor_hal.cpp | 2 +- src/temperature/temperature_sensor_hal.h | 2 +- 46 files changed, 150 insertions(+), 63 deletions(-) create mode 100644 src/libsensord/sensor_deprecated.h diff --git a/src/accel/accel_sensor.cpp b/src/accel/accel_sensor.cpp index 7323b35..55ddf2b 100755 --- a/src/accel/accel_sensor.cpp +++ b/src/accel/accel_sensor.cpp @@ -65,7 +65,7 @@ bool accel_sensor::init() return false; } - sensor_properties_t properties; + sensor_properties_s properties; if (m_sensor_hal->get_properties(properties) == false) { ERR("sensor->get_properties() is failed!\n"); @@ -133,7 +133,7 @@ bool accel_sensor::on_stop(void) return stop_poll(); } -bool accel_sensor::get_properties(sensor_properties_t &properties) +bool accel_sensor::get_properties(sensor_properties_s &properties) { return m_sensor_hal->get_properties(properties); } diff --git a/src/accel/accel_sensor.h b/src/accel/accel_sensor.h index 5d946ba..fec8d69 100755 --- a/src/accel/accel_sensor.h +++ b/src/accel/accel_sensor.h @@ -35,7 +35,7 @@ public: static bool working(void *inst); virtual bool set_interval(unsigned long interval); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); virtual int get_sensor_data(unsigned int type, sensor_data_t &data); private: sensor_hal *m_sensor_hal; diff --git a/src/accel/accel_sensor_hal.cpp b/src/accel/accel_sensor_hal.cpp index 53bb2d7..6a78105 100755 --- a/src/accel/accel_sensor_hal.cpp +++ b/src/accel/accel_sensor_hal.cpp @@ -436,7 +436,7 @@ int accel_sensor_hal::get_sensor_data(sensor_data_t &data) return 0; } -bool accel_sensor_hal::get_properties(sensor_properties_t &properties) +bool accel_sensor_hal::get_properties(sensor_properties_s &properties) { properties.name = m_chip_name; properties.vendor = m_vendor; diff --git a/src/accel/accel_sensor_hal.h b/src/accel/accel_sensor_hal.h index b2e86e1..821bb1e 100755 --- a/src/accel/accel_sensor_hal.h +++ b/src/accel/accel_sensor_hal.h @@ -41,7 +41,7 @@ public: bool set_interval(unsigned long val); bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); - bool get_properties(sensor_properties_t &properties); + bool get_properties(sensor_properties_s &properties); // bool check_hw_node(void); private: diff --git a/src/geo/geo_sensor.cpp b/src/geo/geo_sensor.cpp index 029df71..7f967c7 100755 --- a/src/geo/geo_sensor.cpp +++ b/src/geo/geo_sensor.cpp @@ -51,7 +51,7 @@ bool geo_sensor::init() return false; } - sensor_properties_t properties; + sensor_properties_s properties; if (m_sensor_hal->get_properties(properties) == false) { ERR("sensor->get_properties() is failed!\n"); @@ -118,7 +118,7 @@ bool geo_sensor::on_stop(void) return stop_poll(); } -bool geo_sensor::get_properties(sensor_properties_t &properties) +bool geo_sensor::get_properties(sensor_properties_s &properties) { return m_sensor_hal->get_properties(properties); } diff --git a/src/geo/geo_sensor.h b/src/geo/geo_sensor.h index c211e5c..d864ec1 100755 --- a/src/geo/geo_sensor.h +++ b/src/geo/geo_sensor.h @@ -36,7 +36,7 @@ public: static bool working(void *inst); virtual bool set_interval(unsigned long interval); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); int get_sensor_data(unsigned int type, sensor_data_t &data); private: sensor_hal *m_sensor_hal; diff --git a/src/geo/geo_sensor_hal.cpp b/src/geo/geo_sensor_hal.cpp index 21a2276..fdd99f9 100755 --- a/src/geo/geo_sensor_hal.cpp +++ b/src/geo/geo_sensor_hal.cpp @@ -195,7 +195,7 @@ int geo_sensor_hal::get_sensor_data(sensor_data_t &data) return 0; } -bool geo_sensor_hal::get_properties(sensor_properties_t &properties) +bool geo_sensor_hal::get_properties(sensor_properties_s &properties) { properties.name = m_chip_name; properties.vendor = m_vendor; diff --git a/src/geo/geo_sensor_hal.h b/src/geo/geo_sensor_hal.h index 25183d2..291c725 100755 --- a/src/geo/geo_sensor_hal.h +++ b/src/geo/geo_sensor_hal.h @@ -44,7 +44,7 @@ public: bool set_interval(unsigned long val); bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); - bool get_properties(sensor_properties_t &properties); + bool get_properties(sensor_properties_s &properties); private: string m_model_id; string m_vendor; diff --git a/src/gravity/gravity_sensor.cpp b/src/gravity/gravity_sensor.cpp index 5467318..21b8e96 100755 --- a/src/gravity/gravity_sensor.cpp +++ b/src/gravity/gravity_sensor.cpp @@ -255,7 +255,7 @@ int gravity_sensor::get_sensor_data(const unsigned int event_type, sensor_data_t return 0; } -bool gravity_sensor::get_properties(sensor_properties_t &properties) +bool gravity_sensor::get_properties(sensor_properties_s &properties) { properties.min_range = -GRAVITY; properties.max_range = GRAVITY; diff --git a/src/gravity/gravity_sensor.h b/src/gravity/gravity_sensor.h index 03fd4f3..ec2c5e1 100755 --- a/src/gravity/gravity_sensor.h +++ b/src/gravity/gravity_sensor.h @@ -40,7 +40,7 @@ public: bool delete_interval(int client_id); int get_sensor_data(const unsigned int event_type, sensor_data_t &data); - bool get_properties(sensor_properties_t &properties); + bool get_properties(sensor_properties_s &properties); private: sensor_base *m_orientation_sensor; cmutex m_value_mutex; diff --git a/src/gyro/gyro_sensor.cpp b/src/gyro/gyro_sensor.cpp index d057959..30f562b 100755 --- a/src/gyro/gyro_sensor.cpp +++ b/src/gyro/gyro_sensor.cpp @@ -54,7 +54,7 @@ bool gyro_sensor::init() return false; } - sensor_properties_t properties; + sensor_properties_s properties; if (m_sensor_hal->get_properties(properties) == false) { ERR("sensor->get_properties() is failed!\n"); @@ -120,7 +120,7 @@ bool gyro_sensor::on_stop(void) return stop_poll(); } -bool gyro_sensor::get_properties(sensor_properties_t &properties) +bool gyro_sensor::get_properties(sensor_properties_s &properties) { return m_sensor_hal->get_properties(properties); } diff --git a/src/gyro/gyro_sensor.h b/src/gyro/gyro_sensor.h index 81d7557..a56ca2f 100755 --- a/src/gyro/gyro_sensor.h +++ b/src/gyro/gyro_sensor.h @@ -36,7 +36,7 @@ public: static bool working(void *inst); virtual bool set_interval(unsigned long interval); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); int get_sensor_data(unsigned int type, sensor_data_t &data); private: sensor_hal *m_sensor_hal; diff --git a/src/gyro/gyro_sensor_hal.cpp b/src/gyro/gyro_sensor_hal.cpp index c9bf135..f4f690e 100755 --- a/src/gyro/gyro_sensor_hal.cpp +++ b/src/gyro/gyro_sensor_hal.cpp @@ -281,7 +281,7 @@ int gyro_sensor_hal::get_sensor_data(sensor_data_t &data) return 0; } -bool gyro_sensor_hal::get_properties(sensor_properties_t &properties) +bool gyro_sensor_hal::get_properties(sensor_properties_s &properties) { properties.name = m_chip_name; properties.vendor = m_vendor; diff --git a/src/gyro/gyro_sensor_hal.h b/src/gyro/gyro_sensor_hal.h index f2e63a6..dcb8bfe 100755 --- a/src/gyro/gyro_sensor_hal.h +++ b/src/gyro/gyro_sensor_hal.h @@ -41,7 +41,7 @@ public: bool set_interval(unsigned long ms_interval); bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); private: int m_x; diff --git a/src/libsensord/CMakeLists.txt b/src/libsensord/CMakeLists.txt index 5a59254..4b51611 100755 --- a/src/libsensord/CMakeLists.txt +++ b/src/libsensord/CMakeLists.txt @@ -57,4 +57,5 @@ install(FILES sensor_orientation.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/senso install(FILES sensor_rv.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) install(FILES sensor_temperature.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) install(FILES sensor_motion.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_deprecated.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) install(FILES ${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/src/libsensord/client.cpp b/src/libsensord/client.cpp index 3132921..dcac646 100755 --- a/src/libsensord/client.cpp +++ b/src/libsensord/client.cpp @@ -388,6 +388,21 @@ API int sf_check_rotation(unsigned long *rotation) return 0; } +int sf_is_sensor_event_available(sensor_type_t sensor_type, unsigned int event_type) +{ + return 0; +} + +int sf_get_data_properties(unsigned int data_id, sensor_data_properties_t *return_data_properties) +{ + return 0; +} + +int sf_get_properties(sensor_type_t sensor_type, sensor_properties_t *return_properties) +{ + return 0; +} + static bool get_sensor_list(void) { static cmutex l; diff --git a/src/libsensord/sensor_deprecated.h b/src/libsensord/sensor_deprecated.h new file mode 100644 index 0000000..094907a --- /dev/null +++ b/src/libsensord/sensor_deprecated.h @@ -0,0 +1,58 @@ +/* + * libsensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SENSOR_DEPRECATED_H__ +#define __SENSOR_DEPRECATED_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define ACCELEROMETER_EVENT_ROTATION_CHECK ((ACCELEROMETER_SENSOR << 16) | 0x0100) + +#define ACCELEROMETER_ORIENTATION_DATA_SET (ACCELEROMETER_SENSOR << 16) | 0x0002 +#define ACCELEROMETER_LINEAR_ACCELERATION_DATA_SET (ACCELEROMETER_SENSOR << 16) | 0x0004 +#define ACCELEROMETER_GRAVITY_DATA_SET (ACCELEROMETER_SENSOR << 16) | 0x0008 + +#define ACCELEROMETER_EVENT_GRAVITY_DATA_REPORT_ON_TIME (ACCELEROMETER_SENSOR << 16) | 0x0080 +#define ACCELEROMETER_EVENT_LINEAR_ACCELERATION_DATA_REPORT_ON_TIME (ACCELEROMETER_SENSOR << 16) | 0x0040 +#define ACCELEROMETER_EVENT_ORIENTATION_DATA_REPORT_ON_TIME (ACCELEROMETER_SENSOR << 16) | 0x0020 +#define GEOMAGNETIC_EVENT_ATTITUDE_DATA_REPORT_ON_TIME (GEOMAGNETIC_SENSOR << 16) | 0x0004 +#define ACCELEROMETER_EVENT_CALIBRATION_NEEDED 0x01 +#define ACCELEROMETER_EVENT_SET_WAKEUP 0x02 + +enum accelerometer_rotate_state { + ROTATION_UNKNOWN = 0, + ROTATION_LANDSCAPE_LEFT = 1, + ROTATION_PORTRAIT_TOP = 2, + ROTATION_PORTRAIT_BTM = 3, + ROTATION_LANDSCAPE_RIGHT = 4, + ROTATION_EVENT_0 = 2, + ROTATION_EVENT_90 = 1, + ROTATION_EVENT_180 = 3, + ROTATION_EVENT_270 = 4, +}; + +#ifdef __cplusplus +} +#endif + +#endif //__SENSOR_DEPRECATED_H__ + diff --git a/src/libsensord/sensor_internal_deprecated.h b/src/libsensord/sensor_internal_deprecated.h index 9f3910d..69fa4ec 100755 --- a/src/libsensord/sensor_internal_deprecated.h +++ b/src/libsensord/sensor_internal_deprecated.h @@ -50,6 +50,9 @@ extern "C" #include #include #include +#include + +#define MAX_KEY_LEN 30 typedef struct { condition_op_t cond_op; @@ -70,19 +73,27 @@ typedef struct { int z; } sensor_panning_data_t; -#define ACCELEROMETER_EVENT_ROTATION_CHECK ((ACCELEROMETER_SENSOR << 16) | 0x0001) - -enum accelerometer_rotate_state { - ROTATION_UNKNOWN = 0, - ROTATION_LANDSCAPE_LEFT = 1, - ROTATION_PORTRAIT_TOP = 2, - ROTATION_PORTRAIT_BTM = 3, - ROTATION_LANDSCAPE_RIGHT = 4, - ROTATION_EVENT_0 = 2, - ROTATION_EVENT_90 = 1, - ROTATION_EVENT_180 = 3, - ROTATION_EVENT_270 = 4, -}; +typedef struct { + int sensor_unit_idx; + float sensor_min_range; + float sensor_max_range; + float sensor_resolution; + char sensor_name[MAX_KEY_LEN]; + char sensor_vendor[MAX_KEY_LEN]; +} sensor_properties_t; + +typedef struct { + int sensor_unit_idx; + float sensor_min_range; + float sensor_max_range; + float sensor_resolution; +} sensor_data_properties_t; + +int sf_is_sensor_event_available(sensor_type_t sensor_type , unsigned int event_type); + +int sf_get_data_properties(unsigned int data_id, sensor_data_properties_t *return_data_properties); + +int sf_get_properties(sensor_type_t sensor_type, sensor_properties_t *return_properties); int sf_check_rotation(unsigned long *rotation); diff --git a/src/libsensord/sensor_motion.h b/src/libsensord/sensor_motion.h index 205def6..1fe2db5 100755 --- a/src/libsensord/sensor_motion.h +++ b/src/libsensord/sensor_motion.h @@ -28,8 +28,6 @@ extern "C" { #endif -#define MOTION_SENSOR 0xFF - enum motion_event_type { MOTION_ENGINE_EVENT_SNAP = (MOTION_SENSOR << 16) | 0x0001, MOTION_ENGINE_EVENT_SHAKE = (MOTION_SENSOR << 16) | 0x0002, diff --git a/src/light/light_sensor.cpp b/src/light/light_sensor.cpp index af222e1..bf287c6 100755 --- a/src/light/light_sensor.cpp +++ b/src/light/light_sensor.cpp @@ -151,7 +151,7 @@ bool light_sensor::on_stop(void) return stop_poll(); } -bool light_sensor::get_properties(const unsigned int type, sensor_properties_t &properties) +bool light_sensor::get_properties(const unsigned int type, sensor_properties_s &properties) { m_sensor_hal->get_properties(properties); diff --git a/src/light/light_sensor.h b/src/light/light_sensor.h index 455df3d..18bbe48 100755 --- a/src/light/light_sensor.h +++ b/src/light/light_sensor.h @@ -39,7 +39,7 @@ public: virtual bool on_stop(void); virtual bool set_interval(unsigned long interval); - virtual bool get_properties(const unsigned int type, sensor_properties_t &properties); + virtual bool get_properties(const unsigned int type, sensor_properties_s &properties); int get_sensor_data(const unsigned int type, sensor_data_t &data); private: diff --git a/src/light/light_sensor_hal.cpp b/src/light/light_sensor_hal.cpp index 4cc630c..521a2dc 100755 --- a/src/light/light_sensor_hal.cpp +++ b/src/light/light_sensor_hal.cpp @@ -181,7 +181,7 @@ int light_sensor_hal::get_sensor_data(sensor_data_t &data) } -bool light_sensor_hal::get_properties(sensor_properties_t &properties) +bool light_sensor_hal::get_properties(sensor_properties_s &properties) { properties.name = m_chip_name; properties.vendor = m_vendor; diff --git a/src/light/light_sensor_hal.h b/src/light/light_sensor_hal.h index ec35104..f2043ec 100755 --- a/src/light/light_sensor_hal.h +++ b/src/light/light_sensor_hal.h @@ -37,7 +37,7 @@ public: bool set_interval(unsigned long val); bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); - bool get_properties(sensor_properties_t &properties); + bool get_properties(sensor_properties_s &properties); private: string m_model_id; string m_vendor; diff --git a/src/linear_accel/linear_accel_sensor.cpp b/src/linear_accel/linear_accel_sensor.cpp index 6d7c1df..94a5f8f 100755 --- a/src/linear_accel/linear_accel_sensor.cpp +++ b/src/linear_accel/linear_accel_sensor.cpp @@ -271,7 +271,7 @@ int linear_accel_sensor::get_sensor_data(const unsigned int event_type, sensor_d return 0; } -bool linear_accel_sensor::get_properties(sensor_properties_t &properties) +bool linear_accel_sensor::get_properties(sensor_properties_s &properties) { m_accel_sensor->get_properties(properties); properties.name = "Linear Acceleration Sensor"; diff --git a/src/linear_accel/linear_accel_sensor.h b/src/linear_accel/linear_accel_sensor.h index 273fa84..b17792f 100755 --- a/src/linear_accel/linear_accel_sensor.h +++ b/src/linear_accel/linear_accel_sensor.h @@ -38,7 +38,7 @@ public: bool delete_interval(int client_id); int get_sensor_data(const unsigned int event_type, sensor_data_t &data); - bool get_properties(sensor_properties_t &properties); + bool get_properties(sensor_properties_s &properties); private: sensor_base *m_accel_sensor; sensor_base *m_gravity_sensor; diff --git a/src/orientation/orientation_sensor.cpp b/src/orientation/orientation_sensor.cpp index 9419c96..56658ba 100755 --- a/src/orientation/orientation_sensor.cpp +++ b/src/orientation/orientation_sensor.cpp @@ -432,7 +432,7 @@ int orientation_sensor::get_sensor_data(const unsigned int event_type, sensor_da return 0; } -bool orientation_sensor::get_properties(sensor_properties_t &properties) +bool orientation_sensor::get_properties(sensor_properties_s &properties) { if(m_raw_data_unit == "DEGREES") { properties.min_range = -180; diff --git a/src/orientation/orientation_sensor.h b/src/orientation/orientation_sensor.h index ed61891..4ae764f 100755 --- a/src/orientation/orientation_sensor.h +++ b/src/orientation/orientation_sensor.h @@ -35,7 +35,7 @@ public: bool add_interval(int client_id, unsigned int interval); bool delete_interval(int client_id); - bool get_properties(sensor_properties_t &properties); + bool get_properties(sensor_properties_s &properties); sensor_type_t get_type(void); int get_sensor_data(const unsigned int data_id, sensor_data_t &data); diff --git a/src/pressure/pressure_sensor.cpp b/src/pressure/pressure_sensor.cpp index d29311c..d1f23a2 100755 --- a/src/pressure/pressure_sensor.cpp +++ b/src/pressure/pressure_sensor.cpp @@ -62,7 +62,7 @@ bool pressure_sensor::init() return false; } - sensor_properties_t properties; + sensor_properties_s properties; if (!m_sensor_hal->get_properties(properties)) { ERR("sensor->get_properties() is failed!\n"); @@ -152,7 +152,7 @@ bool pressure_sensor::on_stop(void) return stop_poll(); } -bool pressure_sensor::get_properties(sensor_properties_t &properties) +bool pressure_sensor::get_properties(sensor_properties_s &properties) { return m_sensor_hal->get_properties(properties); } diff --git a/src/pressure/pressure_sensor.h b/src/pressure/pressure_sensor.h index 1bd8df2..6bd0f40 100755 --- a/src/pressure/pressure_sensor.h +++ b/src/pressure/pressure_sensor.h @@ -37,7 +37,7 @@ public: static bool working(void *inst); bool set_interval(unsigned long interval); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); int get_sensor_data(unsigned int type, sensor_data_t &data); private: diff --git a/src/pressure/pressure_sensor_hal.cpp b/src/pressure/pressure_sensor_hal.cpp index c899d3e..6485dab 100755 --- a/src/pressure/pressure_sensor_hal.cpp +++ b/src/pressure/pressure_sensor_hal.cpp @@ -303,7 +303,7 @@ int pressure_sensor_hal::get_sensor_data(sensor_data_t &data) } -bool pressure_sensor_hal::get_properties(sensor_properties_t &properties) +bool pressure_sensor_hal::get_properties(sensor_properties_s &properties) { properties.name = m_chip_name; properties.vendor = m_vendor; diff --git a/src/pressure/pressure_sensor_hal.h b/src/pressure/pressure_sensor_hal.h index 42e5310..28c5d87 100755 --- a/src/pressure/pressure_sensor_hal.h +++ b/src/pressure/pressure_sensor_hal.h @@ -37,7 +37,7 @@ public: bool set_interval(unsigned long val); bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); private: string m_model_id; diff --git a/src/proxi/proxi_sensor.cpp b/src/proxi/proxi_sensor.cpp index 37dfce6..4db701a 100755 --- a/src/proxi/proxi_sensor.cpp +++ b/src/proxi/proxi_sensor.cpp @@ -122,7 +122,7 @@ bool proxi_sensor::on_stop(void) return stop_poll(); } -bool proxi_sensor::get_properties(sensor_properties_t &properties) +bool proxi_sensor::get_properties(sensor_properties_s &properties) { m_sensor_hal->get_properties(properties); diff --git a/src/proxi/proxi_sensor.h b/src/proxi/proxi_sensor.h index f058724..9a45e72 100755 --- a/src/proxi/proxi_sensor.h +++ b/src/proxi/proxi_sensor.h @@ -34,7 +34,7 @@ public: static bool working(void *inst); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); int get_sensor_data(unsigned int type, sensor_data_t &data); private: sensor_hal *m_sensor_hal; diff --git a/src/proxi/proxi_sensor_hal.cpp b/src/proxi/proxi_sensor_hal.cpp index 3154c18..73bdd75 100755 --- a/src/proxi/proxi_sensor_hal.cpp +++ b/src/proxi/proxi_sensor_hal.cpp @@ -238,7 +238,7 @@ int proxi_sensor_hal::get_sensor_data(sensor_data_t &data) return 0; } -bool proxi_sensor_hal::get_properties(sensor_properties_t &properties) +bool proxi_sensor_hal::get_properties(sensor_properties_s &properties) { properties.name = m_chip_name; properties.vendor = m_vendor; diff --git a/src/proxi/proxi_sensor_hal.h b/src/proxi/proxi_sensor_hal.h index 6113397..17d8182 100755 --- a/src/proxi/proxi_sensor_hal.h +++ b/src/proxi/proxi_sensor_hal.h @@ -42,7 +42,7 @@ public: bool disable(void); bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); private: string m_model_id; string m_vendor; diff --git a/src/rotation_vector/rv/rv_sensor.cpp b/src/rotation_vector/rv/rv_sensor.cpp index e37ff33..e5d0a0e 100755 --- a/src/rotation_vector/rv/rv_sensor.cpp +++ b/src/rotation_vector/rv/rv_sensor.cpp @@ -383,7 +383,7 @@ int rv_sensor::get_sensor_data(unsigned int data_id, sensor_data_t &data) return 0; } -bool rv_sensor::get_properties(sensor_properties_t &properties) +bool rv_sensor::get_properties(sensor_properties_s &properties) { properties.vendor = m_vendor; properties.name = SENSOR_NAME; diff --git a/src/rotation_vector/rv/rv_sensor.h b/src/rotation_vector/rv/rv_sensor.h index 3d84a80..04b42b6 100755 --- a/src/rotation_vector/rv/rv_sensor.h +++ b/src/rotation_vector/rv/rv_sensor.h @@ -35,7 +35,7 @@ public: bool add_interval(int client_id, unsigned int interval); bool delete_interval(int client_id); - bool get_properties(sensor_properties_t &properties); + bool get_properties(sensor_properties_s &properties); sensor_type_t get_type(void); int get_sensor_data(const unsigned int data_id, sensor_data_t &data); diff --git a/src/shared/sensor_base.cpp b/src/shared/sensor_base.cpp index 3b71b36..109504c 100755 --- a/src/shared/sensor_base.cpp +++ b/src/shared/sensor_base.cpp @@ -252,7 +252,7 @@ unsigned int sensor_base::get_interval(int client_id, bool is_processor) void sensor_base::get_sensor_info(sensor_info &info) { - sensor_properties_t properties; + sensor_properties_s properties; get_properties(properties); info.set_type(get_type()); @@ -271,7 +271,7 @@ void sensor_base::get_sensor_info(sensor_info &info) return; } -bool sensor_base::get_properties(sensor_properties_t &properties) +bool sensor_base::get_properties(sensor_properties_s &properties) { return true; } diff --git a/src/shared/sensor_base.h b/src/shared/sensor_base.h index 1cc6636..16d3dba 100755 --- a/src/shared/sensor_base.h +++ b/src/shared/sensor_base.h @@ -76,7 +76,7 @@ public: void get_sensor_info(sensor_info &info); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); bool is_supported(unsigned int event_type); virtual long set_command(unsigned int cmd, long value); diff --git a/src/shared/sensor_common.h b/src/shared/sensor_common.h index cfecead..7fbfec7 100755 --- a/src/shared/sensor_common.h +++ b/src/shared/sensor_common.h @@ -56,7 +56,8 @@ typedef enum { LINEAR_ACCEL_SENSOR, ORIENTATION_SENSOR, TEMPERATURE_SENSOR, - ROTATION_VECTOR_SENSOR + ROTATION_VECTOR_SENSOR, + MOTION_SENSOR } sensor_type_t; typedef unsigned int sensor_id_t; @@ -84,7 +85,10 @@ typedef struct sensor_data_t { int data_accuracy; //deprecated }; - unsigned long long timestamp; + union { + unsigned long long timestamp; + unsigned long long time_stamp; //deprecated + }; /* * Use "value_count" instead of "values_num" diff --git a/src/shared/sensor_hal.h b/src/shared/sensor_hal.h index 261608e..41d5d6d 100755 --- a/src/shared/sensor_hal.h +++ b/src/shared/sensor_hal.h @@ -79,7 +79,7 @@ public: virtual bool disable(void) = 0; virtual bool set_interval(unsigned long val); virtual bool is_data_ready(bool wait) = 0; - virtual bool get_properties(sensor_properties_t &properties) = 0; + virtual bool get_properties(sensor_properties_s &properties) = 0; virtual int get_sensor_data(sensor_data_t &data); virtual int get_sensor_data(sensorhub_data_t &data); virtual long set_command(unsigned int cmd, long val); diff --git a/src/shared/sf_common.h b/src/shared/sf_common.h index a47ef4f..3b6b79e 100755 --- a/src/shared/sf_common.h +++ b/src/shared/sf_common.h @@ -162,7 +162,7 @@ typedef struct { int min_interval; int fifo_count; int max_batch_count; -} sensor_properties_t; +} sensor_properties_s; /* diff --git a/src/temperature/temperature_sensor.cpp b/src/temperature/temperature_sensor.cpp index 944d3c5..b81c645 100755 --- a/src/temperature/temperature_sensor.cpp +++ b/src/temperature/temperature_sensor.cpp @@ -51,7 +51,7 @@ bool temperature_sensor::init() return false; } - sensor_properties_t properties; + sensor_properties_s properties; if (!m_sensor_hal->get_properties(properties)) { @@ -120,7 +120,7 @@ bool temperature_sensor::on_stop(void) return stop_poll(); } -bool temperature_sensor::get_properties(sensor_properties_t &properties) +bool temperature_sensor::get_properties(sensor_properties_s &properties) { return m_sensor_hal->get_properties(properties); } diff --git a/src/temperature/temperature_sensor.h b/src/temperature/temperature_sensor.h index bcf9346..9bb881a 100755 --- a/src/temperature/temperature_sensor.h +++ b/src/temperature/temperature_sensor.h @@ -36,7 +36,7 @@ public: static bool working(void *inst); bool set_interval(unsigned long interval); - virtual bool get_properties(sensor_properties_t &properties); + virtual bool get_properties(sensor_properties_s &properties); int get_sensor_data(unsigned int type, sensor_data_t &data); private: diff --git a/src/temperature/temperature_sensor_hal.cpp b/src/temperature/temperature_sensor_hal.cpp index cf562bb..0588952 100755 --- a/src/temperature/temperature_sensor_hal.cpp +++ b/src/temperature/temperature_sensor_hal.cpp @@ -196,7 +196,7 @@ int temperature_sensor_hal::get_sensor_data(sensor_data_t &data) } -bool temperature_sensor_hal::get_properties(sensor_properties_t &properties) +bool temperature_sensor_hal::get_properties(sensor_properties_s &properties) { properties.name = m_chip_name; properties.vendor = m_vendor; diff --git a/src/temperature/temperature_sensor_hal.h b/src/temperature/temperature_sensor_hal.h index f492ee4..aba0fb7 100755 --- a/src/temperature/temperature_sensor_hal.h +++ b/src/temperature/temperature_sensor_hal.h @@ -44,7 +44,7 @@ public: bool set_interval(unsigned long val); bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); - bool get_properties(sensor_properties_t &properties); + bool get_properties(sensor_properties_s &properties); private: float m_temperature; int m_node_handle; -- 2.7.4 From a2ed47c719f02d24fd7b1964b0299f27f42b9d54 Mon Sep 17 00:00:00 2001 From: Ankur Date: Tue, 6 Jan 2015 17:39:48 +0530 Subject: [PATCH 14/16] Removed Compilation warning - Unused return value -Return value from the function call to write() was not being used, generating a compilation warning. -Added a while loop to check how many bytes are written in each iteration and ensure that the whole buffer is written. Change-Id: Ice225aa6cfd4eb36293e5475c1d37ebf672e633a --- src/shared/common.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/shared/common.cpp b/src/shared/common.cpp index 9c6da31..884bbf3 100755 --- a/src/shared/common.cpp +++ b/src/shared/common.cpp @@ -50,7 +50,13 @@ EXTAPI void sf_log(int type , int priority , const char *tag , const char *fmt , sf_debug_file_fd = open(SF_SERVER_MSG_LOG_FILE, O_WRONLY|O_CREAT|O_APPEND, 0644); if (sf_debug_file_fd != -1) { vsnprintf(sf_debug_file_buf,255, fmt , ap ); - write(sf_debug_file_fd, sf_debug_file_buf, strlen(sf_debug_file_buf)); + int total_bytes_written = 0; + while (total_bytes_written < (int) strlen(sf_debug_file_buf)){ + int bytes_written = write(sf_debug_file_fd, (sf_debug_file_buf + total_bytes_written), strlen(sf_debug_file_buf) - total_bytes_written); + if (bytes_written == -1) + break; + total_bytes_written = total_bytes_written + bytes_written; + } close(sf_debug_file_fd); } break; -- 2.7.4 From 6689d96f1dbd68343a9aa0d193b2fa93b9cef811 Mon Sep 17 00:00:00 2001 From: Kibak Yoon Date: Wed, 7 Jan 2015 20:48:55 +0900 Subject: [PATCH 15/16] sensord: merge tizen 2.3 sensord into tizen branch there are the quite many changes between private and public. but almost patches are for code-clean and mobile specific features. through updating sensord at once, private, tizen 2.3, tizen 3.0 code are in sync. Change-Id: Ieaef0357c810682c6b9c82f7429f9a680eccd25c Signed-off-by: Kibak Yoon --- sensors.xml.in | 182 ++++++++++- src/CMakeLists.txt | 10 + src/accel/accel_sensor.cpp | 24 +- src/accel/accel_sensor_hal.cpp | 388 +++++++++-------------- src/accel/accel_sensor_hal.h | 39 +-- src/auto_rotation/CMakeLists.txt | 28 ++ src/auto_rotation/auto_rotation_alg.cpp | 49 +++ src/auto_rotation/auto_rotation_alg.h | 35 ++ src/auto_rotation/auto_rotation_alg_emul.cpp | 120 +++++++ src/auto_rotation/auto_rotation_alg_emul.h | 36 +++ src/auto_rotation/auto_rotation_sensor.cpp | 207 ++++++++++++ src/auto_rotation/auto_rotation_sensor.h | 58 ++++ src/geo/geo_sensor.cpp | 25 +- src/geo/geo_sensor_hal.cpp | 240 +++++++++----- src/geo/geo_sensor_hal.h | 27 +- src/gravity/gravity_sensor.cpp | 52 +-- src/gravity/gravity_sensor.h | 8 +- src/gyro/gyro_sensor.cpp | 24 +- src/gyro/gyro_sensor_hal.cpp | 346 ++++++-------------- src/gyro/gyro_sensor_hal.h | 32 +- src/libsensord/CMakeLists.txt | 1 + src/libsensord/client.cpp | 13 +- src/libsensord/client_common.cpp | 8 +- src/libsensord/sensor_accel.h | 1 + src/libsensord/sensor_auto_rotation.h | 64 ++++ src/libsensord/sensor_geomag.h | 1 + src/libsensord/sensor_gyro.h | 1 + src/libsensord/sensor_internal.h | 1 + src/light/light_sensor.cpp | 42 +-- src/light/light_sensor.h | 15 +- src/light/light_sensor_hal.cpp | 111 ++++--- src/light/light_sensor_hal.h | 5 +- src/linear_accel/linear_accel_sensor.cpp | 60 ++-- src/linear_accel/linear_accel_sensor.h | 2 +- src/orientation/orientation_sensor.cpp | 74 +++-- src/orientation/orientation_sensor.h | 2 +- src/pressure/pressure_sensor.cpp | 19 +- src/pressure/pressure_sensor.h | 3 +- src/pressure/pressure_sensor_hal.cpp | 232 +++++++------- src/pressure/pressure_sensor_hal.h | 14 +- src/proxi/proxi_sensor.cpp | 30 +- src/proxi/proxi_sensor.h | 2 +- src/proxi/proxi_sensor_hal.cpp | 142 +++------ src/proxi/proxi_sensor_hal.h | 1 - src/rotation_vector/CMakeLists.txt | 1 - src/rotation_vector/rv/rv_sensor.cpp | 12 +- src/rotation_vector/rv_raw/CMakeLists.txt | 33 ++ src/rotation_vector/rv_raw/rv_raw_sensor.cpp | 166 ++++++++++ src/rotation_vector/rv_raw/rv_raw_sensor.h | 50 +++ src/rotation_vector/rv_raw/rv_raw_sensor_hal.cpp | 288 +++++++++++++++++ src/rotation_vector/rv_raw/rv_raw_sensor_hal.h | 68 ++++ src/server/CMakeLists.txt | 1 + src/server/command_worker.cpp | 42 +-- src/server/command_worker.h | 6 - src/server/permission_checker.cpp | 105 ++++++ src/server/permission_checker.h | 69 ++++ src/shared/cinterval_info_list.h | 6 +- src/shared/csocket.cpp | 9 +- src/shared/sensor_base.cpp | 2 +- src/shared/sensor_base.h | 6 +- src/shared/sensor_common.h | 19 +- src/shared/sensor_hal.cpp | 195 ++++-------- src/shared/sensor_hal.h | 43 ++- src/shared/sensor_plugin_loader.cpp | 86 ++--- src/shared/sensor_plugin_loader.h | 6 +- src/shared/sf_common.h | 12 +- src/temperature/temperature_sensor.cpp | 47 ++- src/temperature/temperature_sensor_hal.cpp | 149 +++++---- src/temperature/temperature_sensor_hal.h | 11 - src/ultraviolet/CMakeLists.txt | 33 ++ src/ultraviolet/ultraviolet_sensor.cpp | 191 +++++++++++ src/ultraviolet/ultraviolet_sensor.h | 53 ++++ src/ultraviolet/ultraviolet_sensor_hal.cpp | 287 +++++++++++++++++ src/ultraviolet/ultraviolet_sensor_hal.h | 68 ++++ 74 files changed, 3350 insertions(+), 1488 deletions(-) create mode 100644 src/auto_rotation/CMakeLists.txt create mode 100644 src/auto_rotation/auto_rotation_alg.cpp create mode 100644 src/auto_rotation/auto_rotation_alg.h create mode 100644 src/auto_rotation/auto_rotation_alg_emul.cpp create mode 100644 src/auto_rotation/auto_rotation_alg_emul.h create mode 100755 src/auto_rotation/auto_rotation_sensor.cpp create mode 100755 src/auto_rotation/auto_rotation_sensor.h create mode 100755 src/libsensord/sensor_auto_rotation.h create mode 100755 src/rotation_vector/rv_raw/CMakeLists.txt create mode 100755 src/rotation_vector/rv_raw/rv_raw_sensor.cpp create mode 100755 src/rotation_vector/rv_raw/rv_raw_sensor.h create mode 100755 src/rotation_vector/rv_raw/rv_raw_sensor_hal.cpp create mode 100755 src/rotation_vector/rv_raw/rv_raw_sensor_hal.h create mode 100755 src/server/permission_checker.cpp create mode 100755 src/server/permission_checker.h create mode 100644 src/ultraviolet/CMakeLists.txt create mode 100755 src/ultraviolet/ultraviolet_sensor.cpp create mode 100755 src/ultraviolet/ultraviolet_sensor.h create mode 100755 src/ultraviolet/ultraviolet_sensor_hal.cpp create mode 100755 src/ultraviolet/ultraviolet_sensor_hal.h diff --git a/sensors.xml.in b/sensors.xml.in index 3c4240b..b97ec83 100755 --- a/sensors.xml.in +++ b/sensors.xml.in @@ -4,15 +4,29 @@ - - + + + + + + + + + + + + + + + + - - + + @@ -43,12 +57,33 @@ + + + + + + + + + + + + + + + + + + + + + @@ -56,7 +91,14 @@ - + + + + + + + + @@ -93,6 +135,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -116,10 +181,20 @@ - + + + + + + + + + + + @@ -138,13 +213,41 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -164,6 +267,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -189,6 +312,16 @@ + + + + + + + + + + @@ -198,5 +331,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 984f729..fe8be1a 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,12 +19,21 @@ ENDIF() IF("${GEO}" STREQUAL "ON") add_subdirectory(geo) ENDIF() +IF("${AUTO_ROTATION}" STREQUAL "ON") +add_subdirectory(auto_rotation) +ENDIF() IF("${PRESSURE}" STREQUAL "ON") add_subdirectory(pressure) ENDIF() IF("${TEMPERATURE}" STREQUAL "ON") add_subdirectory(temperature) ENDIF() +IF("${HUMIDITY}" STREQUAL "ON") +add_subdirectory(humidity) +ENDIF() +IF("${ULTRAVIOLET}" STREQUAL "ON") +add_subdirectory(ultraviolet) +ENDIF() IF("${ORIENTATION}" STREQUAL "ON") set(SENSOR_FUSION_ENABLE "1") set(ORIENTATION_ENABLE "1") @@ -52,6 +61,7 @@ ENDIF() IF("${LINEAR_ACCELERATION_ENABLE}" STREQUAL "1") add_subdirectory(linear_accel) ENDIF() +add_subdirectory(rotation_vector) add_subdirectory(server) add_subdirectory(libsensord) diff --git a/src/accel/accel_sensor.cpp b/src/accel/accel_sensor.cpp index 55ddf2b..8bb436d 100755 --- a/src/accel/accel_sensor.cpp +++ b/src/accel/accel_sensor.cpp @@ -43,6 +43,7 @@ accel_sensor::accel_sensor() vector supported_events = { ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME, + ACCELEROMETER_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME, }; for_each(supported_events.begin(), supported_events.end(), @@ -103,6 +104,12 @@ bool accel_sensor::process_event(void) AUTOLOCK(m_mutex); AUTOLOCK(m_client_info_mutex); + if (get_client_cnt(ACCELEROMETER_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME)) { + base_event.sensor_id = get_id(); + base_event.event_type = ACCELEROMETER_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME; + push(base_event); + } + if (get_client_cnt(ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME)) { base_event.sensor_id = get_id(); base_event.event_type = ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME; @@ -174,21 +181,20 @@ void accel_sensor::raw_to_base(sensor_data_t &data) data.values[2] = RAW_DATA_TO_METRE_PER_SECOND_SQUARED_UNIT(data.values[2] * m_raw_data_unit); } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - accel_sensor *inst; + accel_sensor *sensor; try { - inst = new accel_sensor(); + sensor = new(std::nothrow) accel_sensor; } catch (int err) { - ERR("accel_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (accel_sensor*)inst;; + module->sensors.push_back(sensor); + return module; } diff --git a/src/accel/accel_sensor_hal.cpp b/src/accel/accel_sensor_hal.cpp index 6a78105..aebe9fd 100755 --- a/src/accel/accel_sensor_hal.cpp +++ b/src/accel/accel_sensor_hal.cpp @@ -44,13 +44,6 @@ using std::ifstream; #define INPUT_NAME "accelerometer_sensor" #define ACCEL_SENSORHUB_POLL_NODE_NAME "accel_poll_delay" -#define SCAN_EL_DIR "scan_elements/" -#define SCALE_AVAILABLE_NODE "in_accel_scale_available" -#define ACCEL_RINGBUF_LEN 32 -#define SEC_MSEC 1000 -#define MSEC_TO_FREQ(VAL) ((SEC_MSEC) / (VAL)) -#define NSEC_TO_MUSEC(VAL) ((VAL) / 1000) - accel_sensor_hal::accel_sensor_hal() : m_x(-1) , m_y(-1) @@ -62,37 +55,31 @@ accel_sensor_hal::accel_sensor_hal() const string sensorhub_interval_node_name = "accel_poll_delay"; csensor_config &config = csensor_config::get_instance(); - node_path_info_query query; - node_path_info info; - int input_method = IIO_METHOD; + node_info_query query; + node_info info; - if (!get_model_properties(SENSOR_TYPE_ACCEL, m_model_id, input_method)) { - ERR("Failed to find model_properties"); + if (!find_model_id(SENSOR_TYPE_ACCEL, m_model_id)) { + ERR("Failed to find model id"); throw ENXIO; } - query.input_method = input_method; query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); query.sensor_type = SENSOR_TYPE_ACCEL; - query.input_event_key = "accelerometer_sensor"; + query.key = "accelerometer_sensor"; query.iio_enable_node_name = "accel_enable"; query.sensorhub_interval_node_name = sensorhub_interval_node_name; - if (!get_node_path_info(query, info)) { + if (!get_node_info(query, info)) { ERR("Failed to get node info"); throw ENXIO; } - show_node_path_info(info); + show_node_info(info); + m_method = info.method; m_data_node = info.data_node_path; + m_enable_node = info.enable_node_path; m_interval_node = info.interval_node_path; - m_accel_dir = info.base_dir; - m_trigger_path = info.trigger_node_path; - m_buffer_enable_node_path = info.buffer_enable_node_path; - m_buffer_length_node_path = info.buffer_length_node_path; - m_available_freq_node_path = info.available_freq_node_path; - m_available_scale_node_path = m_accel_dir + string(SCALE_AVAILABLE_NODE); if (!config.get(SENSOR_TYPE_ACCEL, m_model_id, ELEMENT_VENDOR, m_vendor)) { ERR("[VENDOR] is empty\n"); @@ -108,25 +95,6 @@ accel_sensor_hal::accel_sensor_hal() INFO("m_chip_name = %s\n",m_chip_name.c_str()); - if (input_method == IIO_METHOD) { - m_trigger_name = m_model_id + "-trigger"; - if (!verify_iio_trigger(m_trigger_name)) { - ERR("Failed verify trigger"); - throw ENXIO; - } - string scan_dir = m_accel_dir + "scan_elements/"; - if (!get_generic_channel_names(scan_dir, string("_type"), m_generic_channel_names)) - ERR ("Failed to find any input channels"); - else - { - INFO ("generic channel names:"); - for (vector ::iterator it = m_generic_channel_names.begin(); - it != m_generic_channel_names.end(); ++it) { - INFO ("%s", it->c_str()); - } - } - } - long resolution; if (!config.get(SENSOR_TYPE_ACCEL, m_model_id, ELEMENT_RESOLUTION, resolution)) { @@ -146,36 +114,38 @@ accel_sensor_hal::accel_sensor_hal() } m_raw_data_unit = (float)(raw_data_unit); + INFO("m_raw_data_unit = %f\n", m_raw_data_unit); - m_node_handle = open(m_data_node.c_str(), O_RDONLY | O_NONBLOCK); - if (m_node_handle < 0) { + if ((m_node_handle = open(m_data_node.c_str(), O_RDWR)) < 0) { ERR("accel handle open fail for accel processor, error:%s\n", strerror(errno)); throw ENXIO; } - if (setup_channels() == true) - INFO("IIO channel setup successful"); - else { - ERR("IIO channel setup failed"); - throw ENXIO; - } + if (m_method == INPUT_EVENT_METHOD) { + int clockId = CLOCK_MONOTONIC; + if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) + ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); -// int clockId = CLOCK_MONOTONIC; -// if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) { -// ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); -// throw ENXIO; -// } + update_value = [=](bool wait) { + return this->update_value_input_event(wait); + }; + } else { + if (!info.buffer_length_node_path.empty()) + set_node_value(info.buffer_length_node_path, 480); + + if (!info.buffer_enable_node_path.empty()) + set_node_value(info.buffer_enable_node_path, 1); + + update_value = [=](bool wait) { + return this->update_value_iio(wait); + }; + } - INFO("m_raw_data_unit = %f\n", m_raw_data_unit); INFO("accel_sensor is created!\n"); } accel_sensor_hal::~accel_sensor_hal() { - enable_resource(false); - if (m_data != NULL) - delete []m_data; - close(m_node_handle); m_node_handle = -1; @@ -192,227 +162,170 @@ sensor_type_t accel_sensor_hal::get_type(void) return ACCELEROMETER_SENSOR; } -bool accel_sensor_hal::add_accel_channels_to_array(void) +bool accel_sensor_hal::enable(void) { - int i = 0; - m_channels = (struct channel_parameters*) malloc(sizeof(struct channel_parameters) * m_generic_channel_names.size()); - for (vector ::iterator it = m_generic_channel_names.begin(); - it != m_generic_channel_names.end(); ++it) { - if (add_channel_to_array(m_accel_dir.c_str(), it->c_str() , &m_channels[i++]) < 0) { - ERR("Failed to add channel %s to channel array", it->c_str()); - return false; - } - } + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, true, SENSORHUB_ACCELEROMETER_ENABLE_BIT); + set_interval(m_polling_interval); + + m_fired_time = 0; + INFO("Accel sensor real starting"); return true; } -bool accel_sensor_hal::setup_channels(void) +bool accel_sensor_hal::disable(void) { - int freq, i; - double sf; + AUTOLOCK(m_mutex); - enable_resource(true); + set_enable_node(m_enable_node, m_sensorhub_controlled, false, SENSORHUB_ACCELEROMETER_ENABLE_BIT); - if (!add_accel_channels_to_array()) { - ERR("Failed to add channels to array!"); - return false; - } + INFO("Accel sensor real stopping"); + return true; +} - INFO("Sorting channels by index"); - sort_channels_by_index(m_channels, m_generic_channel_names.size()); - INFO("Sorting channels by index completed"); +bool accel_sensor_hal::set_interval(unsigned long val) +{ + unsigned long long polling_interval_ns; - m_scan_size = get_channel_array_size(m_channels, m_generic_channel_names.size()); - if (m_scan_size == 0) { - ERR("Channel array size is zero"); - return false; - } + AUTOLOCK(m_mutex); - m_data = new (std::nothrow) char[m_scan_size * ACCEL_RINGBUF_LEN]; - if (m_data == NULL) { - ERR("Couldn't create data buffer\n"); - return false; - } + polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu); - FILE *fp = NULL; - fp = fopen(m_available_freq_node_path.c_str(), "r"); - if (!fp) { - ERR("Fail to open available frequencies file:%s\n", m_available_freq_node_path.c_str()); + if (!set_node_value(m_interval_node, polling_interval_ns)) { + ERR("Failed to set polling resource: %s\n", m_interval_node.c_str()); return false; } - for (i = 0; i < MAX_FREQ_COUNT; i++) - m_sample_freq[i] = 0; + INFO("Interval is changed from %dms to %dms]", m_polling_interval, val); + m_polling_interval = val; + return true; +} - i = 0; - while (fscanf(fp, "%d", &freq) > 0) - m_sample_freq[i++] = freq; +bool accel_sensor_hal::update_value_input_event(bool wait) +{ + int accel_raw[3] = {0,}; + bool x,y,z; + int read_input_cnt = 0; + const int INPUT_MAX_BEFORE_SYN = 10; + unsigned long long fired_time = 0; + bool syn = false; + + x = y = z = false; + + struct input_event accel_input; + DBG("accel event detection!"); + + while ((syn == false) && (read_input_cnt < INPUT_MAX_BEFORE_SYN)) { + int len = read(m_node_handle, &accel_input, sizeof(accel_input)); + if (len != sizeof(accel_input)) { + ERR("accel_file read fail, read_len = %d\n",len); + return false; + } - m_sample_freq_count = i; + ++read_input_cnt; + + if (accel_input.type == EV_REL) { + switch (accel_input.code) { + case REL_X: + accel_raw[0] = (int)accel_input.value; + x = true; + break; + case REL_Y: + accel_raw[1] = (int)accel_input.value; + y = true; + break; + case REL_Z: + accel_raw[2] = (int)accel_input.value; + z = true; + break; + default: + ERR("accel_input event[type = %d, code = %d] is unknown.", accel_input.type, accel_input.code); + return false; + break; + } + } else if (accel_input.type == EV_SYN) { + syn = true; + fired_time = sensor_hal::get_timestamp(&accel_input.time); + } else { + ERR("accel_input event[type = %d, code = %d] is unknown.", accel_input.type, accel_input.code); + return false; + } + } - fp = fopen(m_available_scale_node_path.c_str(), "r"); - if (!fp) { - ERR("Fail to open available scale factors file:%s\n", m_available_scale_node_path.c_str()); + if (syn == false) { + ERR("EV_SYN didn't come until %d inputs had come", read_input_cnt); return false; } - for (i = 0; i < MAX_SCALING_COUNT; i++) - m_scale_factor[i] = 0; + AUTOLOCK(m_value_mutex); - i = 0; + if (x) + m_x = accel_raw[0]; + if (y) + m_y = accel_raw[1]; + if (z) + m_z = accel_raw[2]; - while (fscanf(fp, "%lf", &sf) > 0) - m_scale_factor[i++] = sf; + m_fired_time = fired_time; - m_scale_factor_count = i; + DBG("m_x = %d, m_y = %d, m_z = %d, time = %lluus", m_x, m_y, m_z, m_fired_time); return true; } -void accel_sensor_hal::decode_data(void) + +bool accel_sensor_hal::update_value_iio(bool wait) { - AUTOLOCK(m_value_mutex); + const int READ_LEN = 14; + char data[READ_LEN] = {0,}; - m_x = convert_bytes_to_int(*(unsigned short int *)(m_data + m_channels[0].buf_index), &m_channels[0]); - m_y = convert_bytes_to_int(*(unsigned short int *)(m_data + m_channels[1].buf_index), &m_channels[1]); - m_z = convert_bytes_to_int(*(unsigned short int *)(m_data + m_channels[2].buf_index), &m_channels[2]); + struct pollfd pfd; - long long int val = *(long long int *)(m_data + m_channels[3].buf_index); - if ((val >> m_channels[3].valid_bits) & 1) - val = (val & m_channels[3].mask) | ~m_channels[3].mask; + pfd.fd = m_node_handle; + pfd.events = POLLIN | POLLERR; + pfd.revents = 0; - m_fired_time = (unsigned long long int)(NSEC_TO_MUSEC(val)); - DBG("m_x = %d, m_y = %d, m_z = %d, time = %lluus", m_x, m_y, m_z, m_fired_time); -} -bool accel_sensor_hal::setup_trigger(const char* trig_name, bool verify) -{ - int ret = 0; + int ret = poll(&pfd, 1, -1); - ret = update_sysfs_string(m_trigger_path.c_str(), trig_name); - if (ret < 0) { - ERR("failed to write to current_trigger,%s,%s\n", m_trigger_path.c_str(), trig_name); + if (ret == -1) { + ERR("poll error:%s m_node_handle:d", strerror(errno), m_node_handle); + return false; + } else if (!ret) { + ERR("poll timeout m_node_handle:%d", m_node_handle); return false; } - INFO("current_trigger setup successfully\n"); - return true; -} -bool accel_sensor_hal::setup_buffer(int enable) -{ - int ret; - ret = update_sysfs_num(m_buffer_length_node_path.c_str(), ACCEL_RINGBUF_LEN, true); - if (ret < 0) { - ERR("failed to write to buffer/length\n"); + if (pfd.revents & POLLERR) { + ERR("poll exception occurred! m_node_handle:%d", m_node_handle); return false; } - INFO("buffer/length setup successfully\n"); - ret = update_sysfs_num(m_buffer_enable_node_path.c_str(), enable, true); - if (ret < 0) { - ERR("failed to write to buffer/enable\n"); + if (!(pfd.revents & POLLIN)) { + ERR("poll nothing to read! m_node_handle:%d, pfd.revents = %d", m_node_handle, pfd.revents); return false; } - if (enable) - INFO("buffer enabled\n"); - else - INFO("buffer disabled\n"); - return true; -} + int len = read(m_node_handle, data, sizeof(data)); -bool accel_sensor_hal::enable_resource(bool enable) -{ - string temp; - if(enable) - setup_trigger(m_trigger_name.c_str(), enable); - else - setup_trigger("NULL", enable); - - for (vector ::iterator it = m_generic_channel_names.begin(); - it != m_generic_channel_names.end(); ++it) { - temp = m_accel_dir + string(SCAN_EL_DIR) + *it + string("_en"); - if (update_sysfs_num(temp.c_str(), enable) < 0) - return false; + if (len != sizeof(data)) { + ERR("Failed to read data, m_node_handle:%d read_len:%d", m_node_handle, len); + return false; } - setup_buffer(enable); - return true; -} -bool accel_sensor_hal::enable(void) -{ - AUTOLOCK(m_mutex); + AUTOLOCK(m_value_mutex); - if (!enable_resource(true)) - return false; + m_x = *((short *)(data)); + m_y = *((short *)(data + 2)); + m_z = *((short *)(data + 4)); - set_interval(m_polling_interval); + m_fired_time = *((long long*)(data + 6)); - m_fired_time = 0; - INFO("Accel sensor real starting"); - return true; -} + INFO("m_x = %d, m_y = %d, m_z = %d, time = %lluus", m_x, m_y, m_z, m_fired_time); -bool accel_sensor_hal::disable(void) -{ - AUTOLOCK(m_mutex); - - if (!enable_resource(false)) - return false; - - INFO("Accel sensor real stopping"); return true; -} - -bool accel_sensor_hal::set_interval(unsigned long ms_interval) -{ - int freq, i; - - freq = (int)(MSEC_TO_FREQ(ms_interval)); - - for (i=0; i < m_sample_freq_count; i++) { - if (freq == m_sample_freq[i]) { - if (update_sysfs_num(m_interval_node.c_str(), freq, true) == 0) { - INFO("Interval is changed from %lums to %lums]", m_polling_interval, ms_interval); - m_polling_interval = ms_interval; - return true; - } - else { - ERR("Failed to set data %lu\n", ms_interval); - return false; - } - } - } - DBG("The interval not supported: %lu\n", ms_interval); - ERR("Failed to set data %lu\n", ms_interval); - return false; -} - -bool accel_sensor_hal::update_value(bool wait) -{ - int i; - struct pollfd pfd; - ssize_t read_size; - const int TIMEOUT = 1000; - - pfd.fd = m_node_handle; - pfd.events = POLLIN; - if (wait) - poll(&pfd, 1, TIMEOUT); - else - poll(&pfd, 1, 0); - - read_size = read(m_node_handle, m_data, ACCEL_RINGBUF_LEN * m_scan_size); - if (read_size <= 0) { - ERR("Accel:No data available\n"); - return false; - } - else { - for (i = 0; i < (read_size / m_scan_size); i++) - decode_data(); - } - return true; } bool accel_sensor_hal::is_data_ready(bool wait) @@ -449,21 +362,20 @@ bool accel_sensor_hal::get_properties(sensor_properties_s &properties) return true; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - accel_sensor_hal *inst; + accel_sensor_hal *sensor; try { - inst = new accel_sensor_hal(); + sensor = new(std::nothrow) accel_sensor_hal; } catch (int err) { - ERR("accel_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (accel_sensor_hal*)inst; + module->sensors.push_back(sensor); + return module; } diff --git a/src/accel/accel_sensor_hal.h b/src/accel/accel_sensor_hal.h index 821bb1e..5782368 100755 --- a/src/accel/accel_sensor_hal.h +++ b/src/accel/accel_sensor_hal.h @@ -20,12 +20,9 @@ #ifndef _ACCEL_SENSOR_HAL_H_ #define _ACCEL_SENSOR_HAL_H_ -#define MAX_FREQ_COUNT 16 -#define MAX_SCALING_COUNT 16 - #include #include -#include +#include using std::string; @@ -42,7 +39,6 @@ public: bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); bool get_properties(sensor_properties_s &properties); -// bool check_hw_node(void); private: int m_x; @@ -52,23 +48,6 @@ private: unsigned long m_polling_interval; unsigned long long m_fired_time; - int m_scale_factor_count; - int m_sample_freq_count; - int m_sample_freq[MAX_FREQ_COUNT]; - double m_scale_factor[MAX_SCALING_COUNT]; - char *m_data; - int m_scan_size; - struct channel_parameters *m_channels; - - string m_trigger_name; - string m_trigger_path; - string m_buffer_enable_node_path; - string m_buffer_length_node_path; - string m_available_freq_node_path; - string m_available_scale_node_path; - string m_accel_dir; - vector m_generic_channel_names; - string m_model_id; string m_vendor; string m_chip_name; @@ -76,22 +55,18 @@ private: int m_resolution; float m_raw_data_unit; + int m_method; string m_data_node; + string m_enable_node; string m_interval_node; + std::function update_value; + bool m_sensorhub_controlled; cmutex m_value_mutex; - bool update_value(bool wait); - bool calibration(int cmd); - - bool setup_trigger(const char* trig_name, bool verify); - bool setup_buffer(int enable); - bool enable_resource(bool enable); - bool add_accel_channels_to_array(void); - bool setup_channels(void); - bool setup_trigger(char* trig_name, bool verify); - void decode_data(void); + bool update_value_input_event(bool wait); + bool update_value_iio(bool wait); }; #endif /*_ACCEL_SENSOR_HAL_CLASS_H_*/ diff --git a/src/auto_rotation/CMakeLists.txt b/src/auto_rotation/CMakeLists.txt new file mode 100644 index 0000000..a0076b2 --- /dev/null +++ b/src/auto_rotation/CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 2.6) +project(auto_rotation CXX) + +SET(SENSOR_NAME auto_rotation_sensor) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) + +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(auto_rot_pkgs REQUIRED vconf) + +FOREACH(flag ${auto_rot_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +FOREACH(flag ${auto_rot_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +add_library(${SENSOR_NAME} SHARED + auto_rotation_sensor.cpp + auto_rotation_alg.cpp + auto_rotation_alg_emul.cpp + ) + +target_link_libraries(${SENSOR_NAME} ${auto_rot_pkgs_LDFLAGS} "-lm") + +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/auto_rotation/auto_rotation_alg.cpp b/src/auto_rotation/auto_rotation_alg.cpp new file mode 100644 index 0000000..3663ad3 --- /dev/null +++ b/src/auto_rotation/auto_rotation_alg.cpp @@ -0,0 +1,49 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +auto_rotation_alg::auto_rotation_alg() +{ +} + +auto_rotation_alg::~auto_rotation_alg() +{ +} + +bool auto_rotation_alg::open(void) +{ + return true; +} + +bool auto_rotation_alg::close(void) +{ + return true; +} + +bool auto_rotation_alg::start(void) +{ + return true; +} + +bool auto_rotation_alg::stop(void) +{ + return true; +} diff --git a/src/auto_rotation/auto_rotation_alg.h b/src/auto_rotation/auto_rotation_alg.h new file mode 100644 index 0000000..3d8dd4c --- /dev/null +++ b/src/auto_rotation/auto_rotation_alg.h @@ -0,0 +1,35 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _AUTO_ROTATION_ALG_H_ +#define _AUTO_ROTATION_ALG_H_ + +class auto_rotation_alg +{ +public: + auto_rotation_alg(); + virtual ~auto_rotation_alg(); + + virtual bool open(void); + virtual bool close(void); + virtual bool start(void); + virtual bool stop(void); + virtual bool get_rotation(float acc[3], unsigned long long timestamp, int prev_rotation, int &rotation) = 0; +}; +#endif /* _AUTO_ROTATION_ALG_H_ */ diff --git a/src/auto_rotation/auto_rotation_alg_emul.cpp b/src/auto_rotation/auto_rotation_alg_emul.cpp new file mode 100644 index 0000000..4c6d542 --- /dev/null +++ b/src/auto_rotation/auto_rotation_alg_emul.cpp @@ -0,0 +1,120 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include + +#define ROTATION_RULE_CNT 4 + +struct rotation_rule { + int tilt; + int angle; +}; + +struct rotation_rule rot_rule[ROTATION_RULE_CNT] = { + {40, 80}, + {50, 70}, + {60, 65}, + {90, 60}, +}; + +auto_rotation_alg_emul::auto_rotation_alg_emul() +{ +} + +auto_rotation_alg_emul::~auto_rotation_alg_emul() +{ + close(); +} + +int auto_rotation_alg_emul::convert_rotation(int prev_rotation, + float acc_pitch, float acc_theta) +{ + const int ROTATION_0 = 0; + const int ROTATION_90 = 90; + const int ROTATION_180 = 180; + const int ROTATION_360 = 360; + const int TILT_MIN = 30; + int tilt; + int angle; + + int new_rotation = AUTO_ROTATION_DEGREE_UNKNOWN; + + for (int i = 0; i < ROTATION_RULE_CNT; ++i) { + tilt = rot_rule[i].tilt; + + if ((acc_pitch < TILT_MIN) || (acc_pitch > tilt)) + continue; + + if ((prev_rotation == AUTO_ROTATION_DEGREE_0) || (prev_rotation == AUTO_ROTATION_DEGREE_180)) + angle = rot_rule[i].angle; + else + angle = ROTATION_90 - rot_rule[i].angle; + + if ((acc_theta >= ROTATION_360 - angle && acc_theta <= ROTATION_360 - 1) || + (acc_theta >= ROTATION_0 && acc_theta <= ROTATION_0 + angle)) + new_rotation = AUTO_ROTATION_DEGREE_0; + else if (acc_theta >= ROTATION_0 + angle && acc_theta <= ROTATION_180 - angle) + new_rotation = AUTO_ROTATION_DEGREE_90; + else if (acc_theta >= ROTATION_180 - angle && acc_theta <= ROTATION_180 + angle) + new_rotation = AUTO_ROTATION_DEGREE_180; + else if (acc_theta >= ROTATION_180 + angle && acc_theta <= ROTATION_360 - angle) + new_rotation = AUTO_ROTATION_DEGREE_270; + + break; + } + + return new_rotation; +} + +bool auto_rotation_alg_emul::get_rotation(float acc[3], + unsigned long long timestamp, int prev_rotation, int &cur_rotation) +{ + const int ROTATION_90 = 90; + const int RADIAN = 57.29747; + + double atan_value; + int acc_theta; + int acc_pitch; + double realg; + float x, y, z; + + x = acc[0]; + y = acc[1]; + z = acc[2]; + + atan_value = atan2(x, y); + acc_theta = (int)(atan_value * (RADIAN) + 360) % 360; + realg = (double)sqrt((x * x) + (y * y) + (z * z)); + acc_pitch = ROTATION_90 - abs((int) (asin(z / realg) * RADIAN)); + + cur_rotation = convert_rotation(prev_rotation, acc_pitch, acc_theta); + + if (cur_rotation == AUTO_ROTATION_DEGREE_UNKNOWN) + return false; + + if (cur_rotation != prev_rotation) + return true; + + return false; +} diff --git a/src/auto_rotation/auto_rotation_alg_emul.h b/src/auto_rotation/auto_rotation_alg_emul.h new file mode 100644 index 0000000..ce060de --- /dev/null +++ b/src/auto_rotation/auto_rotation_alg_emul.h @@ -0,0 +1,36 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _AUTO_ROTATION_ALG_EMUL_H_ +#define _AUTO_ROTATION_ALG_EMUL_H_ + +#include + +class auto_rotation_alg_emul : public auto_rotation_alg +{ +public: + auto_rotation_alg_emul(); + virtual ~auto_rotation_alg_emul(); + + virtual bool get_rotation(float acc[3], unsigned long long timestamp, int prev_rotation, int &cur_rotation); + +private: + int convert_rotation(int prev_rotation, float acc_pitch, float acc_theta); +}; +#endif /* _AUTO_ROTATION_ALG_EMUL_H_ */ diff --git a/src/auto_rotation/auto_rotation_sensor.cpp b/src/auto_rotation/auto_rotation_sensor.cpp new file mode 100755 index 0000000..efefb8b --- /dev/null +++ b/src/auto_rotation/auto_rotation_sensor.cpp @@ -0,0 +1,207 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +using std::bind1st; +using std::mem_fun; + +#define SENSOR_NAME "AUTO_ROTATION_SENSOR" +#define AUTO_ROTATION_LIB "/usr/lib/sensord/libauto-rotation.so" + +auto_rotation_sensor::auto_rotation_sensor() +: m_accel_sensor(NULL) +, m_rotation(0) +, m_rotation_time(1) // rotation state is valid from initial state, so set rotation time to non-zero value +, m_alg(NULL) +{ + m_name = string(SENSOR_NAME); + + register_supported_event(AUTO_ROTATION_EVENT_CHANGE_STATE); +} + +auto_rotation_sensor::~auto_rotation_sensor() +{ + delete m_alg; + + INFO("auto_rotation_sensor is destroyed!\n"); +} + +bool auto_rotation_sensor::check_lib(void) +{ + if (access(AUTO_ROTATION_LIB, F_OK) < 0) + return false; + + return true; +} + +auto_rotation_alg *auto_rotation_sensor::get_alg() +{ + return new auto_rotation_alg_emul(); +} + +bool auto_rotation_sensor::init() +{ + m_accel_sensor = sensor_plugin_loader::get_instance().get_sensor(ACCELEROMETER_SENSOR); + + if (!m_accel_sensor) { + ERR("cannot load accel sensor_hal[%s]", sensor_base::get_name()); + return false; + } + + m_alg = get_alg(); + + if (!m_alg) { + ERR("Not supported AUTO ROTATION sensor"); + return false; + } + + if (!m_alg->open()) + return false; + + set_privilege(SENSOR_PRIVILEGE_INTERNAL); + + INFO("%s is created!\n", sensor_base::get_name()); + + return true; +} + +sensor_type_t auto_rotation_sensor::get_type(void) +{ + return AUTO_ROTATION_SENSOR; +} + +bool auto_rotation_sensor::on_start(void) +{ + const int SAMPLING_TIME = 60; + m_rotation = AUTO_ROTATION_DEGREE_UNKNOWN; + + m_alg->start(); + + m_accel_sensor->add_client(ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME); + m_accel_sensor->add_interval((int)this , SAMPLING_TIME, true); + m_accel_sensor->start(); + + return activate(); +} + +bool auto_rotation_sensor::on_stop(void) +{ + m_accel_sensor->delete_client(ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME); + m_accel_sensor->delete_interval((int)this , true); + m_accel_sensor->stop(); + + return deactivate(); +} + +void auto_rotation_sensor::synthesize(const sensor_event_t& event, vector &outs) +{ + AUTOLOCK(m_mutex); + + if (event.event_type == ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME) { + int rotation; + float acc[3]; + acc[0] = event.data.values[0]; + acc[1] = event.data.values[1]; + acc[2] = event.data.values[2]; + + if (!m_alg->get_rotation(acc, event.data.timestamp, m_rotation, rotation)) + return; + + AUTOLOCK(m_value_mutex); + sensor_event_t rotation_event; + + INFO("Rotation: %d, ACC[0]: %f, ACC[1]: %f, ACC[2]: %f", rotation, event.data.values[0], event.data.values[1], event.data.values[2]); + rotation_event.sensor_id = get_id(); + rotation_event.data.accuracy = SENSOR_ACCURACY_GOOD; + rotation_event.event_type = AUTO_ROTATION_EVENT_CHANGE_STATE; + rotation_event.data.timestamp = event.data.timestamp; + rotation_event.data.values[0] = rotation; + rotation_event.data.value_count = 1; + outs.push_back(rotation_event); + m_rotation = rotation; + m_rotation_time = event.data.timestamp; + + return; + } + return; +} + +int auto_rotation_sensor::get_sensor_data(unsigned int data_id, sensor_data_t &data) +{ + if (data_id != AUTO_ROTATION_BASE_DATA_SET) + return -1; + + AUTOLOCK(m_value_mutex); + + data.accuracy = SENSOR_ACCURACY_GOOD; + data.timestamp = m_rotation_time; + data.values[0] = m_rotation; + data.value_count = 1; + + return 0; +} + +bool auto_rotation_sensor::get_properties(sensor_properties_t &properties) +{ + properties.name = "Auto Rotation Sensor"; + properties.vendor = "Samsung Electronics"; + properties.min_range = AUTO_ROTATION_DEGREE_UNKNOWN; + properties.max_range = AUTO_ROTATION_DEGREE_270; + properties.min_interval = 1; + properties.resolution = 1; + properties.fifo_count = 0; + properties.max_batch_count = 0; + + return true; +} + +extern "C" sensor_module* create(void) +{ + auto_rotation_sensor *sensor; + + try { + sensor = new(std::nothrow) auto_rotation_sensor; + } catch (int err) { + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); + return NULL; + } + + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); + + module->sensors.push_back(sensor); + return module; +} diff --git a/src/auto_rotation/auto_rotation_sensor.h b/src/auto_rotation/auto_rotation_sensor.h new file mode 100755 index 0000000..1124c03 --- /dev/null +++ b/src/auto_rotation/auto_rotation_sensor.h @@ -0,0 +1,58 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _AUTO_ROTATION_SENSOR_H_ +#define _AUTO_ROTATION_SENSOR_H_ + +#include +#include +#include +#include + +using std::string; + +class auto_rotation_sensor : public virtual_sensor { +public: + auto_rotation_sensor(); + virtual ~auto_rotation_sensor(); + + bool init(); + sensor_type_t get_type(void); + + static bool working(void *inst); + + void synthesize(const sensor_event_t& event, vector &outs); + + int get_sensor_data(unsigned int data_id, sensor_data_t &data); + virtual bool get_properties(sensor_properties_t &properties); +private: + sensor_base *m_accel_sensor; + cmutex m_value_mutex; + + int m_rotation; + unsigned long long m_rotation_time; + auto_rotation_alg *m_alg; + + auto_rotation_alg *get_alg(); + virtual bool on_start(void); + virtual bool on_stop(void); + bool check_lib(void); +}; + +#endif diff --git a/src/geo/geo_sensor.cpp b/src/geo/geo_sensor.cpp index 7f967c7..7843935 100755 --- a/src/geo/geo_sensor.cpp +++ b/src/geo/geo_sensor.cpp @@ -33,6 +33,7 @@ geo_sensor::geo_sensor() register_supported_event(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME); register_supported_event(GEOMAGNETIC_EVENT_CALIBRATION_NEEDED); + register_supported_event(GEOMAGNETIC_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME); physical_sensor::set_poller(geo_sensor::working, this); } @@ -88,6 +89,12 @@ bool geo_sensor::process_event(void) AUTOLOCK(m_client_info_mutex); AUTOLOCK(m_mutex); + if (get_client_cnt(GEOMAGNETIC_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME)) { + event.sensor_id = get_id(); + event.event_type = GEOMAGNETIC_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME; + push(event); + } + if (get_client_cnt(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME)) { event.sensor_id = get_id(); event.event_type = GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME; @@ -131,6 +138,7 @@ int geo_sensor::get_sensor_data(unsigned int type, sensor_data_t &data) return -1; state = m_sensor_hal->get_sensor_data(data); + raw_to_base(data); if (state < 0) { ERR("m_sensor_hal get struct_data fail\n"); @@ -157,21 +165,20 @@ void geo_sensor::raw_to_base(sensor_data_t &data) data.values[2] = data.values[2] * m_resolution; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - geo_sensor *inst; + geo_sensor *sensor; try { - inst = new geo_sensor(); + sensor = new(std::nothrow) geo_sensor; } catch (int err) { - ERR("geo_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (geo_sensor*)inst;; + module->sensors.push_back(sensor); + return module; } diff --git a/src/geo/geo_sensor_hal.cpp b/src/geo/geo_sensor_hal.cpp index fdd99f9..0480752 100755 --- a/src/geo/geo_sensor_hal.cpp +++ b/src/geo/geo_sensor_hal.cpp @@ -24,77 +24,59 @@ #include #include #include -#include using std::ifstream; #define SENSOR_TYPE_MAGNETIC "MAGNETIC" -#define ELEMENT_NAME "NAME" +#define ELEMENT_NAME "NAME" #define ELEMENT_VENDOR "VENDOR" #define ELEMENT_RAW_DATA_UNIT "RAW_DATA_UNIT" #define ELEMENT_MIN_RANGE "MIN_RANGE" #define ELEMENT_MAX_RANGE "MAX_RANGE" #define ATTR_VALUE "value" -#define INITIAL_TIME -1 -#define GAUSS_TO_UTESLA(val) ((val) * 100.0f) - geo_sensor_hal::geo_sensor_hal() -: m_polling_interval(POLL_1HZ_MS) -, m_x(0) +: m_x(0) , m_y(0) , m_z(0) , m_hdst(0) -, m_fired_time(INITIAL_TIME) +, m_fired_time(0) , m_node_handle(-1) +, m_polling_interval(POLL_1HZ_MS) { const string sensorhub_interval_node_name = "mag_poll_delay"; csensor_config &config = csensor_config::get_instance(); - node_path_info_query query; - node_path_info info; - int input_method = IIO_METHOD; + node_info_query query; + node_info info; - if (!get_model_properties(SENSOR_TYPE_MAGNETIC, m_model_id, input_method)) { - ERR("Failed to find model_properties"); + if (!find_model_id(SENSOR_TYPE_MAGNETIC, m_model_id)) { + ERR("Failed to find model id"); throw ENXIO; - } - query.input_method = input_method; query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); query.sensor_type = SENSOR_TYPE_MAGNETIC; - query.input_event_key = "geomagnetic_sensor"; + query.key = "geomagnetic_sensor"; query.iio_enable_node_name = "geomagnetic_enable"; query.sensorhub_interval_node_name = sensorhub_interval_node_name; - if (!get_node_path_info(query, info)) { + bool error = get_node_info(query, info); + + query.key = "magnetic_sensor"; + error |= get_node_info(query, info); + + if (!error) { ERR("Failed to get node info"); throw ENXIO; } - show_node_path_info(info); + show_node_info(info); m_data_node = info.data_node_path; m_enable_node = info.enable_node_path; m_interval_node = info.interval_node_path; - if (input_method == IIO_METHOD) { - m_geo_dir = info.base_dir; - m_x_node = m_geo_dir + string(X_RAW_VAL_NODE); - m_y_node = m_geo_dir + string(Y_RAW_VAL_NODE); - m_z_node = m_geo_dir + string(Z_RAW_VAL_NODE); - m_x_scale_node = m_geo_dir + string(X_SCALE_NODE); - m_y_scale_node = m_geo_dir + string(Y_SCALE_NODE); - m_z_scale_node = m_geo_dir + string(Z_SCALE_NODE); - INFO("Raw data node X: %s", m_x_node.c_str()); - INFO("Raw data node Y: %s", m_y_node.c_str()); - INFO("Raw data node Z: %s", m_z_node.c_str()); - INFO("scale node X: %s", m_x_scale_node.c_str()); - INFO("scale node Y: %s", m_y_scale_node.c_str()); - INFO("scale node Z: %s", m_z_scale_node.c_str()); - } - if (!config.get(SENSOR_TYPE_MAGNETIC, m_model_id, ELEMENT_VENDOR, m_vendor)) { ERR("[VENDOR] is empty\n"); throw ENXIO; @@ -107,9 +89,46 @@ geo_sensor_hal::geo_sensor_hal() throw ENXIO; } - init_resources(); - INFO("m_chip_name = %s\n",m_chip_name.c_str()); + + double min_range; + + if (!config.get(SENSOR_TYPE_MAGNETIC, m_model_id, ELEMENT_MIN_RANGE, min_range)) { + ERR("[MIN_RANGE] is empty\n"); + throw ENXIO; + } + + m_min_range = (float)min_range; + INFO("m_min_range = %f\n",m_min_range); + + double max_range; + + if (!config.get(SENSOR_TYPE_MAGNETIC, m_model_id, ELEMENT_MAX_RANGE, max_range)) { + ERR("[MAX_RANGE] is empty\n"); + throw ENXIO; + } + + m_max_range = (float)max_range; + INFO("m_max_range = %f\n",m_max_range); + + double raw_data_unit; + + if (!config.get(SENSOR_TYPE_MAGNETIC, m_model_id, ELEMENT_RAW_DATA_UNIT, raw_data_unit)) { + ERR("[RAW_DATA_UNIT] is empty\n"); + throw ENXIO; + } + + m_raw_data_unit = (float)(raw_data_unit); + + if ((m_node_handle = open(m_data_node.c_str(),O_RDWR)) < 0) { + ERR("Failed to open handle(%d)", m_node_handle); + throw ENXIO; + } + + int clockId = CLOCK_MONOTONIC; + if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) + ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); + INFO("m_raw_data_unit = %f\n", m_raw_data_unit); INFO("geo_sensor_hal is created!\n"); @@ -117,8 +136,7 @@ geo_sensor_hal::geo_sensor_hal() geo_sensor_hal::~geo_sensor_hal() { - if (m_node_handle > 0) - close(m_node_handle); + close(m_node_handle); m_node_handle = -1; INFO("geo_sensor is destroyed!\n"); @@ -136,43 +154,114 @@ sensor_type_t geo_sensor_hal::get_type(void) bool geo_sensor_hal::enable(void) { - m_fired_time = INITIAL_TIME; + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, true, SENSORHUB_GEOMAGNETIC_ENABLE_BIT); + set_interval(m_polling_interval); + + m_fired_time = 0; INFO("Geo sensor real starting"); return true; } bool geo_sensor_hal::disable(void) { + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, false, SENSORHUB_GEOMAGNETIC_ENABLE_BIT); + INFO("Geo sensor real stopping"); return true; } bool geo_sensor_hal::set_interval(unsigned long val) { - INFO("Polling interval cannot be changed."); + unsigned long long polling_interval_ns; + + AUTOLOCK(m_mutex); + + polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu); + + if (!set_node_value(m_interval_node, polling_interval_ns)) { + ERR("Failed to set polling resource: %s\n", m_interval_node.c_str()); + return false; + } + + INFO("Interval is changed from %dms to %dms]", m_polling_interval, val); + m_polling_interval = val; return true; } -bool geo_sensor_hal::update_value(void) +bool geo_sensor_hal::update_value(bool wait) { - int raw_values[3] = {0,}; - ifstream temp_handle; + int geo_raw[4] = {0,}; + bool x,y,z,hdst; + int read_input_cnt = 0; + const int INPUT_MAX_BEFORE_SYN = 10; + unsigned long long fired_time = 0; + bool syn = false; + + x = y = z = hdst = false; + + struct input_event geo_input; + DBG("geo event detection!"); + + while ((syn == false) && (read_input_cnt < INPUT_MAX_BEFORE_SYN)) { + int len = read(m_node_handle, &geo_input, sizeof(geo_input)); + if (len != sizeof(geo_input)) { + ERR("geo_file read fail, read_len = %d\n",len); + return false; + } + + ++read_input_cnt; + + if (geo_input.type == EV_REL) { + switch (geo_input.code) { + case REL_RX: + geo_raw[0] = (int)geo_input.value; + x = true; + break; + case REL_RY: + geo_raw[1] = (int)geo_input.value; + y = true; + break; + case REL_RZ: + geo_raw[2] = (int)geo_input.value; + z = true; + break; + case REL_HWHEEL: + geo_raw[3] = (int)geo_input.value; + hdst = true; + break; + default: + ERR("geo_input event[type = %d, code = %d] is unknown.", geo_input.type, geo_input.code); + return false; + break; + } + } else if (geo_input.type == EV_SYN) { + syn = true; + fired_time = get_timestamp(&geo_input.time); + } else { + ERR("geo_input event[type = %d, code = %d] is unknown.", geo_input.type, geo_input.code); + return false; + } + } - if (!read_node_value(m_x_node, raw_values[0])) - return false; - if (!read_node_value(m_y_node, raw_values[1])) - return false; - if (!read_node_value(m_z_node, raw_values[2])) - return false; + AUTOLOCK(m_value_mutex); + + if (x) + m_x = geo_raw[0]; + if (y) + m_y = geo_raw[1]; + if (z) + m_z = geo_raw[2]; + if (hdst) + m_hdst = geo_raw[3] - 1; /* accuracy bias: -1 */ - m_x = GAUSS_TO_UTESLA(raw_values[0] * m_x_scale); - m_y = GAUSS_TO_UTESLA(raw_values[1] * m_y_scale); - m_z = GAUSS_TO_UTESLA(raw_values[2] * m_z_scale); + m_fired_time = fired_time; - m_fired_time = INITIAL_TIME; - INFO("x = %d, y = %d, z = %d, time = %lluus", raw_values[0], raw_values[1], raw_values[2], m_fired_time); - INFO("x = %f, y = %f, z = %f, time = %lluus", m_x, m_y, m_z, m_fired_time); + DBG("m_x = %d, m_y = %d, m_z = %d, m_hdst = %d, time = %lluus", m_x, m_y, m_z, m_hdst, m_fired_time); return true; } @@ -180,13 +269,13 @@ bool geo_sensor_hal::update_value(void) bool geo_sensor_hal::is_data_ready(bool wait) { bool ret; - ret = update_value(); + ret = update_value(wait); return ret; } int geo_sensor_hal::get_sensor_data(sensor_data_t &data) { - data.accuracy = SENSOR_ACCURACY_GOOD; + data.accuracy = (m_hdst == 1) ? 0 : m_hdst; /* hdst 0 and 1 are needed to calibrate */ data.timestamp = m_fired_time; data.value_count = 3; data.values[0] = (float)m_x; @@ -208,41 +297,20 @@ bool geo_sensor_hal::get_properties(sensor_properties_s &properties) return true; } -bool geo_sensor_hal::init_resources(void) +extern "C" sensor_module* create(void) { - ifstream temp_handle; - - if (!read_node_value(m_x_scale_node, m_x_scale)) { - ERR("Failed to read x scale node"); - return false; - } - if (!read_node_value(m_y_scale_node, m_y_scale)) { - ERR("Failed to read y scale node"); - return false; - } - if (!read_node_value(m_z_scale_node, m_z_scale)) { - ERR("Failed to read y scale node"); - return false; - } - INFO("Scale Values: %f, %f, %f", m_x_scale, m_y_scale, m_z_scale); - return true; -} - -extern "C" void *create(void) -{ - geo_sensor_hal *inst; + geo_sensor_hal *sensor; try { - inst = new geo_sensor_hal(); + sensor = new(std::nothrow) geo_sensor_hal; } catch (int err) { - ERR("geo_sensor_hal class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (geo_sensor_hal*)inst; + module->sensors.push_back(sensor); + return module; } diff --git a/src/geo/geo_sensor_hal.h b/src/geo/geo_sensor_hal.h index 291c725..44afebb 100755 --- a/src/geo/geo_sensor_hal.h +++ b/src/geo/geo_sensor_hal.h @@ -23,13 +23,6 @@ #include #include -#define X_RAW_VAL_NODE "in_magn_x_raw" -#define Y_RAW_VAL_NODE "in_magn_y_raw" -#define Z_RAW_VAL_NODE "in_magn_z_raw" -#define X_SCALE_NODE "in_magn_x_scale" -#define Y_SCALE_NODE "in_magn_y_scale" -#define Z_SCALE_NODE "in_magn_z_scale" - using std::string; class geo_sensor_hal : public sensor_hal @@ -54,40 +47,24 @@ private: float m_max_range; float m_raw_data_unit; - unsigned long m_polling_interval; - double m_x; double m_y; double m_z; - double m_x_scale; - double m_y_scale; - double m_z_scale; int m_hdst; unsigned long long m_fired_time; int m_node_handle; + unsigned long m_polling_interval; string m_enable_node; - - /*For Input Method*/ string m_data_node; string m_interval_node; - /*For IIO method*/ - string m_geo_dir; - string m_x_node; - string m_y_node; - string m_z_node; - string m_x_scale_node; - string m_y_scale_node; - string m_z_scale_node; - bool m_sensorhub_controlled; cmutex m_value_mutex; - bool update_value(void); - bool init_resources(void); + bool update_value(bool wait); }; #endif /*_GEO_SENSOR_HAL_H_*/ diff --git a/src/gravity/gravity_sensor.cpp b/src/gravity/gravity_sensor.cpp index 21b8e96..c0a767a 100755 --- a/src/gravity/gravity_sensor.cpp +++ b/src/gravity/gravity_sensor.cpp @@ -56,11 +56,11 @@ gravity_sensor::gravity_sensor() , m_x(INITIAL_VALUE) , m_y(INITIAL_VALUE) , m_z(INITIAL_VALUE) +, m_time(0) { cvirtual_sensor_config &config = cvirtual_sensor_config::get_instance(); - m_name = string(SENSOR_NAME); - m_timestamp = get_timestamp(); + m_name = std::string(SENSOR_NAME); register_supported_event(GRAVITY_EVENT_RAW_DATA_REPORT_ON_TIME); if (!config.get(SENSOR_TYPE_GRAVITY, ELEMENT_VENDOR, m_vendor)) { @@ -129,7 +129,7 @@ bool gravity_sensor::on_start(void) AUTOLOCK(m_mutex); m_orientation_sensor->add_client(ORIENTATION_EVENT_RAW_DATA_REPORT_ON_TIME); - m_orientation_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), true); + m_orientation_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), false); m_orientation_sensor->start(); activate(); @@ -141,7 +141,7 @@ bool gravity_sensor::on_stop(void) AUTOLOCK(m_mutex); m_orientation_sensor->delete_client(ORIENTATION_EVENT_RAW_DATA_REPORT_ON_TIME); - m_orientation_sensor->delete_interval((intptr_t)this, true); + m_orientation_sensor->delete_interval((intptr_t)this, false); m_orientation_sensor->stop(); deactivate(); @@ -151,17 +151,17 @@ bool gravity_sensor::on_stop(void) bool gravity_sensor::add_interval(int client_id, unsigned int interval) { AUTOLOCK(m_mutex); - m_orientation_sensor->add_interval(client_id , interval, true); + m_orientation_sensor->add_interval(client_id , interval, false); - return sensor_base::add_interval(client_id, interval, true); + return sensor_base::add_interval(client_id, interval, false); } bool gravity_sensor::delete_interval(int client_id) { AUTOLOCK(m_mutex); - m_orientation_sensor->delete_interval(client_id , true); + m_orientation_sensor->delete_interval(client_id , false); - return sensor_base::delete_interval(client_id, true); + return sensor_base::delete_interval(client_id, false); } void gravity_sensor::synthesize(const sensor_event_t &event, vector &outs) @@ -182,14 +182,13 @@ void gravity_sensor::synthesize(const sensor_event_t &event, vector= (M_PI/2)-DEVIATION && roll <= (M_PI/2)+DEVIATION) || (roll >= -(M_PI/2)-DEVIATION && roll <= -(M_PI/2)+DEVIATION)) { gravity_event.data.values[0] = m_gravity_sign_compensation[0] * GRAVITY * sin(roll) * cos(azimuth); @@ -206,10 +205,19 @@ void gravity_sensor::synthesize(const sensor_event_t &event, vectorsensors.push_back(sensor); + return module; } diff --git a/src/gravity/gravity_sensor.h b/src/gravity/gravity_sensor.h index ec2c5e1..ea6c4a0 100755 --- a/src/gravity/gravity_sensor.h +++ b/src/gravity/gravity_sensor.h @@ -22,9 +22,6 @@ #include #include -#include - -using std::string; class gravity_sensor : public virtual_sensor { public: @@ -48,7 +45,8 @@ private: float m_x; float m_y; float m_z; - unsigned long long m_timestamp; + int m_accuracy; + unsigned long long m_time; unsigned int m_interval; string m_vendor; @@ -61,4 +59,4 @@ private: bool on_stop(void); }; -#endif +#endif /* _GRAVITY_SENSOR_H_ */ diff --git a/src/gyro/gyro_sensor.cpp b/src/gyro/gyro_sensor.cpp index 30f562b..cdf4109 100755 --- a/src/gyro/gyro_sensor.cpp +++ b/src/gyro/gyro_sensor.cpp @@ -36,6 +36,7 @@ gyro_sensor::gyro_sensor() m_name = string(SENSOR_NAME); register_supported_event(GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME); + register_supported_event(GYROSCOPE_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME); physical_sensor::set_poller(gyro_sensor::working, this); } @@ -90,6 +91,12 @@ bool gyro_sensor::process_event(void) AUTOLOCK(m_client_info_mutex); + if (get_client_cnt(GYROSCOPE_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME)) { + event.sensor_id = get_id(); + event.event_type = GYROSCOPE_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME; + push(event); + } + if (get_client_cnt(GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME)) { event.sensor_id = get_id(); event.event_type = GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME; @@ -161,21 +168,20 @@ void gyro_sensor::raw_to_base(sensor_data_t &data) data.values[2] = data.values[2] * m_resolution; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - gyro_sensor *inst; + gyro_sensor *sensor; try { - inst = new gyro_sensor(); + sensor = new(std::nothrow) gyro_sensor; } catch (int err) { - ERR("gyro_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (gyro_sensor*)inst;; + module->sensors.push_back(sensor); + return module; } diff --git a/src/gyro/gyro_sensor_hal.cpp b/src/gyro/gyro_sensor_hal.cpp index f4f690e..52b55fb 100755 --- a/src/gyro/gyro_sensor_hal.cpp +++ b/src/gyro/gyro_sensor_hal.cpp @@ -24,7 +24,6 @@ #include #include #include -#include using std::ifstream; @@ -41,14 +40,6 @@ using std::ifstream; #define ATTR_VALUE "value" -#define SCALE_AVAILABLE_NODE "in_anglvel_scale_available" -#define SCAN_EL_DIR "scan_elements/" -#define TRIG_SUFFIX "-trigger" -#define GYRO_RINGBUF_LEN 32 -#define SEC_MSEC 1000 -#define MSEC_TO_FREQ(VAL) ((SEC_MSEC) / (VAL)) -#define NSEC_TO_MUSEC(VAL) ((VAL) / 1000) - gyro_sensor_hal::gyro_sensor_hal() : m_x(-1) , m_y(-1) @@ -61,38 +52,31 @@ gyro_sensor_hal::gyro_sensor_hal() const string sensorhub_interval_node_name = "gyro_poll_delay"; csensor_config &config = csensor_config::get_instance(); - node_path_info_query query; - node_path_info info; - int input_method = IIO_METHOD; + node_info_query query; + node_info info; - if (!get_model_properties(SENSOR_TYPE_GYRO, m_model_id, input_method)) { - ERR("Failed to find model_properties"); + if (!find_model_id(SENSOR_TYPE_GYRO, m_model_id)) { + ERR("Failed to find model id"); throw ENXIO; } - query.input_method = input_method; query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); query.sensor_type = SENSOR_TYPE_GYRO; - query.input_event_key = "gyro_sensor"; + query.key = "gyro_sensor"; query.iio_enable_node_name = "gyro_enable"; query.sensorhub_interval_node_name = sensorhub_interval_node_name; - if (!get_node_path_info(query, info)) { + if (!get_node_info(query, info)) { ERR("Failed to get node info"); throw ENXIO; } - show_node_path_info(info); + show_node_info(info); m_data_node = info.data_node_path; + m_enable_node = info.enable_node_path; m_interval_node = info.interval_node_path; - m_gyro_dir = info.base_dir; - m_trigger_path = info.trigger_node_path; - m_buffer_enable_node_path = info.buffer_enable_node_path; - m_buffer_length_node_path = info.buffer_length_node_path; - m_available_freq_node_path = info.available_freq_node_path; - m_available_scale_node_path = m_gyro_dir + string(SCALE_AVAILABLE_NODE); if (!config.get(SENSOR_TYPE_GYRO, m_model_id, ELEMENT_VENDOR, m_vendor)) { ERR("[VENDOR] is empty\n"); @@ -108,24 +92,6 @@ gyro_sensor_hal::gyro_sensor_hal() INFO("m_chip_name = %s\n",m_chip_name.c_str()); - if (input_method == IIO_METHOD) { - m_trigger_name = m_model_id + TRIG_SUFFIX; - if (!verify_iio_trigger(m_trigger_name)) { - ERR("Failed verify trigger"); - throw ENXIO; - } - string scan_dir = m_gyro_dir + SCAN_EL_DIR; - if (!get_generic_channel_names(scan_dir, string("_type"), m_generic_channel_names)) - ERR ("Failed to find any input channels"); - else { - INFO ("generic channel names:"); - for (vector ::iterator it = m_generic_channel_names.begin(); - it != m_generic_channel_names.end(); ++it) { - INFO ("%s", it->c_str()); - } - } - } - long resolution; if (!config.get(SENSOR_TYPE_GYRO, m_model_id, ELEMENT_RESOLUTION, resolution)) { @@ -149,12 +115,9 @@ gyro_sensor_hal::gyro_sensor_hal() throw ENXIO; } - if (setup_channels() == true) - INFO("IIO channel setup successful"); - else { - ERR("IIO channel setup failed"); - throw ENXIO; - } + int clockId = CLOCK_MONOTONIC; + if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) + ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); INFO("m_raw_data_unit = %f\n",m_raw_data_unit); INFO("RAW_DATA_TO_DPS_UNIT(m_raw_data_unit) = [%f]",RAW_DATA_TO_DPS_UNIT(m_raw_data_unit)); @@ -163,10 +126,6 @@ gyro_sensor_hal::gyro_sensor_hal() gyro_sensor_hal::~gyro_sensor_hal() { - enable_resource(false); - if (m_data != NULL) - delete []m_data; - close(m_node_handle); m_node_handle = -1; @@ -187,9 +146,7 @@ bool gyro_sensor_hal::enable(void) { AUTOLOCK(m_mutex); - if (!enable_resource(true)) - return false; - + set_enable_node(m_enable_node, m_sensorhub_controlled, true, SENSORHUB_GYROSCOPE_ENABLE_BIT); set_interval(m_polling_interval); m_fired_time = 0; @@ -201,62 +158,96 @@ bool gyro_sensor_hal::disable(void) { AUTOLOCK(m_mutex); - if (!enable_resource(false)) - return false; + set_enable_node(m_enable_node, m_sensorhub_controlled, false, SENSORHUB_GYROSCOPE_ENABLE_BIT); INFO("Gyro sensor real stopping"); return true; } -bool gyro_sensor_hal::set_interval(unsigned long ms_interval) +bool gyro_sensor_hal::set_interval(unsigned long val) { - int freq, i; + unsigned long long polling_interval_ns; + + AUTOLOCK(m_mutex); - freq = (int)(MSEC_TO_FREQ(ms_interval)); + polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu); - for (i=0; i < m_sample_freq_count; i++) { - if (freq == m_sample_freq[i]) { - if (update_sysfs_num(m_interval_node.c_str(), freq, true) == 0) { - INFO("Interval is changed from %lums to %lums]", m_polling_interval, ms_interval); - m_polling_interval = ms_interval; - return true; - } - else { - ERR("Failed to set data %lu\n", ms_interval); - return false; - } - } + if (!set_node_value(m_interval_node, polling_interval_ns)) { + ERR("Failed to set polling resource: %s\n", m_interval_node.c_str()); + return false; } - DBG("The interval not supported: %lu\n", ms_interval); - ERR("Failed to set data %lu\n", ms_interval); - return false; + INFO("Interval is changed from %dms to %dms]", m_polling_interval, val); + m_polling_interval = val; + return true; } + bool gyro_sensor_hal::update_value(bool wait) { - int i; - struct pollfd pfd; - ssize_t read_size; - const int TIMEOUT = 1000; - - pfd.fd = m_node_handle; - pfd.events = POLLIN; - if (wait) - poll(&pfd, 1, TIMEOUT); - else - poll(&pfd, 1, 0); - - read_size = read(m_node_handle, m_data, GYRO_RINGBUF_LEN * m_scan_size); - if (read_size <= 0) { - ERR("Gyro:No data available\n"); - return false; - } - else { - for (i = 0; i < (read_size / m_scan_size); i++) - decode_data(); + int gyro_raw[3] = {0,}; + bool x,y,z; + int read_input_cnt = 0; + const int INPUT_MAX_BEFORE_SYN = 10; + unsigned long long fired_time = 0; + bool syn = false; + + x = y = z = false; + + struct input_event gyro_input; + DBG("gyro event detection!"); + + while ((syn == false) && (read_input_cnt < INPUT_MAX_BEFORE_SYN)) { + int len = read(m_node_handle, &gyro_input, sizeof(gyro_input)); + if (len != sizeof(gyro_input)) { + ERR("gyro_file read fail, read_len = %d\n, %s",len, strerror(errno)); + return false; + } + + ++read_input_cnt; + + if (gyro_input.type == EV_REL) { + switch (gyro_input.code) { + case REL_RX: + gyro_raw[0] = (int)gyro_input.value; + x = true; + break; + case REL_RY: + gyro_raw[1] = (int)gyro_input.value; + y = true; + break; + case REL_RZ: + gyro_raw[2] = (int)gyro_input.value; + z = true; + break; + default: + ERR("gyro_input event[type = %d, code = %d] is unknown.", gyro_input.type, gyro_input.code); + return false; + break; + } + } else if (gyro_input.type == EV_SYN) { + syn = true; + fired_time = sensor_hal::get_timestamp(&gyro_input.time); + } else { + ERR("gyro_input event[type = %d, code = %d] is unknown.", gyro_input.type, gyro_input.code); + return false; + } } + + AUTOLOCK(m_value_mutex); + + if (x) + m_x = gyro_raw[0]; + if (y) + m_y = gyro_raw[1]; + if (z) + m_z = gyro_raw[2]; + + m_fired_time = fired_time; + + DBG("m_x = %d, m_y = %d, m_z = %d, time = %lluus", m_x, m_y, m_z, m_fired_time); + return true; } @@ -295,169 +286,20 @@ bool gyro_sensor_hal::get_properties(sensor_properties_s &properties) } -bool gyro_sensor_hal::add_gyro_channels_to_array(void) -{ - int i = 0; - m_channels = (struct channel_parameters*) malloc(sizeof(struct channel_parameters) * m_generic_channel_names.size()); - for (vector ::iterator it = m_generic_channel_names.begin(); - it != m_generic_channel_names.end(); ++it) { - if (add_channel_to_array(m_gyro_dir.c_str(), it->c_str() , &m_channels[i++]) < 0) { - ERR("Failed to add channel %s to channel array", it->c_str()); - return false; - } - } - return true; -} - -bool gyro_sensor_hal::setup_channels(void) +extern "C" sensor_module* create(void) { - int freq, i; - double sf; - - enable_resource(true); - - if (!add_gyro_channels_to_array()) { - ERR("Failed to add channels to array!"); - return false; - } - - INFO("Sorting channels by index"); - sort_channels_by_index(m_channels, m_generic_channel_names.size()); - INFO("Sorting channels by index completed"); - - m_scan_size = get_channel_array_size(m_channels, m_generic_channel_names.size()); - if (m_scan_size == 0) { - ERR("Channel array size is zero"); - return false; - } - - m_data = new (std::nothrow) char[m_scan_size * GYRO_RINGBUF_LEN]; - if (m_data == NULL) { - ERR("Couldn't create data buffer\n"); - return false; - } - - FILE *fp = NULL; - fp = fopen(m_available_freq_node_path.c_str(), "r"); - if (!fp) { - ERR("Fail to open available frequencies file:%s\n", m_available_freq_node_path.c_str()); - return false; - } - - for (i = 0; i < MAX_FREQ_COUNT; i++) - m_sample_freq[i] = 0; - - i = 0; - - while (fscanf(fp, "%d", &freq) > 0) - m_sample_freq[i++] = freq; - - m_sample_freq_count = i; - - fp = fopen(m_available_scale_node_path.c_str(), "r"); - if (!fp) { - ERR("Fail to open available scale factors file:%s\n", m_available_scale_node_path.c_str()); - return false; - } - - for (i = 0; i < MAX_SCALING_COUNT; i++) - m_scale_factor[i] = 0; - - i = 0; - - while (fscanf(fp, "%lf", &sf) > 0) - m_scale_factor[i++] = sf; - - m_scale_factor_count = i; - - return true; -} - -void gyro_sensor_hal::decode_data(void) -{ - AUTOLOCK(m_value_mutex); - - m_x = convert_bytes_to_int(*(unsigned short int *)(m_data + m_channels[0].buf_index), &m_channels[0]); - m_y = convert_bytes_to_int(*(unsigned short int *)(m_data + m_channels[1].buf_index), &m_channels[1]); - m_z = convert_bytes_to_int(*(unsigned short int *)(m_data + m_channels[2].buf_index), &m_channels[2]); - - long long int val = *(long long int *)(m_data + m_channels[3].buf_index); - if ((val >> m_channels[3].valid_bits) & 1) - val = (val & m_channels[3].mask) | ~m_channels[3].mask; - - m_fired_time = (unsigned long long int)(NSEC_TO_MUSEC(val)); - INFO("m_x = %d, m_y = %d, m_z = %d, time = %lluus", m_x, m_y, m_z, m_fired_time); -} - -bool gyro_sensor_hal::setup_trigger(const char* trig_name, bool verify) -{ - int ret = 0; - - ret = update_sysfs_string(m_trigger_path.c_str(), trig_name); - if (ret < 0) { - ERR("failed to write to current_trigger,%s,%s\n", m_trigger_path.c_str(), trig_name); - return false; - } - INFO("current_trigger setup successfully\n"); - return true; -} - -bool gyro_sensor_hal::setup_buffer(int enable) -{ - int ret; - ret = update_sysfs_num(m_buffer_length_node_path.c_str(), GYRO_RINGBUF_LEN, true); - if (ret < 0) { - ERR("failed to write to buffer/length\n"); - return false; - } - INFO("buffer/length setup successfully\n"); - - ret = update_sysfs_num(m_buffer_enable_node_path.c_str(), enable, true); - if (ret < 0) { - ERR("failed to write to buffer/enable\n"); - return false; - } - - if (enable) - INFO("buffer enabled\n"); - else - INFO("buffer disabled\n"); - return true; -} - -bool gyro_sensor_hal::enable_resource(bool enable) -{ - string temp; - if(enable) - setup_trigger(m_trigger_name.c_str(), enable); - else - setup_trigger("NULL", enable); - - for (vector ::iterator it = m_generic_channel_names.begin(); - it != m_generic_channel_names.end(); ++it) { - temp = m_gyro_dir + string(SCAN_EL_DIR) + *it + string("_en"); - if (update_sysfs_num(temp.c_str(), enable) < 0) - return false; - } - setup_buffer(enable); - return true; -} - -extern "C" void *create(void) -{ - gyro_sensor_hal *inst; + gyro_sensor_hal *sensor; try { - inst = new gyro_sensor_hal(); + sensor = new(std::nothrow) gyro_sensor_hal; } catch (int err) { - ERR("gyro_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (gyro_sensor_hal*)inst; + module->sensors.push_back(sensor); + return module; } diff --git a/src/gyro/gyro_sensor_hal.h b/src/gyro/gyro_sensor_hal.h index dcb8bfe..6204399 100755 --- a/src/gyro/gyro_sensor_hal.h +++ b/src/gyro/gyro_sensor_hal.h @@ -22,10 +22,6 @@ #include #include -#include - -#define MAX_FREQ_COUNT 16 -#define MAX_SCALING_COUNT 16 using std::string; @@ -51,31 +47,17 @@ private: unsigned long m_polling_interval; unsigned long long m_fired_time; - int m_scale_factor_count; - int m_sample_freq_count; - int m_sample_freq[MAX_FREQ_COUNT]; - double m_scale_factor[MAX_SCALING_COUNT]; - char *m_data; - int m_scan_size; - struct channel_parameters *m_channels; - - string m_trigger_name; - string m_trigger_path; - string m_buffer_enable_node_path; - string m_buffer_length_node_path; - string m_available_freq_node_path; - string m_available_scale_node_path; - string m_gyro_dir; - vector m_generic_channel_names; - string m_model_id; string m_vendor; string m_chip_name; + float m_min_range; + float m_max_range; int m_resolution; float m_raw_data_unit; string m_data_node; + string m_enable_node; string m_interval_node; bool m_sensorhub_controlled; @@ -83,13 +65,5 @@ private: cmutex m_value_mutex; bool update_value(bool wait); - bool setup_trigger(const char* trig_name, bool verify); - bool setup_buffer(int enable); - bool enable_resource(bool enable); - bool add_gyro_channels_to_array(void); - bool setup_channels(void); - bool setup_trigger(char* trig_name, bool verify); - void decode_data(void); - }; #endif /*_GYRO_SENSOR_HAL_CLASS_H_*/ diff --git a/src/libsensord/CMakeLists.txt b/src/libsensord/CMakeLists.txt index 4b51611..5b57251 100755 --- a/src/libsensord/CMakeLists.txt +++ b/src/libsensord/CMakeLists.txt @@ -51,6 +51,7 @@ install(FILES sensor_proxi.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) install(FILES sensor_gyro.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) install(FILES sensor_pressure.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) install(FILES sensor_context.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) +install(FILES sensor_auto_rotation.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) install(FILES sensor_gravity.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) install(FILES sensor_linear_accel.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) install(FILES sensor_orientation.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sensor/) diff --git a/src/libsensord/client.cpp b/src/libsensord/client.cpp index dcac646..7af41cb 100755 --- a/src/libsensord/client.cpp +++ b/src/libsensord/client.cpp @@ -432,10 +432,13 @@ API bool sensord_get_sensor_list(sensor_type_t type, sensor_t **list, int *senso retvm_if (!get_sensor_list(), false, "Fail to get sensor list from server"); vector sensor_infos = sensor_info_manager::get_instance().get_infos(type); - *list = (sensor_t *) malloc(sizeof(sensor_info *) * sensor_infos.size()); - retvm_if(!*list, false, "Failed to allocate memory"); - for (unsigned int i = 0; i < sensor_infos.size(); ++i) + if (!sensor_infos.empty()) { + *list = (sensor_t *) malloc(sizeof(sensor_info *) * sensor_infos.size()); + retvm_if(!*list, false, "Failed to allocate memory"); + } + + for (int i = 0; i < sensor_infos.size(); ++i) *(*list + i) = sensor_info_to_sensor(sensor_infos[i]); *sensor_count = sensor_infos.size(); @@ -1028,7 +1031,7 @@ API bool sensord_set_option(int handle, int option) } -bool sensord_send_sensorhub_data(int handle, const char *data, int data_len) +API bool sensord_send_sensorhub_data(int handle, const char *data, int data_len) { sensor_id_t sensor_id; command_channel *cmd_channel; @@ -1099,7 +1102,7 @@ API bool sensord_get_data(int handle, unsigned int data_id, sensor_data_t* senso } if(!cmd_channel->cmd_get_data(data_id, sensor_data)) { - ERR("Cmd_get_struct(%d, %d, 0x%x) failed for %s", client_id, data_id, sensor_data, get_client_name()); + ERR("cmd_get_data(%d, %d, 0x%x) failed for %s", client_id, data_id, sensor_data, get_client_name()); return false; } diff --git a/src/libsensord/client_common.cpp b/src/libsensord/client_common.cpp index dcf85d4..28114c0 100755 --- a/src/libsensord/client_common.cpp +++ b/src/libsensord/client_common.cpp @@ -35,6 +35,7 @@ log_element g_log_elements[] = { FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, GYROSCOPE_SENSOR, 0, 1), FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, PRESSURE_SENSOR, 0, 1), FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, CONTEXT_SENSOR, 0, 1), + FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, AUTO_ROTATION_SENSOR, 0, 1), FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, GRAVITY_SENSOR, 0, 1), FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, LINEAR_ACCEL_SENSOR, 0, 1), FILL_LOG_ELEMENT(LOG_ID_SENSOR_TYPE, ORIENTATION_SENSOR, 0, 1), @@ -44,11 +45,10 @@ log_element g_log_elements[] = { FILL_LOG_ELEMENT(LOG_ID_EVENT, GEOMAGNETIC_EVENT_CALIBRATION_NEEDED, 0, 1), FILL_LOG_ELEMENT(LOG_ID_EVENT, PROXIMITY_EVENT_CHANGE_STATE, 0,1), FILL_LOG_ELEMENT(LOG_ID_EVENT, LIGHT_EVENT_CHANGE_LEVEL, 0, 1), - FILL_LOG_ELEMENT(LOG_ID_EVENT, PROXIMITY_EVENT_STATE_REPORT_ON_TIME, 0, 10), FILL_LOG_ELEMENT(LOG_ID_EVENT, PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME, 0, 10), FILL_LOG_ELEMENT(LOG_ID_EVENT, CONTEXT_EVENT_REPORT, 0, 1), - + FILL_LOG_ELEMENT(LOG_ID_EVENT, AUTO_ROTATION_EVENT_CHANGE_STATE, 0, 1), FILL_LOG_ELEMENT(LOG_ID_EVENT, ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10), FILL_LOG_ELEMENT(LOG_ID_EVENT, GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10), FILL_LOG_ELEMENT(LOG_ID_EVENT, GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME, 0, 10), @@ -71,6 +71,7 @@ log_element g_log_elements[] = { FILL_LOG_ELEMENT(LOG_ID_DATA, LIGHT_BASE_DATA_SET, 0, 25), FILL_LOG_ELEMENT(LOG_ID_DATA, LIGHT_LUX_DATA_SET, 0, 25), FILL_LOG_ELEMENT(LOG_ID_DATA, CONTEXT_BASE_DATA_SET, 0, 25), + FILL_LOG_ELEMENT(LOG_ID_DATA, AUTO_ROTATION_BASE_DATA_SET, 0, 25), FILL_LOG_ELEMENT(LOG_ID_DATA, GRAVITY_BASE_DATA_SET, 0, 25), FILL_LOG_ELEMENT(LOG_ID_DATA, LINEAR_ACCEL_BASE_DATA_SET, 0, 25), FILL_LOG_ELEMENT(LOG_ID_DATA, ORIENTATION_BASE_DATA_SET, 0, 25), @@ -180,6 +181,7 @@ bool is_single_state_event(unsigned int event_type) case GEOMAGNETIC_EVENT_CALIBRATION_NEEDED: case LIGHT_EVENT_CHANGE_LEVEL: case PROXIMITY_EVENT_CHANGE_STATE: + case AUTO_ROTATION_EVENT_CHANGE_STATE: return true; break; } @@ -196,6 +198,8 @@ unsigned int get_calibration_event_type(unsigned int event_type) switch (sensor) { case GEOMAGNETIC_SENSOR: return GEOMAGNETIC_EVENT_CALIBRATION_NEEDED; + case ROTATION_VECTOR_SENSOR: + return ROTATION_VECTOR_EVENT_CALIBRATION_NEEDED; case ORIENTATION_SENSOR: return ORIENTATION_EVENT_CALIBRATION_NEEDED; default: diff --git a/src/libsensord/sensor_accel.h b/src/libsensord/sensor_accel.h index c48bc46..596abae 100755 --- a/src/libsensord/sensor_accel.h +++ b/src/libsensord/sensor_accel.h @@ -42,6 +42,7 @@ enum accelerometer_data_id { enum accelerometer_event_type { ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME = (ACCELEROMETER_SENSOR << 16) | 0x0001, + ACCELEROMETER_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME = (ACCELEROMETER_SENSOR << 16) | 0x0002, }; /** diff --git a/src/libsensord/sensor_auto_rotation.h b/src/libsensord/sensor_auto_rotation.h new file mode 100755 index 0000000..752f13d --- /dev/null +++ b/src/libsensord/sensor_auto_rotation.h @@ -0,0 +1,64 @@ +/* + * libsensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _SENSOR_AUTO_ROTATION_H_ +#define _SENSOR_AUTO_ROTATION_H_ + +//! Pre-defined events for the auto_rotation sensor +//! Sensor Plugin developer can add more event to their own headers + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @defgroup SENSOR_AUTO_ROTATION Auto Rotation Sensor + * @ingroup SENSOR_FRAMEWORK + * + * These APIs are used to control the Auto Rotation sensor. + * @{ + */ + +enum auto_rotation_data_id { + AUTO_ROTATION_BASE_DATA_SET = (AUTO_ROTATION_SENSOR << 16) | 0x0001, +}; + +enum auto_rotation_event_type { + AUTO_ROTATION_EVENT_CHANGE_STATE = (AUTO_ROTATION_SENSOR << 16) | 0x0001, +}; + +enum auto_rotation_state { + AUTO_ROTATION_DEGREE_UNKNOWN = 0, + AUTO_ROTATION_DEGREE_0, + AUTO_ROTATION_DEGREE_90, + AUTO_ROTATION_DEGREE_180, + AUTO_ROTATION_DEGREE_270, +}; + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif +//! End of a file diff --git a/src/libsensord/sensor_geomag.h b/src/libsensord/sensor_geomag.h index c1c2de6..7929a99 100755 --- a/src/libsensord/sensor_geomag.h +++ b/src/libsensord/sensor_geomag.h @@ -44,6 +44,7 @@ enum geomag_data_id { enum geomag_evet_type { GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME = (GEOMAGNETIC_SENSOR << 16) | 0x0001, GEOMAGNETIC_EVENT_CALIBRATION_NEEDED = (GEOMAGNETIC_SENSOR << 16) | 0x0002, + GEOMAGNETIC_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME = (GEOMAGNETIC_SENSOR << 16) | 0x0003, }; /** diff --git a/src/libsensord/sensor_gyro.h b/src/libsensord/sensor_gyro.h index 5a73bb7..4a5ce87 100755 --- a/src/libsensord/sensor_gyro.h +++ b/src/libsensord/sensor_gyro.h @@ -42,6 +42,7 @@ enum gyro_data_id { enum gyro_event_type { GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME = (GYROSCOPE_SENSOR << 16) | 0x0001, + GYROSCOPE_EVENT_UNPROCESSED_DATA_REPORT_ON_TIME = (GYROSCOPE_SENSOR << 16) | 0x0002, }; /** diff --git a/src/libsensord/sensor_internal.h b/src/libsensord/sensor_internal.h index 3bc8311..352154a 100755 --- a/src/libsensord/sensor_internal.h +++ b/src/libsensord/sensor_internal.h @@ -46,6 +46,7 @@ extern "C" #include #include #include +#include #include #include #include diff --git a/src/light/light_sensor.cpp b/src/light/light_sensor.cpp index bf287c6..fbffb23 100755 --- a/src/light/light_sensor.cpp +++ b/src/light/light_sensor.cpp @@ -91,6 +91,7 @@ bool light_sensor::process_event(void) AUTOLOCK(m_client_info_mutex); + event.sensor_id = get_id(); if (get_client_cnt(LIGHT_EVENT_LUX_DATA_REPORT_ON_TIME)) { event.event_type = LIGHT_EVENT_LUX_DATA_REPORT_ON_TIME; push(event); @@ -129,8 +130,6 @@ int light_sensor::adc_to_light_level(int adc) bool light_sensor::on_start(void) { - AUTOLOCK(m_mutex); - if (!m_sensor_hal->enable()) { ERR("m_sensor_hal start fail"); return false; @@ -141,8 +140,6 @@ bool light_sensor::on_start(void) bool light_sensor::on_stop(void) { - AUTOLOCK(m_mutex); - if (!m_sensor_hal->disable()) { ERR("m_sensor_hal stop fail"); return false; @@ -151,24 +148,13 @@ bool light_sensor::on_stop(void) return stop_poll(); } -bool light_sensor::get_properties(const unsigned int type, sensor_properties_s &properties) +bool light_sensor::get_properties(sensor_properties_s &properties) { m_sensor_hal->get_properties(properties); - - if (type == LIGHT_LUX_DATA_SET) - return 0; - - if (type == LIGHT_BASE_DATA_SET) { - properties.min_range = 0; - properties.max_range = sizeof(m_light_level) / sizeof(m_light_level[0]) - 1; - properties.resolution = 1; - return 0; - } - - return -1; + return true; } -int light_sensor::get_sensor_data(const unsigned int type, sensor_data_t &data) +int light_sensor::get_sensor_data(unsigned int type, sensor_data_t &data) { int ret; ret = m_sensor_hal->get_sensor_data(data); @@ -192,30 +178,30 @@ bool light_sensor::set_interval(unsigned long interval) AUTOLOCK(m_mutex); INFO("Polling interval is set to %dms", interval); + return m_sensor_hal->set_interval(interval); } void light_sensor::raw_to_level(sensor_data_t &data) { data.values[0] = (int) adc_to_light_level((int)data.values[0]); - data.values_num = 1; + data.value_count = 1; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - light_sensor *inst; + light_sensor *sensor; try { - inst = new light_sensor(); + sensor = new(std::nothrow) light_sensor; } catch (int err) { - ERR("Failed to create light_sensor class, errno : %d, errstr : %s", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void *)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (light_sensor *)inst; + module->sensors.push_back(sensor); + return module; } diff --git a/src/light/light_sensor.h b/src/light/light_sensor.h index 18bbe48..cdc8e50 100755 --- a/src/light/light_sensor.h +++ b/src/light/light_sensor.h @@ -24,8 +24,7 @@ #include #include -class light_sensor : public physical_sensor -{ +class light_sensor : public physical_sensor { public: light_sensor(); virtual ~light_sensor(); @@ -35,21 +34,23 @@ public: static bool working(void *inst); - virtual bool on_start(void); - virtual bool on_stop(void); - virtual bool set_interval(unsigned long interval); - virtual bool get_properties(const unsigned int type, sensor_properties_s &properties); + virtual bool get_properties(sensor_properties_s &properties); int get_sensor_data(const unsigned int type, sensor_data_t &data); private: static const int m_light_level[]; + sensor_hal *m_sensor_hal; int m_level; + virtual bool on_start(void); + virtual bool on_stop(void); + + bool process_event(void); int adc_to_light_level(int adc); + void raw_to_level(sensor_data_t &data); void raw_to_state(sensor_data_t &data); - bool process_event(void); }; #endif /*_LIGHT_SENSOR_H_*/ diff --git a/src/light/light_sensor_hal.cpp b/src/light/light_sensor_hal.cpp index 521a2dc..835a096 100755 --- a/src/light/light_sensor_hal.cpp +++ b/src/light/light_sensor_hal.cpp @@ -24,7 +24,6 @@ #include #include #include -#include using std::ifstream; @@ -43,47 +42,37 @@ light_sensor_hal::light_sensor_hal() : m_polling_interval(POLL_1HZ_MS) , m_adc(INVALID_VALUE) , m_fired_time(INITIAL_TIME) -, m_node_handle(-1) +, m_node_handle(INITIAL_VALUE) { const string sensorhub_interval_node_name = "light_poll_delay"; csensor_config &config = csensor_config::get_instance(); - node_path_info_query query; - node_path_info info; - int input_method = IIO_METHOD; + node_info_query query; + node_info info; - if (!get_model_properties(SENSOR_TYPE_LIGHT, m_model_id, input_method)) { - ERR("Failed to find model_properties"); + if (!find_model_id(SENSOR_TYPE_LIGHT, m_model_id)) { + ERR("Failed to find model id"); throw ENXIO; } - query.input_method = IIO_METHOD; query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); query.sensor_type = SENSOR_TYPE_LIGHT; - query.input_event_key = "light_sensor"; + query.key = "light_sensor"; query.iio_enable_node_name = "light_enable"; query.sensorhub_interval_node_name = sensorhub_interval_node_name; - if (!get_node_path_info(query, info)) { + if (!get_node_info(query, info)) { ERR("Failed to get node info"); throw ENXIO; } - show_node_path_info(info); + show_node_info(info); m_data_node = info.data_node_path; m_enable_node = info.enable_node_path; m_interval_node = info.interval_node_path; - if(input_method == IIO_METHOD) { - m_light_dir=info.base_dir; - m_light_node = m_light_dir + string(ILL_CLEAR_NODE); - - INFO("m_light_node = %s", m_light_node.c_str()); - INFO("m_light_dir = %s", m_light_dir.c_str()); - } - if (!config.get(SENSOR_TYPE_LIGHT, m_model_id, ELEMENT_VENDOR, m_vendor)) { ERR("[VENDOR] is empty\n"); throw ENXIO; @@ -98,11 +87,15 @@ light_sensor_hal::light_sensor_hal() INFO("m_chip_name = %s\n",m_chip_name.c_str()); - if ((m_node_handle = open(m_light_node.c_str(),O_RDWR)) < 0) { + if ((m_node_handle = open(m_data_node.c_str(),O_RDWR)) < 0) { ERR("Failed to open handle(%d)", m_node_handle); throw ENXIO; } + int clockId = CLOCK_MONOTONIC; + if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) + ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); + INFO("light_sensor_hal is created!\n"); } @@ -128,38 +121,79 @@ sensor_type_t light_sensor_hal::get_type(void) bool light_sensor_hal::enable(void) { - m_fired_time = INITIAL_TIME; + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, true, SENSORHUB_LIGHT_ENABLE_BIT); + set_interval(m_polling_interval); + + m_fired_time = 0; INFO("Light sensor real starting"); return true; } bool light_sensor_hal::disable(void) { + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, false, SENSORHUB_LIGHT_ENABLE_BIT); + INFO("Light sensor real stopping"); return true; } bool light_sensor_hal::set_interval(unsigned long val) { + unsigned long long polling_interval_ns; + + AUTOLOCK(m_mutex); + + polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu); + + if (!set_node_value(m_interval_node, polling_interval_ns)) { + ERR("Failed to set polling resource: %s\n", m_interval_node.c_str()); + return false; + } + + INFO("Interval is changed from %dms to %dms]", m_polling_interval, val); + m_polling_interval = val; return true; } bool light_sensor_hal::update_value(bool wait) { - unsigned short int adc = INITIAL_VALUE; - if (!read_node_value(m_light_node, adc)) - { - INFO("Read Value Failed. clear val: %d", adc); + + struct input_event light_event; + DBG("light event detection!"); + + int len = read(m_node_handle, &light_event, sizeof(light_event)); + if (len == -1) { + DBG("read(m_node_handle) is error:%s.\n", strerror(errno)); + return false; + } + + if (light_event.type == EV_ABS && light_event.code == ABS_MISC) { + adc = light_event.value; + } else if (light_event.type == EV_REL && light_event.code == REL_MISC) { + adc = light_event.value - BIAS; + } else if (light_event.type == EV_REL && light_event.code == REL_RX) { + adc = light_event.value - BIAS; + } else { + DBG("light input event[type = %d, code = %d] is unknown.", light_event.type, light_event.code); return false; } - INFO("Read Value success. Light Sensor clear val: %d", adc); + + DBG("read event, len : %d, type : %x, code : %x, value : %x", + len, light_event.type, light_event.code, light_event.value); + + DBG("update_value, adc : %d", adc); + AUTOLOCK(m_value_mutex); - m_adc = (int)adc; + m_adc = adc; + m_fired_time = get_timestamp(&light_event.time); return true; - } bool light_sensor_hal::is_data_ready(bool wait) @@ -173,7 +207,7 @@ int light_sensor_hal::get_sensor_data(sensor_data_t &data) { AUTOLOCK(m_value_mutex); data.accuracy = SENSOR_ACCURACY_GOOD; - data.timestamp = m_fired_time ; + data.timestamp = m_fired_time; data.value_count = 1; data.values[0] = (float) m_adc; @@ -186,7 +220,7 @@ bool light_sensor_hal::get_properties(sensor_properties_s &properties) properties.name = m_chip_name; properties.vendor = m_vendor; properties.min_range = 0; - properties.max_range = 65536; + properties.max_range = 65535; properties.min_interval = 1; properties.resolution = 1; properties.fifo_count = 0; @@ -194,21 +228,20 @@ bool light_sensor_hal::get_properties(sensor_properties_s &properties) return true; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - light_sensor_hal *inst; + light_sensor_hal *sensor; try { - inst = new light_sensor_hal(); + sensor = new(std::nothrow) light_sensor_hal; } catch (int err) { - ERR("light_sensor_hal class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (light_sensor_hal*)inst; + module->sensors.push_back(sensor); + return module; } diff --git a/src/light/light_sensor_hal.h b/src/light/light_sensor_hal.h index f2043ec..89a88f1 100755 --- a/src/light/light_sensor_hal.h +++ b/src/light/light_sensor_hal.h @@ -19,7 +19,7 @@ #ifndef _LIGHT_SENSOR_HAL_H_ #define _LIGHT_SENSOR_HAL_H_ -#define ILL_CLEAR_NODE "in_illuminance_clear_raw" + #include #include @@ -53,9 +53,6 @@ private: string m_enable_node; string m_data_node; string m_interval_node; - string m_clear_raw_node; - string m_light_dir; - string m_light_node; bool m_sensorhub_controlled; diff --git a/src/linear_accel/linear_accel_sensor.cpp b/src/linear_accel/linear_accel_sensor.cpp index 94a5f8f..5e64ed1 100755 --- a/src/linear_accel/linear_accel_sensor.cpp +++ b/src/linear_accel/linear_accel_sensor.cpp @@ -59,11 +59,11 @@ linear_accel_sensor::linear_accel_sensor() , m_x(INITIAL_VALUE) , m_y(INITIAL_VALUE) , m_z(INITIAL_VALUE) +, m_time(0) { cvirtual_sensor_config &config = cvirtual_sensor_config::get_instance(); m_name = string(SENSOR_NAME); - m_timestamp = get_timestamp(); m_enable_linear_accel = 0; register_supported_event(LINEAR_ACCEL_EVENT_RAW_DATA_REPORT_ON_TIME); @@ -150,11 +150,11 @@ bool linear_accel_sensor::on_start(void) { AUTOLOCK(m_mutex); m_gravity_sensor->add_client(GRAVITY_EVENT_RAW_DATA_REPORT_ON_TIME); - m_gravity_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), true); + m_gravity_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), false); m_gravity_sensor->start(); m_accel_sensor->add_client(ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME); - m_accel_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), true); + m_accel_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), false); m_accel_sensor->start(); activate(); @@ -165,11 +165,11 @@ bool linear_accel_sensor::on_stop(void) { AUTOLOCK(m_mutex); m_gravity_sensor->delete_client(GRAVITY_EVENT_RAW_DATA_REPORT_ON_TIME); - m_gravity_sensor->delete_interval((intptr_t)this, true); + m_gravity_sensor->delete_interval((intptr_t)this, false); m_gravity_sensor->stop(); m_accel_sensor->delete_client(ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME); - m_accel_sensor->delete_interval((intptr_t)this, true); + m_accel_sensor->delete_interval((intptr_t)this, false); m_accel_sensor->stop(); deactivate(); @@ -179,19 +179,19 @@ bool linear_accel_sensor::on_stop(void) bool linear_accel_sensor::add_interval(int client_id, unsigned int interval) { AUTOLOCK(m_mutex); - m_gravity_sensor->add_interval(client_id, interval, true); - m_accel_sensor->add_interval((intptr_t)this , interval, true); + m_gravity_sensor->add_interval(client_id, interval, false); + m_accel_sensor->add_interval(client_id, interval, false); - return sensor_base::add_interval(client_id, interval, true); + return sensor_base::add_interval(client_id, interval, false); } bool linear_accel_sensor::delete_interval(int client_id) { AUTOLOCK(m_mutex); - m_gravity_sensor->delete_interval(client_id, true); - m_accel_sensor->delete_interval(client_id, true); + m_gravity_sensor->delete_interval(client_id, false); + m_accel_sensor->delete_interval(client_id, false); - return sensor_base::delete_interval(client_id, true); + return sensor_base::delete_interval(client_id, false); } void linear_accel_sensor::synthesize(const sensor_event_t &event, vector &outs) @@ -201,9 +201,9 @@ void linear_accel_sensor::synthesize(const sensor_event_t &event, vectorsensors.push_back(sensor); + return module; } diff --git a/src/linear_accel/linear_accel_sensor.h b/src/linear_accel/linear_accel_sensor.h index b17792f..ec2dfe6 100755 --- a/src/linear_accel/linear_accel_sensor.h +++ b/src/linear_accel/linear_accel_sensor.h @@ -50,7 +50,7 @@ private: float m_x; float m_y; float m_z; - unsigned long long m_timestamp; + unsigned long long m_time; unsigned int m_interval; unsigned int m_enable_linear_accel; diff --git a/src/orientation/orientation_sensor.cpp b/src/orientation/orientation_sensor.cpp index 56658ba..fe8118d 100755 --- a/src/orientation/orientation_sensor.cpp +++ b/src/orientation/orientation_sensor.cpp @@ -81,12 +81,12 @@ orientation_sensor::orientation_sensor() , m_roll(INITIAL_VALUE) , m_pitch(INITIAL_VALUE) , m_azimuth(INITIAL_VALUE) +, m_time(0) { cvirtual_sensor_config &config = cvirtual_sensor_config::get_instance(); m_name = string(SENSOR_NAME); register_supported_event(ORIENTATION_EVENT_RAW_DATA_REPORT_ON_TIME); - m_timestamp = get_timestamp(); m_enable_orientation = 0; if (!config.get(SENSOR_TYPE_ORIENTATION, ELEMENT_VENDOR, m_vendor)) { @@ -236,13 +236,13 @@ bool orientation_sensor::on_start(void) AUTOLOCK(m_mutex); m_accel_sensor->add_client(ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME); - m_accel_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), true); + m_accel_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), false); m_accel_sensor->start(); m_gyro_sensor->add_client(GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME); - m_gyro_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), true); + m_gyro_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), false); m_gyro_sensor->start(); m_magnetic_sensor->add_client(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME); - m_magnetic_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), true); + m_magnetic_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), false); m_magnetic_sensor->start(); activate(); @@ -254,13 +254,13 @@ bool orientation_sensor::on_stop(void) AUTOLOCK(m_mutex); m_accel_sensor->delete_client(ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME); - m_accel_sensor->delete_interval((intptr_t)this, true); + m_accel_sensor->delete_interval((intptr_t)this, false); m_accel_sensor->stop(); m_gyro_sensor->delete_client(GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME); - m_gyro_sensor->delete_interval((intptr_t)this, true); + m_gyro_sensor->delete_interval((intptr_t)this, false); m_gyro_sensor->stop(); m_magnetic_sensor->delete_client(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME); - m_magnetic_sensor->delete_interval((intptr_t)this, true); + m_magnetic_sensor->delete_interval((intptr_t)this, false); m_magnetic_sensor->stop(); deactivate(); @@ -271,22 +271,22 @@ bool orientation_sensor::add_interval(int client_id, unsigned int interval) { AUTOLOCK(m_mutex); - m_accel_sensor->add_interval(client_id, interval, true); - m_gyro_sensor->add_interval(client_id, interval, true); - m_magnetic_sensor->add_interval(client_id, interval, true); + m_accel_sensor->add_interval(client_id, interval, false); + m_gyro_sensor->add_interval(client_id, interval, false); + m_magnetic_sensor->add_interval(client_id, interval, false); - return sensor_base::add_interval(client_id, interval, true); + return sensor_base::add_interval(client_id, interval, false); } bool orientation_sensor::delete_interval(int client_id) { AUTOLOCK(m_mutex); - m_accel_sensor->delete_interval(client_id, true); - m_gyro_sensor->delete_interval(client_id, true); - m_magnetic_sensor->delete_interval(client_id, true); + m_accel_sensor->delete_interval(client_id, false); + m_gyro_sensor->delete_interval(client_id, false); + m_magnetic_sensor->delete_interval(client_id, false); - return sensor_base::delete_interval(client_id, true); + return sensor_base::delete_interval(client_id, false); } void orientation_sensor::synthesize(const sensor_event_t &event, vector &outs) @@ -298,9 +298,9 @@ void orientation_sensor::synthesize(const sensor_event_t &event, vectorsensors.push_back(sensor); + return module; } diff --git a/src/orientation/orientation_sensor.h b/src/orientation/orientation_sensor.h index 4ae764f..c333e5c 100755 --- a/src/orientation/orientation_sensor.h +++ b/src/orientation/orientation_sensor.h @@ -58,7 +58,7 @@ private: float m_roll; float m_pitch; float m_azimuth; - unsigned long long m_timestamp; + unsigned long long m_time; unsigned int m_interval; string m_vendor; diff --git a/src/pressure/pressure_sensor.cpp b/src/pressure/pressure_sensor.cpp index d1f23a2..b70f48d 100755 --- a/src/pressure/pressure_sensor.cpp +++ b/src/pressure/pressure_sensor.cpp @@ -190,26 +190,27 @@ float pressure_sensor::pressure_to_altitude(float pressure) void pressure_sensor::raw_to_base(sensor_data_t &data) { + data.values[0] = data.values[0] * m_resolution; m_sea_level_pressure = data.values[1] * SEA_LEVEL_RESOLUTION; data.values[1] = pressure_to_altitude(data.values[0]); + data.values[2] = data.values[2] * m_temperature_resolution + m_temperature_offset; data.value_count = 3; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - pressure_sensor *inst; + pressure_sensor *sensor; try { - inst = new pressure_sensor(); + sensor = new(std::nothrow) pressure_sensor; } catch (int err) { - ERR("pressure_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (pressure_sensor*)inst;; + module->sensors.push_back(sensor); + return module; } diff --git a/src/pressure/pressure_sensor.h b/src/pressure/pressure_sensor.h index 6bd0f40..3430dfb 100755 --- a/src/pressure/pressure_sensor.h +++ b/src/pressure/pressure_sensor.h @@ -25,8 +25,7 @@ #include #include -class pressure_sensor : public physical_sensor -{ +class pressure_sensor : public physical_sensor { public: pressure_sensor(); virtual ~pressure_sensor(); diff --git a/src/pressure/pressure_sensor_hal.cpp b/src/pressure/pressure_sensor_hal.cpp index 6485dab..33aa181 100755 --- a/src/pressure/pressure_sensor_hal.cpp +++ b/src/pressure/pressure_sensor_hal.cpp @@ -21,16 +21,13 @@ #include #include #include -#include #include +#include #include -#include -#include using std::ifstream; -using std::string; -#define SENSOR_TYPE_PRESSURE "PRESSURE" +#define SENSOR_TYPE_PRESSURE "PRESSURE" #define ELEMENT_NAME "NAME" #define ELEMENT_VENDOR "VENDOR" #define ELEMENT_RAW_DATA_UNIT "RAW_DATA_UNIT" @@ -43,17 +40,9 @@ using std::string; #define SEA_LEVEL_PRESSURE 101325.0 -#define EVENT_EN_NODE "events/in_pressure_mag_either_en" -#define PRESSURE_SCALE "/in_pressure_scale" -#define PRESSURE_RAW "/in_pressure_raw" -#define TEMP_OFFSET "/in_temp_offset" -#define TEMP_SCALE "/in_temp_scale" -#define TEMP_RAW "/in_temp_raw" -#define NO_FLAG 0 -#define TIMEOUT 1 - pressure_sensor_hal::pressure_sensor_hal() : m_pressure(0) +, m_sea_level_pressure(SEA_LEVEL_PRESSURE) , m_temperature(0) , m_polling_interval(POLL_1HZ_MS) , m_fired_time(0) @@ -62,36 +51,36 @@ pressure_sensor_hal::pressure_sensor_hal() const string sensorhub_interval_node_name = "pressure_poll_delay"; csensor_config &config = csensor_config::get_instance(); - node_path_info_query query; - node_path_info info; - int input_method = IIO_METHOD; + node_info_query query; + node_info info; - if (!get_model_properties(SENSOR_TYPE_PRESSURE, m_model_id, input_method)) { - ERR("Failed to find model_properties"); + if (!find_model_id(SENSOR_TYPE_PRESSURE, m_model_id)) { + ERR("Failed to find model id"); throw ENXIO; } - query.input_method = input_method; query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); query.sensor_type = SENSOR_TYPE_PRESSURE; - query.input_event_key = "pressure_sensor"; - query.iio_enable_node_name = EVENT_EN_NODE; + query.key = "pressure_sensor"; + query.iio_enable_node_name = "pressure_enable"; query.sensorhub_interval_node_name = sensorhub_interval_node_name; - if (!get_node_path_info(query, info)) { + bool error = get_node_info(query, info); + + query.key = "barometer_sensor"; + error |= get_node_info(query, info); + + if (!error) { ERR("Failed to get node info"); throw ENXIO; } + + show_node_info(info); + m_data_node = info.data_node_path; - m_pressure_dir = info.base_dir; m_enable_node = info.enable_node_path; - m_pressure_node = m_pressure_dir + string(PRESSURE_RAW); - m_temp_node = m_pressure_dir + string(TEMP_RAW); - - INFO("m_data_node:%s",m_data_node.c_str()); - INFO("m_pressure_dir:%s",m_pressure_dir.c_str()); - INFO("m_enable_node:%s",m_enable_node.c_str()); + m_interval_node = info.interval_node_path; if (!config.get(SENSOR_TYPE_PRESSURE, m_model_id, ELEMENT_VENDOR, m_vendor)) { ERR("[VENDOR] is empty\n"); @@ -137,39 +126,14 @@ pressure_sensor_hal::pressure_sensor_hal() m_raw_data_unit = (float)(raw_data_unit); INFO("m_raw_data_unit = %f\n", m_raw_data_unit); - string file_name; - - file_name = m_pressure_dir + string(TEMP_SCALE); - if (!read_node_value(file_name, m_temp_scale)) - throw ENXIO; - - file_name = m_pressure_dir + string(TEMP_OFFSET); - if (!read_node_value(file_name, m_temp_offset)) - throw ENXIO; - - file_name = m_pressure_dir + string(PRESSURE_SCALE); - if (!read_node_value(file_name, m_pressure_scale)) - throw ENXIO; - - INFO("Temperature scale:%d", m_temp_scale); - INFO("Temperature offset:%f", m_temp_offset); - INFO("Pressure scale:%d", m_pressure_scale); - - int fd, ret; - fd = open(m_data_node.c_str(), NO_FLAG); - if (fd == -1) { - ERR("Could not open event resource"); + if ((m_node_handle = open(m_data_node.c_str(),O_RDWR)) < 0) { + ERR("Failed to open handle(%d)", m_node_handle); throw ENXIO; } - ret = ioctl(fd, IOCTL_IIO_EVENT_FD, &m_node_handle); - - close(fd); - - if ((ret == -1) || (m_node_handle == -1)) { - ERR("Failed to retrieve node handle from event node: %s", m_data_node.c_str()); - throw ENXIO; - } + int clockId = CLOCK_MONOTONIC; + if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) + ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); INFO("pressure_sensor_hal is created!\n"); } @@ -195,7 +159,9 @@ sensor_type_t pressure_sensor_hal::get_type(void) bool pressure_sensor_hal::enable(void) { AUTOLOCK(m_mutex); - update_sysfs_num(m_enable_node.c_str(), true); + + set_enable_node(m_enable_node, m_sensorhub_controlled, true, SENSORHUB_PRESSURE_ENABLE_BIT); + set_interval(m_polling_interval); m_fired_time = 0; @@ -207,7 +173,7 @@ bool pressure_sensor_hal::disable(void) { AUTOLOCK(m_mutex); - update_sysfs_num(m_enable_node.c_str(), false); + set_enable_node(m_enable_node, m_sensorhub_controlled, false, SENSORHUB_PRESSURE_ENABLE_BIT); INFO("Pressure sensor real stopping"); return true; @@ -215,71 +181,90 @@ bool pressure_sensor_hal::disable(void) bool pressure_sensor_hal::set_interval(unsigned long val) { - INFO("set_interval not supported"); - return true; -} + unsigned long long polling_interval_ns; -bool pressure_sensor_hal::update_value(bool wait) -{ - iio_event_t pressure_event; - fd_set readfds, exceptfds; - struct timeval tv; - int raw_pressure_count; - int raw_temp_count; - int ret; - - FD_ZERO(&readfds); - FD_ZERO(&exceptfds); - FD_SET(m_node_handle, &readfds); - FD_SET(m_node_handle, &exceptfds); - - if (wait) { - tv.tv_sec = TIMEOUT; - tv.tv_usec = 0; - } - else { - tv.tv_sec = 0; - tv.tv_usec = 0; - } + AUTOLOCK(m_mutex); - ret = select(m_node_handle + 1, &readfds, NULL, &exceptfds, &tv); + polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu); - if (ret == -1) { - ERR("select error:%s m_node_handle:d", strerror(errno), m_node_handle); - return false; - } - else if (!ret) { - DBG("select timeout"); + if (!set_node_value(m_interval_node, polling_interval_ns)) { + ERR("Failed to set polling resource: %s\n", m_interval_node.c_str()); return false; } - if (FD_ISSET(m_node_handle, &exceptfds)) { - ERR("select exception occurred!"); - return false; - } + INFO("Interval is changed from %dms to %dms]", m_polling_interval, val); + m_polling_interval = val; + return true; +} - if (FD_ISSET(m_node_handle, &readfds)) { - INFO("pressure event detection!"); +bool pressure_sensor_hal::update_value(bool wait) +{ + int pressure_raw[3] = {0,}; + bool pressure = false; + bool sea_level = false; + bool temperature = false; + int read_input_cnt = 0; + const int INPUT_MAX_BEFORE_SYN = 10; + unsigned long long fired_time = 0; + bool syn = false; + + struct input_event pressure_event; + DBG("pressure event detection!"); + + while ((syn == false) && (read_input_cnt < INPUT_MAX_BEFORE_SYN)) { int len = read(m_node_handle, &pressure_event, sizeof(pressure_event)); - - if (len == -1) { - ERR("Error in read(m_event_fd):%s.", strerror(errno)); + if (len != sizeof(pressure_event)) { + ERR("pressure_file read fail, read_len = %d\n",len); return false; } - m_fired_time = pressure_event.timestamp; - if (!read_node_value(m_pressure_node, raw_pressure_count)) - return false; - if (!read_node_value(m_temp_node, raw_temp_count)) + + ++read_input_cnt; + + if (pressure_event.type == EV_REL) { + switch (pressure_event.code) { + case REL_X: + case REL_HWHEEL: + pressure_raw[0] = (int)pressure_event.value; + pressure = true; + break; + case REL_Y: + case REL_DIAL: + pressure_raw[1] = (int)pressure_event.value; + sea_level = true; + break; + case REL_Z: + case REL_WHEEL: + pressure_raw[2] = (int)pressure_event.value; + temperature = true; + break; + default: + ERR("pressure_event event[type = %d, code = %d] is unknown.", pressure_event.type, pressure_event.code); + return false; + break; + } + } else if (pressure_event.type == EV_SYN) { + syn = true; + fired_time = sensor_hal::get_timestamp(&pressure_event.time); + } else { + ERR("pressure_event event[type = %d, code = %d] is unknown.", pressure_event.type, pressure_event.code); return false; - m_pressure = ((float)raw_pressure_count)/((float)m_pressure_scale); - m_temperature = m_temp_offset + ((float)raw_temp_count)/((float)m_temp_scale); - } - else { - ERR("No pressure event data available to read"); - return false; + } } - return true; + AUTOLOCK(m_value_mutex); + + if (pressure) + m_pressure = pressure_raw[0]; + if (sea_level) + m_sea_level_pressure = pressure_raw[1]; + if (temperature) + m_temperature = pressure_raw[2]; + + m_fired_time = fired_time; + + DBG("m_pressure = %d, sea_level = %d, temperature = %d, time = %lluus", m_pressure, m_sea_level_pressure, m_temperature, m_fired_time); + + return true; } bool pressure_sensor_hal::is_data_ready(bool wait) @@ -296,7 +281,7 @@ int pressure_sensor_hal::get_sensor_data(sensor_data_t &data) data.timestamp = m_fired_time ; data.value_count = 3; data.values[0] = m_pressure; - data.values[1] = SEA_LEVEL_PRESSURE; + data.values[1] = m_sea_level_pressure; data.values[2] = m_temperature; return 0; @@ -316,21 +301,20 @@ bool pressure_sensor_hal::get_properties(sensor_properties_s &properties) return true; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - pressure_sensor_hal *inst; + pressure_sensor_hal *sensor; try { - inst = new pressure_sensor_hal(); + sensor = new(std::nothrow) pressure_sensor_hal; } catch (int err) { - ERR("pressure_sensor_hal class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (pressure_sensor_hal*)inst; + module->sensors.push_back(sensor); + return module; } diff --git a/src/pressure/pressure_sensor_hal.h b/src/pressure/pressure_sensor_hal.h index 28c5d87..04412fc 100755 --- a/src/pressure/pressure_sensor_hal.h +++ b/src/pressure/pressure_sensor_hal.h @@ -32,23 +32,20 @@ public: virtual ~pressure_sensor_hal(); string get_model_id(void); sensor_type_t get_type(void); + bool enable(void); bool disable(void); bool set_interval(unsigned long val); bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); virtual bool get_properties(sensor_properties_s &properties); - private: string m_model_id; string m_vendor; string m_chip_name; - int m_pressure_scale; float m_pressure; - - int m_temp_scale; - float m_temp_offset; + float m_sea_level_pressure; float m_temperature; int m_resolution; @@ -56,7 +53,8 @@ private: float m_min_range; float m_max_range; float m_raw_data_unit; - + float m_temp_resolution; + float m_temp_offset; unsigned long m_polling_interval; unsigned long long m_fired_time; @@ -66,10 +64,6 @@ private: string m_data_node; string m_interval_node; - string m_pressure_dir; - string m_pressure_node; - string m_temp_node; - bool m_sensorhub_controlled; cmutex m_value_mutex; diff --git a/src/proxi/proxi_sensor.cpp b/src/proxi/proxi_sensor.cpp index 4db701a..31ef1d6 100755 --- a/src/proxi/proxi_sensor.cpp +++ b/src/proxi/proxi_sensor.cpp @@ -94,7 +94,7 @@ bool proxi_sensor::process_event(void) if (get_client_cnt(PROXIMITY_EVENT_CHANGE_STATE)) { event.event_type = PROXIMITY_EVENT_CHANGE_STATE; - raw_to_state(event.data); + raw_to_base(event.data); push(event); } } @@ -146,39 +146,31 @@ int proxi_sensor::get_sensor_data(unsigned int type, sensor_data_t &data) return -1; } - if (type == PROXIMITY_DISTANCE_DATA_SET) { - raw_to_base(data); - return 0; - } + raw_to_base(data); return 0; } void proxi_sensor::raw_to_base(sensor_data_t &data) { - data.values[0] = (float)((PROXIMITY_STATE_NEAR - data.values[0]) * 5); -} - -void proxi_sensor::raw_to_state(sensor_data_t &data) -{ + data.values[0] = (float)(data.values[0] * 5); data.value_count = 1; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - proxi_sensor *inst; + proxi_sensor *sensor; try { - inst = new proxi_sensor(); + sensor = new(std::nothrow) proxi_sensor; } catch (int err) { - ERR("proxi_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (proxi_sensor*)inst; + module->sensors.push_back(sensor); + return module; } diff --git a/src/proxi/proxi_sensor.h b/src/proxi/proxi_sensor.h index 9a45e72..8584f2d 100755 --- a/src/proxi/proxi_sensor.h +++ b/src/proxi/proxi_sensor.h @@ -52,4 +52,4 @@ private: bool process_event(void); }; -#endif +#endif // _PROXI_SENSOR_H_ diff --git a/src/proxi/proxi_sensor_hal.cpp b/src/proxi/proxi_sensor_hal.cpp index 73bdd75..aee3f7a 100755 --- a/src/proxi/proxi_sensor_hal.cpp +++ b/src/proxi/proxi_sensor_hal.cpp @@ -24,16 +24,9 @@ #include #include #include -#include using std::ifstream; -#define NO_FLAG 0 -#define PROXIMITY_TYPE 8 - -#define EVENT_DIR "events/" -#define EVENT_EN_NODE "in_proximity_thresh_either_en" - #define SENSOR_TYPE_PROXI "PROXI" #define ELEMENT_NAME "NAME" #define ELEMENT_VENDOR "VENDOR" @@ -49,33 +42,30 @@ proxi_sensor_hal::proxi_sensor_hal() const string sensorhub_interval_node_name = "prox_poll_delay"; csensor_config &config = csensor_config::get_instance(); - node_path_info_query query; - node_path_info info; - int input_method = IIO_METHOD; + node_info_query query; + node_info info; - if (!get_model_properties(SENSOR_TYPE_PROXI, m_model_id, input_method)) { - ERR("Failed to find model_properties"); + if (!find_model_id(SENSOR_TYPE_PROXI, m_model_id)) { + ERR("Failed to find model id"); throw ENXIO; } - query.input_method = input_method; - query.sensorhub_controlled = m_sensorhub_controlled = false; + query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); query.sensor_type = SENSOR_TYPE_PROXI; - query.input_event_key = "proximity_sensor"; + query.key = "proximity_sensor"; query.iio_enable_node_name = "proximity_enable"; query.sensorhub_interval_node_name = sensorhub_interval_node_name; - if (!get_node_path_info(query, info)) { + if (!get_node_info(query, info)) { ERR("Failed to get node info"); throw ENXIO; } - m_data_node = info.data_node_path; - m_enable_node = info.base_dir + string(EVENT_DIR) + string(EVENT_EN_NODE); + show_node_info(info); - INFO("data node: %s",m_data_node.c_str()); - INFO("enable node: %s",m_enable_node.c_str()); + m_data_node = info.data_node_path; + m_enable_node = info.enable_node_path; if (!config.get(SENSOR_TYPE_PROXI, m_model_id, ELEMENT_VENDOR, m_vendor)) { ERR("[VENDOR] is empty\n"); @@ -91,21 +81,14 @@ proxi_sensor_hal::proxi_sensor_hal() INFO("m_chip_name = %s\n",m_chip_name.c_str()); - int fd, ret; - fd = open(m_data_node.c_str(), NO_FLAG); - if (fd == -1) { - ERR("Could not open event resource"); + if ((m_node_handle = open(m_data_node.c_str(), O_RDWR)) < 0) { + ERR("Proxi handle(%d) open fail", m_node_handle); throw ENXIO; } - ret = ioctl(fd, IOCTL_IIO_EVENT_FD, &m_node_handle); - - close(fd); - - if ((ret == -1) || (m_node_handle == -1)) { - ERR("Failed to retrieve event fd"); - throw ENXIO; - } + int clockId = CLOCK_MONOTONIC; + if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) + ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); INFO("Proxi_sensor_hal is created!\n"); @@ -129,17 +112,11 @@ sensor_type_t proxi_sensor_hal::get_type(void) return PROXIMITY_SENSOR; } -bool proxi_sensor_hal::enable_resource(bool enable) -{ - update_sysfs_num(m_enable_node.c_str(), enable); - return true; -} - bool proxi_sensor_hal::enable(void) { AUTOLOCK(m_mutex); - enable_resource(true); + set_enable_node(m_enable_node, m_sensorhub_controlled, true, SENSORHUB_PROXIMITY_ENABLE_BIT); m_fired_time = 0; INFO("Proxi sensor real starting"); @@ -150,7 +127,7 @@ bool proxi_sensor_hal::disable(void) { AUTOLOCK(m_mutex); - enable_resource(true); + set_enable_node(m_enable_node, m_sensorhub_controlled, false, SENSORHUB_PROXIMITY_ENABLE_BIT); INFO("Proxi sensor real stopping"); return true; @@ -158,63 +135,31 @@ bool proxi_sensor_hal::disable(void) bool proxi_sensor_hal::update_value(bool wait) { - iio_event_t proxi_event; - fd_set readfds, exceptfds; + struct input_event proxi_event; + INFO("proxi event detection!"); - FD_ZERO(&readfds); - FD_ZERO(&exceptfds); - FD_SET(m_node_handle, &readfds); - FD_SET(m_node_handle, &exceptfds); + int len = read(m_node_handle, &proxi_event, sizeof(proxi_event)); - int ret; - ret = select(m_node_handle + 1, &readfds, NULL, &exceptfds, NULL); - - if (ret == -1) { - ERR("select error:%s m_node_handle:%d", strerror(errno), m_node_handle); - return false; - } - else if (!ret) { - DBG("select timeout"); - return false; - } - - if (FD_ISSET(m_node_handle, &exceptfds)) { - ERR("select exception occurred!"); + if (len == -1) { + DBG("read(m_node_handle) is error:%s.\n", strerror(errno)); return false; } - if (FD_ISSET(m_node_handle, &readfds)) { - INFO("proximity event detection!"); - int len = read(m_node_handle, &proxi_event, sizeof(proxi_event)); - - if (len == -1) { - DBG("Error in read(m_node_handle):%s.", strerror(errno)); + DBG("read event, len : %d , type : %x , code : %x , value : %x", len, proxi_event.type, proxi_event.code, proxi_event.value); + if ((proxi_event.type == EV_ABS) && (proxi_event.code == PROXI_CODE)) { + AUTOLOCK(m_value_mutex); + if (proxi_event.value == PROXIMITY_NODE_STATE_FAR) { + INFO("PROXIMITY_STATE_FAR state occured\n"); + m_state = PROXIMITY_STATE_FAR; + } else if (proxi_event.value == PROXIMITY_NODE_STATE_NEAR) { + INFO("PROXIMITY_STATE_NEAR state occured\n"); + m_state = PROXIMITY_STATE_NEAR; + } else { + ERR("PROXIMITY_STATE Unknown: %d\n",proxi_event.value); return false; } - - ull_bytes_t ev_data; - ev_data.num = proxi_event.event_id; - if (ev_data.bytes[CH_TYPE] == PROXIMITY_TYPE) { - AUTOLOCK(m_value_mutex); - int temp; - temp = GET_DIR_VAL(ev_data.bytes[DIRECTION]); - if (temp == PROXIMITY_NODE_STATE_FAR) { - INFO("PROXIMITY_STATE_FAR state occurred"); - m_state = PROXIMITY_STATE_FAR; - } - else if (temp == PROXIMITY_NODE_STATE_NEAR) { - INFO("PROXIMITY_STATE_NEAR state occurred"); - m_state = PROXIMITY_STATE_NEAR; - } - else { - ERR("PROXIMITY_STATE Unknown: %d", proxi_event.event_id); - return false; - } - } - m_fired_time = proxi_event.timestamp; - } - else { - ERR("No proximity event data available to read"); + m_fired_time = sensor_hal::get_timestamp(&proxi_event.time); + } else { return false; } return true; @@ -251,21 +196,20 @@ bool proxi_sensor_hal::get_properties(sensor_properties_s &properties) return true; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - proxi_sensor_hal *inst; + proxi_sensor_hal *sensor; try { - inst = new proxi_sensor_hal(); + sensor = new(std::nothrow) proxi_sensor_hal; } catch (int err) { - ERR("proxi_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (proxi_sensor_hal*)inst; + module->sensors.push_back(sensor); + return module; } diff --git a/src/proxi/proxi_sensor_hal.h b/src/proxi/proxi_sensor_hal.h index 17d8182..ebb24b9 100755 --- a/src/proxi/proxi_sensor_hal.h +++ b/src/proxi/proxi_sensor_hal.h @@ -60,6 +60,5 @@ private: cmutex m_value_mutex; bool update_value(bool wait); - bool enable_resource(bool enable); }; #endif /*_PROXI_SENSOR_HAL_H_*/ diff --git a/src/rotation_vector/CMakeLists.txt b/src/rotation_vector/CMakeLists.txt index c111931..7a527a7 100644 --- a/src/rotation_vector/CMakeLists.txt +++ b/src/rotation_vector/CMakeLists.txt @@ -1,4 +1,3 @@ IF("${RV}" STREQUAL "ON") add_subdirectory(rv) ENDIF() - diff --git a/src/rotation_vector/rv/rv_sensor.cpp b/src/rotation_vector/rv/rv_sensor.cpp index e5d0a0e..933b8b1 100755 --- a/src/rotation_vector/rv/rv_sensor.cpp +++ b/src/rotation_vector/rv/rv_sensor.cpp @@ -203,13 +203,13 @@ bool rv_sensor::on_start(void) AUTOLOCK(m_mutex); m_accel_sensor->add_client(ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME); - m_accel_sensor->add_interval((int)this, (m_interval/MS_TO_US), false); + m_accel_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), false); m_accel_sensor->start(); m_gyro_sensor->add_client(GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME); - m_gyro_sensor->add_interval((int)this, (m_interval/MS_TO_US), false); + m_gyro_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), false); m_gyro_sensor->start(); m_magnetic_sensor->add_client(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME); - m_magnetic_sensor->add_interval((int)this, (m_interval/MS_TO_US), false); + m_magnetic_sensor->add_interval((intptr_t)this, (m_interval/MS_TO_US), false); m_magnetic_sensor->start(); activate(); @@ -221,13 +221,13 @@ bool rv_sensor::on_stop(void) AUTOLOCK(m_mutex); m_accel_sensor->delete_client(ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME); - m_accel_sensor->delete_interval((int)this, false); + m_accel_sensor->delete_interval((intptr_t)this, false); m_accel_sensor->stop(); m_gyro_sensor->delete_client(GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME); - m_gyro_sensor->delete_interval((int)this, false); + m_gyro_sensor->delete_interval((intptr_t)this, false); m_gyro_sensor->stop(); m_magnetic_sensor->delete_client(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME); - m_magnetic_sensor->delete_interval((int)this, false); + m_magnetic_sensor->delete_interval((intptr_t)this, false); m_magnetic_sensor->stop(); deactivate(); diff --git a/src/rotation_vector/rv_raw/CMakeLists.txt b/src/rotation_vector/rv_raw/CMakeLists.txt new file mode 100755 index 0000000..223b8c8 --- /dev/null +++ b/src/rotation_vector/rv_raw/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 2.6) +project(rv_raw CXX) + +SET(SENSOR_NAME rv_raw_sensor) +SET(SENSOR_HAL_NAME rv_raw_sensor_hal) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) + +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(rv_raw_pkgs REQUIRED vconf) + +FOREACH(flag ${rv_raw_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +FOREACH(flag ${rv_raw_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +add_library(${SENSOR_NAME} SHARED + rv_raw_sensor.cpp +) + +add_library(${SENSOR_HAL_NAME} SHARED + rv_raw_sensor_hal.cpp +) + +target_link_libraries(${SENSOR_NAME} ${rv_raw_pkgs_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_HAL_NAME} ${rv_raw_pkgs_LDFLAGS}) + +install(TARGETS ${SENSOR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) +install(TARGETS ${SENSOR_HAL_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/sensord) diff --git a/src/rotation_vector/rv_raw/rv_raw_sensor.cpp b/src/rotation_vector/rv_raw/rv_raw_sensor.cpp new file mode 100755 index 0000000..3e017ce --- /dev/null +++ b/src/rotation_vector/rv_raw/rv_raw_sensor.cpp @@ -0,0 +1,166 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include +#include + +#define SENSOR_NAME "RV_RAW_SENSOR" + +rv_raw_sensor::rv_raw_sensor() +: m_sensor_hal(NULL) +{ + m_name = string(SENSOR_NAME); + + register_supported_event(RV_RAW_EVENT_RAW_DATA_REPORT_ON_TIME); + register_supported_event(RV_RAW_EVENT_CALIBRATION_NEEDED); + + physical_sensor::set_poller(rv_raw_sensor::working, this); +} + +rv_raw_sensor::~rv_raw_sensor() +{ + INFO("rv_raw_sensor is destroyed!\n"); +} + +bool rv_raw_sensor::init() +{ + m_sensor_hal = sensor_plugin_loader::get_instance().get_sensor_hal(RV_RAW_SENSOR); + + if (!m_sensor_hal) { + ERR("cannot load sensor_hal[%s]", sensor_base::get_name()); + return false; + } + + sensor_properties_t properties; + + if (!m_sensor_hal->get_properties(properties)) { + ERR("sensor->get_properties() is failed!\n"); + return false; + } + + set_privilege(SENSOR_PRIVILEGE_INTERNAL); + + INFO("%s is created!\n", sensor_base::get_name()); + + return true; +} + +sensor_type_t rv_raw_sensor::get_type(void) +{ + return RV_RAW_SENSOR; +} + +bool rv_raw_sensor::working(void *inst) +{ + rv_raw_sensor *sensor = (rv_raw_sensor*)inst; + return sensor->process_event();; +} + +bool rv_raw_sensor::process_event(void) +{ + sensor_event_t event; + + if (!m_sensor_hal->is_data_ready(true)) + return true; + + m_sensor_hal->get_sensor_data(event.data); + + AUTOLOCK(m_client_info_mutex); + AUTOLOCK(m_mutex); + + if (get_client_cnt(RV_RAW_EVENT_RAW_DATA_REPORT_ON_TIME)) { + event.sensor_id = get_id(); + event.event_type = RV_RAW_EVENT_RAW_DATA_REPORT_ON_TIME; + push(event); + } + + return true; +} + +bool rv_raw_sensor::on_start(void) +{ + if (!m_sensor_hal->enable()) { + ERR("m_sensor_hal start fail\n"); + return false; + } + + return start_poll(); +} + +bool rv_raw_sensor::on_stop(void) +{ + if (!m_sensor_hal->disable()) { + ERR("m_sensor_hal stop fail\n"); + return false; + } + + return stop_poll(); +} + +bool rv_raw_sensor::get_properties(sensor_properties_t &properties) +{ + return m_sensor_hal->get_properties(properties); +} + +int rv_raw_sensor::get_sensor_data(unsigned int type, sensor_data_t &data) +{ + int state; + + if (type != RV_RAW_BASE_DATA_SET) + return -1; + + state = m_sensor_hal->get_sensor_data(data); + + if (state < 0) { + ERR("m_sensor_hal get struct_data fail\n"); + return -1; + } + + return 0; +} + +bool rv_raw_sensor::set_interval(unsigned long interval) +{ + AUTOLOCK(m_mutex); + + INFO("Polling interval is set to %dms", interval); + + return m_sensor_hal->set_interval(interval); +} + +extern "C" sensor_module* create(void) +{ + rv_raw_sensor *sensor; + + try { + sensor = new(std::nothrow) rv_raw_sensor; + } catch (int err) { + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); + return NULL; + } + + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); + + module->sensors.push_back(sensor); + return module; +} diff --git a/src/rotation_vector/rv_raw/rv_raw_sensor.h b/src/rotation_vector/rv_raw/rv_raw_sensor.h new file mode 100755 index 0000000..4d04a4b --- /dev/null +++ b/src/rotation_vector/rv_raw/rv_raw_sensor.h @@ -0,0 +1,50 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _RV_RAW_SENSOR_H_ +#define _RV_RAW_SENSOR_H_ + +#include + +#include +#include + +class rv_raw_sensor : public physical_sensor { +public: + rv_raw_sensor(); + virtual ~rv_raw_sensor(); + + virtual bool init(); + virtual sensor_type_t get_type(void); + + static bool working(void *inst); + + virtual bool set_interval(unsigned long interval); + virtual bool get_properties(sensor_properties_t &properties); + int get_sensor_data(unsigned int type, sensor_data_t &data); +private: + sensor_hal *m_sensor_hal; + + virtual bool on_start(void); + virtual bool on_stop(void); + + bool process_event(void); +}; + +#endif /*_RV_RAW_SENSOR_H_*/ diff --git a/src/rotation_vector/rv_raw/rv_raw_sensor_hal.cpp b/src/rotation_vector/rv_raw/rv_raw_sensor_hal.cpp new file mode 100755 index 0000000..261a81e --- /dev/null +++ b/src/rotation_vector/rv_raw/rv_raw_sensor_hal.cpp @@ -0,0 +1,288 @@ +/* + * rv_raw_sensor_hal + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include + +using std::ifstream; + +#define SENSOR_TYPE_RV_RAW "ROTATION_VECTOR" +#define ELEMENT_NAME "NAME" +#define ELEMENT_VENDOR "VENDOR" +#define ATTR_VALUE "value" + +rv_raw_sensor_hal::rv_raw_sensor_hal() +: m_quat_a(0) +, m_quat_b(0) +, m_quat_c(0) +, m_quat_d(0) +, m_polling_interval(POLL_1HZ_MS) +{ + const string sensorhub_interval_node_name = "rot_poll_delay"; + csensor_config &config = csensor_config::get_instance(); + + node_info_query query; + node_info info; + + if (!find_model_id(SENSOR_TYPE_RV_RAW, m_model_id)) { + ERR("Failed to find model id"); + throw ENXIO; + + } + + query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); + query.sensor_type = SENSOR_TYPE_RV_RAW; + query.key = "rot_sensor"; + query.iio_enable_node_name = "rot_enable"; + query.sensorhub_interval_node_name = sensorhub_interval_node_name; + + if (!get_node_info(query, info)) { + ERR("Failed to get node info"); + throw ENXIO; + } + + show_node_info(info); + + m_data_node = info.data_node_path; + m_enable_node = info.enable_node_path; + m_interval_node = info.interval_node_path; + + if (!config.get(SENSOR_TYPE_RV_RAW, m_model_id, ELEMENT_VENDOR, m_vendor)) { + ERR("[VENDOR] is empty\n"); + throw ENXIO; + } + + INFO("m_vendor = %s", m_vendor.c_str()); + + if (!config.get(SENSOR_TYPE_RV_RAW, m_model_id, ELEMENT_NAME, m_chip_name)) { + ERR("[NAME] is empty\n"); + throw ENXIO; + } + + INFO("m_chip_name = %s", m_chip_name.c_str()); + + if ((m_node_handle = open(m_data_node.c_str(),O_RDWR)) < 0) { + ERR("Failed to open handle(%d)", m_node_handle); + throw ENXIO; + } + + int clockId = CLOCK_MONOTONIC; + if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) + ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); + + INFO("rv_raw_sensor_hal is created!\n"); + +} + +rv_raw_sensor_hal::~rv_raw_sensor_hal() +{ + close(m_node_handle); + m_node_handle = -1; + + INFO("rv_raw_sensor_hal is destroyed!\n"); +} + +string rv_raw_sensor_hal::get_model_id(void) +{ + return m_model_id; +} + +sensor_type_t rv_raw_sensor_hal::get_type(void) +{ + return RV_RAW_SENSOR; +} + +bool rv_raw_sensor_hal::enable(void) +{ + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, true, SENSORHUB_ROTATION_VECTOR_ENABLE_BIT); + set_interval(m_polling_interval); + + m_fired_time = 0; + INFO("Rotation vector raw sensor real starting"); + return true; +} + +bool rv_raw_sensor_hal::disable(void) +{ + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, false, SENSORHUB_ROTATION_VECTOR_ENABLE_BIT); + + INFO("Rotation vector raw sensor real stopping"); + return true; +} + +bool rv_raw_sensor_hal::set_interval(unsigned long val) +{ + unsigned long long polling_interval_ns; + + AUTOLOCK(m_mutex); + + polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu); + + if (!set_node_value(m_interval_node, polling_interval_ns)) { + ERR("Failed to set polling resource: %s\n", m_interval_node.c_str()); + return false; + } + + INFO("Interval is changed from %dms to %dms]", m_polling_interval, val); + m_polling_interval = val; + return true; + +} + +bool rv_raw_sensor_hal::update_value(bool wait) +{ + int rot_raw[5] = {0,}; + bool quat_a,quat_b,quat_c,quat_d,acc_rot; + int read_input_cnt = 0; + const int INPUT_MAX_BEFORE_SYN = 10; + unsigned long long fired_time = 0; + bool syn = false; + + quat_a = quat_b = quat_c = quat_d = acc_rot = false; + + struct input_event rot_input; + DBG("geo event detection!"); + + while ((syn == false) && (read_input_cnt < INPUT_MAX_BEFORE_SYN)) { + int len = read(m_node_handle, &rot_input, sizeof(rot_input)); + if (len != sizeof(rot_input)) { + ERR("rot_file read fail, read_len = %d\n",len); + return false; + } + + ++read_input_cnt; + + if (rot_input.type == EV_REL) { + switch (rot_input.code) { + case REL_X: + rot_raw[0] = (int)rot_input.value; + quat_a = true; + break; + case REL_Y: + rot_raw[1] = (int)rot_input.value; + quat_b = true; + break; + case REL_Z: + rot_raw[2] = (int)rot_input.value; + quat_c = true; + break; + case REL_RX: + rot_raw[3] = (int)rot_input.value; + quat_d = true; + break; + case REL_RY: + rot_raw[4] = (int)rot_input.value; + acc_rot = true; + break; + default: + ERR("rot_input event[type = %d, code = %d] is unknown.", rot_input.type, rot_input.code); + return false; + break; + } + } else if (rot_input.type == EV_SYN) { + syn = true; + fired_time = get_timestamp(&rot_input.time); + } else { + ERR("rot_input event[type = %d, code = %d] is unknown.", rot_input.type, rot_input.code); + return false; + } + } + + AUTOLOCK(m_value_mutex); + + if (quat_a) + m_quat_a = rot_raw[0]; + if (quat_b) + m_quat_b = rot_raw[1]; + if (quat_c) + m_quat_c = rot_raw[2]; + if (quat_d) + m_quat_d = rot_raw[3]; + if (acc_rot) + m_accuracy = rot_raw[4] - 1; /* accuracy bias: -1 */ + + m_fired_time = fired_time; + + DBG("m_quat_a = %d, m_quat_a = %d, m_quat_a = %d, m_quat_d = %d, m_accuracy = %d, time = %lluus", + m_quat_a, m_quat_a, m_quat_a, m_quat_d, m_accuracy, m_fired_time); + + return true; +} + + +bool rv_raw_sensor_hal::is_data_ready(bool wait) +{ + bool ret; + ret = update_value(wait); + return ret; +} + +int rv_raw_sensor_hal::get_sensor_data(sensor_data_t &data) +{ + const float QUAT_SIG_FIGS = 1000000.0f; + + data.accuracy = (m_accuracy == 1) ? 0 : m_accuracy; /* hdst 0 and 1 are needed to calibrate */ + data.timestamp = m_fired_time; + data.value_count = 4; + data.values[0] = (float)m_quat_a / QUAT_SIG_FIGS; + data.values[1] = (float)m_quat_b / QUAT_SIG_FIGS; + data.values[2] = (float)m_quat_c / QUAT_SIG_FIGS; + data.values[3] = (float)m_quat_d / QUAT_SIG_FIGS; + return 0; +} + +bool rv_raw_sensor_hal::get_properties(sensor_properties_t &properties) +{ + properties.name = m_chip_name; + properties.vendor = m_vendor; + properties.min_range = 0; + properties.max_range = 1200; + properties.min_interval = 1; + properties.resolution = 1; + properties.fifo_count = 0; + properties.max_batch_count = 0; + return true; +} + +extern "C" sensor_module* create(void) +{ + rv_raw_sensor_hal *sensor; + + try { + sensor = new(std::nothrow) rv_raw_sensor_hal; + } catch (int err) { + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); + return NULL; + } + + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); + + module->sensors.push_back(sensor); + return module; +} diff --git a/src/rotation_vector/rv_raw/rv_raw_sensor_hal.h b/src/rotation_vector/rv_raw/rv_raw_sensor_hal.h new file mode 100755 index 0000000..565b509 --- /dev/null +++ b/src/rotation_vector/rv_raw/rv_raw_sensor_hal.h @@ -0,0 +1,68 @@ +/* + * rv_raw_sensor_hal + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _RV_RAW_SENSOR_HAL_H_ +#define _RV_RAW_SENSOR_HAL_H_ + +#include +#include + +using std::string; + +class rv_raw_sensor_hal : public sensor_hal +{ +public: + rv_raw_sensor_hal(); + virtual ~rv_raw_sensor_hal(); + string get_model_id(void); + sensor_type_t get_type(void); + bool enable(void); + bool disable(void); + bool set_interval(unsigned long val); + bool is_data_ready(bool wait); + virtual int get_sensor_data(sensor_data_t &data); + virtual bool get_properties(sensor_properties_t &properties); +private: + string m_model_id; + string m_vendor; + string m_chip_name; + + unsigned long m_polling_interval; + + int m_quat_a; + int m_quat_b; + int m_quat_c; + int m_quat_d; + int m_accuracy; + + unsigned long long m_fired_time; + int m_node_handle; + + string m_enable_node; + string m_data_node; + string m_interval_node; + + bool m_sensorhub_controlled; + + cmutex m_value_mutex; + + bool update_value(bool wait); +}; +#endif /*_RV_RAW_SENSOR_HAL_H_*/ + diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 2b01530..a404c76 100755 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -22,6 +22,7 @@ SET(SERVER_SRCS dbus_util.cpp server.cpp command_worker.cpp + permission_checker.cpp main.cpp ) diff --git a/src/server/command_worker.cpp b/src/server/command_worker.cpp index 4c3adab..1c40395 100755 --- a/src/server/command_worker.cpp +++ b/src/server/command_worker.cpp @@ -29,24 +29,17 @@ #include #include #include -#include -#include +#include -using namespace std; using std::string; -using std::set; using std::make_pair; -#define SECURITY_LIB "/usr/lib/libsecurity-server-client.so.1" - -set priority_list; - -void *command_worker::m_security_handle = NULL; -command_worker::security_server_check_privilege_by_sockfd_t command_worker::security_server_check_privilege_by_sockfd = NULL; command_worker::cmd_handler_t command_worker::m_cmd_handlers[]; sensor_raw_data_map command_worker::m_sensor_raw_data_map; cpacket command_worker::m_sensor_list; +set priority_list; + command_worker::command_worker(const csocket& socket) : m_client_id(CLIENT_ID_INVALID) , m_permission(SENSOR_PERMISSION_NONE) @@ -56,7 +49,6 @@ command_worker::command_worker(const csocket& socket) static bool init = false; if (!init) { - init_security_lib(); init_cmd_handlers(); make_sensor_raw_data_map(); @@ -79,26 +71,6 @@ bool command_worker::start(void) return m_worker.start(); } -void command_worker::init_security_lib(void) -{ - m_security_handle = dlopen(SECURITY_LIB, RTLD_LAZY); - - if (!m_security_handle) { - ERR("dlopen(%s) error, cause: %s", SECURITY_LIB, dlerror()); - return; - } - - security_server_check_privilege_by_sockfd = - (security_server_check_privilege_by_sockfd_t) dlsym(m_security_handle, "security_server_check_privilege_by_sockfd"); - - if (!security_server_check_privilege_by_sockfd) { - ERR("Failed to load symbol"); - dlclose(m_security_handle); - m_security_handle = NULL; - return; - } -} - void command_worker::init_cmd_handlers(void) { m_cmd_handlers[CMD_GET_ID] = &command_worker::cmd_get_id; @@ -199,7 +171,7 @@ bool command_worker::working(void *ctx) if (inst->m_socket.recv(&header, sizeof(header)) <= 0) { string info; inst->get_info(info); - DBG("%s failed to receive header", info); + DBG("%s failed to receive header", info.c_str()); return false; } @@ -211,7 +183,7 @@ bool command_worker::working(void *ctx) if (inst->m_socket.recv(payload, header.size) <= 0) { string info; inst->get_info(info); - DBG("%s failed to receive data of packet", info); + DBG("%s failed to receive data of packet", info.c_str()); delete[] payload; return false; } @@ -852,9 +824,7 @@ void command_worker::get_info(string &info) int command_worker::get_permission(void) { - int permission = SENSOR_PERMISSION_STANDARD; - - return permission; + return permission_checker::get_instance().get_permission(m_socket.get_socket_fd()); } bool command_worker::is_permission_allowed(void) diff --git a/src/server/command_worker.h b/src/server/command_worker.h index 06c9c82..cdd08e8 100755 --- a/src/server/command_worker.h +++ b/src/server/command_worker.h @@ -33,9 +33,6 @@ typedef multimap sensor_raw_data_map; class command_worker { private: typedef bool (command_worker::*cmd_handler_t)(void *payload); - typedef int (*security_server_check_privilege_by_sockfd_t)(int sockfd, - const char *object, - const char *access_rights); static const int OP_ERROR = -1; static const int OP_SUCCESS = 0; @@ -45,13 +42,10 @@ private: csocket m_socket; worker_thread m_worker; sensor_base *m_module; - static void *m_security_handle; - static security_server_check_privilege_by_sockfd_t security_server_check_privilege_by_sockfd; static cmd_handler_t m_cmd_handlers[CMD_CNT]; static cpacket m_sensor_list; static sensor_raw_data_map m_sensor_raw_data_map; - static void init_security_lib(void); static void init_cmd_handlers(void); static void make_sensor_raw_data_map(void); static void get_sensor_list(int permissions, cpacket &sensor_list); diff --git a/src/server/permission_checker.cpp b/src/server/permission_checker.cpp new file mode 100755 index 0000000..c57f900 --- /dev/null +++ b/src/server/permission_checker.cpp @@ -0,0 +1,105 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include + +#define SECURITY_LIB "/usr/lib/libsecurity-server-client.so.1" + +permission_checker::permission_checker() +: m_permission_set(0) +, security_server_check_privilege_by_sockfd(NULL) +, m_security_handle(NULL) + +{ + init(); +} + +permission_checker::~permission_checker() +{ + if (m_security_handle) + dlclose(m_security_handle); +} + +permission_checker& permission_checker::get_instance() +{ + static permission_checker inst; + return inst; +} + +bool permission_checker::init_security_lib(void) +{ + m_security_handle = dlopen(SECURITY_LIB, RTLD_LAZY); + + if (!m_security_handle) { + ERR("dlopen(%s) error, cause: %s", SECURITY_LIB, dlerror()); + return false; + } + + security_server_check_privilege_by_sockfd = + (security_server_check_privilege_by_sockfd_t) dlsym(m_security_handle, "security_server_check_privilege_by_sockfd"); + + if (!security_server_check_privilege_by_sockfd) { + ERR("Failed to load symbol"); + dlclose(m_security_handle); + m_security_handle = NULL; + return false; + } + + return true; + +} + +void permission_checker::init() +{ + m_permission_infos.push_back(std::make_shared (SENSOR_PERMISSION_STANDARD, false, "", "")); + m_permission_infos.push_back(std::make_shared (SENSOR_PERMISSION_BIO, true, "sensord::bio", "rw")); + + vector sensors; + sensors = sensor_plugin_loader::get_instance().get_sensors(ALL_SENSOR); + + for (int i = 0; i < sensors.size(); ++i) + m_permission_set |= sensors[i]->get_permission(); + + INFO("Permission Set = %d", m_permission_set); + + if (!init_security_lib()) + ERR("Failed to init security lib: %s", SECURITY_LIB); +} + +int permission_checker::get_permission(int sock_fd) +{ + int permission = SENSOR_PERMISSION_NONE; + + for (int i = 0; i < m_permission_infos.size(); ++i) { + if (!m_permission_infos[i]->need_to_check) { + permission |= m_permission_infos[i]->permission; + } else if ((m_permission_set & m_permission_infos[i]->permission) && security_server_check_privilege_by_sockfd) { + if (security_server_check_privilege_by_sockfd(sock_fd, m_permission_infos[i]->name.c_str(), m_permission_infos[i]->access_right.c_str()) == 1) { + permission |= m_permission_infos[i]->permission; + } + } + } + + return permission; +} diff --git a/src/server/permission_checker.h b/src/server/permission_checker.h new file mode 100755 index 0000000..5121e41 --- /dev/null +++ b/src/server/permission_checker.h @@ -0,0 +1,69 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _PERMISSION_CHECKER_H_ +#define _PERMISSION_CHECKER_H_ + +#include +#include +#include + +class permission_checker { +private: + class permission_info { + public: + permission_info(int _permission, bool _need_to_check, std::string _name, std::string _access_right) + : permission(_permission) + , need_to_check(_need_to_check) + , name(_name) + , access_right(_access_right) + { + } + int permission; + bool need_to_check; + std::string name; + std::string access_right; + }; + + typedef std::vector> permission_info_vector; + + typedef int (*security_server_check_privilege_by_sockfd_t)(int sockfd, + const char *object, + const char *access_rights); + + permission_checker(); + ~permission_checker(); + permission_checker(permission_checker const&) {}; + permission_checker& operator=(permission_checker const&); + + bool init_security_lib(void); + void init(); + + security_server_check_privilege_by_sockfd_t security_server_check_privilege_by_sockfd; + void *m_security_handle; + + permission_info_vector m_permission_infos; + int m_permission_set; +public: + static permission_checker& get_instance(); + + int get_permission(int sock_fd); +}; + +#endif /* COMMAND_WORKER_H_ */ diff --git a/src/shared/cinterval_info_list.h b/src/shared/cinterval_info_list.h index 463de6e..340cba6 100755 --- a/src/shared/cinterval_info_list.h +++ b/src/shared/cinterval_info_list.h @@ -43,9 +43,9 @@ private: list m_list; public: - bool add_interval(int client_id, unsigned int interval, bool is_processor = false); - bool delete_interval(int client_id, bool is_processor = false); - unsigned int get_interval(int client_id, bool is_processor = false); + bool add_interval(int client_id, unsigned int interval, bool is_processor); + bool delete_interval(int client_id, bool is_processor); + unsigned int get_interval(int client_id, bool is_processor); unsigned int get_min(void); }; #endif diff --git a/src/shared/csocket.cpp b/src/shared/csocket.cpp index d327229..e862b63 100755 --- a/src/shared/csocket.cpp +++ b/src/shared/csocket.cpp @@ -103,7 +103,9 @@ bool csocket::bind (const char *sock_path) } m_addr.sun_family = AF_UNIX; - strcpy(m_addr.sun_path, sock_path); + int path_size = strlen(sock_path); + strncpy(m_addr.sun_path, sock_path, path_size); + m_addr.sun_path[path_size - 1] = '\0'; length = strlen(m_addr.sun_path) + sizeof(m_addr.sun_family); @@ -301,7 +303,10 @@ bool csocket::connect(const char *sock_path) set_blocking_mode(false); m_addr.sun_family = AF_UNIX; - strcpy(m_addr.sun_path, sock_path); + int path_size = strlen(sock_path); + strncpy(m_addr.sun_path, sock_path, path_size); + m_addr.sun_path[path_size - 1] = '\0'; + addr_len = strlen(m_addr.sun_path) + sizeof(m_addr.sun_family); if (::connect(m_sock_fd,(sockaddr *) &m_addr, addr_len) < 0) { diff --git a/src/shared/sensor_base.cpp b/src/shared/sensor_base.cpp index 109504c..6fe3b9b 100755 --- a/src/shared/sensor_base.cpp +++ b/src/shared/sensor_base.cpp @@ -273,7 +273,7 @@ void sensor_base::get_sensor_info(sensor_info &info) bool sensor_base::get_properties(sensor_properties_s &properties) { - return true; + return false; } bool sensor_base::is_supported(unsigned int event_type) diff --git a/src/shared/sensor_base.h b/src/shared/sensor_base.h index 16d3dba..f9e6184 100755 --- a/src/shared/sensor_base.h +++ b/src/shared/sensor_base.h @@ -70,9 +70,9 @@ public: virtual bool add_client(unsigned int event_type); virtual bool delete_client(unsigned int event_type); - virtual bool add_interval(int client_id, unsigned int interval, bool is_processor = false); - virtual bool delete_interval(int client_id, bool is_processor = false); - unsigned int get_interval(int client_id, bool is_processor = false); + virtual bool add_interval(int client_id, unsigned int interval, bool is_processor); + virtual bool delete_interval(int client_id, bool is_processor); + unsigned int get_interval(int client_id, bool is_processor); void get_sensor_info(sensor_info &info); diff --git a/src/shared/sensor_common.h b/src/shared/sensor_common.h index 7fbfec7..6cd4bf1 100755 --- a/src/shared/sensor_common.h +++ b/src/shared/sensor_common.h @@ -49,15 +49,30 @@ typedef enum { GEOMAGNETIC_SENSOR, LIGHT_SENSOR, PROXIMITY_SENSOR, + THERMOMETER_SENSOR, GYROSCOPE_SENSOR, PRESSURE_SENSOR, + MOTION_SENSOR, + FUSION_SENSOR, + PEDOMETER_SENSOR, CONTEXT_SENSOR, + FLAT_SENSOR, + BIO_SENSOR, + BIO_HRM_SENSOR, + AUTO_ROTATION_SENSOR, GRAVITY_SENSOR, LINEAR_ACCEL_SENSOR, + ROTATION_VECTOR_SENSOR, ORIENTATION_SENSOR, + PIR_SENSOR, + PIR_LONG_SENSOR, TEMPERATURE_SENSOR, - ROTATION_VECTOR_SENSOR, - MOTION_SENSOR + HUMIDITY_SENSOR, + ULTRAVIOLET_SENSOR, + DUST_SENSOR, + RV_RAW_SENSOR, + UNCAL_GYROSCOPE_SENSOR, + UNCAL_GEOMAGNETIC_SENSOR } sensor_type_t; typedef unsigned int sensor_id_t; diff --git a/src/shared/sensor_hal.cpp b/src/shared/sensor_hal.cpp index a312162..a0bfd84 100755 --- a/src/shared/sensor_hal.cpp +++ b/src/shared/sensor_hal.cpp @@ -93,30 +93,36 @@ bool sensor_hal::is_sensorhub_controlled(const string &key) return false; } -bool sensor_hal::get_node_path_info(const node_path_info_query &query, node_path_info &info) +bool sensor_hal::get_node_info(const node_info_query &query, node_info &info) { bool ret = false; - string model_id; + int method; + string device_num; + + if (!get_input_method(query.key, method, device_num)) { + ERR("Failed to get input method for %s", query.key.c_str()); + return false; + } - if (query.input_method == IIO_METHOD) { + info.method = method; - find_model_id(IIO_METHOD, query.sensor_type, model_id); + if (method == IIO_METHOD) { if (query.sensorhub_controlled) - ret = get_sensorhub_iio_node_info(model_id, query.sensorhub_interval_node_name, info); + ret = get_sensorhub_iio_node_info(query.sensorhub_interval_node_name, device_num, info); else - ret = get_iio_node_info(model_id, query.iio_enable_node_name, info); + ret = get_iio_node_info(query.iio_enable_node_name, device_num, info); } else { if (query.sensorhub_controlled) - ret = get_sensorhub_input_event_node_info(query.input_event_key, query.sensorhub_interval_node_name, info); + ret = get_sensorhub_input_event_node_info(query.sensorhub_interval_node_name, device_num, info); else - ret = get_input_event_node_info(query.input_event_key, info); + ret = get_input_event_node_info(device_num, info); } return ret; } -void sensor_hal::show_node_path_info(node_path_info &info) +void sensor_hal::show_node_info(node_info &info) { if (info.data_node_path.size()) INFO("Data node: %s", info.data_node_path.c_str()); @@ -132,52 +138,38 @@ void sensor_hal::show_node_path_info(node_path_info &info) INFO("Trigger node: %s", info.trigger_node_path.c_str()); } -bool sensor_hal::get_iio_node_info(const string &key, const string& enable_node_name, node_path_info &info) +bool sensor_hal::get_iio_node_info(const string& enable_node_name, const string& device_num, node_info &info) { - string device_num; - - if (!get_device_num(IIO_METHOD, key, device_num)) - return false; - - info.data_node_path = string("/dev/iio:device") + device_num; - const string base_dir = string("/sys/bus/iio/devices/iio:device") + device_num + string("/"); - info.base_dir = base_dir; + info.data_node_path = string("/dev/iio:device") + device_num; info.enable_node_path = base_dir + enable_node_name; info.interval_node_path = base_dir + string("sampling_frequency"); info.buffer_enable_node_path = base_dir + string("buffer/enable"); info.buffer_length_node_path = base_dir + string("buffer/length"); info.trigger_node_path = base_dir + string("trigger/current_trigger"); - info.available_freq_node_path = base_dir + string("sampling_frequency_available"); return true; } -bool sensor_hal::get_sensorhub_iio_node_info(const string &key, const string &interval_node_name, node_path_info &info) +bool sensor_hal::get_sensorhub_iio_node_info(const string &interval_node_name, const string& device_num, node_info &info) { - const string base_dir = "/sys/class/sensors/ssp_sensor/"; - string device_num; - - if (!get_device_num(IIO_METHOD, key, device_num)) - return false; + const string base_dir = string("/sys/bus/iio/devices/iio:device") + device_num + string("/"); + const string hub_dir = "/sys/class/sensors/ssp_sensor/"; - info.base_dir = base_dir; info.data_node_path = string("/dev/iio:device") + device_num; - info.enable_node_path = base_dir + string("enable"); //this may need to be changed - info.interval_node_path = base_dir + interval_node_name; + info.enable_node_path = hub_dir + string("enable"); + info.interval_node_path = hub_dir + interval_node_name; + info.buffer_enable_node_path = base_dir + string("buffer/enable"); + info.buffer_length_node_path = base_dir + string("buffer/length"); return true; } -bool sensor_hal::get_input_event_node_info(const string &key, node_path_info &info) +bool sensor_hal::get_input_event_node_info(const string& device_num, node_info &info) { string base_dir; - string device_num; string event_num; - if (!get_device_num(INPUT_EVENT_METHOD, key, device_num)) - return false; - base_dir = string("/sys/class/input/input") + device_num + string("/"); if (!get_event_num(base_dir, event_num)) @@ -190,15 +182,11 @@ bool sensor_hal::get_input_event_node_info(const string &key, node_path_info &in return true; } -bool sensor_hal::get_sensorhub_input_event_node_info(const string &key, const string &interval_node_name, node_path_info &info) +bool sensor_hal::get_sensorhub_input_event_node_info(const string &interval_node_name, const string& device_num, node_info &info) { const string base_dir = "/sys/class/sensors/ssp_sensor/"; - string device_num; string event_num; - if (!get_device_num(INPUT_EVENT_METHOD, key, device_num)) - return false; - string input_dir = string("/sys/class/input/input") + device_num + string("/"); if (!get_event_num(input_dir, event_num)) @@ -274,22 +262,15 @@ bool sensor_hal::set_enable_node(const string &node_path, bool sensorhub_control } -bool sensor_hal::find_model_id(int method, const string &sensor_type, string &model_id) +bool sensor_hal::find_model_id(const string &sensor_type, string &model_id) { - const string input_event_dir = "/sys/class/sensors/"; - const string iio_dir = "/sys/bus/iio/devices/"; - string dir_path; + string dir_path = "/sys/class/sensors/"; string name_node, name; string d_name; DIR *dir = NULL; struct dirent *dir_entry = NULL; bool find = false; - if (method == IIO_METHOD) - dir_path = iio_dir; - else - dir_path = input_event_dir; - dir = opendir(dir_path.c_str()); if (!dir) { DBG("Failed to open dir: %s", dir_path.c_str()); @@ -322,24 +303,6 @@ bool sensor_hal::find_model_id(int method, const string &sensor_type, string &mo return find; } -bool sensor_hal::verify_iio_trigger(const string &trigger_name) -{ - return true; -} - -bool sensor_hal::get_model_properties(const string &sensor_type, string &model_id, int &input_method) -{ - if (find_model_id(INPUT_EVENT_METHOD, sensor_type, model_id)) { - input_method = INPUT_EVENT_METHOD; - return true; - } else if (find_model_id(IIO_METHOD, sensor_type, model_id)) { - input_method = IIO_METHOD; - return true; - } - - return false; -} - bool sensor_hal::get_event_num(const string &input_path, string &event_num) { const string event_prefix = "event"; @@ -371,15 +334,14 @@ bool sensor_hal::get_event_num(const string &input_path, string &event_num) return find; } -bool sensor_hal::get_device_num(int method, const string &key, string &device_num) +bool sensor_hal::get_input_method(const string &key, int &method, string &device_num) { - const string input_event_dir = "/sys/class/input/"; - const string iio_dir = "/sys/bus/iio/devices/"; - const string input_event_prefix = "input"; - const string iio_prefix = "iio:device"; + input_method_info input_info[2] = { + {INPUT_EVENT_METHOD, "/sys/class/input/", "input"}, + {IIO_METHOD, "/sys/bus/iio/devices/", "iio:device"} + }; - string dir_path; - string prefix; + const int input_info_len = sizeof(input_info)/sizeof(input_info[0]); size_t prefix_size; string name_node, name; string d_name; @@ -387,79 +349,44 @@ bool sensor_hal::get_device_num(int method, const string &key, string &device_nu struct dirent *dir_entry = NULL; bool find = false; - if (method == IIO_METHOD) { - dir_path = iio_dir; - prefix = iio_prefix; - } else { - dir_path = input_event_dir; - prefix = input_event_prefix; - } + for (int i = 0; i < input_info_len; ++i) { - prefix_size = prefix.size(); + prefix_size = input_info[i].prefix.size(); - dir = opendir(dir_path.c_str()); - if (!dir) { - ERR("Failed to open dir: %s", dir_path.c_str()); - return false; - } + dir = opendir(input_info[i].dir_path.c_str()); + if (!dir) { + ERR("Failed to open dir: %s", input_info[i].dir_path.c_str()); + return false; + } - while (!find && (dir_entry = readdir(dir))) { - d_name = string(dir_entry->d_name); + find = false; - if (d_name.compare(0, prefix_size, prefix) == 0) { - name_node = dir_path + d_name + string("/name"); + while (!find && (dir_entry = readdir(dir))) { + d_name = string(dir_entry->d_name); - ifstream infile(name_node.c_str()); - if (!infile) - continue; + if (d_name.compare(0, prefix_size, input_info[i].prefix) == 0) { + name_node = input_info[i].dir_path + d_name + string("/name"); - infile >> name; + ifstream infile(name_node.c_str()); + if (!infile) + continue; - if (name == key) { - device_num = d_name.substr(prefix_size, d_name.size() - prefix_size); - find = true; - break; + infile >> name; + + if (name == key) { + device_num = d_name.substr(prefix_size, d_name.size() - prefix_size); + find = true; + method = input_info[i].method; + break; + } } } - } - - closedir(dir); - - return find; -} -bool sensor_hal::get_generic_channel_names(const string &scan_dir, const string &suffix, vector &generic_channel_names) -{ - DIR *dir = NULL; - struct dirent *dir_entry = NULL; - string file_node; - string d_name; - unsigned int pos; + closedir(dir); - dir = opendir(scan_dir.c_str()); - if (!dir) { - DBG("Failed to open dir: %s", dir_path.c_str()); - return false; - } - - generic_channel_names.clear(); - - while (true) { - dir_entry = readdir(dir); - if (dir_entry == NULL) + if (find) break; - - d_name = string(dir_entry->d_name); - - if ((d_name != ".") && (d_name != "..") && (dir_entry->d_ino != 0)) { - pos = d_name.rfind(suffix.c_str()); - if (pos == string::npos) - continue; - generic_channel_names.push_back(d_name.substr(0 , pos)); - } } - closedir(dir); - if (generic_channel_names.size() > 0) - return true; - return false; + + return find; } diff --git a/src/shared/sensor_hal.h b/src/shared/sensor_hal.h index 41d5d6d..fdb8299 100755 --- a/src/shared/sensor_hal.h +++ b/src/shared/sensor_hal.h @@ -25,10 +25,8 @@ #include #include #include -#include using std::string; -using std::vector; /* * As of Linux 3.4, there is a new EVIOCSCLOCKID ioctl to set the desired clock @@ -40,30 +38,34 @@ using std::vector; #endif typedef struct { + int method; string data_node_path; string enable_node_path; string interval_node_path; string buffer_enable_node_path; string buffer_length_node_path; string trigger_node_path; - string available_freq_node_path; - string base_dir; -} node_path_info; +} node_info; typedef struct { - int input_method; bool sensorhub_controlled; string sensor_type; - string input_event_key; + string key; string iio_enable_node_name; string sensorhub_interval_node_name; -} node_path_info_query; +} node_info_query; enum input_method { - IIO_METHOD, - INPUT_EVENT_METHOD, + IIO_METHOD = 0, + INPUT_EVENT_METHOD = 1, }; +typedef struct { + int method; + std::string dir_path; + std::string prefix; +} input_method_info; + #define DEFAULT_WAIT_TIME 0 class sensor_hal @@ -93,23 +95,20 @@ protected: static unsigned long long get_timestamp(void); static unsigned long long get_timestamp(timeval *t); + static bool find_model_id(const string &sensor_type, string &model_id); static bool is_sensorhub_controlled(const string &key); - static bool get_model_properties(const string &sensor_type, string &model_id, int &input_method); - static bool get_node_path_info(const node_path_info_query &query, node_path_info &info); - static void show_node_path_info(node_path_info &info); + static bool get_node_info(const node_info_query &query, node_info &info); + static void show_node_info(node_info &info); static bool set_node_value(const string &node_path, int value); static bool set_node_value(const string &node_path, unsigned long long value); static bool get_node_value(const string &node_path, int &value); - static bool verify_iio_trigger(const string &trigger_name); - static bool get_generic_channel_names(const string &scan_dir, const string &suffix, vector &generic_channel_names); - private: - static bool find_model_id(int method, const string &sensor_type, string &model_id); static bool get_event_num(const string &node_path, string &event_num); - static bool get_device_num(int method, const string &key, string &device_num); - static bool get_iio_node_info(const string &key, const string& enable_node_name, node_path_info &info); - static bool get_sensorhub_iio_node_info(const string &key, const string &interval_node_name, node_path_info &info); - static bool get_input_event_node_info(const string &key, node_path_info &info); - static bool get_sensorhub_input_event_node_info(const string &key, const string &interval_node_name, node_path_info &info); + static bool get_input_method(const string &key, int &method, string &device_num); + + static bool get_iio_node_info(const string& enable_node_name, const string& device_num, node_info &info); + static bool get_sensorhub_iio_node_info(const string &interval_node_name, const string& device_num, node_info &info); + static bool get_input_event_node_info(const string& device_num, node_info &info); + static bool get_sensorhub_input_event_node_info(const string &interval_node_name, const string& device_num, node_info &info); }; #endif /*_SENSOR_HAL_CLASS_H_*/ diff --git a/src/shared/sensor_plugin_loader.cpp b/src/shared/sensor_plugin_loader.cpp index d26a773..17772c9 100755 --- a/src/shared/sensor_plugin_loader.cpp +++ b/src/shared/sensor_plugin_loader.cpp @@ -53,47 +53,38 @@ sensor_plugin_loader& sensor_plugin_loader::get_instance() return inst; } -bool sensor_plugin_loader::load_module(const string &path, void** module, void** handle) +bool sensor_plugin_loader::load_module(const string &path, vector &sensors, void* &handle) { void *_handle = dlopen(path.c_str(), RTLD_NOW); if (!_handle) { - ERR("Failed with dlopen(%s), dlerror : %s", path.c_str(), dlerror()); + ERR("Failed to dlopen(%s), dlerror : %s", path.c_str(), dlerror()); return false; } dlerror(); - typedef void* create_t(void); - typedef void destroy_t(void *); + create_t create_module = (create_t) dlsym(_handle, "create"); - create_t* init_module = (create_t*) dlsym(_handle, "create"); - - if (!init_module) { - ERR("Failed to find \"create\" symbol"); + if (!create_module) { + ERR("Failed to find symbols in %s", path.c_str()); dlclose(_handle); return false; } - destroy_t* exit_module = (destroy_t*) dlsym(_handle, "destroy"); + sensor_module *module = create_module(); - if (!exit_module) { - ERR("Failed to find \"destroy\" symbol"); + if (!module) { + ERR("Failed to create module, path is %s\n", path.c_str()); dlclose(_handle); return false; } - void *_module = init_module(); - - if (!_module) { - ERR("Failed to init the module, Target file is %s\n", path.c_str()); - exit_module(_module); - dlclose(_handle); - return false; - } + sensors.clear(); + sensors.swap(module->sensors); - *module = _module; - *handle = _handle; + delete module; + handle = _handle; return true; } @@ -101,37 +92,50 @@ bool sensor_plugin_loader::load_module(const string &path, void** module, void** bool sensor_plugin_loader::insert_module(plugin_type type, const string &path) { if (type == PLUGIN_TYPE_HAL) { - DBG("insert sensor plugin [%s]", path.c_str()); - sensor_hal *module; + DBG("Insert HAL plugin [%s]", path.c_str()); + + std::vectorhals; void *handle; - if (!load_module(path, (void **)&module, &handle)) + if (!load_module(path, hals, handle)) return false; - sensor_type_t sensor_type = module->get_type(); - m_sensor_hals.insert(make_pair(sensor_type, module)); + sensor_hal* hal; + + for (unsigned int i = 0; i < hals.size(); ++i) { + hal = static_cast (hals[i]); + sensor_type_t sensor_type = hal->get_type(); + m_sensor_hals.insert(make_pair(sensor_type, hal)); + } } else if (type == PLUGIN_TYPE_SENSOR) { - DBG("insert sensor plugin [%s]", path.c_str()); - sensor_base *module; + DBG("Insert Sensor plugin [%s]", path.c_str()); + + std::vector sensors; void *handle; - if (!load_module(path, (void**)&module, &handle)) + if (!load_module(path, sensors, handle)) return false; - if (!module->init()) { - ERR("Failed to init [%s] module\n", module->get_name()); - delete module; - dlclose(handle); - return false; - } - DBG("init [%s] module", module->get_name()); + sensor_base* sensor; + + for (unsigned int i = 0; i < sensors.size(); ++i) { + sensor = static_cast (sensors[i]); + + if (!sensor->init()) { + ERR("Failed to init [%s] module\n", sensor->get_name()); + delete sensor; + continue; + } - sensor_type_t sensor_type = module->get_type(); + DBG("init [%s] module", sensor->get_name()); - int idx; - idx = m_sensors.count(sensor_type); - module->set_id(idx << SENSOR_INDEX_SHIFT | sensor_type); - m_sensors.insert(make_pair(sensor_type, module)); + sensor_type_t sensor_type = sensor->get_type(); + + int idx; + idx = m_sensors.count(sensor_type); + sensor->set_id(idx << SENSOR_INDEX_SHIFT | sensor_type); + m_sensors.insert(make_pair(sensor_type, sensor)); + } }else { ERR("Not supported type: %d", type); return false; diff --git a/src/shared/sensor_plugin_loader.h b/src/shared/sensor_plugin_loader.h index 5964835..6903024 100755 --- a/src/shared/sensor_plugin_loader.h +++ b/src/shared/sensor_plugin_loader.h @@ -62,14 +62,14 @@ typedef multimap sensor_plugins; class sensor_plugin_loader { private: - enum plugin_type { + typedef enum plugin_type { PLUGIN_TYPE_HAL, PLUGIN_TYPE_SENSOR, - }; + } plugin_type; sensor_plugin_loader(); - bool load_module(const string &path, void** module, void** handle); + bool load_module(const string &path, vector &sensors, void* &handle); bool insert_module(plugin_type type, const string &path); void show_sensor_info(void); bool get_paths_from_dir(const string &dir_path, vector &hal_paths, vector &sensor_paths); diff --git a/src/shared/sf_common.h b/src/shared/sf_common.h index 3b6b79e..6481095 100755 --- a/src/shared/sf_common.h +++ b/src/shared/sf_common.h @@ -24,6 +24,7 @@ #include #include #include +#include #define COMMAND_CHANNEL_PATH "/tmp/sf_command_socket" #define EVENT_CHANNEL_PATH "/tmp/sf_event_socket" @@ -181,6 +182,11 @@ typedef struct sensorhub_event_t { sensorhub_data_t data; } sensorhub_event_t; +typedef struct sensor_module{ + std::vector sensors; +} sensor_module; + +typedef sensor_module* (*create_t)(void); typedef void *(*cmd_func_t)(void *data, void *cb_data); @@ -216,7 +222,11 @@ enum sensorhub_enable_bit { enum sensor_permission_t { SENSOR_PERMISSION_NONE = 0, - SENSOR_PERMISSION_STANDARD = 1, + SENSOR_PERMISSION_STANDARD = (1 << 0), + SENSOR_PERMISSION_BIO = (1 << 1), }; +#define BIO_SENSOR_PRIVELEGE_NAME "sensord::bio" +#define BIO_SENSOR_ACCESS_RIGHT "rw" + #endif diff --git a/src/temperature/temperature_sensor.cpp b/src/temperature/temperature_sensor.cpp index b81c645..e9a154f 100755 --- a/src/temperature/temperature_sensor.cpp +++ b/src/temperature/temperature_sensor.cpp @@ -23,7 +23,6 @@ #include #define SENSOR_NAME "TEMPERATURE_SENSOR" -#define NO_OF_DATA_VAL 1 temperature_sensor::temperature_sensor() : m_sensor_hal(NULL) @@ -45,16 +44,14 @@ bool temperature_sensor::init() { m_sensor_hal = sensor_plugin_loader::get_instance().get_sensor_hal(TEMPERATURE_SENSOR); - if (!m_sensor_hal) - { + if (!m_sensor_hal) { ERR("cannot load sensor_hal[%s]", sensor_base::get_name()); return false; } sensor_properties_s properties; - if (!m_sensor_hal->get_properties(properties)) - { + if (!m_sensor_hal->get_properties(properties)) { ERR("sensor->get_properties() is failed!\n"); return false; } @@ -88,8 +85,8 @@ bool temperature_sensor::process_event(void) AUTOLOCK(m_client_info_mutex); - if (get_client_cnt(TEMPERATURE_EVENT_RAW_DATA_REPORT_ON_TIME)) - { + if (get_client_cnt(TEMPERATURE_EVENT_RAW_DATA_REPORT_ON_TIME)) { + event.sensor_id = get_id(); event.event_type = TEMPERATURE_EVENT_RAW_DATA_REPORT_ON_TIME; raw_to_base(event.data); push(event); @@ -100,8 +97,7 @@ bool temperature_sensor::process_event(void) bool temperature_sensor::on_start(void) { - if (!m_sensor_hal->enable()) - { + if (!m_sensor_hal->enable()) { ERR("m_sensor_hal start fail\n"); return false; } @@ -111,8 +107,7 @@ bool temperature_sensor::on_start(void) bool temperature_sensor::on_stop(void) { - if (!m_sensor_hal->disable()) - { + if (!m_sensor_hal->disable()) { ERR("m_sensor_hal stop fail\n"); return false; } @@ -134,8 +129,7 @@ int temperature_sensor::get_sensor_data(unsigned int type, sensor_data_t &data) if (ret < 0) return -1; - if (type == TEMPERATURE_BASE_DATA_SET) - { + if (type == TEMPERATURE_BASE_DATA_SET) { raw_to_base(data); return 0; } @@ -154,27 +148,24 @@ bool temperature_sensor::set_interval(unsigned long interval) void temperature_sensor::raw_to_base(sensor_data_t &data) { - data.values_num = NO_OF_DATA_VAL; + data.values[0] = data.values[0] * m_resolution; + data.value_count = 1; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - temperature_sensor *inst; + temperature_sensor *sensor; - try - { - inst = new temperature_sensor(); - } - catch (int err) - { - ERR("temperature_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + try { + sensor = new(std::nothrow) temperature_sensor; + } catch (int err) { + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (temperature_sensor*)inst;; + module->sensors.push_back(sensor); + return module; } diff --git a/src/temperature/temperature_sensor_hal.cpp b/src/temperature/temperature_sensor_hal.cpp index 0588952..64bb254 100755 --- a/src/temperature/temperature_sensor_hal.cpp +++ b/src/temperature/temperature_sensor_hal.cpp @@ -18,15 +18,10 @@ */ #include #include -#include #include #include -#include #include #include -#include - -using std::ifstream; #define SENSOR_TYPE_TEMPERATURE "TEMPERATURE" #define ELEMENT_NAME "NAME" @@ -45,40 +40,32 @@ temperature_sensor_hal::temperature_sensor_hal() , m_fired_time(INITIAL_TIME) { const string sensorhub_interval_node_name = TEMP_SENSORHUB_POLL_NODE_NAME; - string file_name; - node_path_info_query query; - node_path_info info; - int input_method = IIO_METHOD; - if (!get_model_properties(SENSOR_TYPE_TEMPERATURE, m_model_id, input_method)) { - ERR("Failed to find model_properties"); + node_info_query query; + node_info info; + + if (!find_model_id(SENSOR_TYPE_TEMPERATURE, m_model_id)) { + ERR("Failed to find model id"); throw ENXIO; } - query.input_method = input_method; query.sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); query.sensor_type = SENSOR_TYPE_TEMPERATURE; - query.input_event_key = TEMP_INPUT_NAME; + query.key = TEMP_INPUT_NAME; query.iio_enable_node_name = TEMP_IIO_ENABLE_NODE_NAME; query.sensorhub_interval_node_name = sensorhub_interval_node_name; - if (!get_node_path_info(query, info)) { + if (!get_node_info(query, info)) { ERR("Failed to get node info"); throw ENXIO; } - show_node_path_info(info); + show_node_info(info); m_data_node = info.data_node_path; m_enable_node = info.enable_node_path; m_interval_node = info.interval_node_path; - if(input_method == IIO_METHOD) { - m_temperature_dir=info.base_dir; - m_temp_node = m_temperature_dir + string(TEMP_RAW); - INFO("m_temperature_dir = %s", m_temperature_dir.c_str()); - INFO("m_temp_node = %s", m_temp_node.c_str()); - } csensor_config &config = csensor_config::get_instance(); if (!config.get(SENSOR_TYPE_TEMPERATURE, m_model_id, ELEMENT_VENDOR, m_vendor)) { @@ -100,26 +87,15 @@ temperature_sensor_hal::temperature_sensor_hal() m_raw_data_unit = (float)(raw_data_unit); - INFO("m_data_node = %s\n",m_data_node.c_str()); - - if ((m_node_handle = open(m_temp_node.c_str(),O_RDWR)) < 0) { + if ((m_node_handle = open(m_data_node.c_str(),O_RDWR)) < 0) { ERR("Failed to open handle(%d)", m_node_handle); throw ENXIO; } - INFO("m_data_node = %s\n",m_data_node.c_str()); - INFO("m_raw_data_unit = %f\n", m_raw_data_unit); - - file_name = m_temperature_dir + string(TEMP_SCALE); - if (!read_node_value(file_name, m_temp_scale)) - throw ENXIO; + int clockId = CLOCK_MONOTONIC; + if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) + ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); - file_name = m_temperature_dir + string(TEMP_OFFSET); - if (!read_node_value(file_name, m_temp_offset)) - throw ENXIO; - - INFO("m_temp_offset %f",m_temp_offset); - INFO("m_temp_scale %d",m_temp_scale); INFO("m_vendor = %s", m_vendor.c_str()); INFO("m_chip_name = %s", m_chip_name.c_str()); INFO("m_raw_data_unit = %f\n", m_raw_data_unit); @@ -146,34 +122,102 @@ sensor_type_t temperature_sensor_hal::get_type(void) bool temperature_sensor_hal::enable(void) { - m_fired_time = INITIAL_TIME; + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, true, + SENSORHUB_TEMPERATURE_HUMIDITY_ENABLE_BIT); + set_interval(m_polling_interval); + + m_fired_time = 0; INFO("Temperature sensor real starting"); return true; } bool temperature_sensor_hal::disable(void) { + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, false, + SENSORHUB_TEMPERATURE_HUMIDITY_ENABLE_BIT); + INFO("Temperature sensor real stopping"); return true; } bool temperature_sensor_hal::set_interval(unsigned long val) { + unsigned long long polling_interval_ns; + + AUTOLOCK(m_mutex); + + polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu); + + if (!set_node_value(m_interval_node, polling_interval_ns)) { + ERR("Failed to set polling node: %s\n", m_interval_node.c_str()); + return false; + } + + INFO("Interval is changed from %dms to %dms]", m_polling_interval, val); + m_polling_interval = val; return true; } bool temperature_sensor_hal::update_value(bool wait) { - int raw_temp_count; + int temperature_raw = 0; + bool temperature = false; + int read_input_cnt = 0; + const int INPUT_MAX_BEFORE_SYN = 10; + unsigned long long fired_time = 0; + bool syn = false; + + struct input_event temperature_event; + DBG("temperature event detection!"); + + while ((syn == false) && (read_input_cnt < INPUT_MAX_BEFORE_SYN)) { + int len = read(m_node_handle, &temperature_event, sizeof(temperature_event)); + if (len != sizeof(temperature_event)) { + ERR("temperature_file read fail, read_len = %d\n",len); + return false; + } + + ++read_input_cnt; + + if (temperature_event.type == EV_REL) { + switch (temperature_event.code) { + case REL_HWHEEL: + temperature_raw = (int)temperature_event.value; + temperature = true; + break; + default: + ERR("temperature_event event[type = %d, code = %d] is unknown.", temperature_event.type, temperature_event.code); + return false; + break; + } + } else if (temperature_event.type == EV_SYN) { + syn = true; + fired_time = sensor_hal::get_timestamp(&temperature_event.time); + } else { + ERR("temperature_event event[type = %d, code = %d] is unknown.", temperature_event.type, temperature_event.code); + return false; + } + } - if (!read_node_value(m_temp_node, raw_temp_count)) + if (syn == false) { + ERR("EV_SYN didn't come until %d inputs had come", read_input_cnt); return false; - m_temperature = m_temp_offset + ((float)raw_temp_count)/((float)m_temp_scale); - INFO("m_temperature %f",m_temperature); - INFO("m_temp_offset %f",m_temp_offset); - INFO("raw_temp_count %d",raw_temp_count); - INFO("m_temp_scale %d",m_temp_scale); + } + + AUTOLOCK(m_value_mutex); + + if (temperature) + m_temperature = temperature_raw; + + m_fired_time = fired_time; + + DBG("m_temperature = %d, time = %lluus", m_temperature, m_fired_time); + return true; } @@ -210,21 +254,20 @@ bool temperature_sensor_hal::get_properties(sensor_properties_s &properties) return true; } -extern "C" void *create(void) +extern "C" sensor_module* create(void) { - temperature_sensor_hal *inst; + temperature_sensor_hal *sensor; try { - inst = new temperature_sensor_hal(); + sensor = new(std::nothrow) temperature_sensor_hal; } catch (int err) { - ERR("temperature_sensor_hal class create fail , errno : %d , errstr : %s\n", err, strerror(err)); + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); return NULL; } - return (void*)inst; -} + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); -extern "C" void destroy(void *inst) -{ - delete (temperature_sensor_hal*)inst; + module->sensors.push_back(sensor); + return module; } diff --git a/src/temperature/temperature_sensor_hal.h b/src/temperature/temperature_sensor_hal.h index aba0fb7..334a74d 100755 --- a/src/temperature/temperature_sensor_hal.h +++ b/src/temperature/temperature_sensor_hal.h @@ -22,13 +22,6 @@ #include #include -#define IIO_DIR "/sys/bus/iio/devices/" -#define IIO_DEV_BASE_NAME "iio:device" -#define IIO_DEV_STR_LEN 10 -#define NAME_NODE "/name" -#define TEMP_OFFSET "in_temp_offset" -#define TEMP_SCALE "in_temp_scale" -#define TEMP_RAW "in_temp_raw" using std::string; @@ -55,15 +48,11 @@ private: string m_vendor; string m_chip_name; - int m_temp_scale; float m_raw_data_unit; - float m_temp_offset; string m_data_node; string m_enable_node; string m_interval_node; - string m_temperature_dir; - string m_temp_node; bool m_sensorhub_controlled; diff --git a/src/ultraviolet/CMakeLists.txt b/src/ultraviolet/CMakeLists.txt new file mode 100644 index 0000000..da4ac07 --- /dev/null +++ b/src/ultraviolet/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 2.6) +project(ultraviolet CXX) + +SET(SENSOR_NAME ultraviolet_sensor) +SET(SENSOR_HAL_NAME ultraviolet_sensor_hal) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) + +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(uv_pkgs REQUIRED vconf) + +FOREACH(flag ${uv_pkgs_LDFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +FOREACH(flag ${uv_pkgs_CFLAGS}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") +ENDFOREACH(flag) + +add_library(${SENSOR_NAME} SHARED + ultraviolet_sensor.cpp + ) + +add_library(${SENSOR_HAL_NAME} SHARED + ultraviolet_sensor_hal.cpp + ) + +target_link_libraries(${SENSOR_NAME} ${uv_pkgs_LDFLAGS} "-lm") +target_link_libraries(${SENSOR_HAL_NAME} ${uv_pkgs_LDFLAGS}) + +install(TARGETS ${SENSOR_NAME} DESTINATION lib/sensord) +install(TARGETS ${SENSOR_HAL_NAME} DESTINATION lib/sensord) diff --git a/src/ultraviolet/ultraviolet_sensor.cpp b/src/ultraviolet/ultraviolet_sensor.cpp new file mode 100755 index 0000000..c3f221e --- /dev/null +++ b/src/ultraviolet/ultraviolet_sensor.cpp @@ -0,0 +1,191 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include +#include +#include + +using std::bind1st; +using std::mem_fun; + +#define SENSOR_NAME "ULTRAVIOLET_SENSOR" + +ultraviolet_sensor::ultraviolet_sensor() +: m_sensor_hal(NULL) +, m_resolution(0.0f) +{ + m_name = string(SENSOR_NAME); + + register_supported_event(ULTRAVIOLET_EVENT_RAW_DATA_REPORT_ON_TIME); + + physical_sensor::set_poller(ultraviolet_sensor::working, this); +} + +ultraviolet_sensor::~ultraviolet_sensor() +{ + INFO("ultraviolet_sensor is destroyed!"); +} + +bool ultraviolet_sensor::init() +{ + m_sensor_hal = sensor_plugin_loader::get_instance().get_sensor_hal(ULTRAVIOLET_SENSOR); + + if (!m_sensor_hal) { + ERR("cannot load sensor_hal[%s]", sensor_base::get_name()); + return false; + } + + sensor_properties_t properties; + + if (!m_sensor_hal->get_properties(properties)) { + ERR("sensor->get_properties() is failed!\n"); + return false; + } + + m_resolution = properties.resolution; + + INFO("%s is created!", sensor_base::get_name()); + + return true; +} + +sensor_type_t ultraviolet_sensor::get_type(void) +{ + return ULTRAVIOLET_SENSOR; +} + +bool ultraviolet_sensor::working(void *inst) +{ + ultraviolet_sensor *sensor = (ultraviolet_sensor*)inst; + return sensor->process_event(); +} + +bool ultraviolet_sensor::process_event(void) +{ + sensor_event_t event; + + if (!m_sensor_hal->is_data_ready(true)) + return true; + + m_sensor_hal->get_sensor_data(event.data); + + AUTOLOCK(m_client_info_mutex); + + if (get_client_cnt(ULTRAVIOLET_EVENT_RAW_DATA_REPORT_ON_TIME)) { + event.sensor_id = get_id(); + event.event_type = ULTRAVIOLET_EVENT_RAW_DATA_REPORT_ON_TIME; + raw_to_base(event.data); + push(event); + } + + return true; +} + +bool ultraviolet_sensor::on_start(void) +{ + if (!m_sensor_hal->enable()) { + ERR("m_sensor_hal start fail\n"); + return false; + } + + return start_poll(); +} + +bool ultraviolet_sensor::on_stop(void) +{ + if (!m_sensor_hal->disable()) { + ERR("m_sensor_hal stop fail\n"); + return false; + } + + return stop_poll(); +} + +bool ultraviolet_sensor::get_properties(sensor_properties_t &properties) +{ + return m_sensor_hal->get_properties(properties); +} + +int ultraviolet_sensor::get_sensor_data(unsigned int type, sensor_data_t &data) +{ + int ret; + + ret = m_sensor_hal->get_sensor_data(data); + + if (ret < 0) + return -1; + + if (type == ULTRAVIOLET_BASE_DATA_SET) { + raw_to_base(data); + return 0; + } + + return -1; +} + +bool ultraviolet_sensor::set_interval(unsigned long interval) +{ + AUTOLOCK(m_mutex); + + INFO("Polling interval is set to %dms", interval); + + return m_sensor_hal->set_interval(interval); +} + +void ultraviolet_sensor::raw_to_base(sensor_data_t &data) +{ + /* + double lsb = data.values[0]; + double comp_lsb; + + const double c = 0.89; + const double e = 2.12; + const double f = -132.8; + + if (lsb > 108.8f) + comp_lsb = e * lsb + f; + else + comp_lsb = c * lsb; + + data.values[0] = comp_lsb * m_resolution; + */ + data.values[0] = data.values[0] * m_resolution; + data.value_count = 1; +} + +extern "C" sensor_module* create(void) +{ + ultraviolet_sensor *sensor; + + try { + sensor = new(std::nothrow) ultraviolet_sensor; + } catch (int err) { + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); + return NULL; + } + + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); + + module->sensors.push_back(sensor); + return module; +} diff --git a/src/ultraviolet/ultraviolet_sensor.h b/src/ultraviolet/ultraviolet_sensor.h new file mode 100755 index 0000000..945af49 --- /dev/null +++ b/src/ultraviolet/ultraviolet_sensor.h @@ -0,0 +1,53 @@ +/* + * sensord + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _ULTRAVIOLET_SENSOR_H_ +#define _ULTRAVIOLET_SENSOR_H_ + +#include + +#include +#include + +class ultraviolet_sensor : public physical_sensor { +public: + ultraviolet_sensor(); + virtual ~ultraviolet_sensor(); + + bool init(); + sensor_type_t get_type(void); + + static bool working(void *inst); + + bool set_interval(unsigned long interval); + virtual bool get_properties(sensor_properties_t &properties); + int get_sensor_data(unsigned int type, sensor_data_t &data); + +private: + sensor_hal *m_sensor_hal; + float m_resolution; + + virtual bool on_start(void); + virtual bool on_stop(void); + bool process_event(void); + void raw_to_base(sensor_data_t &data); +}; + +#endif + diff --git a/src/ultraviolet/ultraviolet_sensor_hal.cpp b/src/ultraviolet/ultraviolet_sensor_hal.cpp new file mode 100755 index 0000000..0729a29 --- /dev/null +++ b/src/ultraviolet/ultraviolet_sensor_hal.cpp @@ -0,0 +1,287 @@ +/* + * ultraviolet_sensor_hal + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include + +using std::ifstream; + +#define SENSOR_TYPE_ULTRAVIOLET "ULTRAVIOLET" +#define ELEMENT_NAME "NAME" +#define ELEMENT_VENDOR "VENDOR" +#define ELEMENT_RAW_DATA_UNIT "RAW_DATA_UNIT" +#define ELEMENT_MIN_RANGE "MIN_RANGE" +#define ELEMENT_MAX_RANGE "MAX_RANGE" +#define ATTR_VALUE "value" + +#define BIAS 1 + +ultraviolet_sensor_hal::ultraviolet_sensor_hal() +: m_polling_interval(POLL_1HZ_MS) +, m_ultraviolet(0) +, m_fired_time(0) +, m_node_handle(-1) +{ + const string sensorhub_interval_node_name = "uv_poll_delay"; + csensor_config &config = csensor_config::get_instance(); + + node_info_query query; + node_info info; + + if (!find_model_id(SENSOR_TYPE_ULTRAVIOLET, m_model_id)) { + ERR("Failed to find model id"); + throw ENXIO; + + } + + query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); + query.sensor_type = SENSOR_TYPE_ULTRAVIOLET; + query.key = "uv_sensor"; + query.iio_enable_node_name = "uv_enable"; + query.sensorhub_interval_node_name = sensorhub_interval_node_name; + + if (!get_node_info(query, info)) { + ERR("Failed to get node info"); + throw ENXIO; + } + + show_node_info(info); + + m_data_node = info.data_node_path; + m_enable_node = info.enable_node_path; + m_interval_node = info.interval_node_path; + + if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_VENDOR, m_vendor)) { + ERR("[VENDOR] is empty\n"); + throw ENXIO; + } + + INFO("m_vendor = %s", m_vendor.c_str()); + + if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_NAME, m_chip_name)) { + ERR("[NAME] is empty\n"); + throw ENXIO; + } + + INFO("m_chip_name = %s\n",m_chip_name.c_str()); + + double min_range; + + if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_MIN_RANGE, min_range)) { + ERR("[MIN_RANGE] is empty\n"); + throw ENXIO; + } + + m_min_range = (float)min_range; + INFO("m_min_range = %f\n",m_min_range); + + double max_range; + + if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_MAX_RANGE, max_range)) { + ERR("[MAX_RANGE] is empty\n"); + throw ENXIO; + } + + m_max_range = (float)max_range; + INFO("m_max_range = %f\n",m_max_range); + + double raw_data_unit; + + if (!config.get(SENSOR_TYPE_ULTRAVIOLET, m_model_id, ELEMENT_RAW_DATA_UNIT, raw_data_unit)) { + ERR("[RAW_DATA_UNIT] is empty\n"); + throw ENXIO; + } + + m_raw_data_unit = (float)(raw_data_unit); + + if ((m_node_handle = open(m_data_node.c_str(),O_RDWR)) < 0) { + ERR("Failed to open handle(%d)", m_node_handle); + throw ENXIO; + } + + int clockId = CLOCK_MONOTONIC; + if (ioctl(m_node_handle, EVIOCSCLOCKID, &clockId) != 0) + ERR("Fail to set monotonic timestamp for %s", m_data_node.c_str()); + + INFO("m_raw_data_unit = %f\n", m_raw_data_unit); + INFO("ultraviolet_sensor_hal is created!\n"); + +} + +ultraviolet_sensor_hal::~ultraviolet_sensor_hal() +{ + close(m_node_handle); + m_node_handle = -1; + + INFO("ultraviolet_sensor_hal is destroyed!\n"); +} + +string ultraviolet_sensor_hal::get_model_id(void) +{ + return m_model_id; +} + + +sensor_type_t ultraviolet_sensor_hal::get_type(void) +{ + return ULTRAVIOLET_SENSOR; +} + +bool ultraviolet_sensor_hal::enable(void) +{ + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, true, SENSORHUB_UV_SENSOR); + set_interval(m_polling_interval); + + m_fired_time = 0; + INFO("ultraviolet sensor real starting"); + return true; +} + +bool ultraviolet_sensor_hal::disable(void) +{ + AUTOLOCK(m_mutex); + + set_enable_node(m_enable_node, m_sensorhub_controlled, false, SENSORHUB_UV_SENSOR); + + INFO("ultraviolet sensor real stopping"); + return true; +} + +bool ultraviolet_sensor_hal::set_interval(unsigned long val) +{ + unsigned long long polling_interval_ns; + + AUTOLOCK(m_mutex); + + polling_interval_ns = ((unsigned long long)(val) * 1000llu * 1000llu); + + if (!set_node_value(m_interval_node, polling_interval_ns)) { + ERR("Failed to set polling resource: %s\n", m_interval_node.c_str()); + return false; + } + + INFO("Interval is changed from %dms to %dms]", m_polling_interval, val); + m_polling_interval = val; + return true; + +} + + +bool ultraviolet_sensor_hal::update_value(bool wait) +{ + int ultraviolet_raw = -1; + bool ultraviolet = false; + int read_input_cnt = 0; + const int INPUT_MAX_BEFORE_SYN = 10; + unsigned long long fired_time = 0; + bool syn = false; + + struct input_event ultraviolet_event; + DBG("ultraviolet event detection!"); + + while ((syn == false) && (read_input_cnt < INPUT_MAX_BEFORE_SYN)) { + int len = read(m_node_handle, &ultraviolet_event, sizeof(ultraviolet_event)); + if (len != sizeof(ultraviolet_event)) { + ERR("ultraviolet file read fail, read_len = %d\n",len); + return false; + } + + ++read_input_cnt; + + if (ultraviolet_event.type == EV_REL && ultraviolet_event.code == REL_MISC) { + ultraviolet_raw = (int)ultraviolet_event.value - BIAS; + ultraviolet = true; + } else if (ultraviolet_event.type == EV_SYN) { + syn = true; + fired_time = sensor_hal::get_timestamp(&ultraviolet_event.time); + } else { + ERR("ultraviolet event[type = %d, code = %d] is unknown.", ultraviolet_event.type, ultraviolet_event.code); + return false; + } + } + + AUTOLOCK(m_value_mutex); + + if (ultraviolet) + m_ultraviolet = ultraviolet_raw; + + m_fired_time = fired_time; + + DBG("m_ultraviolet = %d, time = %lluus", m_ultraviolet, m_fired_time); + + return true; +} + +bool ultraviolet_sensor_hal::is_data_ready(bool wait) +{ + bool ret; + ret = update_value(wait); + return ret; +} + +int ultraviolet_sensor_hal::get_sensor_data(sensor_data_t &data) +{ + AUTOLOCK(m_value_mutex); + data.accuracy = SENSOR_ACCURACY_GOOD; + data.timestamp = m_fired_time ; + data.value_count = 1; + data.values[0] = (float) m_ultraviolet; + + return 0; +} + + +bool ultraviolet_sensor_hal::get_properties(sensor_properties_t &properties) +{ + properties.name = m_chip_name; + properties.vendor = m_vendor; + properties.min_range = m_min_range; + properties.max_range = m_max_range; + properties.min_interval = 1; + properties.resolution = m_raw_data_unit; + properties.fifo_count = 0; + properties.max_batch_count = 0; + + return true; +} + +extern "C" sensor_module* create(void) +{ + ultraviolet_sensor_hal *sensor; + + try { + sensor = new(std::nothrow) ultraviolet_sensor_hal; + } catch (int err) { + ERR("Failed to create module, err: %d, cause: %s", err, strerror(err)); + return NULL; + } + + sensor_module *module = new(std::nothrow) sensor_module; + retvm_if(!module || !sensor, NULL, "Failed to allocate memory"); + + module->sensors.push_back(sensor); + return module; +} diff --git a/src/ultraviolet/ultraviolet_sensor_hal.h b/src/ultraviolet/ultraviolet_sensor_hal.h new file mode 100755 index 0000000..87caf83 --- /dev/null +++ b/src/ultraviolet/ultraviolet_sensor_hal.h @@ -0,0 +1,68 @@ +/* + * ultraviolet_sensor_hal + * + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _ULTRAVIOLET_SENSOR_HAL_H_ +#define _ULTRAVIOLET_SENSOR_HAL_H_ + +#include +#include + +using std::string; + +class ultraviolet_sensor_hal : public sensor_hal +{ +public: + ultraviolet_sensor_hal(); + virtual ~ultraviolet_sensor_hal(); + string get_model_id(void); + sensor_type_t get_type(void); + bool enable(void); + bool disable(void); + bool set_interval(unsigned long val); + bool is_data_ready(bool wait); + virtual int get_sensor_data(sensor_data_t &data); + virtual bool get_properties(sensor_properties_t &properties); +private: + string m_model_id; + string m_vendor; + string m_chip_name; + + float m_min_range; + float m_max_range; + float m_raw_data_unit; + + unsigned long m_polling_interval; + + int m_ultraviolet; + + unsigned long long m_fired_time; + int m_node_handle; + + string m_enable_node; + string m_data_node; + string m_interval_node; + + bool m_sensorhub_controlled; + + cmutex m_value_mutex; + + bool update_value(bool wait); +}; +#endif /*_ULTRAVIOLET_SENSOR_HAL_CLASS_H_*/ + -- 2.7.4 From 6254e18b3f0391f27b6f8b09b2a5a96bdb328890 Mon Sep 17 00:00:00 2001 From: Vibhor Gaur Date: Thu, 8 Jan 2015 18:11:35 +0530 Subject: [PATCH 16/16] Fixing memory leak issues in test files Change-Id: I1aeeab6fc7e02c7d75c1f7671f9f77afbd42954f --- test/src/accelerometer.c | 4 ++++ test/src/gravity.c | 2 ++ test/src/gyro.c | 4 ++++ test/src/light.c | 4 ++++ test/src/linear_acceleration.c | 2 ++ test/src/orientation.c | 2 ++ test/src/pressure.c | 4 ++++ test/src/proxi.c | 4 ++++ test/src/temperature.c | 4 ++++ 9 files changed, 30 insertions(+) diff --git a/test/src/accelerometer.c b/test/src/accelerometer.c index fe61f37..cef4971 100644 --- a/test/src/accelerometer.c +++ b/test/src/accelerometer.c @@ -73,6 +73,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't start accelerometer SENSOR\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } @@ -89,6 +90,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't disconnect Accelerometer sensor\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } } @@ -112,6 +114,7 @@ int main(int argc,char **argv) printf("Error\n\n\n\n"); sf_unregister_event(handle, event); sf_disconnect(handle); + free(event_condition); return -1; } @@ -125,6 +128,7 @@ int main(int argc,char **argv) if (stop_handle < 0) { printf("Error\n\n"); return -1; + free(event_condition); } sf_disconnect(handle); diff --git a/test/src/gravity.c b/test/src/gravity.c index a055013..d3cba2d 100755 --- a/test/src/gravity.c +++ b/test/src/gravity.c @@ -86,6 +86,7 @@ int main(int argc,char **argv) printf("Error\n\n\n\n"); sf_unregister_event(handle, event); sf_disconnect(handle); + free(event_condition); return -1; } @@ -97,6 +98,7 @@ int main(int argc,char **argv) if (stop_handle < 0) { printf("Error\n\n"); + free(event_condition); return -1; } diff --git a/test/src/gyro.c b/test/src/gyro.c index 915971b..a3332f7 100644 --- a/test/src/gyro.c +++ b/test/src/gyro.c @@ -75,6 +75,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't start gyroscope SENSOR\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } @@ -91,6 +92,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't disconnect gyroscope sensor\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } } @@ -114,6 +116,7 @@ int main(int argc,char **argv) printf("Error\n\n\n\n"); sf_unregister_event(handle, event); sf_disconnect(handle); + free(event_condition); return -1; } @@ -126,6 +129,7 @@ int main(int argc,char **argv) if (stop_handle < 0) { printf("Error\n\n"); + free(event_condition); return -1; } diff --git a/test/src/light.c b/test/src/light.c index e2b6e69..ba99732 100644 --- a/test/src/light.c +++ b/test/src/light.c @@ -75,6 +75,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't start light SENSOR\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } @@ -90,6 +91,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't disconnect light sensor\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } } @@ -113,6 +115,7 @@ int main(int argc,char **argv) printf("Error\n\n\n\n"); sf_unregister_event(handle, event); sf_disconnect(handle); + free(event_condition); return -1; } @@ -125,6 +128,7 @@ int main(int argc,char **argv) if (stop_handle < 0) { printf("Error\n\n"); + free(event_condition); return -1; } diff --git a/test/src/linear_acceleration.c b/test/src/linear_acceleration.c index e45f4cc..f992a68 100755 --- a/test/src/linear_acceleration.c +++ b/test/src/linear_acceleration.c @@ -86,6 +86,7 @@ int main(int argc,char **argv) printf("Error\n\n\n\n"); sf_unregister_event(handle, event); sf_disconnect(handle); + free(event_condition); return -1; } @@ -98,6 +99,7 @@ int main(int argc,char **argv) if (stop_handle < 0) { printf("Error\n\n"); + free(event_condition); return -1; } diff --git a/test/src/orientation.c b/test/src/orientation.c index 1886ad1..57bc82b 100755 --- a/test/src/orientation.c +++ b/test/src/orientation.c @@ -86,6 +86,7 @@ int main(int argc,char **argv) printf("Error\n\n\n\n"); sf_unregister_event(handle, event); sf_disconnect(handle); + free(event_condition); return -1; } @@ -97,6 +98,7 @@ int main(int argc,char **argv) if (stop_handle < 0) { printf("Error\n\n"); + free(event_condition); return -1; } sf_disconnect(handle); diff --git a/test/src/pressure.c b/test/src/pressure.c index 12f5734..7621160 100644 --- a/test/src/pressure.c +++ b/test/src/pressure.c @@ -75,6 +75,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't start pressure SENSOR\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } @@ -91,6 +92,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't disconnect pressure sensor\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } } @@ -114,6 +116,7 @@ int main(int argc,char **argv) printf("Error\n\n\n\n"); sf_unregister_event(handle, event); sf_disconnect(handle); + free(event_condition); return -1; } @@ -126,6 +129,7 @@ int main(int argc,char **argv) if (stop_handle < 0) { printf("Error\n\n"); + free(event_condition); return -1; } diff --git a/test/src/proxi.c b/test/src/proxi.c index 4d3092d..23da057 100644 --- a/test/src/proxi.c +++ b/test/src/proxi.c @@ -90,6 +90,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't start proximity SENSOR\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } @@ -106,6 +107,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't disconnect proximity sensor\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } } @@ -144,6 +146,7 @@ int main(int argc,char **argv) printf("Error\n\n\n\n"); sf_unregister_event(handle, event); sf_disconnect(handle); + free(event_condition); return -1; } @@ -156,6 +159,7 @@ int main(int argc,char **argv) if (stop_handle < 0) { printf("Error\n\n"); + free(event_condition); return -1; } diff --git a/test/src/temperature.c b/test/src/temperature.c index 3f852c8..01e6e81 100644 --- a/test/src/temperature.c +++ b/test/src/temperature.c @@ -74,6 +74,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't start temperature SENSOR\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } @@ -90,6 +91,7 @@ int main(int argc,char **argv) if (result < 0) { printf("Can't disconnect temperature sensor\n"); printf("Error\n\n\n\n"); + free(event_condition); return -1; } } @@ -113,6 +115,7 @@ int main(int argc,char **argv) printf("Error\n\n\n\n"); sf_unregister_event(handle, event); sf_disconnect(handle); + free(event_condition); return -1; } @@ -125,6 +128,7 @@ int main(int argc,char **argv) if (stop_handle < 0) { printf("Error\n\n"); + free(event_condition); return -1; } -- 2.7.4