From 79164bd41b08179e11161f1c6da98bf3523f9c0a Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Sat, 10 Oct 2020 14:14:57 +0200 Subject: [PATCH] Add support for RevPi Flat --- revpimodio2/__init__.py | 2 +- revpimodio2/device.py | 278 +++++++++++++++++++++++++++++++++++++++- revpimodio2/modio.py | 6 + setup.py | 2 +- 4 files changed, 282 insertions(+), 6 deletions(-) diff --git a/revpimodio2/__init__.py b/revpimodio2/__init__.py index 747e8fc..e65841c 100644 --- a/revpimodio2/__init__.py +++ b/revpimodio2/__init__.py @@ -22,7 +22,7 @@ __author__ = "Sven Sager " __copyright__ = "Copyright (C) 2020 Sven Sager" __license__ = "LGPLv3" __name__ = "revpimodio2" -__version__ = "2.5.3c" +__version__ = "2.5.3d" # Global package values OFF = 0 diff --git a/revpimodio2/device.py b/revpimodio2/device.py index 3426de9..11fb408 100644 --- a/revpimodio2/device.py +++ b/revpimodio2/device.py @@ -593,11 +593,13 @@ class Core(Base): exp_a1red = lst_led[1].export exp_a2green = lst_led[2].export exp_a2red = lst_led[3].export + # exp_wd = lst_led[7].export else: exp_a1green = lst_led[0].export exp_a1red = exp_a1green exp_a2green = exp_a1green exp_a2red = exp_a1green + # exp_wd = exp_a1green # Echte IOs erzeugen self.a1green = IOBase(self, [ @@ -907,12 +909,10 @@ class Connect(Core): exp_a3green = lst_led[4].export exp_a3red = lst_led[5].export exp_x2out = lst_led[6].export - exp_wd = lst_led[7].export else: exp_a3green = lst_led[0].export exp_a3red = exp_a3green exp_x2out = exp_a3green - exp_wd = exp_a3green lst_status = lst_myios[self._slc_statusbyte.start] if len(lst_status) == 8: exp_x2in = lst_status[6].export @@ -1013,7 +1013,7 @@ class Connect(Core): class Compact(Base): """ - Klasse fuer den RevPi Connect. + Klasse fuer den RevPi Compact. Stellt Funktionen fuer die LEDs zur Verfuegung. Auf IOs wird ueber das .io Objekt zugegriffen. @@ -1025,7 +1025,7 @@ class Compact(Base): def __setattr__(self, key, value): """Verhindert Ueberschreibung der LEDs.""" if hasattr(self, key) and key in ( - "a1green", "a1red", "a2green", "a2red"): + "a1green", "a1red", "a2green", "a2red", "wd"): raise AttributeError( "direct assignment is not supported - use .value Attribute" ) @@ -1160,6 +1160,276 @@ class Compact(Base): ) * 10 +class Flat(Base): + """ + Klasse fuer den RevPi Flat. + + Stellt Funktionen fuer die LEDs zur Verfuegung. Auf IOs wird ueber das .io + Objekt zugegriffen. + """ + + __slots__ = "_slc_temperature", "_slc_frequency", "_slc_led", \ + "a1green", "a1red", "a2green", "a2red", \ + "a3green", "a3red", "a4green", "a4red", \ + "a5green", "a5red", "wd" + + def __setattr__(self, key, value): + """Verhindert Ueberschreibung der LEDs.""" + if hasattr(self, key) and key in ( + "a1green", "a1red", "a2green", "a2red", + "a3green", "a3red", "a4green", "a4red", + "a5green", "a5red", "wd"): + raise AttributeError( + "direct assignment is not supported - use .value Attribute" + ) + else: + object.__setattr__(self, key, value) + + def _devconfigure(self) -> None: + """Core-Klasse vorbereiten.""" + + # Statische IO Verknüpfungen des Compacts + self._slc_led = slice(6, 8) + self._slc_temperature = slice(4, 5) + self._slc_frequency = slice(5, 6) + + # Exportflags prüfen (Byte oder Bit) + lst_led = self._modio.io[self._slc_devoff][self._slc_led.start] + if len(lst_led) == 8: + exp_a1green = lst_led[0].export + exp_a1red = lst_led[1].export + exp_a2green = lst_led[2].export + exp_a2red = lst_led[3].export + exp_a3green = lst_led[4].export + exp_a3red = lst_led[5].export + exp_a4green = lst_led[6].export + exp_a4red = lst_led[7].export + + # Next byte + lst_led = self._modio.io[self._slc_devoff][self._slc_led.start + 1] + exp_a5green = lst_led[0].export + exp_a5red = lst_led[1].export + else: + exp_a1green = lst_led[0].export + exp_a1red = exp_a1green + exp_a2green = exp_a1green + exp_a2red = exp_a1green + exp_a3green = exp_a1green + exp_a3red = exp_a1green + exp_a4green = exp_a1green + exp_a4red = exp_a1green + exp_a5green = exp_a1green + exp_a5red = exp_a1green + + # Echte IOs erzeugen + self.a1green = IOBase(self, [ + "core.a1green", 0, 1, self._slc_led.start, + exp_a1green, None, "LED_A1_GREEN", "0" + ], OUT, "little", False) + self.a1red = IOBase(self, [ + "core.a1red", 0, 1, self._slc_led.start, + exp_a1red, None, "LED_A1_RED", "1" + ], OUT, "little", False) + self.a2green = IOBase(self, [ + "core.a2green", 0, 1, self._slc_led.start, + exp_a2green, None, "LED_A2_GREEN", "2" + ], OUT, "little", False) + self.a2red = IOBase(self, [ + "core.a2red", 0, 1, self._slc_led.start, + exp_a2red, None, "LED_A2_RED", "3" + ], OUT, "little", False) + self.a3green = IOBase(self, [ + "core.a3green", 0, 1, self._slc_led.start, + exp_a3green, None, "LED_A3_GREEN", "4" + ], OUT, "little", False) + self.a3red = IOBase(self, [ + "core.a3red", 0, 1, self._slc_led.start, + exp_a3red, None, "LED_A3_RED", "5" + ], OUT, "little", False) + self.a4green = IOBase(self, [ + "core.a4green", 0, 1, self._slc_led.start, + exp_a4green, None, "LED_A4_GREEN", "6" + ], OUT, "little", False) + self.a4red = IOBase(self, [ + "core.a4red", 0, 1, self._slc_led.start, + exp_a4red, None, "LED_A4_RED", "7" + ], OUT, "little", False) + self.a5green = IOBase(self, [ + "core.a5green", 0, 1, self._slc_led.start, + exp_a5green, None, "LED_A5_GREEN", "8" + ], OUT, "little", False) + self.a5red = IOBase(self, [ + "core.a5red", 0, 1, self._slc_led.start, + exp_a5red, None, "LED_A5_RED", "9" + ], OUT, "little", False) + + # Software watchdog einrichten + self.wd = IOBase(self, [ + "core.wd", 0, 1, self._slc_led.start, + False, None, "WatchDog", "15" + ], OUT, "little", False) + + def _get_leda1(self) -> int: + """ + Get value of LED A1 from RevPi Flat device. + + :return: 0=off, 1=green, 2=red + """ + return self._ba_devdata[self._slc_led.start] & 0b11 + + def _get_leda2(self) -> int: + """ + Get value of LED A2 from RevPi Flat device. + + :return: 0=off, 1=green, 2=red + """ + return (self._ba_devdata[self._slc_led.start] & 0b1100) >> 2 + + def _get_leda3(self) -> int: + """ + Get value of LED A3 from RevPi Flat device. + + :return: 0=off, 1=green, 2=red + """ + return (self._ba_devdata[self._slc_led.start] & 0b110000) >> 4 + + def _get_leda4(self) -> int: + """ + Get value of LED A4 from RevPi Flat device. + + :return: 0=off, 1=green, 2=red + """ + return (self._ba_devdata[self._slc_led.start] & 0b11000000) >> 6 + + def _get_leda5(self) -> int: + """ + Get value of LED A5 from RevPi Flat device. + + :return: 0=off, 1=green, 2=red + """ + return self._ba_devdata[self._slc_led.start + 1] & 0b11 + + def _set_leda1(self, value: int) -> None: + """ + Set LED A1 on RevPi Flat device. + + :param value: 0=off, 1=green, 2=red + """ + if 0 <= value <= 3: + proc_value = self._ba_devdata[self._slc_led.start] + proc_value_calc = proc_value & 0b11 + if proc_value_calc == value: + return + # Set new value + self._ba_devdata[self._slc_led.start] = \ + proc_value - proc_value_calc + value + else: + raise ValueError("led status must be between 0 and 3") + + def _set_leda2(self, value: int) -> None: + """ + Set LED A2 on RevPi Flat device. + + :param value: 0=off, 1=green, 2=red + """ + if 0 <= value <= 3: + value <<= 2 + proc_value = self._ba_devdata[self._slc_led.start] + proc_value_calc = proc_value & 0b1100 + if proc_value_calc == value: + return + # Set new value + self._ba_devdata[self._slc_led.start] = \ + proc_value - proc_value_calc + value + else: + raise ValueError("led status must be between 0 and 3") + + def _set_leda3(self, value: int) -> None: + """ + Set LED A3 on RevPi Flat device. + + :param value: 0=off, 1=green, 2=red + """ + if 0 <= value <= 3: + value <<= 4 + proc_value = self._ba_devdata[self._slc_led.start] + proc_value_calc = proc_value & 0b110000 + if proc_value_calc == value: + return + # Set new value + self._ba_devdata[self._slc_led.start] = \ + proc_value - proc_value_calc + value + else: + raise ValueError("led status must be between 0 and 3") + + def _set_leda4(self, value: int) -> None: + """ + Set LED A4 on RevPi Flat device. + + :param value: 0=off, 1=green, 2=red + """ + if 0 <= value <= 3: + value <<= 6 + proc_value = self._ba_devdata[self._slc_led.start] + proc_value_calc = proc_value & 0b11000000 + if proc_value_calc == value: + return + # Set new value + self._ba_devdata[self._slc_led.start] = \ + proc_value - proc_value_calc + value + else: + raise ValueError("led status must be between 0 and 3") + + def _set_leda5(self, value: int) -> None: + """ + Set LED A5 on RevPi Flat device. + + :param value: 0=off, 1=green, 2=red + """ + if 0 <= value <= 3: + proc_value = self._ba_devdata[self._slc_led.start + 1] + proc_value_calc = proc_value & 0b11 + if proc_value_calc == value: + return + # Set new value + self._ba_devdata[self._slc_led.start + 1] = \ + proc_value - proc_value_calc + value + else: + raise ValueError("led status must be between 0 and 3") + + def wd_toggle(self): + """Toggle watchdog bit to prevent a timeout.""" + self.wd.value = not self.wd.value + + A1 = property(_get_leda1, _set_leda1) + A2 = property(_get_leda2, _set_leda2) + A3 = property(_get_leda3, _set_leda3) + A4 = property(_get_leda4, _set_leda4) + A5 = property(_get_leda5, _set_leda5) + + @property + def temperature(self) -> int: + """ + Gibt CPU-Temperatur zurueck. + + :return: CPU-Temperatur in Celsius (-273 wenn nich verfuegbar) + """ + return -273 if self._slc_temperature is None else int.from_bytes( + self._ba_devdata[self._slc_temperature], byteorder="little" + ) + + @property + def frequency(self) -> int: + """ + Gibt CPU Taktfrequenz zurueck. + + :return: CPU Taktfrequenz in MHz (-1 wenn nicht verfuegbar) + """ + return -1 if self._slc_frequency is None else int.from_bytes( + self._ba_devdata[self._slc_frequency], byteorder="little" + ) * 10 + + class DioModule(Device): """Stellt ein DIO / DI / DO Modul dar.""" diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index e7eb312..ed1756d 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -254,6 +254,12 @@ class RevPiModIO(object): self, device, simulator=self._simulator ) self.core = dev_new + elif pt == 135: + # RevPi Flat + dev_new = devicemodule.Flat( + self, device, simulator=self._simulator + ) + self.core = dev_new else: # Base immer als Fallback verwenden dev_new = devicemodule.Base( diff --git a/setup.py b/setup.py index f9a2c5f..77ae37e 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( license="LGPLv3", name="revpimodio2", - version="2.5.3c", + version="2.5.3d", packages=["revpimodio2"], python_requires="~=3.2",