Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ESIDataType ¶
type ESIDataType struct { Name string `xml:"Name"` BitSize int `xml:"BitSize"` SubItems []*ESIDataTypeSubItem `xml:"SubItem"` }
type ESIDataTypeSubItem ¶
type ESIDevice ¶
type ESIDevice struct { Type struct { Type string `xml:",chardata"` ProductCode string `xml:"ProductCode,attr"` RevisionNo string `xml:"RevisionNo,attr"` CheckRevisionNo string `xml:"CheckRevisionNo,attr"` } `xml:"Type" yaml:"-"` Names []ESIName `xml:"Name" yaml:",omitempty"` URLs []ESIDeviceURL `xml:"URL" yaml:",omitempty"` Info ESIDeviceInfo `xml:"Info" yaml:"Info,omitempty"` GroupType string `xml:"GroupType" yaml:",omitempty"` // maps to ESIGroup.Type ShortType string `yaml:"Type,omitempty"` ProductCode string `yaml:"ProductCode,omitempty"` RevisionNo string `yaml:"RevisionNo,omitempty"` EnglishURL string `yaml:"URL,omitempty"` EnglishName string `yaml:"Name,omitempty"` GroupName string `yaml:"DeviceGroup,omitempty"` Vendor string `yaml:"Vendor,omitempty"` VendorID string `yaml:"VendorID,omitempty"` Profile ESIProfile `yaml:"Profile,omitempty"` TxPDOs []*ESIPDO `xml:"TxPdo" yaml:"TxPDOs,omitempty"` RxPDOs []*ESIPDO `xml:"RxPdo" yaml:"RxPDOs,omitempty"` IDs []*ESIDeviceID `yaml:"IDs"` }
func MergeDevices ¶
Merge devices together if they have identical RxPDO/TxPDO/Object configurations. This should be a fairly conservative way to catch mostly-identical devices that can share the same driver.
This also *dramatically* reduces the side of the output, from 73M to 24M.
For example, this decides that the following are mostly identical:
- EJ2008 - EJ2128 - EL2008 - EL2008-0015 - EL2088 - EL2788 - EL2798 - EL2808 - EL2828 - ELX2008 - EP2008-0001 - EP2008-0002 - EP2008-0022 - EP2028-0001 - EP2028-0002 - EP2028-0032 - EPP2008-0001 - EPP2008-0002 - EPP2008-0022 - EPP2028-0001 - EPP2028-0002 - EQ2008-0002
Unfortunately, this is still a bit odd about different revisions of devices. For example, according to the current ESI files from Beckhoff, the EL7031 comes in multiple revisions:
- 0x00100000 "rev0" - 0x0010001e "rev0e" -- actually differnet HW? - 0x00110000 "rev1" -- identical to rev0 - 0x00120000 "rev2" -- adds a bunch of 0x6020 and 0x7020 PDOs which aren't in rev0 - 0x00130000 "rev3" -- similar to rev2, but names reformatted - 0x00140000 "rev4" -- identical to rev3 - 0x00150000 "rev5" -- identical to rev3 - 0x00160000 "rev6" -- identical to rev3 - 0x00170000 "rev7" -- similar to rev2, but deletes a bunch of PDOs from 'objects' - 0x00180000 "rev8" -- similar to rev7, but adds 0x7021 PDOs - 0x00190000 "rev9" -- identical to rev8 - 0x001a0000 "rev10" -- similar to rev8, but adds 0x6020:0x23
These are currently broken into 7 different blocks by this code, because (to some extent) these actually *are* several different devices. Attempting to access 0x6020 PDOs with a rev0 or rev1 device will fail, probably keeping LCEC from starting up at all.
Looking at our code, the el70x1 driver supports the EL7031 and the EL7041-0052. Amazingly, this code actually groups the "rev10" EL7031 together with all of the revs of the EL7041-0052.
type ESIDeviceID ¶
type ESIDeviceID struct { Type string `yaml:"Type,omitempty"` ProductCode string `yaml:"ProductCode,omitempty"` RevisionNo string `yaml:"RevisionNo,omitempty"` URL string `yaml:"URL,omitempty"` Name string `yaml:"Name,omitempty"` Vendor string `yaml:"Vendor,omitempty"` VendorID string `yaml:"VendorID,omitempty"` }
type ESIDeviceInfo ¶
type ESIDeviceInfo struct { Current string `xml:"Electrical>EBusCurrent" yaml:",omitempty"` RequestTimeout int `xml:"Mailbox>Timeout>RequestTimeout" yaml:",omitempty"` ResponseTimeout int `xml:"Mailbox>Timeout>ResponseTimeout" yaml:",omitempty"` Ports []ESIDeviceInfoPort `xml:"Port" yaml:",omitempty"` }
type ESIDeviceInfoPort ¶
type ESIDeviceURL ¶
type ESILangName ¶
type ESIObject ¶
type ESIObject struct { Index string `xml:"Index" yaml:",omitempty"` Name string `xml:"Name" yaml:",omitempty"` TypeName string `xml:"Type" yaml:",omitempty"` BitSize int `xml:"BitSize" yaml:",omitempty"` SubItems []*ESIObjectSubItem `xml:"Info>SubItem" yaml:",omitempty"` }
type ESIObjectSubItem ¶
type ESIObjectSubItem struct { Name string `xml:"Name"\ yaml:",omitempty"` DefaultData string `xml:"Info>DefaultData" yaml:",omitempty"` Type string `yaml:"Type,omitempty"` BitSize int `yaml:"BitSize,omitempty"` BitOffset int `yaml:"BitOffs,omitempty"` Access string `yaml:"Access,omitempty"` Category string `yaml:"Category,omitempty"` }
type ESIPDO ¶
type ESIPDO struct { Index string `xml:"Index" yaml:"Index,omitempty"` PDOName string `yaml:"Name,omitempty"` LangNames []*ESILangName `xml:"Name"` Ref string `xml:"Ref,attr" yaml:"Ref,omitempty"` Chn string `xml:"Chn,attr" yaml:"Chn,omitempty"` Fixed string `xml:"Fixed,attr" yaml:"Fixed,omitempty"` Sm string `xml:"Sm,attr" yaml:"Sm,omitempty"` Entries []*ESIPDOEntry `xml:"Entry" yaml:"Entry,omitempty"` }
type ESIPDOEntry ¶
type ESIPDOEntry struct { PDOName string `yaml:"Name,omitempty"` LangNames []*ESILangName `xml:"Name" yaml:"Names,omitempty"` Index string `xml:"Index" yaml:"Index,omitempty"` SubIndex string `xml:"SubIndex" yaml:"SubIndex,omitempty"` BitLen int `xml:"BitLen" yaml:"BitLen,omitempty"` Dtype ESIPDOEntryData `xml:"DataType" yaml:",omitempty"` DataType string `xml:"-" yaml:"DataType,omitempty"` DataScale string `xml:"-" yaml:"DataScale,omitempty"` Comment string `xml:"Comment" yaml:"Comment,omitempty"` }
type ESIPDOEntryData ¶
type ESIProfile ¶
type ESIProfile struct { ProfileNo int `xml:"ProfileNo" yaml:",omitempty"` Channels int `xml:"ChannelCount" yaml:",omitempty"` AddInfo int `xml:"AddInfo" yaml:",omitempty"` // what is "AddInfo?" DataTypes []*ESIDataType `xml:"Dictionary>DataTypes>DataType"` DataTypeMap map[string]*ESIDataType Objects []*ESIObject `xml:"Dictionary>Objects>Object" yaml:"Objects,omitempty"` }