diff --git a/snippets/test8.py b/snippets/test8.py index c8e02a3..8cdaa15 100644 --- a/snippets/test8.py +++ b/snippets/test8.py @@ -5,6 +5,7 @@ import socketserver import cmd import io import paho.mqtt.client as mqtt +import re class Config(object): @@ -233,6 +234,18 @@ class MyPriorityQueue(queue.PriorityQueue): i = super()._get() return i.itemWithPriority +class CmdInterpreterException(ValueError): pass + +def parseIntArbitraryBase(s): + i = 0 + if s.startswith('0x'): + i = int(s, 16) + elif s.startswith('0b'): + i = int(s, 2) + else: + i = int(s, 10) + return i + class CmdInterpreter(cmd.Cmd): def __init__(self, infile, outfile, notifier, registers): super().__init__(stdin=infile, stdout=outfile) @@ -241,6 +254,7 @@ class CmdInterpreter(cmd.Cmd): self.registers = registers self.prompt = "test8> " self.intro = "test8 admin interface" + self.splitterRe = re.compile('\s+') def __print(self, text): self.stdout.write(text) @@ -260,12 +274,79 @@ class CmdInterpreter(cmd.Cmd): self.__println("Bye!") return True + def do_add(self, arg): + try: + (registerType, label, unit, address, count, scanrate, readTopic, writeTopic, feedbackTopic) = self.splitterRe.split(arg) + self.__println("RegisterType: {0}".format(registerType)) + self.__println("Label: {0}".format(label)) + self.__println("Unit: {0}".format(unit)) + self.__println("Address: {0}".format(address)) + self.__println("Count: {0}".format(count)) + self.__println("ScanRate: {0}".format(scanrate)) + self.__println("ReadTopic: {0}".format(readTopic)) + self.__println("WriteTopic: {0}".format(writeTopic)) + self.__println("FeedbackTopic: {0}".format(feedbackTopic)) + + if readTopic == 'None': + readTopic = None + if writeTopic == 'None': + writeTopic = None + if feedbackTopic == 'None': + feedbackTopic = None + unit = parseIntArbitraryBase(unit) + address = parseIntArbitraryBase(address) + count = parseIntArbitraryBase(count) + scanrate = float(scanrate) + if scanrate == 0: + if readTopic: + raise CmdInterpreterException('readTopic must not be set when scanRate is zero') + if not writeTopic: + raise CmdInterpreterException('writeTopic must be set when scanRate is zero') + if not feedbackTopic: + raise CmdInterpreterException('feedbackTopic must be set when scanRate is zero') + else: + if not readTopic: + raise CmdInterpreterException('readTopic must be set when scanRate is zero') + if writeTopic: + raise CmdInterpreterException('writeTopic must not be set when scanRate is zero') + if feedbackTopic: + raise CmdInterpreterException('feedbackTopic must not be set when scanRate is zero') + if registerType not in ['HoldingRegister']: + raise CmdInterpreterException('Unknown register type {0}'.format(registerType)) + + + except ValueError as e: + self.__println("ERROR: {0!s}, {1!s}".format(e.__class__.__name__, e)) + + def help_add(self): + # HoldingRegisterDatapoint('Voltage', 1, 0x2000, 2, datetime.timedelta(seconds=10), 'Pub/Voltage', None, None), + self.__println("Usage: add