From 58d9ad7752059e586650b525939a3b33ea7d27b9 Mon Sep 17 00:00:00 2001 From: Jannik Zander Date: Tue, 21 Jun 2016 22:52:51 +0200 Subject: [PATCH] Add crc.py --- .config/git/ignore | 2 + .config/profile/environ.sh | 5 +- work/geni/crc.py | 71 +++ work/geni/geni.py | 544 ++++++++++++++++++ work/{gf/gf_config.py => geni/geni_config.py} | 0 work/gf/gf.py | 452 --------------- 6 files changed, 619 insertions(+), 455 deletions(-) create mode 100755 work/geni/crc.py create mode 100755 work/geni/geni.py rename work/{gf/gf_config.py => geni/geni_config.py} (100%) delete mode 100644 work/gf/gf.py diff --git a/.config/git/ignore b/.config/git/ignore index b69b9e5..5221ad5 100644 --- a/.config/git/ignore +++ b/.config/git/ignore @@ -60,3 +60,5 @@ Icon Network Trash Folder Temporary Items .apdisk + +__pycache__ diff --git a/.config/profile/environ.sh b/.config/profile/environ.sh index f6b2624..ec177f4 100644 --- a/.config/profile/environ.sh +++ b/.config/profile/environ.sh @@ -6,15 +6,14 @@ export HOSTNAME=`hostname` export SHELL='bash' export EDITOR='vim' export VISUAL='vim' -export PAGER='less -X' -export MANPAGER="less -X" +export PAGER='less -eFRX' +export MANPAGER="less -eFRX" export BROWSER='lynx -vikeys -use_mouse' # Larger bash history (allow 32³ entries; default is 500) export HISTSIZE=32768; export HISTFILESIZE=$HISTSIZE; export HISTCONTROL=ignoreboth; -# Make some commands not show up in history export HISTIGNORE="ls:cd:cd -:pwd:exit:date:* --help"; # Prefer US language and UTF-8 diff --git a/work/geni/crc.py b/work/geni/crc.py new file mode 100755 index 0000000..dd5187c --- /dev/null +++ b/work/geni/crc.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 + +Crc_Table16 = ( + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +) + + +class Crc(object): + def __init__(self, data): + self.init(data) + + def update(self, data): + data &= 0xff + self._accum = (((self._accum << 8) & 0xffff) ^ Crc_Table16[((self._accum >> 8) ^ data) & 0xff]) & 0xffff + + def init(self, data): + self._accum = data + + def get(self): + return (self._accum ^ (0xffff)) & 0xffff + +def calcCrc(frame): + crc = Crc(0xffff) + for idx in range(1, len(frame)): + crc.update(frame[idx]) + return crc.get() + +def verifyCrc(frame): + recCrc = (frame[-2]<<8)+frame[-1] + calCrc = calcCrc(frame[:-2]) +# print("received",hex(recCrc>>8),hex(recCrc&0xff),"== calculated",hex(calCrc>>8),hex(calCrc&0xff)) + return recCrc == calCrc; + + +#data=b'\x27\x0D\x22\x20\x0B\x03\x34\x35\x70\x02\x04\xBE\x71\x72\x73' +#crc=b'\xE5\x5B' +#calccrc=calcCrc(data) +#print("calc crc",hex(crc[0]),hex(crc[1]), "==",hex(calccrc>>8),hex(calccrc&0xff)) +#checkcrc=verifyCrc(data+crc) +#print("check crc",hex(crc[0]),hex(crc[1]), "==",hex(checkcrc>>8),hex(checkcrc&0xff)) diff --git a/work/geni/geni.py b/work/geni/geni.py new file mode 100755 index 0000000..2874452 --- /dev/null +++ b/work/geni/geni.py @@ -0,0 +1,544 @@ +#!/usr/bin/env python3 + +# section: environment {{{1 +######### +############################################ +import geni_config as gf +import crc +import serial +from serial.tools import list_ports +import fileinput +import matplotlib.pyplot as plt +from datetime import datetime,time +import string +#import ctype +#import logging + +# section: debugging {{{1 +###################################################### + +#telegrams=[b'\x27\x0D\x22\x20\x0B\x03\x34\x35\x70\x02\x04\xBE\x71\x72\x73\xE5\x5B'] +telegrams=[b'\xb7M\x012\x00\xc1\x01\x00\x00.\x0c\x13\x00\x00\x00\x00\x00d\x00\x00\x02X\x00\x02\x00\n'] +telegrams.append(b"\x00<\x07\xd0\x00\x00\x1a,\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x15\xbd'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x013\x00\xc1\x01\x00\x00.\x0e&\x00\x00\x00\x1d\x00\x01\xb3.\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x01,\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00o\xf4'\n") +telegrams.append(b'! \x0b\x0345p\x07\x01\x0145$\x17 !\x0b\x06\x00\x00\xff\xff\x00\x00\x07\x0bMultistage\x00\x7f\x1a&G\xf7 \n') +telegrams.append(b'\xb7M\x014\x00\xc1\x01\x00\x00\n') +telegrams.append(b"\x0fk\x00\x00\x00\x009\xdc\x80A\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x01,\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xf6\x9e'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf4\x00\xc3\x01\x00\x00,\x00\x00\x0c\x00X\x00\x03\x00\xa5\x00\xa6\x00\xa7\x00[\x00\xaf\x00\xbe\x00\xbf\x01\x04\x00\xd7\x019\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@ \x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x8c\x8e'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf50\xb8\x04\x00\xfa\xc7\x04\x00\xac5\x04\x00\xdc\x8f\x05\x00\xa4<\xff\xff\xe6\x9a\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\xee\xe5G\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xcb'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x90\x00\xc2\x01\x00\x00\x1e\x00\x11\x00!\x00\x00\x00\x04\x00\x01\xb3\x87\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x02\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xe7\xd6'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x91\x00\xc2\x01\x00\x00\x1e\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x02\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xff\xa8'\n") +telegrams.append(b'! \x0b\x0345p\x07\x01\x11&\x04$\r !\x0b\x06\x00\x00\xff\xff\x00\x00\x07\x01\x00\x95#&G\xf7 \n') +telegrams.append(b"\xb7M\x01\x92\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x02\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x97d'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x93\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x10\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xedk'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf50\xb8\x04\x00\xfa\xc7\x04\x00\xac5\x04\x00\xdc\x8f\x05\x00\xa4<\xff\xff\xe6\x9a\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\xee\xe5G\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xcb'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b'\xb7M\x01,\x00\xc1\x01\x00\x00-\x02\x01\x03\x90!\xff\x82\x1b\x00\x00\xff\xff\xff\xff\x82S\x00\x00\xfe\xff\x82\x1b\x00\x00\x00\x0f\xff\x82\x1b\x00\x00\x00\x00\x00\xff\x82\x19\x00\xfe\xff\x82\x1b\x00\x00\xff\n') +telegrams.append(b"\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x82E'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b'\xb7M\x01-\x00\xc1\x01\x00\x00*\x02(\xaa\x82\x1e\x00d\x02\xaa\x82\x1e\x00d\xaa\x82\x1e\x00d\xff\x82\x16\x00\x00\xff\x82\x1b\x00\x00\xff\x82S\x00\x00\xfe\xff\xff\xff\x82\x1b\x00\x00\xfe\x00\x00\xff\n') +telegrams.append(b'\x05\x8aC\x00D\x00E\x00F\x00\x05\x00U"\'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n') +telegrams.append(b"\xb7M\x01.\x00\xc1\x01\x00\x00.\x02>\xaa\x82\x1e\x00d\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\x82\x1b\x00\x00\xaa\x82\x1e\x00d\xff\x82\x1e\x00d!\x82\x1e\x00d\xfe\xaa\x82\x1e\x00d\x00\x11\x00\x10\x05\x8aC\x00D\x00E\x00F\x00\x05\x00O\xb9'\x0c! \x0b\x0345p\x02\x03\x94\x95\x96\x9b\xab$\x0f !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x03'\x07 !\x1a&G\xf7 \n") +telegrams.append(b"\xb7M\x01/\x00\xc1\x01\x00\x00.\x02T\x00\x11\xff\x11\xfe\x10E\xff\x82\x00\x00\x00\x00\x02\xaa\x00\x02\x00\x00\x00\x00\xff\xff\x00\x00\x00\x03\x00\x00\x00\x00\x10!\xfe\x10\x00\x00\x00\x00\x00\x00\x00\x19\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00Fq'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x010\x00\xc1\x01\x00\x00*\x04\x8a\x00\x82\x1e\x00d\x00\x00\x00\x00\x00\x00\x00\x01\x00\x04\x00\x05\x00\x05\x00\x00\x012d\x1a,\xab\x84\x82\x1e\x00d\xab\x84\xab\x84\xab\x84\xff\xff\x00\x00\x19\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xd5\xf8'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b"\xb7M\x011\x00\xc1\x01\x00\x00.\x0b.!\xfd\x83k\x05\x13\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xd9\x1a'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b'\xb7M\x012\x00\xc1\x01\x00\x00.\x0c\x13\x00\x00\x00\x00\x00d\x00\x00\x02X\x00\x02\x00\n') +telegrams.append(b"\x00<\x07\xd0\x00\x00\x1a,\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x15\xbd'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x013\x00\xc1\x01\x00\x00.\x0e&\x00\x00\x00\x1d\x00\x01\xb3.\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x01,\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00o\xf4'\n") +telegrams.append(b'! \x0b\x0345p\x07\x01\x0145$\x17 !\x0b\x06\x00\x00\xff\xff\x00\x00\x07\x0bMultistage\x00\x7f\x1a&G\xf7 \n') +telegrams.append(b'\xb7M\x014\x00\xc1\x01\x00\x00\n') +telegrams.append(b"\x0fk\x00\x00\x00\x009\xdc\x80A\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x01,\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xf6\x9e'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf4\x00\xc3\x01\x00\x00,\x00\x00\x0c\x00X\x00\x03\x00\xa5\x00\xa6\x00\xa7\x00[\x00\xaf\x00\xbe\x00\xbf\x01\x04\x00\xd7\x019\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@ \x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x8c\x8e'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf50\xb8\x04\x00\xfa\xc7\x04\x00\xac5\x04\x00\xdc\x8f\x05\x00\xa4<\xff\xff\xe6\x9a\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\xee\xe5G\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xcb'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x90\x00\xc2\x01\x00\x00\x1e\x00\x11\x00!\x00\x00\x00\x04\x00\x01\xb3\x87\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x04\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xe72'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x91\x00\xc2\x01\x00\x00\x1e\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x04\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xffL'\n") +telegrams.append(b'! \x0b\x0345p\x07\x01\x11&\x04$\r !\x0b\x06\x00\x00\xff\xff\x00\x00\x07\x01\x00\x95#&G\xf7 \n') +telegrams.append(b"\xb7M\x01\x92\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x04\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x97\x80'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x93\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x0c\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1e\\'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x94\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x0c\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00ed'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x95\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x0c\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xd7'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf4\x00\xc3\x01\x00\x00,\x00\x00\x0c\x00X\x00\x03\x00\xa5\x00\xa6\x00\xa7\x00[\x00\xaf\x00\xbe\x00\xbf\x01\x04\x00\xd7\x019\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@ \x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x8c\x8e'\x0c! \x0b\x0345p\x02\x03\x94\x95\x96\x9b\xab$\x0f !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x03'\x07 !\x1a&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf50\xb8\x04\x00\xfa\xc7\x04\x00\xac5\x04\x00\xdc\x8f\x05\x00\xa4<\xff\xff\xe6\x9a\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\xee\xe5G\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xcb'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^\xf8&\x1c\xf7 \x07\x8cJMultistage\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xb3\x80'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&\x12\xf7 \x07\x82K\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1b7'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&\x1c\xf7 \x07\x8cLMultistage\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x01\x8a'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82M\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x10P'\x0c! \x0b\x0345p\x02\x03\x94\x95\x96\x9b\xab$\x0f !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x03'\x07 !\x1a&\x12\xf7 \x07\x82N\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x9d\xf3'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82O\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xe6\x92'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf4\x00\xc3\x01\x00\x00,\x00\x00\x0c\x00X\x00\x03\x00\xa5\x00\xa6\x00\xa7\x00[\x00\xaf\x00\xbe\x00\xbf\x01\x04\x00\xd7\x019\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@ \x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x8c\x8e'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf50\xb8\x04\x00\xfa\xc7\x04\x00\xac5\x04\x00\xdc\x8f\x05\x00\xa4<\xff\xff\xe6\x9a\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\xee\xe5G\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xcb'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82P\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xbb\x08'\n") +telegrams.append(b"! \x0b\x0345p\x07\x01\x0145$\x17 !\x0b\x06\x00\x00\xff\xff\x00\x00\x07\x0bMultistage\x00\x7f\x1a&\x12\xf7 \x07\x82Q\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xc0i'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82R\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00M\xca'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&\x12\xf7 \x07\x82S\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x006\xab'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&\x12\xf7 \x07\x82T\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00F\xad'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82U\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00=\xcc'\n") +telegrams.append(b'! \x0b\x0345p\x07\x01\x11&\x04$\r !\x0b\x06\x00\x00\xff\xff\x00\x00\x07\x01\x00\x95#&G\xf7 \n') +telegrams.append(b"\xb7M\x01\xf4\x00\xc3\x01\x00\x00,\x00\x00\x0c\x00X\x00\x03\x00\xa5\x00\xa6\x00\xa7\x00[\x00\xaf\x00\xbe\x00\xbf\x01\x04\x00\xd7\x019\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@ \x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x8c\x8e'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf50\xb8\x04\x00\xfa\xc7\x04\x00\xac5\x04\x00\xdc\x8f\x05\x00\xa4<\xff\xff\xe6\x9a\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\xee\xe5G\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xcb'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b'\xb7M\x01,\x00\xc1\x01\x00\x00-\x02\x01\x03\x90!\xff\x82\x1b\x00\x00\xff\xff\xff\xff\x82S\x00\x00\xfe\xff\x82\x1b\x00\x00\x00\x0f\xff\x82\x1b\x00\x00\x00\x00\x00\xff\x82\x19\x00\xfe\xff\x82\x1b\x00\x00\xff\n') +telegrams.append(b"\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x82E'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b'\xb7M\x01-\x00\xc1\x01\x00\x00*\x02(\xaa\x82\x1e\x00d\x02\xaa\x82\x1e\x00d\xaa\x82\x1e\x00d\xff\x82\x16\x00\x00\xff\x82\x1b\x00\x00\xff\x82S\x00\x00\xfe\xff\xff\xff\x82\x1b\x00\x00\xfe\x00\x00\xff\n') +telegrams.append(b'\x05\x8aC\x00D\x00E\x00F\x00\x05\x00U"\'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n') +telegrams.append(b"\xb7M\x01.\x00\xc1\x01\x00\x00.\x02>\xaa\x82\x1e\x00d\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\x82\x1b\x00\x00\xaa\x82\x1e\x00d\xff\x82\x1e\x00d!\x82\x1e\x00d\xfe\xaa\x82\x1e\x00d\x00\x11\x00\x10\x05\x8aC\x00D\x00E\x00F\x00\x05\x00O\xb9'\x0c! \x0b\x0345p\x02\x03\x94\x95\x96\x9b\xab$\x0f !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x03'\x07 !\x1a&G\xf7 \n") +telegrams.append(b"\xb7M\x01/\x00\xc1\x01\x00\x00.\x02T\x00\x11\xff\x11\xfe\x10E\xff\x82\x00\x00\x00\x00\x02\xaa\x00\x02\x00\x00\x00\x00\xff\xff\x00\x00\x00\x03\x00\x00\x00\x00\x10!\xfe\x10\x00\x00\x00\x00\x00\x00\x00\x19\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00Fq'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x010\x00\xc1\x01\x00\x00*\x04\x8a\x00\x82\x1e\x00d\x00\x00\x00\x00\x00\x00\x00\x01\x00\x04\x00\x05\x00\x05\x00\x00\x012d\x1a,\xab\x84\x82\x1e\x00d\xab\x84\xab\x84\xab\x84\xff\xff\x00\x00\x19\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xd5\xf8'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b"\xb7M\x011\x00\xc1\x01\x00\x00.\x0b.!\xfd\x83k\x05\x13\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xd9\x1a'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf50\xb8\x04\x00\xfa\xc7\x04\x00\xac5\x04\x00\xdc\x8f\x05\x00\xa4<\xff\xff\xe6\x9a\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\xee\xe5G\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xcb'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x90\x00\xc2\x01\x00\x00\x1e\x00\x11\x00!\x00\x00\x00\x04\x00\x01\xb3\x87\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x07\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xe7@'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x91\x00\xc2\x01\x00\x00\x1e\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x07\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xff>'\n") +telegrams.append(b'! \x0b\x0345p\x07\x01\x11&\x04$\r !\x0b\x06\x00\x00\xff\xff\x00\x00\x07\x01\x00\x95#&G\xf7 \n') +telegrams.append(b"\xb7M\x01\x92\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x07\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x97\xf2'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x93\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x13\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xed\x19'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x94\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x13\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x96!'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b"\xb7M\x01\x95\x00\xc2\x01\x00\x00\x1e\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00~\xb8\x04\x00\x00\x00\xa0\x02\x13\x00\x00\x00\x08\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xee\x92'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf4\x00\xc3\x01\x00\x00,\x00\x00\x0c\x00X\x00\x03\x00\xa5\x00\xa6\x00\xa7\x00[\x00\xaf\x00\xbe\x00\xbf\x01\x04\x00\xd7\x019\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@ \x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x8c\x8e'\x0c! \x0b\x0345p\x02\x03\x94\x95\x96\x9b\xab$\x0f !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x03'\x07 !\x1a&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf50\xb8\x04\x00\xfa\xc7\x04\x00\xac5\x04\x00\xdc\x8f\x05\x00\xa4<\xff\xff\xe6\x9a\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\xee\xe5G\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xcb'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x1c\xf7 \x07\x8cJMultistage\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xb3\x80'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&\x12\xf7 \x07\x82K\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1b7'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&\x1c\xf7 \x07\x8cLMultistage\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x01\x8a'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82M\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x10P'\x0c! \x0b\x0345p\x02\x03\x94\x95\x96\x9b\xab$\x0f !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x03'\x07 !\x1a&\x12\xf7 \x07\x82N\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x9d\xf3'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82O\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xe6\x92'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf4\x00\xc3\x01\x00\x00,\x00\x00\x0c\x00X\x00\x03\x00\xa5\x00\xa6\x00\xa7\x00[\x00\xaf\x00\xbe\x00\xbf\x01\x04\x00\xd7\x019\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@ \x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x8c\x8e'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&G\xf7 \n") +telegrams.append(b"\xb7M\x01\xf50\xb8\x04\x00\xfa\xc7\x04\x00\xac5\x04\x00\xdc\x8f\x05\x00\xa4<\xff\xff\xe6\x9a\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\xee\xe5G\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\x1d\xcb'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82P\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xbb\x08'\n") +telegrams.append(b"! \x0b\x0345p\x07\x01\x0145$\x17 !\x0b\x06\x00\x00\xff\xff\x00\x00\x07\x0bMultistage\x00\x7f\x1a&\x12\xf7 \x07\x82Q\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00\xc0i'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82R\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00M\xca'\x0f! \x0b\x0345p\x02\x06[tu\x81\x9a\xbd\x93\xa1$\x12 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x06\x00\xff\xff\xff\x00\x00RU&\x12\xf7 \x07\x82S\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x006\xab'\x18! \x0b\x0345p\x0b\x0f3efghijklmnoqrs\xe9\x9c$* !\x0b\x06\x00\x00\xff\xff\x00\x00\x0b\x1e\xff\xff\x00\x11\x00!\x00\x00\x00\x03\x00\x00\xd2\xe6\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00e[&\x12\xf7 \x07\x82T\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00F\xad'\r! \x0b\x0345p\x02\x04\xbeqrs*\xfe$\x10 !\x0b\x06\x00\x00\xff\xff\x00\x00\x02\x04\x00\xff\xff\xff\x8b^&\x12\xf7 \x07\x82U\x00\x05\x8aC\x00D\x00E\x00F\x00\x05\x00=\xcc'\n") +# global variable +cl=0 +td=[] +master=[] +speed=[] +speed.append([]) +speed.append([]) +speed.append([]) +speed.append([]) + +def dbg_speed(ids5,val5,ts,sa): + global td + global master + global speed + td=td+[ts.timestamp()] + master=master+[1+(sa-31)/10] + for i in range(len(ids5)): + if ids5[i] in range(67,71): + speed[ids5[i]-67]=speed[ids5[i]-67]+[val5[i]/254] + return td,master,speed + +# section: serial_ports {{{1 +###################################################### +def serial_ports(): + ports=list(list_ports.comports()) + # return the port if FTDI vendor + result=[] + print("Available ports:") + for p in ports: + print(repr(p.device),repr(p.description)) + if p.vid==0x403: # FTDI vendor + try: + s = serial.Serial(p.device) + s.close() + result.append(p) + except (OSError, serial.SerialException): + pass + return result + +# section: serial_open {{{1 +###################################################### +def serial_open( vid, pid ): +#vid=0x403 +#pid=0x6001 +#pid=0x6015 + ctx = usb1.USBContext() + logging.basicConfig(level=logging.DEBUG) + + for device in ctx.getDeviceList(skip_on_error=True): + print(device) + if device.getVendorID() == vid and device.getProductID() == pid: + device = device + break + else: + raise Exception( "ERROR: USB device %04x:%04x not found." % (vid, pid)) + + logging.info( "Found device : ID %04x:%04x -> %s Address %d" % (device.getVendorID(), device.getProductID(), '->'.join(str(x) for x in ['Bus %03i' % (device.getBusNumber(), )] + device.getPortNumberList()), device.getDeviceAddress() )) + + handle = device.open() + print(handle) + logging.info( "Device opened, got handle" ) + + endpoint = 0x85 + length = 65536 + timeout = 100 # ms + print("enter loop") + while True: + print("reading") + data = handle.bulkRead ( endpoint, length, timeout ) + # do something with data + +# section: checkcrc {{{1 +###################################################### +def checkcrc(line): + ok=False + if len(line)>16 and not "ERR" in line.upper(): + ok=True +# print("Ok:",ok) + return ok + +# section: checkglowpan {{{1 +###################################################### +def checkglowpan(line): + isgenidata=False + line=line[32:] + #print(repr(line)) + mac_hi,line=readbyte(line) + mac_lo,line=readbyte(line) + #print(mac_hi,mac_lo) + #print(repr(line)) + if mac_hi==8 and mac_lo==4: + isgenidata=True + #print(repr(line)) + #print(isgenidata) + return isgenidata,line +# section: readtimestamp {{{1 +###################################################### +def readtimestamp(line): + info=line.split(":") + try: + timestamp=int(info[1].strip())/1000 + except: + timestamp=0 + finally: + ts=datetime.fromtimestamp(timestamp) + + if timestamp>1e9: # 2001-09-09 + line=info[0] + else: + try: + h=int(info[0][-2:]) + m=int(info[1]) + s=int(info[2][:2]) + u=int(info[2][3:6])*1000 + ts=datetime.combine(date.today(),time(h,m,s,u)) + line=''.join(line.split(":")[2:])[7:] + except: + pass + print(ts) + return ts,line + + +# section: readbyte {{{1 +###################################################### +#def readbyte(line): +# byte=-1 +# line=line.strip() +# while byte==-1 and len(line)>0: +# try: +# byte=int(line[0:2],16) +# line=line[1:] +# except: +# pass +# finally: +# line=line[2:] +# return byte,line + +def readbyte(line): + byte=line[0] + line=line[1:] + return byte,line + + +# section: process_header {{{1 +###################################################### +def process_header(line): + sd,line=readbyte(line) + if sd==gf.DATA_REQUEST: + typ="DATA_REQUEST --->" + elif sd==gf.DATA_MESSAGE: + typ="DATA_MESSAGE --->" + elif sd==gf.DATA_REPLY: + typ="<--- DATA_REPLY" + else: + typ="**** DATA_ERROR ****" + print("Data Type:",typ,"Start Delimiter:",sd) + return typ,sd,0,0,0,line + le,line=readbyte(line) + da,line=readbyte(line) + sa,line=readbyte(line) + if sd==gf.DATA_REQUEST and da==gf.DA_BROADCAST_CONNECT: + typ="CONNECTION_REQUEST ===>" + if sd==gf.DATA_REQUEST and da==gf.DA_BROADCAST_REQUEST: + typ="DATA_REQUEST ===>" + if sd==gf.DATA_MESSAGE and da==gf.DA_BROADCAST_MESSAGE: + typ="DATA_MESSAGE ===>" + print(typ) + print("Length:",le,"Destination Addr:",da,"Source Addr:",sa) + return typ,sd,le,da,sa,line + +# section: process_apdu {{{1 +###################################################### +def process_apdu(line): + cl,line=readbyte(line) + cl=cl&0x1F + le,line=readbyte(line) + os=(le&0xC0)>>6 + le=le&0x3F + print(gf.operation[os],"Cl.",cl,"Len.",le) +# print(gf.operation[os],"Cl. {02}",cl) + return cl,os,le,line + +# section: process_data {{{1 +###################################################### +def process_data(line,le,size1,size2): + num=int(le/(size1+size2)) + ids=[0]*num + val=[0]*num + for i in range(0,num): + if size1>0: + ids[i],line=readbyte(line) + for j in range(0,size2): + tmp,line=readbyte(line) + val[i]=(val[i]<<8)+tmp + if size1>0 and size2>0: + print("Id:",ids[i],repr(gf.params[cl][ids[i]]),"=",val[i]) + elif size1>0: + print("Id:",ids[i],repr(gf.params[cl][ids[i]])) + elif size2>0: + print("=",val[i]) + return ids,val,line + +# section: process_string {{{1 +###################################################### +def process_string(line,le,size1,size2): + ids=[0]*size1 + val=[0]*size2 + if size1>0: + ids,line=readbyte(line) + for i in range(0,size2): + val[i],line=readbyte(line) + string=''.join(chr(i) for i in val) + string=string[:-1] + if size1>0 and size2>0: + print("Id:",ids,repr(gf.params[cl][ids]),"=",repr(string)) + elif size1>0: + print("Id:",ids,repr(gf.params[cl][ids])) + elif size2>0: + print("=",repr(string)) + return ids,val,line + +# section: process_object {{{1 +###################################################### +def process_object(line,le,size1,size2): + ids=[0]*size1 + val=[0]*size2 + if size1>0: + ids,line=readbyte(line) + for i in range(0,size2): + val[i],line=readbyte(line) + + if size1>0 and size2>0: + print("Id:",ids,repr(gf.params[cl][ids]),"=",val) + elif size1>0: + print("Id:",ids,repr(gf.params[cl][ids])) + elif size2>0: + print("=",val) + return ids,val,line + +# section: process_crc {{{1 +###################################################### +def process_crc(line): + crc1,line=readbyte(line) + crc2,line=readbyte(line) + crc1=format(crc1,'02X') + crc2=format(crc2,'02X') + crc=crc1+' '+crc2 + print("CRC:",crc) + return crc + +# section: process_telegram {{{1 +###################################################### +def process_telegram(line): + # section: headers {{{2 + global cl + # Check if timestamp exists +# ts,line=readtimestamp(line) + # Filter non geni data if glowpan frame +# isgenidata,line=checkglowpan(line) +# if not isgenidata: +# return + # Check if line is ok +# iscrcok=checkcrc(line) +# if not iscrcok: +# return + # Process geni data + typ,ds,le,da,sa,line=process_header(line) + numbytes=le-2 + while numbytes>0 and len(line)>=numbytes: + print("--------------------------------------------------------------------") + cl,os,ale,line=process_apdu(line) + numbytes=numbytes-2-ale + # section: classes {{{2 + if cl==2 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids2,val2,line=process_data(line,ale,1,0) + elif cl==2 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids2,val2,line=process_data(line,ale,0,1) + elif cl==2 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids2,val2,line=process_data(line,ale,1,0) + elif cl==2 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids2,val2,line=process_data(line,ale,0,4) + elif cl==3 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids3,val3,line=process_data(line,ale,1,0) + elif cl==3 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids3,val3,line=process_data(line,ale,1,0) + elif cl==3 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids3,val3,line=process_data(line,ale,0,4) + elif cl==4 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids4,val4,line=process_data(line,ale,1,0) + elif cl==4 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids4,val4,line=process_data(line,ale,0,1) + elif cl==4 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids4,val4,line=process_data(line,ale,1,1) + elif cl==4 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids4,val4,line=process_data(line,ale,1,0) + elif cl==4 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids4,val4,line=process_data(line,ale,0,4) + elif cl==5 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids5,val5,line=process_data(line,ale,1,0) + elif cl==5 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids5,val5,line=process_data(line,ale,0,1) + elif cl==5 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids5,val5,line=process_data(line,ale,1,1) + elif cl==5 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids5,val5,line=process_data(line,ale,1,0) + elif cl==5 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids5,val5,line=process_data(line,ale,0,4) + elif cl==7 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids7,val7,line=process_string(line,ale,1,0) + elif cl==7 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids7,val7,line=process_string(line,ale,0,ale) + elif cl==7 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids7,val7,line=process_string(line,ale,1,ale-1) + elif cl==10 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids10,val10,line=process_object(line,ale,1,0) + elif cl==10 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids10,val10,line=process_object(line,ale,0,ale) + elif cl==10 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids10,val10,line=process_object(line,ale,1,ale-1) + elif cl==11 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids11,val11,line=process_data(line,ale,1,0) + elif cl==11 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids11,val11,line=process_data(line,ale,0,2) + elif cl==11 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids11,val11,line=process_data(line,ale,1,2) + elif cl==11 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids11,val11,line=process_data(line,ale,1,0) + elif cl==11 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids11,val11,line=process_data(line,ale,0,4) + elif cl==12 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids12,val12,line=process_data(line,ale,1,0) + elif cl==12 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids12,val12,line=process_data(line,ale,0,2) + elif cl==12 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids12,val12,line=process_data(line,ale,1,2) + elif cl==12 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids12,val12,line=process_data(line,ale,1,0) + elif cl==12 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids12,val12,line=process_data(line,ale,0,4) + elif cl==13 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids13,val13,line=process_data(line,ale,1,0) + elif cl==13 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids13,val13,line=process_data(line,ale,0,2) + elif cl==13 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids13,val13,line=process_data(line,ale,1,2) + elif cl==13 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids13,val13,line=process_data(line,ale,1,0) + elif cl==13 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids13,val13,line=process_data(line,ale,0,4) + elif cl==14 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids14,val14,line=process_data(line,ale,1,0) + elif cl==14 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids14,val14,line=process_data(line,ale,0,3) + elif cl==14 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids14,val14,line=process_data(line,ale,1,3) + elif cl==14 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids14,val14,line=process_data(line,ale,1,0) + elif cl==14 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids14,val14,line=process_data(line,ale,0,4) + elif cl==15 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids15,val15,line=process_data(line,ale,1,0) + elif cl==15 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids15,val15,line=process_data(line,ale,0,3) + elif cl==15 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids15,val15,line=process_data(line,ale,1,3) + elif cl==15 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids15,val15,line=process_data(line,ale,1,0) + elif cl==15 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids15,val15,line=process_data(line,ale,0,4) + elif cl==16 and ds==gf.DATA_REQUEST and os==gf.OS_GET: + ids16,val16,line=process_data(line,ale,1,0) + elif cl==16 and ds==gf.DATA_REPLY and os==gf.OS_GET: + ids16,val16,line=process_data(line,ale,0,3) + elif cl==16 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: + ids16,val16,line=process_data(line,ale,1,3) + elif cl==16 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: + ids16,val16,line=process_data(line,ale,1,0) + elif cl==16 and ds==gf.DATA_REPLY and os==gf.OS_INFO: + ids16,val16,line=process_data(line,ale,0,4) + else: + line=line[ale:] +# section: filtering {{{2 + if cl==5: + td,master,speed=dbg_speed(ids5,val5,ts,sa) +# crc=process_crc(line) + return + +# section: main {{{1 +###################################################### + +# section: serial {{{2 +lsser=serial_ports() +ser=serial.Serial() +ser.port=lsser[0].device +ser.baudrate=9600 +ser.parity=serial.PARITY_NONE +ser.stopbits=serial.STOPBITS_ONE +ser.bytesize=serial.EIGHTBITS +ser.timeout=40 # msec +ser.open() +print("Connected to",repr(ser.portstr)) + + +DL_IDLE=0 +DL_SENDING=1 +DL_RECEIVING=2 +state=DL_IDLE +frame=bytearray() +index=0 +while True: + byte=ser.read() + frame.append(byte) + if index==1: + framelen=byte+4 + numbytes=framelen-1 + state=DL_RECEIVING + elif index==0: + print("START") + pass + if state==DL_RECEIVING: + print(numbytes) + numbytes=numbytes-1 + if numbytes==0: + if crc.verifyCrc(frame): + print("CRC ok") + process_telegram(frame[:-2]) + else: + print("CRC error") + state=DL_IDLE + index=0 + break # frame done + index=index+1 + +ser.close() +print("Disconnected") + +# section: plot {{{2 +###################################################### + +# Calculate timedelta +if len(td)==0: exit() +t0=td[0] +td[:]=[x-t0 for x in td] + +# Make a plot +fig=plt.figure() +plt.xlabel('time/s') +plt.ylabel('speed/upper') +plt.plot(td,speed[0],'green') +plt.plot(td,speed[1],'red') +plt.plot(td,speed[2],'blue') +plt.plot(td,speed[3],'magenta') +plt.legend('1234') +plt.plot(td,master,'black') +plt.title('multipump') +plt.show() +plt.close(fig) + diff --git a/work/gf/gf_config.py b/work/geni/geni_config.py similarity index 100% rename from work/gf/gf_config.py rename to work/geni/geni_config.py diff --git a/work/gf/gf.py b/work/gf/gf.py deleted file mode 100644 index 8e82404..0000000 --- a/work/gf/gf.py +++ /dev/null @@ -1,452 +0,0 @@ -#!/usr/bin/env python3 - -# section: environment {{{1 -######### -############################################ -import gf_config as gf -import serial -from serial.tools import list_ports -import fileinput -import matplotlib.pyplot as plt -import datetime -import time -#import ctype -#import logging - -# section: debugging {{{1 -###################################################### - -# global variable -cl=0 -td=[] -master=[] -speed=[] -speed.append([]) -speed.append([]) -speed.append([]) -speed.append([]) - -def dbg_speed(ids5,val5,ts,sa): - global td - global master - global speed - td=td+[ts.timestamp()] - master=master+[1+(sa-31)/10] - for i in range(len(ids5)): - if ids5[i] in range(67,71): - speed[ids5[i]-67]=speed[ids5[i]-67]+[val5[i]/254] - return td,master,speed - -# section: serial_ports {{{1 -###################################################### -def serial_ports(): - ports=list(list_ports.comports()) - # return the port if FTDI vendor - result=[] - print("Available ports:") - for p in ports: - print(repr(p.device),repr(p.description)) - if p.vid==0x403: # FTDI vendor - try: - s = serial.Serial(p.device) - s.close() - result.append(p) - except (OSError, serial.SerialException): - pass - return result - -# section: serial_open {{{1 -###################################################### -def serial_open( vid, pid ): -#vid=0x403 -#pid=0x6001 -#pid=0x6015 - ctx = usb1.USBContext() - logging.basicConfig(level=logging.DEBUG) - - for device in ctx.getDeviceList(skip_on_error=True): - print(device) - if device.getVendorID() == vid and device.getProductID() == pid: - device = device - break - else: - raise Exception( "ERROR: USB device %04x:%04x not found." % (vid, pid)) - - logging.info( "Found device : ID %04x:%04x -> %s Address %d" % (device.getVendorID(), device.getProductID(), '->'.join(str(x) for x in ['Bus %03i' % (device.getBusNumber(), )] + device.getPortNumberList()), device.getDeviceAddress() )) - - handle = device.open() - print(handle) - logging.info( "Device opened, got handle" ) - - endpoint = 0x85 - length = 65536 - timeout = 100 # ms - print("enter loop") - while True: - print("reading") - data = handle.bulkRead ( endpoint, length, timeout ) - # do something with data - -# section: checkcrc {{{1 -###################################################### -def checkcrc(line): - ok=False - if len(line)>16 and not "ERR" in line.upper(): - ok=True -# print("Ok:",ok) - return ok - -# section: checkglowpan {{{1 -###################################################### -def checkglowpan(line): - isgenidata=False - line=line[32:] - #print(repr(line)) - mac_hi,line=readbyte(line) - mac_lo,line=readbyte(line) - #print(mac_hi,mac_lo) - #print(repr(line)) - if mac_hi==8 and mac_lo==4: - isgenidata=True - #print(repr(line)) - #print(isgenidata) - return isgenidata,line -# section: readtimestamp {{{1 -###################################################### -def readtimestamp(line): - info=line.split(":") - try: - timestamp=int(info[1].strip())/1000 - except: - timestamp=0 - finally: - ts=datetime.fromtimestamp(timestamp) - - if timestamp>1e9: # 2001-09-09 - line=info[0] - else: - try: - h=int(info[0][-2:]) - m=int(info[1]) - s=int(info[2][:2]) - u=int(info[2][3:6])*1000 - ts=datetime.combine(date.today(),time(h,m,s,u)) - line=''.join(line.split(":")[2:])[7:] - except: - pass - print(ts) - return ts,line - - -# section: readbyte {{{1 -###################################################### -def readbyte(line): - byte=-1 - line=line.strip() - while byte==-1 and len(line)>0: - try: - byte=int(line[0:2],16) - line=line[1:] - except: - pass - finally: - line=line[2:] - return byte,line - -# section: process_header {{{1 -###################################################### -def process_header(line): - -# print(repr(line)) - - sd,line=readbyte(line) - if sd==gf.DATA_REQUEST: - typ="DATA_REQUEST --->" - elif sd==gf.DATA_MESSAGE: - typ="DATA_MESSAGE --->" - elif sd==gf.DATA_REPLY: - typ="<--- DATA_REPLY" - else: - typ="**** DATA_ERROR ****" - print("Data Type:",typ,"Start Delimiter:",sd) - return typ,sd,0,0,0,line - le,line=readbyte(line) - da,line=readbyte(line) - sa,line=readbyte(line) - if sd==gf.DATA_REQUEST and da==gf.DA_BROADCAST_CONNECT: - typ="CONNECTION_REQUEST ===>" - if sd==gf.DATA_REQUEST and da==gf.DA_BROADCAST_REQUEST: - typ="DATA_REQUEST ===>" - if sd==gf.DATA_MESSAGE and da==gf.DA_BROADCAST_MESSAGE: - typ="DATA_MESSAGE ===>" - print(typ) - print("Length:",le,"Destination Addr:",da,"Source Addr:",sa) - return typ,sd,le,da,sa,line - -# section: process_apdu {{{1 -###################################################### -def process_apdu(line): - cl,line=readbyte(line) - cl=cl&0x1F - le,line=readbyte(line) - os=(le&0xC0)>>6 - le=le&0x3F - print(gf.operation[os],"Cl.",cl,"Len.",le) -# print(gf.operation[os],"Cl. {02}",cl) - return cl,os,le,line - -# section: process_data {{{1 -###################################################### -def process_data(line,le,size1,size2): - num=int(le/(size1+size2)) - ids=[0]*num - val=[0]*num - for i in range(0,num): - if size1>0: - ids[i],line=readbyte(line) - for j in range(0,size2): - tmp,line=readbyte(line) - val[i]=(val[i]<<8)+tmp - if size1>0 and size2>0: - print("Id:",ids[i],repr(gf.params[cl][ids[i]]),"=",val[i]) - elif size1>0: - print("Id:",ids[i],repr(gf.params[cl][ids[i]])) - elif size2>0: - print("=",val[i]) - return ids,val,line - -# section: process_string {{{1 -###################################################### -def process_string(line,le,size1,size2): - ids=[0]*size1 - val=[0]*size2 - if size1>0: - ids,line=readbyte(line) - for i in range(0,size2): - val[i],line=readbyte(line) - string=''.join(chr(i) for i in val) - string=string[:-1] - if size1>0 and size2>0: - print("Id:",ids,repr(gf.params[cl][ids]),"=",repr(string)) - elif size1>0: - print("Id:",ids,repr(gf.params[cl][ids])) - elif size2>0: - print("=",repr(string)) - return ids,val,line - -# section: process_object {{{1 -###################################################### -def process_object(line,le,size1,size2): - ids=[0]*size1 - val=[0]*size2 - if size1>0: - ids,line=readbyte(line) - for i in range(0,size2): - val[i],line=readbyte(line) - - if size1>0 and size2>0: - print("Id:",ids,repr(gf.params[cl][ids]),"=",val) - elif size1>0: - print("Id:",ids,repr(gf.params[cl][ids])) - elif size2>0: - print("=",val) - return ids,val,line - -# section: process_crc {{{1 -###################################################### -def process_crc(line): - crc1,line=readbyte(line) - crc2,line=readbyte(line) - crc1=format(crc1,'02X') - crc2=format(crc2,'02X') - crc=crc1+' '+crc2 -# print("CRC:",crc) - return crc - -# section: process_telegram {{{1 -###################################################### -def process_telegram(line): - # section: headers {{{2 - global cl - # Check if timestamp exists - ts,line=readtimestamp(line) - # Filter non geni data if glowpan frame - isgenidata,line=checkglowpan(line) - if not isgenidata: return - # Check if line is ok - iscrcok=checkcrc(line) - if not iscrcok: return - # Process geni data - typ,ds,le,da,sa,line=process_header(line) - numbytes=le-2 - while numbytes>0 and len(line)>=2*numbytes: - print("--------------------------------------------------------------------") - cl,os,ale,line=process_apdu(line) - numbytes=numbytes-2-ale - # section: classes {{{2 - if cl==2 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids2,val2,line=process_data(line,ale,1,0) - elif cl==2 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids2,val2,line=process_data(line,ale,0,1) - elif cl==2 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids2,val2,line=process_data(line,ale,1,0) - elif cl==2 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids2,val2,line=process_data(line,ale,0,4) - elif cl==3 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids3,val3,line=process_data(line,ale,1,0) - elif cl==3 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids3,val3,line=process_data(line,ale,1,0) - elif cl==3 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids3,val3,line=process_data(line,ale,0,4) - elif cl==4 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids4,val4,line=process_data(line,ale,1,0) - elif cl==4 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids4,val4,line=process_data(line,ale,0,1) - elif cl==4 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids4,val4,line=process_data(line,ale,1,1) - elif cl==4 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids4,val4,line=process_data(line,ale,1,0) - elif cl==4 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids4,val4,line=process_data(line,ale,0,4) - elif cl==5 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids5,val5,line=process_data(line,ale,1,0) - elif cl==5 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids5,val5,line=process_data(line,ale,0,1) - elif cl==5 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids5,val5,line=process_data(line,ale,1,1) - elif cl==5 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids5,val5,line=process_data(line,ale,1,0) - elif cl==5 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids5,val5,line=process_data(line,ale,0,4) - elif cl==7 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids7,val7,line=process_string(line,ale,1,0) - elif cl==7 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids7,val7,line=process_string(line,ale,0,ale) - elif cl==7 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids7,val7,line=process_string(line,ale,1,ale-1) - elif cl==10 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids10,val10,line=process_object(line,ale,1,0) - elif cl==10 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids10,val10,line=process_object(line,ale,0,ale) - elif cl==10 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids10,val10,line=process_object(line,ale,1,ale-1) - elif cl==11 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids11,val11,line=process_data(line,ale,1,0) - elif cl==11 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids11,val11,line=process_data(line,ale,0,2) - elif cl==11 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids11,val11,line=process_data(line,ale,1,2) - elif cl==11 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids11,val11,line=process_data(line,ale,1,0) - elif cl==11 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids11,val11,line=process_data(line,ale,0,4) - elif cl==12 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids12,val12,line=process_data(line,ale,1,0) - elif cl==12 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids12,val12,line=process_data(line,ale,0,2) - elif cl==12 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids12,val12,line=process_data(line,ale,1,2) - elif cl==12 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids12,val12,line=process_data(line,ale,1,0) - elif cl==12 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids12,val12,line=process_data(line,ale,0,4) - elif cl==13 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids13,val13,line=process_data(line,ale,1,0) - elif cl==13 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids13,val13,line=process_data(line,ale,0,2) - elif cl==13 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids13,val13,line=process_data(line,ale,1,2) - elif cl==13 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids13,val13,line=process_data(line,ale,1,0) - elif cl==13 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids13,val13,line=process_data(line,ale,0,4) - elif cl==14 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids14,val14,line=process_data(line,ale,1,0) - elif cl==14 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids14,val14,line=process_data(line,ale,0,3) - elif cl==14 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids14,val14,line=process_data(line,ale,1,3) - elif cl==14 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids14,val14,line=process_data(line,ale,1,0) - elif cl==14 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids14,val14,line=process_data(line,ale,0,4) - elif cl==15 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids15,val15,line=process_data(line,ale,1,0) - elif cl==15 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids15,val15,line=process_data(line,ale,0,3) - elif cl==15 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids15,val15,line=process_data(line,ale,1,3) - elif cl==15 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids15,val15,line=process_data(line,ale,1,0) - elif cl==15 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids15,val15,line=process_data(line,ale,0,4) - elif cl==16 and ds==gf.DATA_REQUEST and os==gf.OS_GET: - ids16,val16,line=process_data(line,ale,1,0) - elif cl==16 and ds==gf.DATA_REPLY and os==gf.OS_GET: - ids16,val16,line=process_data(line,ale,0,3) - elif cl==16 and (ds==gf.DATA_REQUEST or ds==gf.DATA_MESSAGE) and os==gf.OS_SET: - ids16,val16,line=process_data(line,ale,1,3) - elif cl==16 and ds==gf.DATA_REQUEST and os==gf.OS_INFO: - ids16,val16,line=process_data(line,ale,1,0) - elif cl==16 and ds==gf.DATA_REPLY and os==gf.OS_INFO: - ids16,val16,line=process_data(line,ale,0,4) - else: - line=line[ale*3:] -# section: filtering {{{2 - if cl==5: - td,master,speed=dbg_speed(ids5,val5,ts,sa) - crc=process_crc(line) - return - -# section: main {{{1 -###################################################### -# section: serial {{{2 -lsser=serial_ports() -ser=serial.Serial() -ser.port=lsser[0].device -ser.baudrate=9600 -ser.parity=serial.PARITY_NONE -ser.stopbits=serial.STOPBITS_ONE -ser.bytesize=serial.EIGHTBITS -ser.timeout=40 # msec -ser.open() -print("Connected to",repr(ser.portstr)) - -while True: - print("====================================================================") - line=ser.readline() - print(line) - process_telegram(line) -ser.close() - - - -#for line in fileinput.input(): -# print("====================================================================") -## print(line) -# process_telegram(line) -# - - -# section: plot {{{2 -###################################################### - -# Calculate timedelta -if len(td)==0: exit() -t0=td[0] -td[:]=[x-t0 for x in td] - -# Make a plot -fig=plt.figure() -plt.xlabel('time/s') -plt.ylabel('speed/upper') -plt.plot(td,speed[0],'green') -plt.plot(td,speed[1],'red') -plt.plot(td,speed[2],'blue') -plt.plot(td,speed[3],'magenta') -plt.legend('1234') -plt.plot(td,master,'black') -plt.title('multipump') -plt.show() -plt.close(fig) - -- 2.43.0