From c4a3c8a910ec06ffe96917169d873bddc1026507 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 14 Apr 2017 16:44:54 +0900 Subject: [PATCH 01/16] sensord: rename fusion sensors to proper name Change-Id: Ied998d22a50464a735b7f37a893c0de51c6d282f Signed-off-by: kibak.yoon --- src/sensor/auto_rotation/auto_rotation_sensor.cpp | 4 ++-- src/sensor/gravity/gravity_comp_sensor.cpp | 4 ++-- src/sensor/gravity/gravity_lowpass_sensor.cpp | 4 ++-- src/sensor/linear_accel/linear_accel_sensor.cpp | 4 ++-- src/sensor/orientation/orientation_sensor.cpp | 4 ++-- src/sensor/rotation_vector/gyro_rv_sensor.cpp | 4 ++-- src/sensor/rotation_vector/magnetic_rv_sensor.cpp | 4 ++-- src/sensor/rotation_vector/rv_sensor.cpp | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/sensor/auto_rotation/auto_rotation_sensor.cpp b/src/sensor/auto_rotation/auto_rotation_sensor.cpp index 2a6aa98..33f1fda 100644 --- a/src/sensor/auto_rotation/auto_rotation_sensor.cpp +++ b/src/sensor/auto_rotation/auto_rotation_sensor.cpp @@ -24,8 +24,8 @@ #include "auto_rotation_alg_emul.h" -#define NAME_SENSOR "http://tizen.org/sensor/auto_rotation/AUTO_ROTATION" -#define NAME_VENDOR "Samsung" +#define NAME_SENSOR "http://tizen.org/sensor/auto_rotation/tizen_default" +#define NAME_VENDOR "tizen.org" #define SRC_ID_ACC 0x1 #define SRC_STR_ACC "http://tizen.org/sensor/accelerometer" diff --git a/src/sensor/gravity/gravity_comp_sensor.cpp b/src/sensor/gravity/gravity_comp_sensor.cpp index 2a09115..9552e74 100644 --- a/src/sensor/gravity/gravity_comp_sensor.cpp +++ b/src/sensor/gravity/gravity_comp_sensor.cpp @@ -24,8 +24,8 @@ #include #include -#define NAME_SENSOR "http://tizen.org/sensor/gravity/complementary" -#define NAME_VENDOR "Samsung" +#define NAME_SENSOR "http://tizen.org/sensor/gravity/tizen_complementary" +#define NAME_VENDOR "tizen.org" #define SRC_ID_ACC 0x1 #define SRC_STR_ACC "http://tizen.org/sensor/accelerometer" diff --git a/src/sensor/gravity/gravity_lowpass_sensor.cpp b/src/sensor/gravity/gravity_lowpass_sensor.cpp index f3e7d7b..bc31ce2 100644 --- a/src/sensor/gravity/gravity_lowpass_sensor.cpp +++ b/src/sensor/gravity/gravity_lowpass_sensor.cpp @@ -24,8 +24,8 @@ #include #include -#define NAME_SENSOR "http://tizen.org/sensor/gravity/lowpass" -#define NAME_VENDOR "Samsung" +#define NAME_SENSOR "http://tizen.org/sensor/gravity/tizen_lowpass" +#define NAME_VENDOR "tizen.org" #define SRC_ID_ACC 0x1 #define SRC_STR_ACC "http://tizen.org/sensor/accelerometer" diff --git a/src/sensor/linear_accel/linear_accel_sensor.cpp b/src/sensor/linear_accel/linear_accel_sensor.cpp index e46f74a..27cce33 100644 --- a/src/sensor/linear_accel/linear_accel_sensor.cpp +++ b/src/sensor/linear_accel/linear_accel_sensor.cpp @@ -23,8 +23,8 @@ #include #include -#define NAME_SENSOR "http://tizen.org/sensor/linear_accel/linear_accel" -#define NAME_VENDOR "Samsung" +#define NAME_SENSOR "http://tizen.org/sensor/linear_accel/tizen_default" +#define NAME_VENDOR "tizen.org" #define SRC_ID_ACC 0x1 #define SRC_STR_ACC "http://tizen.org/sensor/accelerometer" diff --git a/src/sensor/orientation/orientation_sensor.cpp b/src/sensor/orientation/orientation_sensor.cpp index 393ec9a..551c73f 100644 --- a/src/sensor/orientation/orientation_sensor.cpp +++ b/src/sensor/orientation/orientation_sensor.cpp @@ -23,8 +23,8 @@ #include #include -#define NAME_SENSOR "http://tizen.org/sensor/orientation/orientation" -#define NAME_VENDOR "Samsung" +#define NAME_SENSOR "http://tizen.org/sensor/orientation/tizen_default" +#define NAME_VENDOR "tizen.org" #define SRC_ID_RV 0x1 #define SRC_STR_RV "http://tizen.org/sensor/rotation_vector" diff --git a/src/sensor/rotation_vector/gyro_rv_sensor.cpp b/src/sensor/rotation_vector/gyro_rv_sensor.cpp index 3a738d0..ccafce8 100644 --- a/src/sensor/rotation_vector/gyro_rv_sensor.cpp +++ b/src/sensor/rotation_vector/gyro_rv_sensor.cpp @@ -23,8 +23,8 @@ #include #include -#define NAME_SENSOR "http://tizen.org/sensor/gyro_rotation_vector/gyro_rv" -#define NAME_VENDOR "Samsung" +#define NAME_SENSOR "http://tizen.org/sensor/gyro_rotation_vector/tizen_default" +#define NAME_VENDOR "tizen.org" #define SRC_ID_ACC 0x1 #define SRC_STR_ACC "http://tizen.org/sensor/accelerometer" diff --git a/src/sensor/rotation_vector/magnetic_rv_sensor.cpp b/src/sensor/rotation_vector/magnetic_rv_sensor.cpp index 66c8808..fd9ad36 100644 --- a/src/sensor/rotation_vector/magnetic_rv_sensor.cpp +++ b/src/sensor/rotation_vector/magnetic_rv_sensor.cpp @@ -23,8 +23,8 @@ #include #include -#define NAME_SENSOR "http://tizen.org/sensor/mag_rotation_vector/mag_rv" -#define NAME_VENDOR "Samsung" +#define NAME_SENSOR "http://tizen.org/sensor/mag_rotation_vector/tizen_default" +#define NAME_VENDOR "tizen.org" #define SRC_ID_ACC 0x1 #define SRC_STR_ACC "http://tizen.org/sensor/accelerometer" diff --git a/src/sensor/rotation_vector/rv_sensor.cpp b/src/sensor/rotation_vector/rv_sensor.cpp index 6d69cda..116541f 100644 --- a/src/sensor/rotation_vector/rv_sensor.cpp +++ b/src/sensor/rotation_vector/rv_sensor.cpp @@ -23,8 +23,8 @@ #include #include -#define NAME_SENSOR "http://tizen.org/sensor/rotation_vector/rotation_vector" -#define NAME_VENDOR "Samsung" +#define NAME_SENSOR "http://tizen.org/sensor/rotation_vector/tizen_default" +#define NAME_VENDOR "tizen.org" #define SRC_ID_ACC 0x1 #define SRC_STR_ACC "http://tizen.org/sensor/accelerometer" -- 2.7.4 From 237aeb9c0a720c59a6881f0f7922f4ca4cd3540f Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 14 Apr 2017 17:22:54 +0900 Subject: [PATCH 02/16] sensord: fix bug with invalid character(!) Change-Id: Ib35b0f4c2ea3dc1d9c169ef24fa533a99d21c9c8 Signed-off-by: kibak.yoon --- src/shared/channel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/shared/channel.cpp b/src/shared/channel.cpp index b56d49e..8dc25ac 100644 --- a/src/shared/channel.cpp +++ b/src/shared/channel.cpp @@ -25,6 +25,8 @@ #include "sensor_log.h" +#define SYSTEMD_SOCK_BUF_SIZE 40000 + using namespace ipc; class send_event_handler : public event_handler @@ -146,7 +148,7 @@ bool channel::send(message *msg) /* TODO: check buffer size(is there any linux api for this?) */ int cur_buffer_size = m_socket->get_current_buffer_size(); - retvm_if(!cur_buffer_size > 40000, false, "Failed to send data"); + retvm_if(cur_buffer_size > SYSTEMD_SOCK_BUF_SIZE, false, "Failed to send data"); send_event_handler *handler = new(std::nothrow) send_event_handler(this, msg); retvm_if(!handler, false, "Failed to allocate memory"); -- 2.7.4 From 734c56cd6d0e13c1d8fbd62a88bc55459707b533 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 14 Apr 2017 17:58:03 +0900 Subject: [PATCH 03/16] sensord: use readdir() instead of deprecated readdir_r Change-Id: Iad45c3eea70923dc6f42a966b4ed0c62fcb3ebc4 Signed-off-by: kibak.yoon --- src/server/sensor_loader.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/server/sensor_loader.cpp b/src/server/sensor_loader.cpp index 9ea7e7f..9611b3a 100644 --- a/src/server/sensor_loader.cpp +++ b/src/server/sensor_loader.cpp @@ -107,10 +107,8 @@ bool sensor_loader::load(const std::string &dir_path, std::vector &paths) { - int ret; DIR *dir = NULL; - struct dirent entry; - struct dirent *result; + struct dirent *entry; struct stat buf; std::string filename; @@ -118,14 +116,10 @@ bool sensor_loader::get_module_paths(const std::string &dir_path, std::vectord_name); if (filename == "." || filename == "..") continue; -- 2.7.4 From c7648031b5c7a12a419018cdc9fc36e50bc26946 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 20 Apr 2017 12:52:36 +0900 Subject: [PATCH 04/16] sensord: remove unnecessary usleep() Change-Id: I3190710465ea1dcdef396b84155403a6418fd210 Signed-off-by: kibak.yoon --- src/sensorctl/testcase/sensor_basic.cpp | 4 ---- src/sensorctl/testcase/unit_socket.cpp | 2 -- 2 files changed, 6 deletions(-) diff --git a/src/sensorctl/testcase/sensor_basic.cpp b/src/sensorctl/testcase/sensor_basic.cpp index 466b80a..cc56dec 100644 --- a/src/sensorctl/testcase/sensor_basic.cpp +++ b/src/sensorctl/testcase/sensor_basic.cpp @@ -92,7 +92,6 @@ static bool run_echo_command_test(const char *str, int size, int cout) 100, 1000, SENSOR_OPTION_ALWAYS_ON, basic_cb, NULL); sensor_adapter::get_handle(info, handle); - usleep(10000); for (int i = 0; i < 1024; ++i) ret &= sensor_adapter::set_attribute(handle, SENSOR_ATTR_ACCELEROMETER_INJECTION, buf, 4096); ASSERT_TRUE(ret); @@ -104,8 +103,6 @@ TESTCASE(echo_command_test, echo_command_p) { pid_t pid; - usleep(100000); - for (int i = 0; i < 100; ++i) { pid = run_process(run_echo_command_test, NULL, 0, 0); EXPECT_GE(pid, 0); @@ -115,7 +112,6 @@ TESTCASE(echo_command_test, echo_command_p) EXPECT_GE(pid, 0); ASSERT_TRUE(true); - usleep(100000); return true; } diff --git a/src/sensorctl/testcase/unit_socket.cpp b/src/sensorctl/testcase/unit_socket.cpp index 3b15b5a..2cb240f 100644 --- a/src/sensorctl/testcase/unit_socket.cpp +++ b/src/sensorctl/testcase/unit_socket.cpp @@ -130,8 +130,6 @@ static bool run_socket_client(const char *msg, int size, int count) sock.close(); - usleep(100000); - return true; } -- 2.7.4 From 678c26692677b14f3656192d6d7da42b25097886 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 20 Apr 2017 12:53:51 +0900 Subject: [PATCH 05/16] sensord: replace usleep() code with sleep() - this patch makes it a one second delay instead of 100ms. It's no problem. Change-Id: I7f291e06247716a556a0bf8fa4e4293511beec59 Signed-off-by: kibak.yoon --- src/sensorctl/testcase/unit_ipc.cpp | 47 +++++++++++++++++----------------- src/sensorctl/testcase/unit_socket.cpp | 6 ++--- src/server/main.cpp | 2 +- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/sensorctl/testcase/unit_ipc.cpp b/src/sensorctl/testcase/unit_ipc.cpp index 4528562..d820707 100644 --- a/src/sensorctl/testcase/unit_ipc.cpp +++ b/src/sensorctl/testcase/unit_ipc.cpp @@ -33,6 +33,7 @@ using namespace ipc; #define MAX_BUF_SIZE 4096 #define TEST_PATH "/run/.sensord_test.socket" +#define SLEEP_1S sleep(1) typedef bool (*process_func_t)(const char *msg, int size, int count); @@ -115,11 +116,11 @@ static bool run_ipc_client_sleep_10s(const char *str, int size, int count) msg.enclose(buf, MAX_BUF_SIZE); - usleep(10000); + SLEEP_1S; ch->send_sync(&msg); /* Test */ - sleep(1); + SLEEP_1S; ch->read_sync(reply); reply.disclose(buf); @@ -150,7 +151,7 @@ static bool run_ipc_client_small_buffer(const char *str, int size, int count) msg.enclose(buf, MAX_BUF_SIZE); - usleep(10000); + SLEEP_1S; int buf_size; ch->get_option(SO_RCVBUF, buf_size); @@ -193,7 +194,7 @@ static bool run_ipc_client_1M(const char *str, int size, int count) msg.enclose(buf, MAX_BUF_SIZE); - usleep(10000); + SLEEP_1S; for (int i = 0; i < 256; ++i) { ch->send_sync(&msg); @@ -278,7 +279,7 @@ static bool run_ipc_client_2_channel_message(const char *str, int size, int coun msg.enclose("TESTTESTTEST", 12); ch[0]->send_sync(&msg); - usleep(100000); + SLEEP_1S; ch[0]->read_sync(reply); reply.disclose(buf); ret = strncmp(buf, "TEXTTEXTTEXTTEXT", 16); @@ -289,7 +290,7 @@ static bool run_ipc_client_2_channel_message(const char *str, int size, int coun msg.enclose("TESTTESTTEST", 12); ch[1]->send_sync(&msg); - usleep(100000); + SLEEP_1S; ch[1]->read_sync(reply); reply.disclose(buf); ret = strncmp(buf, "TEXTTEXTTEXTTEXT", 16); @@ -339,7 +340,7 @@ static bool run_ipc_client(const char *str, int size, int count) msg.enclose("TESTTESTTEST", 12); ch->send_sync(&msg); - usleep(100000); + SLEEP_1S; ch->read_sync(reply); reply.disclose(buf); @@ -361,7 +362,7 @@ TESTCASE(sensor_ipc_client_sleep_1s, sleep_1s_p) pid_t pid = run_process(run_ipc_server_echo, NULL, 0, 0); EXPECT_GE(pid, 0); - usleep(100000); + SLEEP_1S; for (int i = 0; i < 3; ++i) { pid = run_process(run_ipc_client_1M, NULL, 0, 0); @@ -371,7 +372,7 @@ TESTCASE(sensor_ipc_client_sleep_1s, sleep_1s_p) bool ret = run_ipc_client_sleep_10s(NULL, 0, 0); ASSERT_TRUE(ret); - usleep(100000); + SLEEP_1S; return true; } @@ -384,7 +385,7 @@ TESTCASE(sensor_ipc_client_small_2240, ipc_client_small_2240_p) pid_t pid = run_process(run_ipc_server_echo, NULL, 0, 0); EXPECT_GE(pid, 0); - usleep(100000); + SLEEP_1S; for (int i = 0; i < 3; ++i) { pid = run_process(run_ipc_client_1M, NULL, 0, 0); @@ -394,7 +395,7 @@ TESTCASE(sensor_ipc_client_small_2240, ipc_client_small_2240_p) bool ret = run_ipc_client_small_buffer(NULL, 0, 0); ASSERT_TRUE(ret); - usleep(100000); + SLEEP_1S; return true; } @@ -407,7 +408,7 @@ TESTCASE(sensor_ipc_30_client_1M, ipc_client_p_30_1M) pid_t pid = run_process(run_ipc_server_echo, NULL, 0, 0); EXPECT_GE(pid, 0); - usleep(100000); + SLEEP_1S; for (int i = 0; i < 30; ++i) { pid = run_process(run_ipc_client_1M, NULL, 0, 0); @@ -417,7 +418,7 @@ TESTCASE(sensor_ipc_30_client_1M, ipc_client_p_30_1M) bool ret = run_ipc_client_1M(NULL, 0, 0); ASSERT_TRUE(ret); - usleep(100000); + SLEEP_1S; return true; } @@ -430,12 +431,12 @@ TESTCASE(sensor_ipc_client_2_channel_message, 2_channel_message_p) pid_t pid = run_process(run_ipc_server, NULL, 0, 0); EXPECT_GE(pid, 0); - usleep(100000); + SLEEP_1S; bool ret = run_ipc_client_2_channel_message(NULL, 0, 0); ASSERT_TRUE(ret); - usleep(100000); + SLEEP_1S; return true; } @@ -448,12 +449,12 @@ TESTCASE(sensor_ipc_client_2_channel, 2_channel_p) pid_t pid = run_process(run_ipc_server, NULL, 0, 0); EXPECT_GE(pid, 0); - usleep(100000); + SLEEP_1S; bool ret = run_ipc_client_2_channel(NULL, 0, 0); ASSERT_TRUE(ret); - usleep(100000); + SLEEP_1S; return true; } @@ -466,7 +467,7 @@ TESTCASE(sensor_ipc_100_client, ipc_client_p_100) pid_t pid = run_process(run_ipc_server, NULL, 0, 0); EXPECT_GE(pid, 0); - usleep(100000); + SLEEP_1S; for (int i = 0; i < 99; ++i) { pid = run_process(run_ipc_client, NULL, 0, 0); @@ -476,7 +477,7 @@ TESTCASE(sensor_ipc_100_client, ipc_client_p_100) bool ret = run_ipc_client(NULL, 0, 0); ASSERT_TRUE(ret); - usleep(100000); + SLEEP_1S; return true; } @@ -489,7 +490,7 @@ TESTCASE(sensor_ipc_2_client, ipc_client_p_2) pid_t pid = run_process(run_ipc_server, NULL, 0, 0); EXPECT_GE(pid, 0); - usleep(100000); + SLEEP_1S; pid = run_process(run_ipc_client, NULL, 0, 0); EXPECT_GE(pid, 0); @@ -497,7 +498,7 @@ TESTCASE(sensor_ipc_2_client, ipc_client_p_2) bool ret = run_ipc_client(NULL, 0, 0); ASSERT_TRUE(ret); - usleep(100000); + SLEEP_1S; return true; } @@ -513,12 +514,12 @@ TESTCASE(sensor_ipc_client_0, ipc_client_p_0) pid_t pid = run_process(run_ipc_server, NULL, 0, 0); EXPECT_GE(pid, 0); - usleep(100000); + SLEEP_1S; bool ret = run_ipc_client(NULL, 0, 0); ASSERT_TRUE(ret); - usleep(100000); + SLEEP_1S; return true; } diff --git a/src/sensorctl/testcase/unit_socket.cpp b/src/sensorctl/testcase/unit_socket.cpp index 2cb240f..261976f 100644 --- a/src/sensorctl/testcase/unit_socket.cpp +++ b/src/sensorctl/testcase/unit_socket.cpp @@ -76,7 +76,7 @@ static bool run_socket_echo_server(const char *msg, int size, int count) } ASSERT_EQ(total_recv_size, (size * count)); - usleep(10000); + sleep(1); /* echo message */ while (send_count++ < count) { send_size = client_sock.send(buf, size); @@ -105,7 +105,7 @@ static bool run_socket_client(const char *msg, int size, int count) int total_send_size = 0; stream_socket sock; - usleep(100000); + sleep(1); sock.create(TEST_PATH); sock.set_blocking_mode(true); @@ -197,4 +197,4 @@ TESTCASE(sensor_ipc_socket, socket_p_1000) ASSERT_TRUE(ret); return true; -} \ No newline at end of file +} diff --git a/src/server/main.cpp b/src/server/main.cpp index 90b6cf4..633630a 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -46,7 +46,7 @@ static void on_new_failed(void) return; } - usleep(100000); + sleep(1); } int main(int argc, char *argv[]) -- 2.7.4 From 86712a3de5b433121bdc457929015746b47d90d8 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 20 Apr 2017 12:56:49 +0900 Subject: [PATCH 06/16] sensord: sleep 100ms instead of a very short time Change-Id: Ib6432a072cb59bf03803915c497916695993a340 Signed-off-by: kibak.yoon --- src/shared/stream_socket.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/shared/stream_socket.cpp b/src/shared/stream_socket.cpp index cdf8ccc..0191f05 100644 --- a/src/shared/stream_socket.cpp +++ b/src/shared/stream_socket.cpp @@ -24,6 +24,8 @@ #include "sensor_log.h" +#define SLEEP_100_MS usleep(100000) + using namespace ipc; stream_socket::stream_socket() @@ -52,7 +54,7 @@ ssize_t stream_socket::on_send(const void *buffer, size_t size) const if (len < 0) { if ((errno == EINTR) || (errno == EAGAIN) || (errno == EWOULDBLOCK)) { - usleep(1); + SLEEP_100_MS; continue; } @@ -86,7 +88,7 @@ ssize_t stream_socket::on_recv(void *buffer, size_t size) const if (len < 0) { if ((errno == EINTR) || (errno == EAGAIN) || (errno == EWOULDBLOCK)) { - usleep(10000); + SLEEP_100_MS; continue; } -- 2.7.4 From 386ea83b88820e27d112cfa315322a9342b63d2e Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 20 Apr 2017 12:58:44 +0900 Subject: [PATCH 07/16] sensord: initialize cynara conf pointer to NULL Change-Id: Ie80f3ad0053001424472bb03521450cebf5a6f92 Signed-off-by: kibak.yoon --- src/server/permission_checker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/permission_checker.cpp b/src/server/permission_checker.cpp index 05ead10..bbb1ad2 100644 --- a/src/server/permission_checker.cpp +++ b/src/server/permission_checker.cpp @@ -45,7 +45,7 @@ permission_checker::~permission_checker() void permission_checker::init_cynara(void) { int err; - cynara_configuration *conf; + cynara_configuration *conf = NULL; err = cynara_configuration_create(&conf); retm_if(err != CYNARA_API_SUCCESS, "Failed to create cynara configuration"); -- 2.7.4 From 072b5143699ac00788f8ea1583d8523cb1049ab5 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 20 Apr 2017 14:34:31 +0900 Subject: [PATCH 08/16] sensord: remove sleep() in new failed handler Change-Id: I74714fe67becd945d95e869f5de96241ebe3325e Signed-off-by: kibak.yoon --- src/server/main.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/server/main.cpp b/src/server/main.cpp index 633630a..8bb6cf3 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -17,7 +17,6 @@ * */ -#include #include #include #include @@ -45,8 +44,6 @@ static void on_new_failed(void) raise(SIGTERM); return; } - - sleep(1); } int main(int argc, char *argv[]) -- 2.7.4 From 50908e9e38aa7a2ec54e7597b6946554112639ca Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Mon, 24 Apr 2017 12:33:36 +0900 Subject: [PATCH 09/16] Remove the fake packages libsensord and libsensord-devel Change-Id: Id3dec722390a5ac44b7cb1b4951f5afac7889eb9 Signed-off-by: Mu-Woong Lee --- packaging/sensord.spec | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/packaging/sensord.spec b/packaging/sensord.spec index f340404..5cdd8f2 100644 --- a/packaging/sensord.spec +++ b/packaging/sensord.spec @@ -32,7 +32,6 @@ of the Sensor Framework. The library replaces the dummy library installed by %{n %package dummy Summary: Sensor Framework 'dummy' library -Provides: libsensord Provides: %{name}-profile_tv = %{version}-%{release} %description dummy @@ -44,7 +43,6 @@ Installing %{name} replaces this dummy library with the actually functional libr Summary: Internal Sensor API (Development) Group: System/Development Requires: %{name}-dummy = %{version}-%{release} -Provides: libsensord-devel %description devel Internal Sensor API (Development) @@ -66,24 +64,6 @@ Group: System/Testing Sensor functional testing -# These dummy packages will be removed later. -%package -n libsensord -Summary: Dummy package for backward compatibility -Requires: sensord - -%description -n libsensord -A yaml requires libsensord explicitly. This is a temporal solution to prevent image creation failures. - - -%package -n libsensord-devel -Summary: Dummy package for backward compatibility -Requires: sensord-devel - -%description -n libsensord-devel -Some packages require libsensord-devel directly, and it causes local gbs build failures -with the old build snapshots. This is a temporal solution to handle such cases. - - %prep %setup -q @@ -153,8 +133,3 @@ echo "You need to reinstall %{name}-dummy to keep using the APIs after uninstall %files -n sensor-test %{_bindir}/sensorctl - - -%files -n libsensord - -%files -n libsensord-devel -- 2.7.4 From 969b3950ec6adcaf47763702805de7c2a444212c Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 24 Apr 2017 12:42:53 +0900 Subject: [PATCH 10/16] sensord: add skeleton APIs for sensor provider Change-Id: I22659ac09301f7ba12b2de4613217b78faefdaa4 Signed-off-by: kibak.yoon --- include/sensor_internal.h | 41 +++++++- src/client-dummy/client_dummy.cpp | 92 ++++++++++++++++++ src/client/sensor_internal.cpp | 195 +++++++++++++++++++++++++++++++++----- 3 files changed, 300 insertions(+), 28 deletions(-) diff --git a/include/sensor_internal.h b/include/sensor_internal.h index 506c869..9911949 100644 --- a/include/sensor_internal.h +++ b/include/sensor_internal.h @@ -379,13 +379,50 @@ bool sensord_get_data(int handle, unsigned int data_id, sensor_data_t* sensor_da */ bool sensord_flush(int handle); -typedef void (*sensor_external_command_cb_t)(int handle, const char* data, int data_cnt, void *user_data); +bool sensord_set_passive_mode(int handle, bool passive); + + +/* Sensor Internal API using URI */ +int sensord_get_default_sensor_by_uri(const char *uri, sensor_t *sensor); +int sensord_get_sensors_by_uri(const char *uri, sensor_t **list, int *sensor_count); + +typedef void (*sensord_added_cb)(const char *uri, void *user_data); +int sensord_add_sensor_added_cb(sensord_added_cb callback, void *user_data); +int sensord_remove_sensor_added_cb(sensord_added_cb callback); + +typedef void (*sensord_removed_cb)(const char *uri, void *user_data); +int sensord_add_sensor_removed_cb(sensord_removed_cb callback, void *user_data); +int sensord_remove_sensor_removed_cb(sensord_removed_cb callback); + +/* Sensor provider */ +typedef void *sensord_provider_h; +int sensord_create_provider(const char *uri, sensord_provider_h *provider); +int sensord_destroy_provider(sensord_provider_h provider); +int sensord_add_provider(sensord_provider_h provider); +int sensord_remove_provider(sensord_provider_h provider); +int sensord_provider_set_name(sensord_provider_h provider, const char *name); +int sensord_provider_set_vendor(sensord_provider_h provider, const char *vendor); +int sensord_provider_set_range(sensord_provider_h provider, float min_range, float max_range); +int sensord_provider_set_resolution(sensord_provider_h provider, float resolution); + +typedef void (*sensord_provider_start_cb)(sensord_provider_h provider, void *user_data); +int sensord_provider_set_start_cb(sensord_provider_h provider, sensord_provider_start_cb callback, void *user_data); + +typedef void (*sensord_provider_stop_cb)(sensord_provider_h provider, void *user_data); +int sensord_provider_set_stop_cb(sensord_provider_h provider, sensord_provider_stop_cb callback, void *user_data); + +typedef void (*sensord_provider_set_interval_cb)(sensord_provider_h provider, unsigned int interval_ms, void *user_data); +int sensord_provider_set_set_interval_cb(sensord_provider_h provider, sensord_provider_set_interval_cb callback, void *user_data); + +int sensord_provider_publish(sensord_provider_h provider, sensor_data_t data); + +/* Deprecated */ +typedef void (*sensor_external_command_cb_t)(int handle, const char* data, int data_cnt, void *user_data); int sensord_external_connect(const char *key, sensor_external_command_cb_t cb, void *user_data); bool sensord_external_disconnect(int handle); bool sensord_external_post(int handle, unsigned long long timestamp, const float* data, int data_cnt); -bool sensord_set_passive_mode(int handle, bool passive); /** * @} */ diff --git a/src/client-dummy/client_dummy.cpp b/src/client-dummy/client_dummy.cpp index 0baf94e..ee2de11 100644 --- a/src/client-dummy/client_dummy.cpp +++ b/src/client-dummy/client_dummy.cpp @@ -202,3 +202,95 @@ API bool sensord_set_passive_mode(int handle, bool passive) { return false; } + +/* Sensor Internal API using URI */ +API int sensord_get_default_sensor_by_uri(const char *uri, sensor_t *sensor) +{ + return OP_ERROR; +} + +API int sensord_get_sensors_by_uri(const char *uri, sensor_t **list, int *count) +{ + return OP_ERROR; +} + +API int sensord_add_sensor_added_cb(sensord_added_cb callback, void *user_data) +{ + return OP_ERROR; +} + +API int sensord_remove_sensor_added_cb(sensord_added_cb callback) +{ + return OP_ERROR; +} + +API int sensord_add_sensor_removed_cb(sensord_removed_cb callback, void *user_data) +{ + return OP_ERROR; +} + +API int sensord_remove_sensor_removed_cb(sensord_removed_cb callback) +{ + return OP_ERROR; +} + +/* Sensor provider */ +API int sensord_create_provider(const char *uri, sensord_provider_h *provider) +{ + return OP_ERROR; +} + +API int sensord_destroy_provider(sensord_provider_h provider) +{ + return OP_ERROR; +} + +API int sensord_add_provider(sensord_provider_h provider) +{ + return OP_ERROR; +} + +API int sensord_remove_provider(sensord_provider_h provider) +{ + return OP_ERROR; +} + +API int sensord_provider_set_name(sensord_provider_h provider, const char *name) +{ + return OP_ERROR; +} + +API int sensord_provider_set_vendor(sensord_provider_h provider, const char *vendor) +{ + return OP_ERROR; +} + +API int sensord_provider_set_range(sensord_provider_h provider, float min_range, float max_range) +{ + return OP_ERROR; +} + +API int sensord_provider_set_resolution(sensord_provider_h provider, float resolution) +{ + return OP_ERROR; +} + +API int sensord_provider_set_start_cb(sensord_provider_h provider, sensord_provider_start_cb callback, void *user_data) +{ + return OP_ERROR; +} + +API int sensord_provider_set_stop_cb(sensord_provider_h provider, sensord_provider_stop_cb callback, void *user_data) +{ + return OP_ERROR; +} + +API int sensord_provider_set_set_interval_cb(sensord_provider_h provider, sensord_provider_set_interval_cb callback, void *user_data) +{ + return OP_ERROR; +} + +API int sensord_provider_publish(sensord_provider_h provider, sensor_data_t data) +{ + return OP_ERROR; +} diff --git a/src/client/sensor_internal.cpp b/src/client/sensor_internal.cpp index a0b683f..28d4e71 100644 --- a/src/client/sensor_internal.cpp +++ b/src/client/sensor_internal.cpp @@ -540,40 +540,144 @@ API bool sensord_set_passive_mode(int handle, bool passive) return true; } -API int sensord_external_connect(const char *key, sensor_external_command_cb_t cb, void *user_data) +/* Sensor Internal API using URI */ +API int sensord_get_default_sensor_by_uri(const char *uri, sensor_t *sensor) { - /* - * 1. check parameter - * 2. create handle in this client - * 3. first connection(client) - * 4. cmd_connect for external sensor with key - */ - retvm_if(!key, -EINVAL, "Invalid key"); - return 0; + retvm_if(!sensor, -EINVAL, "Invalid parameter"); + retvm_if(!manager.connect(), -EIO, "Failed to connect"); + + return OP_SUCCESS; } -API bool sensord_external_disconnect(int handle) +API int sensord_get_sensors_by_uri(const char *uri, sensor_t **list, int *count) { - /* - * 1. check parameter - * 2. create handle in this client - * 3. first connection(client) - * 4. cmd_connect for external sensor with key - * 5. disconnect this handle - * 6. if there is no active sensor, remove client id and stop listener - */ - return true; + retvm_if((!list || !count), -EINVAL, "Invalid parameter"); + retvm_if(!manager.connect(), -EIO, "Failed to connect"); + + return OP_SUCCESS; } -API bool sensord_external_post(int handle, unsigned long long timestamp, const float* data, int data_cnt) +API int sensord_add_sensor_added_cb(sensord_added_cb callback, void *user_data) { - /* - * 1. check parameter - * 1.1 (data_cnt <= 0) || (data_cnt > POST_DATA_LEN_MAX)), return false - * 2. cmd_post - */ + retvm_if(!callback, -EINVAL, "Invalid paramter"); + retvm_if(!manager.connect(), -EIO, "Failed to connect"); - return true; + return OP_SUCCESS; +} + +API int sensord_remove_sensor_added_cb(sensord_added_cb callback) +{ + retvm_if(!callback, -EINVAL, "Invalid paramter"); + retvm_if(!manager.connect(), -EIO, "Failed to connect"); + + return OP_SUCCESS; +} + +API int sensord_add_sensor_removed_cb(sensord_removed_cb callback, void *user_data) +{ + retvm_if(!callback, -EINVAL, "Invalid paramter"); + retvm_if(!manager.connect(), -EIO, "Failed to connect"); + + return OP_SUCCESS; +} + +API int sensord_remove_sensor_removed_cb(sensord_removed_cb callback) +{ + retvm_if(!callback, -EINVAL, "Invalid paramter"); + retvm_if(!manager.connect(), -EIO, "Failed to connect"); + + return OP_SUCCESS; +} + +/* Sensor provider */ +API int sensord_create_provider(const char *uri, sensord_provider_h *provider) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + + return OP_SUCCESS; +} + +API int sensord_destroy_provider(sensord_provider_h provider) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + + return OP_SUCCESS; +} + +API int sensord_add_provider(sensord_provider_h provider) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + retvm_if(!manager.connect(), -EIO, "Failed to connect"); + + return OP_SUCCESS; +} + +API int sensord_remove_provider(sensord_provider_h provider) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + retvm_if(!manager.connect(), -EIO, "Failed to connect"); + + return OP_SUCCESS; +} + +API int sensord_provider_set_name(sensord_provider_h provider, const char *name) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + + return OP_SUCCESS; +} + +API int sensord_provider_set_vendor(sensord_provider_h provider, const char *vendor) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + + return OP_SUCCESS; +} + +API int sensord_provider_set_range(sensord_provider_h provider, float min_range, float max_range) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + + return OP_SUCCESS; +} + +API int sensord_provider_set_resolution(sensord_provider_h provider, float resolution) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + + return OP_SUCCESS; +} + +API int sensord_provider_set_start_cb(sensord_provider_h provider, sensord_provider_start_cb callback, void *user_data) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + retvm_if(!callback, -EINVAL, "Invalid paramter"); + + return OP_SUCCESS; +} + +API int sensord_provider_set_stop_cb(sensord_provider_h provider, sensord_provider_stop_cb callback, void *user_data) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + retvm_if(!callback, -EINVAL, "Invalid paramter"); + + + return OP_SUCCESS; +} + +API int sensord_provider_set_set_interval_cb(sensord_provider_h provider, sensord_provider_set_interval_cb callback, void *user_data) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + retvm_if(!callback, -EINVAL, "Invalid paramter"); + + return OP_SUCCESS; +} + +API int sensord_provider_publish(sensord_provider_h provider, sensor_data_t data) +{ + retvm_if(!provider, -EINVAL, "Invalid paramter"); + + return OP_SUCCESS; } /* deperecated */ @@ -642,3 +746,42 @@ API bool sensord_get_privilege(sensor_t sensor, sensor_privilege_t *privilege) return true; } +/* deprecated */ +API int sensord_external_connect(const char *key, sensor_external_command_cb_t cb, void *user_data) +{ + /* + * 1. check parameter + * 2. create handle in this client + * 3. first connection(client) + * 4. cmd_connect for external sensor with key + */ + retvm_if(!key, -EINVAL, "Invalid key"); + return 0; +} + +/* deprecated */ +API bool sensord_external_disconnect(int handle) +{ + /* + * 1. check parameter + * 2. create handle in this client + * 3. first connection(client) + * 4. cmd_connect for external sensor with key + * 5. disconnect this handle + * 6. if there is no active sensor, remove client id and stop listener + */ + return true; +} + +/* deprecated */ +API bool sensord_external_post(int handle, unsigned long long timestamp, const float* data, int data_cnt) +{ + /* + * 1. check parameter + * 1.1 (data_cnt <= 0) || (data_cnt > POST_DATA_LEN_MAX)), return false + * 2. cmd_post + */ + + return true; +} + -- 2.7.4 From feb74e9870e092bc3086ef9162af02fb62b75c2c Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 24 Apr 2017 14:24:56 +0900 Subject: [PATCH 11/16] sensord: add testcase for sensor-provider APIs 1. add "http://tizen.org/sensor/mysensor/mysensor" 2. publish events to sensor listeners 3. start/stop/set_interval callbacks 4. sensor_added_cb/sensor_removed_cb callbacks Change-Id: I98c49388ecfcd677c2c517cfb1e1d4cf3f405f26 Signed-off-by: kibak.yoon --- src/sensorctl/testcase/unit_client.cpp | 180 +++++++++++++++++++++++++++++++-- 1 file changed, 170 insertions(+), 10 deletions(-) diff --git a/src/sensorctl/testcase/unit_client.cpp b/src/sensorctl/testcase/unit_client.cpp index 1034573..661e4a0 100644 --- a/src/sensorctl/testcase/unit_client.cpp +++ b/src/sensorctl/testcase/unit_client.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -132,23 +133,182 @@ TESTCASE(sensor_api_all, all_p_1) return true; } -TESTCASE(sensor_api_provider, provider_base_p_1) +static bool m_start = false; + +static void start_cb(sensord_provider_h provider, void *user_data) +{ + m_start = true; + _N("START\n"); +} + +static void stop_cb(sensord_provider_h provider, void *user_data) +{ + m_start = false; + _N("STOP\n"); +} + +static void interval_cb(sensord_provider_h provider, unsigned int interval_ms, void *user_data) +{ + _N("Interval : %d\n", interval_ms); +} + +static gboolean publish(gpointer gdata) +{ + if (!m_start) return TRUE; + + sensord_provider_h *provider = reinterpret_cast(gdata); + + sensor_data_t data; + data.accuracy = 3; + data.timestamp = sensor::utils::get_timestamp(); + data.value_count = 3; + data.values[0] = 1; + data.values[1] = 2; + data.values[2] = 3; + + _N("[%llu] %f %f %f\n", data.timestamp, data.values[0], data.values[1], data.values[2]); + sensord_provider_publish(provider, data); + return TRUE; +} + +/* TODO: change it from manual test to auto-test */ +TESTCASE(sensor_api_mysensor_provider, provider_p_1) { + const char *uri = "http://example.org/mysensor/mysensor"; + const char *name = "mysensor"; + const char *vendor = "tizen"; + + int err = 0; + sensor_t sensor; + sensord_provider_h provider; + + err = sensord_create_provider(uri, &provider); + ASSERT_EQ(err, 0); + + err = sensord_provider_set_name(provider, name); + ASSERT_EQ(err, 0); + err = sensord_provider_set_vendor(provider, vendor); + ASSERT_EQ(err, 0); + err = sensord_provider_set_range(provider, 0.0f, 1.0f); + ASSERT_EQ(err, 0); + err = sensord_provider_set_resolution(provider, 0.01f); + ASSERT_EQ(err, 0); + + err = sensord_add_provider(provider); + ASSERT_EQ(err, 0); + + err = sensord_provider_set_start_cb(provider, start_cb, NULL); + ASSERT_EQ(err, 0); + err = sensord_provider_set_stop_cb(provider, stop_cb, NULL); + ASSERT_EQ(err, 0); + err = sensord_provider_set_set_interval_cb(provider, interval_cb, NULL); + ASSERT_EQ(err, 0); + + err = sensord_get_default_sensor_by_uri(uri, &sensor); + ASSERT_EQ(err, 0); + + g_timeout_add_seconds(1, publish, provider); + mainloop::run(); + + err = sensord_remove_provider(provider); + ASSERT_EQ(err, 0); + err = sensord_destroy_provider(provider); + ASSERT_EQ(err, 0); + + return true; +} + +TESTCASE(sensor_api_mysensor_listener, listener_p_1) +{ + const char *uri = "http://example.org/mysensor/mysensor"; + int err; bool ret; int handle; + sensor_t sensor; - handle = sensord_external_connect("TEST", NULL, NULL); - ASSERT_GE(handle, 0); + called = false; - for (int k = 0; k < 1000; ++k) { - float data[3] = { 1, 2, 3 }; - ret = sensord_external_post(handle, 1, data, 3); - ASSERT_TRUE(ret); - sleep(1); - } + err = sensord_get_default_sensor_by_uri(uri, &sensor); + ASSERT_EQ(err, 0); + + handle = sensord_connect(sensor); + ASSERT_EQ(err, 0); + + ret = sensord_register_event(handle, 1, 100, 100, basic_cb, NULL); + ASSERT_TRUE(ret); + + ret = sensord_start(handle, 0); + ASSERT_TRUE(ret); - ret = sensord_external_disconnect(handle); + ret = sensord_change_event_interval(handle, 0, 100); ASSERT_TRUE(ret); + mainloop::run(); + + ret = sensord_stop(handle); + ASSERT_TRUE(ret); + + ret = sensord_unregister_event(handle, 1); + ASSERT_TRUE(ret); + + ret = sensord_disconnect(handle); + ASSERT_TRUE(ret); + + return true; +} + +static void add_mysensor(void) +{ + const char *uri = "http://example.org/mysensor/mysensor"; + const char *name = "mysensor"; + const char *vendor = "tizen"; + + sensord_provider_h provider; + + sensord_create_provider(uri, &provider); + sensord_provider_set_name(provider, name); + sensord_provider_set_vendor(provider, vendor); + sensord_provider_set_range(provider, 0.0f, 1.0f); + sensord_provider_set_resolution(provider, 0.01f); + + sensord_add_provider(provider); + + sensord_remove_provider(provider); + sensord_destroy_provider(provider); +} + +static bool added = false; + +static void added_cb(const char *uri, void *user_data) +{ + _I("ADDED[%s]\n", uri); + added = true; +} + +static void removed_cb(const char *uri, void *user_data) +{ + _I("REMOVED[%s]\n", uri); + if (added) + mainloop::stop(); +} + +TESTCASE(sensor_api_mysensor_cb, mysensor_cb_p_1) +{ + int ret; + + ret = sensord_add_sensor_added_cb(added_cb, NULL); + ASSERT_EQ(ret, 0); + ret = sensord_add_sensor_removed_cb(removed_cb, NULL); + ASSERT_EQ(ret, 0); + + add_mysensor(); + + mainloop::run(); + + ret = sensord_remove_sensor_added_cb(added_cb); + ASSERT_EQ(ret, 0); + ret = sensord_remove_sensor_removed_cb(removed_cb); + ASSERT_EQ(ret, 0); + return true; } -- 2.7.4 From 58b1ae9412d02ba8ffd9e48c1f45992289b6cd0d Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 24 Apr 2017 15:33:27 +0900 Subject: [PATCH 12/16] sensord: remove set/get API for the URI of sensor type - It doesn't necessary because it is already contained in the URI. Change-Id: I3a360004441558a5498face4211c5512db68a1e9 Signed-off-by: kibak.yoon --- src/server/application_sensor_handler.cpp | 3 +-- src/shared/sensor_info.cpp | 26 ++++---------------------- src/shared/sensor_info.h | 6 +----- 3 files changed, 6 insertions(+), 29 deletions(-) diff --git a/src/server/application_sensor_handler.cpp b/src/server/application_sensor_handler.cpp index 48e50be..1070156 100644 --- a/src/server/application_sensor_handler.cpp +++ b/src/server/application_sensor_handler.cpp @@ -35,8 +35,7 @@ application_sensor_handler::~application_sensor_handler() int application_sensor_handler::post(sensor_data_t *data, int len) { - std::string uri = m_info.get_type_uri(); - + std::string uri = m_info.get_uri(); return notify(uri.c_str(), data, len); } diff --git a/src/shared/sensor_info.cpp b/src/shared/sensor_info.cpp index 7ff31f4..c2d95c3 100644 --- a/src/shared/sensor_info.cpp +++ b/src/shared/sensor_info.cpp @@ -30,7 +30,6 @@ using namespace sensor; sensor_info::sensor_info() : m_type(UNKNOWN_SENSOR) -, m_type_uri(SENSOR_UNKNOWN_TYPE) , m_uri(SENSOR_UNKNOWN_NAME) , m_model(SENSOR_UNKNOWN_NAME) , m_vendor(SENSOR_UNKNOWN_NAME) @@ -46,7 +45,6 @@ sensor_info::sensor_info() sensor_info::sensor_info(const sensor_info &info) : m_type(info.m_type) -, m_type_uri(info.m_type_uri) , m_uri(info.m_uri) , m_model(info.m_model) , m_vendor(info.m_vendor) @@ -63,13 +61,12 @@ sensor_info::sensor_info(const sensor_info &info) sensor_info::sensor_info(const sensor_info_t &info) { /* TODO: HAL should change name from single name to URI */ - const char *type_uri = sensor::utils::get_uri((sensor_type_t)info.type); - std::string name(type_uri); - name.append("/").append(info.name); + const char *type = sensor::utils::get_uri((sensor_type_t)info.type); + std::string uri(type); + uri.append("/").append(info.name); set_type((sensor_type_t)info.type); - set_type_uri(type_uri); - set_uri(name.c_str()); + set_uri(uri.c_str()); set_model(info.model_name); set_vendor(info.vendor); set_min_range(info.min_range); @@ -88,7 +85,6 @@ sensor_info::sensor_info(const sensor_info2_t &info) std::size_t found = uri.find_last_of("/\\"); set_type(info.type); - set_type_uri(uri.substr(0, found).c_str()); set_uri(uri.c_str()); set_model(uri.substr(found + 1, uri.length()).c_str()); set_vendor(info.vendor); @@ -106,11 +102,6 @@ sensor_type_t sensor_info::get_type(void) return m_type; } -std::string &sensor_info::get_type_uri(void) -{ - return m_type_uri; -} - std::string &sensor_info::get_uri(void) { return m_uri; @@ -166,11 +157,6 @@ void sensor_info::set_type(sensor_type_t type) m_type = type; } -void sensor_info::set_type_uri(const char *type_uri) -{ - m_type_uri = type_uri; -} - void sensor_info::set_uri(const char *name) { m_uri = name; @@ -224,7 +210,6 @@ void sensor_info::set_privilege(const char *privilege) void sensor_info::serialize(raw_data_t &data) { put(data, m_type); - put(data, m_type_uri); put(data, m_uri); put(data, m_model); put(data, m_vendor); @@ -246,7 +231,6 @@ void sensor_info::deserialize(const char *data, int data_len) it = get(it, type); m_type = (sensor_type_t)type; - it = get(it, m_type_uri); it = get(it, m_uri); it = get(it, m_model); it = get(it, m_vendor); @@ -261,7 +245,6 @@ void sensor_info::deserialize(const char *data, int data_len) void sensor_info::show(void) { - _I("Type = %s", m_type_uri.c_str()); _I("URI = %s", m_uri.c_str()); _I("Model = %s", m_model.c_str()); _I("Vendor = %s", m_vendor.c_str()); @@ -277,7 +260,6 @@ void sensor_info::show(void) void sensor_info::clear(void) { m_type = UNKNOWN_SENSOR; - m_type_uri.clear(); m_uri.clear(); m_model.clear(); m_vendor.clear(); diff --git a/src/shared/sensor_info.h b/src/shared/sensor_info.h index 2611948..91b6ba8 100644 --- a/src/shared/sensor_info.h +++ b/src/shared/sensor_info.h @@ -39,9 +39,8 @@ public: sensor_info(const sensor_info_t &info); sensor_info(const sensor_info2_t &info); - /* TODO: it would be better to get_type() returns type(URI) */ + /* TODO: it would be better to return type(URI) */ sensor_type_t get_type(void); - std::string &get_type_uri(void); std::string &get_uri(void); std::string &get_model(void); std::string &get_vendor(void); @@ -53,9 +52,7 @@ public: bool is_wakeup_supported(void); std::string &get_privilege(void); - /* TODO: it would be better to get_type() returns type(URI) */ void set_type(sensor_type_t type); - void set_type_uri(const char *type_uri); void set_uri(const char *name); void set_model(const char *name); void set_vendor(const char *vendor); @@ -75,7 +72,6 @@ public: private: sensor_type_t m_type; - std::string m_type_uri; std::string m_uri; std::string m_model; std::string m_vendor; -- 2.7.4 From 5fb868cf636b312b4fcdf825f646bad870e33341 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 24 Apr 2017 15:39:17 +0900 Subject: [PATCH 13/16] sensord: add command types/macros for sensor provider Change-Id: I6f4b5adcd116eadd0a94dd0fef69027030ac6ca6 Signed-off-by: kibak.yoon --- include/sensor_types.h | 3 +++ src/server/server_channel_handler.cpp | 2 +- src/shared/command_types.h | 30 +++++++++++++++++------------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/include/sensor_types.h b/include/sensor_types.h index 9c9426c..5342f23 100644 --- a/include/sensor_types.h +++ b/include/sensor_types.h @@ -60,6 +60,9 @@ extern "C" #define SENSOR_UNKNOWN_TYPE "http://tizen.org/sensor/unknown" #define SENSOR_UNKNOWN_NAME "Unknown" +#define PRIV_APPLICATION_SENSOR "http://tizen.org/privilege/applicationsensor" +#define PRIV_APPLICATION_SENSOR_WRITE "http://tizen.org/privilege/applicationsensor.write" + typedef int64_t sensor_id_t; typedef void *sensor_t; diff --git a/src/server/server_channel_handler.cpp b/src/server/server_channel_handler.cpp index 6fad489..d5ad86f 100644 --- a/src/server/server_channel_handler.cpp +++ b/src/server/server_channel_handler.cpp @@ -82,7 +82,7 @@ void server_channel_handler::read(channel *ch, message &msg) err = provider_connect(ch, msg); break; case CMD_PROVIDER_DISCONNECT: err = provider_disconnect(ch, msg); break; - case CMD_PROVIDER_POST: + case CMD_PROVIDER_PUBLISH: err = provider_post(ch, msg); break; case CMD_HAS_PRIVILEGE: err = has_privileges(ch, msg); break; diff --git a/src/shared/command_types.h b/src/shared/command_types.h index a75ef6e..0ada031 100644 --- a/src/shared/command_types.h +++ b/src/shared/command_types.h @@ -32,7 +32,11 @@ enum cmd_type_e { CMD_NONE = 0, /* Manager */ + CMD_MANAGER_CONNECT, + CMD_MANAGER_DISCONNECT, CMD_MANAGER_SENSOR_LIST, + CMD_MANAGER_SENSOR_ADDED, + CMD_MANAGER_SENSOR_REMOVED, /* Listener */ CMD_LISTENER_EVENT, @@ -45,11 +49,13 @@ enum cmd_type_e { CMD_LISTENER_ATTR_STR, CMD_LISTENER_GET_DATA, - /* Provider(Dyanmic/External sensor) */ - CMD_PROVIDER_CMD_EVENT, + /* Provider */ CMD_PROVIDER_CONNECT, CMD_PROVIDER_DISCONNECT, - CMD_PROVIDER_POST, + CMD_PROVIDER_START, + CMD_PROVIDER_STOP, + CMD_PROVIDER_ATTR_INT, + CMD_PROVIDER_PUBLISH, CMD_HAS_PRIVILEGE, @@ -98,22 +104,20 @@ typedef struct { } cmd_listener_get_data_t; typedef struct { - int provider_id; - int sensor_id; - char sensor[NAME_MAX]; - char s_info[0]; + char info[0]; } cmd_provider_connect_t; typedef struct { - int provider_id; - char sensor[NAME_MAX]; } cmd_provider_disconnect_t; typedef struct { - int provider_id; - char sensor[NAME_MAX]; - sensorhub_data_t base_data; -} cmd_provider_post_t; + sensor_data_t data; +} cmd_provider_publish_t; + +typedef struct { + int attribute; + int value; +} cmd_provider_attr_int_t; typedef struct { char sensor[NAME_MAX]; -- 2.7.4 From 9c8b05e50e8110d164560bfd74e0c26d7a576c17 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 24 Apr 2017 15:45:21 +0900 Subject: [PATCH 14/16] sensord: add sensor_provider for app-level sensor Change-Id: Ic0e02eafabe455e711a52ae1db1e86dae707f975 Signed-off-by: kibak.yoon --- src/client/sensor_provider.cpp | 203 +++++++++++++++++++++++++++++++++ src/client/sensor_provider.h | 75 ++++++++++++ src/client/sensor_provider_handler.cpp | 87 ++++++++++++++ src/client/sensor_provider_handler.h | 60 ++++++++++ 4 files changed, 425 insertions(+) create mode 100644 src/client/sensor_provider.cpp create mode 100644 src/client/sensor_provider.h create mode 100644 src/client/sensor_provider_handler.cpp create mode 100644 src/client/sensor_provider_handler.h diff --git a/src/client/sensor_provider.cpp b/src/client/sensor_provider.cpp new file mode 100644 index 0000000..b07fec5 --- /dev/null +++ b/src/client/sensor_provider.cpp @@ -0,0 +1,203 @@ +/* + * sensord + * + * Copyright (c) 2017 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 "sensor_provider.h" + +#include +#include +#include +#include +#include +#include + +#include "sensor_provider_handler.h" + +using namespace sensor; + +sensor_provider::sensor_provider(const char *uri) +: m_client(NULL) +, m_channel(NULL) +, m_handler(NULL) +, m_connected(false) +{ + init(uri); +} + +sensor_provider::~sensor_provider() +{ + deinit(); +} + +bool sensor_provider::init(const char *uri) +{ + m_client = new(std::nothrow) ipc::ipc_client(SENSOR_CHANNEL_PATH); + retvm_if(!m_client, false, "Failed to allocate memory"); + + m_handler = new(std::nothrow) sensor_provider_handler(this); + if (!m_handler) { + delete m_client; + return false; + } + + m_sensor.set_uri(uri); + m_sensor.set_min_range(0); + m_sensor.set_max_range(1); + m_sensor.set_resolution(1); + m_sensor.set_privilege(PRIV_APPLICATION_SENSOR); + + return true; +} + +void sensor_provider::deinit(void) +{ + disconnect(); + + delete m_handler; + m_handler = NULL; + + delete m_client; + m_client = NULL; +} + +const char *sensor_provider::get_uri(void) +{ + return m_sensor.get_uri().c_str(); +} + +sensor_info *sensor_provider::get_sensor_info(void) +{ + return &m_sensor; +} + +int sensor_provider::serialize(sensor_info *info, char **bytes) +{ + int size; + raw_data_t *raw = new(std::nothrow) raw_data_t; + retvm_if(!raw, -ENOMEM, "Failed to allocated memory"); + + info->serialize(*raw); + + *bytes = new(std::nothrow) char[raw->size()]; + retvm_if(!*bytes, -ENOMEM, "Failed to allocate memory"); + + std::copy(raw->begin(), raw->end(), *bytes); + + size = raw->size(); + delete raw; + + return size; +} + +int sensor_provider::send_sensor_info(sensor_info *info) +{ + char *bytes; + int size; + + size = serialize(info, &bytes); + + ipc::message msg((const char *)bytes, size); + msg.set_type(CMD_PROVIDER_CONNECT); + + m_channel->send_sync(&msg); + + return OP_SUCCESS; +} + +bool sensor_provider::connect(void) +{ + m_channel = m_client->connect(m_handler, &m_loop); + retvm_if(!m_channel, false, "Failed to connect to server"); + + /* serialize and send sensor info */ + send_sensor_info(get_sensor_info()); + + /* check error */ + ipc::message reply; + m_channel->read_sync(reply); + retv_if(reply.header()->err < 0, reply.header()->err); + + m_connected.store(true); + + _I("Provider URI[%s]", get_uri()); + + return true; +} + +bool sensor_provider::disconnect(void) +{ + retv_if(!is_connected(), false); + m_connected.store(false); + + ipc::message msg(OP_SUCCESS); + ipc::message reply; + + msg.set_type(CMD_PROVIDER_DISCONNECT); + + m_channel->send_sync(&msg); + m_channel->read_sync(reply); + + m_channel->disconnect(); + + delete m_channel; + m_channel = NULL; + + _I("Disconnected[%s]", get_uri()); + + return true; +} + +void sensor_provider::restore(void) +{ + ret_if(!is_connected()); + retm_if(!connect(), "Failed to restore provider"); + + _D("Restored provider[%s]", get_uri()); +} + +int sensor_provider::publish(sensor_data_t *data, int len) +{ + ipc::message msg; + msg.set_type(CMD_PROVIDER_PUBLISH); + msg.enclose((const char *)data, len); + + m_channel->send_sync(&msg); + + return OP_SUCCESS; +} + +bool sensor_provider::is_connected(void) +{ + return m_connected.load(); +} + +void sensor_provider::set_start_cb(sensord_provider_start_cb cb, void *user_data) +{ + m_handler->set_start_cb(cb, user_data); +} + +void sensor_provider::set_stop_cb(sensord_provider_stop_cb cb, void *user_data) +{ + m_handler->set_stop_cb(cb, user_data); +} + +void sensor_provider::set_interval_cb(sensord_provider_set_interval_cb cb, void *user_data) +{ + m_handler->set_interval_cb(cb, user_data); +} + diff --git a/src/client/sensor_provider.h b/src/client/sensor_provider.h new file mode 100644 index 0000000..7fc4429 --- /dev/null +++ b/src/client/sensor_provider.h @@ -0,0 +1,75 @@ +/* + * sensord + * + * Copyright (c) 2017 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_PROVIDER_H__ +#define __SENSOR_PROVIDER_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sensor_provider_handler.h" + +namespace sensor { + +class sensor_provider { +public: + sensor_provider(const char *uri); + virtual ~sensor_provider(); + + const char *get_uri(void); + sensor_info *get_sensor_info(void); + + bool connect(void); + bool disconnect(void); + void restore(void); + + void set_start_cb(sensord_provider_start_cb cb, void *user_data); + void set_stop_cb(sensord_provider_stop_cb cb, void *user_data); + void set_interval_cb(sensord_provider_set_interval_cb cb, void *user_data); + + int publish(sensor_data_t *data, int len); + +private: + bool init(const char *uri); + void deinit(void); + + bool is_connected(void); + + int serialize(sensor_info *info, char **bytes); + int send_sensor_info(sensor_info *info); + + sensor_info m_sensor; + + ipc::ipc_client *m_client; + ipc::channel *m_channel; + ipc::event_loop m_loop; + sensor_provider_handler *m_handler; + std::atomic m_connected; +}; + +} + +#endif /* __SENSOR_PROVIDER_H__ */ diff --git a/src/client/sensor_provider_handler.cpp b/src/client/sensor_provider_handler.cpp new file mode 100644 index 0000000..7f3f366 --- /dev/null +++ b/src/client/sensor_provider_handler.cpp @@ -0,0 +1,87 @@ +/* + * sensord + * + * Copyright (c) 2017 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 "sensor_provider_handler.h" + +#include +#include +#include "sensor_provider.h" + +using namespace sensor; + +sensor_provider_handler::sensor_provider_handler(sensor_provider *provider) +: m_provider(provider) +{ +} + +void sensor_provider_handler::connected(ipc::channel *ch) +{ + _I("Connected"); +} + +void sensor_provider_handler::disconnected(ipc::channel *ch) +{ + /* TODO */ + /* m_provider->restore(); */ +} + +void sensor_provider_handler::read(ipc::channel *ch, ipc::message &msg) +{ + switch (msg.type()) { + case CMD_PROVIDER_START: + m_start_cb(m_provider, m_start_user_data); + break; + case CMD_PROVIDER_STOP: + m_stop_cb(m_provider, m_stop_user_data); + break; + case CMD_PROVIDER_ATTR_INT: + cmd_provider_attr_int_t buf; + msg.disclose((char *)&buf); + + if (buf.attribute == SENSORD_ATTRIBUTE_INTERVAL) + m_set_interval_cb(m_provider, buf.value, m_set_interval_user_data); + break; + } +} + +void sensor_provider_handler::read_complete(ipc::channel *ch) +{ +} + +void sensor_provider_handler::error_caught(ipc::channel *ch, int error) +{ +} + +void sensor_provider_handler::set_start_cb(sensord_provider_start_cb cb, void *user_data) +{ + m_start_cb = cb; + m_start_user_data = user_data; +} + +void sensor_provider_handler::set_stop_cb(sensord_provider_stop_cb cb, void *user_data) +{ + m_stop_cb = cb; + m_stop_user_data = user_data; +} + +void sensor_provider_handler::set_interval_cb(sensord_provider_set_interval_cb cb, void *user_data) +{ + m_set_interval_cb = cb; + m_set_interval_user_data = user_data; +} diff --git a/src/client/sensor_provider_handler.h b/src/client/sensor_provider_handler.h new file mode 100644 index 0000000..16bf479 --- /dev/null +++ b/src/client/sensor_provider_handler.h @@ -0,0 +1,60 @@ +/* + * sensord + * + * Copyright (c) 2017 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_PROVIDER_HANDLER__ +#define __SENSOR_PROVIDER_HANDLER__ + +#include +#include + +namespace sensor { + +class sensor_provider; + +class sensor_provider_handler : public ipc::channel_handler +{ +public: + sensor_provider_handler(sensor_provider *provider); + + void connected(ipc::channel *ch); + void disconnected(ipc::channel *ch); + void read(ipc::channel *ch, ipc::message &msg); + + void read_complete(ipc::channel *ch); + void error_caught(ipc::channel *ch, int error); + + void set_start_cb(sensord_provider_start_cb cb, void *user_data); + void set_stop_cb(sensord_provider_stop_cb cb, void *user_data); + void set_interval_cb(sensord_provider_set_interval_cb cb, void *user_data); + +private: + sensor_provider *m_provider; + + sensord_provider_start_cb m_start_cb; + sensord_provider_stop_cb m_stop_cb; + sensord_provider_set_interval_cb m_set_interval_cb; + + void *m_start_user_data; + void *m_stop_user_data; + void *m_set_interval_user_data; +}; + +} + +#endif /* __SENSOR_PROVIDER_HANDLER__ */ -- 2.7.4 From 247275695842b0f7e1c3b2b5bd40fa74302e5ce5 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 24 Apr 2017 15:48:07 +0900 Subject: [PATCH 15/16] sensord: detect that a sensor is added or removed in runtime (client-side) Change-Id: Ie9c4e93ca77f911226bce6b72f9517185bb43dd2 Signed-off-by: kibak.yoon --- src/client/sensor_manager.cpp | 111 +++++++++++++++++++++------------ src/client/sensor_manager.h | 21 ++++--- src/client/sensor_manager_handler.cpp | 113 ++++++++++++++++++++++++++++++++++ src/client/sensor_manager_handler.h | 61 ++++++++++++++++++ 4 files changed, 261 insertions(+), 45 deletions(-) create mode 100644 src/client/sensor_manager_handler.cpp create mode 100644 src/client/sensor_manager_handler.h diff --git a/src/client/sensor_manager.cpp b/src/client/sensor_manager.cpp index 2d14a4d..11c61d9 100644 --- a/src/client/sensor_manager.cpp +++ b/src/client/sensor_manager.cpp @@ -31,37 +31,11 @@ using namespace sensor; -class manager_handler : public ipc::channel_handler -{ -public: - manager_handler(sensor_manager *manager) - : m_manager(manager) - {} - void connected(ipc::channel *ch) {} - void disconnected(ipc::channel *ch) - { - /* If channel->disconnect() is not explicitly called, it will be restored */ - m_manager->restore(); - } - - void read(ipc::channel *ch, ipc::message &msg) - { - /* TODO: if dynamic sensor is loaded, - * it will be called with the sensor information */ - } - - void read_complete(ipc::channel *ch) {} - void error_caught(ipc::channel *ch, int error) {} - -private: - sensor_manager *m_manager; -}; - sensor_manager::sensor_manager() : m_client(NULL) -, m_handler(NULL) , m_channel(NULL) , m_connected(false) +, m_handler(NULL) { init(); } @@ -71,16 +45,6 @@ sensor_manager::~sensor_manager() deinit(); } -int sensor_manager::get_sensor(sensor_type_t type, sensor_t *sensor) -{ - return get_sensor(utils::get_uri(type), sensor); -} - -int sensor_manager::get_sensors(sensor_type_t type, sensor_t **list, int *count) -{ - return get_sensors(utils::get_uri(type), list, count); -} - int sensor_manager::get_sensor(const char *uri, sensor_t *sensor) { if (!is_supported(uri)) { @@ -143,12 +107,65 @@ bool sensor_manager::is_supported(const char *uri) return false; } +int sensor_manager::add_sensor(sensor_info &info) +{ + retv_if(is_supported(info.get_uri().c_str()), OP_ERROR); + + m_sensors.push_back(info); + + return OP_SUCCESS; +} + +int sensor_manager::add_sensor(sensor_provider *provider) +{ + retvm_if(!provider, -EINVAL, "Invalid parameter"); + return add_sensor(*(provider->get_sensor_info())); +} + +int sensor_manager::remove_sensor(const char *uri) +{ + for (auto it = m_sensors.begin(); it != m_sensors.end(); ++it) { + if ((*it).get_uri() == uri) { + m_sensors.erase(it); + return OP_SUCCESS; + } + } + + return OP_ERROR; +} + +int sensor_manager::remove_sensor(sensor_provider *provider) +{ + retvm_if(!provider, -EINVAL, "Invalid parameter"); + return remove_sensor(provider->get_uri()); +} + +void sensor_manager::add_sensor_added_cb(sensord_added_cb cb, void *user_data) +{ + m_handler->add_sensor_added_cb(cb, user_data); +} + +void sensor_manager::remove_sensor_added_cb(sensord_added_cb cb) +{ + m_handler->remove_sensor_added_cb(cb); +} + +void sensor_manager::add_sensor_removed_cb(sensord_removed_cb cb, void *user_data) +{ + m_handler->add_sensor_removed_cb(cb, user_data); +} + +void sensor_manager::remove_sensor_removed_cb(sensord_removed_cb cb) +{ + m_handler->remove_sensor_removed_cb(cb); +} + bool sensor_manager::init(void) { m_client = new(std::nothrow) ipc::ipc_client(SENSOR_CHANNEL_PATH); retvm_if(!m_client, false, "Failed to allocate memory"); - m_handler = new(std::nothrow) manager_handler(this); + m_handler = new(std::nothrow) sensor_manager_handler(this); if (!m_handler) { delete m_client; m_client = NULL; @@ -174,6 +191,16 @@ bool sensor_manager::connect_channel(void) m_channel = m_client->connect(m_handler, &m_loop); retvm_if(!m_channel, false, "Failed to connect to server"); + ipc::message msg; + msg.set_type(CMD_MANAGER_CONNECT); + m_channel->send_sync(&msg); + m_channel->read_sync(msg); + + if (msg.header()->err < 0) { + /* TODO: if failed, disconnect channel */ + return false; + } + m_connected.store(true); _D("Connected"); @@ -192,6 +219,14 @@ void sensor_manager::disconnect(void) { ret_if(!is_connected()); + ipc::message msg; + ipc::message reply; + msg.set_type(CMD_MANAGER_DISCONNECT); + + m_channel->send_sync(&msg); + m_channel->read_sync(reply); + retm_if(reply.header()->err < 0, "Failed to disconnect"); + m_connected.store(false); m_channel->disconnect(); diff --git a/src/client/sensor_manager.h b/src/client/sensor_manager.h index 8839943..d0fabf8 100644 --- a/src/client/sensor_manager.h +++ b/src/client/sensor_manager.h @@ -28,6 +28,8 @@ #include #include "sensor_internal.h" +#include "sensor_provider.h" +#include "sensor_manager_handler.h" namespace sensor { @@ -38,20 +40,25 @@ public: bool connect(void); void disconnect(void); + void restore(void); - int get_sensor(sensor_type_t type, sensor_t *sensor); - int get_sensors(sensor_type_t type, sensor_t **list, int *count); int get_sensor(const char *uri, sensor_t *sensor); int get_sensors(const char *uri, sensor_t **list, int *count); bool is_supported(sensor_t sensor); bool is_supported(const char *uri); - void restore(void); + /* sensor provider */ + int add_sensor(sensor_info &info); + int add_sensor(sensor_provider *provider); + int remove_sensor(const char *uri); + int remove_sensor(sensor_provider *provider); + + void add_sensor_added_cb(sensord_added_cb cb, void *user_data); + void remove_sensor_added_cb(sensord_added_cb cb); - /* TODO: register sensor_provider by using manager */ - /* int register_sensor(sensor_provider *provider); */ - /* int unregister_sensor(const char *uri) */ + void add_sensor_removed_cb(sensord_removed_cb cb, void *user_data); + void remove_sensor_removed_cb(sensord_removed_cb cb); private: typedef std::vector sensor_list_t; @@ -70,10 +77,10 @@ private: std::vector get_infos(const char *uri); ipc::ipc_client *m_client; - ipc::channel_handler *m_handler; ipc::channel *m_channel; ipc::event_loop m_loop; std::atomic m_connected; + sensor_manager_handler *m_handler; sensor_list_t m_sensors; }; diff --git a/src/client/sensor_manager_handler.cpp b/src/client/sensor_manager_handler.cpp new file mode 100644 index 0000000..5ba2acb --- /dev/null +++ b/src/client/sensor_manager_handler.cpp @@ -0,0 +1,113 @@ +/* + * sensord + * + * Copyright (c) 2017 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 "sensor_manager_handler.h" + +#include +#include +#include "sensor_manager.h" + +using namespace sensor; + +sensor_manager_handler::sensor_manager_handler(sensor_manager *manager) +: m_manager(manager) +{ +} + +void sensor_manager_handler::connected(ipc::channel *ch) +{ +} + +void sensor_manager_handler::disconnected(ipc::channel *ch) +{ + /* If channel->disconnect() is not explicitly called, it will be restored */ + m_manager->restore(); +} + +void sensor_manager_handler::read(ipc::channel *ch, ipc::message &msg) +{ + switch (msg.header()->type) { + case CMD_MANAGER_SENSOR_ADDED: + on_sensor_added(ch, msg); + break; + case CMD_MANAGER_SENSOR_REMOVED: + on_sensor_removed(ch, msg); + break; + } +} + +void sensor_manager_handler::read_complete(ipc::channel *ch) +{ +} + +void sensor_manager_handler::error_caught(ipc::channel *ch, int error) +{ +} + +void sensor_manager_handler::on_sensor_added(ipc::channel *ch, ipc::message &msg) +{ + ret_if(msg.header()->err < OP_SUCCESS); + + sensor_info info; + info.clear(); + info.deserialize(msg.body(), msg.size()); + + m_manager->add_sensor(info); + + auto it = m_sensor_added_callbacks.begin(); + while (it != m_sensor_added_callbacks.end()) { + it->first(info.get_uri().c_str(), it->second); + ++it; + } +} + +void sensor_manager_handler::on_sensor_removed(ipc::channel *ch, ipc::message &msg) +{ + ret_if(msg.header()->err < 0); + char uri[NAME_MAX] = {0, }; + + msg.disclose(uri); + m_manager->remove_sensor(uri); + + auto it = m_sensor_removed_callbacks.begin(); + while (it != m_sensor_removed_callbacks.end()) { + it->first(uri, it->second); + ++it; + } +} + +void sensor_manager_handler::add_sensor_added_cb(sensord_added_cb cb, void *user_data) +{ + m_sensor_added_callbacks.emplace(cb, user_data); +} + +void sensor_manager_handler::remove_sensor_added_cb(sensord_added_cb cb) +{ + m_sensor_added_callbacks.erase(cb); +} + +void sensor_manager_handler::add_sensor_removed_cb(sensord_removed_cb cb, void *user_data) +{ + m_sensor_removed_callbacks.emplace(cb, user_data); +} + +void sensor_manager_handler::remove_sensor_removed_cb(sensord_removed_cb cb) +{ + m_sensor_removed_callbacks.erase(cb); +} diff --git a/src/client/sensor_manager_handler.h b/src/client/sensor_manager_handler.h new file mode 100644 index 0000000..4f1ac73 --- /dev/null +++ b/src/client/sensor_manager_handler.h @@ -0,0 +1,61 @@ +/* + * sensord + * + * Copyright (c) 2017 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_MANAGER_HANDLER__ +#define __SENSOR_MANAGER_HANDLER__ + +#include +#include +#include + +namespace sensor { + +class sensor_manager; + +class sensor_manager_handler : public ipc::channel_handler +{ +public: + sensor_manager_handler(sensor_manager *manager); + void connected(ipc::channel *ch); + void disconnected(ipc::channel *ch); + void read(ipc::channel *ch, ipc::message &msg); + void read_complete(ipc::channel *ch); + void error_caught(ipc::channel *ch, int error); + + void on_sensor_added(ipc::channel *ch, ipc::message &msg); + void on_sensor_removed(ipc::channel *ch, ipc::message &msg); + + void add_sensor_added_cb(sensord_added_cb cb, void *user_data); + void remove_sensor_added_cb(sensord_added_cb cb); + + void add_sensor_removed_cb(sensord_removed_cb cb, void *user_data); + void remove_sensor_removed_cb(sensord_removed_cb cb); + +private: + typedef std::map sensor_added_cb_list_t; + typedef std::map sensor_removed_cb_list_t; + + sensor_manager *m_manager; + sensor_added_cb_list_t m_sensor_added_callbacks; + sensor_removed_cb_list_t m_sensor_removed_callbacks; +}; + +} + +#endif /* __SENSOR_MANAGER_HANDLER__ */ -- 2.7.4 From 10e723b80eebce838fd6365ba9184f8a080b298e Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 24 Apr 2017 15:53:27 +0900 Subject: [PATCH 16/16] sensord: implement URI-based and provider internal APIs Change-Id: Id76f26d41ce124323bc581fd8ceb6820e73f1be7 Signed-off-by: kibak.yoon --- src/client/sensor_internal.cpp | 101 +++++++++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 23 deletions(-) diff --git a/src/client/sensor_internal.cpp b/src/client/sensor_internal.cpp index 28d4e71..da21e1c 100644 --- a/src/client/sensor_internal.cpp +++ b/src/client/sensor_internal.cpp @@ -20,10 +20,12 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -101,29 +103,12 @@ static std::unordered_map listeners; API int sensord_get_sensors(sensor_type_t type, sensor_t **list, int *count) { - int ret = OP_ERROR; - - retvm_if((!list || !count), -EINVAL, - "Invalid parameter[%#x, %#x]", list, count); - retvm_if(!manager.connect(), -EIO, "Failed to connect"); - - ret = manager.get_sensors(type, list, count); - retv_if(ret < 0, ret); - - return OP_SUCCESS; + return sensord_get_sensors_by_uri(utils::get_uri(type), list, count); } API int sensord_get_default_sensor(sensor_type_t type, sensor_t *sensor) { - int ret = OP_ERROR; - - retvm_if(!sensor, -EINVAL, "Invalid parameter[%#x]", sensor); - retvm_if(!manager.connect(), -EIO, "Failed to connect"); - - ret = manager.get_sensor(type, sensor); - retv_if(ret < 0, ret); - - return OP_SUCCESS; + return sensord_get_default_sensor_by_uri(utils::get_uri(type), sensor); } API bool sensord_get_type(sensor_t sensor, sensor_type_t *type) @@ -158,8 +143,8 @@ API const char* sensord_get_vendor(sensor_t sensor) API bool sensord_get_min_range(sensor_t sensor, float *min_range) { - retvm_if(!manager.connect(), false, "Failed to connect"); retvm_if(!min_range, false, "Invalid parameter[%#x]", min_range); + retvm_if(!manager.connect(), false, "Failed to connect"); retvm_if(!manager.is_supported(sensor), false, "Invalid sensor[%#x]", sensor); @@ -546,7 +531,7 @@ API int sensord_get_default_sensor_by_uri(const char *uri, sensor_t *sensor) retvm_if(!sensor, -EINVAL, "Invalid parameter"); retvm_if(!manager.connect(), -EIO, "Failed to connect"); - return OP_SUCCESS; + return manager.get_sensor(uri, sensor); } API int sensord_get_sensors_by_uri(const char *uri, sensor_t **list, int *count) @@ -554,7 +539,7 @@ API int sensord_get_sensors_by_uri(const char *uri, sensor_t **list, int *count) retvm_if((!list || !count), -EINVAL, "Invalid parameter"); retvm_if(!manager.connect(), -EIO, "Failed to connect"); - return OP_SUCCESS; + return manager.get_sensors(uri, list, count); } API int sensord_add_sensor_added_cb(sensord_added_cb callback, void *user_data) @@ -562,6 +547,7 @@ API int sensord_add_sensor_added_cb(sensord_added_cb callback, void *user_data) retvm_if(!callback, -EINVAL, "Invalid paramter"); retvm_if(!manager.connect(), -EIO, "Failed to connect"); + manager.add_sensor_added_cb(callback, user_data); return OP_SUCCESS; } @@ -570,6 +556,7 @@ API int sensord_remove_sensor_added_cb(sensord_added_cb callback) retvm_if(!callback, -EINVAL, "Invalid paramter"); retvm_if(!manager.connect(), -EIO, "Failed to connect"); + manager.remove_sensor_added_cb(callback); return OP_SUCCESS; } @@ -578,6 +565,7 @@ API int sensord_add_sensor_removed_cb(sensord_removed_cb callback, void *user_da retvm_if(!callback, -EINVAL, "Invalid paramter"); retvm_if(!manager.connect(), -EIO, "Failed to connect"); + manager.add_sensor_removed_cb(callback, user_data); return OP_SUCCESS; } @@ -586,6 +574,7 @@ API int sensord_remove_sensor_removed_cb(sensord_removed_cb callback) retvm_if(!callback, -EINVAL, "Invalid paramter"); retvm_if(!manager.connect(), -EIO, "Failed to connect"); + manager.remove_sensor_removed_cb(callback); return OP_SUCCESS; } @@ -594,6 +583,12 @@ API int sensord_create_provider(const char *uri, sensord_provider_h *provider) { retvm_if(!provider, -EINVAL, "Invalid paramter"); + sensor_provider *p; + + p = new(std::nothrow) sensor_provider(uri); + retvm_if(!p, -ENOMEM, "Failed to allocate memory"); + + *provider = static_cast(p); return OP_SUCCESS; } @@ -601,6 +596,7 @@ API int sensord_destroy_provider(sensord_provider_h provider) { retvm_if(!provider, -EINVAL, "Invalid paramter"); + delete static_cast(provider); return OP_SUCCESS; } @@ -609,6 +605,18 @@ API int sensord_add_provider(sensord_provider_h provider) retvm_if(!provider, -EINVAL, "Invalid paramter"); retvm_if(!manager.connect(), -EIO, "Failed to connect"); + int ret; + sensor_provider *p = static_cast(provider); + + if (!p->connect()) + return OP_ERROR; + + ret = manager.add_sensor(p); + if (ret < 0) { + p->disconnect(); + return OP_ERROR; + } + return OP_SUCCESS; } @@ -617,6 +625,18 @@ API int sensord_remove_provider(sensord_provider_h provider) retvm_if(!provider, -EINVAL, "Invalid paramter"); retvm_if(!manager.connect(), -EIO, "Failed to connect"); + int ret; + sensor_provider *p = static_cast(provider); + + if (!p->disconnect()) + return OP_ERROR; + + ret = manager.remove_sensor(p); + if (ret < 0) { + p->connect(); + return OP_ERROR; + } + return OP_SUCCESS; } @@ -624,6 +644,11 @@ API int sensord_provider_set_name(sensord_provider_h provider, const char *name) { retvm_if(!provider, -EINVAL, "Invalid paramter"); + sensor_provider *p = static_cast(provider); + + sensor_info *info = p->get_sensor_info(); + info->set_model(name); + return OP_SUCCESS; } @@ -631,6 +656,11 @@ API int sensord_provider_set_vendor(sensord_provider_h provider, const char *ven { retvm_if(!provider, -EINVAL, "Invalid paramter"); + sensor_provider *p = static_cast(provider); + + sensor_info *info = p->get_sensor_info(); + info->set_vendor(vendor); + return OP_SUCCESS; } @@ -638,6 +668,12 @@ API int sensord_provider_set_range(sensord_provider_h provider, float min_range, { retvm_if(!provider, -EINVAL, "Invalid paramter"); + sensor_provider *p = static_cast(provider); + + sensor_info *info = p->get_sensor_info(); + info->set_min_range(min_range); + info->set_max_range(max_range); + return OP_SUCCESS; } @@ -645,6 +681,11 @@ API int sensord_provider_set_resolution(sensord_provider_h provider, float resol { retvm_if(!provider, -EINVAL, "Invalid paramter"); + sensor_provider *p = static_cast(provider); + + sensor_info *info = p->get_sensor_info(); + info->set_resolution(resolution); + return OP_SUCCESS; } @@ -653,6 +694,10 @@ API int sensord_provider_set_start_cb(sensord_provider_h provider, sensord_provi retvm_if(!provider, -EINVAL, "Invalid paramter"); retvm_if(!callback, -EINVAL, "Invalid paramter"); + sensor_provider *p = static_cast(provider); + + p->set_start_cb(callback, user_data); + return OP_SUCCESS; } @@ -661,6 +706,9 @@ API int sensord_provider_set_stop_cb(sensord_provider_h provider, sensord_provid retvm_if(!provider, -EINVAL, "Invalid paramter"); retvm_if(!callback, -EINVAL, "Invalid paramter"); + sensor_provider *p = static_cast(provider); + + p->set_stop_cb(callback, user_data); return OP_SUCCESS; } @@ -670,6 +718,10 @@ API int sensord_provider_set_set_interval_cb(sensord_provider_h provider, sensor retvm_if(!provider, -EINVAL, "Invalid paramter"); retvm_if(!callback, -EINVAL, "Invalid paramter"); + sensor_provider *p = static_cast(provider); + + p->set_interval_cb(callback, user_data); + return OP_SUCCESS; } @@ -677,7 +729,10 @@ API int sensord_provider_publish(sensord_provider_h provider, sensor_data_t data { retvm_if(!provider, -EINVAL, "Invalid paramter"); - return OP_SUCCESS; + sensor_provider *p = static_cast(provider); + + /* TODO: synchronous call is enough? */ + return p->publish(&data, sizeof(data)); } /* deperecated */ -- 2.7.4