From d714528c5a8ec8e4286176c5711398100bc2c23c Mon Sep 17 00:00:00 2001 From: Jean-Louis Dupond Date: Tue, 28 Jan 2020 17:26:45 +0100 Subject: [PATCH] Include needed PyCRC code --- dsmr_parser/parsers.py | 27 +++++++++++++++++++++++++-- setup.py | 1 - tox.ini | 1 - 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/dsmr_parser/parsers.py b/dsmr_parser/parsers.py index 4b415f6..4609287 100644 --- a/dsmr_parser/parsers.py +++ b/dsmr_parser/parsers.py @@ -1,7 +1,7 @@ import logging import re -from PyCRC.CRC16 import CRC16 +from ctypes import c_ushort from dsmr_parser.objects import MBusObject, CosemObject, Telegram from dsmr_parser.exceptions import ParseError, InvalidChecksumError @@ -79,7 +79,7 @@ class TelegramParser(object): 'incomplete. The checksum and/or content values are missing.' ) - calculated_crc = CRC16().calculate(checksum_contents.group(0)) + calculated_crc = TelegramParser.crc16(checksum_contents.group(0)) expected_crc = int(checksum_hex.group(0), base=16) if calculated_crc != expected_crc: @@ -91,6 +91,29 @@ class TelegramParser(object): ) ) + @staticmethod + def crc16(telegram): + crc16_tab = [] + + for i in range(0, 256): + crc = c_ushort(i).value + for j in range(0, 8): + if (crc & 0x0001): + crc = c_ushort(crc >> 1).value ^ 0xA001 + else: + crc = c_ushort(crc >> 1).value + crc16_tab.append(hex(crc)) + + crcValue = 0x0000 + + for c in telegram: + d = ord(c) + tmp = crcValue ^ d + rotated = c_ushort(crcValue >> 8).value + crcValue = rotated ^ int(crc16_tab[(tmp & 0x00ff)], 0) + + return crcValue + class DSMRObjectParser(object): """ diff --git a/setup.py b/setup.py index e1f0139..7c54d73 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,6 @@ setup( 'pyserial>=3,<4', 'pyserial-asyncio<1', 'pytz', - 'PyCRC>=1.2,<2' ], entry_points={ 'console_scripts': ['dsmr_console=dsmr_parser.__main__:console'] diff --git a/tox.ini b/tox.ini index 23fe214..3efa213 100644 --- a/tox.ini +++ b/tox.ini @@ -9,7 +9,6 @@ deps= pytest-asyncio pytest-catchlog pytest-mock - PyCRC commands= py.test --cov=dsmr_parser test {posargs} pylama dsmr_parser test