Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
d0d9967c
Commit
d0d9967c
authored
Dec 14, 2015
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(uniset-codegen): добавил возможность задавать для входа/выхода
инициализацию значения из SM (при стартре). Свойство: initFromSM="1".
parent
1eb1c8b3
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
111 additions
and
16 deletions
+111
-16
TODO
TODO
+2
-4
ctl-cpp-cc-alone-ask.xsl
Utilities/codegen/ctl-cpp-cc-alone-ask.xsl
+23
-0
ctl-cpp-cc-alone.xsl
Utilities/codegen/ctl-cpp-cc-alone.xsl
+23
-0
ctl-cpp-cc-ask.xsl
Utilities/codegen/ctl-cpp-cc-ask.xsl
+19
-0
ctl-cpp-cc.xsl
Utilities/codegen/ctl-cpp-cc.xsl
+18
-0
ctl-cpp-common.xsl
Utilities/codegen/ctl-cpp-common.xsl
+4
-2
testgen.src.xml
Utilities/codegen/tests/testgen.src.xml
+1
-1
uniset-codegen.dox
docs/DocPages/uniset-codegen.dox
+12
-7
UObject_SK.h
extensions/include/UObject_SK.h
+2
-1
UObject_SK.cc
extensions/lib/UObject_SK.cc
+7
-1
No files found.
TODO
View file @
d0d9967c
...
...
@@ -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
Utilities/codegen/ctl-cpp-cc-alone-ask.xsl
View file @
d0d9967c
...
...
@@ -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
&
ex )
{
mycrit
<<
myname
<<
"(initFromSM): "
<<
ex.what()
<<
endl;
}
}
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:for-each>
}
// -----------------------------------------------------------------------------
void
<xsl:value-of
select=
"$CLASSNAME"
/>
_SK::preAskSensors( UniversalIO::UIOCommand _cmd )
{
PassiveTimer ptAct(activateTimeout);
...
...
Utilities/codegen/ctl-cpp-cc-alone.xsl
View file @
d0d9967c
...
...
@@ -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
&
ex )
{
mycrit
<<
myname
<<
"(initFromSM): "
<<
ex.what()
<<
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 )
...
...
Utilities/codegen/ctl-cpp-cc-ask.xsl
View file @
d0d9967c
...
...
@@ -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
&
ex )
{
mycrit
<<
myname
<<
"(initFromSM): "
<<
ex.what()
<<
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());
...
...
Utilities/codegen/ctl-cpp-cc.xsl
View file @
d0d9967c
...
...
@@ -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
&
ex )
{
mycrit
<<
myname
<<
"(initFromSM): "
<<
ex.what()
<<
endl;
}
}
</xsl:if>
</xsl:for-each>
}
<!-- END CC-FILE -->
</xsl:template>
...
...
Utilities/codegen/ctl-cpp-common.xsl
View file @
d0d9967c
...
...
@@ -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;
...
...
Utilities/codegen/tests/testgen.src.xml
View file @
d0d9967c
...
...
@@ -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"/> -->
...
...
docs/DocPages/uniset-codegen.dox
View file @
d0d9967c
...
...
@@ -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 - максимальное разрешенное значение
...
...
extensions/include/UObject_SK.h
View file @
d0d9967c
...
...
@@ -8,7 +8,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: 2015-1
0-25
+03:00
// generate timestamp: 2015-1
2-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
;
...
...
extensions/lib/UObject_SK.cc
View file @
d0d9967c
...
...
@@ -11,7 +11,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: 2015-1
0-25
+03:00
// generate timestamp: 2015-1
2-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
());
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment