Files
ailai_show/Util/util_time.py

143 lines
4.1 KiB
Python
Raw Normal View History

2025-07-29 13:16:30 +08:00
import time
class MyTimer:
@staticmethod
def gMyGetTickCount():
ts = time.time()
return int(ts * 1000) # Convert to milliseconds
# CTon class equivalent in Python
class CTon:
def __init__(self):
self.m_unET = 0
self.m_bLastI = False
self.m_bIn = False
self.m_bPause = False
self.m_bOver = True
self.m_unPT = 0
self.m_unStartTime = 0
self.m_unPauseET = 0
def GetET(self):
if self.m_bIn:
nET = self.m_unPT + (self.m_unStartTime - MyTimer.gMyGetTickCount())
return max(nET, 0)
else:
return 0
def SetReset(self):
self.m_bIn = False
self.m_bLastI = False
self.m_bPause = False
def SetPause(self, value):
if self.m_bIn:
self.m_bPause = value
if self.m_bPause:
self.m_unPauseET = MyTimer.gMyGetTickCount() - self.m_unStartTime
def SetOver(self, value):
self.m_bOver = value
def GetStartTime(self):
return self.m_unStartTime
def Q(self, value_i, value_pt):
self.m_bIn = value_i
self.m_unPT = value_pt
un_tick = MyTimer.gMyGetTickCount()
if self.m_bOver and self.m_bIn:
self.m_unStartTime = un_tick - self.m_unPT
self.m_bOver = False
if self.m_bPause and self.m_bIn:
self.m_unStartTime = un_tick - self.m_unPauseET
if self.m_bIn != self.m_bLastI:
self.m_bLastI = self.m_bIn
if self.m_bIn:
self.m_unStartTime = un_tick
self.m_bPause = False
return self.m_bIn and (un_tick >= (self.m_unStartTime + self.m_unPT))
# CClockPulse class equivalent in Python
class CClockPulse:
def __init__(self):
self.m_bFirstOut = True
self.m_bTonAOut = False
self.m_bTonBOut = False
self.m_cTonA = CTon()
self.m_cTonB = CTon()
def Q(self, value_i, run_time, stop_time):
if self.m_bFirstOut:
self.m_bTonAOut = self.m_cTonA.Q(not self.m_bTonBOut and value_i, run_time)
self.m_bTonBOut = self.m_cTonB.Q(self.m_bTonAOut and value_i, stop_time)
return not self.m_bTonAOut and value_i
else:
self.m_bTonAOut = self.m_cTonA.Q(not self.m_bTonBOut and value_i, stop_time)
self.m_bTonBOut = self.m_cTonB.Q(self.m_bTonAOut and value_i, run_time)
return self.m_bTonAOut and value_i
# CDelayOut class equivalent in Python
class CDelayOut:
def __init__(self):
self.m_cOutTon = CTon()
self.m_cmWaitTon = CTon()
def Reset(self):
self.m_cOutTon.SetReset()
self.m_cmWaitTon.SetReset()
def Q(self, value_i, wait_time, out_time):
if self.m_cmWaitTon.Q(value_i, wait_time):
if self.m_cOutTon.Q(True, out_time):
self.m_cOutTon.SetReset()
self.m_cmWaitTon.SetReset()
value_i = False
return False
return True
return False
# CRisOrFall class equivalent in Python
class CRisOrFall:
def __init__(self):
self.m_bTemp = False
def Q(self, value_i, ris_or_fall):
result = False
if value_i != self.m_bTemp:
if ris_or_fall and value_i: # Rising edge
result = True
if not ris_or_fall and not value_i: # Falling edge
result = True
self.m_bTemp = value_i
return result
# CTof class equivalent in Python
class CTof:
def __init__(self):
self.m_cDelayTon = CTon()
self.m_bValue = False
self.m_cRis = CRisOrFall()
def SetReset(self):
self.m_bValue = False
self.m_cDelayTon.SetReset()
def Q(self, value_i, delay_time):
if self.m_cRis.Q(value_i, False):
self.m_cDelayTon.SetReset()
self.m_bValue = True
if self.m_cDelayTon.Q(self.m_bValue, delay_time):
self.m_bValue = False
self.m_cDelayTon.SetReset()
return value_i or self.m_bValue
# Utility function
def gGetNowTime():
return int(time.time())