244 @param iec_path: Path in PLC of variable to release |
244 @param iec_path: Path in PLC of variable to release |
245 """ |
245 """ |
246 if self.DataProducer is not None: |
246 if self.DataProducer is not None: |
247 self.DataProducer.ReleaseDebugIECVariable(iec_path) |
247 self.DataProducer.ReleaseDebugIECVariable(iec_path) |
248 |
248 |
249 def NewDataAvailable(self, ticks, *args, **kwargs): |
249 def NewDataAvailable(self, ticks): |
250 """ |
250 """ |
251 Called by DataProducer for each tick captured |
251 Called by DataProducer for each tick captured |
252 @param tick: PLC tick captured |
252 @param tick: PLC tick captured |
253 All other parameters are passed to refresh function |
253 All other parameters are passed to refresh function |
254 """ |
254 """ |
265 |
265 |
266 # Try to get acquire common refresh lock if minimum period between |
266 # Try to get acquire common refresh lock if minimum period between |
267 # two refresh has expired |
267 # two refresh has expired |
268 if gettime() - self.LastRefreshTime > REFRESH_PERIOD and \ |
268 if gettime() - self.LastRefreshTime > REFRESH_PERIOD and \ |
269 DEBUG_REFRESH_LOCK.acquire(False): |
269 DEBUG_REFRESH_LOCK.acquire(False): |
270 self.StartRefreshing(*args, **kwargs) |
270 self.StartRefreshing() |
271 |
271 |
272 # If common lock wasn't acquired for any reason, restart last |
272 # If common lock wasn't acquired for any reason, restart last |
273 # refresh timer |
273 # refresh timer |
274 else: |
274 else: |
275 self.StartLastRefreshTimer(*args, **kwargs) |
275 self.StartLastRefreshTimer() |
276 |
276 |
277 # In the case that DebugViewer isn't visible on screen and has already |
277 # In the case that DebugViewer isn't visible on screen and has already |
278 # acquired common refresh lock, reset DebugViewer |
278 # acquired common refresh lock, reset DebugViewer |
279 elif not self.IsShown() and self.HasAcquiredLock: |
279 elif not self.IsShown() and self.HasAcquiredLock: |
280 DebugViewer.RefreshNewData(self) |
280 DebugViewer.RefreshNewData(self) |
281 |
281 |
282 def ShouldRefresh(self, *args, **kwargs): |
282 def ShouldRefresh(self): |
283 """ |
283 """ |
284 Callback function called when last refresh timer expired |
284 Callback function called when last refresh timer expired |
285 All parameters are passed to refresh function |
285 All parameters are passed to refresh function |
286 """ |
286 """ |
287 # Cancel if DebugViewer is not visible on screen |
287 # Cancel if DebugViewer is not visible on screen |
288 if self and self.IsShown(): |
288 if self and self.IsShown(): |
289 |
289 |
290 # Try to acquire common refresh lock |
290 # Try to acquire common refresh lock |
291 if DEBUG_REFRESH_LOCK.acquire(False): |
291 if DEBUG_REFRESH_LOCK.acquire(False): |
292 self.StartRefreshing(*args, **kwargs) |
292 self.StartRefreshing() |
293 |
293 |
294 # Restart last refresh timer if common refresh lock acquired failed |
294 # Restart last refresh timer if common refresh lock acquired failed |
295 else: |
295 else: |
296 self.StartLastRefreshTimer(*args, **kwargs) |
296 self.StartLastRefreshTimer() |
297 |
297 |
298 def StartRefreshing(self, *args, **kwargs): |
298 def StartRefreshing(self): |
299 """ |
299 """ |
300 Called to initiate a refresh of DebugViewer |
300 Called to initiate a refresh of DebugViewer |
301 All parameters are passed to refresh function |
301 All parameters are passed to refresh function |
302 """ |
302 """ |
303 # Update last refresh time stamp and flag for common refresh |
303 # Update last refresh time stamp and flag for common refresh |
309 |
309 |
310 # Inhibit data consumer value update |
310 # Inhibit data consumer value update |
311 self.Inhibit(True) |
311 self.Inhibit(True) |
312 |
312 |
313 # Initiate DebugViewer refresh |
313 # Initiate DebugViewer refresh |
314 wx.CallAfter(self.RefreshNewData, *args, **kwargs) |
314 wx.CallAfter(self.RefreshNewData) |
315 |
315 |
316 def StartLastRefreshTimer(self, *args, **kwargs): |
316 def StartLastRefreshTimer(self): |
317 """ |
317 """ |
318 Called to start last refresh timer for the minimum time between 2 |
318 Called to start last refresh timer for the minimum time between 2 |
319 refresh |
319 refresh |
320 All parameters are passed to refresh function |
320 All parameters are passed to refresh function |
321 """ |
321 """ |
322 self.TimerAccessLock.acquire() |
322 self.TimerAccessLock.acquire() |
323 self.LastRefreshTimer = Timer( |
323 self.LastRefreshTimer = Timer( |
324 REFRESH_PERIOD, self.ShouldRefresh, args, kwargs) |
324 REFRESH_PERIOD, self.ShouldRefresh) |
325 self.LastRefreshTimer.start() |
325 self.LastRefreshTimer.start() |
326 self.TimerAccessLock.release() |
326 self.TimerAccessLock.release() |
327 |
327 |
328 def RefreshNewData(self, *args, **kwargs): |
328 def RefreshNewData(self): |
329 """ |
329 """ |
330 Called to refresh DebugViewer according to values received by data |
330 Called to refresh DebugViewer according to values received by data |
331 consumers |
331 consumers |
332 May be overridden by inherited classes |
332 May be overridden by inherited classes |
333 Can receive any parameters depending on what is needed by inherited |
333 Can receive any parameters depending on what is needed by inherited |