23 import wx.grid as gridlib |
23 import wx.grid as gridlib |
24 # ------------------------------------------------------------- |
24 # ------------------------------------------------------------- |
25 |
25 |
26 # ------------ for register management --------------- |
26 # ------------ for register management --------------- |
27 from xml.dom import minidom |
27 from xml.dom import minidom |
|
28 from util.TranslationCatalogs import NoTranslate |
28 # ------------------------------------------------------------- |
29 # ------------------------------------------------------------- |
29 |
30 |
30 |
31 |
31 # ----------------------------- For Sync Manager Table ----------------------------------- |
32 # ----------------------------- For Sync Manager Table ----------------------------------- |
32 def GetSyncManagersTableColnames(): |
33 def GetSyncManagersTableColnames(): |
33 """ |
34 """ |
34 Returns column names of SyncManager Table in Slave state panel. |
35 Returns column names of SyncManager Table in Slave state panel. |
35 """ |
36 """ |
36 _ = lambda x : x |
37 _ = NoTranslate |
37 return ["#", _("Name"), _("Start Address"), _("Default Size"), _("Control Byte"), _("Enable")] |
38 return ["#", _("Name"), _("Start Address"), _("Default Size"), _("Control Byte"), _("Enable")] |
38 |
39 |
39 |
40 |
40 # ------------------------------------------------------------------------------- |
41 # ------------------------------------------------------------------------------- |
41 # Sync Managers Table |
42 # Sync Managers Table |
115 self.TextCtrlDic = {} |
116 self.TextCtrlDic = {} |
116 self.ButtonDic = {} |
117 self.ButtonDic = {} |
117 |
118 |
118 # iniitalize BoxSizer and FlexGridSizer |
119 # iniitalize BoxSizer and FlexGridSizer |
119 self.SizerDic = { |
120 self.SizerDic = { |
120 "SlaveState_main_sizer" : wx.BoxSizer(wx.VERTICAL), |
121 "SlaveState_main_sizer": wx.BoxSizer(wx.VERTICAL), |
121 "SlaveState_inner_main_sizer" : wx.FlexGridSizer(cols=1, hgap=50, rows=3, vgap=10), |
122 "SlaveState_inner_main_sizer": wx.FlexGridSizer(cols=1, hgap=50, rows=3, vgap=10), |
122 "SlaveInfosDetailsInnerSizer" : wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10), |
123 "SlaveInfosDetailsInnerSizer": wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10), |
123 "SyncManagerInnerSizer" : wx.FlexGridSizer(cols=1, hgap=5, rows=1, vgap=5), |
124 "SyncManagerInnerSizer": wx.FlexGridSizer(cols=1, hgap=5, rows=1, vgap=5), |
124 "SlaveState_sizer" : wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10), |
125 "SlaveState_sizer": wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10), |
125 "SlaveState_up_sizer" : wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10), |
126 "SlaveState_up_sizer": wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10), |
126 "SlaveState_down_sizer" : wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=10)} |
127 "SlaveState_down_sizer": wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=10)} |
127 |
128 |
128 # initialize StaticBox and StaticBoxSizer |
129 # initialize StaticBox and StaticBoxSizer |
129 for box_name, box_label in [ |
130 for box_name, box_label in [ |
130 ("SlaveInfosDetailsBox", "Slave Informations"), |
131 ("SlaveInfosDetailsBox", "Slave Informations"), |
131 ("SyncManagerBox", "Sync Manager"), |
132 ("SyncManagerBox", "Sync Manager"), |
148 self.SyncManagersGrid = CustomGrid(self, size=wx.Size(605, 155), style=wx.VSCROLL) |
149 self.SyncManagersGrid = CustomGrid(self, size=wx.Size(605, 155), style=wx.VSCROLL) |
149 |
150 |
150 self.SizerDic["SyncManagerInnerSizer"].Add(self.SyncManagersGrid) |
151 self.SizerDic["SyncManagerInnerSizer"].Add(self.SyncManagersGrid) |
151 self.SizerDic["SyncManagerBox"].Add(self.SizerDic["SyncManagerInnerSizer"]) |
152 self.SizerDic["SyncManagerBox"].Add(self.SizerDic["SyncManagerInnerSizer"]) |
152 |
153 |
153 for button_name, button_id, button_label, button_tooltipstring, event_method, sub_item in [ |
154 buttons = [ |
154 ("InitButton", 0, "INIT", "State Transition to \"Init\" State", self.OnButtonClick, []), |
155 ("InitButton", 0, "INIT", "State Transition to \"Init\" State", self.OnButtonClick, []), |
155 ("PreOPButton", 1, "PREOP", "State Transition to \"PreOP\" State", self.OnButtonClick, [ |
156 ("PreOPButton", 1, "PREOP", "State Transition to \"PreOP\" State", self.OnButtonClick, [ |
156 ("TargetStateLabel", "Target State:" , "TargetState")]), |
157 ("TargetStateLabel", "Target State:", "TargetState")]), |
157 ("SafeOPButton", 2, "SAFEOP", "State Transition to \"SafeOP\" State", self.OnButtonClick, []), |
158 ("SafeOPButton", 2, "SAFEOP", "State Transition to \"SafeOP\" State", self.OnButtonClick, []), |
158 ("OPButton", 3, "OP", "State Transition to \"OP\" State", self.OnButtonClick, [ |
159 ("OPButton", 3, "OP", "State Transition to \"OP\" State", self.OnButtonClick, [ |
159 ("CurrentStateLabel", "Current State:", "CurrentState")])]: |
160 ("CurrentStateLabel", "Current State:", "CurrentState")]) |
|
161 ] |
|
162 for button_name, button_id, button_label, button_tooltipstring, event_method, sub_item in buttons: |
160 self.ButtonDic[button_name] = wx.Button(self, id=button_id, label=_(button_label)) |
163 self.ButtonDic[button_name] = wx.Button(self, id=button_id, label=_(button_label)) |
161 self.ButtonDic[button_name].Bind(wx.EVT_BUTTON, event_method) |
164 self.ButtonDic[button_name].Bind(wx.EVT_BUTTON, event_method) |
162 self.ButtonDic[button_name].SetToolTipString(button_tooltipstring) |
165 self.ButtonDic[button_name].SetToolTipString(button_tooltipstring) |
163 self.SizerDic["SlaveState_up_sizer"].Add(self.ButtonDic[button_name]) |
166 self.SizerDic["SlaveState_up_sizer"].Add(self.ButtonDic[button_name]) |
164 for statictext_name, statictext_label, textctrl_name in sub_item : |
167 for statictext_name, statictext_label, textctrl_name in sub_item: |
165 self.StaticTextDic[statictext_name] = wx.StaticText(self, label=_(statictext_label)) |
168 self.StaticTextDic[statictext_name] = wx.StaticText(self, label=_(statictext_label)) |
166 self.TextCtrlDic[textctrl_name] = wx.TextCtrl(self, size=wx.DefaultSize, style=wx.TE_READONLY) |
169 self.TextCtrlDic[textctrl_name] = wx.TextCtrl(self, size=wx.DefaultSize, style=wx.TE_READONLY) |
167 self.SizerDic["SlaveState_up_sizer"].AddMany([self.StaticTextDic[statictext_name], |
170 self.SizerDic["SlaveState_up_sizer"].AddMany([self.StaticTextDic[statictext_name], |
168 self.TextCtrlDic[textctrl_name]]) |
171 self.TextCtrlDic[textctrl_name]]) |
169 |
172 |
239 """ |
242 """ |
240 Event handler for slave state transition button click (Init, PreOP, SafeOP, OP button) |
243 Event handler for slave state transition button click (Init, PreOP, SafeOP, OP button) |
241 @param event : wx.EVT_BUTTON object |
244 @param event : wx.EVT_BUTTON object |
242 """ |
245 """ |
243 check_connect_flag = self.Controler.CommonMethod.CheckConnect(False) |
246 check_connect_flag = self.Controler.CommonMethod.CheckConnect(False) |
244 if check_connect_flag : |
247 if check_connect_flag: |
245 state_dic = ["INIT", "PREOP", "SAFEOP", "OP"] |
248 state_dic = ["INIT", "PREOP", "SAFEOP", "OP"] |
246 |
249 |
247 # If target state is one of {INIT, PREOP, SAFEOP}, request slave state transition immediately. |
250 # If target state is one of {INIT, PREOP, SAFEOP}, request slave state transition immediately. |
248 if event.GetId() < 3 : |
251 if event.GetId() < 3: |
249 self.Controler.CommonMethod.RequestSlaveState(state_dic[event.GetId()]) |
252 self.Controler.CommonMethod.RequestSlaveState(state_dic[event.GetId()]) |
250 self.TextCtrlDic["TargetState"].SetValue(state_dic[event.GetId()]) |
253 self.TextCtrlDic["TargetState"].SetValue(state_dic[event.GetId()]) |
251 |
254 |
252 # If target state is OP, first check "PLC status". |
255 # If target state is OP, first check "PLC status". |
253 # (1) If current PLC status is "Started", then request slave state transition |
256 # (1) If current PLC status is "Started", then request slave state transition |
254 # (2) Otherwise, show error message and return |
257 # (2) Otherwise, show error message and return |
255 else : |
258 else: |
256 status, count = self.Controler.GetCTRoot()._connector.GetPLCstatus() |
259 status, count = self.Controler.GetCTRoot()._connector.GetPLCstatus() |
257 if status == "Started" : |
260 if status == "Started": |
258 self.Controler.CommonMethod.RequestSlaveState("OP") |
261 self.Controler.CommonMethod.RequestSlaveState("OP") |
259 self.TextCtrlDic["TargetState"].SetValue("OP") |
262 self.TextCtrlDic["TargetState"].SetValue("OP") |
260 else : |
263 else: |
261 self.Controler.CommonMethod.CreateErrorDialog("PLC is Not Started") |
264 self.Controler.CommonMethod.CreateErrorDialog("PLC is Not Started") |
262 |
265 |
263 def GetCurrentState(self, event): |
266 def GetCurrentState(self, event): |
264 """ |
267 """ |
265 Timer event handler for periodic slave state monitoring (Default period: 1 sec = 1000 msec). |
268 Timer event handler for periodic slave state monitoring (Default period: 1 sec = 1000 msec). |
267 """ |
270 """ |
268 check_connect_flag = self.Controler.CommonMethod.CheckConnect(True) |
271 check_connect_flag = self.Controler.CommonMethod.CheckConnect(True) |
269 if check_connect_flag: |
272 if check_connect_flag: |
270 returnVal = self.Controler.CommonMethod.GetSlaveStateFromSlave() |
273 returnVal = self.Controler.CommonMethod.GetSlaveStateFromSlave() |
271 line = returnVal.split("\n") |
274 line = returnVal.split("\n") |
272 try : |
275 try: |
273 self.SetCurrentState(line[self.Controler.GetSlavePos()]) |
276 self.SetCurrentState(line[self.Controler.GetSlavePos()]) |
274 except Exception: |
277 except Exception: |
275 pass |
278 pass |
276 |
279 |
277 def SetCurrentState(self, line): |
280 def SetCurrentState(self, line): |
278 """ |
281 """ |
279 Show current slave state using the executiob result of "ethercat slaves" command. |
282 Show current slave state using the executiob result of "ethercat slaves" command. |
280 @param line : result of "ethercat slaves" command |
283 @param line : result of "ethercat slaves" command |
281 """ |
284 """ |
282 state_array = ["INIT", "PREOP", "SAFEOP", "OP"] |
285 state_array = ["INIT", "PREOP", "SAFEOP", "OP"] |
283 try : |
286 try: |
284 # parse the execution result of "ethercat slaves" command |
287 # parse the execution result of "ethercat slaves" command |
285 # Result example : 0 0:0 PREOP + EL9800 (V4.30) (PIC24, SPI, ET1100) |
288 # Result example : 0 0:0 PREOP + EL9800 (V4.30) (PIC24, SPI, ET1100) |
286 token = line.split(" ") |
289 token = line.split(" ") |
287 if token[2] in state_array: |
290 if token[2] in state_array: |
288 self.TextCtrlDic["CurrentState"].SetValue(token[2]) |
291 self.TextCtrlDic["CurrentState"].SetValue(token[2]) |
387 line_token = details_line.split("\"") |
390 line_token = details_line.split("\"") |
388 # len(line_token[2]) case : SDO 0x1000, "Device type" |
391 # len(line_token[2]) case : SDO 0x1000, "Device type" |
389 if len(line_token[2]) == 0: |
392 if len(line_token[2]) == 0: |
390 title_name = line_token[1] |
393 title_name = line_token[1] |
391 # else case : 0x1000:00,r-r-r-,uint32,32 bit,"Device type",0x00020192, 131474 |
394 # else case : 0x1000:00,r-r-r-,uint32,32 bit,"Device type",0x00020192, 131474 |
392 else : |
395 else: |
393 # line_token = ['0x1000:00,r-r-r-,uint32,32 bit,', 'Device type', ',0x00020192, 131474'] |
396 # line_token = ['0x1000:00,r-r-r-,uint32,32 bit,', 'Device type', ',0x00020192, 131474'] |
394 token_head, name, token_tail = line_token |
397 token_head, name, token_tail = line_token |
395 |
398 |
396 # token_head = ['0x1000:00', 'r-r-r-', 'uint32', '32 bit', ''] |
399 # token_head = ['0x1000:00', 'r-r-r-', 'uint32', '32 bit', ''] |
397 token_head = token_head.split(",") |
400 token_head = token_head.split(",") |
399 # ful_idx.split(":") = ['0x1000', '00'] |
402 # ful_idx.split(":") = ['0x1000', '00'] |
400 idx, sub_idx = ful_idx.split(":") |
403 idx, sub_idx = ful_idx.split(":") |
401 |
404 |
402 # token_tail = ['', '0x00020192', '131474'] |
405 # token_tail = ['', '0x00020192', '131474'] |
403 token_tail = token_tail.split(",") |
406 token_tail = token_tail.split(",") |
404 try : |
407 try: |
405 empty, hex_val, dec_val = token_tail |
408 empty, hex_val, dec_val = token_tail |
406 |
409 |
407 # SDO data is not return "dec value" |
410 # SDO data is not return "dec value" |
408 # line example : |
411 # line example : |
409 # 0x1702:01,rwr-r-,uint32,32 bit," 1st mapping", ---- |
412 # 0x1702:01,rwr-r-,uint32,32 bit," 1st mapping", ---- |
423 'type': type.strip(), 'size': size.strip(), 'name': name_after_check.strip("\""), |
426 'type': type.strip(), 'size': size.strip(), 'name': name_after_check.strip("\""), |
424 'value': hex_val.strip(), "category": title_name.strip("\"")} |
427 'value': hex_val.strip(), "category": title_name.strip("\"")} |
425 |
428 |
426 category_divide_value = [0x1000, 0x2000, 0x6000, 0xa000, 0xffff] |
429 category_divide_value = [0x1000, 0x2000, 0x6000, 0xa000, 0xffff] |
427 |
430 |
428 for count in range(len(category_divide_value)) : |
431 for count in range(len(category_divide_value)): |
429 if int(idx, 0) < category_divide_value[count]: |
432 if int(idx, 0) < category_divide_value[count]: |
430 self.Controler.CommonMethod.SaveSDOData[count].append(self.Data) |
433 self.Controler.CommonMethod.SaveSDOData[count].append(self.Data) |
431 break |
434 break |
432 |
435 |
433 self.Controler.CommonMethod.SaveSDOData[self.AllSDOData].append(self.Data) |
436 self.Controler.CommonMethod.SaveSDOData[self.AllSDOData].append(self.Data) |
538 style=wx.EXPAND | wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL) |
541 style=wx.EXPAND | wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL) |
539 |
542 |
540 self.Controler = parent.Controler |
543 self.Controler = parent.Controler |
541 self.parent = parent |
544 self.parent = parent |
542 self.SDOFlag = True |
545 self.SDOFlag = True |
543 if data is None : |
546 if data is None: |
544 self.SDOs = [] |
547 self.SDOs = [] |
545 else : |
548 else: |
546 self.SDOs = data |
549 self.SDOs = data |
547 |
550 |
548 self.CreateGrid(len(self.SDOs), 8) |
551 self.CreateGrid(len(self.SDOs), 8) |
549 SDOCellSize = [(0, 65), (1, 65), (2, 50), (3, 55), |
552 SDOCellSize = [(0, 65), (1, 65), (2, 50), (3, 55), |
550 (4, 40), (5, 200), (6, 250), (7, 85)] |
553 (4, 40), (5, 200), (6, 250), (7, 85)] |
581 sdo_list = ['idx', 'subIdx', 'access', 'type', 'size', 'category', 'name', 'value'] |
584 sdo_list = ['idx', 'subIdx', 'access', 'type', 'size', 'category', 'name', 'value'] |
582 for row_idx in range(len(self.SDOs)): |
585 for row_idx in range(len(self.SDOs)): |
583 for col_idx in range(len(self.SDOs[row_idx])): |
586 for col_idx in range(len(self.SDOs[row_idx])): |
584 self.SetCellValue(row_idx, col_idx, self.SDOs[row_idx][sdo_list[col_idx]]) |
587 self.SetCellValue(row_idx, col_idx, self.SDOs[row_idx][sdo_list[col_idx]]) |
585 self.SetReadOnly(row_idx, col_idx, True) |
588 self.SetReadOnly(row_idx, col_idx, True) |
586 if col_idx < 5 : |
589 if col_idx < 5: |
587 self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) |
590 self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) |
588 |
591 |
589 def CheckSDODataAccess(self, row): |
592 def CheckSDODataAccess(self, row): |
590 """ |
593 """ |
591 CheckSDODataAccess method is checking that access data has "w" |
594 CheckSDODataAccess method is checking that access data has "w" |
644 @param event : gridlib.EVT_GRID_CELL_LEFT_DCLICK object |
647 @param event : gridlib.EVT_GRID_CELL_LEFT_DCLICK object |
645 """ |
648 """ |
646 self.ClearStateFlag() |
649 self.ClearStateFlag() |
647 |
650 |
648 # CheckSDODataAccess is checking that OD(Object Dictionary) has "w" |
651 # CheckSDODataAccess is checking that OD(Object Dictionary) has "w" |
649 if event.GetCol() == 7 and self.CheckSDODataAccess(event.GetRow()) : |
652 if event.GetCol() == 7 and self.CheckSDODataAccess(event.GetRow()): |
650 dlg = wx.TextEntryDialog (self, "Enter hex or dec value (if enter dec value, it automatically conversed hex value)", |
653 dlg = wx.TextEntryDialog (self, "Enter hex or dec value (if enter dec value, it automatically conversed hex value)", |
651 "SDOModifyDialog", style=wx.OK | wx.CANCEL) |
654 "SDOModifyDialog", style=wx.OK | wx.CANCEL) |
652 |
655 |
653 start_value = self.GetCellValue(event.GetRow(), event.GetCol()) |
656 start_value = self.GetCellValue(event.GetRow(), event.GetCol()) |
654 dlg.SetValue(start_value) |
657 dlg.SetValue(start_value) |
655 |
658 |
656 if dlg.ShowModal() == wx.ID_OK: |
659 if dlg.ShowModal() == wx.ID_OK: |
657 try : |
660 try: |
658 int(dlg.GetValue(), 0) |
661 int(dlg.GetValue(), 0) |
659 # check "Access" field |
662 # check "Access" field |
660 if self.DecideSDODownload(self.Controler.CommonMethod.SlaveState[self.Controler.GetSlavePos()]) : |
663 if self.DecideSDODownload(self.Controler.CommonMethod.SlaveState[self.Controler.GetSlavePos()]): |
661 # Request "SDODownload" |
664 # Request "SDODownload" |
662 self.Controler.CommonMethod.SDODownload(self.SDOs[event.GetRow()]['type'], self.SDOs[event.GetRow()]['idx'], |
665 self.Controler.CommonMethod.SDODownload(self.SDOs[event.GetRow()]['type'], self.SDOs[event.GetRow()]['idx'], |
663 self.SDOs[event.GetRow()]['subIdx'], dlg.GetValue()) |
666 self.SDOs[event.GetRow()]['subIdx'], dlg.GetValue()) |
664 self.SetCellValue(event.GetRow(), event.GetCol(), hex(int(dlg.GetValue(), 0))) |
667 self.SetCellValue(event.GetRow(), event.GetCol(), hex(int(dlg.GetValue(), 0))) |
665 else : |
668 else: |
666 self.Controler.CommonMethod.CreateErrorDialog('You cannot SDO download this state') |
669 self.Controler.CommonMethod.CreateErrorDialog('You cannot SDO download this state') |
667 # Error occured process of "int(variable)" |
670 # Error occured process of "int(variable)" |
668 # User input is not hex, dec value |
671 # User input is not hex, dec value |
669 except ValueError: |
672 except ValueError: |
670 self.Controler.CommonMethod.CreateErrorDialog('You can input only hex, dec value') |
673 self.Controler.CommonMethod.CreateErrorDialog('You can input only hex, dec value') |
756 count = 0 |
759 count = 0 |
757 page_texts = [] |
760 page_texts = [] |
758 |
761 |
759 self.Controler.CommonMethod.RequestPDOInfo() |
762 self.Controler.CommonMethod.RequestPDOInfo() |
760 |
763 |
761 if name == "Tx" : |
764 if name == "Tx": |
762 # obtain pdo_info and pdo_entry |
765 # obtain pdo_info and pdo_entry |
763 # pdo_info include (PDO index, name, number of entry) |
766 # pdo_info include (PDO index, name, number of entry) |
764 pdo_info = self.Controler.CommonMethod.GetTxPDOCategory() |
767 pdo_info = self.Controler.CommonMethod.GetTxPDOCategory() |
765 pdo_entry = self.Controler.CommonMethod.GetTxPDOInfo() |
768 pdo_entry = self.Controler.CommonMethod.GetTxPDOInfo() |
766 for tmp in pdo_info : |
769 for tmp in pdo_info: |
767 title = str(hex(tmp['pdo_index'])) |
770 title = str(hex(tmp['pdo_index'])) |
768 page_texts.append(title) |
771 page_texts.append(title) |
769 # RX PDO case |
772 # RX PDO case |
770 else : |
773 else: |
771 pdo_info = self.Controler.CommonMethod.GetRxPDOCategory() |
774 pdo_info = self.Controler.CommonMethod.GetRxPDOCategory() |
772 pdo_entry = self.Controler.CommonMethod.GetRxPDOInfo() |
775 pdo_entry = self.Controler.CommonMethod.GetRxPDOInfo() |
773 for tmp in pdo_info : |
776 for tmp in pdo_info: |
774 title = str(hex(tmp['pdo_index'])) |
777 title = str(hex(tmp['pdo_index'])) |
775 page_texts.append(title) |
778 page_texts.append(title) |
776 |
779 |
777 # Add page depending on the number of pdo_info |
780 # Add page depending on the number of pdo_info |
778 for txt in page_texts: |
781 for txt in page_texts: |
844 """ |
847 """ |
845 Cell is filled by new parsing data in XML |
848 Cell is filled by new parsing data in XML |
846 """ |
849 """ |
847 list_index = 0 |
850 list_index = 0 |
848 # number of entry |
851 # number of entry |
849 for i in range(self.Count + 1) : |
852 for i in range(self.Count + 1): |
850 list_index += self.PDOInfo[i]['number_of_entry'] |
853 list_index += self.PDOInfo[i]['number_of_entry'] |
851 |
854 |
852 start_value = list_index - self.PDOInfo[self.Count]['number_of_entry'] |
855 start_value = list_index - self.PDOInfo[self.Count]['number_of_entry'] |
853 |
856 |
854 pdo_list = ['entry_index', 'subindex', 'bitlen', 'type', 'name'] |
857 pdo_list = ['entry_index', 'subindex', 'bitlen', 'type', 'name'] |
855 for row_idx in range(self.PDOInfo[self.Count]['number_of_entry']): |
858 for row_idx in range(self.PDOInfo[self.Count]['number_of_entry']): |
856 for col_idx in range(len(self.PDOEntry[row_idx])): |
859 for col_idx in range(len(self.PDOEntry[row_idx])): |
857 # entry index is converted hex value. |
860 # entry index is converted hex value. |
858 if col_idx == 0 : |
861 if col_idx == 0: |
859 self.SetCellValue(row_idx, col_idx, hex(self.PDOEntry[start_value][pdo_list[col_idx]])) |
862 self.SetCellValue(row_idx, col_idx, hex(self.PDOEntry[start_value][pdo_list[col_idx]])) |
860 else : |
863 else: |
861 self.SetCellValue(row_idx, col_idx, str(self.PDOEntry[start_value][pdo_list[col_idx]])) |
864 self.SetCellValue(row_idx, col_idx, str(self.PDOEntry[start_value][pdo_list[col_idx]])) |
862 if col_idx != 4 : |
865 if col_idx != 4: |
863 self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) |
866 self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) |
864 else : |
867 else: |
865 self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_LEFT, wx.ALIGN_CENTRE) |
868 self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_LEFT, wx.ALIGN_CENTRE) |
866 self.SetReadOnly(row_idx, col_idx, True) |
869 self.SetReadOnly(row_idx, col_idx, True) |
867 self.SetRowSize(row_idx, 25) |
870 self.SetRowSize(row_idx, 25) |
868 start_value += 1 |
871 start_value += 1 |
869 |
872 |
904 wx.Panel.__init__(self, parent, -1) |
907 wx.Panel.__init__(self, parent, -1) |
905 self.parent = parent |
908 self.parent = parent |
906 self.Controler = controler |
909 self.Controler = controler |
907 |
910 |
908 self.PDIType = { |
911 self.PDIType = { |
909 0 : ['none', '00000000'], |
912 0: ['none', '00000000'], |
910 4 : ['Digital I/O', '00000100'], |
913 4: ['Digital I/O', '00000100'], |
911 5 : ['SPI Slave', '00000101'], |
914 5: ['SPI Slave', '00000101'], |
912 7 : ['EtherCAT Bridge (port3)', '00000111'], |
915 7: ['EtherCAT Bridge (port3)', '00000111'], |
913 8 : ['uC async. 16bit', '00001000'], |
916 8: ['uC async. 16bit', '00001000'], |
914 9 : ['uC async. 8bit', '00001001'], |
917 9: ['uC async. 8bit', '00001001'], |
915 10 : ['uC sync. 16bit', '00001010'], |
918 10: ['uC sync. 16bit', '00001010'], |
916 11 : ['uC sync. 8bit', '00001011'], |
919 11: ['uC sync. 8bit', '00001011'], |
917 16 : ['32 Digtal Input and 0 Digital Output', '00010000'], |
920 16: ['32 Digtal Input and 0 Digital Output', '00010000'], |
918 17 : ['24 Digtal Input and 8 Digital Output', '00010001'], |
921 17: ['24 Digtal Input and 8 Digital Output', '00010001'], |
919 18 : ['16 Digtal Input and 16 Digital Output', '00010010'], |
922 18: ['16 Digtal Input and 16 Digital Output', '00010010'], |
920 19 : ['8 Digtal Input and 24 Digital Output', '00010011'], |
923 19: ['8 Digtal Input and 24 Digital Output', '00010011'], |
921 20 : ['0 Digtal Input and 32 Digital Output', '00010100'], |
924 20: ['0 Digtal Input and 32 Digital Output', '00010100'], |
922 128: ['On-chip bus', '11111111'] |
925 128: ['On-chip bus', '11111111'] |
923 } |
926 } |
924 |
927 |
925 sizer = wx.FlexGridSizer(cols=1, hgap=5, rows=2, vgap=5) |
928 sizer = wx.FlexGridSizer(cols=1, hgap=5, rows=2, vgap=5) |
926 button_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=5) |
929 button_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=5) |
1049 """ |
1052 """ |
1050 Set data based on slave EEPROM. |
1053 Set data based on slave EEPROM. |
1051 """ |
1054 """ |
1052 # sii_dict = { Parameter : (WordAddress, WordSize) } |
1055 # sii_dict = { Parameter : (WordAddress, WordSize) } |
1053 sii_dict = { |
1056 sii_dict = { |
1054 'PDIControl' : ('0', 1), |
1057 'PDIControl': ('0', 1), |
1055 'PDIConfiguration' : ('1', 1), |
1058 'PDIConfiguration': ('1', 1), |
1056 'PulseLengthOfSYNCSignals' : ('2', 1), |
1059 'PulseLengthOfSYNCSignals': ('2', 1), |
1057 'ExtendedPDIConfiguration' : ('3', 1), |
1060 'ExtendedPDIConfiguration': ('3', 1), |
1058 'ConfiguredStationAlias' : ('4', 1), |
1061 'ConfiguredStationAlias': ('4', 1), |
1059 'Checksum' : ('7', 1), |
1062 'Checksum': ('7', 1), |
1060 'VendorID' : ('8', 2), |
1063 'VendorID': ('8', 2), |
1061 'ProductCode' : ('a', 2), |
1064 'ProductCode': ('a', 2), |
1062 'RevisionNumber' : ('c', 2), |
1065 'RevisionNumber': ('c', 2), |
1063 'SerialNumber' : ('e', 2), |
1066 'SerialNumber': ('e', 2), |
1064 'Execution Delay' : ('10', 1), |
1067 'Execution Delay': ('10', 1), |
1065 'Port0Delay' : ('11', 1), |
1068 'Port0Delay': ('11', 1), |
1066 'Port1Delay' : ('12', 1), |
1069 'Port1Delay': ('12', 1), |
1067 'BootstrapReceiveMailboxOffset' : ('14', 1), |
1070 'BootstrapReceiveMailboxOffset': ('14', 1), |
1068 'BootstrapReceiveMailboxSize' : ('15', 1), |
1071 'BootstrapReceiveMailboxSize': ('15', 1), |
1069 'BootstrapSendMailboxOffset' : ('16', 1), |
1072 'BootstrapSendMailboxOffset': ('16', 1), |
1070 'BootstrapSendMailboxSize' : ('17', 1), |
1073 'BootstrapSendMailboxSize': ('17', 1), |
1071 'StandardReceiveMailboxOffset' : ('18', 1), |
1074 'StandardReceiveMailboxOffset': ('18', 1), |
1072 'StandardReceiveMailboxSize' : ('19', 1), |
1075 'StandardReceiveMailboxSize': ('19', 1), |
1073 'StandardSendMailboxOffset' : ('1a', 1), |
1076 'StandardSendMailboxOffset': ('1a', 1), |
1074 'StandardSendMailboxSize' : ('1b', 1), |
1077 'StandardSendMailboxSize': ('1b', 1), |
1075 'MailboxProtocol' : ('1c', 1), |
1078 'MailboxProtocol': ('1c', 1), |
1076 'Size' : ('3e', 1), |
1079 'Size': ('3e', 1), |
1077 'Version' : ('3f', 1), |
1080 'Version': ('3f', 1), |
1078 'First Category Type/Vendor Specific' : ('40', 1), |
1081 'First Category Type/Vendor Specific': ('40', 1), |
1079 'Following Category Word Size' : ('41', 1), |
1082 'Following Category Word Size': ('41', 1), |
1080 'Category Data' : ('42', 1), |
1083 'Category Data': ('42', 1), |
1081 } |
1084 } |
1082 |
1085 |
1083 # Config Data: EEPROM Size, PDI Type, Device Emulation |
1086 # Config Data: EEPROM Size, PDI Type, Device Emulation |
1084 # EEPROM's data in address '0x003f' is Size of EEPROM in KBit-1 |
1087 # EEPROM's data in address '0x003f' is Size of EEPROM in KBit-1 |
1085 eeprom_size = str((int(self.GetWordAddressData(sii_dict.get('Size'), 10))+1)/8*1024) |
1088 eeprom_size = str((int(self.GetWordAddressData(sii_dict.get('Size'), 10))+1)/8*1024) |
1256 self.Controler = controler |
1259 self.Controler = controler |
1257 |
1260 |
1258 self.HexRow = 8 |
1261 self.HexRow = 8 |
1259 self.HexCol = 17 |
1262 self.HexCol = 17 |
1260 |
1263 |
1261 self.HexViewSizer = {"view" : wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10), |
1264 self.HexViewSizer = {"view": wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10), |
1262 "siiButton" : wx.BoxSizer()} |
1265 "siiButton": wx.BoxSizer()} |
1263 self.HexViewButton = {} |
1266 self.HexViewButton = {} |
1264 |
1267 |
1265 for key, evt_handler in [("Sii Upload", self.OnButtonSiiUpload), |
1268 for key, evt_handler in [("Sii Upload", self.OnButtonSiiUpload), |
1266 ("Sii Download", self.OnButtonSiiDownload), |
1269 ("Sii Download", self.OnButtonSiiDownload), |
1267 ("Write to File", self.OnButtonWriteToBinFile), |
1270 ("Write to File", self.OnButtonWriteToBinFile), |
2119 self.StaticBox = {} |
2122 self.StaticBox = {} |
2120 self.StaticText = {} |
2123 self.StaticText = {} |
2121 self.TextCtrl = {} |
2124 self.TextCtrl = {} |
2122 |
2125 |
2123 # ----------------------- Main Sizer and Update Button -------------------------------------------- |
2126 # ----------------------- Main Sizer and Update Button -------------------------------------------- |
2124 self.MasterStateSizer = {"main" : wx.BoxSizer(wx.VERTICAL)} |
2127 self.MasterStateSizer = {"main": wx.BoxSizer(wx.VERTICAL)} |
2125 for key, attr in [ |
2128 for key, attr in [ |
2126 ("innerMain", [1, 10, 2, 10]), |
2129 ("innerMain", [1, 10, 2, 10]), |
2127 ("innerTopHalf", [2, 10, 1, 10]), |
2130 ("innerTopHalf", [2, 10, 1, 10]), |
2128 ("innerBottomHalf", [2, 10, 1, 10]), |
2131 ("innerBottomHalf", [2, 10, 1, 10]), |
2129 ("innerMasterState", [2, 10, 3, 10]), |
2132 ("innerMasterState", [2, 10, 3, 10]), |