Commit 9b7063b9 authored by Pavel Vainerman's avatar Pavel Vainerman

(codegen): добавлены вспомогательные функции для удобства логирования.

parent 382117db
...@@ -214,6 +214,31 @@ ...@@ -214,6 +214,31 @@
#ifndef mylogany #ifndef mylogany
#define mylogany mylog->any() #define mylogany mylog->any()
#endif #endif
// Вспомогательные функции для удобства логирования
// ------------------------------------------------------------
/*!< вывод в строку значение всех входов и выходов в формате
ObjectName:
in_xxx = val
in_xxx2 = val
out_zzz = val
...
*/
std::string dumpIO();
/*!< Вывод в строку названия входа/выхода в формате: in_xxx(SensorName)
\param id - идентификатор датчика
\param showLinkName - TRUE - выводить SensorName, FALSE - не выводить
*/
std::string str( UniSetTypes::ObjectId id, bool showLinkName=true );
/*!< Вывод значения входа/выхода в формате: in_xxx(SensorName)=val
\param id - идентификатор датчика
\param showLinkName - TRUE - выводить SensorName, FALSE - не выводить
*/
std::string strval( UniSetTypes::ObjectId id, bool showLinkName=true );
// ------------------------------------------------------------
</xsl:template> </xsl:template>
<xsl:template name="COMMON-HEAD-PROTECTED"> <xsl:template name="COMMON-HEAD-PROTECTED">
...@@ -524,6 +549,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::waitSM( int wait_msec, ObjectId _te ...@@ -524,6 +549,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::waitSM( int wait_msec, ObjectId _te
#include &lt;memory&gt; #include &lt;memory&gt;
#include <xsl:call-template name="preinclude"/>Configuration.h<xsl:call-template name="postinclude"/> #include <xsl:call-template name="preinclude"/>Configuration.h<xsl:call-template name="postinclude"/>
#include <xsl:call-template name="preinclude"/>Exceptions.h<xsl:call-template name="postinclude"/> #include <xsl:call-template name="preinclude"/>Exceptions.h<xsl:call-template name="postinclude"/>
#include <xsl:call-template name="preinclude"/>ORepHelpers.h<xsl:call-template name="postinclude"/>
#include "<xsl:value-of select="$SK_H_FILENAME"/>" #include "<xsl:value-of select="$SK_H_FILENAME"/>"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -903,6 +929,46 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::testMode( bool _state ) ...@@ -903,6 +929,46 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::testMode( bool _state )
</xsl:for-each> </xsl:for-each>
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::dumpIO()
{
ostringstream s;
s &lt;&lt; myname &lt;&lt; ": " &lt;&lt; endl;
<xsl:for-each select="//smap/item">
s &lt;&lt; " " &lt;&lt; strval(<xsl:value-of select="@name"/>) &lt;&lt; endl;
</xsl:for-each>
return s.str();
}
// ----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId id, bool showLinkName )
{
ostringstream s;
<xsl:for-each select="//smap/item">
if( id == <xsl:value-of select="@name"/> )
{
s &lt;&lt; "<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>";
if( showLinkName ) s &lt;&lt; "(" &lt;&lt; ORepHelpers::getShortName( uniset_conf()->oind->getMapName(<xsl:value-of select="@name"/>)) &lt;&lt; ")";
return s.str();
}
</xsl:for-each>
return "";
}
// ----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::strval( UniSetTypes::ObjectId id, bool showLinkName )
{
ostringstream s;
<xsl:for-each select="//smap/item">
if( id == <xsl:value-of select="@name"/> )
{
// s &lt;&lt; str(id,showLinkName) &lt;&lt; "=" &lt;&lt; <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
s &lt;&lt; "<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>";
if( showLinkName ) s &lt;&lt; "(" &lt;&lt; ORepHelpers::getShortName( uniset_conf()->oind->getMapName(<xsl:value-of select="@name"/>)) &lt;&lt; ")";
s &lt;&lt; "=" &lt;&lt; <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
return s.str();
}
</xsl:for-each>
return "";
}
// ----------------------------------------------------------------------------
</xsl:template> </xsl:template>
...@@ -1138,6 +1204,58 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::alarm( UniSetTypes::ObjectId _code, ...@@ -1138,6 +1204,58 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::alarm( UniSetTypes::ObjectId _code,
return false; return false;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::dumpIO()
{
ostringstream s;
s &lt;&lt; myname &lt;&lt; ": " &lt;&lt; endl;
<xsl:for-each select="//sensors/item/consumers/consumer">
<xsl:if test="normalize-space(../../@msg)!='1'">
<xsl:if test="normalize-space(@name)=$OID">
s &lt;&lt; " " &lt;&lt; strval(<xsl:value-of select="../../@name"/>) &lt;&lt; endl;
</xsl:if>
</xsl:if>
</xsl:for-each>
return s.str();
}
// ----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::str( UniSetTypes::ObjectId id, bool showLinkName )
{
ostringstream s;
<xsl:for-each select="//sensors/item/consumers/consumer">
<xsl:if test="normalize-space(../../@msg)!='1'">
<xsl:if test="normalize-space(@name)=$OID">
if( id == <xsl:value-of select="../../@name"/> )
{
s &lt;&lt; "<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>";
if( showLinkName ) s &lt;&lt; "(<xsl:value-of select="../../@name"/>)";
return s.str();
}
</xsl:if>
</xsl:if>
</xsl:for-each>
return "";
}
// ----------------------------------------------------------------------------
std::string <xsl:value-of select="$CLASSNAME"/>_SK::strval( UniSetTypes::ObjectId id, bool showLinkName )
{
ostringstream s;
<xsl:for-each select="//sensors/item/consumers/consumer">
<xsl:if test="normalize-space(../../@msg)!='1'">
<xsl:if test="normalize-space(@name)=$OID">
if( id == <xsl:value-of select="../../@name"/> )
{
s &lt;&lt; "<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>";
if( showLinkName ) s &lt;&lt; "(<xsl:value-of select="../../@name"/>)";
s &lt;&lt; "=" &lt;&lt; <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>;
return s.str();
}
</xsl:if>
</xsl:if>
</xsl:for-each>
return "";
}
// ----------------------------------------------------------------------------
</xsl:template> </xsl:template>
<xsl:template name="check_changes"> <xsl:template name="check_changes">
......
...@@ -53,7 +53,6 @@ int main( int argc, const char** argv ) ...@@ -53,7 +53,6 @@ int main( int argc, const char** argv )
try try
{ {
auto conf = uniset_init(argc, argv); auto conf = uniset_init(argc, argv);
<xsl:if test="not(normalize-space(//@OID))=''"> <xsl:if test="not(normalize-space(//@OID))=''">
<xsl:value-of select="$CLASSNAME"/> obj; <xsl:value-of select="$CLASSNAME"/> obj;
</xsl:if> </xsl:if>
...@@ -72,21 +71,20 @@ int main( int argc, const char** argv ) ...@@ -72,21 +71,20 @@ int main( int argc, const char** argv )
return 0; return 0;
} }
} }
<xsl:value-of select="$CLASSNAME"/> obj(ID); auto obj = make_shared&lt;<xsl:value-of select="$CLASSNAME"/>&gt;(ID);
string logfilename = conf->getArgParam("--logfile","<xsl:value-of select="$CLASSNAME"/>.log"); string logfilename = conf->getArgParam("--logfile","<xsl:value-of select="$CLASSNAME"/>.log");
string logname( conf->getLogDir() + logfilename ); string logname( conf->getLogDir() + logfilename );
obj.mylog->logFile( logname.c_str() ); obj->mylog->logFile( logname.c_str() );
</xsl:if> </xsl:if>
auto act = UniSetActivator::Instance(); auto act = UniSetActivator::Instance();
act-&gt;add(obj.get_ptr()); act-&gt;add(obj);
SystemMessage sm(SystemMessage::StartUp); SystemMessage sm(SystemMessage::StartUp);
act-&gt;broadcast( sm.transport_msg() ); act-&gt;broadcast( sm.transport_msg() );
act-&gt;run(false); act-&gt;run(false);
pause(); // пауза, чтобы дочерние потоки успели завершить работ return 0;
} }
catch( const Exception&amp; ex) catch( const Exception&amp; ex)
{ {
...@@ -101,7 +99,7 @@ int main( int argc, const char** argv ) ...@@ -101,7 +99,7 @@ int main( int argc, const char** argv )
cerr &lt;&lt; "(main): catch ..." &lt;&lt; endl; cerr &lt;&lt; "(main): catch ..." &lt;&lt; endl;
} }
return 0; return 1;
} }
</xsl:template> </xsl:template>
</xsl:stylesheet> </xsl:stylesheet>
...@@ -21,16 +21,19 @@ TestGen::TestGen() ...@@ -21,16 +21,19 @@ TestGen::TestGen()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void TestGen::step() void TestGen::step()
{ {
cout << "input2 state=" << in_input2_s << endl; cout << "strval: " << strval(input2_s) << endl;
cout << "str: " << str(input2_s) << endl;
cout << "===========" << endl;
cout << dumpIO() << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void TestGen::sensorInfo( SensorMessage *sm ) void TestGen::sensorInfo( const SensorMessage *sm )
{ {
if( sm->id == input1_s ) if( sm->id == input1_s )
out_output1_c = in_input1_s; // sm->state out_output1_c = in_input1_s; // sm->state
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void TestGen::timerInfo( TimerMessage *tm ) void TestGen::timerInfo( const TimerMessage *tm )
{ {
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -15,10 +15,10 @@ class TestGen: ...@@ -15,10 +15,10 @@ class TestGen:
protected: protected:
TestGen(); TestGen();
virtual void step(); virtual void step() override;
void sensorInfo( UniSetTypes::SensorMessage *sm ); virtual void sensorInfo( const UniSetTypes::SensorMessage *sm ) override;
void timerInfo( UniSetTypes::TimerMessage *tm ); virtual void timerInfo( const UniSetTypes::TimerMessage *tm ) override;
virtual void sigterm( int signo ); virtual void sigterm( int signo ) override;
private: private:
}; };
......
...@@ -15,7 +15,7 @@ TestGenAlone::~TestGenAlone() ...@@ -15,7 +15,7 @@ TestGenAlone::~TestGenAlone()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void TestGenAlone::step() void TestGenAlone::step()
{ {
cout << "input2 state=" << in_input2_s << endl; cout << strval(in_input2_s) << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void TestGenAlone::sensorInfo( SensorMessage *sm ) void TestGenAlone::sensorInfo( SensorMessage *sm )
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
Name: libuniset2 Name: libuniset2
Version: 2.0 Version: 2.0
Release: alt21 Release: alt22
Summary: UniSet - library for building distributed industrial control systems Summary: UniSet - library for building distributed industrial control systems
...@@ -409,6 +409,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -409,6 +409,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# .. # ..
%changelog %changelog
* Mon Mar 16 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt22
- codegen: add dumpIO(), str(), strval() functions (debug helpers)
* Thu Mar 12 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt21 * Thu Mar 12 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt21
- codegen: adjustment documentation - codegen: adjustment documentation
- unetudp: add tests, minor optimization (thank`s uzum) - unetudp: add tests, minor optimization (thank`s uzum)
......
...@@ -153,7 +153,7 @@ ...@@ -153,7 +153,7 @@
<UDPExchange2 name="UDPExchange2"/> <UDPExchange2 name="UDPExchange2"/>
<UNetExchange name="UNetExchange"/> <UNetExchange name="UNetExchange"/>
<HeartBeatTime time_msec="5000"/> <HeartBeatTime time_msec="5000"/>
<TestGen input1_s="Input1_S" input2_s="DumpSensor1_S" name="TestGen" output1_c="DO_C"/> <TestGen input1_s="Input1_S" input2_s="DumpSensor1_S" name="TestGen" output1_c="DO_C" output2_c="DO1_C"/>
<RRDServer1 name="RRDServer1"> <RRDServer1 name="RRDServer1">
<rrd filename="rrdtest.rrd" filter_field="rrd" filter_value="1" step="5" ds_field="rrd1_ds" overwrite="0"> <rrd filename="rrdtest.rrd" filter_field="rrd" filter_value="1" step="5" ds_field="rrd1_ds" overwrite="0">
<item rra="RRA:AVERAGE:0.5:1:4320"/> <item rra="RRA:AVERAGE:0.5:1:4320"/>
......
...@@ -11,9 +11,9 @@ ...@@ -11,9 +11,9 @@
- \ref pg_Codegen_Make - \ref pg_Codegen_Make
- \ref pg_Codegen_Templ_Ask - \ref pg_Codegen_Templ_Ask
- \ref pg_Codegen_Templ_Alone - \ref pg_Codegen_Templ_Alone
- \ref pg_Codegen_log
- \ref pg_Codegen_loglevel - \ref pg_Codegen_loglevel
\section pg_Codegen_Common Общее описание утилиты uniset-codegen \section pg_Codegen_Common Общее описание утилиты uniset-codegen
Утилита uniset-codegen предназначена для генерирования "скелета" процесса управления на основе Утилита uniset-codegen предназначена для генерирования "скелета" процесса управления на основе
заданного xml-описания. В скелет процесса включается "рутинный" код по получению и проверке индетификаторов, заданного xml-описания. В скелет процесса включается "рутинный" код по получению и проверке индетификаторов,
...@@ -306,6 +306,45 @@ MyClass_SK.cc: myclass.src.xml ...@@ -306,6 +306,45 @@ MyClass_SK.cc: myclass.src.xml
- \b --no-main - отключает генерирование "запускающего" файла (функция main) - \b --no-main - отключает генерирование "запускающего" файла (функция main)
- \b -n - опредеяет название файлов для сгенерированного класса. В данном случае будут сгенерированы \a MyClass_SK.h и \a MyClass_SK.cc - \b -n - опредеяет название файлов для сгенерированного класса. В данном случае будут сгенерированы \a MyClass_SK.h и \a MyClass_SK.cc
\section pg_Codegen_log Логи
Для логирования событий каждый класс содержит объект mylog (класса DebugStream) и несколько предопределённых макросов
для удобства использования.
- myinfo - info
- mywarn - warn
- mycrit - crit
- mylog1..mylog9 - вывод в уровни level1....level9
- mylogany - any
Так же можно использовать функции напрямую:
\code
mylog->info() << "....test..." << endl;
mylog->log1() << "....test..." << endl;
\endcode
\p Помимо объекта mylog класс содержит ряд вспомогательных функций:
- \b string \b dumpIO() - вывод состояния всех входов и выходов в строку, в виде:
\code
ObjectName:
in_input1_s(Sensor1_S)=1
in_output2_c(Output1_C)=0
...
\endcode
- \b string \b str( ObjectId,showLinkName) - вывод названия указанного входа или выхода в формате "in_input1_s(Sensor1_S)". Если
showLinkName=false, то будет сформирована строка "in_input1_s". Пример использования:
\code
..
myinfo << str(input1_s) << endl;
\endcode
- \b string \b strval( ObjectId,showLinkName) - вывод названия и текущего значения указанного входа или выхода в формате "in_input1_s(Sensor1_S)=1". Если
showLinkName=false, то будет сформирована строка "in_input1_s=1". Пример использования:
\code
..
myinfo << strval(input1_s) << endl;
\endcode
\section pg_Codegen_loglevel Управление логами объекта (процесса) через специальный датчик \section pg_Codegen_loglevel Управление логами объекта (процесса) через специальный датчик
Для динамического управления логами процесса предусмотрен механизм, который позволяет указать аналговый датчик (AI), Для динамического управления логами процесса предусмотрен механизм, который позволяет указать аналговый датчик (AI),
...@@ -326,5 +365,4 @@ MyClass_SK.cc: myclass.src.xml ...@@ -326,5 +365,4 @@ MyClass_SK.cc: myclass.src.xml
4117 4117
\endcode \endcode
Т.е. для того, чтобы включить указанные логи в датчик нужно записать число \b 4117 Т.е. для того, чтобы включить указанные логи в датчик нужно записать число \b 4117
*/ */
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