graphics/GraphicCommons.py
changeset 875 a8952b79caec
parent 857 9695969796d0
child 877 7e695249be8d
equal deleted inserted replaced
874:8b24e9312f18 875:a8952b79caec
    25 import wx
    25 import wx
    26 from time import time as gettime
    26 from time import time as gettime
    27 from math import *
    27 from math import *
    28 from types import *
    28 from types import *
    29 import datetime
    29 import datetime
    30 from threading import Semaphore
    30 from threading import Lock,Timer
    31 
    31 
    32 #-------------------------------------------------------------------------------
    32 #-------------------------------------------------------------------------------
    33 #                               Common constants
    33 #                               Common constants
    34 #-------------------------------------------------------------------------------
    34 #-------------------------------------------------------------------------------
    35 
    35 
   291 #-------------------------------------------------------------------------------
   291 #-------------------------------------------------------------------------------
   292 #                               Debug Viewer Class
   292 #                               Debug Viewer Class
   293 #-------------------------------------------------------------------------------
   293 #-------------------------------------------------------------------------------
   294 
   294 
   295 REFRESH_PERIOD = 0.1
   295 REFRESH_PERIOD = 0.1
       
   296 DEBUG_REFRESH_LOCK = Lock()
   296 
   297 
   297 class DebugViewer:
   298 class DebugViewer:
   298     
   299     
   299     def __init__(self, producer, debug, register_tick=True):
   300     def __init__(self, producer, debug, register_tick=True):
   300         self.DataProducer = None
   301         self.DataProducer = None
   303         self.Inhibited = False
   304         self.Inhibited = False
   304         
   305         
   305         self.DataConsumers = {}
   306         self.DataConsumers = {}
   306         
   307         
   307         self.LastRefreshTime = gettime()
   308         self.LastRefreshTime = gettime()
   308         self.RefreshLock = Semaphore()
   309         self.HasAcquiredLock = False
       
   310         self.AccessLock = Lock()
   309         
   311         
   310         self.RefreshTimer = wx.Timer(self, -1)
   312         self.LastRefreshTimer = None
   311         self.Bind(wx.EVT_TIMER, self.OnRefreshTimer, self.RefreshTimer)
       
   312         
   313         
   313         self.SetDataProducer(producer)
   314         self.SetDataProducer(producer)
   314         
   315         
   315     def __del__(self):
   316     def __del__(self):
   316         self.DataProducer = None
   317         self.DataProducer = None
   364         if self.DataProducer is not None:
   365         if self.DataProducer is not None:
   365             for consumer, iec_path in self.DataConsumers.iteritems():
   366             for consumer, iec_path in self.DataConsumers.iteritems():
   366                 self.DataProducer.UnsubscribeDebugIECVariable(iec_path, consumer)
   367                 self.DataProducer.UnsubscribeDebugIECVariable(iec_path, consumer)
   367         self.DataConsumers = {}
   368         self.DataConsumers = {}
   368     
   369     
   369     def OnRefreshTimer(self, event):
   370     def ShouldRefresh(self):
   370         self.RefreshNewData()
   371         if DEBUG_REFRESH_LOCK.acquire(False):
   371         event.Skip()
   372             self.AccessLock.acquire()
       
   373             self.HasAcquiredLock = True
       
   374             self.AccessLock.release()
       
   375             self.RefreshNewData()
       
   376         else:
       
   377             self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh)
       
   378             self.LastRefreshTimer.start()
   372     
   379     
   373     def NewDataAvailable(self, *args, **kwargs):
   380     def NewDataAvailable(self, *args, **kwargs):
   374         self.RefreshTimer.Stop()
   381         if self.LastRefreshTimer is not None:
       
   382             self.LastRefreshTimer.cancel()
       
   383             self.LastRefreshTimer=None
   375         if not self.Inhibited:
   384         if not self.Inhibited:
   376             current_time = gettime()
   385             current_time = gettime()
   377             if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False):
   386             if current_time - self.LastRefreshTime > REFRESH_PERIOD and DEBUG_REFRESH_LOCK.acquire(False):
       
   387                 self.AccessLock.acquire()
       
   388                 self.HasAcquiredLock = True
       
   389                 self.AccessLock.release()
   378                 self.LastRefreshTime = gettime()
   390                 self.LastRefreshTime = gettime()
   379                 self.Inhibit(True)
   391                 self.Inhibit(True)
   380                 wx.CallAfter(self.RefreshViewOnNewData, *args, **kwargs)
   392                 wx.CallAfter(self.RefreshViewOnNewData, *args, **kwargs)
   381             
   393             
   382     def RefreshViewOnNewData(self, *args, **kwargs):
   394     def RefreshViewOnNewData(self, *args, **kwargs):
   383         if self:
   395         if self:
   384             self.RefreshNewData(*args, **kwargs)
   396             self.RefreshNewData(*args, **kwargs)
   385             self.RefreshTimer.Start(int(REFRESH_PERIOD * 1000), oneShot=True)
   397             self.LastRefreshTimer = Timer(REFRESH_PERIOD, self.ShouldRefresh)
       
   398             self.LastRefreshTimer.start()
   386     
   399     
   387     def RefreshNewData(self, *args, **kwargs):
   400     def RefreshNewData(self, *args, **kwargs):
   388         self.Inhibit(False)
   401         self.Inhibit(False)
   389         self.RefreshLock.release()
   402         self.AccessLock.acquire()
   390         
   403         if self.HasAcquiredLock:
       
   404             DEBUG_REFRESH_LOCK.release()
       
   405             self.HasAcquiredLock = False
       
   406         self.AccessLock.release()
       
   407 
   391 #-------------------------------------------------------------------------------
   408 #-------------------------------------------------------------------------------
   392 #                               Viewer Rubberband
   409 #                               Viewer Rubberband
   393 #-------------------------------------------------------------------------------
   410 #-------------------------------------------------------------------------------
   394 
   411 
   395 """
   412 """