Start work on types

Bring in typings folder for adafruit_ble and micropython
This commit is contained in:
sofubi 2021-08-13 23:10:43 -04:00
parent 95dcc57e76
commit 2c69d0e197
11 changed files with 910 additions and 12 deletions

View File

@ -1,3 +1,8 @@
from kmk.consts import UnicodeMode
from kmk.keys import KeyAttrDict
from typing import List, Optional
class AttrDict(dict):
'''
Primitive support for accessing dictionary entries in dot notation.
@ -7,34 +12,34 @@ class AttrDict(dict):
This is read-only on purpose.
'''
def __getattr__(self, key):
def __getattr__(self, key: str) -> str:
return self[key]
class LayerKeyMeta:
def __init__(self, layer, kc=None):
self.layer = layer
self.kc = kc
def __init__(self, layer: int, kc: Optional[KeyAttrDict] = None) -> None:
self.layer: int = layer
self.kc: Optional[KeyAttrDict] = kc
class ModTapKeyMeta:
def __init__(self, kc=None, mods=None):
self.mods = mods
self.kc = kc
def __init__(self, kc: Optional[KeyAttrDict] = None, mods: Optional[List[KeyAttrDict]] = None):
self.mods: Optional[List[KeyAttrDict]] = mods
self.kc: Optional[KeyAttrDict] = kc
class KeySequenceMeta:
def __init__(self, seq):
self.seq = seq
def __init__(self, seq: List[KeyAttrDict]):
self.seq: List[KeyAttrDict] = seq
class KeySeqSleepMeta:
def __init__(self, ms):
self.ms = ms
def __init__(self, ms: float):
self.ms: float = ms
class UnicodeModeKeyMeta:
def __init__(self, mode):
def __init__(self, mode: UnicodeMode):
self.mode = mode

View File

@ -0,0 +1,208 @@
"""
This type stub file was generated by pyright.
"""
import sys
import _bleio
from .services import Service
from .advertising import Advertisement
"""
This module provides higher-level BLE (Bluetooth Low Energy) functionality,
building on the native `_bleio` module.
"""
if sys.implementation.name == "circuitpython" and sys.implementation.version[0] <= 4:
...
__version__ = ...
__repo__ = ...
class BLEConnection:
"""
Represents a connection to a peer BLE device.
It acts as a map from a `Service` type to a `Service` instance for the connection.
:param bleio_connection _bleio.Connection: the native `_bleio.Connection` object to wrap
"""
def __init__(self, bleio_connection) -> None:
...
def __contains__(self, key): # -> bool:
"""
Allows easy testing for a particular Service class or a particular UUID
associated with this connection.
Example::
if UARTService in connection:
# do something
if StandardUUID(0x1234) in connection:
# do something
"""
...
def __getitem__(self, key): # -> None:
"""Return the Service for the given Service class or uuid, if any."""
...
@property
def connected(self):
"""True if the connection to the peer is still active."""
...
@property
def paired(self):
"""True if the paired to the peer."""
...
@property
def connection_interval(self):
"""Time between transmissions in milliseconds. Will be multiple of 1.25ms. Lower numbers
increase speed and decrease latency but increase power consumption.
When setting connection_interval, the peer may reject the new interval and
`connection_interval` will then remain the same.
Apple has additional guidelines that dictate should be a multiple of 15ms except if HID
is available. When HID is available Apple devices may accept 11.25ms intervals."""
...
@connection_interval.setter
def connection_interval(self, value): # -> None:
...
def pair(self, *, bond=...):
"""Pair to the peer to increase security of the connection."""
...
def disconnect(self): # -> None:
"""Disconnect from peer."""
...
class BLERadio:
"""
BLERadio provides the interfaces for BLE advertising,
scanning for advertisements, and connecting to peers. There may be
multiple connections active at once.
It uses this library's `Advertisement` classes and the `BLEConnection` class."""
def __init__(self, adapter=...) -> None:
"""If no adapter is supplied, use the built-in `_bleio.adapter`.
If no built-in adapter is available, raise `RuntimeError`.
"""
...
def start_advertising(self, advertisement, scan_response=..., interval=..., timeout=...): # -> None:
"""
Starts advertising the given advertisement.
:param buf scan_response: scan response data packet bytes.
If ``None``, a default scan response will be generated that includes
`BLERadio.name` and `BLERadio.tx_power`.
:param float interval: advertising interval, in seconds
:param int timeout: advertising timeout in seconds.
If None, no timeout.
``timeout`` is not available in CircuitPython 5.x and must be `None`.
"""
...
def stop_advertising(self): # -> None:
"""Stops advertising."""
...
def start_scan(self, *advertisement_types, buffer_size=..., extended=..., timeout=..., interval=..., window=..., minimum_rssi=..., active=...): # -> Generator[Advertisement | Unknown, None, None]:
"""
Starts scanning. Returns an iterator of advertisement objects of the types given in
advertisement_types. The iterator will block until an advertisement is heard or the scan
times out.
If any ``advertisement_types`` are given, only Advertisements of those types are produced
by the returned iterator. If none are given then `Advertisement` objects will be
returned.
Advertisements and scan responses are filtered and returned separately.
:param int buffer_size: the maximum number of advertising bytes to buffer.
:param bool extended: When True, support extended advertising packets.
Increasing buffer_size is recommended when this is set.
:param float timeout: the scan timeout in seconds.
If None, will scan until `stop_scan` is called.
:param float interval: the interval (in seconds) between the start
of two consecutive scan windows
Must be in the range 0.0025 - 40.959375 seconds.
:param float window: the duration (in seconds) to scan a single BLE channel.
window must be <= interval.
:param int minimum_rssi: the minimum rssi of entries to return.
:param bool active: request and retrieve scan responses for scannable advertisements.
:return: If any ``advertisement_types`` are given,
only Advertisements of those types are produced by the returned iterator.
If none are given then `Advertisement` objects will be returned.
:rtype: iterable
"""
...
def stop_scan(self): # -> None:
"""Stops any active scan.
The scan results iterator will return any buffered results and then raise StopIteration
once empty."""
...
def connect(self, advertisement, *, timeout=...):
"""
Initiates a `BLEConnection` to the peer that advertised the given advertisement.
:param advertisement Advertisement: An `Advertisement` or a subclass of `Advertisement`
:param timeout float: how long to wait for a connection
:return: the connection to the peer
:rtype: BLEConnection
"""
...
@property
def connected(self): # -> bool:
"""True if any peers are connected."""
...
@property
def connections(self): # -> tuple[None, ...]:
"""A tuple of active `BLEConnection` objects."""
...
@property
def name(self): # -> str:
"""The name for this device. Used in advertisements and
as the Device Name in the Generic Access Service, available to a connected peer.
"""
...
@name.setter
def name(self, value): # -> None:
...
@property
def tx_power(self): # -> Literal[0]:
"""Transmit power, in dBm."""
...
@tx_power.setter
def tx_power(self, value):
...
@property
def address_bytes(self): # -> bytes:
"""The device address, as a ``bytes()`` object of length 6."""
...
@property
def advertising(self): # -> bool:
"""The advertising state"""
...

View File

@ -0,0 +1,173 @@
"""
This type stub file was generated by pyright.
"""
import struct
"""
Advertising is the first phase of BLE where devices can broadcast
"""
def to_hex(seq): # -> str:
"""Pretty prints a byte sequence as hex values."""
...
def to_bytes_literal(seq): # -> str:
"""Prints a byte sequence as a Python bytes literal that only uses hex encoding."""
...
def decode_data(data, *, key_encoding=...): # -> dict[Unknown, Unknown]:
"""Helper which decodes length encoded structures into a dictionary with the given key
encoding."""
...
def compute_length(data_dict, *, key_encoding=...): # -> int:
"""Computes the length of the encoded data dictionary."""
...
def encode_data(data_dict, *, key_encoding=...): # -> bytes:
"""Helper which encodes dictionaries into length encoded structures with the given key
encoding."""
...
class AdvertisingDataField:
"""Top level class for any descriptor classes that live in Advertisement or its subclasses."""
...
class AdvertisingFlag:
"""A single bit flag within an AdvertisingFlags object."""
def __init__(self, bit_position) -> None:
...
def __get__(self, obj, cls): # -> AdvertisingFlag:
...
def __set__(self, obj, value): # -> None:
...
class AdvertisingFlags(AdvertisingDataField):
"""Standard advertising flags"""
limited_discovery = ...
general_discovery = ...
le_only = ...
def __init__(self, advertisement, advertising_data_type) -> None:
...
def __len__(self): # -> Literal[1]:
...
def __bytes__(self): # -> bytes:
...
def __str__(self) -> str:
...
class String(AdvertisingDataField):
"""UTF-8 encoded string in an Advertisement.
Not null terminated once encoded because length is always transmitted."""
def __init__(self, *, advertising_data_type) -> None:
...
def __get__(self, obj, cls): # -> String | str | None:
...
def __set__(self, obj, value): # -> None:
...
class Struct(AdvertisingDataField):
"""`struct` encoded data in an Advertisement."""
def __init__(self, struct_format, *, advertising_data_type) -> None:
...
def __get__(self, obj, cls): # -> Struct | Any | None:
...
def __set__(self, obj, value): # -> None:
...
class LazyObjectField(AdvertisingDataField):
"""Non-data descriptor useful for lazily binding a complex object to an advertisement object."""
def __init__(self, cls, attribute_name, *, advertising_data_type, **kwargs) -> None:
...
def __get__(self, obj, cls): # -> LazyObjectField | None:
...
@property
def advertising_data_type(self):
"""Return the data type value used to indicate this field."""
...
class Advertisement:
"""Core Advertisement type.
The class attribute ``match_prefixes``, if not ``None``, is a tuple of
bytestring prefixes to match against the multiple data structures in the advertisement.
"""
match_prefixes = ...
_prefix_bytes = ...
flags = ...
short_name = ...
complete_name = ...
tx_power = ...
appearance = ...
def __init__(self, *, entry=...) -> None:
"""Create an empty advertising packet or one from a ScanEntry."""
...
@property
def rssi(self): # -> None:
"""Signal strength of the scanned advertisement. Only available on Advertisements returned
from `BLERadio.start_scan()`. (read-only)"""
...
@classmethod
def get_prefix_bytes(cls): # -> bytes | Any:
"""Return a merged version of match_prefixes as a single bytes object,
with length headers.
"""
...
@classmethod
def matches(cls, entry):
"""Returns ``True`` if the given `_bleio.ScanEntry` advertisement fields
matches all of the given prefixes in the `match_prefixes` tuple attribute.
Subclasses may override this to match any instead of all.
"""
...
@classmethod
def matches_prefixes(cls, entry, *, all_):
"""Returns ``True`` if the given `_bleio.ScanEntry` advertisement fields
match any or all of the given prefixes in the `match_prefixes` tuple attribute.
If ``all_`` is ``True``, all the prefixes must match. If ``all_`` is ``False``,
returns ``True`` if at least one of the prefixes match.
"""
...
def __bytes__(self): # -> bytes:
"""The raw packet bytes."""
...
def __str__(self) -> str:
...
def __len__(self): # -> int:
...
def __repr__(self): # -> str:
...

View File

@ -0,0 +1,122 @@
"""
This type stub file was generated by pyright.
"""
from . import Advertisement, AdvertisingDataField
"""
:py:mod:`~adafruit_ble.advertising.standard`
====================================================
This module provides BLE standard defined advertisements. The Advertisements are single purpose
even though multiple purposes may actually be present in a single packet.
"""
__version__ = ...
__repo__ = ...
class BoundServiceList:
"""Sequence-like object of Service UUID objects. It stores both standard and vendor UUIDs."""
def __init__(self, advertisement, *, standard_services, vendor_services) -> None:
...
def __contains__(self, key): # -> bool:
...
def __iter__(self): # -> Iterator[Unknown]:
...
def append(self, service): # -> None:
"""Append a service to the list."""
...
def extend(self, services): # -> None:
"""Appends all services in the iterable to the list."""
...
def __str__(self) -> str:
...
class ServiceList(AdvertisingDataField):
"""Descriptor for a list of Service UUIDs that lazily binds a corresponding BoundServiceList."""
def __init__(self, *, standard_services, vendor_services) -> None:
...
def __get__(self, obj, cls): # -> ServiceList | tuple[()]:
...
class ProvideServicesAdvertisement(Advertisement):
"""Advertise what services that the device makes available upon connection."""
match_prefixes = ...
services = ...
def __init__(self, *services, entry=...) -> None:
...
@classmethod
def matches(cls, entry):
"""Only one kind of service list need be present in a ProvideServicesAdvertisement,
so override the default behavior and match any prefix, not all.
"""
...
class SolicitServicesAdvertisement(Advertisement):
"""Advertise what services the device would like to use over a connection."""
match_prefixes = ...
solicited_services = ...
def __init__(self, *services, entry=...) -> None:
...
class ManufacturerData(AdvertisingDataField):
"""Encapsulates manufacturer specific keyed data bytes. The manufacturer is identified by the
company_id and the data is structured like an advertisement with a configurable key
format. The order of the serialized data is determined by the order that the
`ManufacturerDataField` attributes are set in - this can be useful for
`match_prefixes` in an `Advertisement` sub-class."""
def __init__(self, obj, *, advertising_data_type=..., company_id, key_encoding=...) -> None:
...
def __len__(self): # -> int:
...
def __bytes__(self): # -> bytes:
...
def __str__(self) -> str:
...
class ManufacturerDataField:
"""A single piece of data within the manufacturer specific data. The format can be repeated."""
def __init__(self, key, value_format, field_names=...) -> None:
...
def __get__(self, obj, cls): # -> ManufacturerDataField | mdf_tuple | Any | Tuple[Any, ...] | tuple[None, ...] | None:
...
def __set__(self, obj, value): # -> None:
...
class ServiceData(AdvertisingDataField):
"""Encapsulates service data. It is read as a memoryview which can be manipulated or set as a
bytearray to change the size."""
def __init__(self, service) -> None:
...
def __get__(self, obj, cls): # -> ServiceData | memoryview | None:
...
def __set__(self, obj, value): # -> None:
...

View File

@ -0,0 +1,55 @@
"""
This type stub file was generated by pyright.
"""
import _bleio
"""
:py:mod:`~adafruit_ble.attributes`
====================================================
This module provides definitions common to all kinds of BLE attributes,
specifically characteristics and descriptors.
"""
__version__ = ...
__repo__ = ...
class Attribute:
"""Constants describing security levels.
.. data:: NO_ACCESS
security mode: access not allowed
.. data:: OPEN
security_mode: no security (link is not encrypted)
.. data:: ENCRYPT_NO_MITM
security_mode: unauthenticated encryption, without man-in-the-middle protection
.. data:: ENCRYPT_WITH_MITM
security_mode: authenticated encryption, with man-in-the-middle protection
.. data:: LESC_ENCRYPT_WITH_MITM
security_mode: LESC encryption, with man-in-the-middle protection
.. data:: SIGNED_NO_MITM
security_mode: unauthenticated data signing, without man-in-the-middle protection
.. data:: SIGNED_WITH_MITM
security_mode: authenticated data signing, without man-in-the-middle protection"""
NO_ACCESS = ...
OPEN = ...
ENCRYPT_NO_MITM = ...
ENCRYPT_WITH_MITM = ...
LESC_ENCRYPT_WITH_MITM = ...
SIGNED_NO_MITM = ...
SIGNED_WITH_MITM = ...

View File

@ -0,0 +1,120 @@
"""
This type stub file was generated by pyright.
"""
import struct
import _bleio
from ..attributes import Attribute
"""
This module provides core BLE characteristic classes that are used within Services.
"""
__version__ = ...
__repo__ = ...
class Characteristic:
"""
Top level Characteristic class that does basic binding.
:param UUID uuid: The uuid of the characteristic
:param int properties: The properties of the characteristic,
specified as a bitmask of these values bitwise-or'd together:
`BROADCAST`, `INDICATE`, `NOTIFY`, `READ`, `WRITE`, `WRITE_NO_RESPONSE`.
:param int read_perm: Specifies whether the characteristic can be read by a client,
and if so, which security mode is required.
Must be one of the integer values `Attribute.NO_ACCESS`, `Attribute.OPEN`,
`Attribute.ENCRYPT_NO_MITM`, `Attribute.ENCRYPT_WITH_MITM`,
`Attribute.LESC_ENCRYPT_WITH_MITM`,
`Attribute.SIGNED_NO_MITM`, or `Attribute.SIGNED_WITH_MITM`.
:param int write_perm: Specifies whether the characteristic can be written by a client,
and if so, which security mode is required. Values allowed are the same as ``read_perm``.
:param int max_length: Maximum length in bytes of the characteristic value. The maximum allowed
by the BLE specification is 512. On nRF, if ``fixed_length`` is ``True``, the maximum
is 510. The default value is 20, which is the maximum
number of data bytes that fit in a single BLE 4.x ATT packet.
:param bool fixed_length: True if the characteristic value is of fixed length.
:param buf initial_value: The initial value for this characteristic. If not given, will be
filled with zeros.
.. data:: BROADCAST
property: allowed in advertising packets
.. data:: INDICATE
property: server will indicate to the client when the value is set and wait for a response
.. data:: NOTIFY
property: server will notify the client when the value is set
.. data:: READ
property: clients may read this characteristic
.. data:: WRITE
property: clients may write this characteristic; a response will be sent back
.. data:: WRITE_NO_RESPONSE
property: clients may write this characteristic; no response will be sent back"""
BROADCAST = ...
INDICATE = ...
NOTIFY = ...
READ = ...
WRITE = ...
WRITE_NO_RESPONSE = ...
def __init__(self, *, uuid=..., properties=..., read_perm=..., write_perm=..., max_length=..., fixed_length=..., initial_value=...) -> None:
...
def __get__(self, service, cls=...): # -> Characteristic:
...
def __set__(self, service, value): # -> None:
...
class ComplexCharacteristic:
"""
Characteristic class that does complex binding where the subclass returns a full object for
interacting with the characteristic data. The Characteristic itself will be shadowed once it
has been bound to the corresponding instance attribute.
"""
def __init__(self, *, uuid=..., properties=..., read_perm=..., write_perm=..., max_length=..., fixed_length=..., initial_value=...) -> None:
...
def bind(self, service):
"""Binds the characteristic to the local Service or remote Characteristic object given."""
...
def __get__(self, service, cls=...): # -> ComplexCharacteristic:
...
class StructCharacteristic(Characteristic):
"""
Data descriptor for a structure with a fixed format.
:param struct_format: a `struct` format string describing how to pack multiple values
into the characteristic bytestring
:param UUID uuid: The uuid of the characteristic
:param int properties: see `Characteristic`
:param int read_perm: see `Characteristic`
:param int write_perm: see `Characteristic`
:param buf initial_value: see `Characteristic`
"""
def __init__(self, struct_format, *, uuid=..., properties=..., read_perm=..., write_perm=..., initial_value=...) -> None:
...
def __get__(self, obj, cls=...): # -> StructCharacteristic | Tuple[Any, ...] | None:
...
def __set__(self, obj, value): # -> None:
...

View File

@ -0,0 +1,49 @@
"""
This type stub file was generated by pyright.
"""
from . import ComplexCharacteristic
"""
`stream`
====================================================
This module provides stream characteristics that bind readable or writable objects to the Service
object they are on.
"""
__version__ = ...
__repo__ = ...
class BoundWriteStream:
"""Writes data out to the peer."""
def __init__(self, bound_characteristic) -> None:
...
def write(self, buf): # -> None:
"""Write data from buf out to the peer."""
...
class StreamOut(ComplexCharacteristic):
"""Output stream from the Service server."""
def __init__(self, *, uuid=..., timeout=..., buffer_size=..., properties=..., read_perm=..., write_perm=...) -> None:
...
def bind(self, service): # -> CharacteristicBuffer | BoundWriteStream:
"""Binds the characteristic to the given Service."""
...
class StreamIn(ComplexCharacteristic):
"""Input stream into the Service server."""
def __init__(self, *, uuid=..., timeout=..., buffer_size=..., properties=..., write_perm=...) -> None:
...
def bind(self, service): # -> BoundWriteStream | CharacteristicBuffer:
"""Binds the characteristic to the given Service."""
...

View File

@ -0,0 +1,36 @@
"""
This type stub file was generated by pyright.
"""
import _bleio
from ..characteristics import Characteristic, ComplexCharacteristic
"""
This module provides the top level Service definition.
"""
__version__ = ...
__repo__ = ...
class Service:
"""Top level Service class that handles the hard work of binding to a local or remote service.
Providers of a local service should instantiate their Service with service=None, the default.
The local Service's characteristics will be lazily made available to clients as they are used
locally. In other words, a characteristic won't be available to remote clients until it has
been read or written locally.
To use a remote Service, get the item with the key of the Service type on the
`BLEConnection`. For example, ``connection[UartService]`` will return the UartService
instance for the connection's peer.
"""
def __init__(self, *, service=..., secondary=..., **initial_values) -> None:
...
@property
def remote(self): # -> bool:
"""True if the service is provided by a peer and accessed remotely."""
...

View File

@ -0,0 +1,77 @@
"""
This type stub file was generated by pyright.
"""
from . import Service
"""
`nordic`
====================================================
This module provides Services used by Nordic Semiconductors.
"""
__version__ = ...
__repo__ = ...
class UARTService(Service):
"""
Provide UART-like functionality via the Nordic NUS service.
:param int timeout: the timeout in seconds to wait
for the first character and between subsequent characters.
:param int buffer_size: buffer up to this many bytes.
If more bytes are received, older bytes will be discarded.
See ``examples/ble_uart_echo_test.py`` for a usage example.
"""
uuid = ...
_server_tx = ...
_server_rx = ...
def __init__(self, service=...) -> None:
...
def read(self, nbytes=...):
"""
Read characters. If ``nbytes`` is specified then read at most that many bytes.
Otherwise, read everything that arrives until the connection times out.
Providing the number of bytes expected is highly recommended because it will be faster.
:return: Data read
:rtype: bytes or None
"""
...
def readinto(self, buf, nbytes=...):
"""
Read bytes into the ``buf``. If ``nbytes`` is specified then read at most
that many bytes. Otherwise, read at most ``len(buf)`` bytes.
:return: number of bytes read and stored into ``buf``
:rtype: int or None (on a non-blocking error)
"""
...
def readline(self):
"""
Read a line, ending in a newline character.
:return: the line read
:rtype: bytes or None
"""
...
@property
def in_waiting(self):
"""The number of bytes in the input buffer, available to be read."""
...
def reset_input_buffer(self): # -> None:
"""Discard any unread characters in the input buffer."""
...
def write(self, buf): # -> None:
"""Write a buffer of bytes."""
...

View File

@ -0,0 +1,48 @@
"""
This type stub file was generated by pyright.
"""
import struct
import _bleio
"""
This module provides core Unique ID (UUID) classes.
"""
__version__ = ...
__repo__ = ...
class UUID:
"""Top level UUID"""
def __hash__(self) -> int:
...
def __eq__(self, other) -> bool:
...
def __str__(self) -> str:
...
def __bytes__(self): # -> bytes:
...
def pack_into(self, buffer, offset=...): # -> None:
"""Packs the UUID into the buffer at the given offset."""
...
class StandardUUID(UUID):
"""Standard 16-bit UUID defined by the Bluetooth SIG."""
def __init__(self, uuid16) -> None:
...
class VendorUUID(UUID):
"""Vendor defined, 128-bit UUID."""
def __init__(self, uuid128) -> None:
...

5
typings/micropython.pyi Normal file
View File

@ -0,0 +1,5 @@
from typing import TypeVar
T = TypeVar('T')
def const(x: T) -> T: ...