Files
pydts/chapter10.py
2025-07-24 16:59:52 +00:00

106 lines
4.4 KiB
Python

class CH10Packet:
def __init__(self, packetData):
offset = 0;
self.msgFormat = packetData[offset] & 0x0F
self.msgType = (packetData[offset] >> 4) & 0x0F
offset += 1
self.msgSeqNo = (packetData[offset+2] << 16) | (packetData[offset+1] << 8) | (packetData[offset])
offset += 3
self.uSync = (packetData[offset+1] << 8) | (packetData[offset])
offset += 2
self.channelID = (packetData[offset+1] << 8) | (packetData[offset])
offset += 2
self.pktLen = (packetData[offset+3] << 24) | (packetData[offset+2] << 16) | (packetData[offset+1] << 8) | (packetData[offset])
offset += 4
self.dataLen = (packetData[offset+3] << 24) | (packetData[offset+2] << 16) | (packetData[offset+1] << 8) | (packetData[offset])
offset += 4
self.dataTypeVer = (packetData[offset])
offset += 1
self.seqNumber = (packetData[offset])
offset += 1
self.pktFlags = (packetData[offset])
offset += 1
self.dataType = (packetData[offset])
self.bIncludesSecondaryTimeHeader = False
if (self.pktFlags / 128.0 >= 1.0):
self.bIncludesSecondaryTimeHeader = True
if self.dataType != 0X21:
return
if self.dataType == 0x00 or self.dataType == 0x01:
return
offset += 1
self.aubyRelTime = (packetData[offset+5] << 40) | (packetData[offset+4] << 32) | (packetData[offset+3] << 24) | (packetData[offset+2] << 16) | (packetData[offset+1] << 8) | (packetData[offset])
offset += 6
self.checksum = (packetData[offset+1] << 8) | (packetData[offset])
offset += 2
if(self.bIncludesSecondaryTimeHeader):
self.secondaryTimeNs = (packetData[offset+3] << 24) | (packetData[offset+2] << 16) | (packetData[offset+1] << 8) | (packetData[offset])
offset += 4
self.secondaryTimeSec = (packetData[offset+3] << 24) | (packetData[offset+2] << 16) | (packetData[offset+1] << 8) | (packetData[offset])
offset += 4
offset += 2 #rsv
self.checksumSecondary = (packetData[offset+1] << 8) | (packetData[offset])
offset += 2
self.Ch10AnalogMode = packetData[offset] & 0x03
self.Ch10AnalogLength = (packetData[offset] >> 2) & 0x3F
offset += 1
self.Ch10AnalogSubChannelID = (packetData[offset])
offset += 1
self.Ch10AnalogSubChannelCount = (packetData[offset])
offset += 1
self.Ch10AnalogFactor = packetData[offset] & 0x0F
self.Ch10AnalogSAME = (packetData[offset] >> 4) & 0x0F
offset += 1
self.bIsTSRAIR = False
if(self.Ch10AnalogSubChannelCount==18):
self.bIsTSRAIR = True
self.sampleData = list()
self.sampleCount = ((self.dataLen - 4) / self.Ch10AnalogSubChannelCount)/2.0
i = 1
while i <= self.sampleCount:
thisSample = list()
ii = 1
if(self.bIncludesSecondaryTimeHeader):
val = float(self.secondaryTimeSec) + (float(self.secondaryTimeNs)/1000000000.0) + (i/8000.0)
thisSample.append(val)
# datetime.datetime.utcfromtimestamp(self.secondaryTimeSec)
# .strftime('%Y-%m-%d %H:%M:%S') + f':{self.secondaryTimeNs}')
else:
thisSample.append(self.aubyRelTime)
while ii <= self.Ch10AnalogSubChannelCount:
thisSample.append(toSigned16(self.bIsTSRAIR,(packetData[offset+1] << 8) | (packetData[offset])))
offset+=2
ii += 1
self.sampleData.append(thisSample)
i += 1
class CH10TMATPacket:
def __init__(self, packetData):
offset = 0;
self.Version = packetData[offset] & 0xFF
if self.Version != 0x11:
return
offset += 1
self.SetupRecordConfigurationChange = (packetData[offset]) & 0x01
self.Format = (packetData[offset] & 0x02) >> 1
offset = 40
self.tmats = packetData[offset:len(packetData)+1].decode("utf-8")
def toSigned16(bIsTSRAIR, n):
if bIsTSRAIR:
n = n & 0xffff
return (n ^ 0x8000) - 0x8000
else:
return n - 0x8000