Commit d0d9967c authored by Pavel Vainerman's avatar Pavel Vainerman

(uniset-codegen): добавил возможность задавать для входа/выхода

инициализацию значения из SM (при стартре). Свойство: initFromSM="1".
parent 1eb1c8b3
......@@ -64,7 +64,8 @@ Version 2.5
version 3
=========
(!!!) Подумать насчёт перейти на ZeroMQ (zerorpc) вместо omniORB..
- подумать нужен ли нам где-то ZeroMQ (zerorpc) (вместо omniORB?)
- (или) подумать может стоит перейти на использование ICE вместо CORBA
Перепроектировать классы [ObjectRepository, UInterface, ORepHelpers] с целью выработки абстрактного интерфейса
UResolver (или ObjectRepository) позволяющего манипулировать CORBA-ссылками на объекты, но по возможности
......@@ -77,6 +78,4 @@ UResolver (или ObjectRepository) позволяющего манипулир
- create(rootname)
- вместо commoncpp,libxml2,DebugStream и т.п. перейти всё-таки на boost?
- подумать возможно стоит переходить на lockfree-библиотеку libcds..(актуально для многопроцессорных систем)
- подумать может стоит перейти на использование ICE вместо CORBA
\ No newline at end of file
......@@ -139,6 +139,29 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( const UniSetTypes::S
sensorInfo(_sm);
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM()
{
<xsl:for-each select="//sensors/item/consumers/consumer">
<xsl:if test="normalize-space(../../@msg)!='1'">
<xsl:if test="normalize-space(@name)=$OID">
<xsl:if test="normalize-space(@initFromSM)!=''">
if( <xsl:value-of select="../../@name"/> != UniSetTypes::DefaultObjectId )
{
try
{
<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 )
{
mycrit &lt;&lt; myname &lt;&lt; "(initFromSM): " &lt;&lt; ex.what() &lt;&lt; endl;
}
}
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:for-each>
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::preAskSensors( UniversalIO::UIOCommand _cmd )
{
PassiveTimer ptAct(activateTimeout);
......
......@@ -137,6 +137,29 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( const UniSetTypes::S
sensorInfo(_sm);
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM()
{
<xsl:for-each select="//sensors/item/consumers/consumer">
<xsl:if test="normalize-space(../../@msg)!='1'">
<xsl:if test="normalize-space(@name)=$OID">
<xsl:if test="normalize-space(@initFromSM)!=''">
if( <xsl:value-of select="../../@name"/> != UniSetTypes::DefaultObjectId )
{
try
{
<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 )
{
mycrit &lt;&lt; myname &lt;&lt; "(initFromSM): " &lt;&lt; ex.what() &lt;&lt; endl;
}
}
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:for-each>
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::askSensor( UniSetTypes::ObjectId _sid, UniversalIO::UIOCommand _cmd, UniSetTypes::ObjectId _node )
{
if( _cmd == UniversalIO::UIONotify )
......
......@@ -181,6 +181,25 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( const UniSetTypes::S
sensorInfo(_sm);
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM()
{
<xsl:for-each select="//smap/item">
<xsl:if test="normalize-space(@initFromSM)!=''">
if( <xsl:value-of select="@name"/> != UniSetTypes::DefaultObjectId )
{
try
{
<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 )
{
mycrit &lt;&lt; myname &lt;&lt; "(initFromSM): " &lt;&lt; ex.what() &lt;&lt; endl;
}
}
</xsl:if>
</xsl:for-each>
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::askSensor( UniSetTypes::ObjectId _sid, UniversalIO::UIOCommand _cmd, UniSetTypes::ObjectId _node )
{
ui->askRemoteSensor(_sid,_cmd,_node,getId());
......
......@@ -192,6 +192,24 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( const UniSetTypes::S
sensorInfo(sm);
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::initFromSM()
{
<xsl:for-each select="//smap/item">
<xsl:if test="normalize-space(@initFromSM)!=''">
if( <xsl:value-of select="@name"/> != UniSetTypes::DefaultObjectId )
{
try
{
<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 )
{
mycrit &lt;&lt; myname &lt;&lt; "(initFromSM): " &lt;&lt; ex.what() &lt;&lt; endl;
}
}
</xsl:if>
</xsl:for-each>
}
<!-- END CC-FILE -->
</xsl:template>
......
......@@ -275,6 +275,7 @@
void preTimerInfo( const UniSetTypes::TimerMessage* tm );
void preSysCommand( const UniSetTypes::SystemMessage* sm );
void waitSM( int wait_msec, UniSetTypes::ObjectId testID = UniSetTypes::DefaultObjectId );
void initFromSM();
void resetMsg();
Trigger trResetMsg;
......@@ -390,9 +391,10 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSysCommand( const SystemMessage*
waitSM(smReadyTimeout);
ptStartUpTimeout.reset();
// т.к. для io-переменных важно соблюдать последовательность!
// сперва обновить входы.. а потом уже выходы
// сперва обновить входы..
updateValues();
updateOutputs(true); // принудительное обновление выходов
initFromSM(); // потом обновить значения переменных, помеченных как инициализируемые из SM
updateOutputs(true); // а потом уже выходы (принудительное обновление)
preAskSensors(UniversalIO::UIONotify);
askSensors(UniversalIO::UIONotify);
active = true;
......
......@@ -41,7 +41,7 @@
<smap>
<!-- name - название переменной в конф. файле -->
<item name="input1_s" vartype="in" comment="comment for input1" smTestID="1"/>
<item name="input2_s" vartype="in" comment="comment for input2" />
<item name="input2_s" vartype="in" comment="comment for input2" initFromSM="1"/>
<item name="output1_c" vartype="out" omment="comment for output1" no_check_id="1"/>
<item name="output2_c" vartype="out" omment="comment for output2" force="1"/>
<!-- <item name="loglevel_s" vartype="in" comment="log level control" loglevel="1"/> -->
......
......@@ -70,7 +70,6 @@
====
in - входные регистры (только для чтения)
out - выходные регистры (запись)
io - запись и чтение
-->
<Test>
<settings>
......@@ -126,10 +125,11 @@
- \b no_check_id - no_check_id="1" означает игнорировать (не генерировать исключение) при запуске процесса, если идентификатор датчика не найден.
- \b force="1" - принудительно перезаписывать значение в SharedMemory на каждом шаге. Действует только для \b vartype="out"
- \b loglevel="1" - признак того, что данный датчик управляет логами для этого процесса. См. \ref pg_Codegen_loglevel.
- \b initFromSM="1" - инициализировать занчение из SM при старте (точнее при получении StartUp). Действует и на "in" и на "out".
Помимо этого необходимо указывать свойство \b iotype.
\warning Поле \b iotype должно \b ОБЯЗАТЕЛЬНО совпадать с типом датчика к которому
будет привязана данная переменная. Т.к. генерируется код для работы с датчиком в зависимости от его типа.
\note Правильнее указывать и \i необязательное поле \b iotype, которое должно совпадать с типом датчика к которому
будет привязана данная переменная. Это позволит утилите \b uniset-linkeditor отслеживать правильность типов датчиков при "привязке".
\section pg_Codegen_MsgMap Секция <msgmap>
В секции \<msgmap> описываются поля связанные с идентификаторами сообщений. По сути, сообщения это тоже датчики, только
......@@ -153,16 +153,21 @@
- сообщения должны посылаться при помощи специальной (сгенерированной) функции
\b setMsg( UniSetTypes::ObjectId code, bool state ). Для передачи сообщения необходим вызов c параметром \b state=true.
- Сообщения "автоматически" сбрасываются в "0" через \b resetMsgTime (настраиваемое в конф. секции), поэтому
вызывать функции с \b state=false нет смысла. Если указать resetMsgTime <=0 - автоматический сброс происходить не будет.
вызывать функции с \b state=false нет смысла. Если указать resetMsgTime <=0 - автоматический сброс происходить не будет,
и разработчик должен самостоятельно заботиться об этом.
\section pg_Codegen_Variables Секция <variables>
В данной секции можно перечислить \b переменные разных типов, для которых будет сгенерирован код по их "инициализации"
и проверке "диапазона"(если указаны поля min или max). На данный момент поддерживаются переменные следующих типов:
- \b int - int
- \b long - long
- \b float - float
- \b double - double
- \b bool - bool
- \b str - string
- \b str - std::string
- \b sensor - sensor // ObjectId инициализируемый как conf->getSensorID(name)
- \b object - object // ObjectId инициализируемый как conf->getObjectID(name)
Так же доступны следующие необязательные вспомогательные поля:
- \b min - минимальное разрешенное значение
- \b max - максимальное разрешенное значение
......
......@@ -8,7 +8,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: 2015-10-25+03:00
// generate timestamp: 2015-12-14+03:00
// -----------------------------------------------------------------------------
#ifndef UObject_SK_H_
#define UObject_SK_H_
......@@ -165,6 +165,7 @@ class UObject_SK:
void preTimerInfo( const UniSetTypes::TimerMessage* tm );
void preSysCommand( const UniSetTypes::SystemMessage* sm );
void waitSM( int wait_msec, UniSetTypes::ObjectId testID = UniSetTypes::DefaultObjectId );
void initFromSM();
void resetMsg();
Trigger trResetMsg;
......
......@@ -11,7 +11,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: 2015-10-25+03:00
// generate timestamp: 2015-12-14+03:00
// -----------------------------------------------------------------------------
#include <memory>
#include <iomanip>
......@@ -367,6 +367,7 @@ void UObject_SK::preSysCommand( const SystemMessage* _sm )
// т.к. для io-переменных важно соблюдать последовательность!
// сперва обновить входы.. а потом уже выходы
updateValues();
initFromSM(); // потом обновить, то, что помеченно как инициализируемое из SM
updateOutputs(true); // принудительное обновление выходов
preAskSensors(UniversalIO::UIONotify);
askSensors(UniversalIO::UIONotify);
......@@ -576,6 +577,11 @@ void UObject_SK::preSensorInfo( const UniSetTypes::SensorMessage* _sm )
sensorInfo(_sm);
}
// -----------------------------------------------------------------------------
void UObject_SK::initFromSM()
{
}
// -----------------------------------------------------------------------------
void UObject_SK::askSensor( UniSetTypes::ObjectId _sid, UniversalIO::UIOCommand _cmd, UniSetTypes::ObjectId _node )
{
ui->askRemoteSensor(_sid,_cmd,_node,getId());
......
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