"""Module providing runtime utility objects to support the Micro/CircuitPython api"""
+
class Enum(object):
"""
Object supporting CircuitPython-style of static symbols
def __exit__(self, exc_type, exc_value, traceback):
self.deinit()
+
class Lockable(ContextManaged):
_locked = False
if self._locked:
return False
else:
- self._locked=True
+ self._locked = True
return True
def unlock(self):
board = None
if microcontroller is not None:
- if microcontroller == "esp8266": # TODO more conservative board-guessing
+ if microcontroller == "esp8266": # TODO more conservative board-guessing
board = "feather_huzzah"
elif microcontroller == "samd21":
board = "feather_m0_express"
from utime import sleep
elif implementation == "circuitpython":
from time import sleep
-gc.collect()
\ No newline at end of file
+gc.collect()
# TODO need equiv of INPUT_PULL_DOWN_16 ? see https://tttapa.github.io/ESP8266/Chap04%20-%20Microcontroller.html
-GPIO0= pin.GPIO0
-GPIO1= pin.GPIO1
-GPIO2= pin.GPIO2
-GPIO3= pin.GPIO3
-GPIO4= pin.GPIO4
-GPIO5= pin.GPIO5
-GPIO12= pin.GPIO12
-GPIO13= pin.GPIO13
-GPIO14= pin.GPIO14
-GPIO15= pin.GPIO15
-GPIO16= pin.GPIO16
+GPIO0 = pin.GPIO0
+GPIO1 = pin.GPIO1
+GPIO2 = pin.GPIO2
+GPIO3 = pin.GPIO3
+GPIO4 = pin.GPIO4
+GPIO5 = pin.GPIO5
+GPIO12 = pin.GPIO12
+GPIO13 = pin.GPIO13
+GPIO14 = pin.GPIO14
+GPIO15 = pin.GPIO15
+GPIO16 = pin.GPIO16
-ADC= pin.TOUT
+ADC = pin.TOUT
-MISO=GPIO12
-MOSI=GPIO13
-SCK=GPIO14
+MISO = GPIO12
+MOSI = GPIO13
+SCK = GPIO14
-RX=GPIO3
-TX=GPIO1
+RX = GPIO3
+TX = GPIO1
-SDA=GPIO4
-SCL=GPIO5
+SDA = GPIO4
+SCL = GPIO5
-['ADC', 'GPIO16', 'GPIO14', 'SCK', 'GPIO12', 'MISO', 'GPIO13', 'MOSI', 'GPIO15', 'GPIO2', 'GPIO0', 'GPIO4', 'SDA', 'RX', 'TX', 'GPIO5', 'SCL']
+[
+ 'ADC', 'GPIO16', 'GPIO14', 'SCK', 'GPIO12', 'MISO', 'GPIO13', 'MOSI',
+ 'GPIO15', 'GPIO2', 'GPIO0', 'GPIO4', 'SDA', 'RX', 'TX', 'GPIO5', 'SCL'
+]
from adafruit_blinka.microcontroller.stm32 import pin
-X1=pin.A0
-X2=pin.A1
-X3=pin.A2
-X4=pin.A3
-X5=pin.A4
-X6=pin.A5
-X7=pin.A6
-X8=pin.A7
-X9=pin.B6
-X10=pin.B7
-X11=pin.C4
-X12=pin.C5
-X17=pin.B3
-X18=pin.C13
-X19=pin.C0
-X20=pin.C1
-X21=pin.C2
-X22=pin.C3
-Y1=pin.C6
-Y2=pin.C7
-Y3=pin.B8
-Y4=pin.B9
-Y5=pin.B12
-Y6=pin.B13
-Y7=pin.B14
-Y8=pin.B15
-Y9=pin.B10
-Y10=pin.B11
-Y11=pin.B0
-Y12=pin.B1
-SW=pin.B3
-LED_RED=pin.A13
-LED_GREEN=pin.A14
-LED_YELLOW=pin.A15
-LED_BLUE=pin.B4
-MMA_INT=pin.B2
-MMA_AVDD=pin.B5
-SD_D0=pin.C8
-SD_D1=pin.C9
-SD_D2=pin.C10
-SD_D3=pin.C11
-SD_CMD=pin.D2
-SD_CK=pin.C12
-SD=pin.A8
-SD_SW=pin.A8
-USB_VBUS=pin.A9
-USB_ID=pin.A10
-USB_DM=pin.A11
-USB_DP=pin.A12
\ No newline at end of file
+X1 = pin.A0
+X2 = pin.A1
+X3 = pin.A2
+X4 = pin.A3
+X5 = pin.A4
+X6 = pin.A5
+X7 = pin.A6
+X8 = pin.A7
+X9 = pin.B6
+X10 = pin.B7
+X11 = pin.C4
+X12 = pin.C5
+X17 = pin.B3
+X18 = pin.C13
+X19 = pin.C0
+X20 = pin.C1
+X21 = pin.C2
+X22 = pin.C3
+Y1 = pin.C6
+Y2 = pin.C7
+Y3 = pin.B8
+Y4 = pin.B9
+Y5 = pin.B12
+Y6 = pin.B13
+Y7 = pin.B14
+Y8 = pin.B15
+Y9 = pin.B10
+Y10 = pin.B11
+Y11 = pin.B0
+Y12 = pin.B1
+SW = pin.B3
+LED_RED = pin.A13
+LED_GREEN = pin.A14
+LED_YELLOW = pin.A15
+LED_BLUE = pin.B4
+MMA_INT = pin.B2
+MMA_AVDD = pin.B5
+SD_D0 = pin.C8
+SD_D1 = pin.C9
+SD_D2 = pin.C10
+SD_D3 = pin.C11
+SD_CMD = pin.D2
+SD_CK = pin.C12
+SD = pin.A8
+SD_SW = pin.A8
+USB_VBUS = pin.A9
+USB_ID = pin.A10
+USB_DM = pin.A11
+USB_DP = pin.A12
# ordered as spiId, sckId, mosiId, misoId
-spiPorts = (
- (1, 14, 13, 12)
-)
+spiPorts = ((1, 14, 13, 12))
# ordered as uartId, txId, rxId
uartPorts = (
(0, 1, 3),
# (0, 15, 13) # TODO secondary pins for UART0 configurable from Micropython?
- (1, 2, None)
-)
\ No newline at end of file
+ (1, 2, None))
from microcontroller import Pin
-GPIO0=Pin(0)
-GPIO1=Pin(1)
-GPIO2=Pin(2)
-GPIO3=Pin(3)
-GPIO4=Pin(4)
-GPIO5=Pin(5)
-GPIO12=Pin(12)
-GPIO13=Pin(13)
-GPIO14=Pin(14)
-GPIO15=Pin(15)
-GPIO16=Pin(16)
-TOUT=Pin("TOUT")
-
+GPIO0 = Pin(0)
+GPIO1 = Pin(1)
+GPIO2 = Pin(2)
+GPIO3 = Pin(3)
+GPIO4 = Pin(4)
+GPIO5 = Pin(5)
+GPIO12 = Pin(12)
+GPIO13 = Pin(13)
+GPIO14 = Pin(14)
+GPIO15 = Pin(15)
+GPIO16 = Pin(16)
+TOUT = Pin("TOUT")
"""
From introspection of microcontroller.pin on Feather Huzzah running CircuitPython
>>> dir(microcontroller.pin)
>>> dir(board)
['ADC', 'GPIO16', 'GPIO14', 'SCK', 'GPIO12', 'MISO', 'GPIO13', 'MOSI', 'GPIO15', 'GPIO2', 'GPIO0', 'GPIO4', 'SDA', 'RX', 'TX', 'GPIO5', 'SCL']
"""
-
"""
class cpu():
def frequency(self):
from microcontroller import pin
# ordered as spiId, sckId, mosiId, misoId
-spiPorts = (
- (1, "B13", "B15", "B14"),
- (2, "A5", "A6", "A7")
-)
+spiPorts = ((1, "B13", "B15", "B14"), (2, "A5", "A6", "A7"))
# ordered as uartId, txId, rxId
uartPorts = (
(3, "B10", "B11"),
(4, "A0", "A1"),
(6, "C6", "C7"),
-)
\ No newline at end of file
+)
from microcontroller import Pin
-A0=Pin('A0')
-A1=Pin('A1')
-A2=Pin('A2')
-A3=Pin('A3')
-A4=Pin('A4')
-A5=Pin('A5')
-A6=Pin('A6')
-A7=Pin('A7')
-A8=Pin('A8')
-A9=Pin('A9')
-A10=Pin('A10')
-A11=Pin('A11')
-A12=Pin('A12')
-A13=Pin('A13')
-A14=Pin('A14')
-A15=Pin('A15')
-B0=Pin('B0')
-B1=Pin('B1')
-B2=Pin('B2')
-B3=Pin('B3')
-B4=Pin('B4')
-B5=Pin('B5')
-B6=Pin('B6')
-B7=Pin('B7')
-B8=Pin('B8')
-B9=Pin('B9')
-B10=Pin('B10')
-B11=Pin('B11')
-B12=Pin('B12')
-B13=Pin('B13')
-B14=Pin('B14')
-B15=Pin('B15')
-C0=Pin('C0')
-C1=Pin('C1')
-C2=Pin('C2')
-C3=Pin('C3')
-C4=Pin('C4')
-C5=Pin('C5')
-C6=Pin('C6')
-C7=Pin('C7')
-C8=Pin('C8')
-C9=Pin('C9')
-C10=Pin('C10')
-C11=Pin('C11')
-C12=Pin('C12')
-C13=Pin('C13')
-D2=Pin('D2')
\ No newline at end of file
+A0 = Pin('A0')
+A1 = Pin('A1')
+A2 = Pin('A2')
+A3 = Pin('A3')
+A4 = Pin('A4')
+A5 = Pin('A5')
+A6 = Pin('A6')
+A7 = Pin('A7')
+A8 = Pin('A8')
+A9 = Pin('A9')
+A10 = Pin('A10')
+A11 = Pin('A11')
+A12 = Pin('A12')
+A13 = Pin('A13')
+A14 = Pin('A14')
+A15 = Pin('A15')
+B0 = Pin('B0')
+B1 = Pin('B1')
+B2 = Pin('B2')
+B3 = Pin('B3')
+B4 = Pin('B4')
+B5 = Pin('B5')
+B6 = Pin('B6')
+B7 = Pin('B7')
+B8 = Pin('B8')
+B9 = Pin('B9')
+B10 = Pin('B10')
+B11 = Pin('B11')
+B12 = Pin('B12')
+B13 = Pin('B13')
+B14 = Pin('B14')
+B15 = Pin('B15')
+C0 = Pin('C0')
+C1 = Pin('C1')
+C2 = Pin('C2')
+C3 = Pin('C3')
+C4 = Pin('C4')
+C5 = Pin('C5')
+C6 = Pin('C6')
+C7 = Pin('C7')
+C8 = Pin('C8')
+C9 = Pin('C9')
+C10 = Pin('C10')
+C11 = Pin('C11')
+C12 = Pin('C12')
+C13 = Pin('C13')
+D2 = Pin('D2')
def init(self, scl, sda, frequency):
self.deinit()
- id = -1 # force bitbanging implementation - in future introspect platform if SDA/SCL matches hardware I2C
+ id = -1 # force bitbanging implementation - in future introspect platform if SDA/SCL matches hardware I2C
self._i2c = _I2C(id, Pin(scl.id), Pin(sda.id), freq=frequency)
def deinit(self):
if end is None:
end = len(buffer)
buffer = memoryview(buffer)[start:end]
- stop = True # remove for efficiency later
+ stop = True # remove for efficiency later
return self._i2c.readfrom_into(address, buffer, stop)
def writeto(self, address, buffer, start=0, end=None, stop=True, *a, **k):
buffer = memoryview(buffer)[start:end]
return self._i2c.writeto(address, buffer, stop)
+
# TODO untested, as actually busio.SPI was on tasklist https://github.com/adafruit/Adafruit_Micropython_Blinka/issues/2 :(
class SPI(Lockable):
def __init__(self, clock, MOSI=None, MISO=None):
if self._locked:
# TODO verify if _spi obj 'caches' sck, mosi, miso to avoid storing in _attributeIds (duplicated in busio)
# i.e. #init ignores MOSI=None rather than unsetting
- self._spi.init(baudrate=baudrate, polarity=polarity, phase=phase, bits = bits, firstbit = SPI.MSB, sck = Pin(self._pins[0]), mosi=Pin(self._pins[1]), miso=Pin(self._pins[2]))
+ self._spi.init(
+ baudrate=baudrate,
+ polarity=polarity,
+ phase=phase,
+ bits=bits,
+ firstbit=SPI.MSB,
+ sck=Pin(self._pins[0]),
+ mosi=Pin(self._pins[1]),
+ miso=Pin(self._pins[2]))
else:
raise RuntimeError("First call try_lock()")
__version__ = "0.0.0-auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_Micropython_Blinka.git"
-
if board == "feather_huzzah":
from adafruit_blinka.board.feather_huzzah import *
elif board == "nodemcu":
from adafruit_blinka.board.pyboard import *
else:
raise NotImplementedError("Board not supported")
-gc.collect()
\ No newline at end of file
+gc.collect()
self._pinIds = (sck, mosi, miso)
break
else:
- raise NotImplementedError("No Hardware SPI on (clock, MOSI, MISO)={}\nValid SPI ports:{}".format((clock, MOSI, MISO), spiPorts))
+ raise NotImplementedError(
+ "No Hardware SPI on (clock, MOSI, MISO)={}\nValid SPI ports:{}".
+ format((clock, MOSI, MISO), spiPorts))
def configure(self, baudrate=100000, polarity=0, phase=0, bits=8):
if self._locked:
from machine import Pin
from microcontroller import spiPorts
# TODO check if #init ignores MOSI=None rather than unsetting, to save _pinIds attribute
- self._spi.init(baudrate=baudrate, polarity=polarity, phase=phase, bits = bits, firstbit = SPI.MSB, sck = Pin(self._pinIds[0]), mosi=Pin(self._pinIds[1]), miso=Pin(self._pinIds[2]))
+ self._spi.init(
+ baudrate=baudrate,
+ polarity=polarity,
+ phase=phase,
+ bits=bits,
+ firstbit=SPI.MSB,
+ sck=Pin(self._pinIds[0]),
+ mosi=Pin(self._pinIds[1]),
+ miso=Pin(self._pinIds[2]))
else:
raise RuntimeError("First call try_lock()")
def write_readinto(self, buffer_out, buffer_in):
return self.write_readinto(buffer_out, buffer_in)
-class UART(Lockable):
+class UART(Lockable):
class Parity(Enum):
pass
- Parity.ODD=Parity()
- Parity.EVEN=Parity()
+
+ Parity.ODD = Parity()
+ Parity.EVEN = Parity()
# TODO investigate UART receiver_buffer_size as e.g. read_buf_len in https://github.com/micropython/micropython/blob/3eb0694b97c6a8f0e93b874549aac40d8b78b0e5/ports/stm32/uart.c
- def __init__(self, tx, rx, baudrate=9600, bits=8, parity=None, stop=1, timeout=None, receiver_buffer_size=None, flow=None):
+ def __init__(self,
+ tx,
+ rx,
+ baudrate=9600,
+ bits=8,
+ parity=None,
+ stop=1,
+ timeout=None,
+ receiver_buffer_size=None,
+ flow=None):
from microcontroller import uartPorts
from machine import UART
self.baudrate = baudrate
- if timeout is not None: # default 1000
- raise NotImplementedError("Parameter '{}' unsupported on {}".format("timeout", agnostic.board))
- if receiver_buffer_size is not None: # default 64
- raise NotImplementedError("Parameter '{}' unsupported on {}".format("receiver_buffer_size", agnostic.board))
- if flow is not None: # default 0
- raise NotImplementedError("Parameter '{}' unsupported on {}".format("flow", agnostic.board))
+ if timeout is not None: # default 1000
+ raise NotImplementedError(
+ "Parameter '{}' unsupported on {}".format(
+ "timeout", agnostic.board))
+ if receiver_buffer_size is not None: # default 64
+ raise NotImplementedError(
+ "Parameter '{}' unsupported on {}".format(
+ "receiver_buffer_size", agnostic.board))
+ if flow is not None: # default 0
+ raise NotImplementedError(
+ "Parameter '{}' unsupported on {}".format(
+ "flow", agnostic.board))
# translate parity flag for Micropython
if parity is UART.Parity.ODD:
raise ValueError("Invalid parity")
# check tx and rx have hardware support
- for portId, portTx, portRx in uartPorts:#
+ for portId, portTx, portRx in uartPorts: #
if portTx == tx.id and portRx == rx.id:
- self._uart = UART(portId, baudrate, bits=bits, parity=parity, stop=stop, timeout=timeout)
+ self._uart = UART(
+ portId,
+ baudrate,
+ bits=bits,
+ parity=parity,
+ stop=stop,
+ timeout=timeout)
break
else:
- raise NotImplementedError("No Hardware UART on (tx,rx)={}\nValid UART ports".format((tx, rx), uartPorts))
+ raise NotImplementedError(
+ "No Hardware UART on (tx,rx)={}\nValid UART ports".format(
+ (tx, rx), uartPorts))
def deinit(self):
self._uart = None
from machine import Pin
from adafruit_blinka.agnostic import board as boardId
-from adafruit_blinka import Enum,ContextManaged
+from adafruit_blinka import Enum, ContextManaged
class DriveMode(Enum):
- PUSH_PULL=None
- OPEN_DRAIN=None
+ PUSH_PULL = None
+ OPEN_DRAIN = None
+
+
DriveMode.PUSH_PULL = DriveMode()
DriveMode.OPEN_DRAIN = DriveMode()
class Direction(Enum):
- INPUT=None
- OUTPUT=None
+ INPUT = None
+ OUTPUT = None
+
+
Direction.INPUT = Direction()
Direction.OUTPUT = Direction()
class Pull(Enum):
- UP=None
- DOWN=None
+ UP = None
+ DOWN = None
#NONE=None
+
+
Pull.UP = Pull()
Pull.DOWN = Pull()
+
#Pull.NONE = Pull()
if hasattr(Pin, "PULL_DOWN"):
self._pin.init(mode=Pin.IN, pull=Pin.PULL_DOWN)
else:
- raise NotImplementedError("{} unsupported on {}".format(Pull.DOWN, boardId))
+ raise NotImplementedError("{} unsupported on {}".format(
+ Pull.DOWN, boardId))
elif pul is None:
self._pin.init(mode=Pin.IN, pull=None)
else:
elif mod is DriveMode.PUSH_PULL:
self._pin.init(mode=Pin.OUT)
+
# __all__ = ['DigitalInOut', 'DriveMode', 'Direction','Pull']