From aced8ccecc91836b3b5af11499d3022004f5ba52 Mon Sep 17 00:00:00 2001 From: Marco De Marco <demarco@oats.inaf.it> Date: Mon, 25 Nov 2013 12:03:35 +0100 Subject: [PATCH] State machine added --- src/MetadataExporter.cpp | 18 ++++++++++-------- src/MetadataExporter.h | 2 +- src/MetadataExporter.xmi | 13 +++++++++++++ src/MetadataExporterClass.cpp | 28 ++++++++++++++-------------- src/MetadataExporterStateMachine.cpp | 17 +++++++++++++++-- src/Server.h | 2 +- 6 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/MetadataExporter.cpp b/src/MetadataExporter.cpp index b643715..c646bf8 100644 --- a/src/MetadataExporter.cpp +++ b/src/MetadataExporter.cpp @@ -44,7 +44,6 @@ #include <Configuration.h> #include <PlainServer.h> #include <SSLServer.h> -#include <bits/c++config.h> //@todo: controllare #include <boost/filesystem.hpp> @@ -211,7 +210,7 @@ void MetadataExporter::get_device_property() dev_prop.push_back(Tango::DbDatum("DatabasePort")); dev_prop.push_back(Tango::DbDatum("DatabaseUsername")); dev_prop.push_back(Tango::DbDatum("DatabasePassword")); - dev_prop.push_back(Tango::DbDatum("DatabaseConnectionNumber")); + dev_prop.push_back(Tango::DbDatum("DatabaseConnectionNumber")); dev_prop.push_back(Tango::DbDatum("ExportedTables")); dev_prop.push_back(Tango::DbDatum("AuthorisedUsers")); @@ -593,7 +592,7 @@ void MetadataExporter::importExportedTables(std::vector<std::string>& exportedTa { std::size_t found; - if((found=exportedTables.at(i).find(' '))==std::string::npos) + if((found=exportedTables.at(i).find(' ')) == std::string::npos) { std::stringstream errorStream; errorStream << "ExportedTables property has invalid key at " @@ -604,7 +603,8 @@ void MetadataExporter::importExportedTables(std::vector<std::string>& exportedTa std::string schema = exportedTables.at(i).substr(0, found); std::string table = exportedTables.at(i).substr(found+1, std::string::npos); - INFO_STREAM << "SCHEMA: " << schema << " TABLE: " << table << endl; + INFO_STREAM << "MetadataExporter::importExportedTables() schema " + << schema << " table " << table << endl; exportedTablesMap.insert(std::pair<const std::string, const std::string> (schema, table)); } @@ -623,7 +623,7 @@ void MetadataExporter::importAuthorisedUsers(std::vector<std::string>& authorise { std::size_t found; - if((found=authorisedUsers.at(i).find(' '))==std::string::npos) + if((found=authorisedUsers.at(i).find(' ')) == std::string::npos) { std::stringstream errorStream; errorStream << "AuthorisedUsers property has invalid key at " @@ -635,10 +635,12 @@ void MetadataExporter::importAuthorisedUsers(std::vector<std::string>& authorise std::string password = authorisedUsers.at(i).substr(found+1, std::string::npos); #ifdef VERBOSE_DEBUG - INFO_STREAM << "USER: " << user << " PASSWORD: " << password << endl; + INFO_STREAM << "MetadataExporter::importAuthorisedUsers() user " + << user << " password " << password << endl; #endif - authorisedUsersMap.insert(std::pair<const std::string, const std::string>(user, password)); + authorisedUsersMap.insert(std::pair<const std::string, + const std::string>(user, password)); } } @@ -659,7 +661,7 @@ void MetadataExporter::checkIfFileExists(std::string fileName) throw std::invalid_argument(errorStream.str()); } - DEBUG_STREAM << "FILE: " << fileName << " -> OK" << endl; + INFO_STREAM << "MetadataExporter::checkIfFileExists() " << fileName << endl; } /*----- PROTECTED REGION END -----*/ // MetadataExporter::namespace_ending diff --git a/src/MetadataExporter.h b/src/MetadataExporter.h index dc8261b..fca15b0 100644 --- a/src/MetadataExporter.h +++ b/src/MetadataExporter.h @@ -148,7 +148,7 @@ public: MetadataExporter(Tango::DeviceClass *cl,const char *s,const char *d); /** * The device object destructor. - */ + */ ~MetadataExporter() {delete_device();}; diff --git a/src/MetadataExporter.xmi b/src/MetadataExporter.xmi index 3d0350d..41c3c6b 100644 --- a/src/MetadataExporter.xmi +++ b/src/MetadataExporter.xmi @@ -110,6 +110,8 @@ <type xsi:type="pogoDsl:VoidType"/> </argout> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> + <excludedStates>ON</excludedStates> + <excludedStates>FAULT</excludedStates> </commands> <commands name="Off" description="Deactivate fits importer" execMethod="off" displayLevel="OPERATOR" polledPeriod="0"> <argin description=""> @@ -119,7 +121,18 @@ <type xsi:type="pogoDsl:VoidType"/> </argout> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> + <excludedStates>OFF</excludedStates> + <excludedStates>FAULT</excludedStates> </commands> + <states name="ON" description="Metadata exporter is in ON state (ready to incoming connections)"> + <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> + </states> + <states name="OFF" description="Metadata exporter is in OFF state (not ready for incoming connections)"> + <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> + </states> + <states name="FAULT" description="Metadata exporter is in FAULT state (an error occurred)"> + <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> + </states> <preferences docHome="./doc_html" makefileHome="/usr/local/tango-8.1.2/share/pogo/preferences"/> </classes> </pogoDsl:PogoSystem> diff --git a/src/MetadataExporterClass.cpp b/src/MetadataExporterClass.cpp index 928a418..f633b58 100644 --- a/src/MetadataExporterClass.cpp +++ b/src/MetadataExporterClass.cpp @@ -131,8 +131,8 @@ MetadataExporterClass *MetadataExporterClass::init(const char *name) catch (bad_alloc &) { throw; - } - } + } + } return _instance; } @@ -262,7 +262,7 @@ void MetadataExporterClass::get_class_property() cl_prop.push_back(Tango::DbDatum("DHTempFile")); cl_prop.push_back(Tango::DbDatum("ExportedTables")); cl_prop.push_back(Tango::DbDatum("AuthorisedUsers")); - + // Call database and extract values if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); @@ -678,7 +678,7 @@ void MetadataExporterClass::write_class_property() header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); - + Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); @@ -687,13 +687,13 @@ void MetadataExporterClass::write_class_property() } // Get CVS or SVN revision tag - + // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); - + end = tagname.find(endstr); if (end!=string::npos && end>start) { @@ -702,17 +702,17 @@ void MetadataExporterClass::write_class_property() cvs_tag << strtag; data.push_back(cvs_tag); } - + // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); - + end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); - + string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) @@ -720,7 +720,7 @@ void MetadataExporterClass::write_class_property() start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); - + Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); @@ -770,7 +770,7 @@ void MetadataExporterClass::device_factory(const Tango::DevVarStringArray *devli for (unsigned long i=0 ; i<devlist_ptr->length() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; - device_list.push_back(new MetadataExporter(this, (*devlist_ptr)[i])); + device_list.push_back(new MetadataExporter(this, (*devlist_ptr)[i])); } // Manage dynamic attributes if any @@ -868,7 +868,7 @@ void MetadataExporterClass::command_factory() * method : MetadataExporterClass::create_static_attribute_list * description : Create the a list of static attributes * - * @param att_list the ceated attribute list + * @param att_list the ceated attribute list */ //-------------------------------------------------------- void MetadataExporterClass::create_static_attribute_list(vector<Tango::Attr *> &att_list) @@ -902,10 +902,10 @@ void MetadataExporterClass::erase_dynamic_attributes(const Tango::DevVarStringAr Tango::Util *tg = Tango::Util::instance(); for (unsigned long i=0 ; i<devlist_ptr->length() ; i++) - { + { Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str()); MetadataExporter *dev = static_cast<MetadataExporter *> (dev_impl); - + vector<Tango::Attribute *> &dev_att_list = dev->get_device_attr()->get_attribute_list(); vector<Tango::Attribute *>::iterator ite_att; for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att) diff --git a/src/MetadataExporterStateMachine.cpp b/src/MetadataExporterStateMachine.cpp index 382f943..e611b63 100644 --- a/src/MetadataExporterStateMachine.cpp +++ b/src/MetadataExporterStateMachine.cpp @@ -41,6 +41,9 @@ //================================================================ // States | Description //================================================================ +// ON | Metadata exporter is in ON state (ready to incoming connections) +// OFF | Metadata exporter is in OFF state (not ready for incoming connections) +// FAULT | Metadata exporter is in FAULT state (an error occurred) namespace MetadataExporter_ns @@ -61,10 +64,15 @@ namespace MetadataExporter_ns //-------------------------------------------------------- bool MetadataExporter::is_On_allowed(TANGO_UNUSED(const CORBA::Any &any)) { - // Not any excluded states for On command. + // Compare device state with not allowed states. + if (get_state()==Tango::ON || + get_state()==Tango::FAULT) + { /*----- PROTECTED REGION ID(MetadataExporter::OnStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MetadataExporter::OnStateAllowed + return false; + } return true; } @@ -76,10 +84,15 @@ bool MetadataExporter::is_On_allowed(TANGO_UNUSED(const CORBA::Any &any)) //-------------------------------------------------------- bool MetadataExporter::is_Off_allowed(TANGO_UNUSED(const CORBA::Any &any)) { - // Not any excluded states for Off command. + // Compare device state with not allowed states. + if (get_state()==Tango::OFF || + get_state()==Tango::FAULT) + { /*----- PROTECTED REGION ID(MetadataExporter::OffStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MetadataExporter::OffStateAllowed + return false; + } return true; } diff --git a/src/Server.h b/src/Server.h index adad47c..0c98dc4 100644 --- a/src/Server.h +++ b/src/Server.h @@ -81,7 +81,7 @@ protected: //Acceptor for incoming connection boost::shared_ptr<boost::asio::ip::tcp::acceptor> m_acceptor_sp; - //Handler for all threads + //Thread group container shared pointer boost::shared_ptr<boost::thread_group> m_threadGroup_sp; //Tango state property mutex -- GitLab