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

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

parent 382117db
......@@ -214,6 +214,31 @@
#ifndef mylogany
#define mylogany mylog->any()
#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 name="COMMON-HEAD-PROTECTED">
......@@ -524,6 +549,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::waitSM( int wait_msec, ObjectId _te
#include &lt;memory&gt;
#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"/>ORepHelpers.h<xsl:call-template name="postinclude"/>
#include "<xsl:value-of select="$SK_H_FILENAME"/>"
// -----------------------------------------------------------------------------
......@@ -903,6 +929,46 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::testMode( bool _state )
</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>
......@@ -1138,6 +1204,58 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::alarm( UniSetTypes::ObjectId _code,
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 name="check_changes">
......
......@@ -53,7 +53,6 @@ int main( int argc, const char** argv )
try
{
auto conf = uniset_init(argc, argv);
<xsl:if test="not(normalize-space(//@OID))=''">
<xsl:value-of select="$CLASSNAME"/> obj;
</xsl:if>
......@@ -72,21 +71,20 @@ int main( int argc, const char** argv )
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 logname( conf->getLogDir() + logfilename );
obj.mylog->logFile( logname.c_str() );
obj->mylog->logFile( logname.c_str() );
</xsl:if>
auto act = UniSetActivator::Instance();
act-&gt;add(obj.get_ptr());
act-&gt;add(obj);
SystemMessage sm(SystemMessage::StartUp);
act-&gt;broadcast( sm.transport_msg() );
act-&gt;run(false);
pause(); // пауза, чтобы дочерние потоки успели завершить работ
return 0;
}
catch( const Exception&amp; ex)
{
......@@ -101,7 +99,7 @@ int main( int argc, const char** argv )
cerr &lt;&lt; "(main): catch ..." &lt;&lt; endl;
}
return 0;
return 1;
}
</xsl:template>
</xsl:stylesheet>
......@@ -21,16 +21,19 @@ TestGen::TestGen()
// -----------------------------------------------------------------------------
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 )
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:
protected:
TestGen();
virtual void step();
void sensorInfo( UniSetTypes::SensorMessage *sm );
void timerInfo( UniSetTypes::TimerMessage *tm );
virtual void sigterm( int signo );
virtual void step() override;
virtual void sensorInfo( const UniSetTypes::SensorMessage *sm ) override;
virtual void timerInfo( const UniSetTypes::TimerMessage *tm ) override;
virtual void sigterm( int signo ) override;
private:
};
......
......@@ -15,7 +15,7 @@ TestGenAlone::~TestGenAlone()
// -----------------------------------------------------------------------------
void TestGenAlone::step()
{
cout << "input2 state=" << in_input2_s << endl;
cout << strval(in_input2_s) << endl;
}
// -----------------------------------------------------------------------------
void TestGenAlone::sensorInfo( SensorMessage *sm )
......
......@@ -12,7 +12,7 @@
Name: libuniset2
Version: 2.0
Release: alt21
Release: alt22
Summary: UniSet - library for building distributed industrial control systems
......@@ -409,6 +409,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# ..
%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
- codegen: adjustment documentation
- unetudp: add tests, minor optimization (thank`s uzum)
......
......@@ -153,7 +153,7 @@
<UDPExchange2 name="UDPExchange2"/>
<UNetExchange name="UNetExchange"/>
<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">
<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"/>
......
......@@ -11,9 +11,9 @@
- \ref pg_Codegen_Make
- \ref pg_Codegen_Templ_Ask
- \ref pg_Codegen_Templ_Alone
- \ref pg_Codegen_log
- \ref pg_Codegen_loglevel
\section pg_Codegen_Common Общее описание утилиты uniset-codegen
Утилита uniset-codegen предназначена для генерирования "скелета" процесса управления на основе
заданного xml-описания. В скелет процесса включается "рутинный" код по получению и проверке индетификаторов,
......@@ -306,6 +306,45 @@ MyClass_SK.cc: myclass.src.xml
- \b --no-main - отключает генерирование "запускающего" файла (функция main)
- \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 Управление логами объекта (процесса) через специальный датчик
Для динамического управления логами процесса предусмотрен механизм, который позволяет указать аналговый датчик (AI),
......@@ -326,5 +365,4 @@ MyClass_SK.cc: myclass.src.xml
4117
\endcode
Т.е. для того, чтобы включить указанные логи в датчик нужно записать число \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