sensord: refactoring the way to load virtual sensor 56/57856/2
authorkibak.yoon <kibak.yoon@samsung.com>
Mon, 25 Jan 2016 08:52:09 +0000 (17:52 +0900)
committerkibak.yoon <kibak.yoon@samsung.com>
Mon, 25 Jan 2016 11:46:31 +0000 (20:46 +0900)
Change-Id: I661bc7347ef8d5b99d56f391242669e3865f1102
Signed-off-by: kibak.yoon <kibak.yoon@samsung.com>
src/server/plugins/auto_rotation/auto_rotation_sensor.cpp
src/server/plugins/auto_rotation/auto_rotation_sensor.h
src/server/sensor_base.cpp
src/server/sensor_base.h
src/server/sensor_loader.cpp.in
src/server/sensor_loader.h
src/server/virtual_sensor.cpp
src/server/virtual_sensor.h
src/shared/sensor_hal.h

index c78a743..c50c9fd 100644 (file)
@@ -83,8 +83,6 @@ auto_rotation_sensor::auto_rotation_sensor()
        INFO("m_default_sampling_time = %d", m_default_sampling_time);
 
        m_interval = m_default_sampling_time * MS_TO_US;
-
-       init();
 }
 
 auto_rotation_sensor::~auto_rotation_sensor()
@@ -122,12 +120,12 @@ auto_rotation_alg *auto_rotation_sensor::get_alg()
        return new auto_rotation_alg_emul();
 }
 
-bool auto_rotation_sensor::init()
+bool auto_rotation_sensor::init(void)
 {
        m_accel_sensor = sensor_loader::get_instance().get_sensor(ACCELEROMETER_SENSOR);
 
        if (!m_accel_sensor) {
-               ERR("cannot load accel sensor_hal[%s]", sensor_base::get_name());
+               ERR("cannot load accel sensor_hal from %s", get_name());
                return false;
        }
 
@@ -143,7 +141,7 @@ bool auto_rotation_sensor::init()
 
        set_privilege(SENSOR_PRIVILEGE_INTERNAL);
 
-       INFO("%s is created!\n", sensor_base::get_name());
+       INFO("%s is created!\n", get_name());
 
        return true;
 }
index 92e234f..cc62e57 100644 (file)
@@ -29,7 +29,10 @@ public:
        auto_rotation_sensor();
        virtual ~auto_rotation_sensor();
 
-       /* module info */
+       /* initialize sensor */
+       bool init();
+
+       /* sensor info */
        virtual sensor_type_t get_type();
        virtual unsigned int get_event_type(void);
        virtual const char* get_name(void);
@@ -51,8 +54,6 @@ private:
        std::string m_raw_data_unit;
        int m_default_sampling_time;
 
-       bool init();
-
        auto_rotation_alg *get_alg();
        virtual bool on_start(void);
        virtual bool on_stop(void);
index cbe5966..0ff9dd1 100644 (file)
@@ -40,7 +40,6 @@ sensor_base::sensor_base()
 
 sensor_base::~sensor_base()
 {
-       INFO("%s is destroyed!\n", m_handle.name.c_str());
 }
 
 sensor_type_t sensor_base::get_type(void)
index 58b1087..7ac3e98 100644 (file)
@@ -105,7 +105,6 @@ protected:
 
 private:
        sensor_id_t m_unique_id;
-       sensor_handle_t m_handle;
        sensor_privilege_t m_privilege;
 
        int m_permission;
index 4d4b1a5..25d885b 100644 (file)
@@ -92,7 +92,7 @@ physical_sensor* sensor_loader::create_sensor(sensor_handle_t handle, sensor_dev
        int index;
        physical_sensor *sensor;
 
-       index = m_sensors.count(handle.type);
+       index = m_sensors.count((sensor_type_t)handle.type);
 
        sensor = new(std::nothrow) physical_sensor();
        if (!sensor) {
@@ -107,7 +107,7 @@ physical_sensor* sensor_loader::create_sensor(sensor_handle_t handle, sensor_dev
        return sensor;
 }
 
-bool sensor_loader::insert_sensors(std::vector<void *> devices)
+bool sensor_loader::load_physical_sensors(std::vector<void *> devices)
 {
        sensor_device *device;
        vector<sensor_handle_t> handles;
@@ -125,7 +125,7 @@ bool sensor_loader::insert_sensors(std::vector<void *> devices)
                                continue;
 
                        std::shared_ptr<sensor_base> sensor_ptr(sensor);
-                       m_sensors.insert(std::make_pair(handles[i].type, sensor_ptr));
+                       m_sensors.insert(std::make_pair((sensor_type_t)(handles[i].type), sensor_ptr));
 
                        INFO("inserted [%s] sensor", sensor->get_name());
                }
@@ -159,30 +159,47 @@ bool sensor_loader::load_sensors(void)
                        std::vector<void *> devices;
 
                        load_devices(path, devices, handle);
-                       insert_sensors(devices);
+                       load_physical_sensors(devices);
                }
        );
 
-#ifdef ENABLE_AUTO_ROTATION
-       auto_rotation_sensor* auto_rot_sensor_ptr = NULL;
+       load_virtual_sensors();
+
+       show_sensor_info();
+       return true;
+}
+
+template <typename _sensor>
+void sensor_loader::load_virtual_sensor(const char *name)
+{
+       virtual_sensor *instance = NULL;
+
        try {
-               auto_rot_sensor_ptr = new(std::nothrow) auto_rotation_sensor;
+               instance = new _sensor;
+       } catch (std::exception &e) {
+               ERR("Failed to create %s sensor, exception: %s", name, e.what());
+               return;
        } catch (int err) {
-               ERR("Failed to create auto_rotation_sensor, err: %d, cause: %s", err, strerror(err));
+               ERR("Failed to create %s sensor err: %d, cause: %s", name, err, strerror(err));
+               return;
        }
-       if (auto_rot_sensor_ptr != NULL) {
-               std::shared_ptr<sensor_base> sensor(auto_rot_sensor_ptr);
-               sensor_device_type type;
 
-               type = static_cast<sensor_device_type>(sensor->get_type());
-               sensor->set_id(type);
-
-               m_sensors.insert(std::make_pair(type, sensor));
+       if (!instance->init()) {
+               ERR("Failed to init %s", name);
+               delete instance;
+               return;
        }
-#endif
 
-       show_sensor_info();
-       return true;
+       std::shared_ptr<sensor_base> sensor(instance);
+       sensor_type_t type = sensor->get_type();
+
+       sensor->set_id(type);
+       m_sensors.insert(std::make_pair(type, sensor));
+}
+
+void sensor_loader::load_virtual_sensors(void)
+{
+       load_virtual_sensor<auto_rotation_sensor>("Auto Rotation");
 }
 
 void sensor_loader::show_sensor_info(void)
@@ -231,7 +248,7 @@ bool sensor_loader::get_paths_from_dir(const string &dir_path, vector<string> &p
 
 sensor_base* sensor_loader::get_sensor(sensor_type_t type)
 {
-       auto it_plugins = m_sensors.find(static_cast<sensor_device_type>(type));
+       auto it_plugins = m_sensors.find(type);
 
        if (it_plugins == m_sensors.end())
                return NULL;
@@ -276,7 +293,7 @@ vector<sensor_base *> sensor_loader::get_sensors(sensor_type_t type)
        if ((int)(type) == (int)SENSOR_DEVICE_ALL)
                ret = std::make_pair(m_sensors.begin(), m_sensors.end());
        else
-               ret = m_sensors.equal_range(static_cast<sensor_device_type>(type));
+               ret = m_sensors.equal_range(type);
 
        for (auto it = ret.first; it != ret.second; ++it)
                sensor_list.push_back(it->second.get());
index b0cb1eb..41b1dcb 100644 (file)
 #include <set>
 #include <memory>
 #include <physical_sensor.h>
+#include <virtual_sensor.h>
 
-class sensor_hal;
 class sensor_base;
 
-typedef std::multimap<sensor_device_type, std::shared_ptr<sensor_base>> sensor_map_t;
+typedef std::multimap<sensor_type_t, std::shared_ptr<sensor_base>> sensor_map_t;
 
 class sensor_loader
 {
@@ -45,11 +45,15 @@ private:
        sensor_loader();
 
        bool load_devices(const std::string &path, std::vector<void *> &devices, void* &handle);
+
        physical_sensor* create_sensor(sensor_handle_t handle, sensor_device *device);
-       bool insert_sensors(std::vector<void *> hals);
-       void show_sensor_info(void);
+       bool load_physical_sensors(std::vector<void *> devices);
 
-       bool get_paths_from_dir(const std::string &dir_path, std::vector<std::string> &hal_paths);
+       template <typename _sensor> void load_virtual_sensor(const char *name);
+       void load_virtual_sensors(void);
+
+       void show_sensor_info(void);
+       bool get_paths_from_dir(const std::string &dir_path, std::vector<std::string> &plugin_paths);
 
        sensor_map_t m_sensors;
 public:
index 112a3a0..ae3f9be 100644 (file)
@@ -32,6 +32,11 @@ virtual_sensor::~virtual_sensor()
 
 }
 
+bool virtual_sensor::init(void)
+{
+       return false;
+}
+
 bool virtual_sensor::is_virtual(void)
 {
        return true;
index f781880..a9c998f 100644 (file)
@@ -28,6 +28,9 @@ public:
        virtual_sensor();
        virtual ~virtual_sensor();
 
+       /* initialize sensor */
+       virtual bool init();
+
        /* module info */
        virtual sensor_type_t get_type() = 0;
        virtual unsigned int get_event_type(void) = 0;
index 535ad28..b9f38c6 100644 (file)
@@ -117,6 +117,8 @@ typedef struct sensor_handle_t {
 class sensor_device
 {
 public:
+       virtual ~sensor_device() {}
+
        uint32_t get_hal_version(void)
        {
                return SENSOR_HAL_VERSION(1, 0);