Add "stc89a" protocol

This protocol variant is designed for newer STC89 series chips with BSL
version 7.x.x. The new firmware uses framing
with 16-bit checksum.

This protocol variant is currently untested because I don't have any
hardware at hand.

Addresses #50, #40.
This commit is contained in:
Grigori Goronzy
2021-01-03 16:36:16 +01:00
parent 0e020f2aa4
commit c5d509d1fa
2 changed files with 26 additions and 1 deletions

View File

@ -225,6 +225,8 @@ class StcBaseProtocol(ABC):
mcu_name += "E" if self.status_packet[17] < 0x70 else "W"
self.model = self.model._replace(name = mcu_name)
self.bsl_version = self.status_packet[17]
def get_status_packet(self):
"""Read and decode status packet"""
@ -383,6 +385,10 @@ class StcAutoProtocol(StcBaseProtocol):
else:
self.protocol_name = None
# STC89 devices with BSL version 7.x.x have a slightly different protocol
if self.protocol_name == "stc89" and self.bsl_version >= 0x70:
self.protocol_name = "stc89a"
def initialize_options(self, status_packet):
raise NotImplementedError
@ -607,6 +613,22 @@ class Stc89Protocol(StcBaseProtocol):
print("done")
class Stc89AProtocol(Stc89Protocol):
"""STC89 protocol variant with different framing"""
def extract_payload(self, packet):
"""Verify the checksum of packet and return its payload"""
packet_csum, = struct.unpack(">H", packet[-3:-1])
calc_csum = sum(packet[2:-3]) & 0xffff
if packet_csum != calc_csum:
self.dump_packet(packet)
raise StcFramingException("packet checksum mismatch")
payload = StcBaseProtocol.extract_payload(self, packet)
return payload[:-3]
class Stc12AOptionsMixIn:
def program_options(self):
print("Setting options: ", end="")