diff --git a/doc/revpimodio2.device.html b/doc/revpimodio2.device.html index c67d0b4..717b007 100644 --- a/doc/revpimodio2.device.html +++ b/doc/revpimodio2.device.html @@ -18,6 +18,9 @@ Global Attributes Classes + + + @@ -40,6 +43,78 @@ Functions
ConnectKlasse fuer den RevPi Connect.
Core Klasse fuer den RevPi Core.
None


+ +

Connect

+

+Klasse fuer den RevPi Connect. +

+ Stellt Funktionen fuer die LEDs, Watchdog und den Status zur Verfuegung. +

+ +

+

+Derived from

+Core +

+Class Attributes

+ + +
A3
+

+Class Methods

+ + +
None
+

+Methods

+ + + + + + + + + + + +
_devconfigureConnect-Klasse vorbereiten.
_get_leda3Gibt den Zustand der LED A3 vom Connect zurueck.
_set_leda3Setzt den Zustand der LED A3 vom Connect.
+

+Static Methods

+ + +
None
+ +

+Connect._devconfigure

+_devconfigure() +

+Connect-Klasse vorbereiten. +

+

+Connect._get_leda3

+_get_leda3() +

+Gibt den Zustand der LED A3 vom Connect zurueck. +

+
Returns:
+
+0=aus, 1=gruen, 2=rot +
+
+

+Connect._set_leda3

+_set_leda3(value) +

+Setzt den Zustand der LED A3 vom Connect. +

+
value
+
+0=aus, 1=gruen, 2=rot +
+
+
Up
+

Core

@@ -73,19 +148,22 @@ Methods Core-Klasse vorbereiten. _get_leda1 -Gibt den Zustand der LED A1 vom core zurueck. +Gibt den Zustand der LED A1 vom Core zurueck. _get_leda2 -Gibt den Zustand der LED A2 vom core zurueck. +Gibt den Zustand der LED A2 vom Core zurueck. _get_status Gibt den RevPi Core Status zurueck. +_set_calculatedled +Berechnet und setzt neuen Bytewert fuer LED byte. + _set_leda1 -Setzt den Zustand der LED A1 vom core. +Setzt den Zustand der LED A1 vom Core. _set_leda2 -Setzt den Zustand der LED A2 vom core. +Setzt den Zustand der LED A2 vom Core. errorlimit1 Setzt RS485 ErrorLimit1 auf neuen Wert. @@ -156,7 +234,7 @@ Core-Klasse vorbereiten. Core._get_leda1 _get_leda1()

-Gibt den Zustand der LED A1 vom core zurueck. +Gibt den Zustand der LED A1 vom Core zurueck.

Returns:
@@ -167,7 +245,7 @@ Gibt den Zustand der LED A1 vom core zurueck. Core._get_leda2 _get_leda2()

-Gibt den Zustand der LED A2 vom core zurueck. +Gibt den Zustand der LED A2 vom Core zurueck.

Returns:
@@ -184,12 +262,26 @@ Gibt den RevPi Core Status zurueck.
Status als
+
+

+Core._set_calculatedled

+_set_calculatedled(addresslist, shifted_value) +

+Berechnet und setzt neuen Bytewert fuer LED byte. +

+
addresslist
+
+Liste der Vergleicher +
shifed_value
+
+Bits vergleichen +

Core._set_leda1

_set_leda1(value)

-Setzt den Zustand der LED A1 vom core. +Setzt den Zustand der LED A1 vom Core.

value
@@ -200,7 +292,7 @@ Setzt den Zustand der LED A1 vom core. Core._set_leda2 _set_leda2(value)

-Setzt den Zustand der LED A2 vom core. +Setzt den Zustand der LED A2 vom Core.

value
diff --git a/doc/revpimodio2.netio.html b/doc/revpimodio2.netio.html index 801fb5d..0f6943f 100644 --- a/doc/revpimodio2.netio.html +++ b/doc/revpimodio2.netio.html @@ -128,7 +128,15 @@ NetFH (Constructor) NetFH(address, timeout=500)

Init NetFH-class. -

+

+
address
+
+IP Adresse des RevPi +
timeout
+
+Timeout in Millisekunden der Verbindung +
+

NetFH.__del__

__del__() diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api index 8caa1cc..c02b6a2 100644 --- a/eric-revpimodio2.api +++ b/eric-revpimodio2.api @@ -9,12 +9,17 @@ revpimodio2.RED?7 revpimodio2.RISING?7 revpimodio2.app.App?1(app) revpimodio2.consttostr?4(value) +revpimodio2.device.Connect.A3?7 +revpimodio2.device.Connect._devconfigure?5() +revpimodio2.device.Connect._get_leda3?5() +revpimodio2.device.Connect._set_leda3?5(value) revpimodio2.device.Core.A1?7 revpimodio2.device.Core.A2?7 revpimodio2.device.Core._devconfigure?5() revpimodio2.device.Core._get_leda1?5() revpimodio2.device.Core._get_leda2?5() revpimodio2.device.Core._get_status?5() +revpimodio2.device.Core._set_calculatedled?5(addresslist, shifted_value) revpimodio2.device.Core._set_leda1?5(value) revpimodio2.device.Core._set_leda2?5(value) revpimodio2.device.Core.errorlimit1?4(value) diff --git a/eric-revpimodio2.bas b/eric-revpimodio2.bas index 0edb3bc..9dcf76d 100644 --- a/eric-revpimodio2.bas +++ b/eric-revpimodio2.bas @@ -1,3 +1,4 @@ +Connect Core Core Device EventCallback Thread Gateway Device diff --git a/revpimodio2/device.py b/revpimodio2/device.py index 472ffee..5dab905 100644 --- a/revpimodio2/device.py +++ b/revpimodio2/device.py @@ -246,6 +246,7 @@ class Device(object): self, dict_io[key], iotype, "little", + # Bei AIO (103) signed auf True setzen self._producttype == 103 ) @@ -421,7 +422,7 @@ class Core(Device): self._ioerrorlimit1 = 4 self._ioerrorlimit2 = 5 elif int_lenio == 8: - # core 1.2 + # Core 1.2 self._iocycle = 1 self._ioerrorcnt = 2 self._iotemperature = 3 @@ -449,14 +450,13 @@ class Core(Device): @return Aktuellen ErrorLimit oder None wenn nicht verfuegbar""" if errorlimit is None: return None if io_id is None else int.from_bytes( - self.__lst_io[io_id].get_value(), - byteorder=self.__lst_io[io_id]._byteorder + self.__lst_io[io_id].get_value(), byteorder="little" ) else: if 0 <= errorlimit <= 65535: - self.__lst_io[io_id].set_value(errorlimit.to_bytes( - 2, byteorder=self.__lst_io[io_id]._byteorder - )) + self.__lst_io[io_id].set_value( + errorlimit.to_bytes(2, byteorder="little") + ) else: raise ValueError( "errorlimit value must be between 0 and 65535" @@ -466,50 +466,65 @@ class Core(Device): """Gibt den RevPi Core Status zurueck. @return Status als """ return int.from_bytes( - self.__lst_io[0].get_value(), byteorder=self.__lst_io[0]._byteorder + self.__lst_io[0].get_value(), byteorder="little" ) def _get_leda1(self): - """Gibt den Zustand der LED A1 vom core zurueck. + """Gibt den Zustand der LED A1 vom Core zurueck. @return 0=aus, 1=gruen, 2=rot""" int_led = int.from_bytes( - self.__lst_io[self._ioled].get_value(), - byteorder=self.__lst_io[self._ioled]._byteorder + self.__lst_io[self._ioled].get_value(), byteorder="little" ) led = int_led & 1 led += int_led & 2 return led def _get_leda2(self): - """Gibt den Zustand der LED A2 vom core zurueck. + """Gibt den Zustand der LED A2 vom Core zurueck. @return 0=aus, 1=gruen, 2=rot""" int_led = int.from_bytes( - self.__lst_io[self._ioled].get_value(), - byteorder=self.__lst_io[self._ioled]._byteorder + self.__lst_io[self._ioled].get_value(), byteorder="little" ) >> 2 led = int_led & 1 led += int_led & 2 return led + def _set_calculatedled(self, addresslist, shifted_value): + """Berechnet und setzt neuen Bytewert fuer LED byte. + @param addresslist Liste der Vergleicher + @param shifed_value Bits vergleichen""" + # Byte als int holen + int_led = int.from_bytes( + self.__lst_io[self._ioled].get_value(), byteorder="little" + ) + + for int_bit in addresslist: + value = bool(shifted_value & int_bit) + if bool(int_led & 1) != value: + # Berechnen, wenn verändert + if value: + int_led += int_bit + else: + int_led -= int_bit + + # Zurückschreiben wenn verändert + self.__lst_io[self._ioled].set_value( + int_led.to_bytes(length=1, byteorder="little") + ) + def _set_leda1(self, value): - """Setzt den Zustand der LED A1 vom core. + """Setzt den Zustand der LED A1 vom Core. @param value 0=aus, 1=gruen, 2=rot""" if 0 <= value <= 3: - int_led = (self._get_leda2() << 2) + value - self.__lst_io[self._ioled].set_value(int_led.to_bytes( - length=1, byteorder=self.__lst_io[self._ioled]._byteorder - )) + self._set_calculatedled([1, 2], value) else: raise ValueError("led status must be between 0 and 3") def _set_leda2(self, value): - """Setzt den Zustand der LED A2 vom core. + """Setzt den Zustand der LED A2 vom Core. @param value 0=aus, 1=gruen, 2=rot""" if 0 <= value <= 3: - int_led = (value << 2) + self._get_leda1() - self.__lst_io[self._ioled].set_value(int_led.to_bytes( - length=1, byteorder=self.__lst_io[self._ioled]._byteorder - )) + self._set_calculatedled([4, 8], value << 2) else: raise ValueError("led status must be between 0 and 3") @@ -522,8 +537,7 @@ class Core(Device): """Statusbit fuer piControl-Treiber laeuft. @return True, wenn Treiber laeuft""" return bool(int.from_bytes( - self.__lst_io[0].get_value(), - byteorder=self.__lst_io[0]._byteorder + self.__lst_io[0].get_value(), byteorder="little" ) & 1) @property @@ -531,8 +545,7 @@ class Core(Device): """Statusbit fuer ein IO-Modul nicht mit PiCtory konfiguriert. @return True, wenn IO Modul nicht konfiguriert""" return bool(int.from_bytes( - self.__lst_io[0].get_value(), - byteorder=self.__lst_io[0]._byteorder + self.__lst_io[0].get_value(), byteorder="little" ) & 2) @property @@ -540,8 +553,7 @@ class Core(Device): """Statusbit fuer ein IO-Modul fehlt oder piGate konfiguriert. @return True, wenn IO-Modul fehlt oder piGate konfiguriert""" return bool(int.from_bytes( - self.__lst_io[0].get_value(), - byteorder=self.__lst_io[0]._byteorder + self.__lst_io[0].get_value(), byteorder="little" ) & 4) @property @@ -549,8 +561,7 @@ class Core(Device): """Statusbit Modul belegt mehr oder weniger Speicher als konfiguriert. @return True, wenn falscher Speicher belegt ist""" return bool(int.from_bytes( - self.__lst_io[0].get_value(), - byteorder=self.__lst_io[0]._byteorder + self.__lst_io[0].get_value(), byteorder="little" ) & 8) @property @@ -558,8 +569,7 @@ class Core(Device): """Statusbit links vom RevPi ist ein piGate Modul angeschlossen. @return True, wenn piGate links existiert""" return bool(int.from_bytes( - self.__lst_io[0].get_value(), - byteorder=self.__lst_io[0]._byteorder + self.__lst_io[0].get_value(), byteorder="little" ) & 16) @property @@ -567,8 +577,7 @@ class Core(Device): """Statusbit rechts vom RevPi ist ein piGate Modul angeschlossen. @return True, wenn piGate rechts existiert""" return bool(int.from_bytes( - self.__lst_io[0].get_value(), - byteorder=self.__lst_io[0]._byteorder + self.__lst_io[0].get_value(), byteorder="little" ) & 32) @property @@ -576,8 +585,7 @@ class Core(Device): """Gibt Zykluszeit der Prozessabbildsynchronisierung zurueck. @return Zykluszeit in ms""" return None if self._iocycle is None else int.from_bytes( - self.__lst_io[self._iocycle].get_value(), - byteorder=self.__lst_io[self._iocycle]._byteorder + self.__lst_io[self._iocycle].get_value(), byteorder="little" ) @property @@ -585,8 +593,7 @@ class Core(Device): """Gibt CPU-Temperatur zurueck. @return CPU-Temperatur in Celsius""" return None if self._iotemperature is None else int.from_bytes( - self.__lst_io[self._iotemperature].get_value(), - byteorder=self.__lst_io[self._iotemperature]._byteorder + self.__lst_io[self._iotemperature].get_value(), byteorder="little" ) @property @@ -594,8 +601,7 @@ class Core(Device): """Gibt CPU Taktfrequenz zurueck. @return CPU Taktfrequenz in MHz""" return None if self._iofrequency is None else int.from_bytes( - self.__lst_io[self._iofrequency].get_value(), - byteorder=self.__lst_io[self._iofrequency]._byteorder + self.__lst_io[self._iofrequency].get_value(), byteorder="little" ) * 10 @property @@ -603,8 +609,7 @@ class Core(Device): """Gibt Fehleranzahl auf RS485 piBridge Bus zurueck. @return Fehleranzahl der piBridge""" return None if self._ioerrorcnt is None else int.from_bytes( - self.__lst_io[self._ioerrorcnt].get_value(), - byteorder=self.__lst_io[self._ioerrorcnt]._byteorder + self.__lst_io[self._ioerrorcnt].get_value(), byteorder="little" ) @property @@ -632,6 +637,79 @@ class Core(Device): self.__errorlimit(self._ioerrorlimit2, value) +class Connect(Core): + + """Klasse fuer den RevPi Connect. + + Stellt Funktionen fuer die LEDs, Watchdog und den Status zur Verfuegung. + + """ + + def _devconfigure(self): + """Connect-Klasse vorbereiten.""" + super()._devconfigure() + + # TODO: IO Objekte für WD und X2 erzeugen + self.wd = None + self.x2in = None + self.x2out = None + + def _get_leda3(self): + """Gibt den Zustand der LED A3 vom Connect zurueck. + @return 0=aus, 1=gruen, 2=rot""" + int_led = int.from_bytes( + self.__lst_io[self._ioled].get_value(), byteorder="little" + ) >> 4 + led = int_led & 1 + led += int_led & 2 + return led + +# def _get_wd(self): +# """Gibt den Zustand des Watchdogs vom Connect zurueck. +# @return True / False muss getriggert werden""" +# int_led = int.from_bytes( +# self.__lst_io[self._ioled].get_value(), byteorder="little" +# ) +# return bool(int_led & 64) +# +# def _get_x2out(self): +# """Gibt den Zustand des Relais X2 vom Connect zurueck. +# @return True, wenn Relais geschlossen""" +# int_led = int.from_bytes( +# self.__lst_io[self._ioled].get_value(), byteorder="little" +# ) +# return bool(int_led & 128) + + def _set_leda3(self, value): + """Setzt den Zustand der LED A3 vom Connect. + @param value 0=aus, 1=gruen, 2=rot""" + if 0 <= value <= 3: + self._set_calculatedled([16, 32], value << 4) + else: + raise ValueError("led status must be between 0 and 3") + +# def _set_wd(self, value): +# """Setzt den Zustand des Watchdogs vom Connect. +# @param value True / False muss getriggert werden""" +# if isinstance(value, bool): +# self._set_calculatedled([128], 128) +# else: +# raise ValueError("value must be True / False") +# +# def _set_x2out(self, value): +# """Setzt den Zustand des Watchdogs vom Connect. +# @param value True / False muss getriggert werden""" +# if isinstance(value, bool): +# self._set_calculatedled([64], 64) +# else: +# raise ValueError("value must be True / False") + + A3 = property(_get_leda3, _set_leda3) +# WD = property(_get_wd, _set_wd) +# X2IN = property(_get_x2in) +# X2OUT = property(_get_x2out, _set_x2out) + + class Gateway(Device): """Klasse fuer die RevPi Gateway-Devices. diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index ff4c193..15472a7 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -150,10 +150,17 @@ class RevPiModIO(object): device["position"] += 1 if device["type"] == "BASE": - # Core - dev_new = devicemodule.Core( - self, device, simulator=self._simulator - ) + pt = int(device["productType"]) + if pt == 105: + # RevPi Connect + dev_new = devicemodule.Connect( + self, device, simulator=self._simulator + ) + else: + # RevPi Core immer als Fallback verwenden + dev_new = devicemodule.Core( + self, device, simulator=self._simulator + ) self.core = dev_new elif device["type"] == "LEFT_RIGHT": # IOs