Skip to content

Commit

Permalink
패킷 여러개 뭉쳐서 수신될 경우 전체 버퍼 해석 시도하도록 기능 강화
Browse files Browse the repository at this point in the history
  • Loading branch information
YOGYUI committed Jan 11, 2024
1 parent 0e46615 commit d17331e
Showing 1 changed file with 47 additions and 20 deletions.
67 changes: 47 additions & 20 deletions Hillstate-Gwanggyosan/Include/RS485/PacketParser.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,29 +98,55 @@ def log(self, message: str):
writeLog(f"<{self.name}> {message}", self)

def handlePacket(self):
# self.log(f'buffer: {self.prettifyPacket(self.buffer)}')
if self.type_interpret is ParserType.REGULAR:
idx = self.buffer.find(0xF7)
if idx > 0:
self.buffer = self.buffer[idx:]
if len(self.buffer) >= 2:
packet_length = self.buffer[1]
if len(self.buffer) >= packet_length:
if self.buffer[0] == 0xF7 and self.buffer[packet_length - 1] == 0xEE:
self.line_busy = False
packet = self.buffer[:packet_length]
try:
checksum_calc = self.calcXORChecksum(packet[:-2])
checksum_recv = packet[-2]
if checksum_calc == checksum_recv:
count = 0
while True:
if count >= 10:
self.log(f'failed to interprete buffer ({count} times loop)...')
self.log(f'buffer: {self.prettifyPacket(self.buffer)}')
self.buffer.clear()
break
count += 1
idx_prefix = self.buffer.find(0xF7)
if idx_prefix >= 0:
self.buffer = self.buffer[idx_prefix:]
else:
break
if len(self.buffer) >= 2:
packet_length = self.buffer[1]
if len(self.buffer) >= packet_length:
if self.buffer[packet_length - 1] == 0xEE:
self.line_busy = False
packet = self.buffer[:packet_length]
self.buffer = self.buffer[packet_length:]
try:
checksum_calc = self.calcXORChecksum(packet[:-2])
checksum_recv = packet[-2]
self.interpretPacket(packet)
else:
if checksum_calc != checksum_recv:
pacstr = self.prettifyPacket(packet)
self.log(f'Checksum Error (calc={checksum_calc}, recv={checksum_recv}) ({pacstr})')
except IndexError:
buffstr = self.prettifyPacket(self.buffer)
pacstr = self.prettifyPacket(packet)
self.log(f'Checksum Error (calc={checksum_calc}, recv={checksum_recv}) ({pacstr})')
self.buffer = self.buffer[packet_length:]
except IndexError:
buffstr = self.prettifyPacket(self.buffer)
pacstr = self.prettifyPacket(packet)
self.log(f'Index Error (buffer={buffstr}, packet_len={packet_length}, packet={pacstr})')
self.log(f'Index Error (buffer={buffstr}, packet_len={packet_length}, packet={pacstr})')
count -= 1
continue
else:
if len(self.buffer) > 0:
self.buffer = self.buffer[1:]
idx_prefix = self.buffer.find(0xF7)
if idx_prefix >= 0:
self.buffer = self.buffer[idx_prefix:]
continue
else:
self.buffer.clear()
break
else:
break
else:
break
elif self.type_interpret is ParserType.SUBPHONE:
idx = self.buffer.find(0x7F)
if idx > 0:
Expand All @@ -142,6 +168,7 @@ def handlePacket(self):
def interpretPacket(self, packet: bytearray):
store: bool = True
packet_info = {'packet': packet, 'timestamp': datetime.datetime.now()}
# self.log(f'packet: {self.prettifyPacket(packet)}')
try:
if self.type_interpret == ParserType.REGULAR:
if packet[3] == 0x18: # 난방
Expand Down

0 comments on commit d17331e

Please sign in to comment.