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
+| Connect |
+Klasse fuer den RevPi Connect. |
+
| Core |
Klasse fuer den RevPi Core. |
@@ -40,6 +43,78 @@ Functions
| None |
+
+Connect
+
+Klasse fuer den RevPi Connect.
+
+ Stellt Funktionen fuer die LEDs, Watchdog und den Status zur Verfuegung.
+
+
+
+
+Derived from
+Core
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+| _devconfigure |
+Connect-Klasse vorbereiten. |
+
+| _get_leda3 |
+Gibt den Zustand der LED A3 vom Connect zurueck. |
+
+| _set_leda3 |
+Setzt den Zustand der LED A3 vom Connect. |
+
+
+
+Static Methods
+
+
+
+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
+
+
+
+
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