X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/blobdiff_plain/173411fa58ff885d28703c69125a0e90db6cf0bf..a925dfa21f5a3483efe8f648c1db9cd04d98e949:/src/adafruit_blinka/microcontroller/generic_agnostic_board/pin.py diff --git a/src/adafruit_blinka/microcontroller/generic_agnostic_board/pin.py b/src/adafruit_blinka/microcontroller/generic_agnostic_board/pin.py index de6e181..fbe74ec 100644 --- a/src/adafruit_blinka/microcontroller/generic_agnostic_board/pin.py +++ b/src/adafruit_blinka/microcontroller/generic_agnostic_board/pin.py @@ -4,6 +4,55 @@ """generic_agnostic_board pin interface""" import random +# Values for sine wave analog output +# (data points = 20, amplitude=100, frequency=1) +sine_wave = [ + 0, + 31, + 59, + 81, + 95, + 100, + 95, + 81, + 59, + 31, + 0, + -31, + -59, + -81, + -95, + -100, + -95, + -81, + -59, + -31, +] + +# Values for a square wave analog output +# (data points = 20, amplitude=100) +square_wave_int = [ + 100, + -100, + 100, + -100, + 100, + -100, + 100, + -100, + 100, + -100, + 100, + -100, + 100, + -100, + 100, + -100, + 100, + -100, + 100, + -100 +] class Pin: """A basic Pin class for use with generic_agnostic_board""" @@ -16,6 +65,10 @@ class Pin: # pin values LOW = 0 HIGH = 1 + # pin pulls + PULL_NONE = 0 + PULL_UP = 1 + PULL_DOWN = 2 def return_toggle(self): """Returns the pin's expected value, toggling between True and False""" @@ -38,11 +91,29 @@ class Pin: """Returns the first five digits of Pi, 31415""" return 31415 + def return_sine_wave(self): + """Returns the next value in the sine wave""" + if self._wave_idx is None: + self._wave_idx = 0 + else: + self._wave_idx = (self._wave_idx + 1) % len(sine_wave) + return sine_wave[self._wave_idx] + + def return_square_wave(self): + """Returns the next value in the square wave""" + if self._wave_idx is None: + self._wave_idx = 0 + else: + self._wave_idx = (self._wave_idx + 1) % len(square_wave_int) + return square_wave_int[self._wave_idx] + def __init__(self, pin_id=None): self.id = pin_id self._mode = None - self.previous_value = None + self._pull = None + self.previous_value = False self.current_value = None + self._wave_idx = None # mapping of pin definition names to expected behavior self.pin_behavior = { @@ -50,22 +121,20 @@ class Pin: 1: self.return_false, # Dx_INPUT_FALSE 2: self.return_true, # Dx_INPUT_TRUE_PULL_UP 3: self.return_true, # Dx_INPUT_TRUE_PULL_DOWN - 4: self.return_true, # Dx_OUTPUT_TRUE - 5: self.return_false, # Dx_OUTPUT_FALSE - 6: self.return_true, # NEOPIXEL + 4: self.return_true, # Dx_OUTPUT 7: self.return_random_int, # Ax_INPUT_RAND_INT 8: self.return_fixed_int_pi, # Ax_INPUT_FIXED_INT_PI - 9: self.return_true, # Ax_OUTPUT_WAVE_SINE - 10: self.return_true, # Ax_OUTPUT_WAVE_SAWTOOTH - # Add other mappings as needed + 9: self.return_sine_wave, # Ax_OUTPUT_WAVE_SINE + 10: self.return_square_wave, # Ax_OUTPUT_WAVE_SAWTOOTH + 11: self.return_toggle # Dx_INPUT_TOGGLE } 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") + pull = Pin.PULL_NONE if pull is None else pull + self._pull = pull self._mode = mode def write(self, new_value): @@ -78,6 +147,13 @@ class Pin: self.previous_value = self.current_value # perform a lookup on the pin_behavior dict to get the value self.current_value = self.pin_behavior.get(self.id)() + + # is pin a pull up and pin is LOW? + if self._pull == Pin.PULL_UP and self.current_value == False: + self.current_value = False + # is pin a pull down and pin is HIGH? + if self._pull == Pin.PULL_DOWN and self.current_value == True: + self.current_value = False return self.current_value def value(self, val=None): @@ -116,7 +192,6 @@ D1 = Pin(1) D2 = Pin(2) D3 = Pin(3) D4 = Pin(4) -D5 = Pin(5) # Special "digital" pins D6 = Pin(6) # Analog pins @@ -125,6 +200,8 @@ A1 = Pin(8) A2 = Pin(9) A3 = Pin(10) +D7 = Pin(11) + # I2C pins SDA = Pin() SCL = Pin()