1 # SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
3 # SPDX-License-Identifier: MIT
4 """fake_mcp2221 pin names"""
6 from .fake_mcp2221 import mcp2221
10 """A basic Pin class for use with a "fake" MCP2221."""
21 def __init__(self, pin_id=None):
26 def init(self, mode=IN, pull=None):
27 """Initialize the Pin"""
29 raise RuntimeError("Can not init a None type pin.")
31 raise NotImplementedError("Internal pullups and pulldowns not supported on the MCP2221")
32 if mode in (Pin.IN, Pin.OUT):
33 # All pins can do GPIO
36 # ADC only available on these pins
37 if self.id not in (1, 2, 3):
38 raise ValueError("Pin does not have ADC capabilities")
42 # DAC only available on these pins
43 if self.id not in (2, 3):
44 raise ValueError("Pin does not have DAC capabilities")
47 raise ValueError("Incorrect pin mode: {}".format(mode))
50 def value(self, val=None):
51 """Set or return the Pin Value"""
53 if self._mode in (Pin.IN, Pin.OUT):
56 # The value returned will toggle between True and False
57 # and will be True on the first digital read
58 # TODO: Behavior needs to be tested
59 if self._prv_val == None or False:
65 if val in (Pin.LOW, Pin.HIGH):
66 # We don't need to do anything here - no data is produced
69 raise ValueError("Invalid value for pin.")
71 if self._mode == Pin.ADC:
73 # Returned value is between 0 and 65535 inclusive
74 # https://docs.circuitpython.org/en/latest/shared-bindings/analogio/index.html#analogio.AnalogIn.value
75 self._prv_val = random.randint(0, 65535)
78 raise AttributeError("'AnalogIn' object has no attribute 'value'")
80 if self._mode == Pin.DAC:
83 raise AttributeError("unreadable attribute")
84 # We don't write to the DAC as this is a "fake" implementation
87 "No action for mode {} with value {}".format(self._mode, val)
91 # create pin instances for each pin