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()
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;
}
set_privilege(SENSOR_PRIVILEGE_INTERNAL);
- INFO("%s is created!\n", sensor_base::get_name());
+ INFO("%s is created!\n", get_name());
return true;
}
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) {
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;
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());
}
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)
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;
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());
#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
{
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: