From 3a1c4a357cf62fa345251dded841c940542198b4 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 21 Jan 2016 16:18:10 +0900 Subject: [PATCH] sensord: add sensor_event_poller for polling the event. * sensor_event_poller detects sensor_event from poll_fd. Change-Id: I29aecf10fdf504e20127bc958bb0503c1ea48b39 Signed-off-by: kibak.yoon --- src/server/sensor_event_poller.cpp | 143 +++++++++++++++++++++++++++++++++++++ src/server/sensor_event_poller.h | 41 +++++++++++ src/server/server.cpp | 17 +++++ src/server/server.h | 1 + 4 files changed, 202 insertions(+) create mode 100644 src/server/sensor_event_poller.cpp create mode 100644 src/server/sensor_event_poller.h diff --git a/src/server/sensor_event_poller.cpp b/src/server/sensor_event_poller.cpp new file mode 100644 index 0000000..2a8ec96 --- /dev/null +++ b/src/server/sensor_event_poller.cpp @@ -0,0 +1,143 @@ +/* + * libsensord-share + * + * Copyright (c) 2016 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 + +#define EPOLL_MAX_FD 32 + +sensor_event_poller::sensor_event_poller() +{ + init_sensor_map(); + init_fd(); +} + +sensor_event_poller::~sensor_event_poller() +{ +} + +void sensor_event_poller::init_sensor_map() +{ + int fd; + physical_sensor *sensor; + + std::vector sensors; + sensors = sensor_plugin_loader::get_instance().get_sensors(ALL_SENSOR); + + auto it_sensor = sensors.begin(); + + while (it_sensor != sensors.end()) { + if ((*it_sensor)->is_virtual()) { + ++it_sensor; + continue; + } + + sensor = dynamic_cast(*it_sensor); + fd = sensor->get_poll_fd(); + + m_fd_sensors.insert(std::make_pair(fd, sensor)); + ++it_sensor; + } +} + +void sensor_event_poller::init_fd() +{ + fd_sensor_plugins::iterator it; + for (it = m_fd_sensors.begin(); it != m_fd_sensors.end(); it = m_fd_sensors.upper_bound(it->first)) { + if (!add_poll_fd(it->first)) + continue; + } +} + +bool sensor_event_poller::add_poll_fd(int fd) +{ + return m_poller.add_fd(fd); +} + +bool sensor_event_poller::poll() +{ + while (true) { + int fd; + struct epoll_event poll_event; + + if (!m_poller.poll(poll_event)) + continue; + + fd = poll_event.data.fd; + + if (!is_data_ready(fd)) + continue; + + process_event(fd); + } + + return true; +} + +bool sensor_event_poller::is_data_ready(int fd) +{ + fd_sensor_plugins::iterator it; + physical_sensor *sensor; + + it = m_fd_sensors.find(fd); + sensor = dynamic_cast(it->second); + + if (!sensor) { + ERR("Failed to get sensor plugin"); + return false; + } + + if (!sensor->is_data_ready()) + return false; + + return true; +} + +bool sensor_event_poller::process_event(int fd) +{ + physical_sensor *sensor; + std::pair ret; + + ret = m_fd_sensors.equal_range(fd); + + for (auto it_sensor = ret.first; it_sensor != ret.second; ++it_sensor) { + /* + sensor_event_t event; + sensor = it_sensor->second; + + event.sensor_id = sensor->get_id(); + event.event_type = sensor->get_event_type(); + sensor->get_sensor_data(event.data); + */ + sensor_event_t *event; + int event_length; + sensor = it_sensor->second; + + event_length = sensor->get_sensor_event(&event); + event->sensor_id = sensor->get_id(); + event->event_type = sensor->get_event_type(); + + sensor->push(event, event_length); + } + + return true; +} diff --git a/src/server/sensor_event_poller.h b/src/server/sensor_event_poller.h new file mode 100644 index 0000000..51d5f26 --- /dev/null +++ b/src/server/sensor_event_poller.h @@ -0,0 +1,41 @@ +/* + * libsensord-share + * + * Copyright (c) 2016 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 + +typedef std::multimap fd_sensor_plugins; + +class sensor_event_poller { +public: + sensor_event_poller(); + virtual ~sensor_event_poller(); + + bool poll(); +private: + poller m_poller; + fd_sensor_plugins m_fd_sensors; + + void init_fd(); + void init_sensor_map(); + bool add_poll_fd(int fd); + bool is_data_ready(int fd); + bool process_event(int fd); +}; diff --git a/src/server/server.cpp b/src/server/server.cpp index 497224a..f4d8468 100755 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -22,6 +22,8 @@ #include #include #include +#include +#include using std::thread; @@ -82,6 +84,18 @@ void server::accept_client(void) } } +void server::poll_event(void) +{ + INFO("Event poller is started"); + + sensor_event_poller poller; + + if (!poller.poll()) { + ERR("Failed to poll event"); + return; + } +} + void server::run(void) { int sock_fd = -1; @@ -118,6 +132,9 @@ void server::run(void) thread client_accepter(&server::accept_client, this); client_accepter.detach(); + thread event_poller(&server::poll_event, this); + event_poller.detach(); + sd_notify(0, "READY=1"); g_main_loop_run(m_mainloop); diff --git a/src/server/server.h b/src/server/server.h index 4406433..3f6f393 100755 --- a/src/server/server.h +++ b/src/server/server.h @@ -32,6 +32,7 @@ private: server(); ~server(); + void poll_event(void); void accept_client(void); int get_systemd_socket(const char *name); public: -- 2.7.4