--- a/plugins/svgui/svgui.py Thu Sep 13 10:22:40 2007 +0200
+++ b/plugins/svgui/svgui.py Thu Sep 13 10:23:44 2007 +0200
@@ -2,48 +2,747 @@
base_folder = os.path.split(sys.path[0])[0]
sys.path.append(os.path.join(base_folder, "wxsvg", "defeditor"))
-from DEFControler import DEFControler
-from defeditor import EditorFrame
+from DEFControler import * +from FBD_Objects import * class _EditorFramePlug(EditorFrame):
+ This Class add IEC specific features to the SVGUI DEFEditor : + def __init__(self,controller): + EditorFrame.__init__(self,controller) + self.FbdWindow = wx.Panel(name='fbdwindow',parent=self.EditorPanel, + pos=wx.Point(300, 355),size=wx.Size(240, 240), + style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER) + self.FbdWindow.SetBackgroundColour(wxColour(255,255,255)) + self.FbdWindow.Bind(wx.EVT_LEFT_DOWN, self.OnFbdClick) + wx.EVT_PAINT(self.FbdWindow,self.OnPaintFBD) + self.RefreshProjectTree() + if (controller.SvgFilepath): + self.OpenSVGFile(controller.filepath) + self.mySVGctrl.Refresh() + def SetFbdDragData(self,selected_type): + self.FbdBlock = FBD_Block(parent=self.FbdWindow,type=selected_type,name='') + name = self.Controler.GetSelectedElementName() + self.FbdData = str((selected_type,"functionBlock", name)) + dc = wx.ClientDC(self.FbdWindow) + if self.Controler.HasOpenedProject(): + selected_type = self.Controler.GetSelectedElementType() + self.SetFbdDragData(selected_type) + self.FbdBlock = FBD_Block(parent=self.FbdWindow,type=selected_type,name='') + width,height = self.FbdBlock.GetMinSize() + self.FbdBlock.SetSize(width,height) + clientsize = self.FbdWindow.GetClientSize() + x = (clientsize.width - width) / 2 + y = (clientsize.height - height) / 2 + self.FbdBlock.SetPosition(x, y) + def OnPaintFBD(self,event): + def OnFbdClick(self,event): + data = wx.TextDataObject(self.FbdData) + DropSrc = wx.DropSource(self.FbdWindow) + def OnProjectTreeItemSelected(self,event): + EditorFrame.OnProjectTreeItemSelected(self,event) + EditorFrame.OnNew(self,event) + def OnOpen(self,event): + EditorFrame.OnOpen(self,event) + def OnGenerate(self,event): + self.Controler.PlugGenerate_C(sys.path[0],(0,0,4,5),None) def OnClose(self, event):
-class _DEFControlerPlug(DEFControler):
+TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L", + "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", "REAL" : "D", "LREAL" : "L", + "STRING" : "B", "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L", "WSTRING" : "W"} +TYPECONVERSION = {"BOOL" : "X", "UINT" : "W","REAL" : "D","STRING" : "B"} +CTYPECONVERSION = {"BOOL" : "bool", "UINT" : "unsigned int", "STRING" : "char*", "REAL" : "float"} +CPRINTTYPECONVERSION = {"BOOL" : "d", "UINT" : "d", "STRING" : "s", "REAL" : "f"} +class RootClass(DEFControler): - ViewClass = _EditorFramePlug
def __init__(self, buspath):
- filepath = os.path.join(buspath, "gui.def")
+ DEFControler.__init__(self) + filepath = os.path.join(self.PlugPath(), "gui.def") if os.path.isfile(filepath):
+ svgfile = os.path.join(self.PlugPath(), "gui.svg") + if os.path.isfile(svgfile): + self.SvgFilepath = svgfile self.OpenXMLFile(filepath)
self.SetFilePath(filepath)
- def Generate_C(self, dirpath, locations):
- self.GenerateProgram(filepath)
- return {"headers":["program.h"],"sources":["program.cpp"]}
+ def GenerateProgramHeadersPublicVars(self): + fct += " void OnPlcOutEvent(wxEvent& event);\n\n" + fct += " void IN_"+self.BusNumber+"();\n" + fct += " void OUT_"+self.BusNumber+"();\n" + fct += " void Initialize();\n" + fct += " void SetNoChanges();\n" + fct += " void Print();\n" + def GenerateProgramHeadersPrivateVars(self): + elementsTab = self.GetElementsTab() + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + text += " bool flag_"+element_id+";\n" + text += " volatile int step_"+element_id+";\n" + #Declaration des variables + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + for input in FbdBlock["inputs"]: + element_type = TYPECONVERSION[input[1]] + element_c_type = CTYPECONVERSION[input[1]] + line = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n" + text += " "+element_c_type+" "+line + text += " "+element_c_type+" _copy"+line + for output in FbdBlock["outputs"]: + element_type = TYPECONVERSION[output[1]] + element_c_type = CTYPECONVERSION[output[1]] + line = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+";\n" + text += " "+element_c_type+" "+line + text += " "+element_c_type+" _copy"+line + def GenerateGlobalVarsAndFuncs(self): + text += "IMPLEMENT_APP_NO_MAIN(SVGViewApp);\n" + text += "IMPLEMENT_WX_THEME_SUPPORT;\n" + text += "SVGViewApp *myapp;\n" + text += "pthread_t wxMainLoop,automate;\n" + text += "int myargc;\n" + text += "char** myargv;\n\n" + text += "#define FREE_AND_NO_CHANGES 1 \n" + text += "#define PLC_BUSY 2 \n" + text += "#define FREE_AND_CHANGES 3 \n" + text += "#define PLC_OUT_BUSY 4 \n\n" + text += "void* InitWxEntry(void* args)\n{\n" + text += " wxEntry(myargc,myargv);\n" + text += " return args;\n" + text += "void* SimulAutomate(void* args)\n{\n" + text += " myapp->frame->m_svgCtrl->IN_"+self.BusNumber+"();\n" + text += " //printf(\"AUTOMATE\\n\");\n" + text += " myapp->frame->m_svgCtrl->OUT_"+self.BusNumber+"();\n" + text += " return args;\n" + if (self.SVGUIRootElement): + width = self.SVGUIRootElement.GetBBox().GetWidth() + height = self.SVGUIRootElement.GetBBox().GetHeight() + text += "bool SVGViewApp::OnInit()\n{\n" + text += " #ifndef __WXMSW__\n" + text += " setlocale(LC_NUMERIC, \"C\");\n" + text += " frame = new MainFrame(NULL, wxT(\"Program\"),wxDefaultPosition, wxSize((int)"+str(width)+", (int)"+str(height)+"));\n" + text += " myapp = this;\n" + text += " pthread_create(&automate, NULL, SimulAutomate, NULL);\n" + text += " return true;\n" + text += "int main(int argc, char** argv)\n{\n" + text += " myargc = argc;\n" + text += " myargv = argv;\n" + text += " pthread_create(&wxMainLoop, NULL, InitWxEntry, NULL);\n" + def GenerateProgramEventTable(self): + elementsTab = self.GetElementsTab() + #evt += "wxEVT_PLCOUT = wxNewEventType();\n\n"; + evt += "BEGIN_DECLARE_EVENT_TYPES()\n" + evt += "DECLARE_LOCAL_EVENT_TYPE( EVT_PLC, wxNewEventType() )\n" + evt += "END_DECLARE_EVENT_TYPES()\n\n" + evt += "DEFINE_LOCAL_EVENT_TYPE( EVT_PLC )\n\n" + #Event Table Declaration + evt += "BEGIN_EVENT_TABLE(Program, SVGUIWindow)\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + if info["name"] == "name": + element_name = str(info["value"]) + type = element.GetElementInfos()["type"] + evt += " EVT_BUTTON (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"Click)\n" + elif type == "ScrollBar": + #evt += " EVT_LEFT_UP (Program::OnClick)\n" + #evt += " EVT_COMMAND_SCROLL_THUMBTRACK (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"Changed)\n" + elif type == "RotatingCtrl": + evt += " EVT_COMMAND_SCROLL_THUMBTRACK (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"Changed)\n" + elif type == "NoteBook": + evt += " EVT_NOTEBOOK_PAGE_CHANGED (SVGUIID(\""+element_id+"\"), Program::On"+element_name+"TabChanged)\n" + elif type == "Container" or type == "Transform": + evt += " EVT_PAINT(Program::On"+element_name+"Paint)\n" + evt += " EVT_LEFT_UP (Program::OnClick)\n" + evt += " EVT_CUSTOM( EVT_PLC, wxID_ANY, Program::OnPlcOutEvent )\n" + evt += "END_EVENT_TABLE()\n\n" + def GenerateProgramInitFrame(self): + text = "MainFrame::MainFrame(wxWindow *parent, const wxString& title, const wxPoint& pos,const wxSize& size, long style): wxFrame(parent, wxID_ANY, title, pos, size, style)\n{\n" + text += " m_svgCtrl = new Program(this);\n" + text += " if (m_svgCtrl->LoadFiles(wxT(\""+self.SvgFilepath+"\"), wxT(\""+self.filepath+"\")))\n" + text += " Show(true);\n" + text += " m_svgCtrl->SetFocus();\n" + text += " m_svgCtrl->SetFitToFrame(true);\n" + text += " m_svgCtrl->RefreshScale();\n" + text += " m_svgCtrl->InitScrollBars();\n" + text += " m_svgCtrl->Initialize();\n" + text += " m_svgCtrl->Update();\n" + text += " //m_svgCtrl->Print();\n" + text += " printf(\"Error while opening files\\n\");\n" + def GenerateProgramInitProgram(self): + elementsTab = self.GetElementsTab() + text = "Program::Program(wxWindow* parent):SVGUIWindow(parent)\n{\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + text += " flag_"+element_id+" = true;\n" + text += " step_"+element_id+" = FREE_AND_NO_CHANGES;\n" -TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L",
- "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", "REAL" : "D", "LREAL" : "L",
- "STRING" : "B", "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L", "WSTRING" : "W"}
+ def GenerateProgramEventFunctions(self): + elementsTab = self.GetElementsTab() + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + if info["name"] == "name": + element_name = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + fct += "void Program::On"+element_name+"Click(wxCommandEvent& event)\n{\n" + fct += " if (flag_"+element_id+")\n {\n" + fct += " flag_"+element_id+" = false;\n" + for output in FbdBlock["outputs"]: + element_type = TYPECONVERSION[output[1]] + fct += " _copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = true;\n" + fct += " flag_"+element_id+" = true;\n" + fct += " event.Skip();\n" + elif type == "RotatingCtrl": + fct += "void Program::On"+element_name+"Changed(wxScrollEvent& event)\n{\n" + fct += " SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " rotating->SendScrollEvent(event);\n" + fct += " double angle = rotating->GetAngle();\n" + fct += " if (flag_"+element_id+")\n {\n" + fct += " flag_"+element_id+" = false;\n" + for output in FbdBlock["outputs"]: + element_type = TYPECONVERSION[output[1]] + if element_num_patte == 1: + elif element_num_patte == 2: + fct += " _copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n" + fct += " flag_"+element_id+" = true;\n" + elif type == "NoteBook": + fct += "void Program::On"+element_name+"TabChanged(wxNotebookEvent& event)\n{\n" + fct += " SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " notebook->SendNotebookEvent(event);\n" + fct += " unsigned int selected = notebook->GetCurrentPage();\n" + fct += " if (flag_"+element_id+")\n {\n" + fct += " flag_"+element_id+" = false;\n" + for output in FbdBlock["outputs"]: + element_type = TYPECONVERSION[output[1]] + if element_num_patte == 1: + elif element_num_patte == 2: + fct += " _copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte)+" = "+value+";\n" + fct += " flag_"+element_id+" = true;\n" + elif type == "Transform": + fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n" + fct += " SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " if (flag_"+element_id+")\n {\n" + fct += " flag_"+element_id+" = false;\n" + for output in FbdBlock["outputs"]: + if element_num_patte == 1: + fct += " if (transform->GetX() != _copy__QD"+self.BusNumber+"_"+element_id+"_1)\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n" + elif element_num_patte == 2: + fct += " if (transform->GetY() != _copy__QD"+self.BusNumber+"_"+element_id+"_2)\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n" + elif element_num_patte == 3: + fct += " if (transform->GetXScale() != _copy__QD"+self.BusNumber+"_"+element_id+"_3)\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n" + elif element_num_patte == 4: + fct += " if (transform->GetYScale() != _copy__QD"+self.BusNumber+"_"+element_id+"_4)\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n" + elif element_num_patte == 5: + fct += " if (transform->GetAngle() != _copy__QD"+self.BusNumber+"_"+element_id+"_5)\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n" + fct += " flag_"+element_id+" = true;\n" + fct += " event.Skip();\n" + elif type == "Container": + fct += "void Program::On"+element_name+"Paint(wxPaintEvent& event)\n{\n" + fct += " SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " if (container->IsVisible() != _copy__QX"+self.BusNumber+"_"+element_id+"_1 && flag_"+element_id+")\n" + fct += " flag_"+element_id+" = false;\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_1 = container->IsVisible();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n" + fct += " flag_"+element_id+" = true;\n" + fct += " event.Skip();\n" + fct += "void Program::OnChar(wxKeyEvent& event)\n{\n" + fct += " SVGUIContainer* container = GetSVGUIRootElement();\n" + fct += " if (container->GetFocusedElementName() == wxT(\"TextCtrl\"))\n" + fct += " wxString focusedId = container->GetFocusedElement();\n" + fct += " SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(container->GetFocusedElement());\n" + fct += " text->SendKeyEvent(event);\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + fct += " if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n" + fct += " flag_"+element_id+" = false;\n" + fct += " _copy__QB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n" + fct += " flag_"+element_id+" = true;\n" + fct += "void Program::OnClick(wxMouseEvent& event)\n{\n" + fct += " SVGUIContainer* container = GetSVGUIRootElement();\n" + fct += " if (container->GetFocusedElementName() == wxT(\"ScrollBar\"))\n" + fct += " wxString focusedId = container->GetFocusedElement();\n" + fct += " SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(focusedId);\n" + fct += " scrollbar->SendMouseEvent(event);\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + if type == "ScrollBar": + fct += " if (focusedId == wxT(\""+element_id+"\") && flag_"+element_id+")\n" + fct += " flag_"+element_id+" = false;\n" + fct += " unsigned int scrollPos = scrollbar->GetThumbPosition();\n" + fct += " _copy__QW"+self.BusNumber+"_"+element_id+"_1 = scrollPos;\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n" + fct += " flag_"+element_id+" = true;\n" + fct += " event.Skip();\n"
+ fct += "void Program::OnPlcOutEvent(wxEvent& event)\n{\n" + fct += " int old_state;\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" + fct += " if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" + fct += " flag_"+element_id+" = false;\n" + fct += " SVGUIButton* button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " if (_copy__IX"+self.BusNumber+"_"+element_id+"_1)\n" + fct += " button->Show();\n" + fct += " button->Hide();\n" + fct += " flag_"+element_id+" = true;\n" + fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" + elif type == "Container": + fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" + fct += " if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" + fct += " flag_"+element_id+" = false;\n" + fct += " SVGUIContainer* container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " if (_copy__IX"+self.BusNumber+"_"+element_id+"_1)\n" + fct += " container->Show();\n" + fct += " container->Hide();\n" + fct += " flag_"+element_id+" = true;\n" + fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" + elif type == "TextCtrl": + fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" + fct += " if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" + fct += " flag_"+element_id+" = false;\n" + fct += " SVGUITextCtrl* text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " wxString str = wxString::FromAscii(_copy__IB"+self.BusNumber+"_"+element_id+"_1);\n" + fct += " text->SetText(str);\n" + fct += " flag_"+element_id+" = true;\n" + fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" + elif type == "ScrollBar": + fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" + fct += " if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" + fct += " flag_"+element_id+" = false;\n" + fct += " SVGUIScrollBar* scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " scrollbar->SetThumbPosition(_copy__IW"+self.BusNumber+"_"+element_id+"_1);\n" + fct += " flag_"+element_id+" = true;\n" + fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" + elif type == "RotatingCtrl": + fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" + fct += " if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" + fct += " flag_"+element_id+" = false;\n" + fct += " SVGUIRotatingCtrl* rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " rotating->SetAngle(_copy__ID"+self.BusNumber+"_"+element_id+"_1);\n" + fct += " flag_"+element_id+" = true;\n" + fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" + elif type == "NoteBook": + fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" + fct += " if (_copy__IX"+self.BusNumber+"_"+element_id+"_2 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" + fct += " flag_"+element_id+" = false;\n" + fct += " SVGUINoteBook* notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " notebook->SetCurrentPage(_copy__IB"+self.BusNumber+"_"+element_id+"_1);\n" + fct += " flag_"+element_id+" = true;\n" + fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" + elif type == "Transform": + fct += " old_state = __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_CHANGES, PLC_OUT_BUSY);\n" + fct += " if (_copy__IX"+self.BusNumber+"_"+element_id+"_6 && flag_"+element_id+" && old_state == FREE_AND_CHANGES)\n" + fct += " flag_"+element_id+" = false;\n" + fct += " SVGUITransform* transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " transform->Move(_copy__ID"+self.BusNumber+"_"+element_id+"_1,_copy__ID"+self.BusNumber+"_"+element_id+"_2);\n" + fct += " transform->Scale(_copy__ID"+self.BusNumber+"_"+element_id+"_3,_copy__ID"+self.BusNumber+"_"+element_id+"_4);\n" + fct += " transform->Rotate(_copy__ID"+self.BusNumber+"_"+element_id+"_5);\n" + fct += " flag_"+element_id+" = true;\n" + fct += " __sync_val_compare_and_swap (&step_"+element_id+", PLC_OUT_BUSY, FREE_AND_NO_CHANGES);\n" + fct += " Update_Elements();\n" + fct += " event.Skip();\n" - ChildsType = _DEFControlerPlug
+ def GenerateProgramPrivateFunctions(self): + elementsTab = self.GetElementsTab() + fct = "void Program::OUT_"+self.BusNumber+"()\n{\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + fct += " if ( flag_"+element_id+" && __sync_val_compare_and_swap (&step_"+element_id+", PLC_BUSY, FREE_AND_CHANGES) == PLC_BUSY){\n" + #fct += " if ( flag_"+element_id+" ){\n" + fct += " flag_"+element_id+" = false;\n" + for input in FbdBlock["inputs"]: + element_type = TYPECONVERSION[input[1]] + var = "__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte) + fct +=" _copy"+var+ " = "+var+";\n" + fct += " flag_"+element_id+" = true;\n" + fct +=" wxCommandEvent event( EVT_PLC );\n" + fct +=" ProcessEvent(event);\n" + fct += "void Program::IN_"+self.BusNumber+"()\n{\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + fct += " if ( flag_"+element_id+" && __sync_val_compare_and_swap (&step_"+element_id+", FREE_AND_NO_CHANGES, PLC_BUSY) == FREE_AND_NO_CHANGES){\n" + fct += " flag_"+element_id+" = false;\n" + for output in FbdBlock["outputs"]: + element_type = TYPECONVERSION[output[1]] + var = "__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte) + fct +=" "+var+ " = _copy"+var+";\n" + fct += " flag_"+element_id+" = true;\n" + fct += " SetNoChanges();\n" + fct += "void Program::Initialize()\n{\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + fct += " SVGUIButton* button;\n" + fct += " button = (SVGUIButton*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " if (button->IsVisible())\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_1 = true;\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_1 = false;\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n" + elif type == "Container": + fct += " SVGUIContainer* container;\n" + fct += " container = (SVGUIContainer*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " if (container->IsVisible())\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_1 = true;\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_1 = false;\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n" + elif type == "TextCtrl": + fct += " SVGUITextCtrl* text;\n" + fct += " text = (SVGUITextCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " _copy__QB"+self.BusNumber+"_"+element_id+"_1 = wxStringToStr(text->GetValue());\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n" + elif type == "ScrollBar": + fct += " SVGUIScrollBar* scrollbar;\n" + fct += " scrollbar = (SVGUIScrollBar*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " _copy__QW"+self.BusNumber+"_"+element_id+"_1 = scrollbar->GetThumbPosition();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n" + elif type == "RotatingCtrl": + fct += " SVGUIRotatingCtrl* rotating;\n" + fct += " rotating = (SVGUIRotatingCtrl*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_1 = rotating->GetAngle();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n" + elif type == "NoteBook": + fct += " SVGUINoteBook* notebook;\n" + fct += " notebook = (SVGUINoteBook*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " _copy__QB"+self.BusNumber+"_"+element_id+"_1 = notebook->GetCurrentPage();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = true;\n\n" + elif type == "Transform": + fct += " SVGUITransform* transform;\n" + fct += " transform = (SVGUITransform*)GetElementById(wxT(\""+element_id+"\"));\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_1 = transform->GetX();\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_2 = transform->GetY();\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_3 = transform->GetXScale();\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_4 = transform->GetYScale();\n" + fct += " _copy__QD"+self.BusNumber+"_"+element_id+"_5 = transform->GetAngle();\n" + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_6 = true;\n\n" + fct += "void Program::SetNoChanges()\n{\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n" + elif type == "Container": + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n" + elif type == "TextCtrl": + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n" + elif type == "ScrollBar": + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n" + elif type == "RotatingCtrl": + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n" + elif type == "NoteBook": + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_2 = false;\n" + elif type == "Transform": + fct += " _copy__QX"+self.BusNumber+"_"+element_id+"_6 = false;\n" + #DEBUG Fonction d'affichage + fct += "void Program::Print()\n{\n" + for element in elementsTab: + infos = element.getElementAttributes() + if info["name"] == "id": + element_id = str(info["value"]) + type = element.GetElementInfos()["type"] + FbdBlock = self.GetBlockType(type) + for input in FbdBlock["inputs"]: + element_type = TYPECONVERSION[input[1]] + c_type = CPRINTTYPECONVERSION[input[1]] + var = "_copy__I"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte) + fct +=" printf(\""+var+": %"+c_type+"\\n\","+var+");\n" + for output in FbdBlock["outputs"]: + element_type = TYPECONVERSION[output[1]] + c_type = CPRINTTYPECONVERSION[output[1]] + var = "_copy__Q"+element_type+self.BusNumber+"_"+element_id+"_"+str(element_num_patte) + fct +=" printf(\""+var+": %"+c_type+"\\n\","+var+");\n" + #fct +=" wxPostEvent(Program,wxEVT_PLCOUT);\n" + def PlugGenerate_C(self, buildpath, locations, logger): + current_location = self.GetCurrentLocation() + self.BusNumber = "_".join(map(lambda x:str(x), current_location)) + self.GenerateProgram(buildpath) + Gen_C_file = os.path.join(buildpath, "program.cpp" ) + return [(Gen_C_file,"")],"" def BlockTypesFactory(self):
def generate_svgui_block(generator, block, body, link):
controller = generator.GetController()
name = block.getInstanceName()
type = block.getTypeName()
- block_infos = GetBlockType(type)
+ block_infos = self.GetBlockType(type) bus_id, name = [word for word in name.split("_") if word != ""]
block_id = self.PlugChilds[bus_id].GetElementIdFromName(name)
@@ -68,36 +767,59 @@
return [{"name" : "SVGUI function blocks", "list" :
[{"name" : "Container", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("X","FLOAT","none"),("SetX","BOOL","none"),("Y","FLOAT","none"),("SetY","BOOL","none"),("Angle","FLOAT","none"),("SetAngle","BOOL","none")],
- "outputs" : [("X","FLOAT","none"),("X Changed","BOOL","none"),("Y","FLOAT","none"),("Y Changed","BOOL","none"),("Angle","FLOAT","none"),("Angle Changed","BOOL","none")],
- "comment" : "SVGUI Container", "generate": generate_svgui_block},
- {"name" : "Button", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Show","BOOL","none"),("Toggle","BOOL","none")],
- "outputs" : [("Visible","BOOL","none"),("State","BOOL","none")],
- "comment" : "SVGUI Button", "generate": generate_svgui_block},
- {"name" : "TextCtrl", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Text","STRING","none"),("Set Text","BOOL","none")],
- "outputs" : [("Text","STRING","none"),("Text Changed","BOOL","none")],
- "comment" : "SVGUI Text Control", "generate": generate_svgui_block},
- {"name" : "ScrollBar", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Position","UINT","none"),("Set Position","BOOL","none")],
- "outputs" : [("Position","UINT","none"),("Position Changed","BOOL","none")],
- "comment" : "SVGUI ScrollBar", "generate": generate_svgui_block},
- {"name" : "NoteBook", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Selected","UINT","none"),("Set Selected","BOOL","none")],
- "outputs" : [("Selected","UINT","none"),("Selected Changed","BOOL","none")],
- "comment" : "SVGUI Notebook", "generate": generate_svgui_block},
- {"name" : "RotatingCtrl", "type" : "functionBlock", "extensible" : False,
- "inputs" : [("Angle","FLOAT","none"),("Set Angle","BOOL","none")],
- "outputs" : [("Angle","FLOAT","none"),("Angle changed","BOOL","none")],
- "comment" : "SVGUI Rotating Control", "generate": generate_svgui_block}
+ "inputs" : [("Show","BOOL","none"),("Set State","BOOL","none")], + "outputs" : [("Show","BOOL","none"),("State Changed","BOOL","none")], + "comment" : "SVGUI Container"}, + {"name" : "Button", "type" : "functionBlock", "extensible" : False, + "inputs" : [("Show","BOOL","none"),("Toggle","BOOL","none")], + "outputs" : [("Visible","BOOL","none"),("State","BOOL","none")], + "comment" : "SVGUI Button"}, + {"name" : "TextCtrl", "type" : "functionBlock", "extensible" : False, + "inputs" : [("Text","STRING","none"),("Set Text","BOOL","none")], + "outputs" : [("Text","STRING","none"),("Text Changed","BOOL","none")], + "comment" : "SVGUI Text Control"}, + {"name" : "ScrollBar", "type" : "functionBlock", "extensible" : False, + "inputs" : [("Position","UINT","none"),("Set Position","BOOL","none")], + "outputs" : [("Position","UINT","none"),("Position Changed","BOOL","none")], + "comment" : "SVGUI ScrollBar"}, + {"name" : "NoteBook", "type" : "functionBlock", "extensible" : False, + "inputs" : [("Selected","UINT","none"),("Set Selected","BOOL","none")], + "outputs" : [("Selected","UINT","none"),("Selected Changed","BOOL","none")], + "comment" : "SVGUI Notebook"}, + {"name" : "RotatingCtrl", "type" : "functionBlock", "extensible" : False, + "inputs" : [("Angle","REAL","none"),("Set Angle","BOOL","none")], + "outputs" : [("Angle","REAL","none"),("Angle changed","BOOL","none")], + "comment" : "SVGUI Rotating Control"}, + {"name" : "Transform", "type" : "functionBlock", "extensible" : False, + "inputs" : [("X","REAL","none"),("Y","REAL","none"),("Scale X","REAL","none"),("Scale Y","REAL","none"),("Angle","REAL","none"),("Set","BOOL","none")], + "outputs" : [("X","REAL","none"),("Y","REAL","none"),("Scale X","REAL","none"),("Scale Y","REAL","none"),("Angle","REAL","none"),("Changed","BOOL","none")], + "comment" : "SVGUI Transform"}, + def GetBlockType(self,type): + for category in self.BlockTypesFactory(): + for blocktype in category["list"]: + if blocktype["name"] == type: +if __name__ == '__main__': + wxInitAllImageHandlers() + # Install a exception handle for bug reports + #wxAddExceptHook(os.getcwd(),__version__) + cont = RootClass(sys.path[0]) + frame = _EditorFramePlug(cont)