-# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
-#
-# SPDX-License-Identifier: MIT
-"""fake_mcp2221 pin names"""
-import random
-
-
-class Pin:
- """A basic Pin class for use with a "fake" MCP2221."""
-
- # pin modes
- OUT = 0
- IN = 1
- ADC = 2
- DAC = 3
- # pin values
- LOW = 0
- HIGH = 1
-
- def __init__(self, pin_id=None):
- self.id = pin_id
- self._mode = None
- self._prv_val = False
-
- def init(self, mode=IN, pull=None):
- """Initialize the Pin"""
- if self.id is None:
- raise RuntimeError("Can not init a None type pin.")
- if pull is not None:
- raise NotImplementedError("Internal pullups and pulldowns not supported")
- if mode in (Pin.IN, Pin.OUT):
- # All pins can do GPIO
- # mcp2221.gp_set_mode(self.id, mcp2221.GP_GPIO)
- # mcp2221.gpio_set_direction(self.id, mode)
- self._mode = mode
- elif mode == Pin.ADC:
- # ADC only available on these pins
- if self.id not in (1, 2, 3):
- raise ValueError("Pin does not have ADC capabilities")
- # mcp2221.gp_set_mode(self.id, mcp2221.GP_ALT0)
- # mcp2221.adc_configure()
- elif mode == Pin.DAC:
- # DAC only available on these pins
- if self.id not in (2, 3):
- raise ValueError("Pin does not have DAC capabilities")
- # mcp2221.gp_set_mode(self.id, mcp2221.GP_ALT1)
- # mcp2221.dac_configure()
- else:
- raise ValueError("Incorrect pin mode: {}".format(mode))
- self._mode = mode
-
- def value(self, val=None):
- """Set or return the Pin Value"""
- # Digital In / Out
- if self._mode in (Pin.IN, Pin.OUT):
- # digital read
- if val is None:
- # The returned value toggles between True and false
- self._prv_val = not self._prv_val
- return self._prv_val
- # digital write
- if val in (Pin.LOW, Pin.HIGH):
- # We don't need to do anything here - no data is produced
- return None
- # nope
- raise ValueError("Invalid value for pin.")
- # Analog In
- if self._mode == Pin.ADC:
- if val is None:
- # Returned value is between 0 and 65535 inclusive
- # https://docs.circuitpython.org/en/latest/shared-bindings/analogio/index.html#analogio.AnalogIn.value
- self._prv_val = random.randint(0, 65535)
- return self._prv_val
- # read only
- raise AttributeError("'AnalogIn' object has no attribute 'value'")
- # Analog Out
- if self._mode == Pin.DAC:
- if val is None:
- # write only
- raise AttributeError("unreadable attribute")
- # We don't write to the DAC as this is a "fake" implementation
- return None
- raise RuntimeError(
- "No action for mode {} with value {}".format(self._mode, val)
- )
-
-
-# create pin instances for each pin
-G0 = Pin(0)
-G1 = Pin(1)
-G2 = Pin(2)
-G3 = Pin(3)
-
-SCL = Pin()
-SDA = Pin()