38 import tempfile |
38 import tempfile |
39 from threading import Timer |
39 from threading import Timer |
40 from datetime import datetime |
40 from datetime import datetime |
41 from weakref import WeakKeyDictionary |
41 from weakref import WeakKeyDictionary |
42 from functools import reduce |
42 from functools import reduce |
|
43 from itertools import izip |
43 from distutils.dir_util import copy_tree |
44 from distutils.dir_util import copy_tree |
44 from six.moves import xrange |
45 from six.moves import xrange |
45 |
46 |
46 import wx |
47 import wx |
47 |
48 |
1510 if debug_status == PlcStatus.Started: |
1511 if debug_status == PlcStatus.Started: |
1511 if len(Traces) > 0: |
1512 if len(Traces) > 0: |
1512 for debug_tick, debug_buff in Traces: |
1513 for debug_tick, debug_buff in Traces: |
1513 debug_vars = UnpackDebugBuffer( |
1514 debug_vars = UnpackDebugBuffer( |
1514 debug_buff, self.TracedIECTypes) |
1515 debug_buff, self.TracedIECTypes) |
1515 if debug_vars is not None and len(debug_vars) == len(self.TracedIECPath): |
1516 if debug_vars is not None: |
1516 for IECPath, values_buffer, value in zip( |
1517 for IECPath, values_buffer, value in izip( |
1517 self.TracedIECPath, |
1518 self.TracedIECPath, |
1518 self.DebugValuesBuffers, |
1519 self.DebugValuesBuffers, |
1519 debug_vars): |
1520 debug_vars): |
1520 IECdebug_data = self.IECdebug_datas.get( |
1521 IECdebug_data = self.IECdebug_datas.get( |
1521 IECPath, None) |
1522 IECPath, None) |
1604 if IECdebug_data is None: |
1605 if IECdebug_data is None: |
1605 IECdebug_data = [ |
1606 IECdebug_data = [ |
1606 WeakKeyDictionary(), # Callables |
1607 WeakKeyDictionary(), # Callables |
1607 [], # Data storage [(tick, data),...] |
1608 [], # Data storage [(tick, data),...] |
1608 "Registered", # Variable status |
1609 "Registered", # Variable status |
1609 None, |
1610 None, # Forced value |
1610 buffer_list] # Forced value |
1611 buffer_list] |
1611 self.IECdebug_datas[IECPath] = IECdebug_data |
1612 self.IECdebug_datas[IECPath] = IECdebug_data |
1612 else: |
1613 else: |
1613 IECdebug_data[4] |= buffer_list |
1614 IECdebug_data[4] |= buffer_list |
1614 |
1615 |
1615 IECdebug_data[0][callableobj] = buffer_list |
1616 IECdebug_data[0][callableobj] = buffer_list |
1679 if self._connector is None: |
1680 if self._connector is None: |
1680 return -1, "No runtime connected!" |
1681 return -1, "No runtime connected!" |
1681 return self._connector.RemoteExec(script, **kwargs) |
1682 return self._connector.RemoteExec(script, **kwargs) |
1682 |
1683 |
1683 def DispatchDebugValuesProc(self, event): |
1684 def DispatchDebugValuesProc(self, event): |
|
1685 event.Skip() |
|
1686 start_time = time.time() |
1684 self.debug_status, debug_ticks, buffers = self.SnapshotAndResetDebugValuesBuffers() |
1687 self.debug_status, debug_ticks, buffers = self.SnapshotAndResetDebugValuesBuffers() |
1685 start_time = time.time() |
|
1686 if len(self.TracedIECPath) == len(buffers): |
|
1687 for IECPath, values in zip(self.TracedIECPath, buffers): |
|
1688 if len(values) > 0: |
|
1689 self.CallWeakcallables( |
|
1690 IECPath, "NewValues", debug_ticks, values) |
|
1691 if len(debug_ticks) > 0: |
|
1692 self.CallWeakcallables( |
|
1693 "__tick__", "NewDataAvailable", debug_ticks) |
|
1694 |
1688 |
1695 if self.debug_status == PlcStatus.Broken: |
1689 if self.debug_status == PlcStatus.Broken: |
1696 self.logger.write_warning( |
1690 self.logger.write_warning( |
1697 _("Debug: token rejected - other debug took over - reconnect to recover\n")) |
1691 _("Debug: token rejected - other debug took over - reconnect to recover\n")) |
1698 else: |
1692 return |
1699 delay = time.time() - start_time |
1693 |
1700 next_refresh = max(REFRESH_PERIOD - delay, 0.2 * delay) |
1694 for IECPath, values in zip(self.TracedIECPath, buffers): |
1701 if self.DispatchDebugValuesTimer is not None: |
1695 if len(values) > 0: |
1702 self.DispatchDebugValuesTimer.Start( |
1696 self.CallWeakcallables( |
1703 int(next_refresh * 1000), oneShot=True) |
1697 IECPath, "NewValues", debug_ticks, values) |
1704 event.Skip() |
1698 if len(debug_ticks) > 0: |
|
1699 self.CallWeakcallables( |
|
1700 "__tick__", "NewDataAvailable", debug_ticks) |
|
1701 |
|
1702 delay = time.time() - start_time |
|
1703 next_refresh = max(REFRESH_PERIOD - delay, 0.2 * delay) |
|
1704 if self.DispatchDebugValuesTimer is not None: |
|
1705 res = self.DispatchDebugValuesTimer.Start( |
|
1706 int(next_refresh * 1000), oneShot=True) |
1705 |
1707 |
1706 def KillDebugThread(self): |
1708 def KillDebugThread(self): |
1707 if self.DispatchDebugValuesTimer is not None: |
1709 if self.DispatchDebugValuesTimer is not None: |
1708 self.DispatchDebugValuesTimer.Stop() |
1710 self.DispatchDebugValuesTimer.Stop() |
1709 |
1711 |