NativePin fixups

* rename FUNCTION / PULL / EDGES dictionaries so that they better-match the other `Pin` implementations
* throw `PinSetInput` if trying to set the state of an input pin
This commit is contained in:
Andrew Scheller
2016-02-20 17:15:34 +00:00
parent b1943c978e
commit c878b20bcc

View File

@@ -22,6 +22,7 @@ from ..exc import (
PinInvalidEdges, PinInvalidEdges,
PinInvalidFunction, PinInvalidFunction,
PinFixedPull, PinFixedPull,
PinSetInput,
) )
@@ -168,34 +169,34 @@ class NativePin(Pin):
_MEM = None _MEM = None
_PINS = {} _PINS = {}
PULL_NAMES = { GPIO_FUNCTIONS = {
0b00: 'floating', 'input': 0b000,
0b01: 'down', 'output': 0b001,
0b10: 'up', 'alt0': 0b100,
0b11: 'reserved', 'alt1': 0b101,
'alt2': 0b110,
'alt3': 0b111,
'alt4': 0b011,
'alt5': 0b010,
} }
FUNCTION_NAMES = { GPIO_PULL_UPS = {
0b000: 'input', 'up': 0b10,
0b001: 'output', 'down': 0b01,
0b100: 'alt0', 'floating': 0b00,
0b101: 'alt1', 'reserved': 0b11,
0b110: 'alt2',
0b111: 'alt3',
0b011: 'alt4',
0b010: 'alt5',
} }
EDGE_NAMES = { GPIO_EDGES = {
(True, True): 'both', 'both': (True, True),
(True, False): 'rising', 'rising': (True, False),
(False, True): 'falling', 'falling': (False, True),
(False, False): 'none', 'none': (False, False),
} }
PULL_VALUES = {v: k for (k, v) in PULL_NAMES.items()} GPIO_FUNCTION_NAMES = {v: k for (k, v) in GPIO_FUNCTIONS.items()}
FUNCTION_VALUES = {v: k for (k, v) in FUNCTION_NAMES.items()} GPIO_PULL_UP_NAMES = {v: k for (k, v) in GPIO_PULL_UPS.items()}
EDGE_VALUES = {v: k for (k, v) in EDGE_NAMES.items()} GPIO_EDGES_NAMES = {v: k for (k, v) in GPIO_EDGES.items()}
def __new__(cls, number): def __new__(cls, number):
if not cls._PINS: if not cls._PINS:
@@ -246,11 +247,11 @@ class NativePin(Pin):
self.function = 'input' self.function = 'input'
def _get_function(self): def _get_function(self):
return self.FUNCTION_NAMES[(self._MEM[self._func_offset] >> self._func_shift) & 7] return self.GPIO_FUNCTION_NAMES[(self._MEM[self._func_offset] >> self._func_shift) & 7]
def _set_function(self, value): def _set_function(self, value):
try: try:
value = self.FUNCTION_VALUES[value] value = self.GPIO_FUNCTIONS[value]
except KeyError: except KeyError:
raise PinInvalidFunction('invalid function "%s" for pin %r' % self) raise PinInvalidFunction('invalid function "%s" for pin %r' % self)
self._MEM[self._func_offset] = ( self._MEM[self._func_offset] = (
@@ -263,13 +264,15 @@ class NativePin(Pin):
return bool(self._MEM[self._level_offset] & (1 << self._level_shift)) return bool(self._MEM[self._level_offset] & (1 << self._level_shift))
def _set_state(self, value): def _set_state(self, value):
if self.function == 'input':
raise PinSetInput('cannot set state of pin %r' % self)
if value: if value:
self._MEM[self._set_offset] = 1 << self._set_shift self._MEM[self._set_offset] = 1 << self._set_shift
else: else:
self._MEM[self._clear_offset] = 1 << self._clear_shift self._MEM[self._clear_offset] = 1 << self._clear_shift
def _get_pull(self): def _get_pull(self):
return self.PULL_NAMES[self._pull] return self.GPIO_PULL_UP_NAMES[self._pull]
def _set_pull(self, value): def _set_pull(self, value):
if self.function != 'input': if self.function != 'input':
@@ -277,7 +280,7 @@ class NativePin(Pin):
if value != 'up' and self._number in (2, 3): if value != 'up' and self._number in (2, 3):
raise PinFixedPull('%r has a physical pull-up resistor' % self) raise PinFixedPull('%r has a physical pull-up resistor' % self)
try: try:
value = self.PULL_VALUES[value] value = self.GPIO_PULL_UPS[value]
except KeyError: except KeyError:
raise PinInvalidPull('invalid pull direction "%s" for pin %r' % self) raise PinInvalidPull('invalid pull direction "%s" for pin %r' % self)
self._MEM[self._MEM.GPPUD_OFFSET] = value self._MEM[self._MEM.GPPUD_OFFSET] = value
@@ -291,11 +294,11 @@ class NativePin(Pin):
def _get_edges(self): def _get_edges(self):
rising = bool(self._MEM[self._rising_offset] & (1 << self._rising_shift)) rising = bool(self._MEM[self._rising_offset] & (1 << self._rising_shift))
falling = bool(self._MEM[self._falling_offset] & (1 << self._falling_shift)) falling = bool(self._MEM[self._falling_offset] & (1 << self._falling_shift))
return self.EDGE_NAMES[(rising, falling)] return self.GPIO_EDGES_NAMES[(rising, falling)]
def _set_edges(self, value): def _set_edges(self, value):
try: try:
rising, falling = self.EDGE_VALUES[value] rising, falling = self.GPIO_EDGES[value]
except KeyError: except KeyError:
raise PinInvalidEdges('invalid edge specification "%s" for pin %r' % self) raise PinInvalidEdges('invalid edge specification "%s" for pin %r' % self)
f = self.when_changed f = self.when_changed