Commit 0b420448 authored by Pavel Vainerman's avatar Pavel Vainerman

(codegen): Сделал входные переменные (in_xxx) - readonly!

УБРАЛ обновление in_переменной в функции getValue(), т.к. это потенциально приводит к "потере" sensorInfo(). Перенёс некоторые функции в private.
parent a14e60c7
...@@ -123,12 +123,12 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( const UniSetTypes::S ...@@ -123,12 +123,12 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( const UniSetTypes::S
<xsl:if test="normalize-space(@vartype)='in'"> <xsl:if test="normalize-space(@vartype)='in'">
<xsl:if test="normalize-space(@loglevel)=''"> <xsl:if test="normalize-space(@loglevel)=''">
if( _sm->id == <xsl:value-of select="../../@name"/> ) if( _sm->id == <xsl:value-of select="../../@name"/> )
<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = _sm->value; priv_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = _sm->value;
</xsl:if> </xsl:if>
<xsl:if test="normalize-space(@loglevel)!=''"> <xsl:if test="normalize-space(@loglevel)!=''">
if( _sm->id == <xsl:value-of select="../../@name"/> ) if( _sm->id == <xsl:value-of select="../../@name"/> )
{ {
<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = _sm->value; priv_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = _sm->value;
mylog->level( Debug::type(_sm->value) ); mylog->level( Debug::type(_sm->value) );
} }
</xsl:if> </xsl:if>
...@@ -150,7 +150,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM() ...@@ -150,7 +150,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM()
{ {
try try
{ {
<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>,node_<xsl:value-of select="../../@name"/>); <xsl:if test="normalize-space(@vartype)='in'">priv_</xsl:if><xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>,node_<xsl:value-of select="../../@name"/>);
} }
catch( std::exception&amp; ex ) catch( std::exception&amp; ex )
{ {
...@@ -258,7 +258,7 @@ long <xsl:value-of select="$CLASSNAME"/>_SK::getValue( UniSetTypes::ObjectId _si ...@@ -258,7 +258,7 @@ long <xsl:value-of select="$CLASSNAME"/>_SK::getValue( UniSetTypes::ObjectId _si
<xsl:if test="normalize-space(../../@msg)!='1'"> <xsl:if test="normalize-space(../../@msg)!='1'">
if( _sid == <xsl:value-of select="../../@name"/> ) if( _sid == <xsl:value-of select="../../@name"/> )
{ {
<xsl:text> </xsl:text><xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>); <xsl:if test="normalize-space(@vartype)='in'">/* <xsl:text> </xsl:text>priv_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>); */</xsl:if>
return <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>; return <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>;
} }
</xsl:if> </xsl:if>
...@@ -317,7 +317,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updateOutputs( bool _force ) ...@@ -317,7 +317,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updateOutputs( bool _force )
{ {
<xsl:if test="normalize-space(../../@msg)!='1'"> <xsl:if test="normalize-space(../../@msg)!='1'">
<xsl:if test="normalize-space(@name)=$OID"> <xsl:if test="normalize-space(@name)=$OID">
<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>); priv_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>);
</xsl:if> </xsl:if>
</xsl:if> </xsl:if>
} }
......
...@@ -148,7 +148,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM() ...@@ -148,7 +148,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM()
{ {
try try
{ {
<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>,node_<xsl:value-of select="../../@name"/>); <xsl:if test="normalize-space(@vartype)='in'">priv_</xsl:if><xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>,node_<xsl:value-of select="../../@name"/>);
} }
catch( std::exception&amp; ex ) catch( std::exception&amp; ex )
{ {
...@@ -257,7 +257,7 @@ UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::getSMTestID() ...@@ -257,7 +257,7 @@ UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::getSMTestID()
{ {
<xsl:if test="normalize-space(../../@msg)!='1'"> <xsl:if test="normalize-space(../../@msg)!='1'">
<xsl:if test="normalize-space(@name)=$OID"> <xsl:if test="normalize-space(@name)=$OID">
<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>); priv_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/> = ui->getValue(<xsl:value-of select="../../@name"/>);
</xsl:if> </xsl:if>
</xsl:if> </xsl:if>
} }
......
...@@ -168,12 +168,12 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( const UniSetTypes::S ...@@ -168,12 +168,12 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( const UniSetTypes::S
<xsl:if test="normalize-space(@vartype)='in'"> <xsl:if test="normalize-space(@vartype)='in'">
<xsl:if test="normalize-space(@loglevel)=''"> <xsl:if test="normalize-space(@loglevel)=''">
if( _sm->id == <xsl:value-of select="@name"/> ) if( _sm->id == <xsl:value-of select="@name"/> )
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = _sm->value; priv_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = _sm->value;
</xsl:if> </xsl:if>
<xsl:if test="normalize-space(@loglevel)!=''"> <xsl:if test="normalize-space(@loglevel)!=''">
if( _sm->id == <xsl:value-of select="@name"/> ) if( _sm->id == <xsl:value-of select="@name"/> )
{ {
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = _sm->value; priv_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = _sm->value;
mylog->level( Debug::type(_sm->value) ); mylog->level( Debug::type(_sm->value) );
} }
</xsl:if> </xsl:if>
...@@ -191,7 +191,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM() ...@@ -191,7 +191,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM()
{ {
try try
{ {
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>,node_<xsl:value-of select="@name"/>); <xsl:if test="normalize-space(@vartype)='in'">priv_</xsl:if><xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>,node_<xsl:value-of select="@name"/>);
} }
catch( std::exception&amp; ex ) catch( std::exception&amp; ex )
{ {
...@@ -214,7 +214,7 @@ long <xsl:value-of select="$CLASSNAME"/>_SK::getValue( UniSetTypes::ObjectId _si ...@@ -214,7 +214,7 @@ long <xsl:value-of select="$CLASSNAME"/>_SK::getValue( UniSetTypes::ObjectId _si
<xsl:for-each select="//smap/item"> <xsl:for-each select="//smap/item">
if( _sid == <xsl:value-of select="@name"/> &amp;&amp; <xsl:value-of select="@name"/> != DefaultObjectId ) if( _sid == <xsl:value-of select="@name"/> &amp;&amp; <xsl:value-of select="@name"/> != DefaultObjectId )
{ {
<xsl:text> </xsl:text><xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>, node_<xsl:value-of select="@name"/>); <xsl:if test="normalize-space(@vartype)='in'">/* <xsl:text> </xsl:text>priv_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>, node_<xsl:value-of select="@name"/>); */</xsl:if>
return <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>; return <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
} }
</xsl:for-each> </xsl:for-each>
...@@ -278,7 +278,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preAskSensors( UniversalIO::UIOComm ...@@ -278,7 +278,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preAskSensors( UniversalIO::UIOComm
{ {
try try
{ {
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>, node_<xsl:value-of select="@name"/>); priv_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>, node_<xsl:value-of select="@name"/>);
} }
catch( UniSetTypes::Exception&amp; ex ) catch( UniSetTypes::Exception&amp; ex )
{ {
......
...@@ -201,7 +201,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM() ...@@ -201,7 +201,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM()
{ {
try try
{ {
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>,node_<xsl:value-of select="@name"/>); <xsl:if test="normalize-space(@vartype)='in'">priv_</xsl:if><xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>,node_<xsl:value-of select="@name"/>);
} }
catch( std::exception&amp; ex ) catch( std::exception&amp; ex )
{ {
...@@ -219,7 +219,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM() ...@@ -219,7 +219,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM()
try try
{ {
if( <xsl:value-of select="@name"/> != DefaultObjectId ) if( <xsl:value-of select="@name"/> != DefaultObjectId )
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>,node_<xsl:value-of select="@name"/>); priv_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = ui->getValue(<xsl:value-of select="@name"/>,node_<xsl:value-of select="@name"/>);
} }
catch( const Exception&amp; ex ) catch( const Exception&amp; ex )
{ {
......
...@@ -39,7 +39,9 @@ ...@@ -39,7 +39,9 @@
<xsl:when test="$GENTYPE='H'"> <xsl:when test="$GENTYPE='H'">
<xsl:if test="normalize-space(@vartype)!='io'">const UniSetTypes::ObjectId <xsl:value-of select="../../@name"/>; /*!&lt; <xsl:value-of select="../../@textname"/> */ <xsl:if test="normalize-space(@vartype)!='io'">const UniSetTypes::ObjectId <xsl:value-of select="../../@name"/>; /*!&lt; <xsl:value-of select="../../@textname"/> */
UniSetTypes::ObjectId node_<xsl:value-of select="../../@name"/>; UniSetTypes::ObjectId node_<xsl:value-of select="../../@name"/>;
long <xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>; /*!&lt; текущее значение '<xsl:value-of select="../../@name"/>' */ <xsl:if test="normalize-space(@vartype)='in'">const long&amp; </xsl:if>
<xsl:if test="normalize-space(@vartype)!='in'">long </xsl:if>
<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>; /*!&lt; текущее значение '<xsl:value-of select="../../@name"/>' */
</xsl:if> </xsl:if>
<xsl:if test="normalize-space(@vartype)='io'">#warning (uniset-codegen): vartype='io' NO LONGER SUPPORTED! (ignore variable: '<xsl:value-of select="../../@name"/>') <xsl:if test="normalize-space(@vartype)='io'">#warning (uniset-codegen): vartype='io' NO LONGER SUPPORTED! (ignore variable: '<xsl:value-of select="../../@name"/>')
</xsl:if> </xsl:if>
...@@ -47,6 +49,8 @@ ...@@ -47,6 +49,8 @@
<xsl:when test="$GENTYPE='H-PRIVATE'"> <xsl:when test="$GENTYPE='H-PRIVATE'">
<xsl:if test="normalize-space(@vartype)!='io'">long prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>; /*!&lt; предыдущее значение '<xsl:value-of select="../../@name"/>'*/ <xsl:if test="normalize-space(@vartype)!='io'">long prev_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>; /*!&lt; предыдущее значение '<xsl:value-of select="../../@name"/>'*/
</xsl:if> </xsl:if>
<xsl:if test="normalize-space(@vartype)='in'">long priv_<xsl:call-template name="setprefix"/><xsl:value-of select="../../@name"/>; /*!&lt; rw-значение '<xsl:value-of select="../../@name"/>'*/
</xsl:if>
<xsl:if test="normalize-space(@vartype)='io'">#warning (uniset-codegen): vartype='io' NO LONGER SUPPORTED! (ignore variable: '<xsl:value-of select="../../@name"/>') <xsl:if test="normalize-space(@vartype)='io'">#warning (uniset-codegen): vartype='io' NO LONGER SUPPORTED! (ignore variable: '<xsl:value-of select="../../@name"/>')
</xsl:if> </xsl:if>
</xsl:when> </xsl:when>
...@@ -263,19 +267,15 @@ ...@@ -263,19 +267,15 @@
virtual bool activateObject() override; virtual bool activateObject() override;
virtual std::string getMonitInfo(){ return ""; } /*!&lt; пользовательская информация выводимая в getInfo() */ virtual std::string getMonitInfo(){ return ""; } /*!&lt; пользовательская информация выводимая в getInfo() */
// Выполнение очередного шага программы
virtual void step(){}
virtual void testMode( bool state ); virtual void testMode( bool state );
void updatePreviousValues();
void checkSensors();
void updateOutputs( bool force ); void updateOutputs( bool force );
<xsl:if test="normalize-space($TESTMODE)!=''"> <xsl:if test="normalize-space($TESTMODE)!=''">
bool checkTestMode(); bool checkTestMode();
</xsl:if> </xsl:if>
void preAskSensors( UniversalIO::UIOCommand cmd );
void preSensorInfo( const UniSetTypes::SensorMessage* sm );
void preTimerInfo( const UniSetTypes::TimerMessage* tm );
void preSysCommand( const UniSetTypes::SystemMessage* sm );
void waitSM( int wait_msec, UniSetTypes::ObjectId testID = UniSetTypes::DefaultObjectId ); void waitSM( int wait_msec, UniSetTypes::ObjectId testID = UniSetTypes::DefaultObjectId );
void initFromSM();
UniSetTypes::ObjectId getSMTestID(); UniSetTypes::ObjectId getSMTestID();
void resetMsg(); void resetMsg();
...@@ -283,16 +283,13 @@ ...@@ -283,16 +283,13 @@
PassiveTimer ptResetMsg; PassiveTimer ptResetMsg;
int resetMsgTime; int resetMsgTime;
// Выполнение очередного шага программы
virtual void step(){}
int sleep_msec; /*!&lt; пауза между итерациями */ int sleep_msec; /*!&lt; пауза между итерациями */
bool active; bool active;
<xsl:if test="normalize-space($TESTMODE)!=''"> <xsl:if test="normalize-space($TESTMODE)!=''">
bool isTestMode; bool isTestMode;
Trigger trTestMode; Trigger trTestMode;
UniSetTypes::ObjectId idTestMode_S; /*!&lt; идентификатор для флага тестовго режима (для всех) */ const UniSetTypes::ObjectId idTestMode_S; /*!&lt; идентификатор для флага тестовго режима (для всех) */
UniSetTypes::ObjectId idLocalTestMode_S; /*!&lt; идентификатор для флага тестовго режима (для данного узла) */ const UniSetTypes::ObjectId idLocalTestMode_S; /*!&lt; идентификатор для флага тестовго режима (для данного узла) */
bool in_TestMode_S; bool in_TestMode_S;
bool in_LocalTestMode_S; bool in_LocalTestMode_S;
</xsl:if> </xsl:if>
...@@ -302,7 +299,7 @@ ...@@ -302,7 +299,7 @@
// управление датчиком "сердцебиения" // управление датчиком "сердцебиения"
PassiveTimer ptHeartBeat; /*! &lt; период "сердцебиения" */ PassiveTimer ptHeartBeat; /*! &lt; период "сердцебиения" */
UniSetTypes::ObjectId idHeartBeat; /*! &lt; идентификатор датчика (AI) "сердцебиения" */ UniSetTypes::ObjectId idHeartBeat; /*! &lt; идентификатор датчика (AI) "сердцебиения" */
int maxHeartBeat; /*! &lt; сохраняемое значение */ long maxHeartBeat; /*! &lt; сохраняемое значение */
xmlNode* confnode; xmlNode* confnode;
/*! получить числовое свойство из конф. файла по привязанной confnode */ /*! получить числовое свойство из конф. файла по привязанной confnode */
...@@ -325,47 +322,71 @@ ...@@ -325,47 +322,71 @@
std::string logserv_host = {""}; std::string logserv_host = {""};
int logserv_port = {0}; int logserv_port = {0};
// snap
bool no_snap = {false};
VMonitor vmon; VMonitor vmon;
<xsl:if test="normalize-space($VARMAP)='1'"> <xsl:if test="normalize-space($VARMAP)='1'">
/*! Получить указатель на переменную храняющую значение, по идентификатору /*! Получить указатель на in_переменную храняющую значение, по идентификатору
* \return nullptr если элемент не найден * \return nullptr если элемент не найден
*/ */
long* valptr( UniSetTypes::ObjectId id ); const long* valptr( const UniSetTypes::ObjectId&amp; id );
/*! Получить указатель на out_переменную храняющую значение, по идентификатору
* \return nullptr если элемент не найден
*/
long* outptr( const UniSetTypes::ObjectId&amp; id );
/*! Получить id по переменной храняющей значение /*! Получить id по переменной храняющей значение
* \return DefaultObjectId элемент не найден или если нет привязки * \return DefaultObjectId элемент не найден или если нет привязки
*/ */
UniSetTypes::ObjectId idval( long* vptr ); // работа по указателю UniSetTypes::ObjectId idval( const long* vptr ) const; // работа по const указателю
UniSetTypes::ObjectId idval( long&amp; vptr ); // работа по ссылке.. UniSetTypes::ObjectId idval( const long&amp; vptr ) const; // работа const по ссылке..
UniSetTypes::ObjectId idval( long* vptr ) const; // работа по указателю
UniSetTypes::ObjectId idval( long&amp; vptr ) const; // работа по ссылке..
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
<xsl:template name="COMMON-HEAD-PRIVATE"> <xsl:template name="COMMON-HEAD-PRIVATE">
// ------------ private функции ---------------
void updatePreviousValues();
void preAskSensors( UniversalIO::UIOCommand cmd );
void preSensorInfo( const UniSetTypes::SensorMessage* sm );
void preTimerInfo( const UniSetTypes::TimerMessage* tm );
void preSysCommand( const UniSetTypes::SystemMessage* sm );
void initFromSM();
void checkSensors();
// --------------------------------------------
<xsl:if test="normalize-space($VARMAP)='1'"> <xsl:if test="normalize-space($VARMAP)='1'">
class PtrMapHashFn class PtrMapHashFn
{ {
public: public:
size_t operator() (long* const&amp; key) const size_t operator() (const long* const&amp; key) const
{ {
return std::hash&lt;long*&gt;()(key); return std::hash&lt;long&gt;()((long)key);
} }
}; };
class PtrMapEqualFn class PtrMapEqualFn
{ {
public: public:
bool operator() (long* const&amp; i1, long* const&amp; i2) const bool operator() (const long* const&amp; i1, const long* const&amp; i2) const
{ {
return (i1 == i2); return (i1 == i2);
} }
}; };
std::unordered_map&lt;UniSetTypes::ObjectId,long*&gt; vmap; class VMapHashFn
std::unordered_map&lt;long*,const UniSetTypes::ObjectId*,PtrMapHashFn,PtrMapEqualFn&gt; ptrmap; {
public:
size_t operator() (const UniSetTypes::ObjectId&amp; key) const
{
return std::hash&lt;long&gt;()(key);
}
};
std::unordered_map&lt;const UniSetTypes::ObjectId,const long*,VMapHashFn&gt; vmap;
std::unordered_map&lt;const UniSetTypes::ObjectId,long*,VMapHashFn&gt; outvmap;
std::unordered_map&lt;const long*,const UniSetTypes::ObjectId*,PtrMapHashFn,PtrMapEqualFn&gt; ptrmap;
std::unordered_map&lt;long*,const UniSetTypes::ObjectId*,PtrMapHashFn,PtrMapEqualFn&gt; outptrmap;
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
...@@ -502,7 +523,7 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::checkTestMode() ...@@ -502,7 +523,7 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::checkTestMode()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
</xsl:if> </xsl:if>
<xsl:if test="normalize-space($VARMAP)='1'"> <xsl:if test="normalize-space($VARMAP)='1'">
long* <xsl:value-of select="$CLASSNAME"/>_SK::valptr( UniSetTypes::ObjectId id ) const long* <xsl:value-of select="$CLASSNAME"/>_SK::valptr( const UniSetTypes::ObjectId&amp; id )
{ {
auto i = vmap.find(id); auto i = vmap.find(id);
if( i!= vmap.end() ) if( i!= vmap.end() )
...@@ -511,7 +532,16 @@ long* <xsl:value-of select="$CLASSNAME"/>_SK::valptr( UniSetTypes::ObjectId id ) ...@@ -511,7 +532,16 @@ long* <xsl:value-of select="$CLASSNAME"/>_SK::valptr( UniSetTypes::ObjectId id )
return nullptr; return nullptr;
} }
UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long* p ) long* <xsl:value-of select="$CLASSNAME"/>_SK::outptr( const UniSetTypes::ObjectId&amp; id )
{
auto i = outvmap.find(id);
if( i!= outvmap.end() )
return i->second;
return nullptr;
}
UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( const long* p ) const
{ {
auto i = ptrmap.find(p); auto i = ptrmap.find(p);
if( i!= ptrmap.end() ) if( i!= ptrmap.end() )
...@@ -520,7 +550,7 @@ UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long* p ) ...@@ -520,7 +550,7 @@ UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long* p )
return UniSetTypes::DefaultObjectId; return UniSetTypes::DefaultObjectId;
} }
UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long&amp; p ) UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( const long&amp; p ) const
{ {
auto i = ptrmap.find(&amp;p); auto i = ptrmap.find(&amp;p);
if( i!= ptrmap.end() ) if( i!= ptrmap.end() )
...@@ -528,6 +558,24 @@ UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long&amp; p ...@@ -528,6 +558,24 @@ UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long&amp; p
return UniSetTypes::DefaultObjectId; return UniSetTypes::DefaultObjectId;
} }
UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long&amp; p ) const
{
auto i = outptrmap.find(&amp;p);
if( i!= outptrmap.end() )
return *(i->second);
return UniSetTypes::DefaultObjectId;
}
UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long* p ) const
{
auto i = outptrmap.find(p);
if( i!= outptrmap.end() )
return *(i->second);
return UniSetTypes::DefaultObjectId;
}
</xsl:if> </xsl:if>
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::sigterm( int signo ) void <xsl:value-of select="$CLASSNAME"/>_SK::sigterm( int signo )
...@@ -706,6 +754,9 @@ using namespace UniSetTypes; ...@@ -706,6 +754,9 @@ using namespace UniSetTypes;
<xsl:if test="normalize-space(@vartype)!='io'"> <xsl:if test="normalize-space(@vartype)!='io'">
<xsl:value-of select="@name"/>(DefaultObjectId), <xsl:value-of select="@name"/>(DefaultObjectId),
node_<xsl:value-of select="@name"/>(DefaultObjectId), node_<xsl:value-of select="@name"/>(DefaultObjectId),
<xsl:if test="normalize-space(@vartype)='in'">
in_<xsl:value-of select="@name"/>(priv_in_<xsl:value-of select="@name"/>),
</xsl:if>
</xsl:if> </xsl:if>
</xsl:for-each> </xsl:for-each>
// Используемые идентификаторы сообщений (имена берутся из конф. файла) // Используемые идентификаторы сообщений (имена берутся из конф. файла)
...@@ -766,9 +817,11 @@ static const std::string init3_str( const std::string&amp; s1, const std::string ...@@ -766,9 +817,11 @@ static const std::string init3_str( const std::string&amp; s1, const std::string
// Инициализация идентификаторов (имена берутся из конф. файла) // Инициализация идентификаторов (имена берутся из конф. файла)
<xsl:for-each select="//smap/item"> <xsl:for-each select="//smap/item">
<xsl:if test="normalize-space(@vartype)!='io'"> <xsl:if test="normalize-space(@vartype)!='io'">
<xsl:value-of select="normalize-space(@name)"/>(uniset_conf()->getSensorID(uniset_conf()->getProp(cnode,"<xsl:value-of select="normalize-space(@name)"/>"))), <xsl:value-of select="normalize-space(@name)"/>(uniset_conf()->getSensorID(uniset_conf()->getProp(cnode,"<xsl:value-of select="normalize-space(@name)"/>"))),
node_<xsl:value-of select="normalize-space(@name)"/>( uniset_conf()->getNodeID(uniset_conf()->getProp(cnode,"node_<xsl:value-of select="normalize-space(@name)"/>")) ), node_<xsl:value-of select="normalize-space(@name)"/>( uniset_conf()->getNodeID(uniset_conf()->getProp(cnode,"node_<xsl:value-of select="normalize-space(@name)"/>")) ),
</xsl:if> </xsl:if>
<xsl:if test="normalize-space(@vartype)='in'">in_<xsl:value-of select="@name"/>(priv_in_<xsl:value-of select="@name"/>),
</xsl:if>
</xsl:for-each> </xsl:for-each>
// Используемые идентификаторы сообщений (имена берутся из конф. файла) // Используемые идентификаторы сообщений (имена берутся из конф. файла)
<xsl:for-each select="//msgmap/item"><xsl:value-of select="normalize-space(@name)"/>(uniset_conf()->getSensorID(uniset_conf()->getProp(cnode,"<xsl:value-of select="normalize-space(@name)"/>"))), <xsl:for-each select="//msgmap/item"><xsl:value-of select="normalize-space(@name)"/>(uniset_conf()->getSensorID(uniset_conf()->getProp(cnode,"<xsl:value-of select="normalize-space(@name)"/>"))),
...@@ -854,9 +907,15 @@ end_private(false) ...@@ -854,9 +907,15 @@ end_private(false)
} }
<xsl:if test="normalize-space($VARMAP)='1'"> <xsl:if test="normalize-space($VARMAP)='1'">
<xsl:if test="normalize-space(@vartype)='in'">
vmap.emplace(<xsl:value-of select="normalize-space(@name)"/>,&amp;<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>); vmap.emplace(<xsl:value-of select="normalize-space(@name)"/>,&amp;<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>);
ptrmap.emplace(&amp;<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>,&amp;<xsl:value-of select="normalize-space(@name)"/>); ptrmap.emplace(&amp;<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>,&amp;<xsl:value-of select="normalize-space(@name)"/>);
</xsl:if> </xsl:if>
<xsl:if test="normalize-space(@vartype)='out'">
outvmap.emplace(<xsl:value-of select="normalize-space(@name)"/>,&amp;<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>);
outptrmap.emplace(&amp;<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>,&amp;<xsl:value-of select="normalize-space(@name)"/>);
</xsl:if>
</xsl:if>
</xsl:for-each> </xsl:for-each>
...@@ -910,11 +969,21 @@ end_private(false) ...@@ -910,11 +969,21 @@ end_private(false)
// Инициализация значений // Инициализация значений
<xsl:for-each select="//smap/item"> <xsl:for-each select="//smap/item">
<xsl:if test="normalize-space(@default)=''"> <xsl:if test="normalize-space(@default)=''">
<xsl:if test="normalize-space(@vartype)='in'">
priv_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = conf->getArgPInt("--" + argprefix + "<xsl:value-of select="@name"/>-default",it.getProp("<xsl:value-of select="@name"/>_default"),0);
</xsl:if>
<xsl:if test="normalize-space(@vartype)!='in'">
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = conf->getArgPInt("--" + argprefix + "<xsl:value-of select="@name"/>-default",it.getProp("<xsl:value-of select="@name"/>_default"),0); <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = conf->getArgPInt("--" + argprefix + "<xsl:value-of select="@name"/>-default",it.getProp("<xsl:value-of select="@name"/>_default"),0);
</xsl:if> </xsl:if>
</xsl:if>
<xsl:if test="not(normalize-space(@default)='')"> <xsl:if test="not(normalize-space(@default)='')">
<xsl:if test="normalize-space(@vartype)='in'">
priv_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = conf->getArgPInt("--" + argprefix + "<xsl:value-of select="@name"/>-default",it.getProp("<xsl:value-of select="@name"/>_default"),<xsl:value-of select="@default"/>);
</xsl:if>
<xsl:if test="normalize-space(@vartype)='in'">
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = conf->getArgPInt("--" + argprefix + "<xsl:value-of select="@name"/>-default",it.getProp("<xsl:value-of select="@name"/>_default"),<xsl:value-of select="@default"/>); <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/> = conf->getArgPInt("--" + argprefix + "<xsl:value-of select="@name"/>-default",it.getProp("<xsl:value-of select="@name"/>_default"),<xsl:value-of select="@default"/>);
</xsl:if> </xsl:if>
</xsl:if>
</xsl:for-each> </xsl:for-each>
<xsl:for-each select="//msgmap/item"> <xsl:for-each select="//msgmap/item">
......
...@@ -68,10 +68,9 @@ class <xsl:value-of select="$CLASSNAME"/>_SK: ...@@ -68,10 +68,9 @@ class <xsl:value-of select="$CLASSNAME"/>_SK:
// Используемые идентификаторы // Используемые идентификаторы
<xsl:for-each select="//smap/item"> <xsl:for-each select="//smap/item">
<xsl:if test="normalize-space(@vartype)!='io'">const UniSetTypes::ObjectId <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */ const UniSetTypes::ObjectId <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
UniSetTypes::ObjectId node_<xsl:value-of select="@name"/>; UniSetTypes::ObjectId node_<xsl:value-of select="@name"/>;
</xsl:if> <xsl:if test="normalize-space(@vartype)='io'">#error (uniset-codegen): vartype='io' NO LONGER SUPPORTED! (ignore variable: '<xsl:value-of select="@name"/>')
<xsl:if test="normalize-space(@vartype)='io'">#warning (uniset-codegen): vartype='io' NO LONGER SUPPORTED! (ignore variable: '<xsl:value-of select="@name"/>')
</xsl:if> </xsl:if>
</xsl:for-each> </xsl:for-each>
...@@ -83,7 +82,10 @@ class <xsl:value-of select="$CLASSNAME"/>_SK: ...@@ -83,7 +82,10 @@ class <xsl:value-of select="$CLASSNAME"/>_SK:
</xsl:for-each> </xsl:for-each>
// Текущее значение // Текущее значение
<xsl:for-each select="//smap/item">long <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>; <xsl:for-each select="//smap/item">
<xsl:if test="normalize-space(@vartype)='in'">const long&amp; </xsl:if>
<xsl:if test="normalize-space(@vartype)!='in'">long </xsl:if>
<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
</xsl:for-each> </xsl:for-each>
// --- public variables --- // --- public variables ---
...@@ -170,6 +172,11 @@ class <xsl:value-of select="$CLASSNAME"/>_SK: ...@@ -170,6 +172,11 @@ class <xsl:value-of select="$CLASSNAME"/>_SK:
<xsl:for-each select="//smap/item">long prev_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>; <xsl:for-each select="//smap/item">long prev_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
</xsl:for-each> </xsl:for-each>
// Текущее значение (rw-переменные)
<xsl:for-each select="//smap/item"><xsl:if test="normalize-space(@vartype)='in'">long priv_<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
</xsl:if>
</xsl:for-each>
// Используемые идентификаторы сообщений // Используемые идентификаторы сообщений
<xsl:for-each select="//msgmap/item">bool prev_m_<xsl:value-of select="@name"/>; /*!&lt; предыдущее состояние /> */ <xsl:for-each select="//msgmap/item">bool prev_m_<xsl:value-of select="@name"/>; /*!&lt; предыдущее состояние /> */
</xsl:for-each> </xsl:for-each>
......
...@@ -10,11 +10,17 @@ TestGen::TestGen( UniSetTypes::ObjectId id, xmlNode* confnode ): ...@@ -10,11 +10,17 @@ TestGen::TestGen( UniSetTypes::ObjectId id, xmlNode* confnode ):
vmonit(int_var); vmonit(int_var);
vmonit(bool_var); vmonit(bool_var);
long* i = valptr(input2_s); const long* i = valptr(input2_s);
long* k = outptr(output1_c);
if( !k )
cerr << "output1_c NOT FOUND!!!" << endl;
ObjectId d = idval(in_input2_s); ObjectId d = idval(in_input2_s);
ObjectId d2 = idval(&in_input2_s); ObjectId d2 = idval(&in_input2_s);
ObjectId d3 = idval(i); ObjectId d3 = idval(i);
ObjectId d4 = idval(&out_output1_c);
if( !i ) if( !i )
cerr << "input2_s NOT FOUND!!!" << endl; cerr << "input2_s NOT FOUND!!!" << endl;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2016-08-01+03:00 // generate timestamp: 2016-08-24+03:00
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef UObject_SK_H_ #ifndef UObject_SK_H_
#define UObject_SK_H_ #define UObject_SK_H_
...@@ -29,7 +29,7 @@ class UObject_SK: ...@@ -29,7 +29,7 @@ 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();
...@@ -43,60 +43,54 @@ class UObject_SK: ...@@ -43,60 +43,54 @@ 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() inline std::shared_ptr<DebugStream> log(){ return mylog; }
{ 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
// Вспомогательные функции для удобства логирования // Вспомогательные функции для удобства логирования
// ------------------------------------------------------------ // ------------------------------------------------------------
...@@ -113,19 +107,16 @@ class UObject_SK: ...@@ -113,19 +107,16 @@ class UObject_SK:
\param id - идентификатор датчика \param id - идентификатор датчика
\param showLinkName - TRUE - выводить SensorName, FALSE - не выводить \param showLinkName - TRUE - выводить SensorName, FALSE - не выводить
*/ */
std::string str( UniSetTypes::ObjectId id, bool showLinkName = true ) const; 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 ) const; std::string strval( UniSetTypes::ObjectId id, bool showLinkName=true ) const;
/*! Вывод состояния внутренних переменных */ /*! Вывод состояния внутренних переменных */
inline std::string dumpVars() inline std::string dumpVars(){ return std::move(vmon.pretty_str()); }
{
return std::move(vmon.pretty_str());
}
// ------------------------------------------------------------ // ------------------------------------------------------------
std::string help(); std::string help();
...@@ -154,28 +145,21 @@ class UObject_SK: ...@@ -154,28 +145,21 @@ class UObject_SK:
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() virtual std::string getMonitInfo(){ return ""; } /*!< пользовательская информация выводимая в getInfo() */
{
return ""; /*!< пользовательская информация выводимая в getInfo() */ // Выполнение очередного шага программы
} virtual void step(){}
virtual void testMode( bool state ); virtual void testMode( bool state );
void updatePreviousValues();
void checkSensors();
void updateOutputs( bool force ); void updateOutputs( bool force );
void preAskSensors( UniversalIO::UIOCommand cmd );
void preSensorInfo( const UniSetTypes::SensorMessage* sm );
void preTimerInfo( const UniSetTypes::TimerMessage* tm );
void preSysCommand( const UniSetTypes::SystemMessage* sm );
void waitSM( int wait_msec, UniSetTypes::ObjectId testID = UniSetTypes::DefaultObjectId ); void waitSM( int wait_msec, UniSetTypes::ObjectId testID = UniSetTypes::DefaultObjectId );
void initFromSM();
UniSetTypes::ObjectId getSMTestID(); UniSetTypes::ObjectId getSMTestID();
void resetMsg(); void resetMsg();
...@@ -183,9 +167,6 @@ class UObject_SK: ...@@ -183,9 +167,6 @@ class UObject_SK:
PassiveTimer ptResetMsg; PassiveTimer ptResetMsg;
int resetMsgTime; int resetMsgTime;
// Выполнение очередного шага программы
virtual void step() {}
int sleep_msec; /*!< пауза между итерациями */ int sleep_msec; /*!< пауза между итерациями */
bool active; bool active;
...@@ -195,19 +176,13 @@ class UObject_SK: ...@@ -195,19 +176,13 @@ class UObject_SK:
// управление датчиком "сердцебиения" // управление датчиком "сердцебиения"
PassiveTimer ptHeartBeat; /*! < период "сердцебиения" */ PassiveTimer ptHeartBeat; /*! < период "сердцебиения" */
UniSetTypes::ObjectId idHeartBeat; /*! < идентификатор датчика (AI) "сердцебиения" */ UniSetTypes::ObjectId idHeartBeat; /*! < идентификатор датчика (AI) "сердцебиения" */
int maxHeartBeat; /*! < сохраняемое значение */ long maxHeartBeat; /*! < сохраняемое значение */
xmlNode* confnode; xmlNode* confnode;
/*! получить числовое свойство из конф. файла по привязанной confnode */ /*! получить числовое свойство из конф. файла по привязанной confnode */
int getIntProp(const std::string& name) int getIntProp(const std::string& name) { return UniSetTypes::uniset_conf()->getIntProp(confnode, name); }
{
return UniSetTypes::uniset_conf()->getIntProp(confnode, name);
}
/*! получить текстовое свойство из конф. файла по привязанной confnode */ /*! получить текстовое свойство из конф. файла по привязанной confnode */
inline const std::string getProp(const std::string& name) inline const std::string getProp(const std::string& name) { return UniSetTypes::uniset_conf()->getProp(confnode, name); }
{
return UniSetTypes::uniset_conf()->getProp(confnode, name);
}
timeout_t smReadyTimeout; /*!< время ожидания готовности SM */ timeout_t smReadyTimeout; /*!< время ожидания готовности SM */
std::atomic_bool activated; std::atomic_bool activated;
...@@ -224,9 +199,6 @@ class UObject_SK: ...@@ -224,9 +199,6 @@ class UObject_SK:
std::string logserv_host = {""}; std::string logserv_host = {""};
int logserv_port = {0}; int logserv_port = {0};
// snap
bool no_snap = {false};
VMonitor vmon; VMonitor vmon;
...@@ -239,8 +211,21 @@ class UObject_SK: ...@@ -239,8 +211,21 @@ class UObject_SK:
// предыдущее значение (для работы UpdateValue()) // предыдущее значение (для работы UpdateValue())
// Текущее значение (rw-переменные)
// Используемые идентификаторы сообщений // Используемые идентификаторы сообщений
// ------------ private функции ---------------
void updatePreviousValues();
void preAskSensors( UniversalIO::UIOCommand cmd );
void preSensorInfo( const UniSetTypes::SensorMessage* sm );
void preTimerInfo( const UniSetTypes::TimerMessage* tm );
void preSysCommand( const UniSetTypes::SystemMessage* sm );
void initFromSM();
void checkSensors();
// --------------------------------------------
bool end_private; // вспомогательное поле (для внутреннего использования при генерировании кода) bool end_private; // вспомогательное поле (для внутреннего использования при генерировании кода)
}; };
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2016-08-01+03:00 // generate timestamp: 2016-08-24+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,7 +59,6 @@ static const std::string init3_str( const std::string& s1, const std::string& s2 ...@@ -59,7 +59,6 @@ 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;
...@@ -67,34 +66,34 @@ static const std::string init3_str( const std::string& s1, const std::string& s2 ...@@ -67,34 +66,34 @@ static const std::string init3_str( const std::string& s1, const std::string& s2
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
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();
} }
...@@ -110,10 +109,10 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref ...@@ -110,10 +109,10 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref
{ {
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());
...@@ -131,14 +130,12 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref ...@@ -131,14 +130,12 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref
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); forceOut = conf->getArgPInt("--" + argprefix + "force-out",it.getProp("forceOut"),false);
string heart = conf->getArgParam("--" + argprefix + "heartbeat-id", it.getProp("heartbeat_id"));
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;
...@@ -146,14 +143,13 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref ...@@ -146,14 +143,13 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref
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);
} }
// Инициализация значений // Инициализация значений
...@@ -162,18 +158,16 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref ...@@ -162,18 +158,16 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref
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 )
...@@ -181,7 +175,7 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref ...@@ -181,7 +175,7 @@ UObject_SK::UObject_SK( ObjectId id, xmlNode* cnode, const std::string& _argpref
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 )
...@@ -254,7 +248,7 @@ bool UObject_SK::setMsg( UniSetTypes::ObjectId _code, bool _state ) ...@@ -254,7 +248,7 @@ bool UObject_SK::setMsg( UniSetTypes::ObjectId _code, bool _state )
void UObject_SK::resetMsg() void UObject_SK::resetMsg()
{ {
mylog8 << myname << "(resetMsg): reset messages.." << endl; mylog8 << myname << "(resetMsg): reset messages.." << endl;
// reset messages // reset messages
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -292,23 +286,19 @@ std::string UObject_SK::dumpIO() ...@@ -292,23 +286,19 @@ std::string UObject_SK::dumpIO()
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;
} }
...@@ -372,13 +362,11 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm ) ...@@ -372,13 +362,11 @@ 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() )
...@@ -411,10 +399,9 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm ) ...@@ -411,10 +399,9 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm )
// переоткрываем логи // переоткрываем логи
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;
} }
} }
...@@ -440,16 +427,14 @@ UniSetTypes::SimpleInfo* UObject_SK::getInfo( CORBA::Long userparam ) ...@@ -440,16 +427,14 @@ UniSetTypes::SimpleInfo* UObject_SK::getInfo( CORBA::Long userparam )
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;
...@@ -503,7 +488,7 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID ) ...@@ -503,7 +488,7 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID )
<< " 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
...@@ -511,14 +496,14 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID ) ...@@ -511,14 +496,14 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID )
<< 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
...@@ -526,10 +511,10 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID ) ...@@ -526,10 +511,10 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID )
<< 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());
} }
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
...@@ -547,42 +532,39 @@ void UObject_SK::callback() ...@@ -547,42 +532,39 @@ 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 ) if( !m )
break; break;
processingMessage(m.get()); 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 )
...@@ -604,7 +586,7 @@ void UObject_SK::callback() ...@@ -604,7 +586,7 @@ void UObject_SK::callback()
mycrit << myname << "(execute): СORBA::SystemException: " mycrit << myname << "(execute): СORBA::SystemException: "
<< ex.NP_minorString() << endl; << ex.NP_minorString() << endl;
} }
catch( const std::exception& ex ) catch( const std::exception&ex )
{ {
mycrit << myname << "(execute): catch " << ex.what() << endl; mycrit << myname << "(execute): catch " << ex.what() << endl;
} }
...@@ -622,7 +604,7 @@ void UObject_SK::setValue( UniSetTypes::ObjectId _sid, long _val ) ...@@ -622,7 +604,7 @@ void UObject_SK::setValue( UniSetTypes::ObjectId _sid, long _val )
ui->setValue(_sid, _val); ui->setValue(_sid,_val);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UObject_SK::updateOutputs( bool _force ) void UObject_SK::updateOutputs( bool _force )
...@@ -644,7 +626,7 @@ void UObject_SK::initFromSM() ...@@ -644,7 +626,7 @@ 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 )
...@@ -666,12 +648,10 @@ long UObject_SK::getValue( UniSetTypes::ObjectId _sid ) ...@@ -666,12 +648,10 @@ 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;
} }
...@@ -691,7 +671,7 @@ void UObject_SK::preAskSensors( UniversalIO::UIOCommand _cmd ) ...@@ -691,7 +671,7 @@ void UObject_SK::preAskSensors( UniversalIO::UIOCommand _cmd )
{ {
mycrit << myname << "(preAskSensors): " << ex << endl; mycrit << myname << "(preAskSensors): " << ex << endl;
} }
catch( const std::exception& ex ) catch( const std::exception&ex )
{ {
mycrit << myname << "(execute): catch " << ex.what() << endl; mycrit << myname << "(execute): catch " << ex.what() << endl;
} }
......
...@@ -19,8 +19,33 @@ class VMon ...@@ -19,8 +19,33 @@ class VMon
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
using namespace std; using namespace std;
class PtrMapHashFn
{
public:
size_t operator() (const long* const& key) const
{
return std::hash<long>()((long)key);
}
};
int main( int argc, const char** argv ) int main( int argc, const char** argv )
{ {
unordered_map<const long*, const long*,PtrMapHashFn> vmap;
const long id = 10;
long prive_val = 100;
const long& val(prive_val);
vmap.emplace(&id,&val);
auto i = vmap.find(&id);
return 0;
auto now = std::chrono::system_clock::now(); auto now = std::chrono::system_clock::now();
auto sec = std::chrono::time_point_cast<std::chrono::nanoseconds>(now); auto sec = std::chrono::time_point_cast<std::chrono::nanoseconds>(now);
auto nsec = std::chrono::time_point_cast<std::chrono::seconds>(now); auto nsec = std::chrono::time_point_cast<std::chrono::seconds>(now);
......
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