diff --git a/MANIFEST.in b/MANIFEST.in index 36c28a0..54de927 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,3 +3,5 @@ include stdeb.cfg recursive-include data * recursive-include revpipycontrol * global-exclude *.pyc +include LICENSE.txt + diff --git a/doc/revpicheckclient.html b/doc/revpicheckclient.html index d9f1cc7..c522c95 100644 --- a/doc/revpicheckclient.html +++ b/doc/revpicheckclient.html @@ -87,6 +87,9 @@ Methods maxint Errechnet maximalen int() Wert für Bytes max 22. +minint +Errechnet maximalen int() Wert für Bytes max 22. + readvalues Ruft nur Input Werte von RevPi ab und aktualisiert Fenster. @@ -244,13 +247,29 @@ Versteckt alle Fenster.

RevPiCheckClient.maxint

-maxint(bytelen) +maxint(io)

Errechnet maximalen int() Wert für Bytes max 22.

-
bytelen
+
io
-Anzahl Bytes +IO-Liste, deren Wert berechnet werden soll +
+
+
Returns:
+
+int() max oder 0 bei Überschreitung +
+
+

+RevPiCheckClient.minint

+minint(io) +

+Errechnet maximalen int() Wert für Bytes max 22. +

+
io
+
+IO-Liste, deren Wert berechnet werden soll
Returns:
diff --git a/eric-revpipycontrol.api b/eric-revpipycontrol.api index da05dce..1f979b5 100644 --- a/eric-revpipycontrol.api +++ b/eric-revpipycontrol.api @@ -53,7 +53,8 @@ revpicheckclient.RevPiCheckClient._onfrmconf?5(canvas) revpicheckclient.RevPiCheckClient._warnwrite?5() revpicheckclient.RevPiCheckClient._workvalues?5(io_dicts=None, writeout=False) revpicheckclient.RevPiCheckClient.hideallwindows?4() -revpicheckclient.RevPiCheckClient.maxint?4(bytelen) +revpicheckclient.RevPiCheckClient.maxint?4(io) +revpicheckclient.RevPiCheckClient.minint?4(io) revpicheckclient.RevPiCheckClient.readvalues?4() revpicheckclient.RevPiCheckClient.refreshvalues?4() revpicheckclient.RevPiCheckClient.tmr_workvalues?4() diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py index d13cf22..c98b127 100644 --- a/revpipycontrol/revpicheckclient.py +++ b/revpipycontrol/revpicheckclient.py @@ -101,7 +101,7 @@ class RevPiCheckClient(tkinter.Frame): try: newvalue = io[5].get() # Wertebereich prüfen - if newvalue < 0 or newvalue > self.maxint(io[1]): + if not self.minint(io) <= newvalue <= self.maxint(io): raise ValueError("too big") self.__chval(device, io) @@ -168,7 +168,7 @@ class RevPiCheckClient(tkinter.Frame): # IOs generieren rowcount = 0 for io in lst_io: - # io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)] + # io = [name,blen,baddr,bmk,bitaddr,(tkinter_var),border,signed] tkinter.Label(s_frame, text=io[0]).grid( column=1, row=rowcount, sticky="w" @@ -185,7 +185,11 @@ class RevPiCheckClient(tkinter.Frame): check.grid(column=0, row=rowcount) else: var = tkinter.IntVar() - txt = tkinter.Spinbox(s_frame, to=self.maxint(io[1])) + txt = tkinter.Spinbox( + s_frame, + from_=self.minint(io), + to=self.maxint(io), + ) txt.bind( "", lambda event, tkvar=var: self.__saveoldvalue(event, tkvar) @@ -198,13 +202,13 @@ class RevPiCheckClient(tkinter.Frame): txt["command"] = \ lambda device=device, io=io: self.__chval(device, io) txt["state"] = "disabled" if iotype == "inp" or \ - self.maxint(io[1]) == 0 else "normal" + self.maxint(io) == 0 else "normal" txt["width"] = 5 txt["textvariable"] = var txt.grid(column=0, row=rowcount) # Steuerelementvariable in IO übernehmen (mutabel) - io.append(var) + io.insert(5, var) rowcount += 1 @@ -345,7 +349,7 @@ class RevPiCheckClient(tkinter.Frame): xmlmc = MultiCall(self.cli) for dev in self.dict_devices: - # io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)] + # io = [name,blen,baddr,bmk,bitaddr,(tkinter_var),border,signed] # IO Typ verarbeiten for iotype in io_dicts: @@ -358,7 +362,9 @@ class RevPiCheckClient(tkinter.Frame): # Bytes umwandeln int_byte = int.from_bytes( - ba_values[io[2]:io[2] + io[1]], byteorder="little" + ba_values[io[2]:io[2] + io[1]], + byteorder="little" if len(io) < 7 else io[6], + signed=False if len(io) < 8 else io[7], ) if io[4] >= 0: # Bit-IO @@ -384,11 +390,35 @@ class RevPiCheckClient(tkinter.Frame): for win in self.dict_wins: self.dict_wins[win].withdraw() - def maxint(self, bytelen): + def maxint(self, io): u"""Errechnet maximalen int() Wert für Bytes max 22. - @param bytelen Anzahl Bytes + @param io IO-Liste, deren Wert berechnet werden soll @return int() max oder 0 bei Überschreitung""" - return 0 if bytelen > 22 else 256 ** bytelen - 1 + # io = [name,blen,baddr,bmk,bitaddr,(tkinter_var),border,signed] + bytelen = io[1] + if bytelen == 0: + return 0 + signed = io[-1] if type(io[-1]) == bool else False + return 0 if bytelen > 22 else int.from_bytes( + (b'\x7f' if signed else b'\xff') + b'\xff' * (bytelen - 1), + byteorder="big" + ) + + def minint(self, io): + u"""Errechnet maximalen int() Wert für Bytes max 22. + @param io IO-Liste, deren Wert berechnet werden soll + @return int() max oder 0 bei Überschreitung""" + # io = [name,blen,baddr,bmk,bitaddr,(tkinter_var),border,signed] + bytelen = io[1] + if bytelen == 0: + return 0 + signed = io[-1] if type(io[-1]) == bool else False + rc = 0 if bytelen > 22 or not signed else int.from_bytes( + b'\x80' + b'\x00' * (bytelen - 1), + byteorder="big", + signed=True + ) + return rc def readvalues(self): u"""Ruft nur Input Werte von RevPi ab und aktualisiert Fenster."""