From 41297ace504e835b1fb4adc6cb1239faceb6fba7 Mon Sep 17 00:00:00 2001
From: aschwinn <al.schwinn@gsi.de>
Date: Mon, 15 May 2017 17:18:52 +0200
Subject: [PATCH] Bug 1377 - Provide template-builder which can re-use
 arguments

---
 .../src/xml/fesa/fesa_3_0_0/fesaTemplates.py  | 387 +++++++++---------
 .../src/xml/test/generated_correct/AllTypes.h |   6 +-
 2 files changed, 197 insertions(+), 196 deletions(-)

diff --git a/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py b/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py
index 917daa4..bd60e31 100644
--- a/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py
+++ b/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py
@@ -98,25 +98,26 @@ cproject = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 #=========================================================================
 # H Source template (.h file)
 #=========================================================================
-hTop = """/*
- * %s.h
+
+htop = """/*
+ * ${className}.h
  *
  * Generated by SILECS framework tools 
  */
 
-#ifndef %s_%s_H_
-#define %s_%s_H_
+#ifndef ${className}_${className}_H_
+#define ${className}_${className}_H_
 
 #include <SilecsService.h>
 #include <fesa-core/Synchronization/MultiplexingContext.h>
-#include <%s/GeneratedCode/ServiceLocator.h>
-    """
+#include <${className}/GeneratedCode/ServiceLocator.h>
+"""
 
-hTopBlock = """#include <%s/Server/%s.h>
-    """
+hTopBlock = """#include <${className}/Server/${blockName}.h>
+"""
 
 hTop2 = """
-namespace %s
+namespace ${className}
 {
 
     /*---------------------------------------------------------------------------------------------------------
@@ -150,7 +151,7 @@ namespace %s
      * --------------------------------------------------------------------------------------------------------
      */
 
-    class Abstract%s
+    class Abstract${className}
     {
         public:
             static inline Silecs::Service* theService()  { return pService_; }
@@ -159,12 +160,12 @@ namespace %s
 
             static void setup(const ServiceLocator* serviceLocator);
             static void cleanup();
-            static bool isInitialized(){ return Abstract%s::isInitialized_; }
+            static bool isInitialized(){ return Abstract${className}::isInitialized_; }
             static void setPLCSlaveRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator);
             static void getPLCMasterRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator);
 
-            Abstract%s(std::string blockName);
-            virtual ~Abstract%s();
+            Abstract${className}(std::string blockName);
+            virtual ~Abstract${className}();
 
             void getAllDevices(const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext);
             void getPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext);
@@ -186,13 +187,13 @@ namespace %s
             std::string blockName_;
 
             // not copyable object
-            Abstract%s(const Abstract%s&);
-            Abstract%s& operator=(const Abstract%s&);
+            Abstract${className}(const Abstract${className}&);
+            Abstract${className}& operator=(const Abstract${className}&);
     };
 
     // -------------------------------------------------------------------------------------------------
     #define BLOCK_RO( name )\t\\
-    class name##_Type : public Abstract%s\t\\
+    class name##_Type : public Abstract${className}\t\\
     {\t\\
         public:\t\\
             name##_Type(std::string name);\t\\
@@ -202,7 +203,7 @@ namespace %s
 
 
     #define BLOCK_WO( name )\t\\
-    class name##_Type : public Abstract%s\t\\
+    class name##_Type : public Abstract${className}\t\\
     {\t\\
         public:\t\\
             name##_Type(std::string name);\t\\
@@ -212,7 +213,7 @@ namespace %s
     }
 
     #define BLOCK_RW( name )\t\\
-    class name##_Type : public Abstract%s\t\\
+    class name##_Type : public Abstract${className}\t\\
     {\t\\
         public:\t\\
             name##_Type(std::string name);\t\\
@@ -224,7 +225,7 @@ namespace %s
     
     """
 
-hBlock = """BLOCK_%s( %s );
+hBlock = """BLOCK_${mode}( ${blockName} );
     """
 
 hBottom = """
@@ -233,73 +234,73 @@ hBottom = """
      *---------------------------------------------------------------------------------------------------------
      * This is the public interface used from the FESA code to access the PLC service.
      */
-    class %s
+    class ${className}
     {
         public:
-            static inline Silecs::Service* theService()  { return Abstract%s::theService(); }
-            static inline Silecs::Cluster* theCluster()  { return Abstract%s::theCluster(); }
-            static void setup(const ServiceLocator* serviceLocator) { Abstract%s::setup(serviceLocator); }
-            static void cleanup() { Abstract%s::cleanup(); }
-            static bool isInitialized(){ return Abstract%s::isInitialized(); }
+            static inline Silecs::Service* theService()  { return Abstract${className}::theService(); }
+            static inline Silecs::Cluster* theCluster()  { return Abstract${className}::theCluster(); }
+            static void setup(const ServiceLocator* serviceLocator) { Abstract${className}::setup(serviceLocator); }
+            static void cleanup() { Abstract${className}::cleanup(); }
+            static bool isInitialized(){ return Abstract${className}::isInitialized(); }
             static Silecs::PLC* getPLC(Device* pDevice)
 			{
-				return Abstract%s::theCluster()->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
+				return Abstract${className}::theCluster()->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
 			}
 
     """
 
-hDeclBlocks = """            static %s_Type %s;
+hDeclBlocks = """            static ${className}_Type ${className};
     """
 
 hClosing = """           
         };
     }
 
-    #endif /* %s_%s_H_ */
+    #endif /* ${className}_${className}_H_ */
     """
 
 #=========================================================================
 # C++ Source template (.cpp file)
 #=========================================================================
 cTop = """/*
- * %s.cpp
+ * ${className}.cpp
  *
  * Generated by SILECS framework tools 
  */
  
-#include <%s/Common/%s.h>
+#include <${className}/Common/${className}.h>
 #include <fesa-core/Synchronization/NoneContext.h>
 #include <fesa-core/Synchronization/MultiplexingContext.h>
  
-namespace %s
+namespace ${className}
 {
     //Global objects of the SILECS class
-    Silecs::Service* Abstract%s::pService_ = NULL;
-    Silecs::Cluster* Abstract%s::pCluster_ = NULL;
-    bool Abstract%s::isInitialized_ = false;
+    Silecs::Service* Abstract${className}::pService_ = NULL;
+    Silecs::Cluster* Abstract${className}::pCluster_ = NULL;
+    bool Abstract${className}::isInitialized_ = false;
 
     """
 
-cGlobal = """%s_Type\t%s::%s("%s");
+cGlobal = """${blockName}_Type\t${className}::${blockName}("${blockName}");
     """
 cPart1 = """
     //-------------------------------------------------------------------------------------------------------------
     // Constructor & Destructor methods
     
-    Abstract%s::Abstract%s(std::string blockName): blockName_(blockName) {}
-    Abstract%s::~Abstract%s() {}
+    Abstract${className}::Abstract${className}(std::string blockName): blockName_(blockName) {}
+    Abstract${className}::~Abstract${className}() {}
     """
 
 cBlockConstr = """
-    %s_Type::%s_Type(std::string name): Abstract%s(name) {}
-    %s_Type::~%s_Type() {}
+    ${blockName}_Type::${blockName}_Type(std::string name): Abstract${className}(name) {}
+    ${blockName}_Type::~${blockName}_Type() {}
     """
 
 cPart2 = """
     //---------------------------------------------------------------------------------------------------------
-    // Set-up the SILECS components for the Abstract%s class (service & cluster)
+    // Set-up the SILECS components for the Abstract${className} class (service & cluster)
 
-    void Abstract%s::setup(const ServiceLocator* serviceLocator)
+    void Abstract${className}::setup(const ServiceLocator* serviceLocator)
     {
         try
         {
@@ -311,7 +312,7 @@ cPart2 = """
 
             // Instantiate the SILECS Cluster object for the given Class/Version
             GlobalDevice* pGlobalDevice = serviceLocator->getGlobalDevice();
-            pCluster_ = pService_->getCluster( "%s", pGlobalDevice->plcClassVersion.get());
+            pCluster_ = pService_->getCluster( "${className}", pGlobalDevice->plcClassVersion.get());
             isInitialized_ = true;
 
             // Connect each PLC of the Cluster that is referred from the FESA instance
@@ -345,7 +346,7 @@ cPart2 = """
 
     //---------------------------------------------------------------------------------------------------------
     // Release all the SILECS resources
-    void Abstract%s::cleanup()
+    void Abstract${className}::cleanup()
     {
         // Attention! This method is responsible to stop all the PLC connections
         // and to remove all the SILECS resources (Clusters and related components: PLCs, Devices, Registers, ..)
@@ -356,24 +357,24 @@ cPart2 = """
 
     //---------------------------------------------------------------------------------------------------------
     // Synchronise PLC SLAVE/MASTER registers and related FESA fields (automatically called by the setup method @connection time)
-    void Abstract%s::setPLCSlaveRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator)
+    void Abstract${className}::setPLCSlaveRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator)
     {
         fesa::NoneContext noneContext;
     """
 
 cSetPLC = """
-        %s::%s.setPLCDevices(pPLC, serviceLocator, false, &noneContext);"""
+        ${className}::${blockName}.setPLCDevices(pPLC, serviceLocator, false, &noneContext);"""
 
 cPart3 = """
     }
 
-    void Abstract%s::getPLCMasterRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator)
+    void Abstract${className}::getPLCMasterRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator)
     {
         fesa::NoneContext noneContext;    //MASTER acquisition fields are not consistent, can be set with none-context
     """
 
 cGetPLC = """
-        %s::%s.getPLCDevices(pPLC, serviceLocator, false, &noneContext);"""
+        ${className}::${blockName}.getPLCDevices(pPLC, serviceLocator, false, &noneContext);"""
 
 cPart4 = """
     }
@@ -386,7 +387,7 @@ cPart4 = """
 
     //---------------------------------------------------------------------------------------------------------
 
-    void Abstract%s::getAllDevices(const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext)
+    void Abstract${className}::getAllDevices(const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext)
     {
         if (recvNow) theCluster()->recv(blockName_);
 
@@ -396,7 +397,7 @@ cPart4 = """
         }
     }
 
-    void Abstract%s::getPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext)
+    void Abstract${className}::getPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext)
     {
         if (recvNow) pPLC->recv(blockName_);
 
@@ -408,18 +409,18 @@ cPart4 = """
         }
     }
 
-    void Abstract%s::getSomeDevices(std::vector<Device*> deviceCol, const bool sendNow, MultiplexingContext* pContext)
+    void Abstract${className}::getSomeDevices(std::vector<Device*> deviceCol, const bool sendNow, MultiplexingContext* pContext)
     {
         for(std::vector<Device*>::iterator pDeviceIter=deviceCol.begin(); pDeviceIter!= deviceCol.end(); pDeviceIter++)
         {    getOneDevice(*pDeviceIter, sendNow, pContext);
         }
     }
 
-    void Abstract%s::getOneDevice(Device* pDevice, const bool recvNow, MultiplexingContext* pContext) {};
+    void Abstract${className}::getOneDevice(Device* pDevice, const bool recvNow, MultiplexingContext* pContext) {};
 
     //---------------------------------------------------------------------------------------------------------
 
-    void Abstract%s::setAllDevices(const ServiceLocator* serviceLocator, bool sendNow, MultiplexingContext* pContext)
+    void Abstract${className}::setAllDevices(const ServiceLocator* serviceLocator, bool sendNow, MultiplexingContext* pContext)
     {
         std::vector<Device*> deviceCol = serviceLocator->getDeviceCollection();
         for(std::vector<Device*>::iterator pDeviceIter=deviceCol.begin(); pDeviceIter!= deviceCol.end(); pDeviceIter++)
@@ -429,7 +430,7 @@ cPart4 = """
         if (sendNow) theCluster()->send(blockName_);
     }
 
-    void Abstract%s::setPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, bool sendNow, MultiplexingContext* pContext)
+    void Abstract${className}::setPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, bool sendNow, MultiplexingContext* pContext)
     {
         std::vector<Device*> deviceCol = serviceLocator->getDeviceCollection();
         for(std::vector<Device*>::iterator pDeviceIter=deviceCol.begin(); pDeviceIter!= deviceCol.end(); pDeviceIter++)
@@ -441,24 +442,24 @@ cPart4 = """
         if (sendNow) pPLC->send(blockName_);
     }
 
-    void Abstract%s::setSomeDevices(std::vector<Device*> deviceCol, bool sendNow, MultiplexingContext* pContext)
+    void Abstract${className}::setSomeDevices(std::vector<Device*> deviceCol, bool sendNow, MultiplexingContext* pContext)
     {
         for(std::vector<Device*>::iterator pDeviceIter=deviceCol.begin(); pDeviceIter!= deviceCol.end(); pDeviceIter++)
         {    setOneDevice(*pDeviceIter, sendNow, pContext);
         }
     }
 
-    void Abstract%s::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext) {};
+    void Abstract${className}::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext) {};
     
     //---------------------------------------------------------------------------------------------------------
     """
 
 cCommonGet = """
-    void %s_Type::getOneDevice(Device* pDevice, const bool recvNow, MultiplexingContext* pContext)
+    void ${blockName}_Type::getOneDevice(Device* pDevice, const bool recvNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
     	{
-    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - %s::setup needs to be called before any plc-interaction can be done");
+    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - ${className}::setup needs to be called before any plc-interaction can be done");
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
@@ -482,60 +483,61 @@ cRecv = """        if (recvNow) pPLCDevice -> recv(blockName_);
     """
 
 cGetStringReg = """
-        pRegister = pPLCDevice->getRegister("%s");
-        pDevice->%s.set(pRegister->getValString().c_str(), pContext);
+        pRegister = pPLCDevice->getRegister("${registerName}");
+        pDevice->${registerName}.set(pRegister->getValString().c_str(), pContext);
 """
 
 cGetStringArrayReg = """
         {
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
         const std::string** stdStringArray = pRegister->getRefStringArray(dim1);
         for (unsigned int i=0; i<dim1; i++)
-        {   pDevice->%s.setString(stdStringArray[i]->c_str(), i, pContext);
+        {   pDevice->${registerName}.setString(stdStringArray[i]->c_str(), i, pContext);
         }
         }
 """
 
 cGetScalarReg = """
-        pDevice->%s.set( pPLCDevice->getRegister("%s")->getVal%s(), pContext);"""
+        pDevice->${registerName}.set( pPLCDevice->getRegister("${registerName}")->getVal${registerType}(), pContext);"""
 
 cGetArrayReg = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
             dim1 = pRegister->getDimension1();
-            pDevice->%s.set(pRegister->getRef%sArray(dim1), dim1, pContext);
+            pDevice->${registerName}.set(pRegister->getRef${registerType}Array(dim1), dim1, pContext);
         """
 cGetArray2DReg = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
         dim2 = pRegister->getDimension2();
-        pDevice->%s.set(pRegister->getRef%sArray2D(dim1, dim2), dim1, dim2, pContext);
+        pDevice->${registerName}.set(pRegister->getRef${registerType}Array2D(dim1, dim2), dim1, dim2, pContext);
 """
+
 cGetUnsignedArrayReg = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
             dim1 = pRegister->getDimension1();
-            %s* %s = (%s*)calloc(dim1, sizeof(%s));
-            pRegister->getVal%sArray(%s, dim1);\t//use automatic conversion for JAVA non-supported type
-            pDevice->%s.set(%s, dim1, pContext);
-            free(%s);
+            ${registerType}* ${registerName} = (${registerType}*)calloc(dim1, sizeof(${registerType}));
+            pRegister->getVal${registerType}Array(${registerName}, dim1);\t//use automatic conversion for JAVA non-supported type
+            pDevice->${registerName}.set(${registerName}, dim1, pContext);
+            free(${registerName});
     """
 
 cGetUnsignedArray2DReg = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
         dim2 = pRegister->getDimension2();
-        %s* %s = (%s*)calloc(dim1*dim2, sizeof(%s));
-        pRegister->getVal%sArray2D(%s, dim1, dim2);\t//use automatic conversion for JAVA non-supported type
-        pDevice->%s.set(%s, dim1, dim2, pContext);
-    free(%s);
+        ${fesaType]* ${registerName} = (${fesaType]*)calloc(dim1*dim2, sizeof(${fesaType]));
+        pRegister->getVal${registerType}Array2D(${registerName}, dim1, dim2);\t//use automatic conversion for JAVA non-supported type
+        pDevice->${registerName}.set(${registerName}, dim1, dim2, pContext);
+    free(${registerName});
 """
 
 cCommonSet = """    
-    void %s_Type::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext)
+    void ${blockName}_Type::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
     	{
-    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - %s::setup needs to be called before any plc-interaction can be done");
+    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - ${className}::setup needs to be called before any plc-interaction can be done");
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
@@ -546,117 +548,118 @@ cSend = """
 """
 
 cDatatypeSet = """
-    void %s_Type::setOneDevice(Device* pDevice, %sPropertyData& data, bool sendNow, MultiplexingContext* pContext)
+    void ${blockName}_Type::setOneDevice(Device* pDevice, ${blockName}PropertyData& data, bool sendNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
     	{
-    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - %s::setup needs to be called before any plc-interaction can be done");
+    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - ${className}::setup needs to be called before any plc-interaction can be done");
     	}
         Silecs::PLC* pPLC = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
 """
 
 cSetStringReg = """
-        pPLCDevice->getRegister("%s")->setValString(pDevice->%s.get(pContext));
+        pPLCDevice->getRegister("${registerName}")->setValString(pDevice->${registerName}.get(pContext));
 """
 
 cSetStringArrayReg = """
         {
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
         std::string stdStringArray[dim1];
-        const char** cStringArray = pDevice->%s.get(fesaDim1, pContext);
+        const char** cStringArray = pDevice->${registerName}.get(fesaDim1, pContext);
         for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
         pRegister->setValStringArray(stdStringArray, dim1);
         }
 """
 
 cSetScalarReg = """
-        pPLCDevice->getRegister("%s")->setVal%s( pDevice->%s.get(pContext));"""
+        pPLCDevice->getRegister("${registerName}")->setVal${registerType}( pDevice->${registerName}.get(pContext));"""
             
 cSetScalarUReg = """
-        pPLCDevice->getRegister("%s")->setVal%s( (%s)pDevice->%s.get(pContext));"""
+        pPLCDevice->getRegister("${registerName}")->setVal${registerType}( (${lowerType})pDevice->${registerName}.get(pContext));"""
 
 cSetArrayReg = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
             dim1 = pRegister->getDimension1();
-            pRegister->setVal%sArray(pDevice->%s.get(fesaDim1, pContext), dim1);
+            pRegister->setVal${registerType}Array(pDevice->${registerName}.get(fesaDim1, pContext), dim1);
     """
 
 cSetArray2DReg = """
-    pRegister = pPLCDevice->getRegister("%s");
+    pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
         dim2 = pRegister->getDimension2();
-        pRegister->setVal%sArray2D(pDevice->%s.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        pRegister->setVal${registerType}Array2D(pDevice->${registerName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
 """
 
 cSetUnsignedArrayReg = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
-        pRegister->setVal%sArray(pDevice->%s.get(fesaDim1, pContext), dim1);\t//use automatic conversion for JAVA non-supported type
+        pRegister->setVal${registerType}Array(pDevice->${registerName}.get(fesaDim1, pContext), dim1);\t//use automatic conversion for JAVA non-supported type
 """
 
 cSetUnsignedArray2DReg = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
         dim2 = pRegister->getDimension2();
-        pRegister->setVal%sArray2D( pDevice->%s.get(fesaDim1, fesaDim2, pContext), dim1, dim2);\t//use automatic conversion for JAVA non-supported type
+        pRegister->setVal${registerType}Array2D( pDevice->${registerName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);\t//use automatic conversion for JAVA non-supported type
 """
 
 cSetStringRegData = """
-        (data.is%sAvailable()) ? pPLCDevice->getRegister("%s")->setValString(data.%s.get()) :
-                                     pPLCDevice->getRegister("%s")->setValString(pDevice->%s.get(pContext));"""
+        (data.is${registerName_upper}Available()) ? pPLCDevice->getRegister("${registerName}")->setValString(data.${registerName}.get()) :
+                                     pPLCDevice->getRegister("${registerName}")->setValString(pDevice->${registerName}.get(pContext));"""
                                     
 cSetStringArrayRegData = """
         {
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
         std::string stdStringArray[dim1];
-        const char** cStringArray = (data.is%sAvailable() ? data.%s.get(fesaDim1) : pDevice->%s.get(fesaDim1, pContext));
+        const char** cStringArray = (data.is${registerName_upper}Available() ? data.${registerName}.get(fesaDim1) : pDevice->${registerName}.get(fesaDim1, pContext));
         for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
         pRegister->setValStringArray(stdStringArray, dim1);
         }
 """
+
 cSetScalarRegData = """
-        (data.is%sAvailable()) ? pPLCDevice->getRegister("%s")->setVal%s( data.%s.get()) :
-                                          pPLCDevice->getRegister("%s")->setVal%s( pDevice->%s.get(pContext));"""
+        (data.is${registerName_upper}Available()) ? pPLCDevice->getRegister("${registerName}")->setVal${registerType}( data.${registerName}.get()) :
+                                          pPLCDevice->getRegister("${registerName}")->setVal${registerType}( pDevice->${registerName}.get(pContext));"""
 
 cSetScalarURegData = """
-        (data.is%sAvailable()) ? pPLCDevice->getRegister("%s")->setVal%s( (%s)data.%s.get()) :
-                                          pPLCDevice->getRegister("%s")->setVal%s( (%s)pDevice->%s.get(pContext));"""
+        (data.is${registerName_upper}Available()) ? pPLCDevice->getRegister("${registerName}")->setVal${registerType}( (${lowerType})data.${registerName}.get()) :
+                                          pPLCDevice->getRegister("${registerName}")->setVal${registerType}( (${lowerType})pDevice->${registerName}.get(pContext));"""
 
 cSetArrayRegData = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
             dim1 = pRegister->getDimension1();
-            (data.is%sAvailable()) ? pRegister->setVal%sArray( data.%s.get(fesaDim1), dim1) :
-                                         pRegister->setVal%sArray( pDevice->%s.get(fesaDim1, pContext), dim1);
+            (data.is${registerName_upper}Available()) ? pRegister->setVal${registerType}Array( data.${registerName}.get(fesaDim1), dim1) :
+                                         pRegister->setVal${registerType}Array( pDevice->${registerName}.get(fesaDim1, pContext), dim1);
     """
 
 cSetUnsignedArrayRegData = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
             dim1 = pRegister->getDimension1();
-            (data.is%sAvailable()) ? pRegister->setVal%sArray( data.%s.get(fesaDim1), dim1) :
-                                         pRegister->setVal%sArray( pDevice->%s.get(fesaDim1, pContext), dim1);
+            (data.is${registerName_upper}Available()) ? pRegister->setVal${registerType}Array( data.${registerName}.get(fesaDim1), dim1) :
+                                         pRegister->setVal${registerType}Array( pDevice->${registerName}.get(fesaDim1, pContext), dim1);
     """
 
 cSetArray2DRegData = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
         dim2 = pRegister->getDimension2();
-        (data.is%sAvailable()) ? pRegister->setVal%sArray2D(data.%s.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setVal%sArray2D(pDevice->%s.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        (data.is${registerName_upper}Available()) ? pRegister->setVal${registerType}Array2D(data.${registerName}.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                     pRegister->setVal${registerType}Array2D(pDevice->${registerName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
 """
 
 cSetUnsignedArray2DRegData = """
-        pRegister = pPLCDevice->getRegister("%s");
+        pRegister = pPLCDevice->getRegister("${registerName}");
         dim1 = pRegister->getDimension1();
         dim2 = pRegister->getDimension2();
-        (data.is%sAvailable()) ? pRegister->setVal%sArray2D(data.%s.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setVal%sArray2D(pDevice->%s.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        (data.is${registerName_upper}Available()) ? pRegister->setVal${registerType}Array2D(data.${registerName}.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                     pRegister->setVal${registerType}Array2D(pDevice->${registerName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
 """
 
 makeDesign = """# Include SILECS library path
-SILECS_PATH ?= %s
+SILECS_PATH ?= ${centralMakefilePath}
 
 # Additional compiler warning flags
 override WARNFLAGS += 
@@ -668,13 +671,11 @@ LINKER_FLAGS +=
 
 # Additional headers (Custom.h Specific.h ...) which need to be installed
 EXTRA_HEADERS += 
-
-    """
-
+"""
 makeDeploy = """# Include SILECS library path
-SILECS_PATH ?= %s
+SILECS_PATH ?= ${silecsBasePath}
 
-SNAP7_BASE = %s
+SNAP7_BASE = ${snap7BasePath}
 
 # Additional compiler warning flags
 override WARNFLAGS += 
@@ -697,9 +698,8 @@ LINKER_SERVER_FLAGS +=
 
 # Additional headers (Custom.h Specific.h ...) which need to be released
 EXTRA_HEADERS += 
-
-    """
-
+"""
+	
 #=========================================================================
 # FESA .cproject file
 #=========================================================================
@@ -709,138 +709,139 @@ def genCProject():
 
 #=========================================================================
 # Header file (.h) code generation sub-functions
-#=========================================================================
+#================	=========================================================
+
 def genHTop(className):
-    return hTop %(className, className, className, className, className, className)
+	return htop.replace('${className}', className )
 
 def genHTopBlock(className, blockName):
-    return hTopBlock %(className, blockName)
+	return hTopBlock.replace('${className}', className).replace('${blockName}', blockName)
 
 def genHTop2(className):
-    return hTop2 %(className, className, className, className, className, className, className, className, className, className, className, className)
-
+    return hTop2.replace('${className}', className)
+   
 def genHBlock(mode, blockName):
-    return hBlock %(mode, blockName)
+    return hBlock.replace('${mode}', mode).replace('${blockName}', blockName)
 
 def genHBottom(className):
-    return hBottom %(className, className, className, className, className, className, className)
+	return hBottom.replace('${className}', className)
 
 def genHDeclBlocks(className): 
-    return hDeclBlocks %(className, className)
+    return hDeclBlocks.replace('${className}', className)
 
 def genHClosing(className):
-    return hClosing %(className, className)
+    return hClosing.replace('${className}', className)
 
 #=========================================================================
 # C++ file (.cpp) code generation sub-functions
 #=========================================================================
 def genCTop(className):
-    return cTop %(className, className, className, className, className, className, className)
+    return cTop.replace('${className}', className)
 
 def genCGlobal(className, blockName):
-    return cGlobal %(blockName, className, blockName, blockName)
+	return cGlobal.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCPart1(className):
-    return cPart1 %(className, className, className, className)
+    return cPart1.replace('${className}', className)
 
 def genCBlockConstr(blockName, className):
-    return cBlockConstr %(blockName, blockName, className, blockName, blockName)
+    return cBlockConstr.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCPart2(className):
-    return cPart2 %(className, className, className, className, className)
+    return cPart2.replace('${className}', className)
 
 def genCSetPLC(className, blockName):
-    return cSetPLC %(className, blockName)
+    return cSetPLC.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCCommonGet(blockName,className):
-    return cCommonGet %(blockName,className)
+    return cCommonGet.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCPart3(className):
-    return cPart3 %(className)
+    return cPart3.replace('${className}', className)
 
 def genCGetPLC(className, blockName):
-    return cGetPLC %(className, blockName)
+    return cGetPLC.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCPart4(className):
-    return cPart4 %(className, className, className, className, className, className, className, className)
-
-def genCGetStringReg(regName):
-    return cGetStringReg %(regName, regName)
+    return cPart4.replace('${className}', className)
 
-def genCGetStringArrayReg(regName):
-    return cGetStringArrayReg %(regName, regName)
+def genCGetStringReg(registerName):
+    return cGetStringReg.replace('${registerName}', registerName)
 
-def genCGetScalarReg(regName, regType):
-    return cGetScalarReg %(regName, regName, regType)
+def genCGetStringArrayReg(registerName):
+    return cGetStringArrayReg.replace('${registerName}', registerName)
 
-def genCGetArrayReg(regName, regType):    
-    return cGetArrayReg %(regName, regName, regType)
+def genCGetScalarReg(registerName, registerType):
+    return cGetScalarReg.replace('${registerName}', registerName).replace('${registerType}', registerType)
 
-def genCGetArray2DReg(regName, regType):
-    return cGetArray2DReg %(regName, regName, regType)
+def genCGetArrayReg(registerName, registerType):    
+    return cGetArrayReg.replace('${registerName}', registerName).replace('${registerType}', registerType)
 
-def genCGetUnsignedArrayReg(regName, fesaType, regType):
-    return cGetUnsignedArrayReg %(regName, fesaType, regName, fesaType, fesaType, regType, regName, regName, regName, regName)
+def genCGetArray2DReg(registerName, registerType):
+    return cGetArray2DReg.replace('${registerName}', registerName).replace('${registerType}', registerType)
 
-def genCGetUnsignedArray2DReg(regName, fesaType, regType):
-    return cGetUnsignedArray2DReg %(regName, fesaType, regName, fesaType, fesaType, regType, regName, regName, regName, regName)
+def genCGetUnsignedArrayReg(registerName, fesaType, registerType):
+    return cGetUnsignedArrayReg.replace('${registerName}', registerName).replace('${registerType}', registerType)
+   
+def genCGetUnsignedArray2DReg(registerName, fesaType, registerType):
+    return cGetUnsignedArray2DReg.replace('${registerName}', registerName).replace('${registerType}', registerType).replace('${fesaType]', fesaType)
 
 def genCCommonSet(blockName,className):
-    return cCommonSet %(blockName,className)
+    return cCommonSet.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCDatatypeSet(blockName,className):
-    return cDatatypeSet %(blockName, blockName,className)
+    return cDatatypeSet.replace('${className}', className).replace('${blockName}', blockName)
 
-def genCSetStringReg(regName):
-    return cSetStringReg %(regName, regName)
+def genCSetStringReg(registerName):
+    return cSetStringReg.replace('${registerName}', registerName)
 
-def genCSetStringArrayReg(regName):
-    return cSetStringArrayReg %(regName, regName)
+def genCSetStringArrayReg(registerName):
+    return cSetStringArrayReg.replace('${registerName}', registerName)
 
-def genCSetScalarReg(regName, regType):
-    return cSetScalarReg %(regName, regType, regName) 
+def genCSetScalarReg(registerName, registerType):
+    return cSetScalarReg.replace('${registerName}', registerName).replace('${registerType}', registerType)
 
-def genCSetScalarUReg(regName, regType, lowerType):
-    return cSetScalarUReg %(regName, regType, lowerType, regName)
+def genCSetScalarUReg(registerName, registerType, lowerType):
+    return cSetScalarUReg.replace('${registerName}', registerName).replace('${registerType}', registerType).replace('${lowerType}', lowerType)
 
-def genCSetArrayReg(regName, regType):
-    return cSetArrayReg %(regName, regType, regName)
+def genCSetArrayReg(registerName, registerType):
+    return cSetArrayReg.replace('${registerName}', registerName).replace('${registerType}', registerType)
 
-def genCSetUnsignedArrayReg(regName, regType):    
-    return cSetUnsignedArrayReg %(regName, regType, regName)
+def genCSetUnsignedArrayReg(registerName, registerType):    
+    return cSetUnsignedArrayReg.replace('${registerName}', registerName).replace('${registerType}', registerType)
 
-def genCSetArray2DReg(regName, regType):
-    return cSetArray2DReg %(regName, regType, regName)
+def genCSetArray2DReg(registerName, registerType):
+    return cSetArray2DReg.replace('${registerName}', registerName).replace('${registerType}', registerType)
 
-def genCSetUnsignedArray2DReg(regName, regType):
-    return cSetUnsignedArray2DReg %(regName, regType, regName)
+def genCSetUnsignedArray2DReg(registerName, registerType):
+    return cSetUnsignedArray2DReg.replace('${registerName}', registerName).replace('${registerType}', registerType)
 
-def genCSetStringRegData(regName):
-    return cSetStringRegData %(iecommon.capitalizeString(regName), regName, regName, regName, regName)
+def genCSetStringRegData(registerName):
+	return cSetStringRegData.replace('${registerName}', registerName).replace('${registerName_upper}', iecommon.capitalizeString(registerName))
 
-def genCSetStringArrayRegData(regName):
-    return cSetStringArrayRegData %(regName, iecommon.capitalizeString(regName), regName, regName)
+def genCSetStringArrayRegData(registerName):
+    return cSetStringArrayRegData.replace('${registerName}', registerName).replace('${registerName_upper}', iecommon.capitalizeString(registerName))
 
-def genCSetScalarRegData(regName, regType):
-    return cSetScalarRegData %(iecommon.capitalizeString(regName), regName, regType, regName, regName, regType, regName)
+def genCSetScalarRegData(registerName, registerType):
+	return cSetScalarRegData.replace('${registerName}', registerName).replace('${registerName_upper}', iecommon.capitalizeString(registerName)).replace('${registerType}', registerType)
 
-def genCSetScalarURegData(regName, regType, lowerType):
-    return cSetScalarURegData %(iecommon.capitalizeString(regName), regName, regType, lowerType, regName, regName, regType, lowerType, regName)
+def genCSetScalarURegData(registerName, registerType, lowerType):
+	return cSetScalarURegData.replace('${registerName}', registerName).replace('${registerName_upper}', iecommon.capitalizeString(registerName)).replace('${registerType}', registerType).replace('${lowerType}', lowerType)
 
-def genCSetUnsignedArrayRegData(regName, regType):
-    return cSetUnsignedArrayRegData %(regName, iecommon.capitalizeString(regName), regType, regName, regType, regName) 
+def genCSetUnsignedArrayRegData(registerName, registerType):
+	return cSetUnsignedArrayRegData.replace('${registerName}', registerName).replace('${registerName_upper}', iecommon.capitalizeString(registerName)).replace('${registerType}', registerType)
 
-def genCSetUnsignedArray2DRegData(regName, fesaType, regType):
-    return cSetUnsignedArray2DRegData %(regName, iecommon.capitalizeString(regName), regType, regName, regType, regName)  
+def genCSetUnsignedArray2DRegData(registerName, fesaType, registerType):
+	return cSetUnsignedArray2DRegData.replace('${registerName}', registerName).replace('${registerName_upper}', iecommon.capitalizeString(registerName)).replace('${registerType}', registerType)
 
-def genCSetArrayRegData(regName, regType):
-    return cSetArrayRegData %(regName, iecommon.capitalizeString(regName), regType, regName, regType, regName)
+def genCSetArrayRegData(registerName, registerType):
+    return cSetArrayRegData.replace('${registerName}', registerName).replace('${registerName_upper}', iecommon.capitalizeString(registerName)).replace('${registerType}', registerType)
 
-def genCSetArray2DRegData(regName, fesaType, regType):
-    return cSetArray2DRegData %(regName, iecommon.capitalizeString(regName), regType, regName, regType, regName)
+def genCSetArray2DRegData(registerName, fesaType, registerType):
+	return cSetArray2DRegData.replace('${registerName}', registerName).replace('${registerName_upper}', iecommon.capitalizeString(registerName)).replace('${registerType}', registerType)
 
-def genMakeDesign(CentralMakefilePath):
-    return makeDesign %(CentralMakefilePath)
+def genMakeDesign(centralMakefilePath):
+    return makeDesign.replace('${centralMakefilePath}', centralMakefilePath)
 
 def genMakeDeploy(silecsBasePath,snap7BasePath):
-    return makeDeploy %(silecsBasePath,snap7BasePath)
+    return makeDeploy.replace('${silecsBasePath}', silecsBasePath).replace('${snap7BasePath}', snap7BasePath)
diff --git a/silecs-codegen/src/xml/test/generated_correct/AllTypes.h b/silecs-codegen/src/xml/test/generated_correct/AllTypes.h
index 5418e9a..ead17ae 100644
--- a/silecs-codegen/src/xml/test/generated_correct/AllTypes.h
+++ b/silecs-codegen/src/xml/test/generated_correct/AllTypes.h
@@ -10,9 +10,9 @@
 #include <SilecsService.h>
 #include <fesa-core/Synchronization/MultiplexingContext.h>
 #include <AllTypes/GeneratedCode/ServiceLocator.h>
-    #include <AllTypes/Server/SendMyRWBlock.h>
-    #include <AllTypes/Server/SendMyWOBlock.h>
-    
+#include <AllTypes/Server/SendMyRWBlock.h>
+#include <AllTypes/Server/SendMyWOBlock.h>
+
 namespace AllTypes
 {
 
-- 
GitLab