5 import time |
5 import time |
6 import features |
6 import features |
7 import shutil |
7 import shutil |
8 import wx |
8 import wx |
9 import re, tempfile |
9 import re, tempfile |
|
10 from math import ceil |
10 from types import ListType |
11 from types import ListType |
11 from threading import Timer, Lock, Thread |
12 from threading import Timer, Lock, Thread |
12 from time import localtime |
13 from time import localtime |
13 from datetime import datetime |
14 from datetime import datetime |
14 from weakref import WeakKeyDictionary |
15 from weakref import WeakKeyDictionary |
1405 |
1406 |
1406 def DispatchDebugValuesProc(self, event): |
1407 def DispatchDebugValuesProc(self, event): |
1407 self.IECdebug_lock.acquire() |
1408 self.IECdebug_lock.acquire() |
1408 debug_ticks, buffers = self.SnapshotAndResetDebugValuesBuffers() |
1409 debug_ticks, buffers = self.SnapshotAndResetDebugValuesBuffers() |
1409 self.IECdebug_lock.release() |
1410 self.IECdebug_lock.release() |
|
1411 start_time = time.time() |
1410 if len(self.TracedIECPath) == len(buffers): |
1412 if len(self.TracedIECPath) == len(buffers): |
1411 for IECPath, values in zip(self.TracedIECPath, buffers): |
1413 for IECPath, values in zip(self.TracedIECPath, buffers): |
1412 if len(values) > 0: |
1414 if len(values) > 0: |
1413 self.CallWeakcallables(IECPath, "NewValues", debug_ticks, values) |
1415 self.CallWeakcallables(IECPath, "NewValues", debug_ticks, values) |
1414 if len(debug_ticks) > 0: |
1416 if len(debug_ticks) > 0: |
1415 self.CallWeakcallables("__tick__", "NewDataAvailable", debug_ticks) |
1417 self.CallWeakcallables("__tick__", "NewDataAvailable", debug_ticks) |
|
1418 |
|
1419 delay = time.time() - start_time |
|
1420 next_refresh = max(REFRESH_PERIOD - delay, 0.2 * delay) |
|
1421 if self.DispatchDebugValuesTimer is not None and self.DebugThread is not None: |
|
1422 self.DispatchDebugValuesTimer.Start( |
|
1423 int(next_refresh * 1000), oneShot=True) |
1416 event.Skip() |
1424 event.Skip() |
1417 |
1425 |
1418 def KillDebugThread(self): |
1426 def KillDebugThread(self): |
1419 tmp_debugthread = self.DebugThread |
1427 tmp_debugthread = self.DebugThread |
1420 self.debug_break = True |
1428 self.debug_break = True |
1433 self.previous_plcstate = None |
1441 self.previous_plcstate = None |
1434 if self.AppFrame: |
1442 if self.AppFrame: |
1435 self.AppFrame.ResetGraphicViewers() |
1443 self.AppFrame.ResetGraphicViewers() |
1436 self.RegisterDebugVarToConnector() |
1444 self.RegisterDebugVarToConnector() |
1437 if self.DispatchDebugValuesTimer is not None: |
1445 if self.DispatchDebugValuesTimer is not None: |
1438 self.DispatchDebugValuesTimer.Start(int(REFRESH_PERIOD * 1000)) |
1446 self.DispatchDebugValuesTimer.Start( |
|
1447 int(REFRESH_PERIOD * 1000), oneShot=True) |
1439 if self.DebugThread is None: |
1448 if self.DebugThread is None: |
1440 self.DebugThread = Thread(target=self.DebugThreadProc) |
1449 self.DebugThread = Thread(target=self.DebugThreadProc) |
1441 self.DebugThread.start() |
1450 self.DebugThread.start() |
1442 |
1451 |
1443 def _Run(self): |
1452 def _Run(self): |