]> Repositories - Adafruit_Blinka-hackapet.git/blobdiff - src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogout.py
Added Rock Pi S
[Adafruit_Blinka-hackapet.git] / src / adafruit_blinka / microcontroller / generic_linux / sysfs_analogout.py
diff --git a/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogout.py b/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogout.py
new file mode 100644 (file)
index 0000000..ec8b6c6
--- /dev/null
@@ -0,0 +1,93 @@
+"""
+`analogio` - Analog output control
+=================================================
+Write the SysFS DAC using IIO (Industrial Input/Output)
+
+See `CircuitPython:analogio` in CircuitPython for more details.
+* Author(s): Melissa LeBlanc-Williams
+"""
+
+import os
+from adafruit_blinka import ContextManaged
+
+try:
+    from microcontroller.pin import analogOuts
+except ImportError:
+    raise RuntimeError("No Analog Outputs defined for this board")
+
+
+class AnalogOut(ContextManaged):
+    """Analog Output Class"""
+
+    # Sysfs paths
+    _sysfs_path = "/sys/bus/iio/devices/"
+    _device_path = "iio:device{}"
+
+    # Channel paths
+    _channel_path = "out_voltage{}_raw"
+    _scale_path = "out_voltage_scale"
+
+    def __init__(self, dac_id):
+        """Instantiate an AnalogOut object and verify the sysfs IIO
+        corresponding to the specified channel and pin.
+
+        Args:
+            dac_id (int): Analog Output ID as defined in microcontroller.pin
+
+        Returns:
+            AnalogOut: AnalogOut object.
+
+        Raises:
+            TypeError: if `channel` or `pin` types are invalid.
+            ValueError: if AnalogOut channel does not exist.
+
+        """
+
+        self.id = dac_id
+        self._device = None
+        self._channel = None
+        self._open(dac_id)
+
+    def __enter__(self):
+        return self
+
+    def _open(self, dac_id):
+        self._device = None
+        for dacpair in analogOuts:
+            if dacpair[0] == dac_id:
+                self._device = dacpair[1]
+                self._channel = dacpair[2]
+
+        if self._device is None:
+            raise RuntimeError("No AnalogOut device found for the given ID")
+
+        device_path = os.path.join(
+            self._sysfs_path, self._device_path.format(self._device)
+        )
+
+        if not os.path.isdir(device_path):
+            raise ValueError(
+                "AnalogOut device does not exist, check that the required modules are loaded."
+            )
+
+    @property
+    def value(self):
+        """Return an error. This is output only."""
+        # emulate what CircuitPython does
+        raise AttributeError("unreadable attribute")
+
+    @value.setter
+    def value(self, value):
+        """Write to the DAC"""
+        path = os.path.join(
+            self._sysfs_path,
+            self._device_path.format(self._device),
+            self._channel_path.format(self._channel),
+        )
+
+        with open(path, "w") as analog_out:
+            return analog_out.write(value + "\n")
+
+    def deinit(self):
+        self._device = None
+        self._channel = None