Commit 7c25f606 authored by Pavel Vainerman's avatar Pavel Vainerman

(codegen): Добавил возможность задавать const и область видимости для

переменных их списка <variables>
parent d2ea8110
...@@ -452,6 +452,15 @@ node_<xsl:value-of select="@name"/>(DefaultObjectId), ...@@ -452,6 +452,15 @@ node_<xsl:value-of select="@name"/>(DefaultObjectId),
<xsl:for-each select="//msgmap/item"><xsl:value-of select="@name"/>(DefaultObjectId), <xsl:for-each select="//msgmap/item"><xsl:value-of select="@name"/>(DefaultObjectId),
node_<xsl:value-of select="@name"/>(DefaultObjectId), node_<xsl:value-of select="@name"/>(DefaultObjectId),
</xsl:for-each> </xsl:for-each>
// const variables
<xsl:for-each select="//variables/item">
<xsl:if test="normalize-space(@const)!=''">
<xsl:if test="normalize-space(@type)='int'"><xsl:value-of select="normalize-space(@name)"/>(0),</xsl:if>
<xsl:if test="normalize-space(@type)='float'"><xsl:value-of select="normalize-space(@name)"/>(0),</xsl:if>
<xsl:if test="normalize-space(@type)='bool'"><xsl:value-of select="normalize-space(@name)"/>(false),</xsl:if>
<xsl:if test="normalize-space(@type)='str'"><xsl:value-of select="normalize-space(@name)"/>(""),</xsl:if>
</xsl:if>
</xsl:for-each>
active(false), active(false),
isTestMode(false), isTestMode(false),
idTestMode_S(DefaultObjectId), idTestMode_S(DefaultObjectId),
...@@ -467,6 +476,17 @@ askPause(2000) ...@@ -467,6 +476,17 @@ askPause(2000)
throw Exception( string(myname+": init failed!!!") ); throw Exception( string(myname+": init failed!!!") );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// ( val, confval, default val )
static const std::string init3_str(const std::string s1, const std::string s2, const std::string s3 )
{
if( !s1.empty() )
return s1;
if( !s2.empty() )
return s2;
return s3;
}
// -----------------------------------------------------------------------------
<xsl:value-of select="$CLASSNAME"/>_SK::<xsl:value-of select="$CLASSNAME"/>_SK( ObjectId id, xmlNode* cnode ): <xsl:value-of select="$CLASSNAME"/>_SK::<xsl:value-of select="$CLASSNAME"/>_SK( ObjectId id, xmlNode* cnode ):
<xsl:if test="normalize-space($BASECLASS)!=''"><xsl:value-of select="normalize-space($BASECLASS)"/>(id),</xsl:if> <xsl:if test="normalize-space($BASECLASS)!=''"><xsl:value-of select="normalize-space($BASECLASS)"/>(id),</xsl:if>
<xsl:if test="normalize-space($BASECLASS)=''">UniSetObject(id),</xsl:if> <xsl:if test="normalize-space($BASECLASS)=''">UniSetObject(id),</xsl:if>
...@@ -475,6 +495,21 @@ askPause(2000) ...@@ -475,6 +495,21 @@ askPause(2000)
<xsl:value-of select="normalize-space(@name)"/>(conf->getSensorID(conf->getProp(cnode,"<xsl:value-of select="normalize-space(@name)"/>"))), <xsl:value-of select="normalize-space(@name)"/>(conf->getSensorID(conf->getProp(cnode,"<xsl:value-of select="normalize-space(@name)"/>"))),
node_<xsl:value-of select="normalize-space(@name)"/>( conf->getNodeID(conf->getProp(cnode,"node_<xsl:value-of select="normalize-space(@name)"/>")) ), node_<xsl:value-of select="normalize-space(@name)"/>( conf->getNodeID(conf->getProp(cnode,"node_<xsl:value-of select="normalize-space(@name)"/>")) ),
</xsl:for-each> </xsl:for-each>
// variables
<xsl:for-each select="//variables/item">
<xsl:if test="normalize-space(@type)='int'">
<xsl:value-of select="normalize-space(@name)"/>(uni_atoi( init3_str(conf->getArgParam("--<xsl:value-of select="../@arg_prefix"/><xsl:value-of select="@name"/>"),conf->getProp(cnode,"<xsl:value-of select="@name"/>"),"<xsl:value-of select="normalize-space(@default)"/>"))),
</xsl:if>
<xsl:if test="normalize-space(@type)='float'">
<xsl:value-of select="normalize-space(@name)"/>(atof( init3_str(conf->getArgParam("--<xsl:value-of select="../@arg_prefix"/><xsl:value-of select="@name"/>"),conf->getProp(cnode,"<xsl:value-of select="@name"/>"),"<xsl:value-of select="normalize-space(@default)"/>").c_str())),
</xsl:if>
<xsl:if test="normalize-space(@type)='bool'">
<xsl:value-of select="normalize-space(@name)"/>(uni_atoi( init3_str(conf->getArgParam("--<xsl:value-of select="../@arg_prefix"/><xsl:value-of select="@name"/>"),conf->getProp(cnode,"<xsl:value-of select="@name"/>"),"<xsl:value-of select="normalize-space(@default)"/>"))),
</xsl:if>
<xsl:if test="normalize-space(@type)='str'">
<xsl:value-of select="normalize-space(@name)"/>(init3_str(conf->getArgParam("--<xsl:value-of select="../@arg_prefix"/><xsl:value-of select="@name"/>"),conf->getProp(cnode,"<xsl:value-of select="@name"/>"),"<xsl:value-of select="normalize-space(@default)"/>")),
</xsl:if>
</xsl:for-each>
// Используемые идентификаторы сообщений (имена берутся из конф. файла) // Используемые идентификаторы сообщений (имена берутся из конф. файла)
<xsl:for-each select="//msgmap/item"><xsl:value-of select="normalize-space(@name)"/>(conf->getSensorID(conf->getProp(cnode,"<xsl:value-of select="normalize-space(@name)"/>"))), <xsl:for-each select="//msgmap/item"><xsl:value-of select="normalize-space(@name)"/>(conf->getSensorID(conf->getProp(cnode,"<xsl:value-of select="normalize-space(@name)"/>"))),
node_<xsl:value-of select="normalize-space(@name)"/>(conf->getNodeID( conf->getProp(cnode,"node_<xsl:value-of select="normalize-space(@name)"/>"))), node_<xsl:value-of select="normalize-space(@name)"/>(conf->getNodeID( conf->getProp(cnode,"node_<xsl:value-of select="normalize-space(@name)"/>"))),
...@@ -584,23 +619,6 @@ askPause(conf->getPIntProp(cnode,"askPause",2000)) ...@@ -584,23 +619,6 @@ askPause(conf->getPIntProp(cnode,"askPause",2000))
// ===================== &lt;variables&gt; ===================== // ===================== &lt;variables&gt; =====================
<xsl:for-each select="//variables/item"> <xsl:for-each select="//variables/item">
std::string tmp_<xsl:value-of select="@name"/>( conf->getArgParam("--<xsl:value-of select="../@arg_prefix"/><xsl:value-of select="@name"/>",it.getProp("<xsl:value-of select="@name"/>")) );
<xsl:if test="normalize-space(@default)!=''">if( tmp_<xsl:value-of select="@name"/>.empty() )
tmp_<xsl:value-of select="@name"/> = "<xsl:value-of select="@default"/>";
</xsl:if>
<xsl:if test="normalize-space(@type)='int'">
<xsl:value-of select="@name"/> = uni_atoi(tmp_<xsl:value-of select="@name"/>);
</xsl:if>
<xsl:if test="normalize-space(@type)='float'">
<xsl:value-of select="@name"/> = atof(tmp_<xsl:value-of select="@name"/>.c_str());
</xsl:if>
<xsl:if test="normalize-space(@type)='bool'">
<xsl:value-of select="@name"/> = uni_atoi(tmp_<xsl:value-of select="@name"/>);
</xsl:if>
<xsl:if test="normalize-space(@type)='str'">
<xsl:value-of select="@name"/> = tmp_<xsl:value-of select="@name"/>;
</xsl:if>
<xsl:if test="normalize-space(@min)!=''"> <xsl:if test="normalize-space(@min)!=''">
if( <xsl:value-of select="@name"/> &lt; <xsl:value-of select="@min"/> ) if( <xsl:value-of select="@name"/> &lt; <xsl:value-of select="@min"/> )
{ {
......
...@@ -73,12 +73,34 @@ class <xsl:value-of select="$CLASSNAME"/>_SK: ...@@ -73,12 +73,34 @@ class <xsl:value-of select="$CLASSNAME"/>_SK:
<xsl:call-template name="settype"><xsl:with-param name="iotype" select="@iotype"/></xsl:call-template><xsl:text> prev_</xsl:text><xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>; <xsl:call-template name="settype"><xsl:with-param name="iotype" select="@iotype"/></xsl:call-template><xsl:text> prev_</xsl:text><xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
</xsl:for-each> </xsl:for-each>
// --- public variables ---
<xsl:text>
</xsl:text>
<xsl:for-each select="//variables/item">
<xsl:if test="normalize-space(@public)!=''">
<xsl:if test="normalize-space(@const)!=''">const </xsl:if>
<xsl:if test="normalize-space(@type)='int'">int <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if>
<xsl:if test="normalize-space(@type)='float'">float <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if>
<xsl:if test="normalize-space(@type)='bool'">bool <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if>
<xsl:if test="normalize-space(@type)='str'">std::string <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if>
</xsl:if>
</xsl:for-each>
// --- end of public variables ---
protected: protected:
<xsl:call-template name="COMMON-HEAD-PROTECTED"/> <xsl:call-template name="COMMON-HEAD-PROTECTED"/>
// --- protected variables ---
<xsl:text> <xsl:text>
</xsl:text> </xsl:text>
<xsl:for-each select="//variables/item"> <xsl:for-each select="//variables/item">
<xsl:if test="normalize-space(@private)=''">
<xsl:if test="normalize-space(@public)=''">
<xsl:if test="normalize-space(@const)!=''">const </xsl:if>
<xsl:if test="normalize-space(@type)='int'">int <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */ <xsl:if test="normalize-space(@type)='int'">int <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if> </xsl:if>
<xsl:if test="normalize-space(@type)='float'">float <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */ <xsl:if test="normalize-space(@type)='float'">float <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
...@@ -87,11 +109,29 @@ class <xsl:value-of select="$CLASSNAME"/>_SK: ...@@ -87,11 +109,29 @@ class <xsl:value-of select="$CLASSNAME"/>_SK:
</xsl:if> </xsl:if>
<xsl:if test="normalize-space(@type)='str'">std::string <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */ <xsl:if test="normalize-space(@type)='str'">std::string <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if> </xsl:if>
</xsl:if>
</xsl:if>
</xsl:for-each> </xsl:for-each>
// ---- end of protected variables ----
private: private:
<xsl:call-template name="COMMON-HEAD-PRIVATE"/> <xsl:call-template name="COMMON-HEAD-PRIVATE"/>
<xsl:text>
</xsl:text>// --- private variables ---
<xsl:for-each select="//variables/item">
<xsl:if test="normalize-space(@private)!=''">
<xsl:if test="normalize-space(@const)!=''">const </xsl:if>
<xsl:if test="normalize-space(@type)='int'">int <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if>
<xsl:if test="normalize-space(@type)='float'">float <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if>
<xsl:if test="normalize-space(@type)='bool'">bool <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if>
<xsl:if test="normalize-space(@type)='str'">std::string <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
</xsl:if>
</xsl:if>
</xsl:for-each>// --- end of private variables ---
}; };
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -28,10 +28,10 @@ ...@@ -28,10 +28,10 @@
default - значение по умолчанию (может быть не задано) default - значение по умолчанию (может быть не задано)
no_range_exception=1 - при выходе за границы min или max только писать unideb[WARN]. no_range_exception=1 - при выходе за границы min или max только писать unideb[WARN].
--> -->
<item name="test_int" type="int" min="0" comment="test int variable"/> <item name="test_int" type="int" min="0" comment="test int variable" const="1" public="1"/>
<item name="test_int2" type="int" max="100" default="110" no_range_exception="1"/> <item name="test_int2" type="int" max="100" default="110" no_range_exception="1"/>
<item name="test_float" type="float" max="100.0" default="50.0" /> <item name="test_float" type="float" max="100.0" default="50.0" />
<item name="test_bool" type="bool" /> <item name="test_bool" type="bool" private="1"/>
<item name="test_str" type="str" default="ddd"/> <item name="test_str" type="str" default="ddd"/>
</variables> </variables>
<smap> <smap>
......
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
--> -->
<item name="startTimeout" type="int" min="0" comment="test int variable"/> <item name="startTimeout" type="int" min="0" comment="test int variable"/>
<item name="stopTimeout" type="int" max="100" default="110" no_range_exception="1"/> <item name="stopTimeout" type="int" max="100" default="110" no_range_exception="1"/>
<item name="test_float" type="float" max="100.0" default="50.0" /> <item name="test_float" type="float" max="100.0" default="50.0" public="1" const="1" />
<item name="test_bool" type="bool" /> <item name="test_bool" type="bool" />
<item name="test_str" type="str" default="ddd"/> <item name="test_str" type="str" default="ddd"/>
</variables> </variables>
...@@ -147,6 +147,8 @@ ...@@ -147,6 +147,8 @@
- \b max - максимальное разрешенное значение - \b max - максимальное разрешенное значение
- \b default - значение по умолчанию (при инициализации) - \b default - значение по умолчанию (при инициализации)
- \b no_range_exception - не генерировать исключение в случае выхода переменной за указанный диапазон (\b min или \b max). - \b no_range_exception - не генерировать исключение в случае выхода переменной за указанный диапазон (\b min или \b max).
- \b const - const="1" - сгенерировать как константу.
- \b private | \b public | \b protected - Область видимости. По умолчанию: \b protected.
Помимо этого в самой секции \<variables> можно указать свойство \b arg_prefix="...", которое используется при инициализации Помимо этого в самой секции \<variables> можно указать свойство \b arg_prefix="...", которое используется при инициализации
при помощи аргументов командной строки. при помощи аргументов командной строки.
...@@ -164,6 +166,9 @@ ...@@ -164,6 +166,9 @@
По умолчанию, при выходе за диапазон, генериурется исключение. Но если указано \b no_range_exception="1", По умолчанию, при выходе за диапазон, генериурется исключение. Но если указано \b no_range_exception="1",
то просто выдаётся warning в unideb[Debug::WARN]. то просто выдаётся warning в unideb[Debug::WARN].
По умолчанию эти поля генерируются как \b protected. Но если есть необходимость, то можно указать свойство \b public="1" или
\b private="1" и тогда они будут иметь соответствующую область видимости.
\section pg_Codegen_Configuration Конфигурирование \section pg_Codegen_Configuration Конфигурирование
Для режима генерирования на основе отдельного xml-файла (\ref pg_Codegen_XmlFile) необходимо дополнительно производить конфигурирование. Для режима генерирования на основе отдельного xml-файла (\ref pg_Codegen_XmlFile) необходимо дополнительно производить конфигурирование.
......
...@@ -14,6 +14,8 @@ int main(int argc, const char **argv) ...@@ -14,6 +14,8 @@ int main(int argc, const char **argv)
cout << "--confile - Configuration file. Default: test.xml" << endl; cout << "--confile - Configuration file. Default: test.xml" << endl;
return 0; return 0;
} }
cout << "**** uni_atoi('')=" << uni_atoi("") << endl;
try try
{ {
...@@ -71,6 +73,8 @@ int main(int argc, const char **argv) ...@@ -71,6 +73,8 @@ int main(int argc, const char **argv)
int prop5 = conf->getArgPInt("--prop-dummy",it.getProp("dummy"),0); int prop5 = conf->getArgPInt("--prop-dummy",it.getProp("dummy"),0);
cerr << "**** check conf->getArgPInt(...,...,defval): " << ( (prop5 != 0) ? "[FAILED]" : "OK" ) << endl; cerr << "**** check conf->getArgPInt(...,...,defval): " << ( (prop5 != 0) ? "[FAILED]" : "OK" ) << endl;
return 0; return 0;
} }
......
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