1 from .mcp2221 import mcp2221
4 """A basic Pin class for use with MCP2221."""
15 def __init__(self, pin_id=None):
19 def init(self, mode=IN, pull=None):
21 raise RuntimeError("Can not init a None type pin.")
22 if mode in (Pin.IN, Pin.OUT):
23 mcp2221.gp_set_mode(self.id, mcp2221.GP_GPIO)
24 mcp2221.gpio_set_direction(self.id, mode)
26 mcp2221.gp_set_mode(self.id, mcp2221.GP_ALT0)
27 mcp2221.adc_configure()
29 mcp2221.gp_set_mode(self.id, mcp2221.GP_ALT1)
30 mcp2221.dac_configure()
32 raise ValueError("Incorrect pin mode: {}".format(mode))
35 def value(self, val=None):
37 if self._mode in (Pin.IN, Pin.OUT):
40 return mcp2221.gpio_get_pin(self.id)
42 elif val in (Pin.LOW, Pin.HIGH):
43 mcp2221.gpio_set_pin(self.id, val)
46 raise ValueError("Invalid value for pin.")
48 elif self._mode == Pin.ADC:
50 # MCP2221 ADC is 10 bit, scale to 16 bit per CP API
51 return mcp2221.adc_read(self.id) * 64
54 raise AttributeError("'AnalogIn' object has no attribute 'value'")
56 elif self._mode == Pin.DAC:
59 raise AttributeError("unreadable attribute")
61 # scale 16 bit value to MCP2221 5 bit DAC (yes 5 bit)
62 mcp2221.dac_write(self.id, val // 2048)
64 raise RuntimeError("No action for mode {} with value {}".format(self._mode, val))
67 # create pin instances for each pin