From: Amit Dharmapurikar Date: Mon, 17 Nov 2014 09:48:22 +0000 (+0530) Subject: Synchronizing geo sensor plugin with addition of IIO interface support X-Git-Tag: submit/tizen/20150113.012540~106 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=883785aca77d83af8bb42dd45dfa0fb65d96aa01;p=platform%2Fcore%2Fsystem%2Fsensord.git Synchronizing geo sensor plugin with addition of IIO interface support Change-Id: I089d290206e03f283ed6a9bac2b1dbb8241bc219 Signed-off-by: Amit Dharmapurikar --- diff --git a/packaging/sensord.spec b/packaging/sensord.spec index 079f1cc..7420325 100755 --- a/packaging/sensord.spec +++ b/packaging/sensord.spec @@ -12,7 +12,7 @@ Source2: sensord.socket %define gyro_state ON %define proxi_state OFF %define light_state OFF -%define geo_state OFF +%define geo_state ON %define pressure_state OFF %define temperature_state OFF %define orientation_state OFF diff --git a/sensors.xml.in b/sensors.xml.in index bd078aa..37c1c34 100755 --- a/sensors.xml.in +++ b/sensors.xml.in @@ -148,11 +148,17 @@ + + + + + + diff --git a/src/geo/CMakeLists.txt b/src/geo/CMakeLists.txt index 4478781..d011093 100755 --- a/src/geo/CMakeLists.txt +++ b/src/geo/CMakeLists.txt @@ -15,13 +15,14 @@ include_directories(${CMAKE_SOURCE_DIR}/src/libsensord) include(FindPkgConfig) pkg_check_modules(rpkgs REQUIRED vconf) -add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE) +add_definitions(${rpkgs_CFLAGS} -DUSE_ONLY_ONE_MODULE -DUSE_LCD_TYPE_CHECK) set(PROJECT_MAJOR_VERSION "0") set(PROJECT_MINOR_VERSION "0") set(PROJECT_RELEASE_VERSION "1") set(CMAKE_VERBOSE_MAKEFILE OFF) + FIND_PROGRAM(UNAME NAMES uname) EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") IF("${ARCH}" MATCHES "^arm.*") diff --git a/src/geo/geo_sensor.cpp b/src/geo/geo_sensor.cpp index 6a80591..029df71 100755 --- a/src/geo/geo_sensor.cpp +++ b/src/geo/geo_sensor.cpp @@ -19,6 +19,7 @@ #include #include + #include #include @@ -26,6 +27,7 @@ geo_sensor::geo_sensor() : m_sensor_hal(NULL) +, m_resolution(0.0f) { m_name = string(SENSOR_NAME); @@ -37,7 +39,7 @@ geo_sensor::geo_sensor() geo_sensor::~geo_sensor() { - INFO("geo_sensor is destroyed!"); + INFO("geo_sensor is destroyed!\n"); } bool geo_sensor::init() @@ -49,7 +51,17 @@ bool geo_sensor::init() return false; } - INFO("%s is created!", sensor_base::get_name()); + sensor_properties_t properties; + + if (m_sensor_hal->get_properties(properties) == false) { + ERR("sensor->get_properties() is failed!\n"); + return false; + } + + m_resolution = properties.resolution; + + INFO("%s is created!\n", sensor_base::get_name()); + return true; } @@ -60,8 +72,8 @@ sensor_type_t geo_sensor::get_type(void) bool geo_sensor::working(void *inst) { - geo_sensor *sensor = (geo_sensor *)inst; - return sensor->process_event(); + geo_sensor *sensor = (geo_sensor*)inst; + return sensor->process_event();; } bool geo_sensor::process_event(void) @@ -77,8 +89,9 @@ bool geo_sensor::process_event(void) AUTOLOCK(m_mutex); if (get_client_cnt(GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME)) { + event.sensor_id = get_id(); event.event_type = GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME; - + raw_to_base(event.data); push(event); } @@ -87,10 +100,8 @@ bool geo_sensor::process_event(void) bool geo_sensor::on_start(void) { - AUTOLOCK(m_mutex); - if (!m_sensor_hal->enable()) { - ERR("m_sensor_hal start fail"); + ERR("m_sensor_hal start fail\n"); return false; } @@ -99,32 +110,20 @@ bool geo_sensor::on_start(void) bool geo_sensor::on_stop(void) { - AUTOLOCK(m_mutex); - if (!m_sensor_hal->disable()) { - ERR("m_sensor_hal stop fail"); + ERR("m_sensor_hal stop fail\n"); return false; } return stop_poll(); } -long geo_sensor::set_command(const unsigned int cmd, long value) -{ - if (m_sensor_hal->set_command(cmd, value) < 0) { - ERR("m_sensor_hal set_cmd fail"); - return -1; - } - - return 0; -} - -bool geo_sensor::get_properties(const unsigned int type, sensor_properties_t &properties) +bool geo_sensor::get_properties(sensor_properties_t &properties) { return m_sensor_hal->get_properties(properties); } -int geo_sensor::get_sensor_data(const unsigned int type, sensor_data_t &data) +int geo_sensor::get_sensor_data(unsigned int type, sensor_data_t &data) { int state; @@ -134,7 +133,7 @@ int geo_sensor::get_sensor_data(const unsigned int type, sensor_data_t &data) state = m_sensor_hal->get_sensor_data(data); if (state < 0) { - ERR("m_sensor_hal get struct_data fail"); + ERR("m_sensor_hal get struct_data fail\n"); return -1; } @@ -146,9 +145,18 @@ bool geo_sensor::set_interval(unsigned long interval) AUTOLOCK(m_mutex); INFO("Polling interval is set to %dms", interval); + return m_sensor_hal->set_interval(interval); } +void geo_sensor::raw_to_base(sensor_data_t &data) +{ + data.value_count = 3; + data.values[0] = data.values[0] * m_resolution; + data.values[1] = data.values[1] * m_resolution; + data.values[2] = data.values[2] * m_resolution; +} + extern "C" void *create(void) { geo_sensor *inst; @@ -156,14 +164,14 @@ extern "C" void *create(void) try { inst = new geo_sensor(); } catch (int err) { - ERR("Failed to create geo_sensor class, errno : %d, errstr : %s", err, strerror(err)); + ERR("geo_sensor class create fail , errno : %d , errstr : %s\n", err, strerror(err)); return NULL; } - return (void *)inst; + return (void*)inst; } extern "C" void destroy(void *inst) { - delete (geo_sensor *)inst; + delete (geo_sensor*)inst;; } diff --git a/src/geo/geo_sensor.h b/src/geo/geo_sensor.h index 449a4d2..c211e5c 100755 --- a/src/geo/geo_sensor.h +++ b/src/geo/geo_sensor.h @@ -21,11 +21,11 @@ #define _GEO_SENSOR_H_ #include + #include #include -class geo_sensor : public physical_sensor -{ +class geo_sensor : public physical_sensor { public: geo_sensor(); virtual ~geo_sensor(); @@ -35,17 +35,19 @@ public: static bool working(void *inst); - virtual bool on_start(void); - virtual bool on_stop(void); - virtual bool set_interval(unsigned long interval); - virtual long set_command(const unsigned int cmd, long value); - virtual bool get_properties(const unsigned int type, sensor_properties_t &properties); - int get_sensor_data(const unsigned int type, sensor_data_t &data); + virtual bool get_properties(sensor_properties_t &properties); + int get_sensor_data(unsigned int type, sensor_data_t &data); private: sensor_hal *m_sensor_hal; - cmutex m_mutex; + float m_resolution; + + virtual bool on_start(void); + virtual bool on_stop(void); bool process_event(void); + void raw_to_base(sensor_data_t &data); }; -#endif /*_GEO_SENSOR_H_*/ + +#endif + diff --git a/src/geo/geo_sensor_hal.cpp b/src/geo/geo_sensor_hal.cpp index f611162..872525b 100755 --- a/src/geo/geo_sensor_hal.cpp +++ b/src/geo/geo_sensor_hal.cpp @@ -1,5 +1,5 @@ /* - * sensord + * geo_sensor_hal * * Copyright (c) 2014 Samsung Electronics Co., Ltd. * @@ -16,90 +16,116 @@ * limitations under the License. * */ - -#include #include #include -#include #include + #include #include + #include +#include +#include +#include #include using std::ifstream; -using std::string; using config::CConfig; #define SENSOR_TYPE_MAGNETIC "MAGNETIC" #define ELEMENT_NAME "NAME" #define ELEMENT_VENDOR "VENDOR" +#define ELEMENT_RAW_DATA_UNIT "RAW_DATA_UNIT" +#define ELEMENT_MIN_RANGE "MIN_RANGE" +#define ELEMENT_MAX_RANGE "MAX_RANGE" #define ATTR_VALUE "value" -#define SENSOR_MIN_RANGE -1200 -#define SENSOR_MAX_RANGE 1200 -#define INITIAL_TIME 0 -#define INITIAL_VALUE -1 -#define GAUSS_TO_UTESLA(val) ((val) * 100) +#define INITIAL_TIME -1 +#define GAUSS_TO_UTESLA(val) ((val) * 100.0f) geo_sensor_hal::geo_sensor_hal() -: m_x(INITIAL_VALUE) -, m_y(INITIAL_VALUE) -, m_z(INITIAL_VALUE) +: m_x(0) +, m_y(0) +, m_z(0) +, m_hdst(0) +, m_node_handle(-1) , m_polling_interval(POLL_1HZ_MS) , m_fired_time(INITIAL_TIME) -, m_sensorhub_supported(false) { - if (!check_hw_node()) - { - ERR("check_hw_node() fail"); + const string sensorhub_interval_node_name = "mag_poll_delay"; + CConfig &config = CConfig::get_instance(); + + node_path_info_query query; + node_path_info info; + int input_method = IIO_METHOD; + + if (!get_model_properties(SENSOR_TYPE_MAGNETIC, m_model_id, input_method)) { + ERR("Failed to find model_properties"); throw ENXIO; + } - CConfig &config = CConfig::get_instance(); + query.input_method = input_method; + query.sensorhub_controlled = m_sensorhub_controlled = is_sensorhub_controlled(sensorhub_interval_node_name); + query.sensor_type = SENSOR_TYPE_MAGNETIC; + query.input_event_key = "geomagnetic_sensor"; + query.iio_enable_node_name = "geomagnetic_enable"; + query.sensorhub_interval_node_name = sensorhub_interval_node_name; - if (!config.get(SENSOR_TYPE_MAGNETIC, m_model_id, ELEMENT_VENDOR, m_vendor)) - { - ERR("[VENDOR] is empty"); + if (!get_node_path_info(query, info)) { + ERR("Failed to get node info"); throw ENXIO; } - INFO("m_vendor = %s", m_vendor.c_str()); + show_node_path_info(info); + + m_data_node = info.data_node_path; + m_enable_node = info.enable_node_path; + m_interval_node = info.interval_node_path; + + if (input_method == IIO_METHOD) { + m_geo_dir = info.base_dir; + m_x_node = m_geo_dir + string(X_RAW_VAL_NODE); + m_y_node = m_geo_dir + string(Y_RAW_VAL_NODE); + m_z_node = m_geo_dir + string(Z_RAW_VAL_NODE); + m_x_scale_node = m_geo_dir + string(X_SCALE_NODE); + m_y_scale_node = m_geo_dir + string(Y_SCALE_NODE); + m_z_scale_node = m_geo_dir + string(Z_SCALE_NODE); + INFO("Raw data node X: %s", m_x_node.c_str()); + INFO("Raw data node Y: %s", m_y_node.c_str()); + INFO("Raw data node Z: %s", m_z_node.c_str()); + INFO("scale node X: %s", m_x_scale_node.c_str()); + INFO("scale node Y: %s", m_y_scale_node.c_str()); + INFO("scale node Z: %s", m_z_scale_node.c_str()); + } - if (!config.get(SENSOR_TYPE_MAGNETIC, m_model_id, ELEMENT_NAME, m_chip_name)) - { - ERR("[NAME] is empty"); + if (!config.get(SENSOR_TYPE_MAGNETIC, m_model_id, ELEMENT_VENDOR, m_vendor)) { + ERR("[VENDOR] is empty\n"); throw ENXIO; } - INFO("m_chip_name = %s", m_chip_name.c_str()); + INFO("m_vendor = %s", m_vendor.c_str()); - if (!init_resources()) + if (!config.get(SENSOR_TYPE_MAGNETIC, m_model_id, ELEMENT_NAME, m_chip_name)) { + ERR("[NAME] is empty\n"); throw ENXIO; + } - INFO("geo_sensor_hal is created!"); -} + init_resources(); + + INFO("m_chip_name = %s\n",m_chip_name.c_str()); + INFO("m_raw_data_unit = %f\n", m_raw_data_unit); + INFO("geo_sensor_hal is created!\n"); -geo_sensor_hal::~geo_sensor_hal() -{ - INFO("geo_sensor_hal is destroyed!"); } -bool geo_sensor_hal::init_resources(void) +geo_sensor_hal::~geo_sensor_hal() { - ifstream temp_handle; - - if (!read_node_value(m_x_scale_node, m_x_scale)) - return false; - - if (!read_node_value(m_y_scale_node, m_y_scale)) - return false; - - if (!read_node_value(m_z_scale_node, m_z_scale)) - return false; + if (m_node_handle > 0) + close(m_node_handle); + m_node_handle = -1; - INFO("Scale Values: %f, %f, %f", m_x_scale, m_y_scale, m_z_scale); - return true; + INFO("geo_sensor is destroyed!\n"); } string geo_sensor_hal::get_model_id(void) @@ -114,13 +140,14 @@ sensor_type_t geo_sensor_hal::get_type(void) bool geo_sensor_hal::enable(void) { - INFO("Resource already enabled. Enable not supported."); + m_fired_time = INITIAL_TIME; + INFO("Geo sensor real starting"); return true; } bool geo_sensor_hal::disable(void) { - INFO("Disable not supported."); + INFO("Geo sensor real stopping"); return true; } @@ -128,6 +155,7 @@ bool geo_sensor_hal::set_interval(unsigned long val) { INFO("Polling interval cannot be changed."); return true; + } bool geo_sensor_hal::update_value(void) @@ -137,10 +165,8 @@ bool geo_sensor_hal::update_value(void) if (!read_node_value(m_x_node, raw_values[0])) return false; - if (!read_node_value(m_y_node, raw_values[1])) return false; - if (!read_node_value(m_z_node, raw_values[2])) return false; @@ -149,7 +175,8 @@ bool geo_sensor_hal::update_value(void) m_z = GAUSS_TO_UTESLA(raw_values[2] * m_z_scale); m_fired_time = INITIAL_TIME; - INFO("x = %d, y = %d, z = %d, time = %lluus", raw_values[0], raw_values[0], raw_values[0], m_fired_time); + INFO("x = %d, y = %d, z = %d, time = %lluus", raw_values[0], raw_values[1], raw_values[2], m_fired_time); + INFO("x = %f, y = %f, z = %f, time = %lluus", m_x, m_y, m_z, m_fired_time); return true; } @@ -163,9 +190,9 @@ bool geo_sensor_hal::is_data_ready(bool wait) int geo_sensor_hal::get_sensor_data(sensor_data_t &data) { - data.data_unit_idx = SENSOR_UNIT_MICRO_TESLA; + data.accuracy = SENSOR_ACCURACY_GOOD; data.timestamp = m_fired_time; - data.values_num = 3; + data.value_count = 3; data.values[0] = (float)m_x; data.values[1] = (float)m_y; data.values[2] = (float)m_z; @@ -174,97 +201,52 @@ int geo_sensor_hal::get_sensor_data(sensor_data_t &data) bool geo_sensor_hal::get_properties(sensor_properties_t &properties) { - properties.sensor_unit_idx = SENSOR_UNIT_MICRO_TESLA; - properties.sensor_min_range = SENSOR_MIN_RANGE; - properties.sensor_max_range = SENSOR_MAX_RANGE; - snprintf(properties.sensor_name, sizeof(properties.sensor_name), "%s", m_chip_name.c_str()); - snprintf(properties.sensor_vendor, sizeof(properties.sensor_vendor), "%s", m_vendor.c_str()); - properties.sensor_resolution = 1; + properties.name = m_chip_name; + properties.vendor = m_vendor; + properties.min_range = m_min_range; + properties.max_range = m_max_range; + properties.min_interval = 1; + properties.resolution = m_raw_data_unit; + properties.fifo_count = 0; + properties.max_batch_count = 0; return true; } -bool geo_sensor_hal::is_sensorhub_supported(void) -{ - return false; -} - -bool geo_sensor_hal::check_hw_node(void) +bool geo_sensor_hal::init_resources(void) { - string hw_name; - string file_name; - DIR *main_dir = NULL; - struct dirent *dir_entry = NULL; - bool find_node = false; - - INFO("======================start check_hw_node============================="); - - m_sensorhub_supported = is_sensorhub_supported(); - main_dir = opendir(IIO_DIR); + ifstream temp_handle; - if (!main_dir) - { - ERR("Could not open IIO directory\n"); + if (!read_node_value(m_x_scale_node, m_x_scale)) { + ERR("Failed to read x scale node"); return false; } - - while (!find_node) - { - dir_entry = readdir(main_dir); - if(dir_entry == NULL) - break; - - if ((strncasecmp(dir_entry->d_name , ".", 1 ) != 0) && (strncasecmp(dir_entry->d_name , "..", 2 ) != 0) && (dir_entry->d_ino != 0)) - { - file_name = string(IIO_DIR) + string(dir_entry->d_name) + string(NAME_NODE); - ifstream infile(file_name.c_str()); - - if (!infile) - continue; - - infile >> hw_name; - - if (CConfig::get_instance().is_supported(SENSOR_TYPE_MAGNETIC, hw_name) == true) - { - m_name = m_model_id = hw_name; - INFO("m_model_id = %s", m_model_id.c_str()); - - string temp = string(IIO_DIR) + string(dir_entry->d_name); - - m_x_node = temp + string(X_RAW_VAL_NODE); - m_y_node = temp + string(Y_RAW_VAL_NODE); - m_z_node = temp + string(Z_RAW_VAL_NODE); - m_x_scale_node = temp + string(X_SCALE_NODE); - m_y_scale_node = temp + string(Y_SCALE_NODE); - m_z_scale_node = temp + string(Z_SCALE_NODE); - - find_node = true; - break; - } - } + if (!read_node_value(m_y_scale_node, m_y_scale)) { + ERR("Failed to read y scale node"); + return false; } - - closedir(main_dir); - return find_node; + if (!read_node_value(m_z_scale_node, m_z_scale)) { + ERR("Failed to read y scale node"); + return false; + } + INFO("Scale Values: %f, %f, %f", m_x_scale, m_y_scale, m_z_scale); + return true; } extern "C" void *create(void) { geo_sensor_hal *inst; - try - { + try { inst = new geo_sensor_hal(); - } - catch (int err) - { - ERR("Failed to create geo_sensor_hal class, errno : %d, errstr : %s", err, strerror(err)); + } catch (int err) { + ERR("geo_sensor_hal class create fail , errno : %d , errstr : %s\n", err, strerror(err)); return NULL; } - return (void *)inst; + return (void*)inst; } extern "C" void destroy(void *inst) { - delete (geo_sensor_hal *)inst; + delete (geo_sensor_hal*)inst; } diff --git a/src/geo/geo_sensor_hal.h b/src/geo/geo_sensor_hal.h index c723fe6..25183d2 100755 --- a/src/geo/geo_sensor_hal.h +++ b/src/geo/geo_sensor_hal.h @@ -1,5 +1,5 @@ /* - * sensord + * geo_sensor_hal * * Copyright (c) 2014 Samsung Electronics Co., Ltd. * @@ -23,14 +23,12 @@ #include #include -#define IIO_DIR "/sys/bus/iio/devices/" -#define X_RAW_VAL_NODE "/in_magn_x_raw" -#define Y_RAW_VAL_NODE "/in_magn_y_raw" -#define Z_RAW_VAL_NODE "/in_magn_z_raw" -#define X_SCALE_NODE "/in_magn_x_scale" -#define Y_SCALE_NODE "/in_magn_y_scale" -#define Z_SCALE_NODE "/in_magn_z_scale" -#define NAME_NODE "/name" +#define X_RAW_VAL_NODE "in_magn_x_raw" +#define Y_RAW_VAL_NODE "in_magn_y_raw" +#define Z_RAW_VAL_NODE "in_magn_z_raw" +#define X_SCALE_NODE "in_magn_x_scale" +#define Y_SCALE_NODE "in_magn_y_scale" +#define Z_SCALE_NODE "in_magn_z_scale" using std::string; @@ -47,9 +45,17 @@ public: bool is_data_ready(bool wait); virtual int get_sensor_data(sensor_data_t &data); bool get_properties(sensor_properties_t &properties); - bool check_hw_node(void); - private: + string m_model_id; + string m_vendor; + string m_chip_name; + + float m_min_range; + float m_max_range; + float m_raw_data_unit; + + unsigned long m_polling_interval; + double m_x; double m_y; double m_z; @@ -57,15 +63,19 @@ private: double m_y_scale; double m_z_scale; - unsigned long m_polling_interval; + int m_hdst; + unsigned long long m_fired_time; - bool m_sensorhub_supported; + int m_node_handle; - string m_model_id; - string m_name; - string m_vendor; - string m_chip_name; + string m_enable_node; + + /*For Input Method*/ + string m_data_node; + string m_interval_node; + /*For IIO method*/ + string m_geo_dir; string m_x_node; string m_y_node; string m_z_node; @@ -73,11 +83,11 @@ private: string m_y_scale_node; string m_z_scale_node; + bool m_sensorhub_controlled; + cmutex m_value_mutex; - bool enable_resource(string &resource_node, bool enable); bool update_value(void); - bool is_sensorhub_supported(void); bool init_resources(void); }; #endif /*_GEO_SENSOR_HAL_H_*/ diff --git a/src/libsensord/client.cpp b/src/libsensord/client.cpp index 4e967cb..9acf884 100755 --- a/src/libsensord/client.cpp +++ b/src/libsensord/client.cpp @@ -1068,7 +1068,6 @@ API bool sensord_get_data(int handle, unsigned int data_id, sensor_data_t* senso return false; } - client_id = event_listener.get_client_id(); retvm_if ((client_id < 0), false, "Invalid client id : %d, handle: %d, %s, %s", client_id, handle, get_sensor_name(sensor_id), get_client_name());