etisserant@20: import os, sys
etisserant@20: base_folder = os.path.split(sys.path[0])[0]
etisserant@20: sys.path.append(os.path.join(base_folder, "wxsvg", "defeditor"))
etisserant@20: 
etisserant@12: from DEFControler import DEFControler
etisserant@12: from defeditor import EditorFrame
lbessard@11: 
etisserant@13: class _EditorFramePlug(EditorFrame):
etisserant@12:     def OnClose(self, event):
etisserant@13:         self.OnPlugClose()
etisserant@12:         event.Skip()
etisserant@12: 
etisserant@13: class _DEFControlerPlug(DEFControler):
etisserant@12: 
etisserant@13:     ViewClass = _EditorFramePlug
etisserant@12:     
etisserant@12:     def __init__(self, buspath):
etisserant@12:         filepath = os.path.join(buspath, "gui.def")
etisserant@12:         if os.path.isfile(filepath):
etisserant@12:             self.OpenXMLFile(filepath)
etisserant@13:         else:
etisserant@12:             self.CreateRootElement()
etisserant@12:             self.SetFilePath(filepath)
etisserant@12: 
etisserant@12:     def ReqSave(self):
etisserant@12:         self.SaveXMLFile()
etisserant@12:         return True
etisserant@12: 
etisserant@12:     def Generate_C(self, dirpath, locations):
etisserant@12:         self.GenerateProgram(filepath)
etisserant@12:         return {"headers":["program.h"],"sources":["program.cpp"]}
etisserant@12:     
lbessard@11: TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L",
lbessard@11:     "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", "REAL" : "D", "LREAL" : "L",
lbessard@11:     "STRING" : "B", "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L", "WSTRING" : "W"}
lbessard@11: 
etisserant@13: class RootClass:
etisserant@13:     
etisserant@13:     ChildsType = _DEFControlerPlug
etisserant@13:     
etisserant@12:     def BlockTypesFactory(self):
etisserant@12:         def generate_svgui_block(generator, block, body, link):
etisserant@12:             controller = generator.GetController()
etisserant@12:             name = block.getInstanceName()
etisserant@12:             type = block.getTypeName()
etisserant@12:             block_infos = GetBlockType(type)
etisserant@12:             bus_id, name = [word for word in name.split("_") if word != ""]
etisserant@13:             block_id = self.PlugChilds[bus_id].GetElementIdFromName(name)
etisserant@12:             if block_id == None:
etisserant@12:                 raise ValueError, "No corresponding block found"
etisserant@12:             if not generator.ComputedBlocks.get(name, False):
etisserant@12:                 for num, variable in enumerate(block.inputVariables.getVariable()):
etisserant@12:                     connections = variable.connectionPointIn.getConnections()
etisserant@12:                     if connections and len(connections) == 1:
etisserant@12:                         parameter = "__I%s%d_%d_%d"%(TYPECONVERSION[block_infos["inputs"][num][1]], bus_id, block_id, num)
etisserant@12:                         value = generator.ComputeFBDExpression(body, connections[0])
etisserant@12:                         generator.Program += ("  %s := %s;\n"%(parameter, generator.ExtractModifier(variable, value)))
etisserant@12:                 generator.ComputedBlocks[name] = True
etisserant@12:             if link:
etisserant@12:                 connectionPoint = link.getPosition()[-1]
etisserant@12:                 for num, variable in enumerate(block.outputVariables.getVariable()):
etisserant@12:                     blockPointx, blockPointy = variable.connectionPointOut.getRelPosition()
etisserant@12:                     if block.getX() + blockPointx == connectionPoint.getX() and block.getY() + blockPointy == connectionPoint.getY():
etisserant@12:                         return "__Q%s%d_%d_%d"%(TYPECONVERSION[block_infos["outputs"][num][1]], bus_id, block_id, num)
etisserant@12:                 raise ValueError, "No output variable found"
etisserant@12:             else:
etisserant@12:                 return None
lbessard@11: 
etisserant@12:         return [{"name" : "SVGUI function blocks", "list" :
etisserant@12:            [{"name" : "Container", "type" : "functionBlock", "extensible" : False, 
etisserant@12:              "inputs" : [("X","FLOAT","none"),("SetX","BOOL","none"),("Y","FLOAT","none"),("SetY","BOOL","none"),("Angle","FLOAT","none"),("SetAngle","BOOL","none")], 
etisserant@12:              "outputs" : [("X","FLOAT","none"),("X Changed","BOOL","none"),("Y","FLOAT","none"),("Y Changed","BOOL","none"),("Angle","FLOAT","none"),("Angle Changed","BOOL","none")],
etisserant@12:              "comment" : "SVGUI Container", "generate": generate_svgui_block},
etisserant@12:             {"name" : "Button", "type" : "functionBlock", "extensible" : False, 
etisserant@12:              "inputs" : [("Show","BOOL","none"),("Toggle","BOOL","none")], 
etisserant@12:              "outputs" : [("Visible","BOOL","none"),("State","BOOL","none")],
etisserant@12:              "comment" : "SVGUI Button", "generate": generate_svgui_block},
etisserant@12:             {"name" : "TextCtrl", "type" : "functionBlock", "extensible" : False, 
etisserant@12:              "inputs" : [("Text","STRING","none"),("Set Text","BOOL","none")], 
etisserant@12:              "outputs" : [("Text","STRING","none"),("Text Changed","BOOL","none")],
etisserant@12:              "comment" : "SVGUI Text Control", "generate": generate_svgui_block},
etisserant@12:             {"name" : "ScrollBar", "type" : "functionBlock", "extensible" : False, 
etisserant@12:              "inputs" : [("Position","UINT","none"),("Set Position","BOOL","none")], 
etisserant@12:              "outputs" : [("Position","UINT","none"),("Position Changed","BOOL","none")],
etisserant@12:              "comment" : "SVGUI ScrollBar", "generate": generate_svgui_block},
etisserant@12:             {"name" : "NoteBook", "type" : "functionBlock", "extensible" : False, 
etisserant@12:              "inputs" : [("Selected","UINT","none"),("Set Selected","BOOL","none")], 
etisserant@12:              "outputs" : [("Selected","UINT","none"),("Selected Changed","BOOL","none")],
etisserant@12:              "comment" : "SVGUI Notebook", "generate": generate_svgui_block},
etisserant@12:             {"name" : "RotatingCtrl", "type" : "functionBlock", "extensible" : False, 
etisserant@12:              "inputs" : [("Angle","FLOAT","none"),("Set Angle","BOOL","none")], 
etisserant@12:              "outputs" : [("Angle","FLOAT","none"),("Angle changed","BOOL","none")],
etisserant@12:              "comment" : "SVGUI Rotating Control", "generate": generate_svgui_block}
etisserant@12:            ]}]
etisserant@12: 
etisserant@12: 
etisserant@12: 
etisserant@12: 
etisserant@12: 
etisserant@12: 
etisserant@12: 
etisserant@12: 
etisserant@12: