diff --git a/fairmq/CMakeLists.txt b/fairmq/CMakeLists.txt index 014b93b0..eafaddd0 100644 --- a/fairmq/CMakeLists.txt +++ b/fairmq/CMakeLists.txt @@ -107,6 +107,7 @@ EndIf(NANOMSG_FOUND) Set(FAIRMQHEADERS FairMQParts.h options/FairProgOptionsHelper.h + options/FairMQEventManager.h tools/FairMQTools.h tools/FairMQDDSTools.h tools/runSimpleMQStateMachine.h @@ -156,6 +157,7 @@ Set(Exe_Names splitter merger proxy + runConfigExample ) If(DDS_FOUND) @@ -171,6 +173,7 @@ Set(Exe_Source run/runSplitter.cxx run/runMerger.cxx run/runProxy.cxx + options/runConfigEx.cxx ) If(DDS_FOUND) @@ -191,3 +194,7 @@ ForEach(_file RANGE 0 ${_length}) Set(DEPENDENCIES FairMQ) GENERATE_EXECUTABLE() EndForEach(_file RANGE 0 ${_length}) + +configure_file( ${CMAKE_SOURCE_DIR}/fairmq/options/startConfigExample.sh.in + ${CMAKE_BINARY_DIR}/bin/startConfigExample.sh ) + diff --git a/fairmq/FairMQLogger.h b/fairmq/FairMQLogger.h index f3ae6ee0..015d875e 100644 --- a/fairmq/FairMQLogger.h +++ b/fairmq/FairMQLogger.h @@ -16,6 +16,35 @@ #define FAIRMQLOGGER_H_ #include "logger/logger.h" + + +// FairMQLogger helper macros +/* + Definition : + + #define LOG(severity) BOOST_LOG_SEV(global_logger::get(),fairmq::severity) + #define SET_LOG_CONSOLE_LEVEL(loglevel) DefaultConsoleSetFilter(fairmq::loglevel) + #define ADD_LOG_FILESINK(filename,loglevel) DefaultAddFileSink(filename, fairmq::loglevel) + + enum severity_level + { + TRACE, + DEBUG, + RESULTS, + INFO, + WARN, + ERROR, + STATE, + NOLOG + }; + + Use : + + LOG(DEBUG)<<"Hello World"; + SET_LOG_CONSOLE_LEVEL(INFO); // => Print severity >= INFO to console + ADD_LOG_FILESINK(filename,ERROR); // => Print severity >= ERROR to file (extension is added) +*/ + typedef unsigned long long timestamp_t; timestamp_t get_timestamp(); diff --git a/fairmq/logger/logger.cxx b/fairmq/logger/logger.cxx index 9ddee1b9..266aaeed 100644 --- a/fairmq/logger/logger.cxx +++ b/fairmq/logger/logger.cxx @@ -33,230 +33,150 @@ namespace expr = boost::log::expressions; namespace sinks = boost::log::sinks; namespace attrs = boost::log::attributes; -namespace FairMQ -{ -namespace Logger -{ - std::vector>> sinkList; -} -} BOOST_LOG_GLOBAL_LOGGER_INIT(global_logger, src::severity_logger_mt) { src::severity_logger_mt global_logger; global_logger.add_attribute("TimeStamp", attrs::local_clock()); - init_log_console(); + DefaultConsoleInit(); return global_logger; } -void init_log_console(bool color/* = true*/) -{ - FairMQ::Logger::sinkList.clear(); - // add a text sink - typedef sinks::synchronous_sink text_sink; - logging::core::get()->remove_all_sinks(); - // CONSOLE - all severity except error - boost::shared_ptr sink = boost::make_shared(); - // add "console" output stream to our sink - sink->locked_backend()->add_stream(boost::shared_ptr(&std::clog, empty_deleter_t())); - // specify the format of the log message - if (color) +namespace FairMQ{ +namespace Logger{ + std::vector >sinkList;// global var +}}//end namespace + + void RemoveRegisteredSinks() { - sink->set_formatter(&init_log_formatter); - } - else - { - sink->set_formatter(&init_log_formatter); + if(FairMQ::Logger::sinkList.size() > 0) + { + for(const auto& sink : FairMQ::Logger::sinkList) + logging::core::get()->remove_sink(sink); + FairMQ::Logger::sinkList.clear(); + } } - sink->set_filter(severity != SEVERITY_ERROR && severity < SEVERITY_NOLOG); - // add sink to the core - FairMQ::Logger::sinkList.push_back(sink); - logging::core::get()->add_sink(sink); - // CONSOLE - only severity error - boost::shared_ptr sink_error = boost::make_shared(); - sink_error->locked_backend()->add_stream(boost::shared_ptr(&std::cerr, empty_deleter_t())); + void reinit_logger(bool color, const std::string& filename, custom_severity_level threshold) + { + BOOST_LOG_SEV(global_logger::get(), custom_severity_level::NOLOG) << ""; + RemoveRegisteredSinks(); + DefaultConsoleInit(color); + if(threshold!=SEVERITY_NOLOG) + { + if(!filename.empty()) + { + DefaultAddFileSink(filename,threshold); + } + } - if (color) - { - sink_error->set_formatter(&init_log_formatter); - } - else - { - sink_error->set_formatter(&init_log_formatter); } - sink_error->set_filter(severity == SEVERITY_ERROR); - FairMQ::Logger::sinkList.push_back(sink_error); - logging::core::get()->add_sink(sink_error); -} + // console sink related functions + void DefaultConsoleInit(bool color/* = true*/) + { + // add a text sink + typedef sinks::synchronous_sink text_sink; -void reinit_logger(bool color) -{ - LOG(NOLOG) << ""; - logging::core::get()->remove_all_sinks(); - init_log_console(color); -} + RemoveRegisteredSinks(); -void init_log_file(const std::string& filename, custom_severity_level threshold, log_op::operation op, const std::string& id) -{ - // add a text sink - std::string formatted_filename(filename); - formatted_filename += id; - formatted_filename += "_%Y-%m-%d_%H-%M-%S.%N.log"; - boost::shared_ptr backend = boost::make_shared( - boost::log::keywords::file_name = formatted_filename, - boost::log::keywords::rotation_size = 10 * 1024 * 1024, - // rotate at midnight every day - boost::log::keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0), - // log collector, - // -- maximum total size of the stored log files is 1GB. - // -- minimum free space on the drive is 2GB - boost::log::keywords::max_size = 1000 * 1024 * 1024, - boost::log::keywords::min_free_space = 2000 * 1024 * 1024, - boost::log::keywords::auto_flush = true - //keywords::time_based_rotation = &is_it_time_to_rotate - ); - typedef sinks::synchronous_sink sink_t; - boost::shared_ptr sink(new sink_t(backend)); + // CONSOLE - all severity except error + boost::shared_ptr sink = boost::make_shared(); + // add "console" output stream to our sink + sink->locked_backend()->add_stream(boost::shared_ptr(&std::clog, empty_deleter_t())); - // specify the format of the log message - sink->set_formatter(&init_log_formatter); + // specify the format of the log message + if (color) + { + sink->set_formatter(&InitLogFormatter); + } + else + { + sink->set_formatter(&InitLogFormatter); + } - switch (op) - { - case log_op::operation::EQUAL : - sink->set_filter(severity == threshold); - break; - case log_op::operation::GREATER_THAN : - sink->set_filter(severity > threshold); - break; - case log_op::operation::GREATER_EQ_THAN : - sink->set_filter(severity >= threshold); - break; - case log_op::operation::LESS_THAN : - sink->set_filter(severity < threshold); - break; - case log_op::operation::LESS_EQ_THAN : - sink->set_filter(severity <= threshold); - break; - default: - break; - } + sink->set_filter(severity != SEVERITY_ERROR && severity < SEVERITY_NOLOG); + // add sink to the core + FairMQ::Logger::sinkList.push_back(sink); + logging::core::get()->add_sink(sink); - logging::core::get()->add_sink(sink); -} + // CONSOLE - only severity error + boost::shared_ptr sink_error = boost::make_shared(); + sink_error->locked_backend()->add_stream(boost::shared_ptr(&std::cerr, empty_deleter_t())); -// temporary : to be replaced with c++11 lambda -void set_global_log_level(log_op::operation op, custom_severity_level threshold) -{ - switch (threshold) - { - case custom_severity_level::TRACE : - set_global_log_level_operation(op,custom_severity_level::TRACE); - break; - case custom_severity_level::DEBUG : - set_global_log_level_operation(op,custom_severity_level::DEBUG); - break; - case custom_severity_level::RESULTS : - set_global_log_level_operation(op,custom_severity_level::RESULTS); - break; - case custom_severity_level::INFO : - set_global_log_level_operation(op,custom_severity_level::INFO); - break; - case custom_severity_level::WARN : - set_global_log_level_operation(op,custom_severity_level::WARN); - break; - case custom_severity_level::STATE : - set_global_log_level_operation(op,custom_severity_level::STATE); - break; - case custom_severity_level::ERROR : - set_global_log_level_operation(op,custom_severity_level::ERROR); - break; - case custom_severity_level::NOLOG : - set_global_log_level_operation(op,custom_severity_level::NOLOG); - break; - default: - break; - } -} + if (color) + { + sink_error->set_formatter(&InitLogFormatter); + } + else + { + sink_error->set_formatter(&InitLogFormatter); + } -void set_global_log_level_operation(log_op::operation op, custom_severity_level threshold) -{ - switch (op) - { - case log_op::operation::EQUAL: - FairMQ::Logger::sinkList.at(0)->set_filter(severity == threshold); - // boost::log::core::get()->set_filter(severity == threshold); - break; - case log_op::operation::GREATER_THAN: - FairMQ::Logger::sinkList.at(0)->set_filter(severity > threshold); - // boost::log::core::get()->set_filter(severity > threshold); - break; - case log_op::operation::GREATER_EQ_THAN: - FairMQ::Logger::sinkList.at(0)->set_filter(severity >= threshold); - // boost::log::core::get()->set_filter(severity >= threshold); - break; - case log_op::operation::LESS_THAN: - FairMQ::Logger::sinkList.at(0)->set_filter(severity < threshold); - // boost::log::core::get()->set_filter(severity < threshold); - break; - case log_op::operation::LESS_EQ_THAN: - FairMQ::Logger::sinkList.at(0)->set_filter(severity <= threshold); - // boost::log::core::get()->set_filter(severity <= threshold); - break; - default: - break; - } -} + sink_error->set_filter(severity == SEVERITY_ERROR); + FairMQ::Logger::sinkList.push_back(sink_error); + logging::core::get()->add_sink(sink_error); + } -void init_new_file(const std::string& filename, custom_severity_level threshold, log_op::operation op) -{ - // add a file text sink with filters but without any formatting - std::string formatted_filename(filename); - formatted_filename += ".%N.txt"; - boost::shared_ptr backend = boost::make_shared( - boost::log::keywords::file_name = formatted_filename, - boost::log::keywords::rotation_size = 10 * 1024 * 1024, - // rotate at midnight every day - boost::log::keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0), - // log collector, - // -- maximum total size of the stored log files is 1GB. - // -- minimum free space on the drive is 2GB - boost::log::keywords::max_size = 1000 * 1024 * 1024, - boost::log::keywords::min_free_space = 2000 * 1024 * 1024, - boost::log::keywords::auto_flush = true - //keywords::time_based_rotation = &is_it_time_to_rotate - ); - typedef sinks::synchronous_sink sink_t; - boost::shared_ptr sink(new sink_t(backend)); + int DefaultConsoleSetFilter(custom_severity_level threshold) + { - // sink->set_formatter(&init_file_formatter); + if(FairMQ::Logger::sinkList.size()>=2) + { + FairMQ::Logger::sinkList.at(0)->set_filter([threshold](const boost::log::attribute_value_set& attr_set) + { + auto sev = attr_set["Severity"].extract(); + auto mainConsoleSinkCondition = (sev != SEVERITY_ERROR) && (sev < SEVERITY_NOLOG); + return mainConsoleSinkCondition && (sev>=threshold); + }); - switch (op) - { - case log_op::operation::EQUAL : - sink->set_filter(severity == threshold); - break; - case log_op::operation::GREATER_THAN : - sink->set_filter(severity > threshold); - break; - case log_op::operation::GREATER_EQ_THAN : - sink->set_filter(severity >= threshold); - break; - case log_op::operation::LESS_THAN : - sink->set_filter(severity < threshold); - break; - case log_op::operation::LESS_EQ_THAN : - sink->set_filter(severity <= threshold); - break; - default: - break; - } + FairMQ::Logger::sinkList.at(1)->set_filter([threshold](const boost::log::attribute_value_set& attr_set) + { + auto sev = attr_set["Severity"].extract(); + auto errorConsoleSinkCondition = sev == SEVERITY_ERROR; + return errorConsoleSinkCondition && (sev>=threshold); + }); + return 0; + } + else + { + return 1; + } - logging::core::get()->add_sink(sink); -} + return 0; + } + + + + // file sink related functions + + void DefaultAddFileSink(const std::string& filename, custom_severity_level threshold) + { + // add a text sink + std::string formatted_filename(filename); + formatted_filename += "_%Y-%m-%d_%H-%M-%S.%N.log"; + AddFileSink([threshold](const boost::log::attribute_value_set& attr_set) + { + auto sev = attr_set["Severity"].extract(); + return (sev >= threshold) && (sev < SEVERITY_NOLOG); + }, + boost::log::keywords::file_name = formatted_filename, + boost::log::keywords::rotation_size = 10 * 1024 * 1024, + // rotate at midnight every day + boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), + // log collector, + // -- maximum total size of the stored log files is 1GB. + // -- minimum free space on the drive is 2GB + boost::log::keywords::max_size = 1000 * 1024 * 1024, + boost::log::keywords::min_free_space = 2000 * 1024 * 1024, + boost::log::keywords::auto_flush = true + //keywords::time_based_rotation = &is_it_time_to_rotate + ); + + } + + diff --git a/fairmq/logger/logger.h b/fairmq/logger/logger.h index 67d9c50b..2b1207ab 100644 --- a/fairmq/logger/logger.h +++ b/fairmq/logger/logger.h @@ -36,6 +36,7 @@ #include #include +#include // fairmq #include "logger_def.h" @@ -45,35 +46,6 @@ // 3- tag_console // 4- tag_file -// Note : operation enum temporary : (until we replace it with c++11 lambda expression) -namespace log_op -{ - enum operation - { - EQUAL, - GREATER_THAN, - GREATER_EQ_THAN, - LESS_THAN, - LESS_EQ_THAN - }; -} - -// declaration of the init function for the global logger -void init_log_console(bool color = true); -void reinit_logger(bool color); -void init_log_file(const std::string& filename, - custom_severity_level threshold = SEVERITY_THRESHOLD, - log_op::operation = log_op::GREATER_EQ_THAN, - const std::string& id = "" - ); - -void init_new_file(const std::string& filename, - custom_severity_level threshold, - log_op::operation op - ); - -void set_global_log_level(log_op::operation op = log_op::GREATER_EQ_THAN, custom_severity_level threshold = SEVERITY_THRESHOLD); -void set_global_log_level_operation(log_op::operation op = log_op::GREATER_EQ_THAN, custom_severity_level threshold=SEVERITY_THRESHOLD); #if defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic push @@ -90,31 +62,89 @@ BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", custom_severity_level) #pragma GCC diagnostic pop #endif -template -void init_log_formatter(const boost::log::record_view &view, boost::log::formatting_ostream &os) + +namespace FairMQ { - os << "["; +namespace Logger +{ + // common + extern std::vector >sinkList;// global var +}} + void reinit_logger(bool color, const std::string& filename = "", custom_severity_level threshold = SEVERITY_NOLOG); + void RemoveRegisteredSinks(); - if (std::is_same::value) + template + void InitLogFormatter(const boost::log::record_view &view, boost::log::formatting_ostream &os) { - os << "\033[01;36m"; + os << "["; + + if (std::is_same::value) + { + os << "\033[01;36m"; + } + + auto date_time_formatter = boost::log::expressions::stream << boost::log::expressions::format_date_time("TimeStamp", "%H:%M:%S"); + date_time_formatter(view, os); + + if (std::is_same::value) + { + os << "\033[0m"; + } + + os << "]" + << "[" + << view.attribute_values()["Severity"].extract() + << "] " + //<< " - " + << view.attribute_values()["Message"].extract(); } - auto date_time_formatter = boost::log::expressions::stream << boost::log::expressions::format_date_time("TimeStamp", "%H:%M:%S"); - date_time_formatter(view, os); - if (std::is_same::value) + template + int SetSinkFilterImpl(std::size_t index, FunT&& func) { - os << "\033[0m"; + if(indexset_filter(std::forward(func)); + } + return 0; } - os << "]" - << "[" - << view.attribute_values()["Severity"].extract() - << "] " - //<< " - " - << view.attribute_values()["Message"].extract(); -} + // console sink related functions + + + void DefaultConsoleInit(bool color = true); + int DefaultConsoleSetFilter(custom_severity_level threshold); + + + + // file sink related functions + + void DefaultAddFileSink(const std::string& filename, custom_severity_level threshold); + + template + void AddFileSink(FunT&& func, Args&&... args) + { + // add a text sink + typedef boost::log::sinks::text_file_backend sink_backend_t; + typedef boost::log::sinks::synchronous_sink sink_t; + + // forward keywords args for setting log file properties + boost::shared_ptr backend = boost::make_shared(std::forward(args)...); + boost::shared_ptr sink = boost::make_shared(backend); + + // specify the format of the log message + sink->set_formatter(&InitLogFormatter); + + // forward lambda for setting the filter + sink->set_filter(std::forward(func)); + + // add file sinks to core and list + boost::log::core::get()->add_sink(sink); + FairMQ::Logger::sinkList.push_back(sink); + + } + // helper macros @@ -128,20 +158,8 @@ void init_log_formatter(const boost::log::record_view &view, boost::log::formatt #define MQLOG(severity) BOOST_LOG_SEV(global_logger::get(),custom_severity_level::severity) #endif -#define SET_LOG_LEVEL(loglevel) boost::log::core::get()->set_filter(severity >= custom_severity_level::loglevel); -#define SET_LOG_FILTER(op,loglevel) set_global_log_level(log_op::op,custom_severity_level::loglevel) - -// local init macros (sinks) -// Notes : when applying a filter to the sink, and then to the core, the resulting filter will -// be the intersection of the two sets defined by the two filters, i.e., core and sinks -// filename : path to file name without extension -#define INIT_LOG_FILE(filename) init_log_file(filename); -#define INIT_LOG_FILE_LVL(filename,loglevel) init_log_file(filename,custom_severity_level::loglevel); -#define INIT_LOG_FILE_FILTER(filename,op,loglevel) init_log_file(filename,custom_severity_level::loglevel,log_op::op); -//INIT_LOG_FILE_FILTER_MP : add id to log filename for multiprocess -#define INIT_LOG_FILE_FILTER_MP(filename,op,loglevel,id) init_log_file(filename,custom_severity_level::loglevel,log_op::GREATER_EQ_THAN,id); - -// create new file without formatting -#define INIT_NEW_FILE(filename,op,loglevel) init_new_file(filename,custom_severity_level::loglevel,log_op::op); +#define SET_LOG_CONSOLE_LEVEL(loglevel) DefaultConsoleSetFilter(custom_severity_level::loglevel) +#define ADD_LOG_FILESINK(filename,loglevel) DefaultAddFileSink(filename, custom_severity_level::loglevel) +// Use : SET_LOG_CONSOLE_LEVEL(INFO); ADD_LOG_FILESINK(filename,ERROR); #endif diff --git a/fairmq/logger/run/testLogger.cxx b/fairmq/logger/run/testLogger.cxx index e84428c1..f306512b 100644 --- a/fairmq/logger/run/testLogger.cxx +++ b/fairmq/logger/run/testLogger.cxx @@ -20,7 +20,9 @@ #include "logger.h" _Pragma("GCC diagnostic pop") #endif - + +#include + void test_logger() { LOG(TRACE) << "this is a trace message"; @@ -32,34 +34,34 @@ LOG(STATE) << "this is a state message"; } - void test_set_level() + void test_console_level() { - std::cout<<"********* test logger : SET_LOG_LEVEL(lvl) *********"<(); + return (sev == fairmq::ERROR); + }, + boost::log::keywords::file_name = "test_log3_%5N.log", + boost::log::keywords::rotation_size = 5 * 1024 * 1024, + boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(12, 0, 0) + ); + + test_logger(); + + std::cout << "----------------------------"<set_filter([](const boost::log::attribute_value_set& attr_set) + { + auto sev = attr_set["Severity"].extract(); + return (sev == fairmq::WARN) || (sev == fairmq::ERROR); + }); + test_logger(); + + // remove all sinks, and restart console sinks reinit_logger(false); - test_set_level(); + test_logger(); return 0; } diff --git a/fairmq/options/FairMQProgOptions.cxx b/fairmq/options/FairMQProgOptions.cxx index 7ec9c87e..ad9111cb 100644 --- a/fairmq/options/FairMQProgOptions.cxx +++ b/fairmq/options/FairMQProgOptions.cxx @@ -15,6 +15,7 @@ #include "FairMQProgOptions.h" #include #include "FairMQParser.h" +#include "FairMQLogger.h" using namespace std; FairMQProgOptions::FairMQProgOptions() @@ -80,12 +81,14 @@ void FairMQProgOptions::ParseAll(const int argc, char** argv, bool allowUnregist if (fSeverityMap.count(verbosity)) { - set_global_log_level(log_op::operation::GREATER_EQ_THAN, fSeverityMap.at(verbosity)); + DefaultConsoleSetFilter(fSeverityMap.at(verbosity));// return 1 if not success + //set_global_log_level(log_op::operation::GREATER_EQ_THAN, fSeverityMap.at(verbosity)); } else { LOG(ERROR) << " verbosity level '" << verbosity << "' unknown, it will be set to DEBUG"; - set_global_log_level(log_op::operation::GREATER_EQ_THAN, fSeverityMap.at("DEBUG")); + //set_global_log_level(log_op::operation::GREATER_EQ_THAN, fSeverityMap.at("DEBUG")); + DefaultConsoleSetFilter(fSeverityMap.at("DEBUG")); } diff --git a/fairmq/options/runConfigEx.cxx b/fairmq/options/runConfigEx.cxx new file mode 100644 index 00000000..91d50b86 --- /dev/null +++ b/fairmq/options/runConfigEx.cxx @@ -0,0 +1,223 @@ +/******************************************************************************** + * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ +/* + * File: runSamplerRoot.cxx + * Author: winckler + */ + + +// FairRoot - FairMQ +#include "FairMQLogger.h" +#include "FairMQProgOptions.h" +#include "FairMQDevice.h" + +typedef std::unordered_map> FairMQMap; + +class MyDevice : public FairMQDevice +{ + public: + MyDevice() : rate(0.5) {} + virtual ~MyDevice() {} + void SetRate(double r){rate=r;} + void Print(){LOG(INFO)<<"[MyDevice] rate = "<()->default_value(0.5), "Data rate"); + + // parse command lines, parse json file and init FairMQMap + config.ParseAll(argc, argv); + + // get FairMQMap + auto map1 = config.GetFairMQMap(); + + // form keys from map1 and print the value stored in variable map + PrintMQParam(map1,config); + + // update value in variable map, and propagate the update to the FairMQMap + config.UpdateValue("data.0.address","tcp://localhost:1234"); + + // get the updated FairMQMap + auto map2 = config.GetFairMQMap(); + + // modify one channel value + map2.at("data").at(0).UpdateSndBufSize(500); + + // update the FairMQMap and propagate the change in variable map + config.UpdateChannelMap(map2); + + // print values stored in variable map + PrintMQParam(map2,config); + + MyDevice device; + device.CatchSignals(); + device.SetConfig(config); + + + std::string blah = config.GetStringValue("data-rate"); + double blah2 = config.ConvertTo(blah); + LOG(INFO)<<"blah2 "<("data.0.address",[&device](const std::string& key, const std::string& value) + { + LOG(INFO) << "[Lambda] Update parameter (0) " << key << " = " << value; + device.fChannels.at("data").at(0).UpdateAddress(value); + }); + + + std::string key1("data.0.address"); + std::string value1("tcp://localhost:4321"); + config.UpdateValue(key1,value1); + + LOG(INFO)<<"device.fChannels.GetAddress = "<("data.0.method",[&device](const std::string& key, const std::string& value) + { + //value="abcd"; + LOG(INFO) << "[Lambda] Update parameter " << key << " = " << value; + device.fChannels.at("data").at(0).UpdateMethod(value); + }); + + LOG(INFO)<<"---- Connect 3"; + config.Subscribe("data.0.rcvBufSize",[&device](const std::string& key, int value) + { + LOG(INFO) << "[Lambda] Update parameter " << key << " = " << value; + device.fChannels.at("data").at(0).UpdateRcvBufSize(value); + }); + + LOG(INFO)<<"---- Connect 4"; + config.Subscribe("data-rate",[&device](const std::string& key, double value) + { + LOG(INFO) << "[Lambda] Update parameter " << key << " = " << value; + device.SetRate(value); + }); + + + std::string key2("data.0.rcvBufSize"); + int value2(100); + + std::string key3("data.0.method"); + std::string value3("bind"); + + + + LOG(INFO)<<"-------------------- start update"; + + //config.EmitUpdate(key,value); + config.UpdateValue(key1,value1); + + LOG(INFO)<<"device.fChannels.GetAddress = "<("myNewKey",[](MyDevice& d, double val) + { + d.SetRate(val); + d.Print(); + }); + + double value4=0.123; + config.Emit("myNewKey",device,value4); + + + LOG(INFO)<<"-------------------- start custom 2 with function"; + config.Connect("function example",&MyCallBack); + + value4=6.66; + config.Emit("function example",device,value4); + + + + + } + catch (std::exception& e) + { + LOG(ERROR) << "Unhandled Exception reached the top of main: " + << e.what() << ", application will now exit"; + return 1; + } + return 0; +} + + diff --git a/fairmq/options/startConfigExample.sh.in b/fairmq/options/startConfigExample.sh.in new file mode 100755 index 00000000..5495a1cb --- /dev/null +++ b/fairmq/options/startConfigExample.sh.in @@ -0,0 +1,11 @@ +#!/bin/bash + +TRANSPORT="zeromq" +VERBOSE="DEBUG" + +JSONCONFIGFILE="@CMAKE_BINARY_DIR@/bin/config/ex1-sampler-sink.json" + +########################## start DEVICE +DEVICE="runConfigExample --transport $TRANSPORT --verbose $VERBOSE" +DEVICE+=" --id sampler1 --mq-config $JSONCONFIGFILE" +@CMAKE_BINARY_DIR@/bin/$DEVICE diff --git a/fairmq/test/pub-sub/runTestSub.cxx b/fairmq/test/pub-sub/runTestSub.cxx index 1615c317..f06ff875 100644 --- a/fairmq/test/pub-sub/runTestSub.cxx +++ b/fairmq/test/pub-sub/runTestSub.cxx @@ -41,7 +41,7 @@ int main(int argc, char** argv) } reinit_logger(false); - set_global_log_level(log_op::operation::GREATER_EQ_THAN, fairmq::NOLOG); + SET_LOG_CONSOLE_LEVEL(NOLOG); testSub.SetProperty(FairMQTestSub::Id, "testSub_" + std::to_string(getpid())); diff --git a/fairmq/test/push-pull/runTestPush.cxx b/fairmq/test/push-pull/runTestPush.cxx index 1db206ce..fa6eb0fa 100644 --- a/fairmq/test/push-pull/runTestPush.cxx +++ b/fairmq/test/push-pull/runTestPush.cxx @@ -39,7 +39,7 @@ int main(int argc, char** argv) } reinit_logger(false); - set_global_log_level(log_op::operation::GREATER_EQ_THAN, fairmq::NOLOG); + SET_LOG_CONSOLE_LEVEL(NOLOG); testPush.SetProperty(FairMQTestPush::Id, "testPush"); diff --git a/fairmq/test/req-rep/runTestReq.cxx b/fairmq/test/req-rep/runTestReq.cxx index b38e2548..51179ce7 100644 --- a/fairmq/test/req-rep/runTestReq.cxx +++ b/fairmq/test/req-rep/runTestReq.cxx @@ -41,7 +41,7 @@ int main(int argc, char** argv) } reinit_logger(false); - set_global_log_level(log_op::operation::GREATER_EQ_THAN, fairmq::NOLOG); + SET_LOG_CONSOLE_LEVEL(NOLOG); testReq.SetProperty(FairMQTestReq::Id, "testReq" + std::to_string(getpid()));