canfestival/canfestival.py
changeset 845 412a9f05070f
parent 815 e4f24593a758
child 847 b157705a9024
equal deleted inserted replaced
844:ec9e6ef49878 845:412a9f05070f
    51     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    51     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    52       <xsd:element name="CanFestivalSlaveNode">
    52       <xsd:element name="CanFestivalSlaveNode">
    53         <xsd:complexType>
    53         <xsd:complexType>
    54           <xsd:attribute name="CAN_Device" type="xsd:string" use="optional" default="%(CAN_Device)s"/>
    54           <xsd:attribute name="CAN_Device" type="xsd:string" use="optional" default="%(CAN_Device)s"/>
    55           <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/>
    55           <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/>
    56           <xsd:attribute name="NodeId" type="xsd:string" use="optional" default="%(Slave_NodeId)d"/>
    56           <xsd:attribute name="NodeId" type="xsd:integer" use="optional" default="%(Slave_NodeId)d"/>
    57           <xsd:attribute name="Sync_Align" type="xsd:integer" use="optional" default="0"/>
    57           <xsd:attribute name="Sync_Align" type="xsd:integer" use="optional" default="0"/>
    58           <xsd:attribute name="Sync_Align_Ratio" use="optional" default="50">
    58           <xsd:attribute name="Sync_Align_Ratio" use="optional" default="50">
    59             <xsd:simpleType>
    59             <xsd:simpleType>
    60                 <xsd:restriction base="xsd:integer">
    60                 <xsd:restriction base="xsd:integer">
    61                     <xsd:minInclusive value="1"/>
    61                     <xsd:minInclusive value="1"/>
   105                                    "heartbeat",  # NMT
   105                                    "heartbeat",  # NMT
   106                                    [])           # options
   106                                    [])           # options
   107             dialog.Destroy()
   107             dialog.Destroy()
   108             self.OnCTNSave()
   108             self.OnCTNSave()
   109 
   109 
       
   110     def GetCurrentNodeName(self):
       
   111         return self.CTNName()
       
   112 
   110     def GetSlaveODPath(self):
   113     def GetSlaveODPath(self):
   111         return os.path.join(self.CTNPath(), 'slave.od')
   114         return os.path.join(self.CTNPath(), 'slave.od')
   112 
   115 
   113     def GetCanDevice(self):
   116     def GetCanDevice(self):
   114         return self.CanFestivalSlaveNode.getCan_Device()
   117         return self.CanFestivalSlaveNode.getCan_Device()
   167         prefix = "_".join(map(str, current_location))
   170         prefix = "_".join(map(str, current_location))
   168         Gen_OD_path = os.path.join(buildpath, "OD_%s.c"%prefix )
   171         Gen_OD_path = os.path.join(buildpath, "OD_%s.c"%prefix )
   169         # Create a new copy of the model
   172         # Create a new copy of the model
   170         slave = self.GetCurrentNodeCopy()
   173         slave = self.GetCurrentNodeCopy()
   171         slave.SetNodeName("OD_%s"%prefix)
   174         slave.SetNodeName("OD_%s"%prefix)
       
   175         slave.SetNodeID(self.CanFestivalSlaveNode.getNodeId())
   172         # allow access to local OD from Slave PLC
   176         # allow access to local OD from Slave PLC
   173         pointers = config_utils.LocalODPointers(locations, current_location, slave)
   177         pointers = config_utils.LocalODPointers(locations, current_location, slave)
   174         res = gen_cfile.GenerateFile(Gen_OD_path, slave, pointers)
   178         res = gen_cfile.GenerateFile(Gen_OD_path, slave, pointers)
   175         if res :
   179         if res :
   176             raise Exception, res
   180             raise Exception, res
   217     def GetBufferState(self):
   221     def GetBufferState(self):
   218         return self.GetCurrentBufferState()
   222         return self.GetCurrentBufferState()
   219     
   223     
   220     ConfNodeMethods = []
   224     ConfNodeMethods = []
   221 
   225 
       
   226 class _NodeManager(NodeManager):
       
   227 
       
   228     def __init__(self, parent, *args, **kwargs):
       
   229         NodeManager.__init__(self, *args, **kwargs)
       
   230         self.Parent = parent
       
   231         
       
   232     def __del__(self):
       
   233         self.Parent = None
       
   234         
       
   235     def GetCurrentNodeName(self):
       
   236         return self.Parent.CTNName()
       
   237     
       
   238     def GetCurrentNodeID(self):
       
   239         return self.Parent.CanFestivalNode.getNodeId()
       
   240     
   222 class _NodeListCTN(NodeList):
   241 class _NodeListCTN(NodeList):
   223     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
   242     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
   224     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   243     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   225       <xsd:element name="CanFestivalNode">
   244       <xsd:element name="CanFestivalNode">
   226         <xsd:complexType>
   245         <xsd:complexType>
   227           <xsd:attribute name="CAN_Device" type="xsd:string" use="optional" default="%(CAN_Device)s"/>
   246           <xsd:attribute name="CAN_Device" type="xsd:string" use="optional" default="%(CAN_Device)s"/>
   228           <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/>
   247           <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/>
   229           <xsd:attribute name="NodeId" type="xsd:string" use="optional" default="%(Master_NodeId)d"/>
   248           <xsd:attribute name="NodeId" type="xsd:integer" use="optional" default="%(Master_NodeId)d"/>
   230           <xsd:attribute name="Sync_TPDOs" type="xsd:boolean" use="optional" default="true"/>
   249           <xsd:attribute name="Sync_TPDOs" type="xsd:boolean" use="optional" default="true"/>
   231         </xsd:complexType>
   250         </xsd:complexType>
   232       </xsd:element>
   251       </xsd:element>
   233     </xsd:schema>
   252     </xsd:schema>
   234     """ % DEFAULT_SETTINGS
   253     """ % DEFAULT_SETTINGS
   235     
   254     
   236     EditorType = NetworkEditor
   255     EditorType = NetworkEditor
   237     IconPath = os.path.join(CanFestivalPath, "objdictgen", "networkedit.png")
   256     IconPath = os.path.join(CanFestivalPath, "objdictgen", "networkedit.png")
   238     
   257     
   239     def __init__(self):
   258     def __init__(self):
   240         manager = NodeManager()
   259         manager = _NodeManager(self)
   241         NodeList.__init__(self, manager)
   260         NodeList.__init__(self, manager)
   242         self.LoadProject(self.CTNPath())
   261         self.LoadProject(self.CTNPath())
   243         self.SetNetworkName(self.BaseParams.getName())
   262         self.SetNetworkName(self.BaseParams.getName())
   244     
   263     
   245     def GetCanDevice(self):
   264     def GetCanDevice(self):
   246         return self.CanFestivalNode.getCan_Device()
   265         return self.CanFestivalNode.getCan_Device()
   247     
   266     
   248     def SetParamsAttribute(self, path, value):
   267     def SetParamsAttribute(self, path, value):
   249         result = ConfigTreeNode.SetParamsAttribute(self, path, value)
   268         if path == "CanFestivalNode.NodeId":
       
   269             nodeid = self.CanFestivalNode.getNodeId()
       
   270             if value != nodeid:
       
   271                 slaves = self.GetSlaveIDs()
       
   272                 dir = (value - nodeid) / abs(value - nodeid)
       
   273                 while value in slaves and value >= 0:
       
   274                     value += dir
       
   275                 if value < 0:
       
   276                     value = nodeid
       
   277         
       
   278         value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value)
       
   279         refresh_network = False
   250         
   280         
   251         # Filter IEC_Channel and Name, that have specific behavior
   281         # Filter IEC_Channel and Name, that have specific behavior
   252         if path == "BaseParams.IEC_Channel" and self._View is not None:
   282         if path == "BaseParams.IEC_Channel" and self._View is not None:
   253             self._View.SetBusId(self.GetCurrentLocation())
   283             self._View.SetBusId(self.GetCurrentLocation())
   254         elif path == "BaseParams.Name":
   284         elif path == "BaseParams.Name":
   255             self.SetNetworkName(value)
   285             self.SetNetworkName(value)
   256         
   286             refresh_network = True
   257         return result
   287         elif path == "CanFestivalNode.NodeId":
   258     
   288             refresh_network = True
       
   289             
       
   290         if refresh_network and self._View is not None:
       
   291             wx.CallAfter(self._View.RefreshBufferState)
       
   292         return value, refresh
       
   293         
   259     _GeneratedMasterView = None
   294     _GeneratedMasterView = None
   260     def _ShowGeneratedMaster(self):
   295     def _ShowGeneratedMaster(self):
   261         self._OpenView("Generated master")
   296         self._OpenView("Generated master")
   262         
   297         
   263     def _OpenView(self, name=None, onlyopened=False):
   298     def _OpenView(self, name=None, onlyopened=False):
   333         # Create a new copy of the model with DCF loaded with PDO mappings for desired location
   368         # Create a new copy of the model with DCF loaded with PDO mappings for desired location
   334         try:
   369         try:
   335             master, pointers = config_utils.GenerateConciseDCF(locations, current_location, self, self.CanFestivalNode.getSync_TPDOs(),"OD_%s"%prefix)
   370             master, pointers = config_utils.GenerateConciseDCF(locations, current_location, self, self.CanFestivalNode.getSync_TPDOs(),"OD_%s"%prefix)
   336         except config_utils.PDOmappingException, e:
   371         except config_utils.PDOmappingException, e:
   337             raise Exception, e.message
   372             raise Exception, e.message
       
   373         master.SetNodeID(self.CanFestivalNode.getNodeId())
   338         # Do generate C file.
   374         # Do generate C file.
   339         res = gen_cfile.GenerateFile(Gen_OD_path, master, pointers)
   375         res = gen_cfile.GenerateFile(Gen_OD_path, master, pointers)
   340         if res :
   376         if res :
   341             raise Exception, res
   377             raise Exception, res
   342         
   378