Commit 54e4c58a authored by Pavel Vainerman's avatar Pavel Vainerman

(codegen): Небольшой рефакторинг механизма работы с сообщениями,

убрали устаревшую функцию (alarm), добавил удобное значение по умолчанию... оставил только одну функцию setMsg().
parent 2d07bd4e
......@@ -259,20 +259,6 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updateOutputs( bool _force )
</xsl:for-each>
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
{
// блокируем сброс (т.к. он автоматически по таймеру)
if( !_state )
{
ptResetMsg.reset();
return;
}
alarm( _code, _state );
ptResetMsg.reset();
}
// ----------------------------------------------------------------------------
<!-- END CC-FILE -->
</xsl:template>
......
......@@ -197,20 +197,6 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updateOutputs( bool _force )
-->
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
{
// блокируем сброс (т.к. он автоматически по таймеру)
if( !_state )
{
ptResetMsg.reset();
return;
}
alarm( _code, _state );
ptResetMsg.reset();
}
// ----------------------------------------------------------------------------
<!-- END CC-FILE -->
</xsl:template>
......
......@@ -238,19 +238,6 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preAskSensors( UniversalIO::UIOComm
}
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
{
// блокируем сброс (т.к. он автоматически по таймеру)
if( !_state )
{
ptResetMsg.reset();
return;
}
alarm( _code, _state );
ptResetMsg.reset();
}
// ----------------------------------------------------------------------------
<!-- END CC-FILE -->
</xsl:template>
......
......@@ -182,19 +182,6 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( const UniSetTypes::S
sensorInfo(sm);
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId code, bool state )
{
// блокируем сброс (т.к. он автоматически по таймеру)
if( !state )
{
ptResetMsg.reset();
return;
}
alarm( code, state );
ptResetMsg.reset();
}
// ----------------------------------------------------------------------------
<!-- END CC-FILE -->
</xsl:template>
......
......@@ -164,12 +164,12 @@
</xsl:template>
<xsl:template name="COMMON-HEAD-PUBLIC">
bool alarm( UniSetTypes::ObjectId sid, bool state );
long getValue( UniSetTypes::ObjectId sid );
void setValue( UniSetTypes::ObjectId sid, long value );
void askSensor( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand, UniSetTypes::ObjectId node = UniSetTypes::uniset_conf()->getLocalNode() );
void updateValues();
void setMsg( UniSetTypes::ObjectId code, bool state );
virtual bool setMsg( UniSetTypes::ObjectId code, bool state = true );
std::shared_ptr&lt;DebugStream&gt; mylog;
void init_dlog( std::shared_ptr&lt;DebugStream&gt; d );
......@@ -861,18 +861,20 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::checkSensors()
</xsl:for-each>
}
// -----------------------------------------------------------------------------
bool <xsl:value-of select="$CLASSNAME"/>_SK::alarm( UniSetTypes::ObjectId _code, bool _state )
bool <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
{
if( _code == UniSetTypes::DefaultObjectId )
{
mycrit &lt;&lt; getName()
&lt;&lt; "(alarm): попытка послать сообщение с DefaultObjectId"
&lt;&lt; endl;
mycrit &lt;&lt; "(setMsg): попытка послать сообщение с DefaultObjectId" &lt;&lt; endl;
return false;
}
mylog8 &lt;&lt; getName() &lt;&lt; "(alarm): " &lt;&lt; ( _state ? "SEND " : "RESET " ) &lt;&lt; endl;
mylog8 &lt;&lt; "(setMsg): " &lt;&lt; ( _state ? "SEND " : "RESET " ) &lt;&lt; endl;
// взводим автоматический сброс
if( _state )
ptResetMsg.reset();
<xsl:for-each select="//msgmap/item">
if( _code == <xsl:value-of select="@name"/> )
{
......@@ -888,14 +890,14 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::alarm( UniSetTypes::ObjectId _code,
}
catch( const std::exception&amp;ex )
{
mycrit &lt;&lt; myname &lt;&lt; "(execute): catch " &lt;&lt; ex.what() &lt;&lt; endl;
mycrit &lt;&lt; "(setMsg): catch " &lt;&lt; ex.what() &lt;&lt; endl;
}
return false;
}
</xsl:for-each>
mylog8 &lt;&lt; " not found MessgeOID?!!" &lt;&lt; endl;
mylog8 &lt;&lt; "(setMsg): not found MessgeOID?!!" &lt;&lt; endl;
return false;
}
// -----------------------------------------------------------------------------
......@@ -1190,25 +1192,28 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::resetMsg()
}
// -----------------------------------------------------------------------------
bool <xsl:value-of select="$CLASSNAME"/>_SK::alarm( UniSetTypes::ObjectId _code, bool _state )
bool <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
{
if( _code == UniSetTypes::DefaultObjectId )
{
mycrit &lt;&lt; getName()
&lt;&lt; "(alarm): попытка послать сообщение с DefaultObjectId"
mycrit &lt;&lt; "(setMsg): попытка послать сообщение с DefaultObjectId"
&lt;&lt; endl;
return false;
}
mylog8 &lt;&lt; getName() &lt;&lt; "(alarm): (" &lt;&lt; _code &lt;&lt; ")" &lt;&lt; ( _state ? "SEND" : "RESET" ) &lt;&lt; endl;
mylog8 &lt;&lt; "(setMsg): (" &lt;&lt; _code &lt;&lt; ")" &lt;&lt; ( _state ? "SEND" : "RESET" ) &lt;&lt; endl;
// взводим таймер автоматического сброса
if( _state )
ptResetMsg.reset();
<xsl:for-each select="//sensors/item">
<xsl:call-template name="setmsg">
<xsl:with-param name="GENTYPE" select="'A'"/>
</xsl:call-template>
</xsl:for-each>
mylog8 &lt;&lt; " not found MessgeOID?!!" &lt;&lt; endl;
mylog8 &lt;&lt; "(setMsg): not found MessgeOID?!!" &lt;&lt; endl;
return false;
}
// -----------------------------------------------------------------------------
......
......@@ -12,7 +12,7 @@
Name: libuniset2
Version: 2.0
Release: alt23
Release: alt24
Summary: UniSet - library for building distributed industrial control systems
......@@ -409,6 +409,10 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# ..
%changelog
* Thu Apr 02 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt24
- codegen: modify interface for messages (setMsg())
- remove alarm() function (deprecated)
* Thu Mar 19 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt23
- unetudp: fxied critial bug in "switching channels" (thank`s Alexey Surov)
......
......@@ -145,14 +145,12 @@
\endcode
Для сообщений генерируется такой же набор "переменных" как и для полей указанных в \<smap> (см. \ref pg_Codegen_SMap). За исключением того,
что генерируется имя с префиксом \b mid_. И "привязка" идентификаторов не является обязательной.
\warning Датчики-сообщений \b ОБЯЗАТЕЛЬНО должны иметь тип \b "DI"
Для работы с сообщениями существует ряд правил:
- сообщения должны посылаться при помощи специальной (сгенерированной) функции
\b setMsg( UniSetTypes::ObjectId code, bool state ) или \b alarm( UniSetTypes::ObjectId code, bool state ).
Для передачи сообщения необходим вызов c параметром \b state=true.
\b setMsg( UniSetTypes::ObjectId code, bool state ). Для передачи сообщения необходим вызов c параметром \b state=true.
- Сообщения "автоматически" сбрасываются в "0" через \b resetMsgTime (настраиваемое в конф. секции), поэтому
вызывать функции с \b state=false нет смысла.
вызывать функции с \b state=false нет смысла. Если указать resetMsgTime <=0 - автоматический сброс происходить не будет.
\section pg_Codegen_Variables Секция <variables>
В данной секции можно перечислить \b переменные разных типов, для которых будет сгенерирован код по их "инициализации"
......
......@@ -8,7 +8,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: 2015-03-06+03:00
// generate timestamp: 2015-04-02+03:00
// -----------------------------------------------------------------------------
#ifndef UObject_SK_H_
#define UObject_SK_H_
......@@ -31,12 +31,12 @@ class UObject_SK:
virtual ~UObject_SK();
bool alarm( UniSetTypes::ObjectId sid, bool state );
long getValue( UniSetTypes::ObjectId sid );
void setValue( UniSetTypes::ObjectId sid, long value );
void askSensor( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand, UniSetTypes::ObjectId node = UniSetTypes::uniset_conf()->getLocalNode() );
void updateValues();
void setMsg( UniSetTypes::ObjectId code, bool state );
virtual bool setMsg( UniSetTypes::ObjectId code, bool state = true );
std::shared_ptr<DebugStream> mylog;
void init_dlog( std::shared_ptr<DebugStream> d );
......@@ -81,6 +81,31 @@ class UObject_SK:
#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 );
// ------------------------------------------------------------
// Используемые идентификаторы
......
......@@ -11,11 +11,12 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: 2015-03-06+03:00
// generate timestamp: 2015-04-02+03:00
// -----------------------------------------------------------------------------
#include <memory>
#include "Configuration.h"
#include "Exceptions.h"
#include "ORepHelpers.h"
#include "UObject_SK.h"
// -----------------------------------------------------------------------------
......@@ -138,7 +139,11 @@ end_private(false)
sleep_msec = conf->getArgPInt("--" + argprefix + "sleep-msec","150", 150);
resetMsgTime = conf->getPIntProp(cnode,"resetMsgTime", 2000);
string s_resetTime("");
if( s_resetTime.empty() )
s_resetTime = "500";
resetMsgTime = uni_atoi(init3_str(conf->getArgParam("--" + argprefix + "resetMsgTime"),conf->getProp(cnode,"resetMsgTime"),s_resetTime));
ptResetMsg.setTiming(resetMsgTime);
smReadyTimeout = conf->getArgInt("--" + argprefix + "sm-ready-timeout","");
......@@ -182,21 +187,23 @@ void UObject_SK::checkSensors()
}
// -----------------------------------------------------------------------------
bool UObject_SK::alarm( UniSetTypes::ObjectId _code, bool _state )
bool UObject_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
{
if( _code == UniSetTypes::DefaultObjectId )
{
mycrit << getName()
<< "(alarm): попытка послать сообщение с DefaultObjectId"
<< endl;
mycrit << "(setMsg): попытка послать сообщение с DefaultObjectId" << endl;
return false;
}
mylog8 << getName() << "(alarm): " << ( _state ? "SEND " : "RESET " ) << endl;
mylog8 << "(setMsg): " << ( _state ? "SEND " : "RESET " ) << endl;
// взводим автоматический сброс
if( _state )
ptResetMsg.reset();
mylog8 << " not found MessgeOID?!!" << endl;
mylog8 << "(setMsg): not found MessgeOID?!!" << endl;
return false;
}
// -----------------------------------------------------------------------------
......@@ -215,6 +222,28 @@ void UObject_SK::testMode( bool _state )
}
// -----------------------------------------------------------------------------
std::string UObject_SK::dumpIO()
{
ostringstream s;
s << myname << ": " << endl;
return s.str();
}
// ----------------------------------------------------------------------------
std::string UObject_SK::str( UniSetTypes::ObjectId id, bool showLinkName )
{
ostringstream s;
return "";
}
// ----------------------------------------------------------------------------
std::string UObject_SK::strval( UniSetTypes::ObjectId id, bool showLinkName )
{
ostringstream s;
return "";
}
// ----------------------------------------------------------------------------
// --------------------------------------------------------------------------
......@@ -496,16 +525,3 @@ void UObject_SK::preAskSensors( UniversalIO::UIOCommand _cmd )
}
}
// -----------------------------------------------------------------------------
void UObject_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
{
// блокируем сброс (т.к. он автоматически по таймеру)
if( !_state )
{
ptResetMsg.reset();
return;
}
alarm( _code, _state );
ptResetMsg.reset();
}
// ----------------------------------------------------------------------------
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