Commit 618e6fba authored by Pavel Vainerman's avatar Pavel Vainerman

make style, fix docs

parent 1a629d75
......@@ -76,7 +76,7 @@ int getRawValue( const string& args, UInterface& ui );
int getTimeChange( const string& args, UInterface& ui );
int getState( const string& args, UInterface& ui );
int getCalibrate( const string& args, UInterface& ui );
int oinfo(const string& args, UInterface& ui , const string& userparam );
int oinfo(const string& args, UInterface& ui, const string& userparam );
int apiRequest( const string& args, UInterface& ui, const string& query );
void sendText( const string& args, UInterface& ui, const string& txt, int mtype );
// --------------------------------------------------------------------------
......@@ -303,6 +303,7 @@ int main(int argc, char** argv)
commandToAll(conf->getControllersSection(), rep, (Command)cmd);
commandToAll(conf->getObjectsSection(), rep, (Command)cmd);
}
return 0;
case 'r': //--configure
......@@ -331,6 +332,7 @@ int main(int argc, char** argv)
if( verb )
cout << "(finish): done" << endl;
}
return 0;
case 'l': //--logrotate
......@@ -386,7 +388,7 @@ int main(int argc, char** argv)
std::string consumers(optarg);
ostringstream txt;
if( checkArg(optind+1, argc, argv) == 0 )
if( checkArg(optind + 1, argc, argv) == 0 )
{
if( !quiet )
cerr << "admin(sendText): Unknown 'text'. Use: id,name,name2@nodeX mtype text" << endl;
......@@ -394,7 +396,7 @@ int main(int argc, char** argv)
return 1;
}
for( int i=optind+1; i<argc; i++ )
for( int i = optind + 1; i < argc; i++ )
{
if( checkArg(i, argc, argv) == 0 )
break;
......@@ -669,7 +671,7 @@ int setValue( const string& args, UInterface& ui )
if( verb )
cout << "====== setValue ======" << endl;
for( auto && it : sl )
for( auto&& it : sl )
{
try
{
......@@ -738,7 +740,7 @@ int getValue( const string& args, UInterface& ui )
size_t num = 0;
for( auto && it : sl )
for( auto&& it : sl )
{
try
{
......@@ -817,7 +819,7 @@ int getCalibrate( const std::string& args, UInterface& ui )
if( !quiet )
cout << "====== getCalibrate ======" << endl;
for( auto && it : sl )
for( auto&& it : sl )
{
if( it.si.node == DefaultObjectId )
it.si.node = conf->getLocalNode();
......@@ -867,7 +869,7 @@ int getRawValue( const std::string& args, UInterface& ui )
if( !quiet )
cout << "====== getRawValue ======" << endl;
for( auto && it : sl )
for( auto&& it : sl )
{
if( it.si.node == DefaultObjectId )
it.si.node = conf->getLocalNode();
......@@ -912,7 +914,7 @@ int getTimeChange( const std::string& args, UInterface& ui )
if( !quiet )
cout << "====== getChangedTime ======" << endl;
for( auto && it : sl )
for( auto&& it : sl )
{
if( it.si.node == DefaultObjectId )
it.si.node = conf->getLocalNode();
......@@ -1069,7 +1071,7 @@ int oinfo(const string& args, UInterface& ui, const string& userparam )
auto conf = uniset_conf();
auto sl = uniset::getObjectsList( args, conf );
for( auto && it : sl )
for( auto&& it : sl )
{
if( it.node == DefaultObjectId )
it.node = conf->getLocalNode();
......@@ -1103,7 +1105,7 @@ int apiRequest( const string& args, UInterface& ui, const string& query )
// if( verb )
// cout << "apiRequest: query: " << query << endl;
for( auto && it : sl )
for( auto&& it : sl )
{
if( it.node == DefaultObjectId )
it.node = conf->getLocalNode();
......@@ -1137,7 +1139,7 @@ void sendText( const string& args, UInterface& ui, const string& txt, int mtype
cout << "mtype=" << mtype << " txt: " << txt << endl;
for( auto && it : sl )
for( auto&& it : sl )
{
if( it.node == DefaultObjectId )
it.node = conf->getLocalNode();
......
......@@ -29,11 +29,11 @@ MBSlave::MBSlave(const std::unordered_set<ModbusAddr>& _vaddr, const std::string
// if( replyTimeout <= 0 )
// replyTimeout = 2000;
// if( verbose )
// cout << "(init): "
// << " addr=" << ModbusServer::vaddr2str(vaddr)
// << " dev=" << dev
// << " speed=" << speed;
// if( verbose )
// cout << "(init): "
// << " addr=" << ModbusServer::vaddr2str(vaddr)
// << " dev=" << dev
// << " speed=" << speed;
rscomm = new ModbusRTUSlaveSlot(dev, use485);
......
......@@ -102,7 +102,7 @@ struct Interval
using time_point = std::chrono::time_point<std::chrono::steady_clock>;
Interval()
:tmStart(std::chrono::steady_clock::now())
: tmStart(std::chrono::steady_clock::now())
{}
uint64_t microseconds()
......@@ -322,6 +322,7 @@ int main( int argc, char** argv )
}
break;
#if 0
case 'g':
{
if( cmd == cmdNOP )
......@@ -342,6 +343,7 @@ int main( int argc, char** argv )
}
break;
#endif
case 'v':
verb = 1;
break;
......@@ -766,6 +768,7 @@ int main( int argc, char** argv )
Interval i;
mb.fileTransfer( slaveaddr, reg, tofile, tout);
if( verb )
cout << i.microseconds() << " ms" << endl;
}
......
......@@ -90,7 +90,7 @@ struct Interval
using time_point = std::chrono::time_point<std::chrono::steady_clock>;
Interval()
:tmStart(std::chrono::steady_clock::now())
: tmStart(std::chrono::steady_clock::now())
{}
uint64_t microseconds()
......
......@@ -60,7 +60,7 @@ int main( int argc, char** argv )
std::list<ExtInfo> l;
for( auto && it : lst )
for( auto&& it : lst )
{
UniversalIO::IOType t = conf->getIOType( it.si.id );
......
......@@ -32,9 +32,10 @@ AC_ENABLE_SHARED(yes)
AC_ENABLE_STATIC(no)
AM_PROG_LIBTOOL
ASTYLE_OPT="-A1 -T -C -S -N -L -w -Y -M -f -p --mode=c --lineend=linux --align-reference=type --align-pointer=type --suffix=none --style=ansi"
ASTYLE_OPT="-A1 -T -C -S -L -w -N -Y -M -f -p --mode=c --lineend=linux --align-reference=type --align-pointer=type --suffix=none --style=ansi --convert-tabs -s4"
AC_SUBST(ASTYLE_OPT)
# Checks for libraries.
PKG_CHECK_MODULES(XML, libxml-2.0)
PKG_CHECK_MODULES(OMNI, omniORB4)
......
......@@ -13,22 +13,21 @@
- \ref sec_Concept_Process
\section sec_Concept_Object Объект
\section sec_Concept_Object Объект
В разных местах описаний, в зависимости от контекста,
под "объектом" подразумевается либо объект класса так или иначе наследующегося
от базового класса библиотеки UniSetObject, либо
некий концептуальный программный объект способный
получать и обрабатывать сообщения.
\section sec_Concept_ObjectTypes Основные типы объектов
\section sec_Concept_ObjectTypes Основные типы объектов
В библиотеке произведено условное деление на следующие типы объектов:
- (простые) объекты - наследуются от класса UniSetObject
- контроллеры - являются наследниками класса IOController
- сервисы - являются наследниками специальных классов
- узлы - в строгом смысле, не являются объектами,
но обладают уникальным идентификатором.
- (простые) объекты - наследуются от класса UniSetObject
- контроллеры - являются наследниками класса IOController
- сервисы - являются наследниками специальных классов
- узлы - в строгом смысле, не являются объектами, но обладают уникальным идентификатором.
\section sec_Concept_Message Сообщения
\section sec_Concept_Message Сообщения
Вся система взаимодействия между объектами в основном
построена на использовании сообщений (передаваемых
путём удаленного вызова специальных функций,
......@@ -53,7 +52,7 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
\endcode
\section sec_Concept_ObjectId Идентификатор объекта
\section sec_Concept_ObjectId Идентификатор объекта
Каждый объект, которому необходимо взаимодействовать с другими объектами
(в том числе датчиками см. \ref sec_Concept_Sensor) должен обладать уникальным
идентификатором. В качестве идентификатора выступает любое число типа \b UniSetTypes::ObjectId.
......@@ -74,7 +73,7 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
\code
<Configurations>
...
<ObjectsMap idfromfile="0">
<ObjectsMap idfromfile="0">
<nodes port="2809">
<item name="LocalhostNode" alias="" textname="Локальный узел" ip="127.0.0.1" dbserver=""/>
<item name="Node2" alias="" textname="Локальный узел" ip="127.0.0.1" dbserver=""/>
......@@ -100,7 +99,7 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
<item name="TestProc1"/>
<item name="TestProc2"/>
</objects>
</ObjectsMap>
</ObjectsMap>
...
</Configurations>
\endcode
......@@ -130,7 +129,7 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
\code
<Configurations>
...
<ObjectsMap idfromfile="1">
<ObjectsMap idfromfile="1">
<nodes port="2809">
<item id="1000" name="LocalhostNode" alias="" textname="Локальный узел" ip="127.0.0.1" dbserver=""/>
<item id="1001" name="Node2" alias="" textname="Локальный узел" ip="127.0.0.1" dbserver=""/>
......@@ -156,7 +155,7 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
<item id="200" name="TestProc1"/>
<item id="201" name="TestProc2"/>
</objects>
</ObjectsMap>
</ObjectsMap>
...
</Configurations>
\endcode
......@@ -166,17 +165,17 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
не сложными скриптами).
\section sec_Concept_Repository Репозиторий объектов
\section sec_Concept_Repository Репозиторий объектов
\section sec_Concept_Sensor Датчик
\section sec_Concept_Sensor Датчик
Датчик - это одно из базовых понятий при построении систем на основе libuniset.
Датчик - это информационная единица. Практически любая информация
(о событиях, о состоянии того или иного процесса, объекта, сообщение оператору и т.п.)
передаётся через состояние "датчика". В библиотеке предусмотрено четыре типа датчиков.
- DI - UniversalIO::DigitalInput - дискретный вход
- DO - UniversalIO::DigitalOutput - дискретный выход
- AI - UniversalIO::AnalogInput - аналоговый вход
- AO - UniversalIO::AnalogOutput - аналоговый выход
- DI - UniversalIO::DigitalInput - дискретный вход
- DO - UniversalIO::DigitalOutput - дискретный выход
- AI - UniversalIO::AnalogInput - аналоговый вход
- AO - UniversalIO::AnalogOutput - аналоговый выход
Исходно данные типы используются непосредственно процессами ввода/вывода.
"Выходы"(DO,AO) - это, команды "от системы управления"
......@@ -191,7 +190,7 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
на передачу цифровой информации (не текстовой).
Например CAN, ModbusRTU, ModbusTCP и т.п.
\section sec_Concept_Process Процесс
\section sec_Concept_Process Процесс
Под процессом в документации чаще всего подразумевается системный
процесс (запущенная программа) выполняющий те или иные функции управления
и обменивающийся для этого с другими процессами сообщениями или
......
/*! \page ConfigurationPage Конфигурирование системы
- \ref ConfigurationPage_secCommon
- \ref ConfigurationPage_secOmniORB
- \ref ConfigurationPage_secCommon
- \ref ConfigurationPage_secOmniORB
\section ConfigurationPage_secCommon Общее описание
\section ConfigurationPage_secCommon Общее описание
Для конфигурирования системы используется файл (обычно "configure.xml").
Конфигурация является глобальным объектом. Для получения доступа к ней используется функция auto conf = uniset_conf();
До начала работы, обычно в функции main(), конфигурация должна быть инициализирована при помощи функции uniset_init().
При этом третий параметр, указывающий название конфигурационного файла, является не обязательным.
По умолчанию обрабатывается аргумент командной строки --confile filename.
Для конфигурирования системы используется файл (обычно "configure.xml").
Конфигурация является глобальным объектом. Для получения доступа к ней используется функция auto conf = uniset_conf();
До начала работы, обычно в функции main(), конфигурация должна быть инициализирована при помощи функции uniset_init().
При этом третий параметр, указывающий название конфигурационного файла, является не обязательным.
По умолчанию обрабатывается аргумент командной строки --confile filename.
\code
...
......@@ -23,7 +23,6 @@ int main(int argc, char **argv)
uniset_init(argc, argv, "configure.xml");
...
...
}
catch(Exception& ex )
{
......@@ -33,28 +32,27 @@ int main(int argc, char **argv)
{
cerr << "Неизвестное исключение!!!!"<< endl;
}
...
...
}
\endcode
\section ConfigurationPage_secOmniORB Конфигурирование OmniORB
Для возможности задать напрямую параметры для omniORB заложена специальная секция <omniORB>.
\section ConfigurationPage_secOmniORB Конфигурирование OmniORB
Для возможности задать напрямую параметры для omniORB заложена специальная секция <omniORB>.
В данную секцию можно записывать любые параметры поддерживаемые библиотекой omniORB.
Формат и название параметров см. документацию по omniORB.
В данную секцию можно записывать любые параметры поддерживаемые библиотекой omniORB.
Формат и название параметров см. документацию по omniORB.
Пример:
Пример:
\code
<omniORB>
<omniORB>
<option name="endPoint" arg="giop:tcp:host1:"/>
<option name="endPoint" arg="giop:tcp:host2:" error_if_not_available="1"/>
</omniORB>
</omniORB>
\endcode
Для параметра 'endPoint' встроена дополнительная проверка доступности указанной адреса.
\warning По умолчанию \b недоступность \b игнорируется, если не указан параметр \a error_if_not_available="1"
Для параметра 'endPoint' встроена дополнительная проверка доступности указанного адреса.
\warning По умолчанию \b недоступность \b игнорируется, если не указан параметр \a error_if_not_available="1"
Помимо этого можно задать параметр \a ignore_checking="1", чтобы не происходило проверки доступности endPoint.
Помимо этого можно задать параметр \a ignore_checking="1", чтобы не происходило проверки доступности endPoint.
*/
\ No newline at end of file
/* OBSOLETE DOC!!!
\page ControlProcessPage Как писать процесс управления
\page ControlProcessPage Как писать процесс управления
- \ref pgCP_secDeclareIDL
- \ref pgCP_secImplementation
- \ref pgCP_secMain
- \ref pgCP_secLT_Object
- \ref pgCP_secRecomendation
- \ref pgCP_secDeclareIDL
- \ref pgCP_secImplementation
- \ref pgCP_secMain
- \ref pgCP_secLT_Object
- \ref pgCP_secRecomendation
Все рядовые процессы управления должны наследоваться от класса UniSetObject.
\par
Все рядовые процессы управления должны наследоваться от класса UniSetObject.
\par
Рассмотрим процесс написания на примере самого простого процесса управления реализующего
две функции \c on() и \c off(). Чтобы эти функции были доступны другим процессам необходимо
объявить интерфейс на языке IDL.
\section pgCP_secDeclareIDL Объявление интерфейса на IDL
\section pgCP_secDeclareIDL Объявление интерфейса на IDL
Как писалось выше процесс управления должен наследоваться UniSetObject, это касается и IDL-интерфейса.
Пример объявления
\code
......@@ -24,8 +24,8 @@
// ------------------------------------------------------------------------------------------
interface TestActiveProcess_i: UniSetObject_i
{
void on();
void off();
void on();
void off();
};
#endif
\endcode
......@@ -37,24 +37,24 @@ interface TestActiveProcess_i: UniSetObject_i
На основе этих файлов вы реализуете свой интерфейс на С++.
\section pgCP_secImplementation Реализация интерфейса на C++
\section pgCP_secImplementation Реализация интерфейса на C++
Необходимо создать класс реализующий объявленый интерфейс. Формирование названия класса и правила наследования
см. \ref UniSetLibStylePage.
\par
Базовые функции интерфейса UniSetObject_i уже реализованы в классе UniSetObject. Поэтому остается только
наследоваться от него и реализовать недостающие функции. В итоге получаем
\code
#ifndef TestActiveProcess_H_
#define TestActiveProcess_H_
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
#include "UniSetObject.h"
#include "TestActiveProcess_i.hh"
// ------------------------------------------------------------------------------------------
class TestActiveProcess:
#ifndef TestActiveProcess_H_
#define TestActiveProcess_H_
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
#include "UniSetObject.h"
#include "TestActiveProcess_i.hh"
// ------------------------------------------------------------------------------------------
class TestActiveProcess:
public POA_TestActiveProcess_i,
public UniSetObject
{
{
public:
// ------- Конструктор с заданием обязательных параметров ---------------
......@@ -79,20 +79,20 @@ interface TestActiveProcess_i: UniSetObject_i
// Сделан protected чтобы нельзя было создать объект класса
// не задав обязательных параметров
TestActiveProcess();
};
};
\endcode
Реализация функций может выглядеть примерно следующим образом:
\code
// ------------------------------------------------------------------------------------------
void TestActiveProcess::TestActiveProcess( UniSetTypes::ObjectId id ):
// ------------------------------------------------------------------------------------------
void TestActiveProcess::TestActiveProcess( UniSetTypes::ObjectId id ):
UniSetObject(id)
{
}
// ------------------------------------------------------------------------------------------
{
}
// ------------------------------------------------------------------------------------------
void TestActiveProcess::processingMessage( UniSetTypes::VoidMessage *msg)
{
void TestActiveProcess::processingMessage( UniSetTypes::VoidMessage *msg)
{
try
{
switch(msg->type)
......@@ -129,11 +129,11 @@ interface TestActiveProcess_i: UniSetObject_i
cout << myname << "(processingMessage): " << ex << endl;
}
catch(...){}
}
// ------------------------------------------------------------------------------------------
}
// ------------------------------------------------------------------------------------------
void TestActiveProcess::askSensors(UniversalIO::UIOCommand cmd)
{
void TestActiveProcess::askSensors(UniversalIO::UIOCommand cmd)
{
try
{
// дискретные датчики
......@@ -148,18 +148,18 @@ interface TestActiveProcess_i: UniSetObject_i
{
cout << myname << ex << endl;
}
}
// ------------------------------------------------------------------------------------------
}
// ------------------------------------------------------------------------------------------
void TestActiveProcess::sigterm( int signo )
{
void TestActiveProcess::sigterm( int signo )
{
cout << myname << "(sigterm): signo " << signo << endl;
askSensors( UniversalIO::UIODontNotify );
}
// ------------------------------------------------------------------------------------------
}
// ------------------------------------------------------------------------------------------
void TestActiveProcess::sysCommand( SystemMessage* sm )
{
void TestActiveProcess::sysCommand( SystemMessage* sm )
{
cout << myname << "(sysCommand): command= "<< sm->command << endl;
switch(sm->command)
{
......@@ -178,20 +178,20 @@ interface TestActiveProcess_i: UniSetObject_i
default:
break;
}
}
// ------------------------------------------------------------------------------------------
}
// ------------------------------------------------------------------------------------------
void TestActiveProcess::sensorInfo( SensorMessage *si )
{
void TestActiveProcess::sensorInfo( SensorMessage *si )
{
cout << myname << "(sensorInfo): name" << conf->oind.getNameById(si->id,si.node) << endl;
}
// ------------------------------------------------------------------------------------------
}
// ------------------------------------------------------------------------------------------
void TestActiveProcess::timerInfo( UniSetTypes::TimerMessage* tm )
{
void TestActiveProcess::timerInfo( UniSetTypes::TimerMessage* tm )
{
cout << myname << "(timerInfo): timerId=" << tm->id << endl;
}
// ------------------------------------------------------------------------------------------
}
// ------------------------------------------------------------------------------------------
\endcode
......@@ -199,16 +199,16 @@ interface TestActiveProcess_i: UniSetObject_i
\code
#include "ObjectsMap.h"
#include "TestActiveProcess.h"
#include "ObjectsActivator.h"
#include "Configuration.h"
// ------------------------------------------------------------------------------------------
using namespace UniSetTypes;
using namespace std;
#include "ObjectsMap.h"
#include "TestActiveProcess.h"
#include "ObjectsActivator.h"
#include "Configuration.h"
// ------------------------------------------------------------------------------------------
using namespace UniSetTypes;
using namespace std;
int main( int argc, char **argv )
{
int main( int argc, char **argv )
{
try
{
conf = new Configuration(argc, (const char**)argv, "configure.xml", (ObjectInfo*)ObjectsMap);
......@@ -230,7 +230,7 @@ interface TestActiveProcess_i: UniSetObject_i
}
return 0;
}
}
\endcode
......@@ -263,8 +263,8 @@ interface TestActiveProcess_i: UniSetObject_i
\endcode
Функция UniSetObject_LT::askTimer() повторяет интерфейс UniversalInterface::askTimer().
Реализация построена, на переопределении функции UniSetObject::callback(), поэтому если поток
не будет создан, таймеры работать не будут.
\sa LT_Object, UniSetObject_LT, ObjectsManager_LT
не будет создан, таймеры работать не будут.
\sa LT_Object, UniSetObject_LT, ObjectsManager_LT
......@@ -282,7 +282,7 @@ interface TestActiveProcess_i: UniSetObject_i
\warning Заказ датчиков может (и должен) происходить \b только после активизации. Ваш процесс НЕ будет доступен
для приема команд и сообщений пока он не активизирован.
\par
\par
Вот вроде и все пока...
*/
\ No newline at end of file
/*! \page DebugPage Описание использования функций отладки
Класс для вывода отладочных сообщений называется DebugStream.
Сообщения могут выводится на экран и в файл, отбираться по
определённым критериям и до определённого уровня.
Класс для вывода отладочных сообщений называется DebugStream.
Сообщения могут выводится на экран и в файл, отбираться по
определённым критериям и до определённого уровня.
- \ref subUsing
- \ref subConf
- \ref subUsing
- \ref subConf
\subsection subUsing Использование
Для использования нужно создать свой объект класса DebugStream или
использовать глобальный объект UniSetTypes::unideb.
Для переключения вывода отладки в файл, используйте функцию logFile(char const *f);
\subsection subUsing Использование
Для использования нужно создать свой объект класса DebugStream или
использовать глобальный объект UniSetTypes::unideb.
Для переключения вывода отладки в файл, используйте функцию logFile(char const *f);
Описание всех имеющихся функций находится в файле DebugStream.h
на английском языке.
Описание всех имеющихся функций находится в файле DebugStream.h
на английском языке.
Функция unideb[...] по умолчанию выводит в строку дату и время.
Функция unideb(...) просто выводит строку (в конец предыдущему потоку).
Функция unideb[...] по умолчанию выводит в строку дату и время.
Функция unideb(...) просто выводит строку (в конец предыдущему потоку).
\par Пример использования:
\code
......@@ -40,8 +40,8 @@
\endcode
Если вы хотите использовать отладочный вывод из критичного к времени
кода, используйте следующую конструкцию:
Если вы хотите использовать отладочный вывод из критичного к времени
кода, используйте следующую конструкцию:
\code
if (unideb.debugging(Debug::INFO)) {
......@@ -50,7 +50,7 @@
\endcode
\subsection subConf Конфигурирование логов
\subsection subConf Конфигурирование логов
Конфигурирование логов можно производить, при помощи файла конфигурации или через командную строку.
Например UniSetTypes::unideb настраивается в конфигурационном файле следующим образом:
......
/*!
\page MutexHowToPage Как пользоваться uniset_mutex и uniset_mutex_lock
\page MutexHowToPage Как пользоваться uniset_mutex и uniset_mutex_lock
\par
"мьютекс"(mutex) - получено от англ. Mutual Exclusive. (нечто вроде "взаимоисключение")
\par
"мьютекс"(mutex) - получено от англ. Mutual Exclusive. (нечто вроде "взаимоисключение")
\par
Основными операциями для мьютексов, помимо создания и уничтожения, являются операции lock и unlock.
Логически работа с мьютексом могла бы выглядеть так (псевдокод)
Основными операциями для мьютексов, помимо создания и уничтожения, являются операции lock и unlock.
Логически работа с мьютексом могла бы выглядеть так (псевдокод)
\code
\code
Mutex mutex;
...
mutex.lock();
DoSomething();
mutex.unlock();
\endcode
\endcode
Но в общем случае это ни к чему хорошему не приведет, т.к. если в \c DoSomething() возникнет исключение, то
\c mutex.unlock() уже не выполнится. Конечно можно использовать \c try...catch, но желательно, чтобы
код работал независимо от ситуации. Для этого введен класс \b uniset_mutex_lock. При его использовании получается
следующий код (один из вариантов использования):
\code
using namespase UniSetTypes;
...
uniset_mutex mutex;
...
{
Но в общем случае это ни к чему хорошему не приведет, т.к. если в \c DoSomething() возникнет исключение, то
\c mutex.unlock() уже не выполнится. Конечно можно использовать \c try...catch, но желательно, чтобы
код работал независимо от ситуации. Для этого введен класс \b uniset_mutex_lock. При его использовании получается
следующий код (один из вариантов использования):
\code
using namespase UniSetTypes;
...
uniset_mutex mutex;
...
{
uniset_mutex_lock lock(mutex); // вызов mutex.lock() как часть кода конструктора
DoSomething();
} // <-- Заканчивается зона видимости lock-а и происходит вызов mutex.unlock() как часть кода деструктора
\endcode
В этом случае, даже если в \c DoSomethig() будет сгенерировано исключение ресурс будет освобожден
при вызове деструктора. Вот и все решение...
\par
} // <-- Заканчивается зона видимости lock-а и происходит вызов mutex.unlock() как часть кода деструктора
\endcode
В этом случае, даже если в \c DoSomethig() будет сгенерировано исключение ресурс будет освобожден
при вызове деструктора. Вот и все решение...
\par
Главное не забывайте ставить скобочки...
\par
Желательно не использовать \c mutex.lock() и \c uniset_mutex.unlock() в чистом виде, а только совместно с
\b uniset_mutex_lock. Кроме особых случаев (см. \ref secWarning).
\par
Следует помнить, что мьютексы \b фактически никаких ресурсов не захватывают, это только флаг означающий,
что ресурс занят. Поэтому работать с ними надо внимательно и не забывать блокировать ресурс там где это надо.
\par
\par
Желательно не использовать \c mutex.lock() и \c uniset_mutex.unlock() в чистом виде, а только совместно с
\b uniset_mutex_lock. Кроме особых случаев (см. \ref secWarning).
\par
Следует помнить, что мьютексы \b фактически никаких ресурсов не захватывают, это только флаг означающий,
что ресурс занят. Поэтому работать с ними надо внимательно и не забывать блокировать ресурс там где это надо.
\par
Описания классов см. UniSetTypes::uniset_mutex и UniSetTypes::uniset_mutex_lock
\section secWarning Особые случаи
Если в \c DoSomethig() будет вызвана \c exit(0), \c abort() или что-нибудь подобное,
то unlock не произойдет. В таком случае следовало бы напрямую вызывать \c unlock() до вызова сигнала, но эти случаи редкие и если
возникнет необходимость, то можно будет вместо \a protected сделать их \a public.
\section secWarning Особые случаи
Если в \c DoSomethig() будет вызвана \c exit(0), \c abort() или что-нибудь подобное,
то unlock не произойдет. В таком случае следовало бы напрямую вызывать \c unlock() до вызова сигнала, но эти случаи редкие и если
возникнет необходимость, то можно будет вместо \a protected сделать их \a public.
\note Описание составлено на основе описания мьютексов из книги А.Цимбала "Технология CORBA для профессионалов".
\note Описание составлено на основе описания мьютексов из книги А.Цимбала "Технология CORBA для профессионалов".
*/
\ No newline at end of file
/* OBSOLETE DOC!!!
\page IONotifyControllerPage Как писать IONotifyController (процесс ввода/вывода)
\page IONotifyControllerPage Как писать IONotifyController (процесс ввода/вывода)
- \ref pgIONC_secDeclareIDL
- \ref pgIONC_secImplementation
- \ref pgIONC_secMain
- \ref pgIONC_secLT_Object
- \ref pgIONC_secRecomendation
- \ref pgIONC_secDeclareIDL
- \ref pgIONC_secImplementation
- \ref pgIONC_secMain
- \ref pgIONC_secLT_Object
- \ref pgIONC_secRecomendation
Все i/o процессы должны наследоваться от класса IOController. Если вам необходимо написать i/o процесс, который
помимо операций i/o еще и уведомляет об изменении состояния входов(выходов), то наследуйтесь от класса IONotifyController.
Эти классы объявляют минимальный(базовый) интерфейс для IOController-ов, который вы можете расширять.
Все i/o процессы должны наследоваться от класса IOController. Если вам необходимо написать i/o процесс, который
помимо операций i/o еще и уведомляет об изменении состояния входов(выходов), то наследуйтесь от класса IONotifyController.
Эти классы объявляют минимальный(базовый) интерфейс для IOController-ов, который вы можете расширять.
\par
Рассмотрим написание на примере простого процесса ввода/вывода, позволяющего заказывать у себя уведомления, а
так же обладающего дополнительной функцией CardIOTypes getCardIOType();
\par
Рассмотрим написание на примере простого процесса ввода/вывода, позволяющего заказывать у себя уведомления, а
так же обладающего дополнительной функцией CardIOTypes getCardIOType();
\section pgIONC_secDeclareIDL Объявление интерфейса на IDL
\section pgIONC_secDeclareIDL Объявление интерфейса на IDL
\note Написание интерфейса на IDL требуется, только если вам необходимо расширить базовый набор
IDL-функций. Все функции объявленные здесь станут доступны внешним объекта (локальным и удалённым).
......@@ -47,7 +47,7 @@
На основе этих файлов вы реализуете свой интерфейс на С++.
\section pgIONC_secImplementation Реализация интерфейса на C++
\section pgIONC_secImplementation Реализация интерфейса на C++
Необходимо создать класс реализующий объявленый интерфейс. Формирование названия класса и правила наследования
см. \ref UniSetLibStylePage.
\par
......@@ -148,19 +148,19 @@
\par
В завершение реализация запуска
\section pgIONC_secMain Написание функции main() для подключения процесса
\section pgIONC_secMain Написание функции main() для подключения процесса
\code
#include "ObjectsMap.h"
#include "MyNotifyController.h"
#include "ObjectsActivator.h"
#include "Configuration.h"
// ------------------------------------------------------------------------------------------
using namespace UniSetTypes;
using namespace std;
int main( int argc, char **argv )
{
#include "ObjectsMap.h"
#include "MyNotifyController.h"
#include "ObjectsActivator.h"
#include "Configuration.h"
// ------------------------------------------------------------------------------------------
using namespace UniSetTypes;
using namespace std;
int main( int argc, char **argv )
{
conf = new Configuration(argc, (const char**)argv, "configure.xml", (ObjectInfo*)ObjectsMap);
MyNotifyController nc( idMyNotifyController ); // idMyNotifyController - уникальный идентификатор объекта
......@@ -174,8 +174,8 @@
catch(...)
{
}
}
\endcode
}
\endcode
\section pgIONC_secLT_Object Создание автономного процесса, не зависящего от TimerService-а
......@@ -206,11 +206,11 @@
\endcode
Функция IONotifyController_LT::askTimer() повторяет интерфейс UniversalInterface::askTimer().
Реализация построена, на переопределении функции UniSetObject::callback(), поэтому если поток
не будет создан, таймеры работать не будут.
\sa LT_Object
не будет создан, таймеры работать не будут.
\sa LT_Object
\section pgIONC_secRecomendation Некоторые общие рекомендации
\section pgIONC_secRecomendation Некоторые общие рекомендации
-# Все функции и параметры должны быть откоментированы.
-# Заказ датчиков, таймеров, работа с информацией в основном происходит при помощи UniversalInterface. В каждом
......@@ -218,9 +218,9 @@
-# Не регистрируйте датчики в конструкторе.
-# Не вызывайте разрегистрацию в деструкторе.
\par
\par
Вот вроде и все пока...
\sa \ref ControlProcessPage
\sa \ref ControlProcessPage
*/
\ No newline at end of file
/* OBSOLETE DOC!!!
\page ObjectRepositoryPage Репозиторий объектов
\page ObjectRepositoryPage Репозиторий объектов
Репозиторий объектов предназначен для хранения и получения ссылок на объекты, с целью дальнейшего
использования функций предоставленных этими объектами. Объекты регистрирующиеся в репозитории могут быть удаленными...
использования функций предоставленных этими объектами. Объекты регистрирующиеся в репозитории могут быть удаленными...
- \ref subRegCommon
- \ref subReg
- \ref subResolve
- \ref subRegCommon
- \ref subReg
- \ref subResolve
\section subRegCommon Вводная
\section subRegCommon Вводная
При наследовании от UniSetObject (и его потомков) регистрация в репозитории происходит автоматически.
Поэтому регистрироваться отдельно нет необходимости.
Поэтому регистрироваться отдельно нет необходимости.
\section subReg Регистрация
\section subReg Регистрация
Для регистрации существует следующие функции.
По текстовому имени
......@@ -72,7 +72,7 @@
\endcode
\section subResolve Получение ссылки на объект
\section subResolve Получение ссылки на объект
Для получения ссылки лучше всего пользоваться
- UniSetTypes::ObjectPtr UniversalInterface::resolve( UniSetTypes::ObjectId id )
......
// эти разделы сформируются автоматически из описаний сделанных в соответствующих h-файлах
/*!
\page ServicesPage Сервисы
- \ref secDBServer
\section secDBServer Сервер БД
\sa \ref page_DBServer_MySQL
*/
\ No newline at end of file
......@@ -45,10 +45,10 @@
\section secORep Функции работы с репозиторием объектов
- \ref void UniversalInterface::registered(...)
- \ref void UniversalInterface::unregister(...)
- \ref void UniversalInterface::resolve(...)
- \ref ObjectId UniversalInterface::getIdByName(...)
- \ref const char* UniversalInterface::getNameById(...)
- \ref void UniversalInterface::unregister(...)
- \ref void UniversalInterface::resolve(...)
- \ref ObjectId UniversalInterface::getIdByName(...)
- \ref const char* UniversalInterface::getNameById(...)
\section secTimers Заказ таймеров
- \ref void UniversalInterface::askTimer(...)
......
/*!
\page DependsPage Зависимости между датчиками
Существует два механизма реализующих зависимость между датчиками:
Существует два механизма реализующих зависимость между датчиками:
- \ref pgDep_secIOControl
- \ref pgDep_secIOBase
\section pgDep_secIOControl Зависимость на уровне IOController (SharedMemmory)
\section pgDep_secIOControl Зависимость на уровне IOController (SharedMemmory)
Механизм зависимостей реализован в классе IOController.
Механизм зависимостей реализован в классе IOController.
Пример записи "зависимости" в configure.xml:
Пример записи "зависимости" в configure.xml:
\code
<item textname="...." iotype="..." .../>
<item textname="...." iotype="..." .../>
<consumers>
<consumers>
<depends>
<depend name="Sensor1" filter="val" />
<depend name="Sensor2" filter2="val1" />
</depends>
</item>
</item>
\endcode
При считывании конф. файла можно задавать фильтры.
При считывании конф. файла можно задавать фильтры.
ПОКА РЕАЛИЗОВАНА ЗАВИСИМОСТЬ ТОЛЬКО ОТ ОДНОГО ДАТЧИКА!
т.е. <depend> может быть только один.
ПОКА РЕАЛИЗОВАНА ЗАВИСИМОСТЬ ТОЛЬКО ОТ ОДНОГО ДАТЧИКА!
т.е. <depend> может быть только один.
\section pgDep_secIOBase Зависимость на уровне IOBase
Механизм зависимостей между датчиками на уровне IOBase,
\section pgDep_secIOBase Зависимость на уровне IOBase
Механизм зависимостей между датчиками на уровне IOBase,
работает на уровне процессов обмена использующих IOBase.
В ним относятся IOControl, ModbusMaster (RTU,TCP) и т.п.
Плюсом данного механизма является, то, что он обеспечивает
......@@ -42,9 +42,9 @@
Следует иметь ввиду, что этот механизм не действует при сохранении значений, например при помощи uniset-admin,
в отличие от механизма \ref pgDep_secIOControl
Пример записи "зависимости" в configure.xml:
Пример записи "зависимости" в configure.xml:
\code
<item textname="...." iotype="..." ... depend="OtherSensor_AS" depend_value="2" />
<item textname="...." iotype="..." ... depend="OtherSensor_AS" depend_value="2" />
\endcode
В данном случае подразумевается, что разрешающим датчиком является OtherSensor_AS=2.
......
/*! \page page_Uniset Краткое описание библиотеки libuniset
- \ref pg_UniSet_Common
- \ref pg_Uniset_Processes
- \ref pg_UniSet_Network
- \ref pg_UniSet_Utilities
- \ref pg_UniSet_Common
- \ref pg_Uniset_Processes
- \ref pg_UniSet_Network
- \ref pg_UniSet_Utilities
\section pg_UniSet_Common Общее описание libuniset
......
/*!
\mainpage
\mainpage
\image html uniset.png
\image html uniset.png
\section MainSection Оглавление
\section MainSection Оглавление
- \ref page_Concept
- \ref page_Uniset
- \ref UniSetLibStylePage
- \ref page_Concept
- \ref page_Uniset
- \ref UniSetLibStylePage
*/
/*!
\page ToDoPage Необходимо доделать
\page ToDoPage Необходимо доделать
-# утилиты мониторинга работы системы
-# настройку "политик" для ORB сделать из конф. файла
-# по максимуму переход на xml
-# дополнить описание IOController-ов разделом про XML-файл заказчиков(создание,работа)
-# сделать описание принципов и деталей межобъектного взаимодействия
(об ограничениях на размер сообщений, очередь сообщений, приоритеты и т.п.)
-# попытаться сделать работу с сервисами более универсальной
(что то типа "UniSetTypes::ObjectId conf->getService(const string name)" )
-# откорректировать и дописать "общее описание" библиотеки
-# сделать тип в UniSetObject::getType string-ом
(для универсальности и простоты будущих расширений)
-# переписать тестовые примеры, под текущую ситуацию.
-# в будущем попытаться отказаться от ObjectId и перейти на строки (это надо ещё обдумать)
-# в InfoServer-е по routeList-у сообщения пересылаются, только если они локальные.
Надо переделать механизм, чтобы можно было отделять тех кому пересылать все сообщения,
от тех кому пересылать только локальные....
-# Для IOController-ов разработать спец. интерфейс для работы с датчиками (сохранение, получение состояния и т.п.)
-# утилиты мониторинга работы системы
-# настройку "политик" для ORB сделать из конф. файла
-# по максимуму переход на xml
-# дополнить описание IOController-ов разделом про XML-файл заказчиков(создание,работа)
-# сделать описание принципов и деталей межобъектного взаимодействия
(об ограничениях на размер сообщений, очередь сообщений, приоритеты и т.п.)
-# попытаться сделать работу с сервисами более универсальной
(что то типа "UniSetTypes::ObjectId conf->getService(const string name)" )
-# откорректировать и дописать "общее описание" библиотеки
-# сделать тип в UniSetObject::getType string-ом
(для универсальности и простоты будущих расширений)
-# переписать тестовые примеры, под текущую ситуацию.
-# в будущем попытаться отказаться от ObjectId и перейти на строки (это надо ещё обдумать)
-# в InfoServer-е по routeList-у сообщения пересылаются, только если они локальные.
Надо переделать механизм, чтобы можно было отделять тех кому пересылать все сообщения,
от тех кому пересылать только локальные....
-# Для IOController-ов разработать спец. интерфейс для работы с датчиками (сохранение, получение состояния и т.п.)
Для того, чтобы можно было использовать разные способы хранения (БД, STL-контейнеры, файлы и т.п.). Т.к. сейчас
жёсткая реализация на STL-контейнерах.
-# дописать Mutex как надо (или перейти на omni_mutex-ы) . Сделать RWMutex и RMutex.
-# стартовые скрипты для локальной отладки (откорректировать старые)
-# управление очередью сообщений, очистка по фильтру и т.п. (может перейти на несколько очередей по приоритетам)
-# У NotifyController-а две функции с название calibrate (надо переименовать)
-# Сделать свойство tick у процессов обмена по Modbus, чтобы можно было с разной периодичностью опрашивать разные регистры
жёсткая реализация на STL-контейнерах.
-# дописать Mutex как надо (или перейти на omni_mutex-ы) . Сделать RWMutex и RMutex.
-# стартовые скрипты для локальной отладки (откорректировать старые)
-# управление очередью сообщений, очистка по фильтру и т.п. (может перейти на несколько очередей по приоритетам)
-# У NotifyController-а две функции с название calibrate (надо переименовать)
-# Сделать свойство tick у процессов обмена по Modbus, чтобы можно было с разной периодичностью опрашивать разные регистры
*/
......@@ -66,6 +66,7 @@ void BackendOpenTSDB::init( xmlNode* cnode )
bufSyncTime = conf->getArgPInt("--" + prefix + "-buf-sync-time", it.getProp("bufSyncTimeout"), bufSyncTime);
int sz = conf->getArgPInt("--" + prefix + "-uniset-object-size-message-queue", it.getProp("sizeOfMessageQueue"), 10000);
if( sz > 0 )
setMaxSizeOfMessageQueue(sz);
......@@ -347,6 +348,7 @@ bool BackendOpenTSDB::flushBuffer()
if( ret < 0 )
{
int errnum = errno;
if( errnum == EPIPE || errnum == EBADF )
{
mywarn << "(flushBuffer): send error (" << errnum << "): " << strerror(errnum) << endl;
......@@ -369,6 +371,7 @@ bool BackendOpenTSDB::flushBuffer()
{
mywarn << "(flushBuffer): (io): " << ex.displayText() << endl;
lastError = ex.displayText();
if( !reconnect() )
askTimer(tmReconnect, reconnectTime);
}
......
......@@ -31,7 +31,7 @@ namespace uniset
{
// -----------------------------------------------------------------------------
/*!
\page page_BackendOpenTSDB Реализация шлюза к БД поддерживающей интерфейс OpenTSDB
\page page_BackendOpenTSDB (DBServer_OpenTSDB) Реализация шлюза к БД поддерживающей интерфейс OpenTSDB
- \ref sec_OpenTSDB_Comm
- \ref sec_OpenTSDB_Conf
......@@ -98,6 +98,8 @@ namespace uniset
\todo Нужна ли поддержка авторизации для TSDB (возможно придётся перейти на HTTP REST API)
\todo Доделать возможность задать политику при переполнении буфера (удалять последние или первые, сколько чистить)
*/
// -----------------------------------------------------------------------------
/*! Реализация DBServer для OpenTSDB */
class BackendOpenTSDB:
public UObject_SK
{
......
......@@ -53,7 +53,7 @@ namespace uniset
\par
Для повышения надежности DBServer периодически ( DBServer_MySQL::PingTimer ) проверяет наличие связи с сервером БД.
В случае если связь пропала (или не была установлена при старте) DBServer пытается вновь каждые DBServer::ReconnectTimer
произвести соединение. При этом все запросы которые поступают для записи в БД, но не могут быть записаны складываются
произвести соединение.При этом все запросы которые поступают для записи в БД, но не могут быть записаны складываются
в буфер (см. \ref sec_DBS_Buffer).
\warning При каждой попытке восстановить соединение DBServer заново читает конф. файл. Поэтому он может подхватить
новые настройки.
......@@ -147,6 +147,8 @@ namespace uniset
\warning Временно, для обратной совместимости поле 'time_usec' в таблицах оставлено с таким названием,
хотя фактически туда сейчас сохраняется значение в наносекундах!
*/
//------------------------------------------------------------------------------------------
/*! Реализация DBServer для MySQL */
class DBServer_MySQL:
public DBServer
{
......
......@@ -60,12 +60,12 @@ bool PostgreSQLInterface::ping() const
}
catch( const std::exception& e )
{
// lastE = string(e.what());
// lastE = string(e.what());
}
return false;
// return db && db->is_open();
// return db && db->is_open();
}
// -----------------------------------------------------------------------------------------
bool PostgreSQLInterface::reconnect(const string& host, const string& user, const string& pswd, const string& dbname, unsigned int port )
......@@ -73,7 +73,7 @@ bool PostgreSQLInterface::reconnect(const string& host, const string& user, cons
if( db )
close();
return nconnect(host,user,pswd, dbname, port);
return nconnect(host, user, pswd, dbname, port);
}
// -----------------------------------------------------------------------------------------
bool PostgreSQLInterface::nconnect(const string& host, const string& user, const string& pswd, const string& dbname, unsigned int port )
......@@ -254,7 +254,7 @@ void PostgreSQLInterface::save_inserted_id( const pqxx::result& res )
bool PostgreSQLInterface::isConnection() const
{
return db && ping();
// return (db && db->is_open())
// return (db && db->is_open())
}
// -----------------------------------------------------------------------------------------
DBResult PostgreSQLInterface::makeResult( const pqxx::result& res )
......
......@@ -71,6 +71,7 @@ void DBServer_SQLite::sysCommand( const uniset::SystemMessage* sm )
case SystemMessage::Finish:
{
activate = false;
if(db)
db->close();
}
......@@ -79,6 +80,7 @@ void DBServer_SQLite::sysCommand( const uniset::SystemMessage* sm )
case SystemMessage::FoldUp:
{
activate = false;
if(db)
db->close();
}
......
......@@ -53,7 +53,7 @@ namespace uniset
\par
Для повышения надежности DBServer периодически ( DBServer_SQLite::PingTimer ) проверяет наличие связи с сервером БД.
В случае если связь пропала (или не была установлена при старте) DBServer пытается вновь каждые DBServer::ReconnectTimer
произвести соединение. При этом все запросы которые поступают для записи в БД, но не могут быть записаны складываются
произвести соединение.При этом все запросы которые поступают для записи в БД, но не могут быть записаны складываются
в буфер (см. \ref sec_DBS_Buffer).
\warning При каждой попытке восстановить соединение DBServer заново читает конф. файл. Поэтому он может подхватить
новые настройки.
......@@ -147,6 +147,8 @@ namespace uniset
\warning Временно, для обратной совместимости поле 'time_usec' в таблицах оставлено с таким названием,
хотя фактически туда сейчас сохраняется значение в наносекундах!
*/
//------------------------------------------------------------------------------------------
/*! Реализация DBServer для SQLite */
class DBServer_SQLite:
public DBServer
{
......
......@@ -1517,7 +1517,7 @@ namespace uniset
check_testmode();
}
for( auto && it : iomap )
for( auto&& it : iomap )
{
if( it->si.id == sm->id )
{
......
......@@ -191,6 +191,7 @@ LogDB::LogDB( const string& name, int argc, const char* const* argv, const strin
l->signal_on_read().connect(sigc::mem_fun(this, &LogDB::addLog));
auto lfile = sit.getProp("logfile");
if( !lfile.empty() )
{
l->logfile = make_shared<DebugStream>();
......
......@@ -78,11 +78,8 @@ namespace uniset
\endcode
При этом доступно два способа:
* Первый - это использование секции в общем файле проекта (configure.xml).
* Второй способ - позволяет создать отдельный xml-файл с одной настроечной секцией и указать его
в аргументах командной строки
* Второй способ - позволяет создать отдельный xml-файл с одной настроечной секцией и указать его в аргументах командной строки
\code
uniset2-logdb --single-confile logdbconf.xml
\endcode
......@@ -175,6 +172,8 @@ namespace uniset
\todo Продумать и реализовать тесты
\todo rest: Добавить функцию получения значений внутренних переменных и настроек (для отладки LogDB)
*/
//------------------------------------------------------------------------------------------
/*! Реализация LogDB */
class LogDB:
public EventLoopServer
#ifndef DISABLE_REST_API
......@@ -231,7 +230,7 @@ namespace uniset
static std::string qLast( const std::string& p );
// преобразование в дату 'YYYY-MM-DD' из строки 'YYYYMMDD' или 'YYYY/MM/DD'
static std::string qDate(const std::string& p , const char sep = '-');
static std::string qDate(const std::string& p, const char sep = '-');
// экранирование кавычек (удваивание для sqlite)
static std::string qEscapeString( const std::string& s );
......@@ -261,7 +260,7 @@ namespace uniset
ev::sig sigTERM;
ev::sig sigQUIT;
ev::sig sigINT;
void onTerminate( ev::sig& evsig , int revents );
void onTerminate( ev::sig& evsig, int revents );
ev::async wsactivate; // активация LogWebSocket-ов
......
......@@ -81,7 +81,7 @@ namespace uniset
{
long _myout = getOut();
for( auto && it : outs )
for( auto&& it : outs )
it.el->setIn(it.num, _myout);
}
// -------------------------------------------------------------------------
......@@ -105,7 +105,7 @@ namespace uniset
// -------------------------------------------------------------------------
void Element::addInput(size_t num, long value )
{
for( auto && it : ins )
for( auto&& it : ins )
{
if( it.num == num )
{
......
......@@ -173,7 +173,7 @@ void LProcessor::build( const string& lfile )
*/
void LProcessor::getInputs()
{
for( auto && it : extInputs )
for( auto&& it : extInputs )
{
// try
// {
......
......@@ -117,7 +117,7 @@ void PassiveLProcessor::askSensors( UniversalIO::UIOCommand cmd )
{
try
{
for( auto && it : extInputs )
for( auto&& it : extInputs )
shm->askSensor(it.sid, cmd);
}
catch( const uniset::Exception& ex )
......@@ -129,7 +129,7 @@ void PassiveLProcessor::askSensors( UniversalIO::UIOCommand cmd )
// -------------------------------------------------------------------------
void PassiveLProcessor::sensorInfo( const uniset::SensorMessage* sm )
{
for( auto && it : extInputs )
for( auto&& it : extInputs )
{
if( it.sid == sm->id )
it.value = sm->value;
......@@ -250,7 +250,7 @@ void PassiveLProcessor::initIterators()
void PassiveLProcessor::setOuts()
{
// выcтавляем выходы
for( auto && it : extOuts )
for( auto&& it : extOuts )
{
try
{
......
......@@ -97,7 +97,7 @@ namespace uniset
e1->delChildOut(e2);
// удаляем из списка соединений
for( auto && lit = inLinks.begin(); lit != inLinks.end(); ++lit )
for( auto&& lit = inLinks.begin(); lit != inLinks.end(); ++lit )
{
if( lit->from == e1 && lit->to == e2 )
{
......@@ -140,7 +140,7 @@ namespace uniset
// -------------------------------------------------------------------------
void Schema::remove( std::shared_ptr<Element>& el )
{
for( auto && it = emap.begin(); it != emap.end(); ++it )
for( auto&& it = emap.begin(); it != emap.end(); ++it )
{
if( it->second == el )
{
......@@ -150,7 +150,7 @@ namespace uniset
}
// помечаем внутренние связи
for( auto && lit : inLinks )
for( auto&& lit : inLinks )
{
if( lit.from == el )
lit.from = 0;
......@@ -160,7 +160,7 @@ namespace uniset
}
// помечаем внешние связи
for( auto && lit : extLinks )
for( auto&& lit : extLinks )
{
if( lit.to == el )
lit.to = 0;
......
......@@ -24,7 +24,7 @@ namespace uniset
using namespace std;
using namespace uniset::extensions;
// -------------------------------------------------------------------------
TA2D::TA2D(Element::ElementID id , long filterValue ):
TA2D::TA2D(Element::ElementID id, long filterValue ):
Element(id),
myout(false),
fvalue(filterValue)
......
......@@ -36,7 +36,7 @@ namespace uniset
void TAND::setIn( size_t num, long value )
{
// cout << this << ": input " << num << " set " << state << endl;
for( auto && it : ins )
for( auto&& it : ins )
{
if( it.num == num )
{
......@@ -53,7 +53,7 @@ namespace uniset
// проверяем изменился ли выход
// для тригера 'AND' проверка до первого 0
for( auto && it : ins )
for( auto&& it : ins )
{
if( !it.value )
{
......
......@@ -50,7 +50,7 @@ namespace uniset
{
// cout << getType() << "(" << myid << "): input " << num << " set " << state << endl;
for( auto && it : ins )
for( auto&& it : ins )
{
if( it.num == num )
{
......@@ -67,7 +67,7 @@ namespace uniset
// проверяем изменился ли выход
// для тригера 'OR' проверка до первой единицы
for( auto && it : ins )
for( auto&& it : ins )
{
if( it.value )
{
......
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