Commit e57222e0 authored by Pavel Vainerman's avatar Pavel Vainerman

backported to p8 as 2.4-alt3.M80P.4 (with rpmbph script)

parents 94cbb982 a6731ce7
...@@ -7,10 +7,6 @@ ...@@ -7,10 +7,6 @@
- (IONotifyController): Разработать механизм заказа группы датчиков сразу (и ответ тоже группой) - (IONotifyController): Разработать механизм заказа группы датчиков сразу (и ответ тоже группой)
---------- ----------
codegen:
- Сделать работу с TestMode на основе заказа!
- Сделать работу с ResetMsg на основе askTimer! // подумать нужно ли..
Version 2.3 Version 2.3
============ ============
...@@ -40,10 +36,9 @@ Version 2.3 ...@@ -40,10 +36,9 @@ Version 2.3
- Перевести взаимодействие PassiveObject <--> ProxyManager на shared_ptr (или weak_ptr). - Перевести взаимодействие PassiveObject <--> ProxyManager на shared_ptr (или weak_ptr).
uniset-codegen: добавить ключ --gen-sensor-name для генерирования name_Item.. (чтобы можно было в логах использовать текстовые названия) uniset-codegen: добавить ключ --gen-sensor-name для генерирования name_Item.. (чтобы можно было в логах использовать текстовые названия)
uniset-codegen: перенести инициализацию полей в header (c++11) и "разгрузить конструкторы" uniset-codegen: перенести инициализацию полей в header (c++11) и "разгрузить конструкторы"
SQL: SQL:
==== ====
- добавить работу с History (при передаче указателя на SM в конструкторе). - добавить работу с History (при передаче указателя на SM в конструкторе).
...@@ -58,16 +53,16 @@ Version 2.5 ...@@ -58,16 +53,16 @@ Version 2.5
- IOBase: возможность задавать свою формулу преобразования входного сигнала (помимо калибровки).. - IOBase: возможность задавать свою формулу преобразования входного сигнала (помимо калибровки)..
- переписать систему инициализации и работы между UniSetActivator,UniSetManager и UniSetObject-ами - переписать систему инициализации и работы между UniSetActivator,UniSetManager и UniSetObject-ами (уменьшить количество функций (связность))
(уменьшить количество функций (связность) и определится кто отвечает за удаление объекта и т.п.)
- Использовать PIMPL - Использовать PIMPL (подумать.. это серьёзная переделка кода)
- подумать.. это серьёзная переделка кода..
- Вылетать с ошибкой если в секции <thresholds> указан не существующий датчик - Вылетать с ошибкой если в секции <thresholds> указан не существующий датчик
- совместимость между 64bit и 32bit - для этого нужно отказаться от использования сырого long и перейти либо на int32_t либо CORBA::Long. - совместимость между 64bit и 32bit - для этого нужно отказаться от использования сырого long и перейти либо на int32_t либо CORBA::Long.
Либо стоит всё-таки ввести свой тип данных value_t для хранимых значений, чтобы спокойно работать в x86_64 и x86_32
при этом скрыв детали реализации. А возможно в последствии наложить какие-то ограничения на этот тип
- timeout_t getSharedMemoryReadyTimeout()! - timeout_t getSharedMemoryReadyTimeout()!
...@@ -90,8 +85,6 @@ DB: Сделать регулируемый буфер на INSERT-ы БД, чт ...@@ -90,8 +85,6 @@ DB: Сделать регулируемый буфер на INSERT-ы БД, чт
Уйти от использования libcommoncpp,libxml2,DebugLog,Thread,RWLock ==> и применяять одну библиотеку libpoco (http://pocoproject.org/documentation/index.html) Уйти от использования libcommoncpp,libxml2,DebugLog,Thread,RWLock ==> и применяять одну библиотеку libpoco (http://pocoproject.org/documentation/index.html)
================== ==================
Возможно стоит всё-таки ввести свой тип данных value_t для хранимых значений, чтобы спокойно работать в x86_64 и x86_32
при этом скрыв детали реализации. А возможно в последствии наложить какие-то ограничения на этот тип
Но тогда стоит вводить и namespace uniset Но тогда стоит вводить и namespace uniset
================= =================
......
...@@ -237,13 +237,13 @@ ...@@ -237,13 +237,13 @@
\param id - идентификатор датчика \param id - идентификатор датчика
\param showLinkName - TRUE - выводить SensorName, FALSE - не выводить \param showLinkName - TRUE - выводить SensorName, FALSE - не выводить
*/ */
std::string str( UniSetTypes::ObjectId id, bool showLinkName=true ); std::string str( UniSetTypes::ObjectId id, bool showLinkName=true ) const;
/*! Вывод значения входа/выхода в формате: in_xxx(SensorName)=val /*! Вывод значения входа/выхода в формате: in_xxx(SensorName)=val
\param id - идентификатор датчика \param id - идентификатор датчика
\param showLinkName - TRUE - выводить SensorName, FALSE - не выводить \param showLinkName - TRUE - выводить SensorName, FALSE - не выводить
*/ */
std::string strval( UniSetTypes::ObjectId id, bool showLinkName=true ); std::string strval( UniSetTypes::ObjectId id, bool showLinkName=true ) const;
/*! Вывод состояния внутренних переменных */ /*! Вывод состояния внутренних переменных */
inline std::string dumpVars(){ return std::move(vmon.pretty_str()); } inline std::string dumpVars(){ return std::move(vmon.pretty_str()); }
...@@ -1184,7 +1184,7 @@ std::string <xsl:value-of select="$CLASSNAME"/>_SK::dumpIO() ...@@ -1184,7 +1184,7 @@ std::string <xsl:value-of select="$CLASSNAME"/>_SK::dumpIO()
return std::move(s.str()); return std::move(s.str());
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId id, bool showLinkName ) std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId id, bool showLinkName ) const
{ {
ostringstream s; ostringstream s;
<xsl:for-each select="//smap/item"> <xsl:for-each select="//smap/item">
...@@ -1198,7 +1198,7 @@ std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId ...@@ -1198,7 +1198,7 @@ std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId
return ""; return "";
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::strval( UniSetTypes::ObjectId id, bool showLinkName ) std::string <xsl:value-of select="$CLASSNAME"/>_SK::strval( UniSetTypes::ObjectId id, bool showLinkName ) const
{ {
ostringstream s; ostringstream s;
<xsl:for-each select="//smap/item"> <xsl:for-each select="//smap/item">
...@@ -1511,7 +1511,7 @@ std::string <xsl:value-of select="$CLASSNAME"/>_SK::dumpIO() ...@@ -1511,7 +1511,7 @@ std::string <xsl:value-of select="$CLASSNAME"/>_SK::dumpIO()
return std::move(s.str()); return std::move(s.str());
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId id, bool showLinkName ) std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId id, bool showLinkName ) const
{ {
ostringstream s; ostringstream s;
<xsl:for-each select="//sensors/item/consumers/consumer"> <xsl:for-each select="//sensors/item/consumers/consumer">
...@@ -1529,7 +1529,7 @@ std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId ...@@ -1529,7 +1529,7 @@ std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId
return ""; return "";
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::strval( UniSetTypes::ObjectId id, bool showLinkName ) std::string <xsl:value-of select="$CLASSNAME"/>_SK::strval( UniSetTypes::ObjectId id, bool showLinkName ) const
{ {
ostringstream s; ostringstream s;
<xsl:for-each select="//sensors/item/consumers/consumer"> <xsl:for-each select="//sensors/item/consumers/consumer">
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
Name: libuniset2 Name: libuniset2
Version: 2.4 Version: 2.4
Release: alt2.M80P.3 Release: alt3.M80P.4
Summary: UniSet - library for building distributed industrial control systems Summary: UniSet - library for building distributed industrial control systems
License: LGPL License: LGPL
...@@ -486,9 +486,15 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -486,9 +486,15 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# .. # ..
%changelog %changelog
* Tue Jul 26 2016 Pavel Vainerman <pv@altlinux.ru> 2.4-alt2.M80P.3 * Mon Aug 01 2016 Pavel Vainerman <pv@altlinux.ru> 2.4-alt3.M80P.4
- backport to ALTLinux p8 (by rpmbph script) - backport to ALTLinux p8 (by rpmbph script)
* Mon Aug 01 2016 Pavel Vainerman <pv@altlinux.ru> 2.4-alt4
- build new version
* Thu Jul 28 2016 Pavel Vainerman <pv@altlinux.ru> 2.4-alt3.1
- test build
* Tue Jul 26 2016 Pavel Vainerman <pv@altlinux.ru> 2.4-alt3 * Tue Jul 26 2016 Pavel Vainerman <pv@altlinux.ru> 2.4-alt3
- merge devel/master - merge devel/master
......
...@@ -41,7 +41,7 @@ class MySQLInterface: ...@@ -41,7 +41,7 @@ class MySQLInterface:
// DBResult listFields( const std::string& table, const std::string& wild ); // DBResult listFields( const std::string& table, const std::string& wild );
virtual bool nconnect( const std::string& host, const std::string& user, const std::string& pswd, virtual bool nconnect( const std::string& host, const std::string& user, const std::string& pswd,
const std::string& dbname, unsigned int port=0 ) override; const std::string& dbname, unsigned int port = 0 ) override;
virtual bool close() override; virtual bool close() override;
bool query_ok( const std::string& q ); bool query_ok( const std::string& q );
......
...@@ -81,7 +81,7 @@ void DBServer_PostgreSQL::sysCommand( const UniSetTypes::SystemMessage* sm ) ...@@ -81,7 +81,7 @@ void DBServer_PostgreSQL::sysCommand( const UniSetTypes::SystemMessage* sm )
switch( sm->command ) switch( sm->command )
{ {
case SystemMessage::StartUp: case SystemMessage::StartUp:
askTimer(FlushInsertBuffer,ibufSyncTimeout); askTimer(FlushInsertBuffer, ibufSyncTimeout);
break; break;
case SystemMessage::Finish: case SystemMessage::Finish:
...@@ -199,7 +199,7 @@ void DBServer_PostgreSQL::flushInsertBuffer() ...@@ -199,7 +199,7 @@ void DBServer_PostgreSQL::flushInsertBuffer()
return; return;
dbcrit << myname << "(flushWriteBuffer): DB not connected!" dbcrit << myname << "(flushWriteBuffer): DB not connected!"
<< " buffer[" << ibufSize << "] overflow! LOST DATA..." << endl; << " buffer[" << ibufSize << "] overflow! LOST DATA..." << endl;
// Чистим заданное число // Чистим заданное число
size_t delnum = lroundf(ibufSize * ibufOverflowCleanFactor); size_t delnum = lroundf(ibufSize * ibufOverflowCleanFactor);
...@@ -219,8 +219,9 @@ void DBServer_PostgreSQL::flushInsertBuffer() ...@@ -219,8 +219,9 @@ void DBServer_PostgreSQL::flushInsertBuffer()
std::advance(end, delnum); std::advance(end, delnum);
} }
ibuf.erase(beg,end); ibuf.erase(beg, end);
ibufSize -= delnum; ibufSize -= delnum;
if( ibufSize < 0 ) if( ibufSize < 0 )
ibufSize = 0; ibufSize = 0;
...@@ -233,7 +234,7 @@ void DBServer_PostgreSQL::flushInsertBuffer() ...@@ -233,7 +234,7 @@ void DBServer_PostgreSQL::flushInsertBuffer()
dbinfo << myname << "(flushInsertBuffer): write insert buffer[" << ibufSize << "] to DB.." << endl; dbinfo << myname << "(flushInsertBuffer): write insert buffer[" << ibufSize << "] to DB.." << endl;
if( !db->copy("main_history",tblcols,ibuf) ) if( !db->copy("main_history", tblcols, ibuf) )
{ {
dbcrit << myname << "(flushInsertBuffer): error: " << db->error() << endl; dbcrit << myname << "(flushInsertBuffer): error: " << db->error() << endl;
} }
...@@ -322,20 +323,20 @@ void DBServer_PostgreSQL::initDBServer() ...@@ -322,20 +323,20 @@ void DBServer_PostgreSQL::initDBServer()
string dbnode( conf->getArgParam("--" + prefix + "-dbnode", it.getProp("dbnode"))); string dbnode( conf->getArgParam("--" + prefix + "-dbnode", it.getProp("dbnode")));
string dbuser( conf->getArgParam("--" + prefix + "-dbuser", it.getProp("dbuser"))); string dbuser( conf->getArgParam("--" + prefix + "-dbuser", it.getProp("dbuser")));
string dbpass( conf->getArgParam("--" + prefix + "-dbpass", it.getProp("dbpass"))); string dbpass( conf->getArgParam("--" + prefix + "-dbpass", it.getProp("dbpass")));
unsigned int dbport = conf->getArgPInt("--" + prefix + "-dbport", it.getProp("dbport"),5432); unsigned int dbport = conf->getArgPInt("--" + prefix + "-dbport", it.getProp("dbport"), 5432);
ibufMaxSize = conf->getArgPInt("--" + prefix + "-ibuf-maxsize", it.getProp("ibufMaxSize"),2000); ibufMaxSize = conf->getArgPInt("--" + prefix + "-ibuf-maxsize", it.getProp("ibufMaxSize"), 2000);
ibuf.reserve(ibufMaxSize); ibuf.reserve(ibufMaxSize);
ibufSyncTimeout = conf->getArgPInt("--" + prefix + "-ibuf-sync-timeout", it.getProp("ibufSyncTimeout"),15000); ibufSyncTimeout = conf->getArgPInt("--" + prefix + "-ibuf-sync-timeout", it.getProp("ibufSyncTimeout"), 15000);
std::string sfactor = conf->getArg2Param("--" + prefix + "-ibuf-overflow-cleanfactor", it.getProp("ibufOverflowCleanFactor"),"0.5"); std::string sfactor = conf->getArg2Param("--" + prefix + "-ibuf-overflow-cleanfactor", it.getProp("ibufOverflowCleanFactor"), "0.5");
ibufOverflowCleanFactor = atof(sfactor.c_str()); ibufOverflowCleanFactor = atof(sfactor.c_str());
tblMap[UniSetTypes::Message::SensorInfo] = "main_history"; tblMap[UniSetTypes::Message::SensorInfo] = "main_history";
tblMap[UniSetTypes::Message::Confirm] = "main_history"; tblMap[UniSetTypes::Message::Confirm] = "main_history";
PingTime = conf->getArgPInt("--" + prefix + "-pingTime", it.getProp("pingTime"),15000); PingTime = conf->getArgPInt("--" + prefix + "-pingTime", it.getProp("pingTime"), 15000);
ReconnectTime = conf->getArgPInt("--" + prefix + "-reconnectTime", it.getProp("reconnectTime"),30000); ReconnectTime = conf->getArgPInt("--" + prefix + "-reconnectTime", it.getProp("reconnectTime"), 30000);
qbufSize = conf->getArgPInt("--" + prefix + "-buffer-size", it.getProp("bufferSize"), 200); qbufSize = conf->getArgPInt("--" + prefix + "-buffer-size", it.getProp("bufferSize"), 200);
......
...@@ -114,7 +114,7 @@ class DBServer_PostgreSQL: ...@@ -114,7 +114,7 @@ class DBServer_PostgreSQL:
std::mutex mqbuf; std::mutex mqbuf;
// writeBuffer // writeBuffer
const std::list<std::string> tblcols = { "date", "time","time_usec","sensor_id","value","node" }; const std::list<std::string> tblcols = { "date", "time", "time_usec", "sensor_id", "value", "node" };
typedef std::vector<PostgreSQLInterface::Record> InsertBuffer; typedef std::vector<PostgreSQLInterface::Record> InsertBuffer;
InsertBuffer ibuf; InsertBuffer ibuf;
......
...@@ -98,11 +98,12 @@ bool PostgreSQLInterface::copy( const std::string& tblname, const std::list<std: ...@@ -98,11 +98,12 @@ bool PostgreSQLInterface::copy( const std::string& tblname, const std::list<std:
try try
{ {
work w( *(db.get()) ); work w( *(db.get()) );
tablewriter t(w,tblname,cols.begin(),cols.end()); tablewriter t(w, tblname, cols.begin(), cols.end());
t.reserve(data.size()); // size() не дорогая операция для list? t.reserve(data.size()); // size() не дорогая операция для list?
for( const auto& d: data )
t.push_back(d.begin(),d.end()); for( const auto& d : data )
t.push_back(d.begin(), d.end());
t.complete(); t.complete();
w.commit(); w.commit();
......
...@@ -36,7 +36,7 @@ class PostgreSQLInterface: ...@@ -36,7 +36,7 @@ class PostgreSQLInterface:
virtual bool nconnect( const std::string& host, const std::string& user, virtual bool nconnect( const std::string& host, const std::string& user,
const std::string& pswd, const std::string& dbname, const std::string& pswd, const std::string& dbname,
unsigned int port=5432) override; unsigned int port = 5432) override;
virtual bool close() override; virtual bool close() override;
virtual bool isConnection() override; virtual bool isConnection() override;
virtual bool ping() override; // проверка доступности БД virtual bool ping() override; // проверка доступности БД
......
...@@ -14,17 +14,19 @@ int main(int argc, char** argv) ...@@ -14,17 +14,19 @@ int main(int argc, char** argv)
dbname = string(argv[1]); dbname = string(argv[1]);
size_t ver = 1; size_t ver = 1;
if( argc > 2 ) if( argc > 2 )
ver = atoi(argv[2]); ver = atoi(argv[2]);
size_t num = 10000; size_t num = 10000;
if( argc > 3 ) if( argc > 3 )
num = atoi(argv[3]); num = atoi(argv[3]);
try try
{ {
PostgreSQLInterface db; PostgreSQLInterface db;
cout << "connect to '" << dbname << "'..." << endl; cout << "connect to '" << dbname << "'..." << endl;
if( !db.nconnect("localhost", "dbadmin", "dbadmin", dbname) ) if( !db.nconnect("localhost", "dbadmin", "dbadmin", dbname) )
...@@ -40,7 +42,7 @@ int main(int argc, char** argv) ...@@ -40,7 +42,7 @@ int main(int argc, char** argv)
if( ver == 1 ) if( ver == 1 )
{ {
for( size_t i=0; i<num; i++ ) for( size_t i = 0; i < num; i++ )
{ {
q << "INSERT INTO main_history(date,time,time_usec,sensor_id,value,node)" q << "INSERT INTO main_history(date,time,time_usec,sensor_id,value,node)"
<< " VALUES(now(),now(),0,7,1,3000);"; << " VALUES(now(),now(),0,7,1,3000);";
...@@ -49,7 +51,8 @@ int main(int argc, char** argv) ...@@ -49,7 +51,8 @@ int main(int argc, char** argv)
else if( ver == 2 ) else if( ver == 2 )
{ {
q << "INSERT INTO main_history(date,time,time_usec,sensor_id,value,node) VALUES"; q << "INSERT INTO main_history(date,time,time_usec,sensor_id,value,node) VALUES";
for( size_t i=0; i<num; i++ )
for( size_t i = 0; i < num; i++ )
{ {
q << "(now(),now(),0,7,1,3000),"; q << "(now(),now(),0,7,1,3000),";
} }
...@@ -58,18 +61,21 @@ int main(int argc, char** argv) ...@@ -58,18 +61,21 @@ int main(int argc, char** argv)
} }
std::chrono::time_point<std::chrono::system_clock> start, end; std::chrono::time_point<std::chrono::system_clock> start, end;
if( ver == 3 ) if( ver == 3 )
{ {
std::list<std::string> cols = { "date", "time","time_usec","sensor_id","value","node" }; std::list<std::string> cols = { "date", "time", "time_usec", "sensor_id", "value", "node" };
PostgreSQLInterface::Data data; PostgreSQLInterface::Data data;
for( size_t i=0; i<num; i++ )
for( size_t i = 0; i < num; i++ )
{ {
PostgreSQLInterface::Record d = { "now()","now()","0","7","1","3000" }; PostgreSQLInterface::Record d = { "now()", "now()", "0", "7", "1", "3000" };
data.push_back(std::move(d)); data.push_back(std::move(d));
} }
start = std::chrono::system_clock::now(); start = std::chrono::system_clock::now();
if( !db.copy("main_history",cols,data) )
if( !db.copy("main_history", cols, data) )
{ {
cerr << "query error: " << db.error() << endl; cerr << "query error: " << db.error() << endl;
db.close(); db.close();
...@@ -79,6 +85,7 @@ int main(int argc, char** argv) ...@@ -79,6 +85,7 @@ int main(int argc, char** argv)
else else
{ {
start = std::chrono::system_clock::now(); start = std::chrono::system_clock::now();
if( !db.insert( std::move(q.str())) ) if( !db.insert( std::move(q.str())) )
{ {
cerr << "query error: " << db.error() << endl; cerr << "query error: " << db.error() << endl;
......
...@@ -62,8 +62,7 @@ class ComediInterface ...@@ -62,8 +62,7 @@ class ComediInterface
static std::string type2str( SubdevType t ); static std::string type2str( SubdevType t );
static SubdevType str2type( const std::string& s ); static SubdevType str2type( const std::string& s );
void configureSubdev( int subdev, SubdevType type ) throw(UniSetTypes::Exception); void configureSubdev( int subdev, SubdevType type ) throw(UniSetTypes::Exception);
void configureChannel( int subdev, int channel, ChannelType type, int range = 0, int aref = 0 ) void configureChannel( int subdev, int channel, ChannelType type, int range = 0, int aref = 0 )
throw(UniSetTypes::Exception); throw(UniSetTypes::Exception);
......
...@@ -186,15 +186,15 @@ class CardList: ...@@ -186,15 +186,15 @@ class CardList:
{ {
public: public:
explicit CardList( int size ) : std::vector<ComediInterface * >(size) { } explicit CardList( size_t size ) : std::vector<ComediInterface * >(size) { }
~CardList() ~CardList()
{ {
for( unsigned int i = 0; i < size(); i++ ) for( size_t i = 0; i < size(); i++ )
delete (*this)[i]; delete (*this)[i];
} }
inline ComediInterface* getCard(int ncard) inline ComediInterface* getCard(int ncard) const
{ {
if( ncard >= 0 && ncard < (int)size() ) if( ncard >= 0 && ncard < (int)size() )
return (*this)[ncard]; return (*this)[ncard];
...@@ -258,7 +258,7 @@ class IOControl: ...@@ -258,7 +258,7 @@ class IOControl:
int subdev; /*!< (UNIO) подустройство (см. comedi_test для конкретной карты в/в) */ int subdev; /*!< (UNIO) подустройство (см. comedi_test для конкретной карты в/в) */
int channel; /*!< (UNIO) канал [0...23] */ int channel; /*!< (UNIO) канал [0...23] */
int ncard; /*!< номер карты [1|2]. 0 - не определена. FIXME from Lav: -1 - не определена? */ int ncard; /*!< номер карты [1|2]. -1 - не определена. */
/*! Вид поключения /*! Вид поключения
0 - analog ref = analog ground 0 - analog ref = analog ground
...@@ -286,21 +286,21 @@ class IOControl: ...@@ -286,21 +286,21 @@ class IOControl:
struct IOPriority struct IOPriority
{ {
IOPriority(int p, int i): IOPriority(size_t p, size_t i):
priority(p), index(i) {} priority(p), index(i) {}
int priority; size_t priority;
int index; size_t index;
}; };
enum TestModeID enum TestModeID
{ {
tmNone = 0, /*!< тестовый режим отключён */ tmNone = 0, /*!< тестовый режим отключён */
tmOffPoll = 1, /*!< отключить опрос */ tmOffPoll = 1, /*!< отключить опрос */
tmConfigEnable = 2, /*!< специальный режим, в соответсвии с настройкой 'enable_testmode' */ tmConfigEnable = 2, /*!< специальный режим, в соответствии с настройкой 'enable_testmode' */
tmConfigDisable = 3, /*!< специальный режим, в соответсвии с настройкой 'disable_testmode' */ tmConfigDisable = 3, /*!< специальный режим, в соответствии с настройкой 'disable_testmode' */
tmOnlyInputs = 4, /*!< включены только входы */ tmOnlyInputs = 4, /*!< включены только входы */
tmOnlyOutputs = 5 /*!< включены только выходы */ tmOnlyOutputs = 5 /*!< включены только выходы */
}; };
void execute(); void execute();
...@@ -335,8 +335,6 @@ class IOControl: ...@@ -335,8 +335,6 @@ class IOControl:
void waitSM(); void waitSM();
bool checkCards( const std::string& func = "" );
xmlNode* cnode = { 0 }; /*!< xml-узел в настроечном файле */ xmlNode* cnode = { 0 }; /*!< xml-узел в настроечном файле */
int polltime = { 150 }; /*!< переодичность обновления данных (опроса карт в/в), [мсек] */ int polltime = { 150 }; /*!< переодичность обновления данных (опроса карт в/в), [мсек] */
...@@ -403,8 +401,7 @@ class IOControl: ...@@ -403,8 +401,7 @@ class IOControl:
bool readconf_ok = { false }; bool readconf_ok = { false };
int activateTimeout; int activateTimeout;
UniSetTypes::ObjectId sidTestSMReady = { UniSetTypes::DefaultObjectId }; UniSetTypes::ObjectId sidTestSMReady = { UniSetTypes::DefaultObjectId };
bool term = { false }; std::atomic_bool term = { false };
UniSetTypes::ObjectId testMode_as = { UniSetTypes::DefaultObjectId }; UniSetTypes::ObjectId testMode_as = { UniSetTypes::DefaultObjectId };
IOController::IOStateList::iterator itTestMode; IOController::IOStateList::iterator itTestMode;
......
...@@ -23,7 +23,7 @@ using namespace std; ...@@ -23,7 +23,7 @@ using namespace std;
const Element::ElementID Element::DefaultElementID = "?id?"; const Element::ElementID Element::DefaultElementID = "?id?";
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void Element::addChildOut( std::shared_ptr<Element> el, int num ) void Element::addChildOut( std::shared_ptr<Element> el, size_t num )
{ {
if( el.get() == this ) if( el.get() == this )
{ {
...@@ -90,7 +90,7 @@ std::shared_ptr<Element> Element::find(const ElementID& id ) ...@@ -90,7 +90,7 @@ std::shared_ptr<Element> Element::find(const ElementID& id )
return nullptr; return nullptr;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void Element::addInput(int num, bool state) void Element::addInput(size_t num, bool state)
{ {
for( auto& it : ins ) for( auto& it : ins )
{ {
...@@ -105,7 +105,7 @@ void Element::addInput(int num, bool state) ...@@ -105,7 +105,7 @@ void Element::addInput(int num, bool state)
ins.push_front(InputInfo(num, state)); ins.push_front(InputInfo(num, state));
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void Element::delInput( int num ) void Element::delInput(size_t num )
{ {
for( auto it = ins.begin(); it != ins.end(); ++it ) for( auto it = ins.begin(); it != ins.end(); ++it )
{ {
......
...@@ -57,30 +57,30 @@ class Element ...@@ -57,30 +57,30 @@ class Element
*/ */
virtual void tick() {} virtual void tick() {}
virtual void setIn( int num, bool state ) = 0; virtual void setIn( size_t num, bool state ) = 0;
virtual bool getOut() = 0; virtual bool getOut() const = 0;
inline ElementID getId() inline ElementID getId() const
{ {
return myid; return myid;
} }
virtual std::string getType() virtual std::string getType() const
{ {
return "?type?"; return "?type?";
} }
virtual std::shared_ptr<Element> find( const ElementID& id ); virtual std::shared_ptr<Element> find( const ElementID& id );
virtual void addChildOut( std::shared_ptr<Element> el, int in_num ); virtual void addChildOut( std::shared_ptr<Element> el, size_t in_num );
virtual void delChildOut( std::shared_ptr<Element> el ); virtual void delChildOut( std::shared_ptr<Element> el );
inline int outCount() inline size_t outCount() const
{ {
return outs.size(); return outs.size();
} }
virtual void addInput( int num, bool state = false ); virtual void addInput( size_t num, bool state = false );
virtual void delInput( int num ); virtual void delInput( size_t num );
inline int inCount() inline size_t inCount() const
{ {
return ins.size(); return ins.size();
} }
...@@ -103,24 +103,23 @@ class Element ...@@ -103,24 +103,23 @@ class Element
struct ChildInfo struct ChildInfo
{ {
ChildInfo(std::shared_ptr<Element> e, int n): ChildInfo(std::shared_ptr<Element> e, size_t n):
el(e), num(n) {} el(e), num(n) {}
ChildInfo(): el(0), num(0) {} ChildInfo(): el(0), num(0) {}
std::shared_ptr<Element> el; std::shared_ptr<Element> el;
int num; size_t num;
}; };
typedef std::list<ChildInfo> OutputList; typedef std::list<ChildInfo> OutputList;
OutputList outs; OutputList outs;
virtual void setChildOut(); virtual void setChildOut();
struct InputInfo struct InputInfo
{ {
InputInfo(): num(0), state(false), type(unknown) {} InputInfo(): num(0), state(false), type(unknown) {}
InputInfo(int n, bool s): num(n), state(s), type(unknown) {} InputInfo(size_t n, bool s): num(n), state(s), type(unknown) {}
int num; size_t num;
bool state; bool state;
InputType type; InputType type;
}; };
...@@ -140,16 +139,16 @@ class TOR: ...@@ -140,16 +139,16 @@ class TOR:
{ {
public: public:
TOR( ElementID id, unsigned int numbers = 0, bool st = false ); TOR( ElementID id, size_t numbers = 0, bool st = false );
virtual ~TOR(); virtual ~TOR();
virtual void setIn( int num, bool state ) override; virtual void setIn( size_t num, bool state ) override;
virtual bool getOut() override virtual bool getOut() const override
{ {
return myout; return myout;
} }
virtual std::string getType() override virtual std::string getType() const override
{ {
return "OR"; return "OR";
} }
...@@ -167,11 +166,11 @@ class TAND: ...@@ -167,11 +166,11 @@ class TAND:
{ {
public: public:
TAND( ElementID id, int numbers = 0, bool st = false ); TAND(ElementID id, size_t numbers = 0, bool st = false );
virtual ~TAND(); virtual ~TAND();
virtual void setIn( int num, bool state ) override; virtual void setIn( size_t num, bool state ) override;
virtual std::string getType() override virtual std::string getType() const override
{ {
return "AND"; return "AND";
} }
...@@ -192,20 +191,20 @@ class TNOT: ...@@ -192,20 +191,20 @@ class TNOT:
TNOT( ElementID id, bool out_default ); TNOT( ElementID id, bool out_default );
virtual ~TNOT(); virtual ~TNOT();
virtual bool getOut() override virtual bool getOut() const override
{ {
return myout; return myout;
} }
/* num игнорируется, т.к. элемент с одним входом /* num игнорируется, т.к. элемент с одним входом
*/ */
virtual void setIn( int num, bool state ) override ; virtual void setIn( size_t num, bool state ) override ;
virtual std::string getType() override virtual std::string getType() const override
{ {
return "NOT"; return "NOT";
} }
virtual void addInput( int num, bool state = false ) override {} virtual void addInput( size_t num, bool state = false ) override {}
virtual void delInput( int num ) override {} virtual void delInput( size_t num ) override {}
protected: protected:
TNOT(): myout(false) {} TNOT(): myout(false) {}
......
...@@ -116,7 +116,7 @@ class LProcessor ...@@ -116,7 +116,7 @@ class LProcessor
void open( const std::string& lfile ); void open( const std::string& lfile );
inline bool isOpen() inline bool isOpen() const
{ {
return !fSchema.empty(); return !fSchema.empty();
} }
...@@ -133,7 +133,7 @@ class LProcessor ...@@ -133,7 +133,7 @@ class LProcessor
return sch; return sch;
} }
inline int getSleepTime() inline int getSleepTime() const
{ {
return sleepTime; return sleepTime;
} }
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
using namespace std; using namespace std;
using namespace UniSetExtensions; using namespace UniSetExtensions;
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
TAND::TAND(ElementID id, int num, bool st): TAND::TAND(ElementID id, size_t num, bool st):
TOR(id, num, st) TOR(id, num, st)
{ {
} }
...@@ -30,7 +30,7 @@ TAND::~TAND() ...@@ -30,7 +30,7 @@ TAND::~TAND()
{ {
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void TAND::setIn( int num, bool state ) void TAND::setIn(size_t num, bool state )
{ {
// cout << this << ": input " << num << " set " << state << endl; // cout << this << ": input " << num << " set " << state << endl;
for( auto& it : ins ) for( auto& it : ins )
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
using namespace std; using namespace std;
using namespace UniSetExtensions; using namespace UniSetExtensions;
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
TDelay::TDelay( Element::ElementID id, timeout_t delayMS, unsigned int inCount): TDelay::TDelay(Element::ElementID id, timeout_t delayMS, size_t inCount):
Element(id), Element(id),
myout(false), myout(false),
delay(delayMS) delay(delayMS)
...@@ -38,7 +38,7 @@ TDelay::~TDelay() ...@@ -38,7 +38,7 @@ TDelay::~TDelay()
{ {
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void TDelay::setIn( int num, bool state ) void TDelay::setIn( size_t num, bool state )
{ {
bool prev = myout; bool prev = myout;
...@@ -89,7 +89,7 @@ void TDelay::tick() ...@@ -89,7 +89,7 @@ void TDelay::tick()
} }
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool TDelay::getOut() bool TDelay::getOut() const
{ {
return myout; return myout;
} }
......
...@@ -27,14 +27,13 @@ class TDelay: ...@@ -27,14 +27,13 @@ class TDelay:
{ {
public: public:
TDelay( Element::ElementID id, timeout_t delayMS = 0, unsigned int inCount = 0 ); TDelay( Element::ElementID id, timeout_t delayMS = 0, size_t inCount = 0 );
virtual ~TDelay(); virtual ~TDelay();
virtual void tick() override; virtual void tick() override;
virtual void setIn( int num, bool state ) override; virtual void setIn( size_t num, bool state ) override;
virtual bool getOut() override; virtual bool getOut() const override;
virtual std::string getType() override virtual std::string getType() const override
{ {
return "Delay"; return "Delay";
} }
......
...@@ -33,7 +33,7 @@ TNOT::~TNOT() ...@@ -33,7 +33,7 @@ TNOT::~TNOT()
{ {
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void TNOT::setIn( int num, bool state ) void TNOT::setIn( size_t num, bool state )
{ {
bool prev = myout; bool prev = myout;
myout = !state; myout = !state;
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
using namespace std; using namespace std;
using namespace UniSetExtensions; using namespace UniSetExtensions;
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
TOR::TOR(ElementID id, unsigned int num, bool st): TOR::TOR(ElementID id, size_t num, bool st):
Element(id), Element(id),
myout(false) myout(false)
{ {
...@@ -43,7 +43,7 @@ TOR::~TOR() ...@@ -43,7 +43,7 @@ TOR::~TOR()
{ {
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void TOR::setIn( int num, bool state ) void TOR::setIn( size_t num, bool state )
{ {
// cout << getType() << "(" << myid << "): input " << num << " set " << state << endl; // cout << getType() << "(" << myid << "): input " << num << " set " << state << endl;
......
...@@ -327,7 +327,7 @@ void MBExchange::step() ...@@ -327,7 +327,7 @@ void MBExchange::step()
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool MBExchange::checkProcActive() bool MBExchange::checkProcActive() const
{ {
return activated; return activated;
} }
...@@ -509,7 +509,7 @@ bool MBExchange::checkUpdateSM( bool wrFunc, long mdev ) ...@@ -509,7 +509,7 @@ bool MBExchange::checkUpdateSM( bool wrFunc, long mdev )
return true; return true;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool MBExchange::checkPoll( bool wrFunc ) bool MBExchange::checkPoll( bool wrFunc ) const
{ {
if( exchangeMode == emWriteOnly && !wrFunc ) if( exchangeMode == emWriteOnly && !wrFunc )
{ {
...@@ -1463,14 +1463,14 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1463,14 +1463,14 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
{ {
VTypes::F2 f2(f); VTypes::F2 f2(f);
for( int k = 0; k < VTypes::F2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F2::wsize(); k++, i++ )
i->second->mbval = f2.raw.v[k]; i->second->mbval = f2.raw.v[k];
} }
else if( p->vType == VTypes::vtF2r ) else if( p->vType == VTypes::vtF2r )
{ {
VTypes::F2r f2(f); VTypes::F2r f2(f);
for( int k = 0; k < VTypes::F2r::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F2r::wsize(); k++, i++ )
i->second->mbval = f2.raw.v[k]; i->second->mbval = f2.raw.v[k];
} }
...@@ -1481,7 +1481,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1481,7 +1481,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::F2::wsize()]; ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::F2::wsize()];
for( int k = 0; k < VTypes::F2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F2::wsize(); k++, i++ )
data[k] = i->second->mbval; data[k] = i->second->mbval;
float f = 0; float f = 0;
...@@ -1513,7 +1513,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1513,7 +1513,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
float f = IOBase::processingFasAO( p, shm, force_out ); float f = IOBase::processingFasAO( p, shm, force_out );
VTypes::F4 f4(f); VTypes::F4 f4(f);
for( int k = 0; k < VTypes::F4::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F4::wsize(); k++, i++ )
i->second->mbval = f4.raw.v[k]; i->second->mbval = f4.raw.v[k];
r->sm_initOK = true; r->sm_initOK = true;
...@@ -1523,7 +1523,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1523,7 +1523,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::F4::wsize()]; ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::F4::wsize()];
for( int k = 0; k < VTypes::F4::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F4::wsize(); k++, i++ )
data[k] = i->second->mbval; data[k] = i->second->mbval;
VTypes::F4 f(data, VTypes::F4::wsize()); VTypes::F4 f(data, VTypes::F4::wsize());
...@@ -1546,14 +1546,14 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1546,14 +1546,14 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
{ {
VTypes::I2 i2(v); VTypes::I2 i2(v);
for( int k = 0; k < VTypes::I2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ )
i->second->mbval = i2.raw.v[k]; i->second->mbval = i2.raw.v[k];
} }
else if( p->vType == VTypes::vtI2r ) else if( p->vType == VTypes::vtI2r )
{ {
VTypes::I2r i2(v); VTypes::I2r i2(v);
for( int k = 0; k < VTypes::I2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ )
i->second->mbval = i2.raw.v[k]; i->second->mbval = i2.raw.v[k];
} }
...@@ -1564,7 +1564,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1564,7 +1564,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::I2::wsize()]; ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::I2::wsize()];
for( int k = 0; k < VTypes::I2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ )
data[k] = i->second->mbval; data[k] = i->second->mbval;
int v = 0; int v = 0;
...@@ -1598,14 +1598,14 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1598,14 +1598,14 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
{ {
VTypes::U2 u2(v); VTypes::U2 u2(v);
for( int k = 0; k < VTypes::U2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::U2::wsize(); k++, i++ )
i->second->mbval = u2.raw.v[k]; i->second->mbval = u2.raw.v[k];
} }
else if( p->vType == VTypes::vtU2r ) else if( p->vType == VTypes::vtU2r )
{ {
VTypes::U2r u2(v); VTypes::U2r u2(v);
for( int k = 0; k < VTypes::U2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::U2::wsize(); k++, i++ )
i->second->mbval = u2.raw.v[k]; i->second->mbval = u2.raw.v[k];
} }
...@@ -1616,7 +1616,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1616,7 +1616,7 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
{ {
ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::U2::wsize()]; ModbusRTU::ModbusData* data = new ModbusRTU::ModbusData[VTypes::U2::wsize()];
for( int k = 0; k < VTypes::U2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::U2::wsize(); k++, i++ )
data[k] = i->second->mbval; data[k] = i->second->mbval;
unsigned int v = 0; unsigned int v = 0;
......
...@@ -301,9 +301,9 @@ class MBExchange: ...@@ -301,9 +301,9 @@ class MBExchange:
virtual void updateRespondSensors(); virtual void updateRespondSensors();
bool checkUpdateSM( bool wrFunc, long devMode ); bool checkUpdateSM( bool wrFunc, long devMode );
bool checkPoll( bool wrFunc ); bool checkPoll( bool wrFunc ) const;
bool checkProcActive(); bool checkProcActive() const;
void setProcActive( bool st ); void setProcActive( bool st );
void waitSMReady(); void waitSMReady();
......
...@@ -316,7 +316,7 @@ void MBTCPMultiMaster::final_thread() ...@@ -316,7 +316,7 @@ void MBTCPMultiMaster::final_thread()
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool MBTCPMultiMaster::MBSlaveInfo::check() bool MBTCPMultiMaster::MBSlaveInfo::check() const
{ {
return mbtcp->checkConnection(ip, port, recv_timeout); return mbtcp->checkConnection(ip, port, recv_timeout);
} }
......
...@@ -302,7 +302,7 @@ class MBTCPMultiMaster: ...@@ -302,7 +302,7 @@ class MBTCPMultiMaster:
} }
bool init( std::shared_ptr<DebugStream>& mblog ); bool init( std::shared_ptr<DebugStream>& mblog );
bool check(); bool check() const;
inline void setUse( bool st ) inline void setUse( bool st )
{ {
respond_init = !( st && !use ); respond_init = !( st && !use );
......
...@@ -1771,7 +1771,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD ...@@ -1771,7 +1771,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD
ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::I2::wsize()]; ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::I2::wsize()];
for( int k = 0; k < VTypes::I2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::I2::wsize(); k++, i++ )
d[k] = dat[i]; d[k] = dat[i];
VTypes::I2 i2(d, VTypes::I2::wsize()); VTypes::I2 i2(d, VTypes::I2::wsize());
...@@ -1788,7 +1788,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD ...@@ -1788,7 +1788,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD
ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::I2r::wsize()]; ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::I2r::wsize()];
for( int k = 0; k < VTypes::I2r::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::I2r::wsize(); k++, i++ )
d[k] = dat[i]; d[k] = dat[i];
VTypes::I2r i2r(d, VTypes::I2r::wsize()); VTypes::I2r i2r(d, VTypes::I2r::wsize());
...@@ -1805,7 +1805,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD ...@@ -1805,7 +1805,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD
ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::U2::wsize()]; ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::U2::wsize()];
for( int k = 0; k < VTypes::U2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::U2::wsize(); k++, i++ )
d[k] = dat[i]; d[k] = dat[i];
VTypes::U2 u2(d, VTypes::U2::wsize()); VTypes::U2 u2(d, VTypes::U2::wsize());
...@@ -1822,7 +1822,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD ...@@ -1822,7 +1822,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD
ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::U2r::wsize()]; ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::U2r::wsize()];
for( int k = 0; k < VTypes::U2r::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::U2r::wsize(); k++, i++ )
d[k] = dat[i]; d[k] = dat[i];
VTypes::U2r u2r(d, VTypes::U2r::wsize()); VTypes::U2r u2r(d, VTypes::U2r::wsize());
...@@ -1839,7 +1839,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD ...@@ -1839,7 +1839,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD
ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::F2::wsize()]; ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::F2::wsize()];
for( int k = 0; k < VTypes::F2::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F2::wsize(); k++, i++ )
d[k] = dat[i]; d[k] = dat[i];
VTypes::F2 f2(d, VTypes::F2::wsize()); VTypes::F2 f2(d, VTypes::F2::wsize());
...@@ -1857,7 +1857,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD ...@@ -1857,7 +1857,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD
ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::F2r::wsize()]; ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::F2r::wsize()];
for( int k = 0; k < VTypes::F2r::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F2r::wsize(); k++, i++ )
d[k] = dat[i]; d[k] = dat[i];
VTypes::F2r f2r(d, VTypes::F2r::wsize()); VTypes::F2r f2r(d, VTypes::F2r::wsize());
...@@ -1874,7 +1874,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD ...@@ -1874,7 +1874,7 @@ ModbusRTU::mbErrCode MBSlave::real_write_prop( IOProperty* p, ModbusRTU::ModbusD
ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::F4::wsize()]; ModbusRTU::ModbusData* d = new ModbusRTU::ModbusData[VTypes::F4::wsize()];
for( int k = 0; k < VTypes::F4::wsize(); k++, i++ ) for( size_t k = 0; k < VTypes::F4::wsize(); k++, i++ )
d[k] = dat[i]; d[k] = dat[i];
VTypes::F4 f4(d, VTypes::F4::wsize()); VTypes::F4 f4(d, VTypes::F4::wsize());
......
...@@ -984,6 +984,7 @@ UniSetTypes::SimpleInfo* SharedMemory::getInfo( CORBA::Long userparam ) ...@@ -984,6 +984,7 @@ UniSetTypes::SimpleInfo* SharedMemory::getInfo( CORBA::Long userparam )
inf << i->info << endl; inf << i->info << endl;
inf << vmon.pretty_str() << endl; inf << vmon.pretty_str() << endl;
if( logserv ) if( logserv )
inf << logserv->getShortInfo() << endl; inf << logserv->getShortInfo() << endl;
else else
......
...@@ -317,7 +317,7 @@ size_t UDPMessage::getMessage( UDPMessage& m, UDPPacket& p ) ...@@ -317,7 +317,7 @@ size_t UDPMessage::getMessage( UDPMessage& m, UDPPacket& p )
return i + sz; return i + sz;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
uint16_t UDPMessage::getDataCRC() uint16_t UDPMessage::getDataCRC() const
{ {
uint16_t crc[3]; uint16_t crc[3];
crc[0] = makeCRC( (unsigned char*)(a_dat), sizeof(a_dat) ); crc[0] = makeCRC( (unsigned char*)(a_dat), sizeof(a_dat) );
......
...@@ -37,17 +37,16 @@ namespace UniSetUDP ...@@ -37,17 +37,16 @@ namespace UniSetUDP
т.к. это не сильно актуально, пока не переделываю. т.к. это не сильно актуально, пока не переделываю.
*/ */
const unsigned int UNETUDP_MAGICNUM = 0x1337A1D; // идентификатор протокола const uint32_t UNETUDP_MAGICNUM = 0x1337A1D; // идентификатор протокола
struct UDPHeader struct UDPHeader
{ {
UDPHeader(): magic(UNETUDP_MAGICNUM), num(0), nodeID(0), procID(0), dcount(0), acount(0) {} UDPHeader(): magic(UNETUDP_MAGICNUM), num(0), nodeID(0), procID(0), dcount(0), acount(0) {}
unsigned int magic; uint32_t magic;
size_t num; size_t num;
long nodeID; long nodeID;
long procID; long procID;
//!\todo может лучше использовать системно-независимый unsigned long, чем size_t?
size_t dcount; /*!< количество булевых величин */ size_t dcount; /*!< количество булевых величин */
size_t acount; /*!< количество аналоговых величин */ size_t acount; /*!< количество аналоговых величин */
...@@ -129,7 +128,7 @@ namespace UniSetUDP ...@@ -129,7 +128,7 @@ namespace UniSetUDP
return acount; return acount;
} }
uint16_t getDataCRC(); uint16_t getDataCRC() const;
// количество байт в пакете с булевыми переменными... // количество байт в пакете с булевыми переменными...
size_t d_byte() const size_t d_byte() const
......
...@@ -54,7 +54,7 @@ namespace MTR ...@@ -54,7 +54,7 @@ namespace MTR
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
std::string type2str( MTRType t ); /*!< преоразование строки в тип */ std::string type2str( MTRType t ); /*!< преоразование строки в тип */
MTRType str2type( const std::string& s ); /*!< преобразование названия в строку */ MTRType str2type( const std::string& s ); /*!< преобразование названия в строку */
int wsize( MTRType t ); /*!< длина данных в словах */ size_t wsize( MTRType t ); /*!< длина данных в словах */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// Информация // Информация
const ModbusRTU::ModbusData regModelNumber = 0x01; const ModbusRTU::ModbusData regModelNumber = 0x01;
...@@ -129,7 +129,7 @@ namespace MTR ...@@ -129,7 +129,7 @@ namespace MTR
void update_communication_params( ModbusRTU::ModbusAddr reg, ModbusRTU::ModbusData data, void update_communication_params( ModbusRTU::ModbusAddr reg, ModbusRTU::ModbusData data,
ModbusRTUMaster* mb, ModbusRTU::ModbusAddr& addr, int verb ); ModbusRTUMaster* mb, ModbusRTU::ModbusAddr& addr, int verb );
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
static const int u2size = 2; static const size_t u2size = 2;
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
class T1 class T1
{ {
...@@ -140,7 +140,7 @@ namespace MTR ...@@ -140,7 +140,7 @@ namespace MTR
~T1() {} ~T1() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return 1; return 1;
} }
...@@ -163,7 +163,7 @@ namespace MTR ...@@ -163,7 +163,7 @@ namespace MTR
~T2() {} ~T2() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return 1; return 1;
} }
...@@ -205,7 +205,7 @@ namespace MTR ...@@ -205,7 +205,7 @@ namespace MTR
raw.v[1] = v2; raw.v[1] = v2;
} }
T3( const ModbusRTU::ModbusData* data, int size ) T3( const ModbusRTU::ModbusData* data, size_t size )
{ {
if( size >= u2size ) if( size >= u2size )
{ {
...@@ -218,7 +218,7 @@ namespace MTR ...@@ -218,7 +218,7 @@ namespace MTR
~T3() {} ~T3() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return u2size; return u2size;
} }
...@@ -262,7 +262,7 @@ namespace MTR ...@@ -262,7 +262,7 @@ namespace MTR
~T4() {} ~T4() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return 1; return 1;
} }
...@@ -311,7 +311,7 @@ namespace MTR ...@@ -311,7 +311,7 @@ namespace MTR
val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); val = raw.u2.val * pow( (long)10, (long)raw.u2.exp );
} }
T5( const ModbusRTU::ModbusData* data, int size ): val(0) T5( const ModbusRTU::ModbusData* data, size_t size ): val(0)
{ {
if( size >= u2size ) if( size >= u2size )
{ {
...@@ -325,7 +325,7 @@ namespace MTR ...@@ -325,7 +325,7 @@ namespace MTR
~T5() {} ~T5() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return u2size; return u2size;
} }
...@@ -374,7 +374,7 @@ namespace MTR ...@@ -374,7 +374,7 @@ namespace MTR
val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); val = raw.u2.val * pow( (long)10, (long)raw.u2.exp );
} }
T6( const ModbusRTU::ModbusData* data, int size ) T6( const ModbusRTU::ModbusData* data, size_t size )
{ {
if( size >= u2size ) if( size >= u2size )
{ {
...@@ -388,7 +388,7 @@ namespace MTR ...@@ -388,7 +388,7 @@ namespace MTR
~T6() {} ~T6() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return u2size; return u2size;
} }
...@@ -437,7 +437,7 @@ namespace MTR ...@@ -437,7 +437,7 @@ namespace MTR
val = raw.u2.val * pow( (long)10, (long) - 4 ); val = raw.u2.val * pow( (long)10, (long) - 4 );
} }
T7( const ModbusRTU::ModbusData* data, int size ) T7( const ModbusRTU::ModbusData* data, size_t size )
{ {
if( size >= u2size ) if( size >= u2size )
{ {
...@@ -451,7 +451,7 @@ namespace MTR ...@@ -451,7 +451,7 @@ namespace MTR
~T7() {} ~T7() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return u2size; return u2size;
} }
...@@ -494,7 +494,7 @@ namespace MTR ...@@ -494,7 +494,7 @@ namespace MTR
raw.v[1] = v2; raw.v[1] = v2;
} }
T8( const ModbusRTU::ModbusData* data, int size ) T8( const ModbusRTU::ModbusData* data, size_t size )
{ {
if( size >= u2size ) if( size >= u2size )
{ {
...@@ -524,7 +524,7 @@ namespace MTR ...@@ -524,7 +524,7 @@ namespace MTR
~T8() {} ~T8() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return u2size; return u2size;
} }
...@@ -566,7 +566,7 @@ namespace MTR ...@@ -566,7 +566,7 @@ namespace MTR
raw.v[1] = v2; raw.v[1] = v2;
} }
T9( const ModbusRTU::ModbusData* data, int size ) T9( const ModbusRTU::ModbusData* data, size_t size )
{ {
if( size >= u2size ) if( size >= u2size )
{ {
...@@ -596,7 +596,7 @@ namespace MTR ...@@ -596,7 +596,7 @@ namespace MTR
~T9() {} ~T9() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return u2size; return u2size;
} }
...@@ -637,7 +637,7 @@ namespace MTR ...@@ -637,7 +637,7 @@ namespace MTR
raw.v[1] = v2; raw.v[1] = v2;
} }
T10( const ModbusRTU::ModbusData* data, int size ) T10( const ModbusRTU::ModbusData* data, size_t size )
{ {
if( size >= u2size ) if( size >= u2size )
{ {
...@@ -663,7 +663,7 @@ namespace MTR ...@@ -663,7 +663,7 @@ namespace MTR
~T10() {} ~T10() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return u2size; return u2size;
} }
...@@ -698,7 +698,7 @@ namespace MTR ...@@ -698,7 +698,7 @@ namespace MTR
~T16() {} ~T16() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return 1; return 1;
} }
...@@ -746,7 +746,7 @@ namespace MTR ...@@ -746,7 +746,7 @@ namespace MTR
~T17() {} ~T17() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return 1; return 1;
} }
...@@ -797,7 +797,7 @@ namespace MTR ...@@ -797,7 +797,7 @@ namespace MTR
raw.val = f; raw.val = f;
} }
F1( const ModbusRTU::ModbusData* data, int size ) F1( const ModbusRTU::ModbusData* data, size_t size )
{ {
if( size >= u2size ) if( size >= u2size )
{ {
...@@ -810,7 +810,7 @@ namespace MTR ...@@ -810,7 +810,7 @@ namespace MTR
~F1() {} ~F1() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return u2size; return u2size;
} }
...@@ -855,7 +855,7 @@ namespace MTR ...@@ -855,7 +855,7 @@ namespace MTR
~T_Str16() {} ~T_Str16() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return 8; return 8;
} }
...@@ -892,7 +892,7 @@ namespace MTR ...@@ -892,7 +892,7 @@ namespace MTR
~T_Str8() {} ~T_Str8() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static unsigned int wsize() static size_t wsize()
{ {
return 4; return 4;
} }
......
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
/* /*
DO NOT EDIT THIS FILE. IT IS AUTOGENERATED FILE. DO NOT EDIT THIS FILE. IT IS AUTOGENERATED FILE.
ALL YOUR CHANGES WILL BE LOST. ALL YOUR CHANGES WILL BE LOST.
НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ. ЭТОТ ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ. НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ. ЭТОТ ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ.
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2016-07-26+03:00 // generate timestamp: 2016-08-01+03:00
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef UObject_SK_H_ #ifndef UObject_SK_H_
#define UObject_SK_H_ #define UObject_SK_H_
...@@ -29,11 +29,11 @@ class UObject_SK: ...@@ -29,11 +29,11 @@ class UObject_SK:
public UniSetObject public UniSetObject
{ {
public: public:
UObject_SK( UniSetTypes::ObjectId id, xmlNode* node=UniSetTypes::uniset_conf()->getNode("UObject"), const std::string& argprefix="" ); UObject_SK( UniSetTypes::ObjectId id, xmlNode* node = UniSetTypes::uniset_conf()->getNode("UObject"), const std::string& argprefix = "" );
UObject_SK(); UObject_SK();
virtual ~UObject_SK(); virtual ~UObject_SK();
long getValue( UniSetTypes::ObjectId sid ); long getValue( UniSetTypes::ObjectId sid );
void setValue( UniSetTypes::ObjectId sid, long value ); void setValue( UniSetTypes::ObjectId sid, long value );
void askSensor( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand, UniSetTypes::ObjectId node = UniSetTypes::uniset_conf()->getLocalNode() ); void askSensor( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand, UniSetTypes::ObjectId node = UniSetTypes::uniset_conf()->getLocalNode() );
...@@ -43,116 +43,128 @@ class UObject_SK: ...@@ -43,116 +43,128 @@ class UObject_SK:
virtual bool setMsg( UniSetTypes::ObjectId code, bool state = true ); virtual bool setMsg( UniSetTypes::ObjectId code, bool state = true );
inline std::shared_ptr<DebugStream> log(){ return mylog; } inline std::shared_ptr<DebugStream> log()
inline std::shared_ptr<LogAgregator> logAgregator(){ return loga; } {
return mylog;
}
inline std::shared_ptr<LogAgregator> logAgregator()
{
return loga;
}
void init_dlog( std::shared_ptr<DebugStream> d ); void init_dlog( std::shared_ptr<DebugStream> d );
// "синтаксический сахар"..для логов // "синтаксический сахар"..для логов
#ifndef myinfo #ifndef myinfo
#define myinfo if( log()->debugging(Debug::INFO) ) log()->info() #define myinfo if( log()->debugging(Debug::INFO) ) log()->info()
#endif #endif
#ifndef mywarn #ifndef mywarn
#define mywarn if( log()->debugging(Debug::WARN) ) log()->warn() #define mywarn if( log()->debugging(Debug::WARN) ) log()->warn()
#endif #endif
#ifndef mycrit #ifndef mycrit
#define mycrit if( log()->debugging(Debug::CRIT) ) log()->crit() #define mycrit if( log()->debugging(Debug::CRIT) ) log()->crit()
#endif #endif
#ifndef mylog1 #ifndef mylog1
#define mylog1 if( log()->debugging(Debug::LEVEL1) ) log()->level1() #define mylog1 if( log()->debugging(Debug::LEVEL1) ) log()->level1()
#endif #endif
#ifndef mylog2 #ifndef mylog2
#define mylog2 if( log()->debugging(Debug::LEVEL2) ) log()->level2() #define mylog2 if( log()->debugging(Debug::LEVEL2) ) log()->level2()
#endif #endif
#ifndef mylog3 #ifndef mylog3
#define mylog3 if( log()->debugging(Debug::LEVEL3) ) log()->level3() #define mylog3 if( log()->debugging(Debug::LEVEL3) ) log()->level3()
#endif #endif
#ifndef mylog4 #ifndef mylog4
#define mylog4 if( log()->debugging(Debug::LEVEL4) ) log()->level4() #define mylog4 if( log()->debugging(Debug::LEVEL4) ) log()->level4()
#endif #endif
#ifndef mylog5 #ifndef mylog5
#define mylog5 if( log()->debugging(Debug::LEVEL5) ) log()->level5() #define mylog5 if( log()->debugging(Debug::LEVEL5) ) log()->level5()
#endif #endif
#ifndef mylog6 #ifndef mylog6
#define mylog6 if( log()->debugging(Debug::LEVEL6) ) log()->level6() #define mylog6 if( log()->debugging(Debug::LEVEL6) ) log()->level6()
#endif #endif
#ifndef mylog7 #ifndef mylog7
#define mylog7 if( log()->debugging(Debug::LEVEL7) ) log()->level7() #define mylog7 if( log()->debugging(Debug::LEVEL7) ) log()->level7()
#endif #endif
#ifndef mylog8 #ifndef mylog8
#define mylog8 if( log()->debugging(Debug::LEVEL8) ) log()->level8() #define mylog8 if( log()->debugging(Debug::LEVEL8) ) log()->level8()
#endif #endif
#ifndef mylog9 #ifndef mylog9
#define mylog9 if( log()->debugging(Debug::LEVEL9) ) log()->level9() #define mylog9 if( log()->debugging(Debug::LEVEL9) ) log()->level9()
#endif #endif
#ifndef mylogany #ifndef mylogany
#define mylogany log()->any() #define mylogany log()->any()
#endif #endif
#ifndef vmonit #ifndef vmonit
#define vmonit( var ) vmon.add( #var, var ) #define vmonit( var ) vmon.add( #var, var )
#endif #endif
// Вспомогательные функции для удобства логирования // Вспомогательные функции для удобства логирования
// ------------------------------------------------------------ // ------------------------------------------------------------
/*! вывод в строку значение всех входов и выходов в формате /*! вывод в строку значение всех входов и выходов в формате
ObjectName: ObjectName:
in_xxx = val in_xxx = val
in_xxx2 = val in_xxx2 = val
out_zzz = val out_zzz = val
... ...
*/ */
std::string dumpIO(); std::string dumpIO();
/*! Вывод в строку названия входа/выхода в формате: in_xxx(SensorName) /*! Вывод в строку названия входа/выхода в формате: in_xxx(SensorName)
\param id - идентификатор датчика \param id - идентификатор датчика
\param showLinkName - TRUE - выводить SensorName, FALSE - не выводить \param showLinkName - TRUE - выводить SensorName, FALSE - не выводить
*/ */
std::string str( UniSetTypes::ObjectId id, bool showLinkName=true ); std::string str( UniSetTypes::ObjectId id, bool showLinkName = true ) const;
/*! Вывод значения входа/выхода в формате: in_xxx(SensorName)=val /*! Вывод значения входа/выхода в формате: in_xxx(SensorName)=val
\param id - идентификатор датчика \param id - идентификатор датчика
\param showLinkName - TRUE - выводить SensorName, FALSE - не выводить \param showLinkName - TRUE - выводить SensorName, FALSE - не выводить
*/ */
std::string strval( UniSetTypes::ObjectId id, bool showLinkName=true ); std::string strval( UniSetTypes::ObjectId id, bool showLinkName = true ) const;
/*! Вывод состояния внутренних переменных */ /*! Вывод состояния внутренних переменных */
inline std::string dumpVars(){ return std::move(vmon.pretty_str()); } inline std::string dumpVars()
// ------------------------------------------------------------ {
std::string help(); return std::move(vmon.pretty_str());
}
// ------------------------------------------------------------
std::string help();
// Используемые идентификаторы // Используемые идентификаторы
// Используемые идентификаторы сообщений // Используемые идентификаторы сообщений
// Текущее значение // Текущее значение
// --- public variables --- // --- public variables ---
// --- end of public variables --- // --- end of public variables ---
protected: protected:
// --- protected variables --- // --- protected variables ---
// ---- end of protected variables ---- // ---- end of protected variables ----
virtual void callback() override; virtual void callback() override;
virtual void processingMessage( const UniSetTypes::VoidMessage* msg ) override; virtual void processingMessage( const UniSetTypes::VoidMessage* msg ) override;
virtual void sysCommand( const UniSetTypes::SystemMessage* sm ){}; virtual void sysCommand( const UniSetTypes::SystemMessage* sm ) {};
virtual void askSensors( UniversalIO::UIOCommand cmd ){} virtual void askSensors( UniversalIO::UIOCommand cmd ) {}
virtual void sensorInfo( const UniSetTypes::SensorMessage* sm ) override{} virtual void sensorInfo( const UniSetTypes::SensorMessage* sm ) override {}
virtual void timerInfo( const UniSetTypes::TimerMessage* tm ) override{} virtual void timerInfo( const UniSetTypes::TimerMessage* tm ) override {}
virtual void sigterm( int signo ) override; virtual void sigterm( int signo ) override;
virtual bool activateObject() override; virtual bool activateObject() override;
virtual std::string getMonitInfo(){ return ""; } /*!< пользовательская информация выводимая в getInfo() */ virtual std::string getMonitInfo()
{
return ""; /*!< пользовательская информация выводимая в getInfo() */
}
virtual void testMode( bool state ); virtual void testMode( bool state );
void updatePreviousValues(); void updatePreviousValues();
void checkSensors(); void checkSensors();
...@@ -172,7 +184,7 @@ class UObject_SK: ...@@ -172,7 +184,7 @@ class UObject_SK:
int resetMsgTime; int resetMsgTime;
// Выполнение очередного шага программы // Выполнение очередного шага программы
virtual void step(){} virtual void step() {}
int sleep_msec; /*!< пауза между итерациями */ int sleep_msec; /*!< пауза между итерациями */
bool active; bool active;
...@@ -184,22 +196,28 @@ class UObject_SK: ...@@ -184,22 +196,28 @@ class UObject_SK:
PassiveTimer ptHeartBeat; /*! < период "сердцебиения" */ PassiveTimer ptHeartBeat; /*! < период "сердцебиения" */
UniSetTypes::ObjectId idHeartBeat; /*! < идентификатор датчика (AI) "сердцебиения" */ UniSetTypes::ObjectId idHeartBeat; /*! < идентификатор датчика (AI) "сердцебиения" */
int maxHeartBeat; /*! < сохраняемое значение */ int maxHeartBeat; /*! < сохраняемое значение */
xmlNode* confnode; xmlNode* confnode;
/*! получить числовое свойство из конф. файла по привязанной confnode */ /*! получить числовое свойство из конф. файла по привязанной confnode */
int getIntProp(const std::string& name) { return UniSetTypes::uniset_conf()->getIntProp(confnode, name); } int getIntProp(const std::string& name)
{
return UniSetTypes::uniset_conf()->getIntProp(confnode, name);
}
/*! получить текстовое свойство из конф. файла по привязанной confnode */ /*! получить текстовое свойство из конф. файла по привязанной confnode */
inline const std::string getProp(const std::string& name) { return UniSetTypes::uniset_conf()->getProp(confnode, name); } inline const std::string getProp(const std::string& name)
{
return UniSetTypes::uniset_conf()->getProp(confnode, name);
}
timeout_t smReadyTimeout; /*!< время ожидания готовности SM */ timeout_t smReadyTimeout; /*!< время ожидания готовности SM */
std::atomic_bool activated; std::atomic_bool activated;
timeout_t activateTimeout; /*!< время ожидания готовности UniSetObject к работе */ timeout_t activateTimeout; /*!< время ожидания готовности UniSetObject к работе */
PassiveTimer ptStartUpTimeout; /*!< время на блокировку обработки WatchDog, если недавно был StartUp */ PassiveTimer ptStartUpTimeout; /*!< время на блокировку обработки WatchDog, если недавно был StartUp */
int askPause; /*!< пауза между неудачными попытками заказать датчики */ int askPause; /*!< пауза между неудачными попытками заказать датчики */
IOController_i::SensorInfo si; IOController_i::SensorInfo si;
bool forceOut; /*!< флаг принудительного обноления "выходов" */ bool forceOut; /*!< флаг принудительного обноления "выходов" */
std::shared_ptr<LogAgregator> loga; std::shared_ptr<LogAgregator> loga;
std::shared_ptr<DebugStream> mylog; std::shared_ptr<DebugStream> mylog;
std::shared_ptr<LogServer> logserv; std::shared_ptr<LogServer> logserv;
...@@ -208,21 +226,21 @@ class UObject_SK: ...@@ -208,21 +226,21 @@ class UObject_SK:
// snap // snap
bool no_snap = {false}; bool no_snap = {false};
VMonitor vmon; VMonitor vmon;
private: private:
// --- private variables --- // --- private variables ---
// --- end of private variables --- // --- end of private variables ---
// предыдущее значение (для работы UpdateValue()) // предыдущее значение (для работы UpdateValue())
// Используемые идентификаторы сообщений // Используемые идентификаторы сообщений
bool end_private; // вспомогательное поле (для внутреннего использования при генерировании кода) bool end_private; // вспомогательное поле (для внутреннего использования при генерировании кода)
}; };
......
...@@ -54,7 +54,7 @@ namespace VTypes ...@@ -54,7 +54,7 @@ namespace VTypes
public: public:
// ------------------------------------------ // ------------------------------------------
static const int f2Size = 2; static const size_t f2Size = 2;
/*! тип хранения в памяти */ /*! тип хранения в памяти */
typedef union typedef union
{ {
...@@ -72,16 +72,16 @@ namespace VTypes ...@@ -72,16 +72,16 @@ namespace VTypes
{ {
raw.val = f; raw.val = f;
} }
F2( const ModbusRTU::ModbusData* data, int size ) F2( const ModbusRTU::ModbusData* data, size_t size )
{ {
for( int i = 0; i < wsize() && i < size; i++ ) for( size_t i = 0; i < wsize() && i < size; i++ )
raw.v[i] = data[i]; raw.v[i] = data[i];
} }
~F2() {} ~F2() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static int wsize() static size_t wsize()
{ {
return f2Size; return f2Size;
} }
...@@ -121,7 +121,7 @@ namespace VTypes ...@@ -121,7 +121,7 @@ namespace VTypes
raw_backorder = raw; raw_backorder = raw;
std::swap(raw_backorder.v[0], raw_backorder.v[1]); std::swap(raw_backorder.v[0], raw_backorder.v[1]);
} }
F2r( const ModbusRTU::ModbusData* data, int size ): F2(data, size) F2r( const ModbusRTU::ModbusData* data, size_t size ): F2(data, size)
{ {
// принимаем в обратном порядке.. поэтому переворачиваем raw // принимаем в обратном порядке.. поэтому переворачиваем raw
raw_backorder = raw; raw_backorder = raw;
...@@ -137,7 +137,7 @@ namespace VTypes ...@@ -137,7 +137,7 @@ namespace VTypes
{ {
public: public:
// ------------------------------------------ // ------------------------------------------
static const int f4Size = 4; static const size_t f4Size = 4;
/*! тип хранения в памяти */ /*! тип хранения в памяти */
typedef union typedef union
{ {
...@@ -155,16 +155,16 @@ namespace VTypes ...@@ -155,16 +155,16 @@ namespace VTypes
{ {
raw.val = f; raw.val = f;
} }
F4( const ModbusRTU::ModbusData* data, int size ) F4( const ModbusRTU::ModbusData* data, size_t size )
{ {
for( int i = 0; i < wsize() && i < size; i++ ) for( size_t i = 0; i < wsize() && i < size; i++ )
raw.v[i] = data[i]; raw.v[i] = data[i];
} }
~F4() {} ~F4() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static int wsize() static size_t wsize()
{ {
return f4Size; return f4Size;
} }
...@@ -190,7 +190,7 @@ namespace VTypes ...@@ -190,7 +190,7 @@ namespace VTypes
{ {
public: public:
static const int bsize = 2; static const size_t bsize = 2;
// ------------------------------------------ // ------------------------------------------
/*! тип хранения в памяти */ /*! тип хранения в памяти */
...@@ -224,7 +224,7 @@ namespace VTypes ...@@ -224,7 +224,7 @@ namespace VTypes
~Byte() {} ~Byte() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static int wsize() static size_t wsize()
{ {
return 1; return 1;
} }
...@@ -272,7 +272,7 @@ namespace VTypes ...@@ -272,7 +272,7 @@ namespace VTypes
~Unsigned() {} ~Unsigned() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static int wsize() static size_t wsize()
{ {
return 1; return 1;
} }
...@@ -311,7 +311,7 @@ namespace VTypes ...@@ -311,7 +311,7 @@ namespace VTypes
~Signed() {} ~Signed() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static int wsize() static size_t wsize()
{ {
return 1; return 1;
} }
...@@ -334,7 +334,7 @@ namespace VTypes ...@@ -334,7 +334,7 @@ namespace VTypes
public: public:
// ------------------------------------------ // ------------------------------------------
static const int i2Size = 2; static const size_t i2Size = 2;
/*! тип хранения в памяти */ /*! тип хранения в памяти */
typedef union typedef union
{ {
...@@ -352,16 +352,16 @@ namespace VTypes ...@@ -352,16 +352,16 @@ namespace VTypes
{ {
raw.val = v; raw.val = v;
} }
I2( const ModbusRTU::ModbusData* data, int size ) I2( const ModbusRTU::ModbusData* data, size_t size )
{ {
for( int i = 0; i < wsize() && i < size; i++ ) for( size_t i = 0; i < wsize() && i < size; i++ )
raw.v[i] = data[i]; raw.v[i] = data[i];
} }
~I2() {} ~I2() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static int wsize() static size_t wsize()
{ {
return i2Size; return i2Size;
} }
...@@ -390,7 +390,7 @@ namespace VTypes ...@@ -390,7 +390,7 @@ namespace VTypes
raw_backorder = raw; raw_backorder = raw;
std::swap(raw_backorder.v[0], raw_backorder.v[1]); std::swap(raw_backorder.v[0], raw_backorder.v[1]);
} }
I2r( const ModbusRTU::ModbusData* data, int size ): I2(data, size) I2r( const ModbusRTU::ModbusData* data, size_t size ): I2(data, size)
{ {
// принимаем в обратном порядке.. поэтому переворачиваем raw // принимаем в обратном порядке.. поэтому переворачиваем raw
raw_backorder = raw; raw_backorder = raw;
...@@ -407,7 +407,7 @@ namespace VTypes ...@@ -407,7 +407,7 @@ namespace VTypes
public: public:
// ------------------------------------------ // ------------------------------------------
static const int u2Size = 2; static const size_t u2Size = 2;
/*! тип хранения в памяти */ /*! тип хранения в памяти */
typedef union typedef union
{ {
...@@ -425,16 +425,16 @@ namespace VTypes ...@@ -425,16 +425,16 @@ namespace VTypes
{ {
raw.val = v; raw.val = v;
} }
U2( const ModbusRTU::ModbusData* data, int size ) U2( const ModbusRTU::ModbusData* data, size_t size )
{ {
for( int i = 0; i < wsize() && i < size; i++ ) for( size_t i = 0; i < wsize() && i < size; i++ )
raw.v[i] = data[i]; raw.v[i] = data[i];
} }
~U2() {} ~U2() {}
// ------------------------------------------ // ------------------------------------------
/*! размер в словах */ /*! размер в словах */
static int wsize() static size_t wsize()
{ {
return u2Size; return u2Size;
} }
...@@ -463,7 +463,7 @@ namespace VTypes ...@@ -463,7 +463,7 @@ namespace VTypes
raw_backorder = raw; raw_backorder = raw;
std::swap(raw_backorder.v[0], raw_backorder.v[1]); std::swap(raw_backorder.v[0], raw_backorder.v[1]);
} }
U2r( const ModbusRTU::ModbusData* data, int size ): U2(data, size) U2r( const ModbusRTU::ModbusData* data, size_t size ): U2(data, size)
{ {
// принимаем в обратном порядке.. поэтому переворачиваем raw // принимаем в обратном порядке.. поэтому переворачиваем raw
raw_backorder = raw; raw_backorder = raw;
......
...@@ -128,7 +128,7 @@ namespace MTR ...@@ -128,7 +128,7 @@ namespace MTR
return "Unknown"; return "Unknown";
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
int wsize( MTRType t ) size_t wsize( MTRType t )
{ {
if( t == mtT1 ) if( t == mtT1 )
return T1::wsize(); return T1::wsize();
......
...@@ -6,12 +6,12 @@ ...@@ -6,12 +6,12 @@
/* /*
DO NOT EDIT THIS FILE. IT IS AUTOGENERATED FILE. DO NOT EDIT THIS FILE. IT IS AUTOGENERATED FILE.
ALL YOUR CHANGES WILL BE LOST. ALL YOUR CHANGES WILL BE LOST.
НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ. ЭТОТ ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ. НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ. ЭТОТ ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ.
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2016-07-26+03:00 // generate timestamp: 2016-08-01+03:00
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include <memory> #include <memory>
#include <iomanip> #include <iomanip>
...@@ -32,26 +32,26 @@ using namespace UniSetTypes; ...@@ -32,26 +32,26 @@ using namespace UniSetTypes;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
UObject_SK::UObject_SK(): UObject_SK::UObject_SK():
// Инициализация идентификаторов (имена берутся из конф. файла) // Инициализация идентификаторов (имена берутся из конф. файла)
// Используемые идентификаторы сообщений (имена берутся из конф. файла) // Используемые идентификаторы сообщений (имена берутся из конф. файла)
// variables // variables
active(false), active(false),
idHeartBeat(DefaultObjectId), idHeartBeat(DefaultObjectId),
maxHeartBeat(10), maxHeartBeat(10),
confnode(0), confnode(0),
smReadyTimeout(0), smReadyTimeout(0),
activated(false), activated(false),
askPause(2000), askPause(2000),
forceOut(false), forceOut(false),
end_private(false) end_private(false)
{ {
mycrit << "UObject: init failed!!!!!!!!!!!!!!!" << endl; mycrit << "UObject: init failed!!!!!!!!!!!!!!!" << endl;
throw Exception( string(myname+": init failed!!!") ); throw Exception( string(myname + ": init failed!!!") );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// ( val, confval, default val ) // ( val, confval, default val )
...@@ -59,41 +59,42 @@ static const std::string init3_str( const std::string& s1, const std::string& s2 ...@@ -59,41 +59,42 @@ static const std::string init3_str( const std::string& s1, const std::string& s2
{ {
if( !s1.empty() ) if( !s1.empty() )
return s1; return s1;
if( !s2.empty() ) if( !s2.empty() )
return s2; return s2;
return s3; return s3;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argprefix ): UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argprefix ):
UniSetObject(id), UniSetObject(id),
// Инициализация идентификаторов (имена берутся из конф. файла) // Инициализация идентификаторов (имена берутся из конф. файла)
// Используемые идентификаторы сообщений (имена берутся из конф. файла) // Используемые идентификаторы сообщений (имена берутся из конф. файла)
// variables // variables
sleep_msec(150), sleep_msec(150),
active(true), active(true),
argprefix( (_argprefix.empty() ? myname+"-" : _argprefix) ), argprefix( (_argprefix.empty() ? myname + "-" : _argprefix) ),
idHeartBeat(DefaultObjectId), idHeartBeat(DefaultObjectId),
maxHeartBeat(10), maxHeartBeat(10),
confnode(cnode), confnode(cnode),
smReadyTimeout(0), smReadyTimeout(0),
activated(false), activated(false),
askPause(uniset_conf()->getPIntProp(cnode,"askPause",2000)), askPause(uniset_conf()->getPIntProp(cnode, "askPause", 2000)),
forceOut(false), forceOut(false),
end_private(false) end_private(false)
{ {
auto conf = uniset_conf(); auto conf = uniset_conf();
if( UniSetTypes::findArgParam("--print-id-list",uniset_conf()->getArgc(),uniset_conf()->getArgv()) != -1 ) if( UniSetTypes::findArgParam("--print-id-list", uniset_conf()->getArgc(), uniset_conf()->getArgv()) != -1 )
{ {
// abort(); // abort();
} }
...@@ -104,15 +105,15 @@ end_private(false) ...@@ -104,15 +105,15 @@ end_private(false)
throw SystemError( err.str() ); throw SystemError( err.str() );
} }
mylog = make_shared<DebugStream>(); mylog = make_shared<DebugStream>();
mylog->setLogName(myname); mylog->setLogName(myname);
{ {
ostringstream s; ostringstream s;
s << argprefix << "log"; s << argprefix << "log";
conf->initLogStream(mylog,s.str()); conf->initLogStream(mylog, s.str());
} }
loga = make_shared<LogAgregator>(myname+"-loga"); loga = make_shared<LogAgregator>(myname + "-loga");
loga->add(mylog); loga->add(mylog);
loga->add(ulog()); loga->add(ulog());
...@@ -129,13 +130,15 @@ end_private(false) ...@@ -129,13 +130,15 @@ end_private(false)
logserv_host = conf->getArg2Param("--" + argprefix + "logserver-host", it.getProp("logserverHost"), "localhost"); logserv_host = conf->getArg2Param("--" + argprefix + "logserver-host", it.getProp("logserverHost"), "localhost");
logserv_port = conf->getArgPInt("--" + argprefix + "logserver-port", it.getProp("logserverPort"), getId()); logserv_port = conf->getArgPInt("--" + argprefix + "logserver-port", it.getProp("logserverPort"), getId());
} }
forceOut = conf->getArgPInt("--" + argprefix + "force-out",it.getProp("forceOut"),false);
string heart = conf->getArgParam("--" + argprefix + "heartbeat-id",it.getProp("heartbeat_id")); forceOut = conf->getArgPInt("--" + argprefix + "force-out", it.getProp("forceOut"), false);
string heart = conf->getArgParam("--" + argprefix + "heartbeat-id", it.getProp("heartbeat_id"));
if( !heart.empty() ) if( !heart.empty() )
{ {
idHeartBeat = conf->getSensorID(heart); idHeartBeat = conf->getSensorID(heart);
if( idHeartBeat == DefaultObjectId ) if( idHeartBeat == DefaultObjectId )
{ {
ostringstream err; ostringstream err;
...@@ -143,31 +146,34 @@ end_private(false) ...@@ -143,31 +146,34 @@ end_private(false)
throw SystemError(err.str()); throw SystemError(err.str());
} }
int heartbeatTime = conf->getArgPInt("--" + argprefix + "heartbeat-time",it.getProp("heartbeatTime"),conf->getHeartBeatTime()); int heartbeatTime = conf->getArgPInt("--" + argprefix + "heartbeat-time", it.getProp("heartbeatTime"), conf->getHeartBeatTime());
if( heartbeatTime>0 )
if( heartbeatTime > 0 )
ptHeartBeat.setTiming(heartbeatTime); ptHeartBeat.setTiming(heartbeatTime);
else else
ptHeartBeat.setTiming(UniSetTimer::WaitUpTime); ptHeartBeat.setTiming(UniSetTimer::WaitUpTime);
maxHeartBeat = conf->getArgPInt("--" + argprefix + "heartbeat-max",it.getProp("heartbeat_max"), 10); maxHeartBeat = conf->getArgPInt("--" + argprefix + "heartbeat-max", it.getProp("heartbeat_max"), 10);
} }
// Инициализация значений // Инициализация значений
si.id = UniSetTypes::DefaultObjectId; si.id = UniSetTypes::DefaultObjectId;
si.node = conf->getLocalNode(); si.node = conf->getLocalNode();
sleep_msec = conf->getArgPInt("--" + argprefix + "sleep-msec","150", 150); sleep_msec = conf->getArgPInt("--" + argprefix + "sleep-msec", "150", 150);
string s_resetTime(""); string s_resetTime("");
if( s_resetTime.empty() ) if( s_resetTime.empty() )
s_resetTime = "500"; s_resetTime = "500";
resetMsgTime = uni_atoi(init3_str(conf->getArgParam("--" + argprefix + "resetMsgTime"),conf->getProp(cnode,"resetMsgTime"),s_resetTime)); resetMsgTime = uni_atoi(init3_str(conf->getArgParam("--" + argprefix + "resetMsgTime"), conf->getProp(cnode, "resetMsgTime"), s_resetTime));
ptResetMsg.setTiming(resetMsgTime); ptResetMsg.setTiming(resetMsgTime);
int sm_tout = conf->getArgInt("--" + argprefix + "sm-ready-timeout",""); int sm_tout = conf->getArgInt("--" + argprefix + "sm-ready-timeout", "");
if( sm_tout == 0 ) if( sm_tout == 0 )
smReadyTimeout = 60000; smReadyTimeout = 60000;
else if( sm_tout < 0 ) else if( sm_tout < 0 )
...@@ -175,8 +181,8 @@ end_private(false) ...@@ -175,8 +181,8 @@ end_private(false)
else else
smReadyTimeout = sm_tout; smReadyTimeout = sm_tout;
smTestID = conf->getSensorID(init3_str(conf->getArgParam("--" + argprefix + "sm-test-id"),conf->getProp(cnode,"smTestID"),"")); smTestID = conf->getSensorID(init3_str(conf->getArgParam("--" + argprefix + "sm-test-id"), conf->getProp(cnode, "smTestID"), ""));
if( smTestID == DefaultObjectId ) if( smTestID == DefaultObjectId )
smTestID = getSMTestID(); smTestID = getSMTestID();
...@@ -187,7 +193,7 @@ end_private(false) ...@@ -187,7 +193,7 @@ end_private(false)
ptStartUpTimeout.setTiming(msec); ptStartUpTimeout.setTiming(msec);
// ===================== <variables> ===================== // ===================== <variables> =====================
// ===================== end of <variables> ===================== // ===================== end of <variables> =====================
vmonit(sleep_msec); vmonit(sleep_msec);
...@@ -209,17 +215,17 @@ UObject_SK::~UObject_SK() ...@@ -209,17 +215,17 @@ UObject_SK::~UObject_SK()
void UObject_SK::updateValues() void UObject_SK::updateValues()
{ {
// Опрашиваем все входы... // Опрашиваем все входы...
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UObject_SK::updatePreviousValues() void UObject_SK::updatePreviousValues()
{ {
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UObject_SK::checkSensors() void UObject_SK::checkSensors()
{ {
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool UObject_SK::setMsg( UniSetTypes::ObjectId _code, bool _state ) bool UObject_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
...@@ -227,28 +233,28 @@ bool UObject_SK::setMsg( UniSetTypes::ObjectId _code, bool _state ) ...@@ -227,28 +233,28 @@ bool UObject_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
if( _code == UniSetTypes::DefaultObjectId ) if( _code == UniSetTypes::DefaultObjectId )
{ {
mylog8 << myname << "(setMsg): попытка послать сообщение с DefaultObjectId" << endl; mylog8 << myname << "(setMsg): попытка послать сообщение с DefaultObjectId" << endl;
return false; return false;
}
mylog8 << myname << "(setMsg): " << ( _state ? "SEND " : "RESET " ) << endl;
// взводим автоматический сброс
if( _state )
{
ptResetMsg.reset();
trResetMsg.hi(false);
} }
mylog8 << myname << "(setMsg): " << ( _state ? "SEND " : "RESET " ) << endl;
// взводим автоматический сброс
if( _state )
{
ptResetMsg.reset();
trResetMsg.hi(false);
}
mylog8 << myname << "(setMsg): not found MessgeOID?!!" << endl;
mylog8 << myname << "(setMsg): not found MessgeOID?!!" << endl;
return false; return false;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UObject_SK::resetMsg() void UObject_SK::resetMsg()
{ {
mylog8 << myname << "(resetMsg): reset messages.." << endl; mylog8 << myname << "(resetMsg): reset messages.." << endl;
// reset messages // reset messages
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -257,7 +263,7 @@ UniSetTypes::ObjectId UObject_SK::getSMTestID() ...@@ -257,7 +263,7 @@ UniSetTypes::ObjectId UObject_SK::getSMTestID()
if( smTestID != DefaultObjectId ) if( smTestID != DefaultObjectId )
return smTestID; return smTestID;
return DefaultObjectId; return DefaultObjectId;
} }
...@@ -268,7 +274,7 @@ void UObject_SK::testMode( bool _state ) ...@@ -268,7 +274,7 @@ void UObject_SK::testMode( bool _state )
return; return;
// отключаем все выходы // отключаем все выходы
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
std::string UObject_SK::dumpIO() std::string UObject_SK::dumpIO()
...@@ -278,44 +284,48 @@ std::string UObject_SK::dumpIO() ...@@ -278,44 +284,48 @@ std::string UObject_SK::dumpIO()
std::list<std::string> v_in; std::list<std::string> v_in;
ostringstream s1; ostringstream s1;
std::list<std::string> v_out; std::list<std::string> v_out;
s << endl; s << endl;
int n = 0; int n = 0;
for( const auto& e: v_in )
for( const auto& e : v_in )
{ {
s << e; s << e;
if( (n++)%2 )
if( (n++) % 2 )
s << std::endl; s << std::endl;
} }
s << endl; s << endl;
n = 0; n = 0;
for( const auto& e: v_out )
for( const auto& e : v_out )
{ {
s << e; s << e;
if( (n++)%2 )
if( (n++) % 2 )
s << std::endl; s << std::endl;
} }
return std::move(s.str()); return std::move(s.str());
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
std::string UObject_SK::str( UniSetTypes::ObjectId id, bool showLinkName ) std::string UObject_SK::str( UniSetTypes::ObjectId id, bool showLinkName ) const
{ {
ostringstream s; ostringstream s;
return ""; return "";
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
std::string UObject_SK::strval( UniSetTypes::ObjectId id, bool showLinkName ) std::string UObject_SK::strval( UniSetTypes::ObjectId id, bool showLinkName ) const
{ {
ostringstream s; ostringstream s;
return ""; return "";
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
...@@ -336,19 +346,19 @@ void UObject_SK::processingMessage( const UniSetTypes::VoidMessage* _msg ) ...@@ -336,19 +346,19 @@ void UObject_SK::processingMessage( const UniSetTypes::VoidMessage* _msg )
{ {
case Message::SensorInfo: case Message::SensorInfo:
preSensorInfo( reinterpret_cast<const SensorMessage*>(_msg) ); preSensorInfo( reinterpret_cast<const SensorMessage*>(_msg) );
break; break;
case Message::Timer: case Message::Timer:
preTimerInfo( reinterpret_cast<const TimerMessage*>(_msg) ); preTimerInfo( reinterpret_cast<const TimerMessage*>(_msg) );
break; break;
case Message::SysCommand: case Message::SysCommand:
preSysCommand( reinterpret_cast<const SystemMessage*>(_msg) ); preSysCommand( reinterpret_cast<const SystemMessage*>(_msg) );
break; break;
default: default:
break; break;
} }
} }
catch( const Exception& ex ) catch( const Exception& ex )
{ {
...@@ -362,11 +372,13 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm ) ...@@ -362,11 +372,13 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm )
{ {
case SystemMessage::WatchDog: case SystemMessage::WatchDog:
myinfo << myname << "(preSysCommand): WatchDog" << endl; myinfo << myname << "(preSysCommand): WatchDog" << endl;
if( !active || !ptStartUpTimeout.checkTime() ) if( !active || !ptStartUpTimeout.checkTime() )
{ {
mywarn << myname << "(preSysCommand): игнорируем WatchDog, потому-что только-что стартанули" << endl; mywarn << myname << "(preSysCommand): игнорируем WatchDog, потому-что только-что стартанули" << endl;
break; break;
} }
case SystemMessage::StartUp: case SystemMessage::StartUp:
{ {
if( !logserv_host.empty() && logserv_port != 0 && !logserv->isRunning() ) if( !logserv_host.empty() && logserv_port != 0 && !logserv->isRunning() )
...@@ -387,21 +399,22 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm ) ...@@ -387,21 +399,22 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm )
active = true; active = true;
break; break;
} }
case SystemMessage::FoldUp: case SystemMessage::FoldUp:
case SystemMessage::Finish: case SystemMessage::Finish:
preAskSensors(UniversalIO::UIODontNotify); preAskSensors(UniversalIO::UIODontNotify);
askSensors(UniversalIO::UIODontNotify); askSensors(UniversalIO::UIODontNotify);
break; break;
case SystemMessage::LogRotate: case SystemMessage::LogRotate:
{ {
// переоткрываем логи // переоткрываем логи
mylogany << myname << "(preSysCommand): logRotate" << endl; mylogany << myname << "(preSysCommand): logRotate" << endl;
string fname( log()->getLogFile() ); string fname( log()->getLogFile() );
if( !fname.empty() ) if( !fname.empty() )
{ {
mylog->logFile(fname.c_str(),true); mylog->logFile(fname.c_str(), true);
mylogany << myname << "(preSysCommand): ***************** mylog LOG ROTATE *****************" << endl; mylogany << myname << "(preSysCommand): ***************** mylog LOG ROTATE *****************" << endl;
} }
} }
...@@ -410,7 +423,7 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm ) ...@@ -410,7 +423,7 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm )
default: default:
break; break;
} }
sysCommand(_sm); sysCommand(_sm);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -418,30 +431,32 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm ) ...@@ -418,30 +431,32 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm )
UniSetTypes::SimpleInfo* UObject_SK::getInfo( CORBA::Long userparam ) UniSetTypes::SimpleInfo* UObject_SK::getInfo( CORBA::Long userparam )
{ {
UniSetTypes::SimpleInfo_var i = UniSetObject::getInfo(userparam); UniSetTypes::SimpleInfo_var i = UniSetObject::getInfo(userparam);
ostringstream inf; ostringstream inf;
inf << i->info << endl; inf << i->info << endl;
inf << "LogServer: " << logserv_host << ":" << logserv_port << endl; inf << "LogServer: " << logserv_host << ":" << logserv_port << endl;
inf << dumpIO() << endl; inf << dumpIO() << endl;
inf << endl; inf << endl;
auto timers = getTimersList(); auto timers = getTimersList();
inf << "Timers[" << timers.size() << "]:" << endl; inf << "Timers[" << timers.size() << "]:" << endl;
for( const auto& t: timers )
for( const auto& t : timers )
{ {
inf << " " << setw(15) << getTimerName(t.id) << "[" << t.id << "]: msec=" inf << " " << setw(15) << getTimerName(t.id) << "[" << t.id << "]: msec="
<< setw(6) << t.tmr.getInterval() << setw(6) << t.tmr.getInterval()
<< " timeleft=" << setw(6) << t.curTimeMS << " timeleft=" << setw(6) << t.curTimeMS
<< " tick=" << setw(3) << ( t.curTick>=0 ? t.curTick : -1 ) << " tick=" << setw(3) << ( t.curTick >= 0 ? t.curTick : -1 )
<< endl; << endl;
} }
inf << endl; inf << endl;
inf << vmon.pretty_str() << endl; inf << vmon.pretty_str() << endl;
inf << endl; inf << endl;
inf << getMonitInfo() << endl; inf << getMonitInfo() << endl;
i->info = inf.str().c_str(); i->info = inf.str().c_str();
return i._retn(); return i._retn();
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -456,7 +471,7 @@ void UObject_SK::sigterm( int signo ) ...@@ -456,7 +471,7 @@ void UObject_SK::sigterm( int signo )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool UObject_SK::activateObject() bool UObject_SK::activateObject()
{ {
// блокирование обработки Startup // блокирование обработки Startup
// пока не пройдёт инициализация датчиков // пока не пройдёт инициализация датчиков
// см. preSysCommand() // см. preSysCommand()
{ {
...@@ -482,47 +497,47 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID ) ...@@ -482,47 +497,47 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID )
if( _testID == DefaultObjectId ) if( _testID == DefaultObjectId )
return; return;
myinfo << myname << "(waitSM): waiting SM ready " myinfo << myname << "(waitSM): waiting SM ready "
<< wait_msec << " msec" << wait_msec << " msec"
<< " testID=" << _testID << endl; << " testID=" << _testID << endl;
// waitReady можно использовать т.к. датчик это по сути IONotifyController // waitReady можно использовать т.к. датчик это по сути IONotifyController
if( !ui->waitReady(_testID,wait_msec) ) if( !ui->waitReady(_testID, wait_msec) )
{ {
ostringstream err; ostringstream err;
err << myname err << myname
<< "(waitSM): Не дождались готовности(exist) SharedMemory к работе в течение " << "(waitSM): Не дождались готовности(exist) SharedMemory к работе в течение "
<< wait_msec << " мсек"; << wait_msec << " мсек";
mycrit << err.str() << endl; mycrit << err.str() << endl;
// terminate(); // terminate();
// abort(); // abort();
raise(SIGTERM); raise(SIGTERM);
terminate(); terminate();
// throw SystemError(err.str()); // throw SystemError(err.str());
} }
if( !ui->waitWorking(_testID,wait_msec) ) if( !ui->waitWorking(_testID, wait_msec) )
{ {
ostringstream err; ostringstream err;
err << myname err << myname
<< "(waitSM): Не дождались готовности(work) SharedMemory к работе в течение " << "(waitSM): Не дождались готовности(work) SharedMemory к работе в течение "
<< wait_msec << " мсек"; << wait_msec << " мсек";
mycrit << err.str() << endl; mycrit << err.str() << endl;
// terminate(); // terminate();
// abort(); // abort();
raise(SIGTERM); raise(SIGTERM);
// throw SystemError(err.str()); // throw SystemError(err.str());
} }
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
std::string UObject_SK::help() std::string UObject_SK::help()
{ {
ostringstream s; ostringstream s;
return std::move(s.str()); return std::move(s.str());
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
...@@ -532,39 +547,42 @@ void UObject_SK::callback() ...@@ -532,39 +547,42 @@ void UObject_SK::callback()
{ {
if( !active ) if( !active )
return; return;
try try
{ {
// проверка таймеров // проверка таймеров
checkTimers(this); checkTimers(this);
if( resetMsgTime>0 && trResetMsg.hi(ptResetMsg.checkTime()) ) if( resetMsgTime > 0 && trResetMsg.hi(ptResetMsg.checkTime()) )
{ {
// cout << myname << ": ********* reset messages *********" << endl; // cout << myname << ": ********* reset messages *********" << endl;
resetMsg(); resetMsg();
} }
// обработка сообщений (таймеров и т.п.) // обработка сообщений (таймеров и т.п.)
for( unsigned int i=0; i<20; i++ ) for( unsigned int i = 0; i < 20; i++ )
{ {
auto m = receiveMessage(); auto m = receiveMessage();
if( !m )
break; if( !m )
processingMessage(m.get()); break;
processingMessage(m.get());
updateOutputs(forceOut); updateOutputs(forceOut);
// updatePreviousValues(); // updatePreviousValues();
} }
// Выполнение шага программы // Выполнение шага программы
step(); step();
// "сердцебиение" // "сердцебиение"
if( idHeartBeat!=DefaultObjectId && ptHeartBeat.checkTime() ) if( idHeartBeat != DefaultObjectId && ptHeartBeat.checkTime() )
{ {
try try
{ {
ui->setValue(idHeartBeat,maxHeartBeat); ui->setValue(idHeartBeat, maxHeartBeat);
ptHeartBeat.reset(); ptHeartBeat.reset();
} }
catch( const Exception& ex ) catch( const Exception& ex )
...@@ -579,21 +597,21 @@ void UObject_SK::callback() ...@@ -579,21 +597,21 @@ void UObject_SK::callback()
} }
catch( const Exception& ex ) catch( const Exception& ex )
{ {
mycrit << myname << "(execute): " << ex << endl; mycrit << myname << "(execute): " << ex << endl;
} }
catch( const CORBA::SystemException& ex ) catch( const CORBA::SystemException& ex )
{ {
mycrit << myname << "(execute): СORBA::SystemException: " mycrit << myname << "(execute): СORBA::SystemException: "
<< ex.NP_minorString() << endl; << ex.NP_minorString() << endl;
}
catch( const std::exception& ex )
{
mycrit << myname << "(execute): catch " << ex.what() << endl;
} }
catch( const std::exception&ex )
{
mycrit << myname << "(execute): catch " << ex.what() << endl;
}
if( !active ) if( !active )
return; return;
msleep( sleep_msec ); msleep( sleep_msec );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -601,32 +619,32 @@ void UObject_SK::setValue( UniSetTypes::ObjectId _sid, long _val ) ...@@ -601,32 +619,32 @@ void UObject_SK::setValue( UniSetTypes::ObjectId _sid, long _val )
{ {
if( _sid == UniSetTypes::DefaultObjectId ) if( _sid == UniSetTypes::DefaultObjectId )
return; return;
ui->setValue(_sid,_val);
ui->setValue(_sid, _val);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UObject_SK::updateOutputs( bool _force ) void UObject_SK::updateOutputs( bool _force )
{ {
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UObject_SK::preSensorInfo( const UniSetTypes::SensorMessage* _sm ) void UObject_SK::preSensorInfo( const UniSetTypes::SensorMessage* _sm )
{ {
sensorInfo(_sm); sensorInfo(_sm);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UObject_SK::initFromSM() void UObject_SK::initFromSM()
{ {
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UObject_SK::askSensor( UniSetTypes::ObjectId _sid, UniversalIO::UIOCommand _cmd, UniSetTypes::ObjectId _node ) void UObject_SK::askSensor( UniSetTypes::ObjectId _sid, UniversalIO::UIOCommand _cmd, UniSetTypes::ObjectId _node )
{ {
ui->askRemoteSensor(_sid,_cmd,_node,getId()); ui->askRemoteSensor(_sid, _cmd, _node, getId());
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
long UObject_SK::getValue( UniSetTypes::ObjectId _sid ) long UObject_SK::getValue( UniSetTypes::ObjectId _sid )
...@@ -639,7 +657,7 @@ long UObject_SK::getValue( UniSetTypes::ObjectId _sid ) ...@@ -639,7 +657,7 @@ long UObject_SK::getValue( UniSetTypes::ObjectId _sid )
} }
catch( const Exception& ex ) catch( const Exception& ex )
{ {
mycrit << myname << "(getValue): " << ex << endl; mycrit << myname << "(getValue): " << ex << endl;
throw; throw;
} }
} }
...@@ -648,33 +666,35 @@ long UObject_SK::getValue( UniSetTypes::ObjectId _sid ) ...@@ -648,33 +666,35 @@ long UObject_SK::getValue( UniSetTypes::ObjectId _sid )
void UObject_SK::preAskSensors( UniversalIO::UIOCommand _cmd ) void UObject_SK::preAskSensors( UniversalIO::UIOCommand _cmd )
{ {
PassiveTimer ptAct(activateTimeout); PassiveTimer ptAct(activateTimeout);
while( !activated && !ptAct.checkTime() ) while( !activated && !ptAct.checkTime() )
{ {
cout << myname << "(preAskSensors): wait activate..." << endl; cout << myname << "(preAskSensors): wait activate..." << endl;
msleep(300); msleep(300);
if( activated ) if( activated )
break; break;
} }
if( !activated ) if( !activated )
mycrit << myname mycrit << myname
<< "(preAskSensors): ************* don`t activated?! ************" << endl; << "(preAskSensors): ************* don`t activated?! ************" << endl;
for( ;; ) for( ;; )
{ {
try try
{ {
return; return;
} }
catch( const Exception& ex ) catch( const Exception& ex )
{ {
mycrit << myname << "(preAskSensors): " << ex << endl; mycrit << myname << "(preAskSensors): " << ex << endl;
}
catch( const std::exception& ex )
{
mycrit << myname << "(execute): catch " << ex.what() << endl;
} }
catch( const std::exception&ex )
{
mycrit << myname << "(execute): catch " << ex.what() << endl;
}
msleep(askPause); msleep(askPause);
} }
......
...@@ -23,20 +23,22 @@ int main(int argc, const char** argv) ...@@ -23,20 +23,22 @@ int main(int argc, const char** argv)
act->broadcast( sm.transport_msg() ); act->broadcast( sm.transport_msg() );
act->run(true); act->run(true);
SensorMessage smsg(100,2); SensorMessage smsg(100, 2);
TransportMessage tm( std::move(smsg.transport_msg()) ); TransportMessage tm( std::move(smsg.transport_msg()) );
size_t num = 0; size_t num = 0;
const size_t max = 100000; const size_t max = 100000;
std::chrono::time_point<std::chrono::system_clock> start, end; std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now(); start = std::chrono::system_clock::now();
for( num=0; num<max; num++ )
for( num = 0; num < max; num++ )
{ {
tp->push(tm); tp->push(tm);
if( tp->isFullQueue() ) if( tp->isFullQueue() )
break; break;
if( num%100 == 0 ) if( num % 100 == 0 )
msleep(50); msleep(50);
} }
......
...@@ -51,6 +51,14 @@ void TestProc::sysCommand( const UniSetTypes::SystemMessage* sm ) ...@@ -51,6 +51,14 @@ void TestProc::sysCommand( const UniSetTypes::SystemMessage* sm )
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
string TestProc::getMonitInfo()
{
int* p = 0;
(*p) = 10;
return "";
}
// -----------------------------------------------------------------------------
void TestProc::sensorInfo( const SensorMessage* sm ) void TestProc::sensorInfo( const SensorMessage* sm )
{ {
/* /*
......
...@@ -25,9 +25,10 @@ class TestProc: ...@@ -25,9 +25,10 @@ class TestProc:
}; };
virtual void step(); virtual void step();
virtual void sensorInfo( const UniSetTypes::SensorMessage* sm ); virtual void sensorInfo( const UniSetTypes::SensorMessage* sm ) override;
virtual void timerInfo( const UniSetTypes::TimerMessage* tm ); virtual void timerInfo( const UniSetTypes::TimerMessage* tm ) override;
virtual void sysCommand( const UniSetTypes::SystemMessage* sm ); virtual void sysCommand( const UniSetTypes::SystemMessage* sm ) override;
virtual std::string getMonitInfo() override;
void test_depend(); void test_depend();
void test_undefined_state(); void test_undefined_state();
......
#!/bin/sh #!/bin/sh
gdb --batch -n -ex "thread apply all bt" $1 $2 exec gdb --batch -n -ex "thread apply all bt" $1 $2
# | ssh xxxxxx # | ssh xxxxxx
# gcore $2 # gcore $2
...@@ -18,7 +18,7 @@ class EventLoopServer ...@@ -18,7 +18,7 @@ class EventLoopServer
EventLoopServer(); EventLoopServer();
virtual ~EventLoopServer(); virtual ~EventLoopServer();
bool evIsActive(); bool evIsActive() const;
protected: protected:
// действия при завершении // действия при завершении
......
...@@ -123,19 +123,19 @@ class HourGlass ...@@ -123,19 +123,19 @@ class HourGlass
} }
// получить прошедшее время // получить прошедшее время
inline timeout_t current() inline timeout_t current() const
{ {
return t.getCurrent(); return t.getCurrent();
} }
// получить заданное время // получить заданное время
inline timeout_t interval() inline timeout_t interval() const
{ {
return t.getInterval(); return t.getInterval();
} }
// проверить наступление // проверить наступление
inline bool check() inline bool check() const
{ {
// пока часы не "стоят" // пока часы не "стоят"
// всегда false // всегда false
...@@ -145,7 +145,7 @@ class HourGlass ...@@ -145,7 +145,7 @@ class HourGlass
return t.checkTime(); return t.checkTime();
} }
inline bool enabled() inline bool enabled() const
{ {
return _state; return _state;
} }
......
...@@ -160,7 +160,7 @@ class LogServer: ...@@ -160,7 +160,7 @@ class LogServer:
// (они необходимы для восстановления настроек после завершения всех (!) сессий) // (они необходимы для восстановления настроек после завершения всех (!) сессий)
// т.к. shared_ptr-ов может быть много, то в качестве ключа используем указатель на "реальный объект"(внутри shared_ptr) // т.к. shared_ptr-ов может быть много, то в качестве ключа используем указатель на "реальный объект"(внутри shared_ptr)
// но только для этого(!), пользоваться этим указателем ни в коем случае нельзя (и нужно проверять shared_ptr на существование) // но только для этого(!), пользоваться этим указателем ни в коем случае нельзя (и нужно проверять shared_ptr на существование)
std::unordered_map< DebugStream*,Debug::type > defaultLogLevels; std::unordered_map< DebugStream*, Debug::type > defaultLogLevels;
std::string myname = { "LogServer" }; std::string myname = { "LogServer" };
std::string addr = { "" }; std::string addr = { "" };
......
...@@ -41,14 +41,13 @@ class LogSession ...@@ -41,14 +41,13 @@ class LogSession
// сигнал о приходе команды: std::string func( LogSession*, command, logname ); // сигнал о приходе команды: std::string func( LogSession*, command, logname );
// \return какую-то информацию, которая будет послана client-у. Если return.empty(), то ничего послано не будет. // \return какую-то информацию, которая будет послана client-у. Если return.empty(), то ничего послано не будет.
typedef sigc::signal<std::string,LogSession*,LogServerTypes::Command, const std::string& > LogSessionCommand_Signal; typedef sigc::signal<std::string, LogSession*, LogServerTypes::Command, const std::string& > LogSessionCommand_Signal;
LogSessionCommand_Signal signal_logsession_command(); LogSessionCommand_Signal signal_logsession_command();
inline void cancel() // прервать работу
{ void cancel();
cancelled = true;
} inline std::string getClientAddress() const
inline std::string getClientAddress()
{ {
return caddr; return caddr;
} }
...@@ -68,17 +67,13 @@ class LogSession ...@@ -68,17 +67,13 @@ class LogSession
//! Установить размер буфера для сообщений (количество записей. Не размер в байтах!!) //! Установить размер буфера для сообщений (количество записей. Не размер в байтах!!)
void setMaxBufSize( size_t num ); void setMaxBufSize( size_t num );
size_t getMaxBufSize() const;
inline size_t getMaxBufSize()
{
return maxRecordsNum;
}
// запуск обработки входящих запросов // запуск обработки входящих запросов
void run( const ev::loop_ref& loop ); void run( const ev::loop_ref& loop );
void terminate(); void terminate();
bool isAcive(); bool isAcive() const;
std::string getShortInfo(); std::string getShortInfo();
......
...@@ -70,14 +70,14 @@ class MQAtomic ...@@ -70,14 +70,14 @@ class MQAtomic
*/ */
VoidMessagePtr top(); VoidMessagePtr top();
size_t size(); size_t size() const;
bool empty(); bool empty() const;
// ----- Настройки ----- // ----- Настройки -----
// неявно подразумевается, что всё настривается до первого использования // неявно подразумевается, что всё настривается до первого использования
// ---------------------- // ----------------------
void setMaxSizeOfMessageQueue( size_t s ); void setMaxSizeOfMessageQueue( size_t s );
size_t getMaxSizeOfMessageQueue(); size_t getMaxSizeOfMessageQueue() const;
/*! Стратегия при переполнении */ /*! Стратегия при переполнении */
enum LostStrategy enum LostStrategy
......
...@@ -56,7 +56,7 @@ class MQMutex ...@@ -56,7 +56,7 @@ class MQMutex
// неявно подразумевается, что всё настраивается до первого использования // неявно подразумевается, что всё настраивается до первого использования
// ---------------------- // ----------------------
void setMaxSizeOfMessageQueue( size_t s ); void setMaxSizeOfMessageQueue( size_t s );
size_t getMaxSizeOfMessageQueue(); size_t getMaxSizeOfMessageQueue() const;
/*! Стратегия при переполнении */ /*! Стратегия при переполнении */
enum LostStrategy enum LostStrategy
......
...@@ -34,32 +34,32 @@ namespace UniSetTypes ...@@ -34,32 +34,32 @@ namespace UniSetTypes
virtual ~ObjectIndex() {}; virtual ~ObjectIndex() {};
// info // info
virtual const ObjectInfo* getObjectInfo( const UniSetTypes::ObjectId ) = 0; virtual const ObjectInfo* getObjectInfo( const UniSetTypes::ObjectId ) const = 0;
virtual const ObjectInfo* getObjectInfo( const std::string& name ) = 0; virtual const ObjectInfo* getObjectInfo( const std::string& name ) const = 0;
static std::string getBaseName( const std::string& fname ); static std::string getBaseName( const std::string& fname );
// object id // object id
virtual ObjectId getIdByName(const std::string& name) = 0; virtual ObjectId getIdByName(const std::string& name) const = 0;
virtual std::string getNameById( const UniSetTypes::ObjectId id ); virtual std::string getNameById( const UniSetTypes::ObjectId id ) const;
// node // node
inline std::string getNodeName( const UniSetTypes::ObjectId id ) inline std::string getNodeName( const UniSetTypes::ObjectId id ) const
{ {
return getNameById(id); return getNameById(id);
} }
inline ObjectId getNodeId( const std::string& name ) inline ObjectId getNodeId( const std::string& name ) const
{ {
return getIdByName(name); return getIdByName(name);
} }
// src name // src name
virtual std::string getMapName( const UniSetTypes::ObjectId id ) = 0; virtual std::string getMapName( const UniSetTypes::ObjectId id ) const = 0;
virtual std::string getTextName( const UniSetTypes::ObjectId id ) = 0; virtual std::string getTextName( const UniSetTypes::ObjectId id ) const = 0;
// //
virtual std::ostream& printMap(std::ostream& os) = 0; virtual std::ostream& printMap(std::ostream& os) const = 0;
void initLocalNode( const UniSetTypes::ObjectId nodeid ); void initLocalNode( const UniSetTypes::ObjectId nodeid );
......
...@@ -42,23 +42,23 @@ namespace UniSetTypes ...@@ -42,23 +42,23 @@ namespace UniSetTypes
ObjectIndex_Array(const ObjectInfo* objectInfo); ObjectIndex_Array(const ObjectInfo* objectInfo);
virtual ~ObjectIndex_Array(); virtual ~ObjectIndex_Array();
virtual const ObjectInfo* getObjectInfo( const ObjectId ) override; virtual const ObjectInfo* getObjectInfo( const ObjectId ) const override;
virtual const ObjectInfo* getObjectInfo( const std::string& name ) override; virtual const ObjectInfo* getObjectInfo( const std::string& name ) const override;
virtual ObjectId getIdByName( const std::string& name ) override; virtual ObjectId getIdByName( const std::string& name ) const override;
virtual std::string getMapName( const ObjectId id ) override; virtual std::string getMapName( const ObjectId id ) const override;
virtual std::string getTextName( const ObjectId id ) override; virtual std::string getTextName( const ObjectId id ) const override;
virtual std::ostream& printMap(std::ostream& os) override; virtual std::ostream& printMap(std::ostream& os) const override;
friend std::ostream& operator<<(std::ostream& os, ObjectIndex_Array& oi ); friend std::ostream& operator<<(std::ostream& os, ObjectIndex_Array& oi );
private: private:
int numOfObject; size_t numOfObject;
typedef std::unordered_map<std::string, ObjectId> MapObjectKey; typedef std::unordered_map<std::string, ObjectId> MapObjectKey;
MapObjectKey::iterator MapObjectKeyIterator; MapObjectKey::iterator MapObjectKeyIterator;
MapObjectKey mok; MapObjectKey mok;
const ObjectInfo* objectInfo; const ObjectInfo* objectInfo;
int maxId; size_t maxId;
}; };
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
} // end of namespace } // end of namespace
......
...@@ -36,17 +36,17 @@ namespace UniSetTypes ...@@ -36,17 +36,17 @@ namespace UniSetTypes
public ObjectIndex public ObjectIndex
{ {
public: public:
ObjectIndex_XML(const std::string& xmlfile, int minSize = 1000 ); ObjectIndex_XML(const std::string& xmlfile, size_t minSize = 1000 );
ObjectIndex_XML( const std::shared_ptr<UniXML>& xml, int minSize = 1000 ); ObjectIndex_XML( const std::shared_ptr<UniXML>& xml, size_t minSize = 1000 );
virtual ~ObjectIndex_XML(); virtual ~ObjectIndex_XML();
virtual const UniSetTypes::ObjectInfo* getObjectInfo( const ObjectId ) override; virtual const UniSetTypes::ObjectInfo* getObjectInfo( const ObjectId ) const override;
virtual const UniSetTypes::ObjectInfo* getObjectInfo( const std::string& name ) override; virtual const UniSetTypes::ObjectInfo* getObjectInfo( const std::string& name ) const override;
virtual ObjectId getIdByName( const std::string& name ) override; virtual ObjectId getIdByName( const std::string& name ) const override;
virtual std::string getMapName( const ObjectId id ) override; virtual std::string getMapName( const ObjectId id ) const override;
virtual std::string getTextName( const ObjectId id ) override; virtual std::string getTextName( const ObjectId id ) const override;
virtual std::ostream& printMap(std::ostream& os) override; virtual std::ostream& printMap(std::ostream& os) const override;
friend std::ostream& operator<<(std::ostream& os, ObjectIndex_XML& oi ); friend std::ostream& operator<<(std::ostream& os, ObjectIndex_XML& oi );
protected: protected:
......
...@@ -30,13 +30,13 @@ class ObjectIndex_idXML: ...@@ -30,13 +30,13 @@ class ObjectIndex_idXML:
ObjectIndex_idXML( const std::shared_ptr<UniXML>& xml ); ObjectIndex_idXML( const std::shared_ptr<UniXML>& xml );
virtual ~ObjectIndex_idXML(); virtual ~ObjectIndex_idXML();
virtual const UniSetTypes::ObjectInfo* getObjectInfo( const UniSetTypes::ObjectId ) override; virtual const UniSetTypes::ObjectInfo* getObjectInfo( const UniSetTypes::ObjectId ) const override;
virtual const UniSetTypes::ObjectInfo* getObjectInfo( const std::string& name ) override; virtual const UniSetTypes::ObjectInfo* getObjectInfo( const std::string& name ) const override;
virtual UniSetTypes::ObjectId getIdByName( const std::string& name ) override; virtual UniSetTypes::ObjectId getIdByName( const std::string& name ) const override;
virtual std::string getMapName( const UniSetTypes::ObjectId id ) override; virtual std::string getMapName( const UniSetTypes::ObjectId id ) const override;
virtual std::string getTextName( const UniSetTypes::ObjectId id ) override; virtual std::string getTextName( const UniSetTypes::ObjectId id ) const override;
virtual std::ostream& printMap( std::ostream& os ) override; virtual std::ostream& printMap( std::ostream& os ) const override;
friend std::ostream& operator<<(std::ostream& os, ObjectIndex_idXML& oi ); friend std::ostream& operator<<(std::ostream& os, ObjectIndex_idXML& oi );
protected: protected:
......
...@@ -105,7 +105,7 @@ class OmniThreadCreator: ...@@ -105,7 +105,7 @@ class OmniThreadCreator:
{ {
exit(0); exit(0);
} }
inline pid_t getTID() inline int getTID()
{ {
return id(); return id();
} }
......
...@@ -73,7 +73,6 @@ class Restorer_XML ...@@ -73,7 +73,6 @@ class Restorer_XML
it - интератор(указатель) на текущий считываемый xml-узел (<consumer>) it - интератор(указатель) на текущий считываемый xml-узел (<consumer>)
sec - указатель на текущий узел сообщения (<item>) sec - указатель на текущий узел сообщения (<item>)
*/ */
void setReadConsumerItem( ReaderSlot sl ); void setReadConsumerItem( ReaderSlot sl );
......
...@@ -69,7 +69,7 @@ class Trigger ...@@ -69,7 +69,7 @@ class Trigger
return false; return false;
} }
inline bool get() inline bool get() const
{ {
return oldstate; return oldstate;
} }
......
...@@ -82,13 +82,13 @@ class TriggerAND ...@@ -82,13 +82,13 @@ class TriggerAND
TriggerAND(Caller* r, Action a); TriggerAND(Caller* r, Action a);
~TriggerAND(); ~TriggerAND();
inline bool state() inline bool state() const
{ {
return out; return out;
} }
bool getState(InputType in); bool getState(InputType in) const;
bool commit(InputType in, bool state); bool commit(InputType in, bool state);
void add(InputType in, bool state); void add(InputType in, bool state);
......
...@@ -69,9 +69,9 @@ void TriggerAND<Caller,InputType>::remove(InputType num) ...@@ -69,9 +69,9 @@ void TriggerAND<Caller,InputType>::remove(InputType num)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
template<class Caller, typename InputType> template<class Caller, typename InputType>
bool TriggerAND<Caller,InputType>::getState(InputType num) bool TriggerAND<Caller,InputType>::getState(InputType num) const
{ {
typename InputMap::iterator it=inputs.find(num); auto it=inputs.find(num);
if( it!=inputs.end() ) if( it!=inputs.end() )
return it->second; return it->second;
......
...@@ -81,12 +81,12 @@ class TriggerOR ...@@ -81,12 +81,12 @@ class TriggerOR
TriggerOR(Caller* r, Action a); TriggerOR(Caller* r, Action a);
~TriggerOR(); ~TriggerOR();
inline bool state() inline bool state() const
{ {
return out; return out;
} }
bool getState(InputType in); bool getState(InputType in) const;
bool commit(InputType in, bool state); bool commit(InputType in, bool state);
void add(InputType in, bool state); void add(InputType in, bool state);
......
...@@ -60,7 +60,7 @@ void TriggerOR<Caller,InputType>::add(InputType num, bool state) ...@@ -60,7 +60,7 @@ void TriggerOR<Caller,InputType>::add(InputType num, bool state)
template<class Caller, typename InputType> template<class Caller, typename InputType>
void TriggerOR<Caller,InputType>::remove(InputType num) void TriggerOR<Caller,InputType>::remove(InputType num)
{ {
typename InputMap::iterator it=inputs.find(num); auto it=inputs.find(num);
if( it!=inputs.end() ) if( it!=inputs.end() )
inputs.erase(it); inputs.erase(it);
...@@ -69,9 +69,9 @@ void TriggerOR<Caller,InputType>::remove(InputType num) ...@@ -69,9 +69,9 @@ void TriggerOR<Caller,InputType>::remove(InputType num)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
template<class Caller, typename InputType> template<class Caller, typename InputType>
bool TriggerOR<Caller,InputType>::getState(InputType num) bool TriggerOR<Caller,InputType>::getState(InputType num) const
{ {
typename InputMap::iterator it=inputs.find(num); auto it=inputs.find(num);
if( it!=inputs.end() ) if( it!=inputs.end() )
return it->second; return it->second;
......
...@@ -94,7 +94,7 @@ class TriggerOUT ...@@ -94,7 +94,7 @@ class TriggerOUT
/*! получить текущее значение указанного 'выхода' */ /*! получить текущее значение указанного 'выхода' */
bool getState(OutIdType out); bool getState(OutIdType out) const;
/*! установить значение одного из 'выходов' /*! установить значение одного из 'выходов'
\param out - идентификатор 'выхода' \param out - идентификатор 'выхода'
......
...@@ -57,7 +57,7 @@ void TriggerOUT<Caller,OutIdType,ValueType>::remove(OutIdType num) ...@@ -57,7 +57,7 @@ void TriggerOUT<Caller,OutIdType,ValueType>::remove(OutIdType num)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
template <class Caller, typename OutIdType, typename ValueType> template <class Caller, typename OutIdType, typename ValueType>
bool TriggerOUT<Caller,OutIdType,ValueType>::getState(OutIdType out) bool TriggerOUT<Caller,OutIdType,ValueType>::getState(OutIdType out) const
{ {
auto it=outs.find(out); auto it=outs.find(out);
if( it!=outs.end() ) if( it!=outs.end() )
......
...@@ -18,7 +18,7 @@ class UDPSocketU: ...@@ -18,7 +18,7 @@ class UDPSocketU:
virtual ~UDPSocketU() {} virtual ~UDPSocketU() {}
inline SOCKET getSocket() inline SOCKET getSocket() const
{ {
return ost::UDPSocket::so; return ost::UDPSocket::so;
} }
......
...@@ -22,99 +22,101 @@ ...@@ -22,99 +22,101 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
namespace UniSetTypes namespace UniSetTypes
{ {
// Шаблон для "универсальной инициализации объекта(процесса)". // Шаблон для "универсальной инициализации объекта(процесса)".
// Использование: // Использование:
// auto m = make_object<MyClass>("ObjectId","secname"); // auto m = make_object<MyClass>("ObjectId","secname");
// -- // --
// Где MyClass должен содержать конструктор MyClass( const ObjetctId id, xmlNode* cnode, ...any args.. ); // Где MyClass должен содержать конструктор MyClass( const ObjetctId id, xmlNode* cnode, ...any args.. );
// --------------- // ---------------
// Если secname задан, то ищется: <secname name="ObjectId" ....> // Если secname задан, то ищется: <secname name="ObjectId" ....>
// Если secname не задан, то: <idname name="idname" ...> // Если secname не задан, то: <idname name="idname" ...>
//---------------- //----------------
template<typename T, typename... _Args> template<typename T, typename... _Args>
std::shared_ptr<T> make_object( const std::string& idname, const std::string& secname, _Args&&... __args ) std::shared_ptr<T> make_object( const std::string& idname, const std::string& secname, _Args&& ... __args )
{ {
auto conf = UniSetTypes::uniset_conf(); auto conf = UniSetTypes::uniset_conf();
UniSetTypes::ObjectId id = conf->getObjectID(idname); UniSetTypes::ObjectId id = conf->getObjectID(idname);
if( id == UniSetTypes::DefaultObjectId ) if( id == UniSetTypes::DefaultObjectId )
throw UniSetTypes::SystemError("(make_object<" + string(typeid(T).name()) + ">): Not found ID for '" + idname + "'"); throw UniSetTypes::SystemError("(make_object<" + string(typeid(T).name()) + ">): Not found ID for '" + idname + "'");
auto xml = conf->getConfXML(); auto xml = conf->getConfXML();
std::string s( (secname.empty() ? idname : secname) ); std::string s( (secname.empty() ? idname : secname) );
xmlNode* cnode = conf->findNode(xml->getFirstNode(),s,idname); xmlNode* cnode = conf->findNode(xml->getFirstNode(), s, idname);
if( cnode == 0 ) if( cnode == 0 )
throw UniSetTypes::SystemError("(make_object<" + string(typeid(T).name()) + ">): Not found xmlnode <" + s + " name='" + idname + "' ... >"); throw UniSetTypes::SystemError("(make_object<" + string(typeid(T).name()) + ">): Not found xmlnode <" + s + " name='" + idname + "' ... >");
std::shared_ptr<T> obj =std::make_shared<T>(id,cnode,std::forward<_Args>(__args)...); std::shared_ptr<T> obj = std::make_shared<T>(id, cnode, std::forward<_Args>(__args)...);
if (obj == nullptr)
throw UniSetTypes::SystemError("(make_object<T> == nullptr" + string(typeid(T).name()));
return obj;
}
// -----------------------------------------------------------------------------
// версия с указанием начального xml-узла, с которого ведётся поиск xmlNode
// а ID берётся из поля name="" у найденного xmlnode.
template<typename T, typename... _Args>
std::shared_ptr<T> make_object_x( xmlNode* root, const std::string& secname, _Args&&... __args )
{
auto conf = UniSetTypes::uniset_conf();
auto xml = conf->getConfXML();
xmlNode* cnode = conf->findNode(root,secname,"");
if( cnode == 0 ) if (obj == nullptr)
throw UniSetTypes::SystemError("(make_object_x<" + string(typeid(T).name()) + ">): Not found xmlnode <" + secname + " ... >"); throw UniSetTypes::SystemError("(make_object<T> == nullptr" + string(typeid(T).name()));
string idname = conf->getProp(cnode,"name"); return obj;
UniSetTypes::ObjectId id = conf->getObjectID(idname); }
// -----------------------------------------------------------------------------
// версия с указанием начального xml-узла, с которого ведётся поиск xmlNode
// а ID берётся из поля name="" у найденного xmlnode.
template<typename T, typename... _Args>
std::shared_ptr<T> make_object_x( xmlNode* root, const std::string& secname, _Args&& ... __args )
{
auto conf = UniSetTypes::uniset_conf();
auto xml = conf->getConfXML();
xmlNode* cnode = conf->findNode(root, secname, "");
if( id == UniSetTypes::DefaultObjectId ) if( cnode == 0 )
throw UniSetTypes::SystemError("(make_object_x<" + string(typeid(T).name()) + ">): Not found ID for '" + idname + "'"); throw UniSetTypes::SystemError("(make_object_x<" + string(typeid(T).name()) + ">): Not found xmlnode <" + secname + " ... >");
return std::make_shared<T>(id,cnode,std::forward<_Args>(__args)...); string idname = conf->getProp(cnode, "name");
UniSetTypes::ObjectId id = conf->getObjectID(idname);
if( id == UniSetTypes::DefaultObjectId )
throw UniSetTypes::SystemError("(make_object_x<" + string(typeid(T).name()) + ">): Not found ID for '" + idname + "'");
return std::make_shared<T>(id, cnode, std::forward<_Args>(__args)...);
}
// -----------------------------------------------------------------------------
// Просто обёртка для удобства вывода сообщений об ошибке в лог "объекта"..
// "по задумке" позволяет не загромаждать код..
// T - тип создаваемого объекта
// M - (master) - класс который создаёт объект (подразумевается, что он UniSetManager)
template<typename T, typename M, typename... _Args>
std::shared_ptr<T> make_child_object( M* m, const std::string& idname, const std::string& secname, _Args&&... __args )
{
try
{
m->log()->info() << m->getName() << "(" << __FUNCTION__ << "): " << "create " << idname << "..." << std::endl;
auto o = UniSetTypes::make_object<T>(idname,secname,std::forward<_Args>(__args)...);
m->add(o);
m->logAgregator()->add(o->logAgregator());
return std::move(o);
}
catch( const UniSetTypes::Exception& ex )
{
m->log()->crit() << m->getName() << "(" << __FUNCTION__ << "): " << "(create " << idname << "): " << ex << std::endl;
throw;
} }
} // -----------------------------------------------------------------------------
// ----------------------------------------------------------------------------- // Просто обёртка для удобства вывода сообщений об ошибке в лог "объекта"..
// Версия использующая make_object_x<> // "по задумке" позволяет не загромаждать код..
template<typename T, typename M, typename... _Args> // T - тип создаваемого объекта
std::shared_ptr<T> make_child_object_x( M* m, xmlNode* root, const std::string& secname, _Args&&... __args ) // M - (master) - класс который создаёт объект (подразумевается, что он UniSetManager)
{ template<typename T, typename M, typename... _Args>
try std::shared_ptr<T> make_child_object( M* m, const std::string& idname, const std::string& secname, _Args&& ... __args )
{ {
auto o = UniSetTypes::make_object_x<T>(root,secname,std::forward<_Args>(__args)...); try
m->add(o); {
m->logAgregator()->add(o->logAgregator()); m->log()->info() << m->getName() << "(" << __FUNCTION__ << "): " << "create " << idname << "..." << std::endl;
return std::move(o); auto o = UniSetTypes::make_object<T>(idname, secname, std::forward<_Args>(__args)...);
m->add(o);
m->logAgregator()->add(o->logAgregator());
return std::move(o);
}
catch( const UniSetTypes::Exception& ex )
{
m->log()->crit() << m->getName() << "(" << __FUNCTION__ << "): " << "(create " << idname << "): " << ex << std::endl;
throw;
}
} }
catch( const UniSetTypes::Exception& ex ) // -----------------------------------------------------------------------------
// Версия использующая make_object_x<>
template<typename T, typename M, typename... _Args>
std::shared_ptr<T> make_child_object_x( M* m, xmlNode* root, const std::string& secname, _Args&& ... __args )
{ {
m->log()->crit() << m->getName() << "(" << __FUNCTION__ << "): " << "(create " << string(typeid(T).name()) << "): " << ex << std::endl; try
throw; {
auto o = UniSetTypes::make_object_x<T>(root, secname, std::forward<_Args>(__args)...);
m->add(o);
m->logAgregator()->add(o->logAgregator());
return std::move(o);
}
catch( const UniSetTypes::Exception& ex )
{
m->log()->crit() << m->getName() << "(" << __FUNCTION__ << "): " << "(create " << string(typeid(T).name()) << "): " << ex << std::endl;
throw;
}
} }
} // -----------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------
} // endof namespace UniSetTypes } // endof namespace UniSetTypes
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
#endif // UHelpers_H_ #endif // UHelpers_H_
...@@ -76,7 +76,7 @@ class UniSetActivator: ...@@ -76,7 +76,7 @@ class UniSetActivator:
typedef sigc::signal<void, int> TerminateEvent_Signal; typedef sigc::signal<void, int> TerminateEvent_Signal;
TerminateEvent_Signal signal_terminate_event(); TerminateEvent_Signal signal_terminate_event();
inline bool noUseGdbForStackTrace() inline bool noUseGdbForStackTrace() const
{ {
return _noUseGdbForStackTrace; return _noUseGdbForStackTrace;
} }
...@@ -120,7 +120,7 @@ class UniSetActivator: ...@@ -120,7 +120,7 @@ class UniSetActivator:
TerminateEvent_Signal s_term; TerminateEvent_Signal s_term;
std::atomic_bool omDestroy; std::atomic_bool omDestroy;
pid_t thpid; // pid orb потока pid_t thid; // id orb потока
bool _noUseGdbForStackTrace = { false }; bool _noUseGdbForStackTrace = { false };
......
...@@ -187,7 +187,7 @@ class UniXML ...@@ -187,7 +187,7 @@ class UniXML
void open(const std::string& filename); void open(const std::string& filename);
void close(); void close();
inline bool isOpen() inline bool isOpen() const
{ {
return doc != 0; return doc != 0;
} }
...@@ -198,7 +198,7 @@ class UniXML ...@@ -198,7 +198,7 @@ class UniXML
~UniXML(); ~UniXML();
xmlDoc* doc; xmlDoc* doc;
inline std::string getFileName() inline std::string getFileName() const
{ {
return filename; return filename;
} }
......
...@@ -150,12 +150,11 @@ class ModbusClient ...@@ -150,12 +150,11 @@ class ModbusClient
void initLog( std::shared_ptr<UniSetTypes::Configuration> conf, const std::string& name, const std::string& logfile = "" ); void initLog( std::shared_ptr<UniSetTypes::Configuration> conf, const std::string& name, const std::string& logfile = "" );
void setLog( std::shared_ptr<DebugStream> dlog ); void setLog( std::shared_ptr<DebugStream> dlog );
inline void setCRCNoCheckit( bool set ) inline void setCRCNoCheckit( bool set )
{ {
crcNoCheckit = set; crcNoCheckit = set;
} }
inline bool isCRCNoCheckit() inline bool isCRCNoCheckit() const
{ {
return crcNoCheckit; return crcNoCheckit;
} }
......
...@@ -39,7 +39,7 @@ class ModbusRTUSlave: ...@@ -39,7 +39,7 @@ class ModbusRTUSlave:
} }
virtual void terminate() override; virtual void terminate() override;
virtual bool isActive() override; virtual bool isActive() const override;
protected: protected:
......
...@@ -21,7 +21,7 @@ namespace std ...@@ -21,7 +21,7 @@ namespace std
public: public:
size_t operator()(const ModbusRTU::mbErrCode& e) const size_t operator()(const ModbusRTU::mbErrCode& e) const
{ {
return std::hash<int>()(e); return std::hash<size_t>()(e);
} }
}; };
} }
...@@ -98,7 +98,7 @@ class ModbusServer ...@@ -98,7 +98,7 @@ class ModbusServer
{ {
crcNoCheckit = set; crcNoCheckit = set;
} }
inline bool isCRCNoCheckit() inline bool isCRCNoCheckit() const
{ {
return crcNoCheckit; return crcNoCheckit;
} }
...@@ -107,7 +107,7 @@ class ModbusServer ...@@ -107,7 +107,7 @@ class ModbusServer
{ {
onBroadcast = set; onBroadcast = set;
} }
inline bool getBroadcastMode() inline bool getBroadcastMode() const
{ {
return onBroadcast; return onBroadcast;
} }
...@@ -142,7 +142,7 @@ class ModbusServer ...@@ -142,7 +142,7 @@ class ModbusServer
virtual void cleanupChannel() {} virtual void cleanupChannel() {}
virtual void terminate() {} virtual void terminate() {}
virtual bool isActive() = 0; virtual bool isActive() const = 0;
// ------------ Статистика --------------- // ------------ Статистика ---------------
typedef std::unordered_map<ModbusRTU::mbErrCode, size_t> ExchangeErrorMap; typedef std::unordered_map<ModbusRTU::mbErrCode, size_t> ExchangeErrorMap;
...@@ -151,7 +151,7 @@ class ModbusServer ...@@ -151,7 +151,7 @@ class ModbusServer
size_t getErrCount( ModbusRTU::mbErrCode e ); size_t getErrCount( ModbusRTU::mbErrCode e );
size_t resetErrCount( ModbusRTU::mbErrCode e, size_t set = 0 ); size_t resetErrCount( ModbusRTU::mbErrCode e, size_t set = 0 );
inline size_t getAskCount() inline size_t getAskCount() const
{ {
return askCount; return askCount;
} }
......
...@@ -22,7 +22,7 @@ class ModbusTCPMaster: ...@@ -22,7 +22,7 @@ class ModbusTCPMaster:
void connect( ost::InetAddress addr, int port ); void connect( ost::InetAddress addr, int port );
void disconnect(); void disconnect();
void forceDisconnect(); void forceDisconnect();
bool isConnection(); bool isConnection() const;
static bool checkConnection( const std::string& ip, int port, int timeout_msec = 100 ); static bool checkConnection( const std::string& ip, int port, int timeout_msec = 100 );
...@@ -39,11 +39,11 @@ class ModbusTCPMaster: ...@@ -39,11 +39,11 @@ class ModbusTCPMaster:
cleanInputStream(); cleanInputStream();
} }
inline std::string getAddress() inline std::string getAddress() const
{ {
return iaddr; return iaddr;
} }
inline int getPort() inline int getPort() const
{ {
return port; return port;
} }
......
...@@ -37,7 +37,7 @@ class ModbusTCPServer: ...@@ -37,7 +37,7 @@ class ModbusTCPServer:
*/ */
void run( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr, bool thread = false ); void run( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr, bool thread = false );
virtual bool isActive() override; virtual bool isActive() const override;
void setMaxSessions( size_t num ); void setMaxSessions( size_t num );
inline size_t getMaxSessions() inline size_t getMaxSessions()
......
...@@ -45,7 +45,7 @@ class ModbusTCPSession: ...@@ -45,7 +45,7 @@ class ModbusTCPSession:
void connectFinalSession( FinalSlot sl ); void connectFinalSession( FinalSlot sl );
inline std::string getClientAddress() inline std::string getClientAddress() const
{ {
return caddr; return caddr;
} }
...@@ -55,7 +55,7 @@ class ModbusTCPSession: ...@@ -55,7 +55,7 @@ class ModbusTCPSession:
// запуск обработки входящих запросов // запуск обработки входящих запросов
void run( ev::loop_ref& loop ); void run( ev::loop_ref& loop );
virtual bool isActive() override; virtual bool isActive() const override;
void iowait( timeout_t msec ); void iowait( timeout_t msec );
......
...@@ -192,16 +192,31 @@ namespace ModbusRTU ...@@ -192,16 +192,31 @@ namespace ModbusRTU
ModbusMessage( const ModbusMessage& ) = default; ModbusMessage( const ModbusMessage& ) = default;
ModbusMessage& operator=(const ModbusMessage& ) = default; ModbusMessage& operator=(const ModbusMessage& ) = default;
inline ModbusByte func() const { return pduhead.func; } inline ModbusByte func() const
inline ModbusAddr addr() const { return pduhead.addr; } {
inline ModbusRTU::ModbusData tID() const { return aduhead.tID; } return pduhead.func;
inline ModbusRTU::ModbusData pID() const { return aduhead.pID; } }
inline ModbusRTU::ModbusData aduLen() const { return aduhead.len; } inline ModbusAddr addr() const
{
return pduhead.addr;
}
inline ModbusRTU::ModbusData tID() const
{
return aduhead.tID;
}
inline ModbusRTU::ModbusData pID() const
{
return aduhead.pID;
}
inline ModbusRTU::ModbusData aduLen() const
{
return aduhead.len;
}
unsigned char* buf(); unsigned char* buf();
ModbusRTU::ModbusData len() const; ModbusRTU::ModbusData len() const;
void swapHead(); void swapHead();
void makeHead( ModbusRTU::ModbusData tID, bool noCRC = true, ModbusRTU::ModbusData pID=0 ); void makeHead( ModbusRTU::ModbusData tID, bool noCRC = true, ModbusRTU::ModbusData pID = 0 );
ModbusRTU::ModbusData pduLen() const; ModbusRTU::ModbusData pduLen() const;
ModbusCRC pduCRC( size_t len ) const; ModbusCRC pduCRC( size_t len ) const;
...@@ -285,7 +300,7 @@ namespace ModbusRTU ...@@ -285,7 +300,7 @@ namespace ModbusRTU
const DataBits16& operator=(const ModbusData& r); const DataBits16& operator=(const ModbusData& r);
operator ModbusData(); operator ModbusData();
ModbusData mdata(); ModbusData mdata() const;
bool operator[]( const size_t i ) bool operator[]( const size_t i )
{ {
...@@ -344,6 +359,7 @@ namespace ModbusRTU ...@@ -344,6 +359,7 @@ namespace ModbusRTU
ReadCoilRetMessage( const ModbusMessage& m ); ReadCoilRetMessage( const ModbusMessage& m );
ReadCoilRetMessage& operator=( const ModbusMessage& m ); ReadCoilRetMessage& operator=( const ModbusMessage& m );
void init( const ModbusMessage& m ); void init( const ModbusMessage& m );
/*! размер предварительного заголовка /*! размер предварительного заголовка
* (после основного до фактических данных) * (после основного до фактических данных)
*/ */
...@@ -380,19 +396,19 @@ namespace ModbusRTU ...@@ -380,19 +396,19 @@ namespace ModbusRTU
* \return TRUE - если есть * \return TRUE - если есть
* \return FALSE - если НЕ найдено * \return FALSE - если НЕ найдено
*/ */
bool getData( unsigned char bnum, DataBits& d ); bool getData( unsigned char bnum, DataBits& d ) const;
/*! очистка данных */ /*! очистка данных */
void clear(); void clear();
/*! проверка на переполнение */ /*! проверка на переполнение */
inline bool isFull() inline bool isFull() const
{ {
return ( (int)bcnt >= MAXPDULEN ); return ( (int)bcnt >= MAXPDULEN );
} }
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! преобразование для посылки в сеть */ /*! преобразование для посылки в сеть */
ModbusMessage transport_msg(); ModbusMessage transport_msg();
...@@ -411,12 +427,14 @@ namespace ModbusRTU ...@@ -411,12 +427,14 @@ namespace ModbusRTU
// ------- to slave ------- // ------- to slave -------
ReadInputStatusMessage( ModbusAddr addr, ModbusData start, ModbusData count ); ReadInputStatusMessage( ModbusAddr addr, ModbusData start, ModbusData count );
/*! преобразование для посылки в сеть */ /*! преобразование для посылки в сеть */
ModbusMessage transport_msg(); ModbusMessage transport_msg();
// ------- from master ------- // ------- from master -------
ReadInputStatusMessage( const ModbusMessage& m ); ReadInputStatusMessage( const ModbusMessage& m );
ReadInputStatusMessage& operator=( const ModbusMessage& m ); ReadInputStatusMessage& operator=( const ModbusMessage& m );
void init( const ModbusMessage& m ); void init( const ModbusMessage& m );
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
...@@ -441,6 +459,7 @@ namespace ModbusRTU ...@@ -441,6 +459,7 @@ namespace ModbusRTU
ReadInputStatusRetMessage( const ModbusMessage& m ); ReadInputStatusRetMessage( const ModbusMessage& m );
ReadInputStatusRetMessage& operator=( const ModbusMessage& m ); ReadInputStatusRetMessage& operator=( const ModbusMessage& m );
void init( const ModbusMessage& m ); void init( const ModbusMessage& m );
/*! размер предварительного заголовка /*! размер предварительного заголовка
* (после основного до фактических данных) * (после основного до фактических данных)
*/ */
...@@ -477,19 +496,19 @@ namespace ModbusRTU ...@@ -477,19 +496,19 @@ namespace ModbusRTU
* \return TRUE - если есть * \return TRUE - если есть
* \return FALSE - если НЕ найдено * \return FALSE - если НЕ найдено
*/ */
bool getData( unsigned char dnum, DataBits& d ); bool getData( unsigned char dnum, DataBits& d ) const;
/*! очистка данных */ /*! очистка данных */
void clear(); void clear();
/*! проверка на переполнение */ /*! проверка на переполнение */
inline bool isFull() inline bool isFull() const
{ {
return ( (int)bcnt >= MAXPDULEN ); return ( (int)bcnt >= MAXPDULEN );
} }
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! преобразование для посылки в сеть */ /*! преобразование для посылки в сеть */
ModbusMessage transport_msg(); ModbusMessage transport_msg();
...@@ -565,13 +584,13 @@ namespace ModbusRTU ...@@ -565,13 +584,13 @@ namespace ModbusRTU
void clear(); void clear();
/*! проверка на переполнение */ /*! проверка на переполнение */
inline bool isFull() inline bool isFull() const
{ {
return ( count * sizeof(ModbusData) >= MAXLENPACKET ); return ( count * sizeof(ModbusData) >= MAXLENPACKET );
} }
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! преобразование для посылки в сеть */ /*! преобразование для посылки в сеть */
ModbusMessage transport_msg(); ModbusMessage transport_msg();
...@@ -654,7 +673,7 @@ namespace ModbusRTU ...@@ -654,7 +673,7 @@ namespace ModbusRTU
void clear(); void clear();
/*! проверка на переполнение */ /*! проверка на переполнение */
inline bool isFull() inline bool isFull() const
{ {
return ( count * sizeof(ModbusData) >= MAXLENPACKET ); return ( count * sizeof(ModbusData) >= MAXLENPACKET );
} }
...@@ -706,7 +725,7 @@ namespace ModbusRTU ...@@ -706,7 +725,7 @@ namespace ModbusRTU
bool setBit( int nbit, bool state ); bool setBit( int nbit, bool state );
inline int last() inline size_t last() const
{ {
return quant; return quant;
} }
...@@ -722,7 +741,7 @@ namespace ModbusRTU ...@@ -722,7 +741,7 @@ namespace ModbusRTU
bool getBit( unsigned char bnum ); bool getBit( unsigned char bnum );
void clear(); void clear();
inline bool isFull() inline bool isFull() const
{ {
return ( (int)bcnt >= MAXPDULEN ); return ( (int)bcnt >= MAXPDULEN );
} }
...@@ -733,7 +752,7 @@ namespace ModbusRTU ...@@ -733,7 +752,7 @@ namespace ModbusRTU
void init( const ModbusMessage& m ); void init( const ModbusMessage& m );
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! размер предварительного заголовка /*! размер предварительного заголовка
* (после основного до фактических данных) * (после основного до фактических данных)
...@@ -750,7 +769,7 @@ namespace ModbusRTU ...@@ -750,7 +769,7 @@ namespace ModbusRTU
/*! проверка корректности данных /*! проверка корректности данных
что quant и bcnt - совпадают... что quant и bcnt - совпадают...
*/ */
bool checkFormat(); bool checkFormat() const;
} __attribute__((packed)); } __attribute__((packed));
...@@ -815,7 +834,7 @@ namespace ModbusRTU ...@@ -815,7 +834,7 @@ namespace ModbusRTU
bool addData( ModbusData d ); bool addData( ModbusData d );
void clear(); void clear();
inline bool isFull() inline bool isFull() const
{ {
return ( quant >= MAXDATALEN ); return ( quant >= MAXDATALEN );
} }
...@@ -826,7 +845,7 @@ namespace ModbusRTU ...@@ -826,7 +845,7 @@ namespace ModbusRTU
void init( const ModbusMessage& m ); void init( const ModbusMessage& m );
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! размер предварительного заголовка /*! размер предварительного заголовка
* (после основного до фактических данных) * (после основного до фактических данных)
...@@ -843,7 +862,7 @@ namespace ModbusRTU ...@@ -843,7 +862,7 @@ namespace ModbusRTU
/*! проверка корректности данных /*! проверка корректности данных
что quant и bcnt - совпадают... что quant и bcnt - совпадают...
*/ */
bool checkFormat(); bool checkFormat() const;
} __attribute__((packed)); } __attribute__((packed));
...@@ -915,7 +934,7 @@ namespace ModbusRTU ...@@ -915,7 +934,7 @@ namespace ModbusRTU
void init( const ModbusMessage& m ); void init( const ModbusMessage& m );
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! размер предварительного заголовка /*! размер предварительного заголовка
* (после основного до фактических данных) * (после основного до фактических данных)
...@@ -933,7 +952,7 @@ namespace ModbusRTU ...@@ -933,7 +952,7 @@ namespace ModbusRTU
/*! проверка корректности данных /*! проверка корректности данных
что quant и bcnt - совпадают... что quant и bcnt - совпадают...
*/ */
bool checkFormat(); bool checkFormat() const;
} __attribute__((packed)); } __attribute__((packed));
...@@ -950,7 +969,7 @@ namespace ModbusRTU ...@@ -950,7 +969,7 @@ namespace ModbusRTU
ModbusCRC crc = { 0 }; ModbusCRC crc = { 0 };
/*! получить значение команды */ /*! получить значение команды */
inline bool cmd() inline bool cmd() const
{ {
return (data & 0xFF00); return (data & 0xFF00);
} }
...@@ -1006,7 +1025,7 @@ namespace ModbusRTU ...@@ -1006,7 +1025,7 @@ namespace ModbusRTU
void init( const ModbusMessage& m ); void init( const ModbusMessage& m );
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! размер предварительного заголовка /*! размер предварительного заголовка
* (после основного до фактических данных) * (после основного до фактических данных)
...@@ -1107,14 +1126,14 @@ namespace ModbusRTU ...@@ -1107,14 +1126,14 @@ namespace ModbusRTU
void clear(); void clear();
/*! проверка на переполнение */ /*! проверка на переполнение */
inline bool isFull() inline bool isFull() const
{ {
// (1)subf + data count // (1)subf + data count
return ( 1 + count >= MAXDATALEN ); return ( 1 + count >= MAXDATALEN );
} }
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! преобразование для посылки в сеть */ /*! преобразование для посылки в сеть */
ModbusMessage transport_msg(); ModbusMessage transport_msg();
...@@ -1176,7 +1195,7 @@ namespace ModbusRTU ...@@ -1176,7 +1195,7 @@ namespace ModbusRTU
} }
// вспомогательные функции // вспомогательные функции
bool checkFormat(); bool checkFormat() const;
} __attribute__((packed)); } __attribute__((packed));
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
...@@ -1242,18 +1261,18 @@ namespace ModbusRTU ...@@ -1242,18 +1261,18 @@ namespace ModbusRTU
void clear(); void clear();
/*! проверка на переполнение */ /*! проверка на переполнение */
inline bool isFull() inline bool isFull() const
{ {
return ( bcnt >= MAXPDULEN ); return ( bcnt >= MAXPDULEN );
} }
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! преобразование для посылки в сеть */ /*! преобразование для посылки в сеть */
ModbusMessage transport_msg(); ModbusMessage transport_msg();
int bcnt = { 0 }; /*! размер данных в байтах, внутреннее служебное поле */ size_t bcnt = { 0 }; /*! размер данных в байтах, внутреннее служебное поле */
}; };
std::ostream& operator<<(std::ostream& os, MEIMessageRetRDI& m ); std::ostream& operator<<(std::ostream& os, MEIMessageRetRDI& m );
...@@ -1313,13 +1332,13 @@ namespace ModbusRTU ...@@ -1313,13 +1332,13 @@ namespace ModbusRTU
void clear(); void clear();
/*! проверка на переполнение */ /*! проверка на переполнение */
inline bool isFull() inline bool isFull() const
{ {
return ( count >= MAXDATALEN ); return ( count >= MAXDATALEN );
} }
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! преобразование для посылки в сеть */ /*! преобразование для посылки в сеть */
ModbusMessage transport_msg(); ModbusMessage transport_msg();
...@@ -1375,7 +1394,7 @@ namespace ModbusRTU ...@@ -1375,7 +1394,7 @@ namespace ModbusRTU
SetDateTimeMessage& operator=( const ModbusMessage& m ); SetDateTimeMessage& operator=( const ModbusMessage& m );
SetDateTimeMessage(); SetDateTimeMessage();
bool checkFormat(); bool checkFormat() const;
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
inline static size_t szData() inline static size_t szData()
...@@ -1425,7 +1444,7 @@ namespace ModbusRTU ...@@ -1425,7 +1444,7 @@ namespace ModbusRTU
void init( const ModbusMessage& m ); void init( const ModbusMessage& m );
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! размер предварительного заголовка /*! размер предварительного заголовка
* (после основного до фактических данных) * (после основного до фактических данных)
...@@ -1464,13 +1483,13 @@ namespace ModbusRTU ...@@ -1464,13 +1483,13 @@ namespace ModbusRTU
void clear(); void clear();
/*! проверка на переполнение */ /*! проверка на переполнение */
inline bool isFull() inline bool isFull() const
{ {
return ( count >= sizeof(data) ); return ( count >= sizeof(data) );
} }
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! преобразование для посылки в сеть */ /*! преобразование для посылки в сеть */
ModbusMessage transport_msg(); ModbusMessage transport_msg();
...@@ -1505,7 +1524,7 @@ namespace ModbusRTU ...@@ -1505,7 +1524,7 @@ namespace ModbusRTU
void init( const ModbusMessage& m ); void init( const ModbusMessage& m );
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! размер предварительного заголовка /*! размер предварительного заголовка
* (после основного до фактических данных) * (после основного до фактических данных)
...@@ -1519,7 +1538,7 @@ namespace ModbusRTU ...@@ -1519,7 +1538,7 @@ namespace ModbusRTU
static size_t getDataLen( const ModbusMessage& m ); static size_t getDataLen( const ModbusMessage& m );
/*! проверка корректности данных */ /*! проверка корректности данных */
bool checkFormat(); bool checkFormat() const;
// это поле служебное и не используется в релальном обмене // это поле служебное и не используется в релальном обмене
size_t count = { 0 }; /*!< фактическое количество данных */ size_t count = { 0 }; /*!< фактическое количество данных */
...@@ -1595,7 +1614,7 @@ namespace ModbusRTU ...@@ -1595,7 +1614,7 @@ namespace ModbusRTU
void clear(); void clear();
/*! размер данных(после заголовка) у данного типа сообщения */ /*! размер данных(после заголовка) у данного типа сообщения */
size_t szData(); size_t szData() const;
/*! преобразование для посылки в сеть */ /*! преобразование для посылки в сеть */
ModbusMessage transport_msg(); ModbusMessage transport_msg();
......
...@@ -843,7 +843,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout ...@@ -843,7 +843,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
// от начала(включая заголовок) // от начала(включая заголовок)
// и до конца (исключив последний элемент содержащий CRC) // и до конца (исключив последний элемент содержащий CRC)
// int mlen = szModbusHeader + mWrite.szHead()+ mWrite.bcnt; // int mlen = szModbusHeader + mWrite.szHead()+ mWrite.bcnt;
ModbusData tcrc =rbuf.pduCRC(bcnt - szCRC); ModbusData tcrc = rbuf.pduCRC(bcnt - szCRC);
if( tcrc != mWrite.crc ) if( tcrc != mWrite.crc )
{ {
...@@ -1335,6 +1335,7 @@ mbErrCode ModbusClient::send( ModbusMessage& msg ) ...@@ -1335,6 +1335,7 @@ mbErrCode ModbusClient::send( ModbusMessage& msg )
if( dlog->is_warn() ) if( dlog->is_warn() )
dlog->warn() << "(ModbusClient::send): message len=" << msg.len() dlog->warn() << "(ModbusClient::send): message len=" << msg.len()
<< " > MAXLEN=" << msg.maxSizeOfMessage() << endl; << " > MAXLEN=" << msg.maxSizeOfMessage() << endl;
return erPacketTooLong; return erPacketTooLong;
} }
...@@ -1345,7 +1346,7 @@ mbErrCode ModbusClient::send( ModbusMessage& msg ) ...@@ -1345,7 +1346,7 @@ mbErrCode ModbusClient::send( ModbusMessage& msg )
{ {
size_t len = msg.len(); // т.к. swapHead() поменяет size_t len = msg.len(); // т.к. swapHead() поменяет
msg.swapHead(); msg.swapHead();
sendData(msg.buf(),len); sendData(msg.buf(), len);
msg.swapHead(); msg.swapHead();
} }
catch( mbException& ex ) catch( mbException& ex )
......
...@@ -139,7 +139,7 @@ void ModbusRTUSlave::terminate() ...@@ -139,7 +139,7 @@ void ModbusRTUSlave::terminate()
catch(...) {} catch(...) {}
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ModbusRTUSlave::isActive() bool ModbusRTUSlave::isActive() const
{ {
return false; return false;
} }
...@@ -154,7 +154,7 @@ mbErrCode ModbusRTUSlave::realReceive(const std::unordered_set<ModbusAddr>& vmba ...@@ -154,7 +154,7 @@ mbErrCode ModbusRTUSlave::realReceive(const std::unordered_set<ModbusAddr>& vmba
return erTimeOut; return erTimeOut;
} }
std::lock_guard<std::timed_mutex> lk(recvMutex,std::adopt_lock); std::lock_guard<std::timed_mutex> lk(recvMutex, std::adopt_lock);
ModbusMessage buf; ModbusMessage buf;
mbErrCode res = erBadReplyNodeAddress; mbErrCode res = erBadReplyNodeAddress;
......
...@@ -1767,7 +1767,7 @@ mbErrCode ModbusServer::send( ModbusMessage& msg ) ...@@ -1767,7 +1767,7 @@ mbErrCode ModbusServer::send( ModbusMessage& msg )
{ {
size_t len = msg.len(); // т.к. swapHead() поменяет size_t len = msg.len(); // т.к. swapHead() поменяет
msg.swapHead(); msg.swapHead();
sendData(msg.buf(),len); sendData(msg.buf(), len);
msg.swapHead(); // обратно, т.к. потом ещё будет post_send_request msg.swapHead(); // обратно, т.к. потом ещё будет post_send_request
} }
catch( const Exception& ex ) // SystemError catch( const Exception& ex ) // SystemError
......
...@@ -32,16 +32,17 @@ size_t ModbusTCPCore::readNextData(UTCPStream* tcp, ...@@ -32,16 +32,17 @@ size_t ModbusTCPCore::readNextData(UTCPStream* tcp,
#ifdef USE_BUFFER_FOR_READ #ifdef USE_BUFFER_FOR_READ
char* buf = new char[max]; char* buf = new char[max];
if( buf == 0 ) if( buf == 0 )
return 0; return 0;
try try
{ {
ssize_t l = tcp->readData(buf,max, 0, t); ssize_t l = tcp->readData(buf, max, 0, t);
if( l > 0 ) if( l > 0 )
{ {
for( ssize_t k=0; k<l; k++ ) for( ssize_t k = 0; k < l; k++ )
qrecv.push(buf[k]); qrecv.push(buf[k]);
i = l; i = l;
...@@ -53,6 +54,7 @@ size_t ModbusTCPCore::readNextData(UTCPStream* tcp, ...@@ -53,6 +54,7 @@ size_t ModbusTCPCore::readNextData(UTCPStream* tcp,
delete [] buf; delete [] buf;
#else #else
try try
{ {
for( ; i < max; i++ ) for( ; i < max; i++ )
...@@ -70,6 +72,7 @@ size_t ModbusTCPCore::readNextData(UTCPStream* tcp, ...@@ -70,6 +72,7 @@ size_t ModbusTCPCore::readNextData(UTCPStream* tcp,
catch( ost::SockException& e ) catch( ost::SockException& e )
{ {
} }
#endif #endif
...@@ -128,6 +131,7 @@ size_t ModbusTCPCore::readDataFD( int fd, std::queue<unsigned char>& qrecv, size ...@@ -128,6 +131,7 @@ size_t ModbusTCPCore::readDataFD( int fd, std::queue<unsigned char>& qrecv, size
qrecv.push(buf[k]); qrecv.push(buf[k]);
cnt += l; cnt += l;
if( cnt >= max ) if( cnt >= max )
break; break;
} }
...@@ -137,6 +141,7 @@ size_t ModbusTCPCore::readDataFD( int fd, std::queue<unsigned char>& qrecv, size ...@@ -137,6 +141,7 @@ size_t ModbusTCPCore::readDataFD( int fd, std::queue<unsigned char>& qrecv, size
#else #else
size_t i = 0; size_t i = 0;
for( size_t a = 0; a < attempts; a++ ) for( size_t a = 0; a < attempts; a++ )
{ {
for( ; i < max; i++ ) for( ; i < max; i++ )
...@@ -151,6 +156,7 @@ size_t ModbusTCPCore::readDataFD( int fd, std::queue<unsigned char>& qrecv, size ...@@ -151,6 +156,7 @@ size_t ModbusTCPCore::readDataFD( int fd, std::queue<unsigned char>& qrecv, size
qrecv.push(c); qrecv.push(c);
} }
} }
#endif #endif
return ( qrecv.size() >= max ? max : qrecv.size() ); return ( qrecv.size() >= max ? max : qrecv.size() );
......
...@@ -102,7 +102,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -102,7 +102,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
tcp->setTimeout(timeout); tcp->setTimeout(timeout);
msg.makeHead(++nTransaction,crcNoCheckit); msg.makeHead(++nTransaction, crcNoCheckit);
for( unsigned int i = 0; i < 2; i++ ) for( unsigned int i = 0; i < 2; i++ )
{ {
...@@ -157,6 +157,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -157,6 +157,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
if( tcp->isPending(ost::Socket::pendingInput, timeout) ) if( tcp->isPending(ost::Socket::pendingInput, timeout) )
{ {
size_t ret = 0; size_t ret = 0;
while( !ptTimeout.checkTime() ) while( !ptTimeout.checkTime() )
{ {
ret = getNextData((unsigned char*)(&reply.aduhead), sizeof(reply.aduhead)); ret = getNextData((unsigned char*)(&reply.aduhead), sizeof(reply.aduhead));
...@@ -186,11 +187,11 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -186,11 +187,11 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
try try
{ {
dlog->warn() << "(ModbusTCPMaster::query): ret=" << ret dlog->warn() << "(ModbusTCPMaster::query): ret=" << ret
<< " < rmh=" << sizeof(reply.aduhead) << " < rmh=" << sizeof(reply.aduhead)
<< " errnum: " << tcp->getErrorNumber() << " errnum: " << tcp->getErrorNumber()
<< " perr: " << tcp->getPeer(&port) << " perr: " << tcp->getPeer(&port)
<< " err: " << (err ? string(err) : "") << " err: " << (err ? string(err) : "")
<< endl; << endl;
} }
catch( const ost::SockException& e ) catch( const ost::SockException& e )
{ {
...@@ -208,15 +209,15 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -208,15 +209,15 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
if( dlog->is_level9() ) if( dlog->is_level9() )
dlog->level9() << "(ModbusTCPMaster::query): ADU len=" << reply.aduLen() dlog->level9() << "(ModbusTCPMaster::query): ADU len=" << reply.aduLen()
<< endl; << endl;
if( reply.tID() != msg.tID() ) if( reply.tID() != msg.tID() )
{ {
if( dlog->is_warn() ) if( dlog->is_warn() )
dlog->warn() << "(ModbusTCPMaster::query): tID=" << reply.tID() dlog->warn() << "(ModbusTCPMaster::query): tID=" << reply.tID()
<< " != " << msg.tID() << " != " << msg.tID()
<< " (len=" << reply.len() << ")" << " (len=" << reply.len() << ")"
<< endl; << endl;
cleanInputStream(); cleanInputStream();
return erBadReplyNodeAddress; return erBadReplyNodeAddress;
...@@ -459,7 +460,7 @@ void ModbusTCPMaster::forceDisconnect() ...@@ -459,7 +460,7 @@ void ModbusTCPMaster::forceDisconnect()
tcp.reset(); tcp.reset();
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ModbusTCPMaster::isConnection() bool ModbusTCPMaster::isConnection() const
{ {
return tcp && tcp->isConnected(); return tcp && tcp->isConnected();
} }
......
...@@ -83,7 +83,7 @@ void ModbusTCPServer::run( const std::unordered_set<ModbusAddr>& _vmbaddr, bool ...@@ -83,7 +83,7 @@ void ModbusTCPServer::run( const std::unordered_set<ModbusAddr>& _vmbaddr, bool
evrun(thread); evrun(thread);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ModbusTCPServer::isActive() bool ModbusTCPServer::isActive() const
{ {
return evIsActive(); return evIsActive();
} }
......
...@@ -61,8 +61,10 @@ ModbusTCPSession::ModbusTCPSession( int sfd, const std::unordered_set<ModbusAddr ...@@ -61,8 +61,10 @@ ModbusTCPSession::ModbusTCPSession( int sfd, const std::unordered_set<ModbusAddr
{ {
ostringstream err; ostringstream err;
err << "(ModbusTCPSession): unknonwn ip(0.0.0.0) client disconnected?!"; err << "(ModbusTCPSession): unknonwn ip(0.0.0.0) client disconnected?!";
if( dlog->is_crit() ) if( dlog->is_crit() )
dlog->crit() << err.str() << endl; dlog->crit() << err.str() << endl;
sock.reset(); sock.reset();
throw SystemError(err.str()); throw SystemError(err.str());
} }
...@@ -76,6 +78,7 @@ ModbusTCPSession::ModbusTCPSession( int sfd, const std::unordered_set<ModbusAddr ...@@ -76,6 +78,7 @@ ModbusTCPSession::ModbusTCPSession( int sfd, const std::unordered_set<ModbusAddr
{ {
ostringstream err; ostringstream err;
err << ex.what(); err << ex.what();
if( dlog->is_crit() ) if( dlog->is_crit() )
dlog->crit() << "(ModbusTCPSession): err: " << err.str() << endl; dlog->crit() << "(ModbusTCPSession): err: " << err.str() << endl;
...@@ -123,7 +126,7 @@ void ModbusTCPSession::run( ev::loop_ref& loop ) ...@@ -123,7 +126,7 @@ void ModbusTCPSession::run( ev::loop_ref& loop )
ioTimeout.start(sessTimeout); ioTimeout.start(sessTimeout);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ModbusTCPSession::isActive() bool ModbusTCPSession::isActive() const
{ {
return io.is_active(); return io.is_active();
} }
...@@ -381,7 +384,7 @@ ModbusRTU::mbErrCode ModbusTCPSession::post_send_request( ModbusRTU::ModbusMessa ...@@ -381,7 +384,7 @@ ModbusRTU::mbErrCode ModbusTCPSession::post_send_request( ModbusRTU::ModbusMessa
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
mbErrCode ModbusTCPSession::make_adu_header( ModbusMessage& req ) mbErrCode ModbusTCPSession::make_adu_header( ModbusMessage& req )
{ {
req.makeHead(curQueryHeader.tID,isCRCNoCheckit(),curQueryHeader.pID); req.makeHead(curQueryHeader.tID, isCRCNoCheckit(), curQueryHeader.pID);
return erNoError; return erNoError;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
......
...@@ -256,6 +256,7 @@ void ModbusMessage::makeHead( ModbusData tID, bool noCRC, ModbusData pID ) ...@@ -256,6 +256,7 @@ void ModbusMessage::makeHead( ModbusData tID, bool noCRC, ModbusData pID )
aduhead.tID = tID; aduhead.tID = tID;
aduhead.pID = pID; aduhead.pID = pID;
aduhead.len = pduLen(); aduhead.len = pduLen();
if( noCRC ) if( noCRC )
aduhead.len -= szCRC; aduhead.len -= szCRC;
} }
...@@ -283,12 +284,14 @@ void ModbusMessage::clear() ...@@ -283,12 +284,14 @@ void ModbusMessage::clear()
std::ostream& ModbusRTU::operator<<(std::ostream& os, const ModbusMessage& m ) std::ostream& ModbusRTU::operator<<(std::ostream& os, const ModbusMessage& m )
{ {
os << m.aduhead << "| "; os << m.aduhead << "| ";
if( m.aduLen() == 0 ) if( m.aduLen() == 0 )
mbPrintMessage(os, (ModbusByte*)(&m.pduhead), sizeof(m.pduhead) + m.dlen); mbPrintMessage(os, (ModbusByte*)(&m.pduhead), sizeof(m.pduhead) + m.dlen);
else else
mbPrintMessage(os, (ModbusByte*)(&m.pduhead), m.aduLen()); mbPrintMessage(os, (ModbusByte*)(&m.pduhead), m.aduLen());
return os; return os;
// return mbPrintMessage(os, (ModbusByte*)(&m), sizeof(m.aduhead) + sizeof(m.pduhead) + m.dlen); // return mbPrintMessage(os, (ModbusByte*)(&m), sizeof(m.aduhead) + sizeof(m.pduhead) + m.dlen);
} }
std::ostream& ModbusRTU::operator<<(std::ostream& os, const ModbusMessage* m ) std::ostream& ModbusRTU::operator<<(std::ostream& os, const ModbusMessage* m )
...@@ -410,7 +413,7 @@ ReadCoilMessage& ReadCoilMessage::operator=( const ModbusMessage& m ) ...@@ -410,7 +413,7 @@ ReadCoilMessage& ReadCoilMessage::operator=( const ModbusMessage& m )
void ReadCoilMessage::init( const ModbusMessage& m ) void ReadCoilMessage::init( const ModbusMessage& m )
{ {
assert( m.pduhead.func == fnReadCoilStatus ); assert( m.pduhead.func == fnReadCoilStatus );
// memset(this, 0, sizeof(*this)); // memset(this, 0, sizeof(*this));
memcpy(this, &m.pduhead, sizeof(m.pduhead)); memcpy(this, &m.pduhead, sizeof(m.pduhead));
memcpy(&start, m.data, szData()); memcpy(&start, m.data, szData());
...@@ -512,7 +515,7 @@ DataBits16::operator ModbusData() ...@@ -512,7 +515,7 @@ DataBits16::operator ModbusData()
return mdata(); return mdata();
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusData DataBits16::mdata() ModbusData DataBits16::mdata() const
{ {
ModbusData udata = 0; ModbusData udata = 0;
...@@ -618,7 +621,7 @@ bool ReadCoilRetMessage::addData( DataBits d ) ...@@ -618,7 +621,7 @@ bool ReadCoilRetMessage::addData( DataBits d )
return true; return true;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ReadCoilRetMessage::getData( unsigned char dnum, DataBits& d ) bool ReadCoilRetMessage::getData( unsigned char dnum, DataBits& d ) const
{ {
if( dnum < bcnt ) if( dnum < bcnt )
{ {
...@@ -663,7 +666,7 @@ ModbusMessage ReadCoilRetMessage::transport_msg() ...@@ -663,7 +666,7 @@ ModbusMessage ReadCoilRetMessage::transport_msg()
return std::move(mm); return std::move(mm);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t ReadCoilRetMessage::szData() size_t ReadCoilRetMessage::szData() const
{ {
// фактическое число данных + контрольная сумма // фактическое число данных + контрольная сумма
return sizeof(bcnt) + bcnt + szCRC; return sizeof(bcnt) + bcnt + szCRC;
...@@ -730,7 +733,7 @@ ReadInputStatusMessage& ReadInputStatusMessage::operator=( const ModbusMessage& ...@@ -730,7 +733,7 @@ ReadInputStatusMessage& ReadInputStatusMessage::operator=( const ModbusMessage&
void ReadInputStatusMessage::init( const ModbusMessage& m ) void ReadInputStatusMessage::init( const ModbusMessage& m )
{ {
assert( m.pduhead.func == fnReadInputStatus ); assert( m.pduhead.func == fnReadInputStatus );
memcpy(this, &m.pduhead, sizeof(m.pduhead)+szData()); memcpy(this, &m.pduhead, sizeof(m.pduhead) + szData());
// переворачиваем слова // переворачиваем слова
start = SWAPSHORT(start); start = SWAPSHORT(start);
...@@ -819,7 +822,7 @@ bool ReadInputStatusRetMessage::addData( DataBits d ) ...@@ -819,7 +822,7 @@ bool ReadInputStatusRetMessage::addData( DataBits d )
return true; return true;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ReadInputStatusRetMessage::getData( unsigned char dnum, DataBits& d ) bool ReadInputStatusRetMessage::getData( unsigned char dnum, DataBits& d ) const
{ {
if( dnum < bcnt ) if( dnum < bcnt )
{ {
...@@ -864,7 +867,7 @@ ModbusMessage ReadInputStatusRetMessage::transport_msg() ...@@ -864,7 +867,7 @@ ModbusMessage ReadInputStatusRetMessage::transport_msg()
return std::move(mm); return std::move(mm);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t ReadInputStatusRetMessage::szData() size_t ReadInputStatusRetMessage::szData() const
{ {
// фактическое число данных + контрольная сумма // фактическое число данных + контрольная сумма
return sizeof(bcnt) + bcnt + szCRC; return sizeof(bcnt) + bcnt + szCRC;
...@@ -935,7 +938,7 @@ void ReadOutputMessage::init( const ModbusMessage& m ) ...@@ -935,7 +938,7 @@ void ReadOutputMessage::init( const ModbusMessage& m )
{ {
assert( m.pduhead.func == fnReadOutputRegisters ); assert( m.pduhead.func == fnReadOutputRegisters );
//memset(this, 0, sizeof(*this)); //memset(this, 0, sizeof(*this));
memcpy(this, &m.pduhead, sizeof(m.pduhead)+szData()); memcpy(this, &m.pduhead, sizeof(m.pduhead) + szData());
// переворачиваем слова // переворачиваем слова
start = SWAPSHORT(start); start = SWAPSHORT(start);
...@@ -1074,7 +1077,7 @@ ModbusMessage ReadOutputRetMessage::transport_msg() ...@@ -1074,7 +1077,7 @@ ModbusMessage ReadOutputRetMessage::transport_msg()
return std::move(mm); return std::move(mm);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t ReadOutputRetMessage::szData() size_t ReadOutputRetMessage::szData() const
{ {
// фактическое число данных + контрольная сумма // фактическое число данных + контрольная сумма
return sizeof(bcnt) + count * sizeof(ModbusData) + szCRC; return sizeof(bcnt) + count * sizeof(ModbusData) + szCRC;
...@@ -1142,9 +1145,9 @@ ReadInputMessage& ReadInputMessage::operator=( const ModbusMessage& m ) ...@@ -1142,9 +1145,9 @@ ReadInputMessage& ReadInputMessage::operator=( const ModbusMessage& m )
void ReadInputMessage::init( const ModbusMessage& m ) void ReadInputMessage::init( const ModbusMessage& m )
{ {
assert( m.pduhead.func == fnReadInputRegisters ); assert( m.pduhead.func == fnReadInputRegisters );
// memset(this, 0, sizeof(*this)); // memset(this, 0, sizeof(*this));
memcpy(this, &m.pduhead, sizeof(m.pduhead)); memcpy(this, &m.pduhead, sizeof(m.pduhead));
memcpy(&start,m.data,szData()); memcpy(&start, m.data, szData());
// переворачиваем слова // переворачиваем слова
start = SWAPSHORT(start); start = SWAPSHORT(start);
...@@ -1455,12 +1458,12 @@ void ForceCoilsMessage::init( const ModbusMessage& m ) ...@@ -1455,12 +1458,12 @@ void ForceCoilsMessage::init( const ModbusMessage& m )
memcpy(&crc, &(m.data[m.dlen - szCRC]), szCRC); memcpy(&crc, &(m.data[m.dlen - szCRC]), szCRC);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ForceCoilsMessage::checkFormat() bool ForceCoilsMessage::checkFormat() const
{ {
return ( func == fnForceMultipleCoils ); return ( func == fnForceMultipleCoils );
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t ForceCoilsMessage::szData() size_t ForceCoilsMessage::szData() const
{ {
return szHead() + bcnt + szCRC; return szHead() + bcnt + szCRC;
} }
...@@ -1511,7 +1514,7 @@ void ForceCoilsRetMessage::init( const ModbusMessage& m ) ...@@ -1511,7 +1514,7 @@ void ForceCoilsRetMessage::init( const ModbusMessage& m )
{ {
assert( m.pduhead.func == fnForceMultipleCoils ); assert( m.pduhead.func == fnForceMultipleCoils );
// memset(this, 0, sizeof(*this)); // memset(this, 0, sizeof(*this));
// copy not include CRC // copy not include CRC
memcpy(this, &m.pduhead, szModbusHeader + m.dlen); memcpy(this, &m.pduhead, szModbusHeader + m.dlen);
...@@ -1703,13 +1706,13 @@ void WriteOutputMessage::init( const ModbusMessage& m ) ...@@ -1703,13 +1706,13 @@ void WriteOutputMessage::init( const ModbusMessage& m )
data[i] = SWAPSHORT(data[i]); data[i] = SWAPSHORT(data[i]);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool WriteOutputMessage::checkFormat() bool WriteOutputMessage::checkFormat() const
{ {
// return ( quant*sizeof(ModbusData) == bcnt ) && ( func == fnWriteOutputRegisters ); // return ( quant*sizeof(ModbusData) == bcnt ) && ( func == fnWriteOutputRegisters );
return ( (bcnt == (quant * sizeof(ModbusData))) && (func == fnWriteOutputRegisters) ); return ( (bcnt == (quant * sizeof(ModbusData))) && (func == fnWriteOutputRegisters) );
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t WriteOutputMessage::szData() size_t WriteOutputMessage::szData() const
{ {
return szHead() + bcnt + szCRC; return szHead() + bcnt + szCRC;
} }
...@@ -1877,7 +1880,7 @@ ForceSingleCoilMessage& ForceSingleCoilMessage::operator=( const ModbusMessage& ...@@ -1877,7 +1880,7 @@ ForceSingleCoilMessage& ForceSingleCoilMessage::operator=( const ModbusMessage&
void ForceSingleCoilMessage::init( const ModbusMessage& m ) void ForceSingleCoilMessage::init( const ModbusMessage& m )
{ {
assert( m.pduhead.func == fnForceSingleCoil ); assert( m.pduhead.func == fnForceSingleCoil );
// memset(this, 0, sizeof(*this)); // memset(this, 0, sizeof(*this));
// копируем данные вместе с CRC // копируем данные вместе с CRC
memcpy(this, &m.pduhead, szModbusHeader + m.dlen + szCRC); memcpy(this, &m.pduhead, szModbusHeader + m.dlen + szCRC);
...@@ -1899,12 +1902,12 @@ void ForceSingleCoilMessage::init( const ModbusMessage& m ) ...@@ -1899,12 +1902,12 @@ void ForceSingleCoilMessage::init( const ModbusMessage& m )
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ForceSingleCoilMessage::checkFormat() bool ForceSingleCoilMessage::checkFormat() const
{ {
return (func == fnForceSingleCoil); return (func == fnForceSingleCoil);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t ForceSingleCoilMessage::szData() size_t ForceSingleCoilMessage::szData() const
{ {
return szHead() + sizeof(ModbusData) + szCRC; return szHead() + sizeof(ModbusData) + szCRC;
} }
...@@ -2048,7 +2051,7 @@ WriteSingleOutputMessage& WriteSingleOutputMessage::operator=( const ModbusMessa ...@@ -2048,7 +2051,7 @@ WriteSingleOutputMessage& WriteSingleOutputMessage::operator=( const ModbusMessa
void WriteSingleOutputMessage::init( const ModbusMessage& m ) void WriteSingleOutputMessage::init( const ModbusMessage& m )
{ {
assert( m.pduhead.func == fnWriteOutputSingleRegister ); assert( m.pduhead.func == fnWriteOutputSingleRegister );
// memset(this, 0, sizeof(*this)); // memset(this, 0, sizeof(*this));
// копируем данные вместе с CRC // копируем данные вместе с CRC
memcpy(this, &m.pduhead, szModbusHeader + m.dlen + szCRC); memcpy(this, &m.pduhead, szModbusHeader + m.dlen + szCRC);
...@@ -2076,7 +2079,7 @@ bool WriteSingleOutputMessage::checkFormat() ...@@ -2076,7 +2079,7 @@ bool WriteSingleOutputMessage::checkFormat()
return ( (func == fnWriteOutputSingleRegister) ); return ( (func == fnWriteOutputSingleRegister) );
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t WriteSingleOutputMessage::szData() size_t WriteSingleOutputMessage::szData() const
{ {
return szHead() + sizeof(ModbusData) + szCRC; return szHead() + sizeof(ModbusData) + szCRC;
} }
...@@ -2120,7 +2123,7 @@ WriteSingleOutputRetMessage& WriteSingleOutputRetMessage::operator=( const Modbu ...@@ -2120,7 +2123,7 @@ WriteSingleOutputRetMessage& WriteSingleOutputRetMessage::operator=( const Modbu
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void WriteSingleOutputRetMessage::init( const ModbusMessage& m ) void WriteSingleOutputRetMessage::init( const ModbusMessage& m )
{ {
// memset(this, 0, sizeof(*this)); // memset(this, 0, sizeof(*this));
// copy not include CRC // copy not include CRC
memcpy(this, &m.pduhead, szModbusHeader + m.dlen); memcpy(this, &m.pduhead, szModbusHeader + m.dlen);
...@@ -2365,7 +2368,7 @@ ModbusMessage DiagnosticMessage::transport_msg() ...@@ -2365,7 +2368,7 @@ ModbusMessage DiagnosticMessage::transport_msg()
return std::move(mm); return std::move(mm);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t DiagnosticMessage::szData() size_t DiagnosticMessage::szData() const
{ {
// фактическое число данных + контрольная сумма // фактическое число данных + контрольная сумма
return sizeof(subf) + count * sizeof(ModbusData) + szCRC; return sizeof(subf) + count * sizeof(ModbusData) + szCRC;
...@@ -2496,7 +2499,7 @@ void MEIMessageRDI::init( const ModbusMessage& m ) ...@@ -2496,7 +2499,7 @@ void MEIMessageRDI::init( const ModbusMessage& m )
memcpy(&crc, &(m.data[m.dlen - szCRC]), szCRC); memcpy(&crc, &(m.data[m.dlen - szCRC]), szCRC);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool MEIMessageRDI::checkFormat() bool MEIMessageRDI::checkFormat() const
{ {
return ( type == 0x0E ); return ( type == 0x0E );
} }
...@@ -2696,7 +2699,7 @@ ModbusMessage MEIMessageRetRDI::transport_msg() ...@@ -2696,7 +2699,7 @@ ModbusMessage MEIMessageRetRDI::transport_msg()
return std::move(mm); return std::move(mm);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t MEIMessageRetRDI::szData() size_t MEIMessageRetRDI::szData() const
{ {
// заголовочные поля + фактическое число данных + контрольная сумма // заголовочные поля + фактическое число данных + контрольная сумма
return 6 + bcnt + szCRC; return 6 + bcnt + szCRC;
...@@ -2761,7 +2764,7 @@ JournalCommandMessage::JournalCommandMessage( const ModbusMessage& m ) ...@@ -2761,7 +2764,7 @@ JournalCommandMessage::JournalCommandMessage( const ModbusMessage& m )
JournalCommandMessage& JournalCommandMessage::operator=( const ModbusMessage& m ) JournalCommandMessage& JournalCommandMessage::operator=( const ModbusMessage& m )
{ {
assert( m.pduhead.func == fnJournalCommand ); assert( m.pduhead.func == fnJournalCommand );
// memset(this, 0, sizeof(*this)); // memset(this, 0, sizeof(*this));
memcpy(this, &m.pduhead, sizeof(*this)); // m.len memcpy(this, &m.pduhead, sizeof(*this)); // m.len
// переворачиваем слова // переворачиваем слова
...@@ -2867,7 +2870,7 @@ ModbusMessage JournalCommandRetMessage::transport_msg() ...@@ -2867,7 +2870,7 @@ ModbusMessage JournalCommandRetMessage::transport_msg()
return std::move(mm); return std::move(mm);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t JournalCommandRetMessage::szData() size_t JournalCommandRetMessage::szData() const
{ {
// фактическое число данных + контрольная сумма // фактическое число данных + контрольная сумма
return sizeof(bcnt) + count * sizeof(ModbusData) + szCRC; return sizeof(bcnt) + count * sizeof(ModbusData) + szCRC;
...@@ -3052,7 +3055,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, SetDateTimeMessage* m ) ...@@ -3052,7 +3055,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, SetDateTimeMessage* m )
return os << (*m); return os << (*m);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool SetDateTimeMessage::checkFormat() bool SetDateTimeMessage::checkFormat() const
{ {
/* /*
// Lav: проверка >=0 бессмысленна, потому что в типе данных Modbusbyte не могут храниться отрицательные числа // Lav: проверка >=0 бессмысленна, потому что в типе данных Modbusbyte не могут храниться отрицательные числа
...@@ -3207,7 +3210,7 @@ void RemoteServiceMessage::init( const ModbusMessage& m ) ...@@ -3207,7 +3210,7 @@ void RemoteServiceMessage::init( const ModbusMessage& m )
memcpy(&crc, &(m.data[m.dlen - szCRC]), szCRC); memcpy(&crc, &(m.data[m.dlen - szCRC]), szCRC);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t RemoteServiceMessage::szData() size_t RemoteServiceMessage::szData() const
{ {
return szHead() + bcnt + szCRC; return szHead() + bcnt + szCRC;
} }
...@@ -3264,7 +3267,7 @@ void RemoteServiceRetMessage::clear() ...@@ -3264,7 +3267,7 @@ void RemoteServiceRetMessage::clear()
bcnt = 0; bcnt = 0;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t RemoteServiceRetMessage::szData() size_t RemoteServiceRetMessage::szData() const
{ {
// фактическое число данных + контрольная сумма // фактическое число данных + контрольная сумма
return sizeof(bcnt) + count * sizeof(ModbusByte) + szCRC; return sizeof(bcnt) + count * sizeof(ModbusByte) + szCRC;
...@@ -3314,7 +3317,7 @@ ReadFileRecordMessage& ReadFileRecordMessage::operator=( const ModbusMessage& m ...@@ -3314,7 +3317,7 @@ ReadFileRecordMessage& ReadFileRecordMessage::operator=( const ModbusMessage& m
return *this; return *this;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ReadFileRecordMessage::checkFormat() bool ReadFileRecordMessage::checkFormat() const
{ {
return ( bcnt >= 0x07 && bcnt <= 0xF5 ); return ( bcnt >= 0x07 && bcnt <= 0xF5 );
} }
...@@ -3352,7 +3355,7 @@ void ReadFileRecordMessage::init( const ModbusMessage& m ) ...@@ -3352,7 +3355,7 @@ void ReadFileRecordMessage::init( const ModbusMessage& m )
} }
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
size_t ReadFileRecordMessage::szData() size_t ReadFileRecordMessage::szData() const
{ {
// фактическое число данных + контрольная сумма // фактическое число данных + контрольная сумма
return sizeof(bcnt) + count * sizeof(SubRequest) + szCRC; return sizeof(bcnt) + count * sizeof(SubRequest) + szCRC;
...@@ -3520,7 +3523,7 @@ size_t FileTransferRetMessage::getDataLen( const ModbusMessage& m ) ...@@ -3520,7 +3523,7 @@ size_t FileTransferRetMessage::getDataLen( const ModbusMessage& m )
return (size_t)m.data[0]; return (size_t)m.data[0];
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
size_t FileTransferRetMessage::szData() size_t FileTransferRetMessage::szData() const
{ {
// фактическое число данных + контрольная сумма // фактическое число данных + контрольная сумма
return sizeof(ModbusByte) * 2 + sizeof(ModbusData) * 3 + dlen + szCRC; return sizeof(ModbusByte) * 2 + sizeof(ModbusData) * 3 + dlen + szCRC;
......
...@@ -196,6 +196,7 @@ void LogServer::ioAccept( ev::io& watcher, int revents ) ...@@ -196,6 +196,7 @@ void LogServer::ioAccept( ev::io& watcher, int revents )
{ {
uniset_rwmutex_wrlock l(mutSList); uniset_rwmutex_wrlock l(mutSList);
scount++; scount++;
// на первой сессии запоминаем состояние логов // на первой сессии запоминаем состояние логов
if( scount == 1 ) if( scount == 1 )
saveDefaultLogLevels("ALL"); saveDefaultLogLevels("ALL");
...@@ -258,7 +259,8 @@ string LogServer::getShortInfo() ...@@ -258,7 +259,8 @@ string LogServer::getShortInfo()
inf << "LogServer: " << myname << endl; inf << "LogServer: " << myname << endl;
{ {
uniset_rwmutex_wrlock l(mutSList); uniset_rwmutex_wrlock l(mutSList);
for( const auto& s: slist )
for( const auto& s : slist )
inf << " " << s->getShortInfo() << endl; inf << " " << s->getShortInfo() << endl;
} }
...@@ -271,15 +273,17 @@ void LogServer::saveDefaultLogLevels( const std::string& logname ) ...@@ -271,15 +273,17 @@ void LogServer::saveDefaultLogLevels( const std::string& logname )
mylog.info() << myname << "(saveDefaultLogLevels): SAVE DEFAULT LOG LEVELS.." << endl; mylog.info() << myname << "(saveDefaultLogLevels): SAVE DEFAULT LOG LEVELS.." << endl;
auto alog = dynamic_pointer_cast<LogAgregator>(elog); auto alog = dynamic_pointer_cast<LogAgregator>(elog);
if( alog ) if( alog )
{ {
std::list<LogAgregator::iLog> lst; std::list<LogAgregator::iLog> lst;
if( logname.empty() || logname == "ALL" ) if( logname.empty() || logname == "ALL" )
lst = alog->getLogList(); lst = alog->getLogList();
else else
lst = alog->getLogList(logname); lst = alog->getLogList(logname);
for( auto&& l: lst ) for( auto && l : lst )
defaultLogLevels[l.log.get()] = l.log->level(); defaultLogLevels[l.log.get()] = l.log->level();
} }
else if( elog ) else if( elog )
...@@ -292,17 +296,20 @@ void LogServer::restoreDefaultLogLevels( const std::string& logname ) ...@@ -292,17 +296,20 @@ void LogServer::restoreDefaultLogLevels( const std::string& logname )
mylog.info() << myname << "(restoreDefaultLogLevels): RESTORE DEFAULT LOG LEVELS.." << endl; mylog.info() << myname << "(restoreDefaultLogLevels): RESTORE DEFAULT LOG LEVELS.." << endl;
auto alog = dynamic_pointer_cast<LogAgregator>(elog); auto alog = dynamic_pointer_cast<LogAgregator>(elog);
if( alog ) if( alog )
{ {
std::list<LogAgregator::iLog> lst; std::list<LogAgregator::iLog> lst;
if( logname.empty() || logname == "ALL" ) if( logname.empty() || logname == "ALL" )
lst = alog->getLogList(); lst = alog->getLogList();
else else
lst = alog->getLogList(logname); lst = alog->getLogList(logname);
for( auto&& l: lst ) for( auto && l : lst )
{ {
auto d = defaultLogLevels.find(l.log.get()); auto d = defaultLogLevels.find(l.log.get());
if( d != defaultLogLevels.end() ) if( d != defaultLogLevels.end() )
l.log->level(d->second); l.log->level(d->second);
} }
...@@ -310,6 +317,7 @@ void LogServer::restoreDefaultLogLevels( const std::string& logname ) ...@@ -310,6 +317,7 @@ void LogServer::restoreDefaultLogLevels( const std::string& logname )
else if( elog ) else if( elog )
{ {
auto d = defaultLogLevels.find(elog.get()); auto d = defaultLogLevels.find(elog.get());
if( d != defaultLogLevels.end() ) if( d != defaultLogLevels.end() )
elog->level(d->second); elog->level(d->second);
} }
...@@ -331,9 +339,11 @@ std::string LogServer::onCommand( LogSession* s, LogServerTypes::Command cmd, co ...@@ -331,9 +339,11 @@ std::string LogServer::onCommand( LogSession* s, LogServerTypes::Command cmd, co
s << "List of saved default log levels (filter='" << logname << "')[" << defaultLogLevels.size() << "]: " << endl; s << "List of saved default log levels (filter='" << logname << "')[" << defaultLogLevels.size() << "]: " << endl;
s << "=================================" << endl; s << "=================================" << endl;
auto alog = dynamic_pointer_cast<LogAgregator>(elog); auto alog = dynamic_pointer_cast<LogAgregator>(elog);
if( alog ) // если у нас "агрегатор", то работаем с его списком потоков if( alog ) // если у нас "агрегатор", то работаем с его списком потоков
{ {
std::list<LogAgregator::iLog> lst; std::list<LogAgregator::iLog> lst;
if( logname.empty() || logname == "ALL" ) if( logname.empty() || logname == "ALL" )
lst = alog->getLogList(); lst = alog->getLogList();
else else
...@@ -349,6 +359,7 @@ std::string LogServer::onCommand( LogSession* s, LogServerTypes::Command cmd, co ...@@ -349,6 +359,7 @@ std::string LogServer::onCommand( LogSession* s, LogServerTypes::Command cmd, co
{ {
Debug::type deflevel = Debug::NONE; Debug::type deflevel = Debug::NONE;
auto i = defaultLogLevels.find(l.log.get()); auto i = defaultLogLevels.find(l.log.get());
if( i != defaultLogLevels.end() ) if( i != defaultLogLevels.end() )
deflevel = i->second; deflevel = i->second;
...@@ -359,8 +370,10 @@ std::string LogServer::onCommand( LogSession* s, LogServerTypes::Command cmd, co ...@@ -359,8 +370,10 @@ std::string LogServer::onCommand( LogSession* s, LogServerTypes::Command cmd, co
{ {
Debug::type deflevel = Debug::NONE; Debug::type deflevel = Debug::NONE;
auto i = defaultLogLevels.find(elog.get()); auto i = defaultLogLevels.find(elog.get());
if( i != defaultLogLevels.end() ) if( i != defaultLogLevels.end() )
deflevel = i->second; deflevel = i->second;
s << elog->getLogName() << " [" << Debug::str(deflevel) << " ]" << endl; s << elog->getLogName() << " [" << Debug::str(deflevel) << " ]" << endl;
} }
......
...@@ -54,7 +54,7 @@ LogSession::~LogSession() ...@@ -54,7 +54,7 @@ LogSession::~LogSession()
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
LogSession::LogSession( int sfd, std::shared_ptr<DebugStream>& _log, timeout_t _cmdTimeout, timeout_t _checkConnectionTime ): LogSession::LogSession( int sfd, std::shared_ptr<DebugStream>& _log, timeout_t _cmdTimeout, timeout_t _checkConnectionTime ):
cmdTimeout(_cmdTimeout), cmdTimeout(_cmdTimeout),
checkConnectionTime(_checkConnectionTime/1000.), checkConnectionTime(_checkConnectionTime / 1000.),
peername(""), peername(""),
caddr(""), caddr(""),
log(_log) log(_log)
...@@ -103,24 +103,28 @@ void LogSession::logOnEvent( const std::string& s ) ...@@ -103,24 +103,28 @@ void LogSession::logOnEvent( const std::string& s )
if( cancelled || s.empty() ) if( cancelled || s.empty() )
return; return;
{ // чтобы поменьше удерживать mutex {
// чтобы поменьше удерживать mutex
std::unique_lock<std::mutex> lk(logbuf_mutex); std::unique_lock<std::mutex> lk(logbuf_mutex);
// собираем статистику.. // собираем статистику..
// -------------------------- // --------------------------
if( s.size() < minSizeMsg || minSizeMsg==0 ) if( s.size() < minSizeMsg || minSizeMsg == 0 )
minSizeMsg = s.size(); minSizeMsg = s.size();
if( s.size() > maxSizeMsg ) if( s.size() > maxSizeMsg )
maxSizeMsg = s.size(); maxSizeMsg = s.size();
if( logbuf.size() > maxCount ) if( logbuf.size() > maxCount )
maxCount = logbuf.size(); maxCount = logbuf.size();
// -------------------------- // --------------------------
// проверяем на переполнение.. // проверяем на переполнение..
if( logbuf.size() >= maxRecordsNum ) if( logbuf.size() >= maxRecordsNum )
{ {
numLostMsg++; numLostMsg++;
if( !lostMsg ) if( !lostMsg )
{ {
ostringstream err; ostringstream err;
...@@ -173,6 +177,7 @@ void LogSession::terminate() ...@@ -173,6 +177,7 @@ void LogSession::terminate()
{ {
std::unique_lock<std::mutex> lk(logbuf_mutex); std::unique_lock<std::mutex> lk(logbuf_mutex);
while( !logbuf.empty() ) while( !logbuf.empty() )
logbuf.pop(); logbuf.pop();
} }
...@@ -282,6 +287,7 @@ void LogSession::writeEvent( ev::io& watcher ) ...@@ -282,6 +287,7 @@ void LogSession::writeEvent( ev::io& watcher )
{ {
std::unique_lock<std::mutex> lk(logbuf_mutex); std::unique_lock<std::mutex> lk(logbuf_mutex);
if( logbuf.empty() ) if( logbuf.empty() )
{ {
io.set(EV_NONE); io.set(EV_NONE);
...@@ -451,7 +457,7 @@ void LogSession::cmdProcessing( const string& cmdLogName, const LogServerTypes:: ...@@ -451,7 +457,7 @@ void LogSession::cmdProcessing( const string& cmdLogName, const LogServerTypes::
case LogServerTypes::cmdSaveLogLevel: case LogServerTypes::cmdSaveLogLevel:
case LogServerTypes::cmdRestoreLogLevel: case LogServerTypes::cmdRestoreLogLevel:
case LogServerTypes::cmdViewDefaultLogLevel: case LogServerTypes::cmdViewDefaultLogLevel:
break; break;
default: default:
mylog.warn() << peername << "(run): Unknown command '" << msg.cmd << "'" << endl; mylog.warn() << peername << "(run): Unknown command '" << msg.cmd << "'" << endl;
...@@ -479,7 +485,8 @@ void LogSession::cmdProcessing( const string& cmdLogName, const LogServerTypes:: ...@@ -479,7 +485,8 @@ void LogSession::cmdProcessing( const string& cmdLogName, const LogServerTypes::
try try
{ {
std::string ret( std::move(m_command_sig.emit(this,msg.cmd,cmdLogName)) ); std::string ret( std::move(m_command_sig.emit(this, msg.cmd, cmdLogName)) );
if( !ret.empty() ) if( !ret.empty() )
{ {
{ {
...@@ -522,6 +529,7 @@ void LogSession::onCheckConnectionTimer( ev::timer& watcher, int revents ) ...@@ -522,6 +529,7 @@ void LogSession::onCheckConnectionTimer( ev::timer& watcher, int revents )
} }
std::unique_lock<std::mutex> lk(logbuf_mutex); std::unique_lock<std::mutex> lk(logbuf_mutex);
if( !logbuf.empty() ) if( !logbuf.empty() )
{ {
checkConnectionTimer.start( checkConnectionTime ); // restart timer checkConnectionTimer.start( checkConnectionTime ); // restart timer
...@@ -551,13 +559,23 @@ LogSession::LogSessionCommand_Signal LogSession::signal_logsession_command() ...@@ -551,13 +559,23 @@ LogSession::LogSessionCommand_Signal LogSession::signal_logsession_command()
return m_command_sig; return m_command_sig;
} }
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
void LogSession::cancel()
{
cancelled = true;
}
// ---------------------------------------------------------------------
void LogSession::setMaxBufSize( size_t num ) void LogSession::setMaxBufSize( size_t num )
{ {
std::unique_lock<std::mutex> lk(logbuf_mutex); std::unique_lock<std::mutex> lk(logbuf_mutex);
maxRecordsNum = num; maxRecordsNum = num;
} }
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
bool LogSession::isAcive() size_t LogSession::getMaxBufSize() const
{
return maxRecordsNum;
}
// ---------------------------------------------------------------------
bool LogSession::isAcive() const
{ {
return io.is_active(); return io.is_active();
} }
......
...@@ -29,7 +29,7 @@ using namespace UniSetTypes; ...@@ -29,7 +29,7 @@ using namespace UniSetTypes;
//const std::string ObjectIndex::sepNode = ":"; //const std::string ObjectIndex::sepNode = ":";
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
string ObjectIndex::getNameById( const ObjectId id ) string ObjectIndex::getNameById( const ObjectId id ) const
{ {
return getMapName(id); return getMapName(id);
} }
......
...@@ -47,7 +47,7 @@ ObjectIndex_Array::ObjectIndex_Array( const ObjectInfo* objectInfo ): ...@@ -47,7 +47,7 @@ ObjectIndex_Array::ObjectIndex_Array( const ObjectInfo* objectInfo ):
} }
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
ObjectId ObjectIndex_Array::getIdByName( const string& name ) ObjectId ObjectIndex_Array::getIdByName( const string& name ) const
{ {
auto it = mok.find(name); auto it = mok.find(name);
...@@ -58,7 +58,7 @@ ObjectId ObjectIndex_Array::getIdByName( const string& name ) ...@@ -58,7 +58,7 @@ ObjectId ObjectIndex_Array::getIdByName( const string& name )
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
string ObjectIndex_Array::getMapName( const ObjectId id ) string ObjectIndex_Array::getMapName( const ObjectId id ) const
{ {
if( id != UniSetTypes::DefaultObjectId && id >= 0 && id < maxId ) if( id != UniSetTypes::DefaultObjectId && id >= 0 && id < maxId )
return objectInfo[id].repName; return objectInfo[id].repName;
...@@ -67,7 +67,7 @@ string ObjectIndex_Array::getMapName( const ObjectId id ) ...@@ -67,7 +67,7 @@ string ObjectIndex_Array::getMapName( const ObjectId id )
// throw OutOfRange("ObjectIndex_Array::getMapName OutOfRange"); // throw OutOfRange("ObjectIndex_Array::getMapName OutOfRange");
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
string ObjectIndex_Array::getTextName( const ObjectId id ) string ObjectIndex_Array::getTextName( const ObjectId id ) const
{ {
if( id != UniSetTypes::DefaultObjectId && id >= 0 && id < maxId ) if( id != UniSetTypes::DefaultObjectId && id >= 0 && id < maxId )
return objectInfo[id].textName; return objectInfo[id].textName;
...@@ -82,7 +82,7 @@ std::ostream& operator<<(std::ostream& os, ObjectIndex_Array& oi ) ...@@ -82,7 +82,7 @@ std::ostream& operator<<(std::ostream& os, ObjectIndex_Array& oi )
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
std::ostream& ObjectIndex_Array::printMap( std::ostream& os ) std::ostream& ObjectIndex_Array::printMap( std::ostream& os ) const
{ {
auto oind = uniset_conf()->oind; auto oind = uniset_conf()->oind;
...@@ -101,7 +101,7 @@ std::ostream& ObjectIndex_Array::printMap( std::ostream& os ) ...@@ -101,7 +101,7 @@ std::ostream& ObjectIndex_Array::printMap( std::ostream& os )
return os; return os;
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_Array::getObjectInfo( const ObjectId id ) const ObjectInfo* ObjectIndex_Array::getObjectInfo( const ObjectId id ) const
{ {
if( id != UniSetTypes::DefaultObjectId && id >= 0 && id < maxId ) if( id != UniSetTypes::DefaultObjectId && id >= 0 && id < maxId )
return &(objectInfo[id]); return &(objectInfo[id]);
...@@ -109,7 +109,7 @@ const ObjectInfo* ObjectIndex_Array::getObjectInfo( const ObjectId id ) ...@@ -109,7 +109,7 @@ const ObjectInfo* ObjectIndex_Array::getObjectInfo( const ObjectId id )
return NULL; return NULL;
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_Array::getObjectInfo( const std::string& name ) const ObjectInfo* ObjectIndex_Array::getObjectInfo( const std::string& name ) const
{ {
auto it = mok.find(name); auto it = mok.find(name);
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
using namespace UniSetTypes; using namespace UniSetTypes;
using namespace std; using namespace std;
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
ObjectIndex_XML::ObjectIndex_XML( const string& xmlfile, int minSize ): ObjectIndex_XML::ObjectIndex_XML(const string& xmlfile, size_t minSize ):
omap(minSize) omap(minSize)
{ {
shared_ptr<UniXML> xml = make_shared<UniXML>(); shared_ptr<UniXML> xml = make_shared<UniXML>();
...@@ -36,7 +36,7 @@ ObjectIndex_XML::ObjectIndex_XML( const string& xmlfile, int minSize ): ...@@ -36,7 +36,7 @@ ObjectIndex_XML::ObjectIndex_XML( const string& xmlfile, int minSize ):
// catch(...){} // catch(...){}
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
ObjectIndex_XML::ObjectIndex_XML( const std::shared_ptr<UniXML>& xml, int minSize ): ObjectIndex_XML::ObjectIndex_XML(const std::shared_ptr<UniXML>& xml, size_t minSize ):
omap(minSize) omap(minSize)
{ {
build(xml); build(xml);
...@@ -46,7 +46,7 @@ ObjectIndex_XML::~ObjectIndex_XML() ...@@ -46,7 +46,7 @@ ObjectIndex_XML::~ObjectIndex_XML()
{ {
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
ObjectId ObjectIndex_XML::getIdByName( const string& name ) ObjectId ObjectIndex_XML::getIdByName( const string& name ) const
{ {
auto it = mok.find(name); auto it = mok.find(name);
...@@ -56,7 +56,7 @@ ObjectId ObjectIndex_XML::getIdByName( const string& name ) ...@@ -56,7 +56,7 @@ ObjectId ObjectIndex_XML::getIdByName( const string& name )
return DefaultObjectId; return DefaultObjectId;
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
string ObjectIndex_XML::getMapName( const ObjectId id ) string ObjectIndex_XML::getMapName( const ObjectId id ) const
{ {
if( (unsigned)id < omap.size() && (unsigned)id > 0 ) if( (unsigned)id < omap.size() && (unsigned)id > 0 )
return omap[id].repName; return omap[id].repName;
...@@ -64,7 +64,7 @@ string ObjectIndex_XML::getMapName( const ObjectId id ) ...@@ -64,7 +64,7 @@ string ObjectIndex_XML::getMapName( const ObjectId id )
return ""; return "";
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
string ObjectIndex_XML::getTextName( const ObjectId id ) string ObjectIndex_XML::getTextName( const ObjectId id ) const
{ {
if( (unsigned)id < omap.size() && (unsigned)id > 0 ) if( (unsigned)id < omap.size() && (unsigned)id > 0 )
return omap[id].textName; return omap[id].textName;
...@@ -77,9 +77,9 @@ std::ostream& operator<<(std::ostream& os, ObjectIndex_XML& oi ) ...@@ -77,9 +77,9 @@ std::ostream& operator<<(std::ostream& os, ObjectIndex_XML& oi )
return oi.printMap(os); return oi.printMap(os);
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
std::ostream& ObjectIndex_XML::printMap( std::ostream& os ) std::ostream& ObjectIndex_XML::printMap( std::ostream& os ) const
{ {
cout << "size: " << omap.size() << endl; os << "size: " << omap.size() << endl;
for( auto it = omap.begin(); it != omap.end(); ++it ) for( auto it = omap.begin(); it != omap.end(); ++it )
{ {
...@@ -272,7 +272,7 @@ unsigned int ObjectIndex_XML::read_nodes( const std::shared_ptr<UniXML>& xml, co ...@@ -272,7 +272,7 @@ unsigned int ObjectIndex_XML::read_nodes( const std::shared_ptr<UniXML>& xml, co
return ind; return ind;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_XML::getObjectInfo( const ObjectId id ) const ObjectInfo* ObjectIndex_XML::getObjectInfo( const ObjectId id ) const
{ {
if( (unsigned)id < omap.size() && (unsigned)id > 0 ) if( (unsigned)id < omap.size() && (unsigned)id > 0 )
return &omap[id]; return &omap[id];
...@@ -280,7 +280,7 @@ const ObjectInfo* ObjectIndex_XML::getObjectInfo( const ObjectId id ) ...@@ -280,7 +280,7 @@ const ObjectInfo* ObjectIndex_XML::getObjectInfo( const ObjectId id )
return NULL; return NULL;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_XML::getObjectInfo( const std::string& name ) const ObjectInfo* ObjectIndex_XML::getObjectInfo( const std::string& name ) const
{ {
auto it = mok.find(name); auto it = mok.find(name);
......
...@@ -43,7 +43,7 @@ ObjectIndex_idXML::~ObjectIndex_idXML() ...@@ -43,7 +43,7 @@ ObjectIndex_idXML::~ObjectIndex_idXML()
{ {
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
ObjectId ObjectIndex_idXML::getIdByName( const string& name ) ObjectId ObjectIndex_idXML::getIdByName( const string& name ) const
{ {
auto it = mok.find(name); auto it = mok.find(name);
...@@ -53,7 +53,7 @@ ObjectId ObjectIndex_idXML::getIdByName( const string& name ) ...@@ -53,7 +53,7 @@ ObjectId ObjectIndex_idXML::getIdByName( const string& name )
return DefaultObjectId; return DefaultObjectId;
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
string ObjectIndex_idXML::getMapName( const ObjectId id ) string ObjectIndex_idXML::getMapName( const ObjectId id ) const
{ {
auto it = omap.find(id); auto it = omap.find(id);
...@@ -63,7 +63,7 @@ string ObjectIndex_idXML::getMapName( const ObjectId id ) ...@@ -63,7 +63,7 @@ string ObjectIndex_idXML::getMapName( const ObjectId id )
return ""; return "";
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
string ObjectIndex_idXML::getTextName( const ObjectId id ) string ObjectIndex_idXML::getTextName( const ObjectId id ) const
{ {
auto it = omap.find(id); auto it = omap.find(id);
...@@ -78,7 +78,7 @@ std::ostream& operator<<(std::ostream& os, ObjectIndex_idXML& oi ) ...@@ -78,7 +78,7 @@ std::ostream& operator<<(std::ostream& os, ObjectIndex_idXML& oi )
return oi.printMap(os); return oi.printMap(os);
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
std::ostream& ObjectIndex_idXML::printMap( std::ostream& os ) std::ostream& ObjectIndex_idXML::printMap( std::ostream& os ) const
{ {
os << "size: " << omap.size() << endl; os << "size: " << omap.size() << endl;
...@@ -235,7 +235,7 @@ void ObjectIndex_idXML::read_nodes( const std::shared_ptr<UniXML>& xml, const st ...@@ -235,7 +235,7 @@ void ObjectIndex_idXML::read_nodes( const std::shared_ptr<UniXML>& xml, const st
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const ObjectId id ) const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const ObjectId id ) const
{ {
auto it = omap.find(id); auto it = omap.find(id);
...@@ -245,7 +245,7 @@ const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const ObjectId id ) ...@@ -245,7 +245,7 @@ const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const ObjectId id )
return NULL; return NULL;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const std::string& name ) const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const std::string& name ) const
{ {
auto it = mok.find(name); auto it = mok.find(name);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <signal.h> #include <signal.h>
#include <sstream> #include <sstream>
#include <fstream>
#include <condition_variable> #include <condition_variable>
#include <thread> #include <thread>
...@@ -33,6 +34,7 @@ ...@@ -33,6 +34,7 @@
// -------------------- // --------------------
#include <execinfo.h> #include <execinfo.h>
#include <cxxabi.h> #include <cxxabi.h>
#include <dlfcn.h>
#include <iomanip> #include <iomanip>
// -------------------- // --------------------
...@@ -96,6 +98,7 @@ static std::atomic_bool g_term = ATOMIC_VAR_INIT(0); ...@@ -96,6 +98,7 @@ static std::atomic_bool g_term = ATOMIC_VAR_INIT(0);
static std::atomic_bool g_done = ATOMIC_VAR_INIT(0); static std::atomic_bool g_done = ATOMIC_VAR_INIT(0);
static std::atomic_bool g_work_stopped = ATOMIC_VAR_INIT(0); static std::atomic_bool g_work_stopped = ATOMIC_VAR_INIT(0);
static std::atomic_int g_signo = ATOMIC_VAR_INIT(0); static std::atomic_int g_signo = ATOMIC_VAR_INIT(0);
static std::atomic_bool g_trace_done = ATOMIC_VAR_INIT(0);
static std::mutex g_workmutex; static std::mutex g_workmutex;
static std::mutex g_termmutex; static std::mutex g_termmutex;
...@@ -104,12 +107,15 @@ static std::mutex g_finimutex; ...@@ -104,12 +107,15 @@ static std::mutex g_finimutex;
static std::condition_variable g_finievent; static std::condition_variable g_finievent;
static std::mutex g_donemutex; static std::mutex g_donemutex;
static std::condition_variable g_doneevent; static std::condition_variable g_doneevent;
static std::mutex g_trace_donemutex;
static std::condition_variable g_trace_doneevent;
static std::shared_ptr<std::thread> g_term_thread; static std::shared_ptr<std::thread> g_term_thread;
static std::shared_ptr<std::thread> g_fini_thread; static std::shared_ptr<std::thread> g_fini_thread;
static std::shared_ptr<std::thread> g_kill_thread; static std::shared_ptr<std::thread> g_kill_thread;
static const int TERMINATE_TIMEOUT = 3; // время отведенное на завершение процесса [сек] static const int TERMINATE_TIMEOUT_SEC = 3; // время отведенное на завершение процесса [сек]
static const int THREAD_TERMINATE_PAUSE = 500; // [мсек] пауза при завершении потока (см. work()) static const int THREAD_TERMINATE_PAUSE = 500; // [мсек] пауза при завершении потока (см. work())
static const int KILL_TIMEOUT = 8; static const int KILL_TIMEOUT_SEC = 8;
static pid_t g_stacktrace_proc_pid = 0; // pid процесса делающего stack trace (для защиты от зависания)
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// Чтобы не выделять память во время "вылета", // Чтобы не выделять память во время "вылета",
// выделим необходимое для stacktrace зараннее // выделим необходимое для stacktrace зараннее
...@@ -117,8 +123,11 @@ static const int KILL_TIMEOUT = 8; ...@@ -117,8 +123,11 @@ static const int KILL_TIMEOUT = 8;
#define FUNCNAMESIZE 256 #define FUNCNAMESIZE 256
#define MAXFRAMES 64 #define MAXFRAMES 64
// выделение специального стека заранее // выделение специального стека заранее
static char g_stack_body[MAXFRAMES*FUNCNAMESIZE+500]; // +60 - это на всякие переменные при обработке stack trace и т.п.
static char g_stack_body[(MAXFRAMES + 60)*FUNCNAMESIZE];
static char trace_buf[10000];
static stack_t g_sigseg_stack; static stack_t g_sigseg_stack;
static void on_stacktrace_timeout(); // поток для защиты от зависания "процесса создания stack trace"
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// код функции printStackTrace взят с https://oroboro.com/stack-trace-on-crash/ // код функции printStackTrace взят с https://oroboro.com/stack-trace-on-crash/
// будет работать только под LINUX (т.к. используется backtrace) // будет работать только под LINUX (т.к. используется backtrace)
...@@ -158,70 +167,37 @@ static inline void printStackTrace() ...@@ -158,70 +167,37 @@ static inline void printStackTrace()
TRACELOG << std::left; TRACELOG << std::left;
size_t funcnamesize = FUNCNAMESIZE;
char funcname[FUNCNAMESIZE];
// iterate over the returned symbol lines. skip the first, it is the // iterate over the returned symbol lines. skip the first, it is the
// address of this function. // address of this function.
for ( unsigned int i = 4; i < addrlen; i++ ) for ( unsigned int i = 4; i < addrlen; i++ )
{ {
char* begin_name = NULL; Dl_info dl;
char* begin_offset = NULL;
char* end_offset = NULL;
// find parentheses and +address offset surrounding the mangled name
for ( char* p = symbollist[i]; *p; ++p )
{
if ( *p == '(' )
begin_name = p;
else if ( *p == '+' )
begin_offset = p;
else if ( *p == ')' && ( begin_offset || begin_name ))
end_offset = p;
}
if ( begin_name && end_offset && ( begin_name < end_offset ))
{
*begin_name++ = '\0';
*end_offset++ = '\0';
if ( begin_offset ) if(!dladdr(addrlist[i], &dl))
*begin_offset++ = '\0'; break;
// mangled name is now in [begin_name, begin_offset) and caller const char* sym = dl.dli_sname;
// offset in [begin_offset, end_offset). now apply
// __cxa_demangle():
int status = 0; int status = 0;
char* ret = abi::__cxa_demangle( begin_name, funcname, char* ret = abi::__cxa_demangle( sym, NULL, 0, &status );
&funcnamesize, &status );
char* fname = begin_name;
if ( status == 0 ) if( status == 0 && ret )
fname = ret; sym = ret;
if ( begin_offset ) if( dl.dli_fname && sym )
{ {
TRACELOG << setw(30) << symbollist[i] TRACELOG << setw(30) << symbollist[i]
<< " ( " << setw(40) << fname << " ( " << setw(40) << dl.dli_fname
<< " +" << setw(6) << begin_offset << " ): " << sym
<< ") " << end_offset << endl << flush;
<< endl;
}
else
{
TRACELOG << setw(30) << symbollist[i]
<< " ( " << setw(40) << fname
<< " " << setw(6) << ""
<< ") " << end_offset
<< endl;
}
} }
else else
{ {
// couldn't parse the line? print the whole line. TRACELOG << setw(30) << symbollist[i] << endl << flush;
TRACELOG << setw(40) << symbollist[i] << endl;
} }
if( ret )
std::free(ret);
} }
std::free(symbollist); std::free(symbollist);
...@@ -239,15 +215,9 @@ bool gdb_print_trace() ...@@ -239,15 +215,9 @@ bool gdb_print_trace()
char pid_buf[30]; char pid_buf[30];
sprintf(pid_buf, "%d", getpid()); sprintf(pid_buf, "%d", getpid());
char name_buf[512]; char name_buf[512];
name_buf[readlink("/proc/self/exe", name_buf, 511)]=0; name_buf[readlink("/proc/self/exe", name_buf, 511)] = 0;
// Чтобы перенаправить вывод в свой log, делаем pipe TRACELOG << "stack trace: for " << name_buf << " pid=" << pid_buf << endl;
int cp[2]; /* Child to parent pipe */
if( pipe(cp) < 0)
{
perror("Can't make pipe");
return false;
}
int child_pid = fork(); int child_pid = fork();
...@@ -257,18 +227,13 @@ bool gdb_print_trace() ...@@ -257,18 +227,13 @@ bool gdb_print_trace()
return false; return false;
} }
if (!child_pid) { if( child_pid == 0 ) // CHILD
{
close(cp[0]); msleep(300); // пауза чтобы родитель успел подготовиться..
close( fileno(stdout) ); dup2(2, 1); // redirect output to stderr
dup2(cp[1], fileno(stdout));
close( fileno(stderr) );
dup2(fileno(stdout), fileno(stderr));
TRACELOG << "stack trace for " << name_buf << " pid=" << pid_buf << endl;
if( g_act && !g_act->getAbortScript().empty() ) if( g_act && !g_act->getAbortScript().empty() )
{ {
TRACELOG << "run abort script " << g_act->getAbortScript() << endl;
execlp(g_act->getAbortScript().c_str(), g_act->getAbortScript().c_str(), name_buf, pid_buf, NULL); execlp(g_act->getAbortScript().c_str(), g_act->getAbortScript().c_str(), name_buf, pid_buf, NULL);
} }
else else
...@@ -278,34 +243,50 @@ bool gdb_print_trace() ...@@ -278,34 +243,50 @@ bool gdb_print_trace()
execlp("gdb", "gdb", "--batch", "-n", "-ex", "thread apply all bt", name_buf, pid_buf, NULL); execlp("gdb", "gdb", "--batch", "-n", "-ex", "thread apply all bt", name_buf, pid_buf, NULL);
} }
//abort(); /* If gdb failed to start */ // abort(); /* If gdb failed to start */
return false; return false;
} }
else else // PARENT
{ {
close(cp[1]); if( g_act && !g_act->getAbortScript().empty() )
char buf[5000];
while( true )
{ {
ssize_t r = ::read(cp[0], &buf, sizeof(buf) - 1 ); TRACELOG << "stack trace: run script " << g_act->getAbortScript() << endl;
}
if( r > 0 ) g_stacktrace_proc_pid = child_pid;
{ g_trace_done = false;
buf[r] = '\0'; std::thread t(on_stacktrace_timeout); // запускаем поток "защищающий" от зависания процесса создания stack trace
TRACELOG << buf;
continue;
}
break; waitpid(child_pid, NULL, 0);
}
waitpid(child_pid,NULL,0); g_trace_done = true;
g_trace_doneevent.notify_all();
t.join();
} }
TRACELOG << "-----------------------------------------" << endl << flush; TRACELOG << "-----------------------------------------" << endl << flush;
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
static void on_stacktrace_timeout()
{
ulogsys << "****** STACK TRACE guard thread start (for pid=" << g_stacktrace_proc_pid << ") ******" << endl << flush;
std::unique_lock<std::mutex> lk(g_trace_donemutex);
g_trace_doneevent.wait_for(lk, std::chrono::milliseconds(KILL_TIMEOUT_SEC * 1000), []()
{
return (g_trace_done == true);
} );
if( !g_trace_done )
{
ulogsys << "****** STACK TRACE TIMEOUT.. (kill process) *******" << endl << flush;
kill(g_stacktrace_proc_pid, SIGKILL);
}
else
ulogsys << "****** STACK TRACE guard thread finish ******" << endl << flush;
}
// ------------------------------------------------------------------------------------------
static void activator_terminate( int signo ) static void activator_terminate( int signo )
{ {
if( g_term ) if( g_term )
...@@ -357,21 +338,21 @@ void finished_thread() ...@@ -357,21 +338,21 @@ void finished_thread()
g_finished = true; g_finished = true;
std::unique_lock<std::mutex> lkw(g_workmutex); std::unique_lock<std::mutex> lkw(g_workmutex);
g_finievent.wait_for(lkw, std::chrono::milliseconds(TERMINATE_TIMEOUT * 1000), []() g_finievent.wait_for(lkw, std::chrono::milliseconds(TERMINATE_TIMEOUT_SEC * 1000), []()
{ {
return (g_work_stopped == true); return (g_work_stopped == true);
} ); } );
ulogsys << "****** FINISHED END ****" << endl << flush; ulogsys << "****** FINISHED END ****" << endl << flush;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void kill_thread() void on_finish_timeout()
{ {
std::unique_lock<std::mutex> lk(g_donemutex); std::unique_lock<std::mutex> lk(g_donemutex);
if( g_done ) if( g_done )
return; return;
g_doneevent.wait_for(lk, std::chrono::milliseconds(KILL_TIMEOUT * 1000), []() g_doneevent.wait_for(lk, std::chrono::milliseconds(KILL_TIMEOUT_SEC * 1000), []()
{ {
return (g_done == true); return (g_done == true);
} ); } );
...@@ -411,7 +392,7 @@ void terminate_thread() ...@@ -411,7 +392,7 @@ void terminate_thread()
{ {
std::unique_lock<std::mutex> lk(g_donemutex); std::unique_lock<std::mutex> lk(g_donemutex);
g_done = false; g_done = false;
g_kill_thread = make_shared<std::thread>(kill_thread); g_kill_thread = make_shared<std::thread>(on_finish_timeout);
} }
if( g_act ) if( g_act )
...@@ -542,7 +523,7 @@ void UniSetActivator::init() ...@@ -542,7 +523,7 @@ void UniSetActivator::init()
_noUseGdbForStackTrace = ( findArgParam("--uniset-no-use-gdb-for-stacktrace", conf->getArgc(), conf->getArgv()) != -1 ); _noUseGdbForStackTrace = ( findArgParam("--uniset-no-use-gdb-for-stacktrace", conf->getArgc(), conf->getArgv()) != -1 );
abortScript = conf->getArgParam("--uniset-abort-script",""); abortScript = conf->getArgParam("--uniset-abort-script", "");
orb = conf->getORB(); orb = conf->getORB();
CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
...@@ -717,11 +698,11 @@ void UniSetActivator::work() ...@@ -717,11 +698,11 @@ void UniSetActivator::work()
try try
{ {
if( orbthr ) if( orbthr )
thpid = orbthr->getTID(); thid = orbthr->getTID();
else else
thpid = getpid(); thid = getpid();
g_term_thread = make_shared<std::thread>(terminate_thread ); g_term_thread = make_shared<std::thread>(terminate_thread);
omniORB::setMainThread(); omniORB::setMainThread();
orb->run(); orb->run();
} }
...@@ -819,14 +800,16 @@ void UniSetActivator::set_signals(bool ask) ...@@ -819,14 +800,16 @@ void UniSetActivator::set_signals(bool ask)
sigemptyset(&act.sa_mask); sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGSEGV); sigaddset(&act.sa_mask, SIGSEGV);
act.sa_flags = 0; act.sa_flags = 0;
act.sa_flags |= SA_RESTART; // act.sa_flags |= SA_RESTART;
act.sa_flags |= SA_RESETHAND; act.sa_flags |= SA_RESETHAND;
#if 1
g_sigseg_stack.ss_sp = g_stack_body; g_sigseg_stack.ss_sp = g_stack_body;
g_sigseg_stack.ss_flags = SS_ONSTACK; g_sigseg_stack.ss_flags = SS_ONSTACK;
g_sigseg_stack.ss_size = sizeof(g_stack_body); g_sigseg_stack.ss_size = sizeof(g_stack_body);
assert(!sigaltstack(&g_sigseg_stack, nullptr)); assert(!sigaltstack(&g_sigseg_stack, nullptr));
act.sa_flags |= SA_ONSTACK; act.sa_flags |= SA_ONSTACK;
#endif
if(ask) if(ask)
act.sa_handler = activator_terminate_with_calltrace; act.sa_handler = activator_terminate_with_calltrace;
......
...@@ -130,6 +130,7 @@ void UniSetObject::initObject() ...@@ -130,6 +130,7 @@ void UniSetObject::initObject()
auto conf = uniset_conf(); auto conf = uniset_conf();
int sz = conf->getArgPInt("--uniset-object-size-message-queue", conf->getField("SizeOfMessageQueue"), 1000); int sz = conf->getArgPInt("--uniset-object-size-message-queue", conf->getField("SizeOfMessageQueue"), 1000);
if( sz > 0 ) if( sz > 0 )
setMaxSizeOfMessageQueue(sz); setMaxSizeOfMessageQueue(sz);
...@@ -187,6 +188,7 @@ VoidMessagePtr UniSetObject::receiveMessage() ...@@ -187,6 +188,7 @@ VoidMessagePtr UniSetObject::receiveMessage()
VoidMessagePtr UniSetObject::waitMessage( timeout_t timeMS ) VoidMessagePtr UniSetObject::waitMessage( timeout_t timeMS )
{ {
auto m = receiveMessage(); auto m = receiveMessage();
if( m ) if( m )
return m; return m;
...@@ -323,6 +325,7 @@ void UniSetObject::setThreadPriority( int p ) ...@@ -323,6 +325,7 @@ void UniSetObject::setThreadPriority( int p )
void UniSetObject::push( const TransportMessage& tm ) void UniSetObject::push( const TransportMessage& tm )
{ {
auto vm = make_shared<VoidMessage>(tm); auto vm = make_shared<VoidMessage>(tm);
if( vm->priority == Message::Medium ) if( vm->priority == Message::Medium )
mqueueMedium.push(vm); mqueueMedium.push(vm);
else if( vm->priority == Message::High ) else if( vm->priority == Message::High )
...@@ -556,6 +559,7 @@ void UniSetObject::callback() ...@@ -556,6 +559,7 @@ void UniSetObject::callback()
try try
{ {
auto m = waitMessage(sleepTime); auto m = waitMessage(sleepTime);
if( m ) if( m )
processingMessage(m.get()); processingMessage(m.get());
......
...@@ -32,7 +32,7 @@ void EventLoopServer::evrun( bool thread ) ...@@ -32,7 +32,7 @@ void EventLoopServer::evrun( bool thread )
thr = make_shared<std::thread>( [ = ] { defaultLoop(); } ); thr = make_shared<std::thread>( [ = ] { defaultLoop(); } );
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
bool EventLoopServer::evIsActive() bool EventLoopServer::evIsActive() const
{ {
return isrunning; return isrunning;
} }
......
...@@ -137,7 +137,7 @@ timeout_t LT_Object::getTimeInterval( TimerId timerid ) ...@@ -137,7 +137,7 @@ timeout_t LT_Object::getTimeInterval( TimerId timerid )
return 0; return 0;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
timeout_t LT_Object::getTimeLeft(TimerId timerid) timeout_t LT_Object::getTimeLeft( TimerId timerid )
{ {
// lock // lock
uniset_rwmutex_rlock lock(lstMutex); uniset_rwmutex_rlock lock(lstMutex);
......
...@@ -44,26 +44,28 @@ void MQAtomic::push( const VoidMessagePtr& vm ) ...@@ -44,26 +44,28 @@ void MQAtomic::push( const VoidMessagePtr& vm )
if( wpos < rpos ) if( wpos < rpos )
{ {
// только надо привести к одному масштабу // только надо привести к одному масштабу
unsigned long w = wpos%SizeOfMessageQueue; unsigned long w = wpos % SizeOfMessageQueue;
unsigned long r = rpos%SizeOfMessageQueue; unsigned long r = rpos % SizeOfMessageQueue;
if( lostStrategy == lostNewData && (r-w) >= SizeOfMessageQueue ) if( lostStrategy == lostNewData && (r - w) >= SizeOfMessageQueue )
{ {
stCountOfLostMessages++; stCountOfLostMessages++;
return; return;
} }
} }
// ----------------------------------------------- // -----------------------------------------------
// сперва надо сдвинуть счётчик (чтобы следующий поток уже писал в новое место) // сперва надо сдвинуть счётчик (чтобы следующий поток уже писал в новое место)
unsigned long w = wpos.fetch_add(1); unsigned long w = wpos.fetch_add(1);
// а потом уже добавлять новое сообщение в "зарезервированное" место // а потом уже добавлять новое сообщение в "зарезервированное" место
mqueue[w%SizeOfMessageQueue] = vm; mqueue[w % SizeOfMessageQueue] = vm;
qpos.fetch_add(1); // теперь увеличиваем реальное количество элементов в очереди qpos.fetch_add(1); // теперь увеличиваем реальное количество элементов в очереди
// ведём статистику // ведём статистику
size_t sz = qpos - rpos; size_t sz = qpos - rpos;
if( sz > stMaxQueueMessages ) if( sz > stMaxQueueMessages )
stMaxQueueMessages = sz; stMaxQueueMessages = sz;
} }
...@@ -90,7 +92,7 @@ VoidMessagePtr MQAtomic::top() ...@@ -90,7 +92,7 @@ VoidMessagePtr MQAtomic::top()
{ {
// сперва надо сдвинуть счётчик (чтобы следующий поток уже работал с следующим значением) // сперва надо сдвинуть счётчик (чтобы следующий поток уже работал с следующим значением)
unsigned long r = rpos.fetch_add(1); unsigned long r = rpos.fetch_add(1);
return mqueue[r%SizeOfMessageQueue]; return mqueue[r % SizeOfMessageQueue];
} }
// Если rpos > qpos, значит qpos уже перешёл через максимум // Если rpos > qpos, значит qpos уже перешёл через максимум
...@@ -98,8 +100,8 @@ VoidMessagePtr MQAtomic::top() ...@@ -98,8 +100,8 @@ VoidMessagePtr MQAtomic::top()
if( rpos > qpos ) // делаем if каждый раз, т.к. qpos может уже поменяться в параллельном потоке if( rpos > qpos ) // делаем if каждый раз, т.к. qpos может уже поменяться в параллельном потоке
{ {
// приводим к одному масштабу // приводим к одному масштабу
unsigned long w = qpos%SizeOfMessageQueue; unsigned long w = qpos % SizeOfMessageQueue;
unsigned long r = rpos%SizeOfMessageQueue; unsigned long r = rpos % SizeOfMessageQueue;
if( lostStrategy == lostOldData && (r - w) >= SizeOfMessageQueue ) if( lostStrategy == lostOldData && (r - w) >= SizeOfMessageQueue )
{ {
...@@ -109,13 +111,13 @@ VoidMessagePtr MQAtomic::top() ...@@ -109,13 +111,13 @@ VoidMessagePtr MQAtomic::top()
// продолжаем читать как обычно // продолжаем читать как обычно
r = rpos.fetch_add(1); r = rpos.fetch_add(1);
return mqueue[r%SizeOfMessageQueue]; return mqueue[r % SizeOfMessageQueue];
} }
return nullptr; return nullptr;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
size_t MQAtomic::size() size_t MQAtomic::size() const
{ {
// т.к. rpos корректируется только при фактическом вызое top() // т.к. rpos корректируется только при фактическом вызое top()
// то тут приходиться смотреть если у нас переполнение // то тут приходиться смотреть если у нас переполнение
...@@ -127,7 +129,7 @@ size_t MQAtomic::size() ...@@ -127,7 +129,7 @@ size_t MQAtomic::size()
return (qpos - rpos); return (qpos - rpos);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool MQAtomic::empty() bool MQAtomic::empty() const
{ {
return (qpos == rpos); return (qpos == rpos);
} }
...@@ -141,7 +143,7 @@ void MQAtomic::setMaxSizeOfMessageQueue( size_t s ) ...@@ -141,7 +143,7 @@ void MQAtomic::setMaxSizeOfMessageQueue( size_t s )
} }
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
size_t MQAtomic::getMaxSizeOfMessageQueue() size_t MQAtomic::getMaxSizeOfMessageQueue() const
{ {
return SizeOfMessageQueue; return SizeOfMessageQueue;
} }
...@@ -155,7 +157,8 @@ void MQAtomic::mqFill( const VoidMessagePtr& v ) ...@@ -155,7 +157,8 @@ void MQAtomic::mqFill( const VoidMessagePtr& v )
{ {
mqueue.reserve(SizeOfMessageQueue); mqueue.reserve(SizeOfMessageQueue);
mqueue.clear(); mqueue.clear();
for( size_t i=0; i<SizeOfMessageQueue; i++ )
for( size_t i = 0; i < SizeOfMessageQueue; i++ )
mqueue.push_back(v); mqueue.push_back(v);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
......
...@@ -36,9 +36,10 @@ void MQMutex::push( const VoidMessagePtr& vm ) ...@@ -36,9 +36,10 @@ void MQMutex::push( const VoidMessagePtr& vm )
// проверяем переполнение, только если стратегия "терять новые данные" // проверяем переполнение, только если стратегия "терять новые данные"
// иначе нет смысла проверять, а можно просто писать новые данные затирая старые // иначе нет смысла проверять, а можно просто писать новые данные затирая старые
// (sz+1) - т.к мы смотрим есть ли место для новых данных // (sz+1) - т.к мы смотрим есть ли место для новых данных
if( (sz+1) > SizeOfMessageQueue ) if( (sz + 1) > SizeOfMessageQueue )
{ {
stCountOfLostMessages++; stCountOfLostMessages++;
if( lostStrategy == lostNewData ) if( lostStrategy == lostNewData )
return; return;
...@@ -49,6 +50,7 @@ void MQMutex::push( const VoidMessagePtr& vm ) ...@@ -49,6 +50,7 @@ void MQMutex::push( const VoidMessagePtr& vm )
mqueue.push_back(vm); mqueue.push_back(vm);
sz++; sz++;
if( sz > stMaxQueueMessages ) if( sz > stMaxQueueMessages )
stMaxQueueMessages = sz; stMaxQueueMessages = sz;
} }
...@@ -82,7 +84,7 @@ void MQMutex::setMaxSizeOfMessageQueue( size_t s ) ...@@ -82,7 +84,7 @@ void MQMutex::setMaxSizeOfMessageQueue( size_t s )
SizeOfMessageQueue = s; SizeOfMessageQueue = s;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
size_t MQMutex::getMaxSizeOfMessageQueue() size_t MQMutex::getMaxSizeOfMessageQueue() const
{ {
return SizeOfMessageQueue; return SizeOfMessageQueue;
} }
......
...@@ -211,11 +211,11 @@ namespace UniSetTypes ...@@ -211,11 +211,11 @@ namespace UniSetTypes
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
ConfirmMessage::ConfirmMessage( UniSetTypes::ObjectId in_sensor_id, ConfirmMessage::ConfirmMessage( UniSetTypes::ObjectId in_sensor_id,
double in_value, double in_value,
time_t in_time, time_t in_time,
time_t in_time_usec, time_t in_time_usec,
time_t in_confirm, time_t in_confirm,
Priority in_priority ): Priority in_priority ):
sensor_id(in_sensor_id), sensor_id(in_sensor_id),
value(in_value), value(in_value),
time(in_time), time(in_time),
......
...@@ -16,13 +16,13 @@ const size_t COUNT = 1000000; // сколько сообщений помест ...@@ -16,13 +16,13 @@ const size_t COUNT = 1000000; // сколько сообщений помест
// поток записи // поток записи
void mq_write_thread() void mq_write_thread()
{ {
SensorMessage smsg(100,2); SensorMessage smsg(100, 2);
TransportMessage tm( std::move(smsg.transport_msg()) ); TransportMessage tm( std::move(smsg.transport_msg()) );
auto vm = make_shared<VoidMessage>(tm); auto vm = make_shared<VoidMessage>(tm);
msleep(100); msleep(100);
for( size_t i=0; i<COUNT; i++ ) for( size_t i = 0; i < COUNT; i++ )
{ {
mq.push(vm); mq.push(vm);
} }
...@@ -40,6 +40,7 @@ int one_test() ...@@ -40,6 +40,7 @@ int one_test()
while( rnum < COUNT ) while( rnum < COUNT )
{ {
auto m = mq.top(); auto m = mq.top();
if( m ) if( m )
rnum++; rnum++;
} }
...@@ -59,16 +60,16 @@ int main(int argc, const char** argv) ...@@ -59,16 +60,16 @@ int main(int argc, const char** argv)
int tnum = 10; int tnum = 10;
// чтобы не происходило переполнение // чтобы не происходило переполнение
mq.setMaxSizeOfMessageQueue(COUNT+1); mq.setMaxSizeOfMessageQueue(COUNT + 1);
// сперва просто проверка что очередь работает. // сперва просто проверка что очередь работает.
{ {
SensorMessage sm(100,2); SensorMessage sm(100, 2);
TransportMessage tm( std::move(sm.transport_msg()) ); TransportMessage tm( std::move(sm.transport_msg()) );
auto vm = make_shared<VoidMessage>(tm); auto vm = make_shared<VoidMessage>(tm);
mq.push(vm); mq.push(vm);
auto msg = mq.top(); auto msg = mq.top();
assert( msg!=nullptr ); assert( msg != nullptr );
SensorMessage sm2( msg.get() ); SensorMessage sm2( msg.get() );
assert( sm.id == sm2.id ); assert( sm.id == sm2.id );
} }
...@@ -76,14 +77,15 @@ int main(int argc, const char** argv) ...@@ -76,14 +77,15 @@ int main(int argc, const char** argv)
vector<int> res; vector<int> res;
res.reserve(tnum); res.reserve(tnum);
for( int i=0; i<tnum; i++ ) for( int i = 0; i < tnum; i++ )
{ {
res.push_back(one_test()); res.push_back(one_test());
} }
// вычисляем среднее // вычисляем среднее
int sum = 0; int sum = 0;
for( auto&& r: res )
for( auto && r : res )
sum += r; sum += r;
float avg = (float)sum / tnum; float avg = (float)sum / tnum;
......
...@@ -12,9 +12,9 @@ class TestUObject: ...@@ -12,9 +12,9 @@ class TestUObject:
public: public:
TestUObject( UniSetTypes::ObjectId id, xmlNode* cnode ): TestUObject( UniSetTypes::ObjectId id, xmlNode* cnode ):
UniSetObject(id){} UniSetObject(id) {}
virtual ~TestUObject(){}; virtual ~TestUObject() {};
// специальные функции для проведения тестирования // специальные функции для проведения тестирования
inline VoidMessagePtr getOneMessage() inline VoidMessagePtr getOneMessage()
...@@ -28,7 +28,7 @@ class TestUObject: ...@@ -28,7 +28,7 @@ class TestUObject:
} }
protected: protected:
TestUObject(){}; TestUObject() {};
}; };
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#endif // TestUObject_H_ #endif // TestUObject_H_
......
...@@ -11,9 +11,9 @@ ...@@ -11,9 +11,9 @@
#define TEST_MQ_ATOMIC 1 #define TEST_MQ_ATOMIC 1
#ifdef TEST_MQ_ATOMIC #ifdef TEST_MQ_ATOMIC
typedef MQAtomic UMessageQueue; typedef MQAtomic UMessageQueue;
#else #else
typedef MQMutex UMessageQueue; typedef MQMutex UMessageQueue;
#endif #endif
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -44,7 +44,7 @@ using namespace UniSetTypes; ...@@ -44,7 +44,7 @@ using namespace UniSetTypes;
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
static void pushMessage( UMessageQueue& mq, long id ) static void pushMessage( UMessageQueue& mq, long id )
{ {
SensorMessage sm(id,id); SensorMessage sm(id, id);
sm.consumer = id; // чтобы хоть как-то идентифицировать сообщений, используем поле consumer sm.consumer = id; // чтобы хоть как-то идентифицировать сообщений, используем поле consumer
TransportMessage tm( std::move(sm.transport_msg()) ); TransportMessage tm( std::move(sm.transport_msg()) );
auto vm = make_shared<VoidMessage>(tm); auto vm = make_shared<VoidMessage>(tm);
...@@ -66,10 +66,10 @@ TEST_CASE( "UMessageQueue: simple push/top", "[mqueue]" ) ...@@ -66,10 +66,10 @@ TEST_CASE( "UMessageQueue: simple push/top", "[mqueue]" )
UMessageQueue mq; UMessageQueue mq;
pushMessage(mq,100); pushMessage(mq, 100);
auto msg = mq.top(); auto msg = mq.top();
REQUIRE( msg!=nullptr ); REQUIRE( msg != nullptr );
REQUIRE( msg->consumer == 100 ); REQUIRE( msg->consumer == 100 );
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -82,21 +82,21 @@ TEST_CASE( "UMessageQueue: overflow (lost old data)", "[mqueue]" ) ...@@ -82,21 +82,21 @@ TEST_CASE( "UMessageQueue: overflow (lost old data)", "[mqueue]" )
mq.setLostStrategy( UMessageQueue::lostOldData ); mq.setLostStrategy( UMessageQueue::lostOldData );
pushMessage(mq,100); pushMessage(mq, 100);
REQUIRE( mq.size() == 1 ); REQUIRE( mq.size() == 1 );
pushMessage(mq,110); pushMessage(mq, 110);
REQUIRE( mq.size() == 2 ); REQUIRE( mq.size() == 2 );
pushMessage(mq,120); pushMessage(mq, 120);
REQUIRE( mq.size() == 2 ); REQUIRE( mq.size() == 2 );
auto msg = mq.top(); auto msg = mq.top();
REQUIRE( msg!=nullptr ); REQUIRE( msg != nullptr );
REQUIRE( msg->consumer == 110 ); REQUIRE( msg->consumer == 110 );
msg = mq.top(); msg = mq.top();
REQUIRE( msg!=nullptr ); REQUIRE( msg != nullptr );
REQUIRE( msg->consumer == 120 ); REQUIRE( msg->consumer == 120 );
REQUIRE( mq.getCountOfLostMessages() == 1 ); REQUIRE( mq.getCountOfLostMessages() == 1 );
...@@ -111,31 +111,31 @@ TEST_CASE( "UMessageQueue: overflow (lost new data)", "[mqueue]" ) ...@@ -111,31 +111,31 @@ TEST_CASE( "UMessageQueue: overflow (lost new data)", "[mqueue]" )
mq.setLostStrategy( UMessageQueue::lostNewData ); mq.setLostStrategy( UMessageQueue::lostNewData );
pushMessage(mq,100); pushMessage(mq, 100);
REQUIRE( mq.size() == 1 ); REQUIRE( mq.size() == 1 );
pushMessage(mq,110); pushMessage(mq, 110);
REQUIRE( mq.size() == 2 ); REQUIRE( mq.size() == 2 );
pushMessage(mq,120); pushMessage(mq, 120);
REQUIRE( mq.size() == 2 ); REQUIRE( mq.size() == 2 );
REQUIRE( mq.getCountOfLostMessages() == 1 ); REQUIRE( mq.getCountOfLostMessages() == 1 );
pushMessage(mq,130); pushMessage(mq, 130);
REQUIRE( mq.size() == 2 ); REQUIRE( mq.size() == 2 );
REQUIRE( mq.getCountOfLostMessages() == 2 ); REQUIRE( mq.getCountOfLostMessages() == 2 );
auto msg = mq.top(); auto msg = mq.top();
REQUIRE( msg!=nullptr ); REQUIRE( msg != nullptr );
REQUIRE( msg->consumer == 100 ); REQUIRE( msg->consumer == 100 );
msg = mq.top(); msg = mq.top();
REQUIRE( msg!=nullptr ); REQUIRE( msg != nullptr );
REQUIRE( msg->consumer == 110 ); REQUIRE( msg->consumer == 110 );
msg = mq.top(); msg = mq.top();
REQUIRE( msg==nullptr ); REQUIRE( msg == nullptr );
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
TEST_CASE( "UMessageQueue: many read", "[mqueue]" ) TEST_CASE( "UMessageQueue: many read", "[mqueue]" )
...@@ -146,17 +146,17 @@ TEST_CASE( "UMessageQueue: many read", "[mqueue]" ) ...@@ -146,17 +146,17 @@ TEST_CASE( "UMessageQueue: many read", "[mqueue]" )
mq.setMaxSizeOfMessageQueue(1); mq.setMaxSizeOfMessageQueue(1);
mq.setLostStrategy( UMessageQueue::lostNewData ); mq.setLostStrategy( UMessageQueue::lostNewData );
pushMessage(mq,100); pushMessage(mq, 100);
REQUIRE( mq.size() == 1 ); REQUIRE( mq.size() == 1 );
auto msg = mq.top(); auto msg = mq.top();
REQUIRE( msg!=nullptr ); REQUIRE( msg != nullptr );
REQUIRE( msg->consumer == 100 ); REQUIRE( msg->consumer == 100 );
for( int i=0; i<5; i++ ) for( int i = 0; i < 5; i++ )
{ {
auto msg = mq.top(); auto msg = mq.top();
REQUIRE( msg==nullptr ); REQUIRE( msg == nullptr );
} }
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -171,15 +171,16 @@ TEST_CASE( "UMessageQueue: correct operation", "[mqueue]" ) ...@@ -171,15 +171,16 @@ TEST_CASE( "UMessageQueue: correct operation", "[mqueue]" )
const size_t num = 1000; const size_t num = 1000;
UMessageQueue mq; UMessageQueue mq;
mq.setMaxSizeOfMessageQueue(num+1); mq.setMaxSizeOfMessageQueue(num + 1);
size_t rnum = 0; size_t rnum = 0;
for( size_t i=0; i<num; i++ )
for( size_t i = 0; i < num; i++ )
{ {
pushMessage(mq,i); pushMessage(mq, i);
// каждые 50 читатем, имитируя реальную работу (чтение между записью) // каждые 50 читатем, имитируя реальную работу (чтение между записью)
if( i%50 ) if( i % 50 )
{ {
auto m = mq.top(); auto m = mq.top();
REQUIRE( m->consumer == rnum ); REQUIRE( m->consumer == rnum );
...@@ -215,9 +216,9 @@ TEST_CASE( "UMessageQueue: overflow index (strategy=lostOldData)", "[mqueue]" ) ...@@ -215,9 +216,9 @@ TEST_CASE( "UMessageQueue: overflow index (strategy=lostOldData)", "[mqueue]" )
mq.set_rpos(max); mq.set_rpos(max);
// При переходе через максимум ничего не должны потерять // При переходе через максимум ничего не должны потерять
pushMessage(mq,100); pushMessage(mq, 100);
pushMessage(mq,110); pushMessage(mq, 110);
pushMessage(mq,120); pushMessage(mq, 120);
auto m = mq.top(); auto m = mq.top();
REQUIRE( m != nullptr ); REQUIRE( m != nullptr );
...@@ -241,9 +242,9 @@ TEST_CASE( "UMessageQueue: lost data (strategy=lostOldData)", "[mqueue]" ) ...@@ -241,9 +242,9 @@ TEST_CASE( "UMessageQueue: lost data (strategy=lostOldData)", "[mqueue]" )
mq.setLostStrategy(MQAtomic::lostOldData); mq.setLostStrategy(MQAtomic::lostOldData);
mq.setMaxSizeOfMessageQueue(2); mq.setMaxSizeOfMessageQueue(2);
pushMessage(mq,100); pushMessage(mq, 100);
pushMessage(mq,110); pushMessage(mq, 110);
pushMessage(mq,120); pushMessage(mq, 120);
auto m = mq.top(); auto m = mq.top();
REQUIRE( m != nullptr ); REQUIRE( m != nullptr );
...@@ -261,9 +262,9 @@ TEST_CASE( "UMessageQueue: lost data (strategy=lostOldData)", "[mqueue]" ) ...@@ -261,9 +262,9 @@ TEST_CASE( "UMessageQueue: lost data (strategy=lostOldData)", "[mqueue]" )
mq.set_rpos(max); mq.set_rpos(max);
// При переходе через максимум ничего не должны потерять // При переходе через максимум ничего не должны потерять
pushMessage(mq,140); pushMessage(mq, 140);
pushMessage(mq,150); pushMessage(mq, 150);
pushMessage(mq,160); pushMessage(mq, 160);
m = mq.top(); m = mq.top();
REQUIRE( m != nullptr ); REQUIRE( m != nullptr );
...@@ -289,9 +290,9 @@ TEST_CASE( "UMessageQueue: overflow index (strategy=lostNewData)", "[mqueue]" ) ...@@ -289,9 +290,9 @@ TEST_CASE( "UMessageQueue: overflow index (strategy=lostNewData)", "[mqueue]" )
mq.set_rpos(max); mq.set_rpos(max);
// При переходе через максимум ничего не должны потерять // При переходе через максимум ничего не должны потерять
pushMessage(mq,100); pushMessage(mq, 100);
pushMessage(mq,110); pushMessage(mq, 110);
pushMessage(mq,120); pushMessage(mq, 120);
auto m = mq.top(); auto m = mq.top();
REQUIRE( m != nullptr ); REQUIRE( m != nullptr );
...@@ -315,9 +316,9 @@ TEST_CASE( "UMessageQueue: lost data (strategy=lostNewData)", "[mqueue]" ) ...@@ -315,9 +316,9 @@ TEST_CASE( "UMessageQueue: lost data (strategy=lostNewData)", "[mqueue]" )
mq.setLostStrategy(MQAtomic::lostNewData); mq.setLostStrategy(MQAtomic::lostNewData);
mq.setMaxSizeOfMessageQueue(2); mq.setMaxSizeOfMessageQueue(2);
pushMessage(mq,100); pushMessage(mq, 100);
pushMessage(mq,110); pushMessage(mq, 110);
pushMessage(mq,120); pushMessage(mq, 120);
auto m = mq.top(); auto m = mq.top();
REQUIRE( m != nullptr ); REQUIRE( m != nullptr );
...@@ -335,9 +336,9 @@ TEST_CASE( "UMessageQueue: lost data (strategy=lostNewData)", "[mqueue]" ) ...@@ -335,9 +336,9 @@ TEST_CASE( "UMessageQueue: lost data (strategy=lostNewData)", "[mqueue]" )
mq.set_rpos(max); mq.set_rpos(max);
// При переходе через максимум ничего не должны потерять // При переходе через максимум ничего не должны потерять
pushMessage(mq,140); pushMessage(mq, 140);
pushMessage(mq,150); pushMessage(mq, 150);
pushMessage(mq,160); pushMessage(mq, 160);
m = mq.top(); m = mq.top();
REQUIRE( m != nullptr ); REQUIRE( m != nullptr );
......
...@@ -23,14 +23,14 @@ void initTest() ...@@ -23,14 +23,14 @@ void initTest()
if( !uobj ) if( !uobj )
{ {
uobj = make_object<TestUObject>("TestUObject1","TestUObject"); uobj = make_object<TestUObject>("TestUObject1", "TestUObject");
REQUIRE( uobj != nullptr ); REQUIRE( uobj != nullptr );
} }
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
static void pushMessage( long id, Message::Priority p ) static void pushMessage( long id, Message::Priority p )
{ {
SensorMessage sm(id,id); SensorMessage sm(id, id);
sm.priority = p; sm.priority = p;
sm.consumer = id; // чтобы хоть как-то идентифицировать сообщений, используем поле consumer sm.consumer = id; // чтобы хоть как-то идентифицировать сообщений, используем поле consumer
TransportMessage tm( std::move(sm.transport_msg()) ); TransportMessage tm( std::move(sm.transport_msg()) );
...@@ -46,11 +46,11 @@ TEST_CASE( "UObject: priority messages", "[uobject]" ) ...@@ -46,11 +46,11 @@ TEST_CASE( "UObject: priority messages", "[uobject]" )
* Хотя в реальности, оно должно совпадать с id объекта получателя. * Хотя в реальности, оно должно совпадать с id объекта получателя.
*/ */
pushMessage(100,Message::Low); pushMessage(100, Message::Low);
pushMessage(101,Message::Low); pushMessage(101, Message::Low);
pushMessage(200,Message::Medium); pushMessage(200, Message::Medium);
pushMessage(300,Message::High); pushMessage(300, Message::High);
pushMessage(301,Message::High); pushMessage(301, Message::High);
// теперь проверяем что сперва вынули Hi // теперь проверяем что сперва вынули Hi
// но так же контролируем что порядок извлечения правильный // но так же контролируем что порядок извлечения правильный
...@@ -70,7 +70,7 @@ TEST_CASE( "UObject: priority messages", "[uobject]" ) ...@@ -70,7 +70,7 @@ TEST_CASE( "UObject: priority messages", "[uobject]" )
REQUIRE( m->priority == Message::Low ); REQUIRE( m->priority == Message::Low );
REQUIRE( m->consumer == 100 ); REQUIRE( m->consumer == 100 );
pushMessage(201,Message::Medium); pushMessage(201, Message::Medium);
m = uobj->getOneMessage(); m = uobj->getOneMessage();
REQUIRE( m->priority == Message::Medium ); REQUIRE( m->priority == Message::Medium );
REQUIRE( m->consumer == 201 ); REQUIRE( m->consumer == 201 );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment