Skip to content
Snippets Groups Projects
Commit 9588c066 authored by al.schwinn's avatar al.schwinn
Browse files

#8 - WRITE-ONLY blocks should result in FESA-Command properties

parent 275bcc41
No related branches found
No related tags found
No related merge requests found
......@@ -229,10 +229,10 @@ class FESADesignGenerator3_0_0(object):
dim.setContent(str(len(defaultNode.getContent())))
return fieldNode
def getOrCreateRegisterValueItems(self,prop,block,isSetting):
def getOrCreateRegisterValueItems(self,prop,block,direction):
for register in block.getDesignRegisters():
if register.generateFesaValueItem:
self.getOrCreateValueItem(prop,register,isSetting)
self.getOrCreateValueItem(prop,register,direction)
def getOrCreateSettingProperty(self,parent,actionsNode,block):
iecommon.logDebug('Generating SettingProperty for Block: ' + block.name, {'debuglog': True})
......@@ -242,12 +242,23 @@ class FESADesignGenerator3_0_0(object):
else:
prop = getOrCreateNamedChildElement(parent,'setting-property',block.getFesaName())
fillAttributes(prop, {'visibility': 'development', 'multiplexed': 'false'})
self.getOrCreateRegisterValueItems(prop,block,True)
self.getOrCreateRegisterValueItems(prop,block,"INOUT")
self.getOrCreateUpdateFlagItem(prop)
self.getOrCreateCyleNameItem(prop)
self.getOrCreateAction(prop,block.fesaSetServerActionName,'set',actionsNode,'custom')
self.getOrCreateAction(prop,block.fesaGetServerActionName,'get',actionsNode,'custom')
return prop
def getOrCreateCommandProperty(self,parent,actionsNode,block):
iecommon.logDebug('Generating CommandProperty for Block: ' + block.name, {'debuglog': True})
if( hasChildren(parent)):
prop = getOrCreateNamedPreviousSiblingElement(parent,getFirstChild(parent), 'command-property',block.getFesaName())
else:
prop = getOrCreateNamedChildElement(parent,'command-property',block.getFesaName())
fillAttributes(prop, {'visibility': 'development', 'multiplexed': 'false'})
self.getOrCreateRegisterValueItems(prop,block,"IN")
self.getOrCreateAction(prop,block.fesaSetServerActionName,'set',actionsNode,'custom')
return prop
def getOrCreateAcquisitionProperty(self,parent,actionsNode,block):
iecommon.logDebug('Generating AcquisitionProperty for Block: ' + block.name, {'debuglog': True})
......@@ -257,7 +268,7 @@ class FESADesignGenerator3_0_0(object):
else:
prop = getOrCreateNamedChildElement(parent,'acquisition-property',block.getFesaName())
fillAttributes(prop, {'visibility': 'development', 'subscribable': 'true', 'multiplexed': 'false', 'on-change': 'true'})
self.getOrCreateRegisterValueItems(prop,block,False)
self.getOrCreateRegisterValueItems(prop,block,"OUT")
self.getOrCreateAcqStampItem(prop)
self.getOrCreateUpdateFlagItem(prop)
self.getOrCreateCyleNameItem(prop)
......@@ -265,13 +276,15 @@ class FESADesignGenerator3_0_0(object):
self.getOrCreateAction(prop,block.fesaGetServerActionName,'get',actionsNode,'custom')
return prop
def getOrCreateGSISettingProperty(self,parent,actionsNode,block):
iecommon.logDebug('Generating GSISettingProperty for Block: ' + block.name, {'debuglog': True})
powerProp = parent.xpathEval('GSI-Power-Property')[0] # template is used --> there has to be a power prop
powerProps = parent.xpathEval('GSI-Power-Property')
if len(powerProps) == 0:
raise Exception("Error: A GSI-Power-Property needs to be available to generate a GSISettingProperty")
powerProp = powerProps[0] # template is used --> there has to be a power prop
prop = getOrCreateNamedPreviousSiblingElement(parent,powerProp, 'GSI-Setting-Property',block.getFesaName())
fillAttributes(prop, {'visibility': 'development', 'multiplexed': 'false'})
self.getOrCreateRegisterValueItems(prop,block,True)
self.getOrCreateRegisterValueItems(prop,block,"INOUT")
self.getOrCreateUpdateFlagItem(prop)
self.getOrCreateCyleNameItem(prop)
self.getOrCreateAction(prop,block.fesaSetServerActionName,'set',actionsNode,'custom')
......@@ -280,10 +293,12 @@ class FESADesignGenerator3_0_0(object):
def getOrCreateGSIAcquisitionProperty(self,parent,actionsNode,block):
iecommon.logDebug('Generating GSIAcquisitionProperty for Block: ' + block.name, {'debuglog': True})
versionProp = parent.xpathEval('GSI-Version-Property')[0] # template is used --> there has to be a version prop
prop = getOrCreateNamedPreviousSiblingElement(parent,versionProp, 'GSI-Acquisition-Property',block.getFesaName())
versionProps = parent.xpathEval('GSI-Version-Property')
if len(versionProps) == 0:
raise Exception("Error: A GSI-Version-Property needs to be available to generate a GSIAcquisitionProperty")
prop = getOrCreateNamedPreviousSiblingElement(parent,versionProps[0], 'GSI-Acquisition-Property',block.getFesaName())
fillAttributes(prop, {'visibility': 'development', 'subscribable': 'true', 'multiplexed': 'false', 'on-change': 'true'})
self.getOrCreateRegisterValueItems(prop,block,False)
self.getOrCreateRegisterValueItems(prop,block,"OUT")
self.getOrCreateAcqStampItem(prop)
self.getOrCreateUpdateFlagItem(prop)
self.getOrCreateCyleNameItem(prop)
......@@ -295,17 +310,40 @@ class FESADesignGenerator3_0_0(object):
# propertyType only used during creation ! If named property already exists, it is just returned, no matter which type
def getOrCreateFESAProperty(self,parent,actionsNode,block):
if self.isGSITemplate(parent):
if parent.get_name() == 'setting':
return self.getOrCreateGSISettingProperty(parent,actionsNode,block)
if block.isSetting():
if block.getFesaName() == 'Power':
raise Exception("Error: Please use '@generateFesaProperty=false' for the GSI-Power-Property and connect silecs-fields manually")
else:
return self.getOrCreateGSISettingProperty(parent,actionsNode,block)
elif block.isCommand():
if block.getFesaName() == 'Init':
raise Exception("Error: Please use '@generateFesaProperty=false' for the GSI-Init-Property and connect silecs-fields manually")
elif block.getFesaName() == 'Reset':
raise Exception("Error: Please use '@generateFesaProperty=false' for the GSI-Reset-Property and connect silecs-fields manually")
else:
return self.getOrCreateCommandProperty(parent,actionsNode,block)
elif block.isAcquisition():
if block.getFesaName() == 'Status':
raise Exception("Error: Please use '@generateFesaProperty=false' for the GSI-Status-Property and connect silecs-fields manually")
elif block.getFesaName() == 'ModuleStatus':
raise Exception("Error: Please use '@generateFesaProperty=false' for the GSI-ModuleStatus-Property and connect silecs-fields manually")
elif block.getFesaName() == 'Version':
raise Exception("Error: Please use '@generateFesaProperty=false' for the GSI-Version-Property and connect silecs-fields manually")
else:
return self.getOrCreateGSIAcquisitionProperty(parent,actionsNode,block)
else:
return self.getOrCreateGSIAcquisitionProperty(parent,actionsNode,block)
raise Exception( "Cannot identify FESA GSI Property-type to use for block:" + block.name )
else:
if parent.get_name() == 'setting':
if block.isSetting():
return self.getOrCreateSettingProperty(parent,actionsNode,block)
else:
elif block.isCommand():
return self.getOrCreateCommandProperty(parent,actionsNode,block)
elif block.isAcquisition():
return self.getOrCreateAcquisitionProperty(parent,actionsNode,block)
else:
raise Exception( "Cannot identify FESA Property-type to use for block:" + block.name )
def getOrCreateValueItem(self,propertyNode,register,isSetting):
def getOrCreateValueItem(self,propertyNode,register,direction):
iecommon.logDebug('Generating ValueItem for Register: ' + register.name, {'debuglog': True})
result = propertyNode.xpathEval("value-item[@name='" + register.getFesaFieldName() + "']")
if len(result):
......@@ -315,10 +353,7 @@ class FESADesignGenerator3_0_0(object):
valueItemNode = getOrCreateNamedPreviousSiblingElement(propertyNode,result[0],'value-item',register.getFesaFieldName())
else:
valueItemNode = getOrCreateNamedChildElement(propertyNode,'value-item',register.getFesaFieldName())
if isSetting:
fillAttributes(valueItemNode, {'direction': 'INOUT'})
else:
fillAttributes(valueItemNode, {'direction': 'OUT'})
fillAttributes(valueItemNode, {'direction': direction})
self.getOrCreateType(valueItemNode,register)
self.getOrCreateFieldRef(valueItemNode,register.getFesaFieldName())
......
This diff is collapsed.
......@@ -21,6 +21,7 @@ import fesa.fesa_3_0_0.generateFesaDesign
import fesa.fesa_3_1_0.generateFesaDesign
import libxml2
import unittest
simpleSilecsDesign = '''<?xml version="1.0" encoding="UTF-8"?>
<SILECS-Design silecs-version="0.10.0" created="03/02/16" updated="03/02/16"
......@@ -36,6 +37,11 @@ simpleSilecsDesign = '''<?xml version="1.0" encoding="UTF-8"?>
<scalar format="uint8"/>
</Setting-Register>
</Setting-Block>
<Command-Block name="Command" generateFesaProperty="true">
<Setting-Register name="mySettingRegister" generateFesaValueItem="true">
<scalar format="uint8"/>
</Setting-Register>
</Command-Block>
<Acquisition-Block name="Acquisition" generateFesaProperty="true">
<Acquisition-Register name="myAcqRegister" generateFesaValueItem="true">
<scalar format="uint8"/>
......@@ -50,7 +56,7 @@ def testFillXML_EmptyTemplate_3_0_0(generator):
generator.fillXML('3.0.0', 'MyClass', fesaRoot,simpleSilecsDesignRoot,logTopics={'errorlog': True})
assertTrue( fesaRoot.xpathEval('/equipment-model/events') != None )
assertTrue( fesaRoot.xpathEval('/equipment-model/scheduling-units') != None )
#etree.tostring(fesaRoot)
def testFillXML_GSITemplate_3_0_0(generator):
fesaRoot = libxml2.parseFile("test/fesa/GSIClassTemplateFESA300.xml")
......@@ -70,14 +76,12 @@ def testFillXML_GSITemplate_3_0_0(generator):
setting = fesaRoot.xpathEval('/equipment-model/interface/device-interface/setting')[0]
firstGSISettingProp = setting.xpathEval('GSI-Setting-Property')[0]
assertTrue( acquisition.xpathEval('*')[0].prop('name') != firstGSISettingProp.prop('name') ) # check if generated at right position
#etree.tostring(fesaRoot)
def testFillXML_EmptyTemplate_3_1_0(generator):
fesaRoot = libxml2.parseFile("test/fesa/emptyTemplateFESA300.xml")
generator.fillXML('3.1.0', 'MyClass', fesaRoot,simpleSilecsDesignRoot,logTopics={'errorlog': True})
assertTrue( fesaRoot.xpathEval('/equipment-model/events') != None )
assertTrue( fesaRoot.xpathEval('/equipment-model/scheduling-units') != None )
#etree.tostring(fesaRoot)
def testFillXML_GSITemplate_3_1_0(generator):
fesaRoot = libxml2.parseFile("test/fesa/GSIClassTemplateFESA300.xml")
......@@ -96,12 +100,35 @@ def testFillXML_GSITemplate_3_1_0(generator):
setting = fesaRoot.xpathEval('/equipment-model/interface/device-interface/setting')[0]
firstGSISettingProp = setting.xpathEval('GSI-Setting-Property')[0]
assertTrue( acquisition.xpathEval('*')[0].prop('name') != firstGSISettingProp.prop('name') ) # check if generated at right position
#etree.tostring(fesaRoot)
def testFillXML_AllTypes_3_1_0(generator):
def testFillXML_GSITemplate_3_1_0_Exceptions(generator):
fesaRoot = libxml2.parseFile("test/fesa/GSIClassTemplateFESA300.xml")
myRoot = simpleSilecsDesignRoot
commandBlock = myRoot.xpathEval('/SILECS-Design/SILECS-Class/Command-Block')[0]
commandBlock.setProp("name", "Init")
try:
generator.fillXML('3.1.0', 'MyClass', fesaRoot,myRoot,logTopics={'errorlog': True})
except:
print "test passed"
else:
print "Test Failed: testFillXML_GSITemplate_3_1_0_Exceptions - Init \n No Exception was thrown"
sys.exit(1)
commandBlock.setProp("name", "Reset")
try:
generator.fillXML('3.1.0', 'MyClass', fesaRoot,myRoot,logTopics={'errorlog': True})
except:
print "test passed"
else:
print "Test Failed: testFillXML_GSITemplate_3_1_0_Exceptions - Reset \n No Exception was thrown"
sys.exit(1)
def testFillXML_AllTypes_4_3_1(generator):
fesaRoot = libxml2.parseFile("test/fesa/GSIClassTemplateFESA431.xml")
silecsRoot = libxml2.parseFile("test/AllTypesFESA.silecsdesign")
fesaRoot = generator.fillXML('3.1.0', 'MyClass', fesaRoot,silecsRoot,logTopics={'errorlog': True})
fesaRoot = generator.fillXML('4.3.0', 'MyClass', fesaRoot,silecsRoot,logTopics={'errorlog': True})
fesaNewDocPath = "test/generated_temp/AllTypesFESA.design"
fesaCompareDocPath = "test/generated_correct/AllTypesFESA.design"
with open(fesaNewDocPath, 'w') as fd:
......@@ -111,11 +138,12 @@ def testFillXML_AllTypes_3_1_0(generator):
assertFileEqual( fesaNewDocPath, fesaCompareDocPath)
def runTests():
generator = fesa.fesa_3_0_0.generateFesaDesign.FESADesignGenerator3_0_0();
testFillXML_EmptyTemplate_3_0_0(generator)
testFillXML_GSITemplate_3_0_0(generator)
generator = fesa.fesa_3_1_0.generateFesaDesign.FESADesignGenerator3_1_0();
testFillXML_EmptyTemplate_3_1_0(generator)
testFillXML_GSITemplate_3_1_0(generator)
testFillXML_AllTypes_3_1_0(generator)
generator300 = fesa.fesa_3_0_0.generateFesaDesign.FESADesignGenerator3_0_0();
testFillXML_EmptyTemplate_3_0_0(generator300)
testFillXML_GSITemplate_3_0_0(generator300)
generator310 = fesa.fesa_3_1_0.generateFesaDesign.FESADesignGenerator3_1_0();
testFillXML_EmptyTemplate_3_1_0(generator310)
testFillXML_GSITemplate_3_1_0(generator310)
testFillXML_AllTypes_4_3_1(generator310)
testFillXML_GSITemplate_3_1_0_Exceptions(generator310)
allTestsOk()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment