--- /dev/null
+"""
+`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