import re import logging log = logging.getLogger(__name__) TIC_SEP_HIS = b'\x20' msgs = { 'ADCO': { 'len': 12, 'value': 'adsc' }, 'OPTARIF': { 'len': 4 }, 'ISOUSC': { 'len': 2, 'value': 'num' }, 'HCHC': { 'len': 9, 'value': 'num' }, 'HCHP': { 'len': 9, 'value': 'num' }, 'PTEC': { 'len': 4 }, 'IINST': { 'len': 3, 'value': 'num' }, 'ADPS': { 'len': 3, 'value': 'num' }, 'IMAX': { 'len': 3, 'value': 'num' }, 'PAPP': { 'len': 5, 'value': 'num' }, 'HHPHC': { 'len': 1 }, 'MOTDETAT': { 'len': 6, 'value': 'num' }, } class TicHist: def __init__(self): self.sep = TIC_SEP_HIS.decode('ascii') pass def check_sum(self, group): checksum = group[-1] sum = 0 for c in group[:-2]: sum = sum + c sum = (sum & 0x3f) + 0x20 return sum == checksum def decode_group(self, group): group = group[:-2].decode('ascii') fields = group.split(self.sep) msg = {} if len(fields) < 2 or len(fields) > 4: log.warning(f'corrupted group: {group}') return None label = fields[0] value = fields[-1] if not label in msgs: log.warning(f'unknown label: {group}') return None if len(value) != msgs[label]['len']: log.warning(f'bad value length: {group}') return None value_type = msgs[label].get('value', None) if value_type == 'num': try: value = int(value) except: log.warning(f'bad numerical value: {group}') return None else: value = re.sub('\s\s+', ' ', value).strip() msg['label'] = label msg['value'] = value return msg