From 4612a07cb5158eeaadd089e18524260eaf942977 Mon Sep 17 00:00:00 2001 From: Ramasamy Date: Fri, 2 Jan 2015 09:53:28 +0530 Subject: [PATCH] Updating virtual sensor xml configuration for multiple devices - Updated virtual sensor xml configuration file to support multiple devices and emulators - Updated virtual sensor xml parser to support additional functionality Change-Id: I647958a6010e7ecebfc282ba72bf61ac6706d5cf --- src/shared/cvirtual_sensor_config.cpp | 117 ++++++++++++++++--------- src/shared/cvirtual_sensor_config.h | 13 ++- virtual_sensors.xml.in | 160 +++++++++++++++++++++++----------- 3 files changed, 195 insertions(+), 95 deletions(-) diff --git a/src/shared/cvirtual_sensor_config.cpp b/src/shared/cvirtual_sensor_config.cpp index c0d0f0b..a636e87 100755 --- a/src/shared/cvirtual_sensor_config.cpp +++ b/src/shared/cvirtual_sensor_config.cpp @@ -28,13 +28,13 @@ using std::string; using std::stringstream; -#define ROOT_ELEMENT "VIRTUAL_SENSOR" -#define TEXT_ELEMENT "text" -#define MODEL_ID_ATTR "id" -#define DEFAULT_ATTR "value" -#define DEFAULT_ATTR1 "value1" -#define DEFAULT_ATTR2 "value2" -#define DEFAULT_ATTR3 "value3" +#define ROOT_ELEMENT "VIRTUAL_SENSOR" +#define DEVICE_TYPE_ATTR "type" +#define TEXT_ELEMENT "text" +#define DEFAULT_ATTR "value" +#define DEFAULT_ATTR1 "value1" +#define DEFAULT_ATTR2 "value2" +#define DEFAULT_ATTR3 "value3" cvirtual_sensor_config::cvirtual_sensor_config() { @@ -85,57 +85,78 @@ bool cvirtual_sensor_config::load_config(const string& config_path) return false; } + xmlNodePtr device_node_ptr; xmlNodePtr virtual_sensor_node_ptr; xmlNodePtr element_node_ptr; xmlAttrPtr attr_ptr; char* prop = NULL; - virtual_sensor_node_ptr = cur->xmlChildrenNode; - - while (virtual_sensor_node_ptr != NULL) { + device_node_ptr = cur->xmlChildrenNode; + while (device_node_ptr != NULL){ //skip garbage element, [text] - if (!xmlStrcmp(virtual_sensor_node_ptr->name,(const xmlChar *)TEXT_ELEMENT)) { - virtual_sensor_node_ptr = virtual_sensor_node_ptr->next; + if (!xmlStrcmp(device_node_ptr->name,(const xmlChar *)TEXT_ELEMENT)) { + device_node_ptr = device_node_ptr->next; continue; } - //insert Model_list to config map - m_virtual_sensor_config[(const char*)virtual_sensor_node_ptr->name]; - DBG("<%s>\n",(const char*)virtual_sensor_node_ptr->name); - element_node_ptr = virtual_sensor_node_ptr->xmlChildrenNode; - while (element_node_ptr != NULL) { + string device_type; + prop = (char*)xmlGetProp(device_node_ptr,(const xmlChar*)DEVICE_TYPE_ATTR); + device_type = prop; + free(prop); + + //insert device to device_list + m_virtual_sensor_config[device_type]; + DBG("\n",device_type.c_str()); + + virtual_sensor_node_ptr = device_node_ptr->xmlChildrenNode; + + while (virtual_sensor_node_ptr != NULL) { //skip garbage element, [text] - if (!xmlStrcmp(element_node_ptr->name,(const xmlChar *)TEXT_ELEMENT)) { - element_node_ptr = element_node_ptr->next; + if (!xmlStrcmp(virtual_sensor_node_ptr->name,(const xmlChar *)TEXT_ELEMENT)) { + virtual_sensor_node_ptr = virtual_sensor_node_ptr->next; continue; } - //insert Element to Model - m_virtual_sensor_config[(const char*)virtual_sensor_node_ptr->name][(const char*)element_node_ptr->name]; - DBG("<%s><%s>\n",(const char*)virtual_sensor_node_ptr->name,(const char*)element_node_ptr->name); + m_virtual_sensor_config[device_type][(const char*)virtual_sensor_node_ptr->name]; + DBG("<%s>\n",device_type.c_str(),(const char*)virtual_sensor_node_ptr->name); - attr_ptr = element_node_ptr->properties; - while (attr_ptr != NULL) { + element_node_ptr = virtual_sensor_node_ptr->xmlChildrenNode; + while (element_node_ptr != NULL) { + //skip garbage element, [text] + if (!xmlStrcmp(element_node_ptr->name,(const xmlChar *)TEXT_ELEMENT)) { + element_node_ptr = element_node_ptr->next; + continue; + } - string key,value; - key = (char*)attr_ptr->name; - prop = (char*)xmlGetProp(element_node_ptr,attr_ptr->name); - value = prop; - free(prop); + //insert Element to Model + m_virtual_sensor_config[device_type][(const char*)virtual_sensor_node_ptr->name][(const char*)element_node_ptr->name]; + DBG("<%s><%s>\n",device_type.c_str(),(const char*)virtual_sensor_node_ptr->name,(const char*)element_node_ptr->name); + + attr_ptr = element_node_ptr->properties; + while (attr_ptr != NULL) { + + string key,value; + key = (char*)attr_ptr->name; + prop = (char*)xmlGetProp(element_node_ptr,attr_ptr->name); + value = prop; + free(prop); + + //insert attribute to Element + m_virtual_sensor_config[device_type][(const char*)virtual_sensor_node_ptr->name][(const char*)element_node_ptr->name][key]=value; + DBG("<%s><%s \"%s\"=\"%s\">\n",device_type.c_str(),(const char*)virtual_sensor_node_ptr->name,(const char*)element_node_ptr->name,key.c_str(),value.c_str()); + attr_ptr = attr_ptr->next; + } - //insert attribute to Element - m_virtual_sensor_config[(const char*)virtual_sensor_node_ptr->name][(const char*)element_node_ptr->name][key]=value; - DBG("<%s><%s \"%s\"=\"%s\">\n",(const char*)virtual_sensor_node_ptr->name,(const char*)element_node_ptr->name,key.c_str(),value.c_str()); - attr_ptr = attr_ptr->next; - } + element_node_ptr = element_node_ptr->next; + } - element_node_ptr = element_node_ptr->next; + DBG("\n"); + virtual_sensor_node_ptr = virtual_sensor_node_ptr->next; } - DBG("\n"); - virtual_sensor_node_ptr = virtual_sensor_node_ptr->next; + device_node_ptr = device_node_ptr->next; } xmlFreeDoc(doc); @@ -144,10 +165,17 @@ bool cvirtual_sensor_config::load_config(const string& config_path) bool cvirtual_sensor_config::get(const string& sensor_type, const string& element, const string& attr, string& value) { - auto it_virtual_sensor_list = m_virtual_sensor_config.find(sensor_type); + auto it_device_list = m_virtual_sensor_config.find(m_device_id); + + if (it_device_list == m_virtual_sensor_config.end()) { + ERR("There is no <%s> device\n",m_device_id.c_str()); + return false; + } + + auto it_virtual_sensor_list = it_device_list->second.find(sensor_type); - if (it_virtual_sensor_list == m_virtual_sensor_config.end()) { - ERR("There is no <%s> element\n",sensor_type.c_str()); + if (it_virtual_sensor_list == it_device_list->second.end()) { + ERR("There is no <%s> sensor\n",sensor_type.c_str()); return false; } @@ -272,9 +300,14 @@ bool cvirtual_sensor_config::get(const string& sensor_type, const string& elemen bool cvirtual_sensor_config::is_supported(const string& sensor_type) { - auto it_virtual_sensor_list = m_virtual_sensor_config.find(sensor_type); + auto it_device_list = m_virtual_sensor_config.find(m_device_id); + + if (it_device_list == m_virtual_sensor_config.end()) + return false; + + auto it_virtual_sensor_list = it_device_list->second.find(sensor_type); - if (it_virtual_sensor_list == m_virtual_sensor_config.end()) + if (it_virtual_sensor_list == it_device_list->second.end()) return false; return true; diff --git a/src/shared/cvirtual_sensor_config.h b/src/shared/cvirtual_sensor_config.h index 7cfbcb6..b3c5f7d 100755 --- a/src/shared/cvirtual_sensor_config.h +++ b/src/shared/cvirtual_sensor_config.h @@ -40,7 +40,7 @@ typedef unordered_map Virtual_sensor; * ... */ -typedef unordered_map Virtual_sensor_config; +typedef unordered_map virtual_sensor_config; /* * a Virtual_sensor_config represents virtual_sensors.xml * @@ -49,6 +49,14 @@ typedef unordered_map Virtual_sensor_config; * */ +typedef unordered_map virtual_sensor_device_config; +/* +* a virtual_sensor_device_config represents virtual_sensors.xml +* +* +* +*/ + class cvirtual_sensor_config : public cconfig { private: @@ -58,7 +66,8 @@ private: bool load_config(const string& config_path); - Virtual_sensor_config m_virtual_sensor_config; + virtual_sensor_device_config m_virtual_sensor_config; + public: static cvirtual_sensor_config& get_instance(void); diff --git a/virtual_sensors.xml.in b/virtual_sensors.xml.in index 680745e..1c20c0d 100644 --- a/virtual_sensors.xml.in +++ b/virtual_sensors.xml.in @@ -1,57 +1,115 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.7.4