Skip to content

change to ruff #55

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 15, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense

.py text eol=lf
.rst text eol=lf
.txt text eol=lf
.yaml text eol=lf
.toml text eol=lf
.license text eol=lf
.md text eol=lf
43 changes: 11 additions & 32 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,42 +1,21 @@
# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò
# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense

repos:
- repo: https://github.com/python/black
rev: 23.3.0
hooks:
- id: black
- repo: https://github.com/fsfe/reuse-tool
rev: v1.1.2
hooks:
- id: reuse
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
rev: v4.5.0
hooks:
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/pycqa/pylint
rev: v2.17.4
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.3.4
hooks:
- id: pylint
name: pylint (library code)
types: [python]
args:
- --disable=consider-using-f-string
exclude: "^(docs/|examples/|tests/|setup.py$)"
- id: pylint
name: pylint (example code)
description: Run pylint rules on "examples/*.py" files
types: [python]
files: "^examples/"
args:
- --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code
- id: pylint
name: pylint (test code)
description: Run pylint rules on "tests/*.py" files
types: [python]
files: "^tests/"
args:
- --disable=missing-docstring,consider-using-f-string,duplicate-code
- id: ruff-format
- id: ruff
args: ["--fix"]
- repo: https://github.com/fsfe/reuse-tool
rev: v3.0.1
hooks:
- id: reuse
399 changes: 0 additions & 399 deletions .pylintrc

This file was deleted.

6 changes: 3 additions & 3 deletions README.rst
Original file line number Diff line number Diff line change
@@ -14,9 +14,9 @@ Introduction
:target: https://github.com/adafruit/Adafruit_CircuitPython_RFM69/actions/
:alt: Build Status

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/psf/black
:alt: Code Style: Black
.. image:: https://img.shields.io/endpoint?url=https://github.com/raw/astral-sh/ruff/main/assets/badge/v2.json
:target: https://github.com/astral-sh/ruff
:alt: Code Style: Ruff

CircuitPython RFM69 packet radio module. This supports basic RadioHead-compatible sending and
receiving of packets with RFM69 series radios (433/915Mhz).
80 changes: 25 additions & 55 deletions adafruit_rfm69.py
Original file line number Diff line number Diff line change
@@ -47,8 +47,10 @@
https://github.com/adafruit/circuitpython/releases
* Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice
"""

import random
import time

import adafruit_bus_device.spi_device as spidev
from micropython import const

@@ -63,9 +65,10 @@

try:
from typing import Callable, Optional, Type
from circuitpython_typing import WriteableBuffer, ReadableBuffer
from digitalio import DigitalInOut

from busio import SPI
from circuitpython_typing import ReadableBuffer, WriteableBuffer
from digitalio import DigitalInOut
except ImportError:
pass

@@ -138,14 +141,7 @@
_TICKS_MAX = const(_TICKS_PERIOD - 1)
_TICKS_HALFPERIOD = const(_TICKS_PERIOD // 2)

# Disable the silly too many instance members warning. Pylint has no knowledge
# of the context and is merely guessing at the proper amount of members. This
# is a complex chip which requires exposing many attributes and state. Disable
# the warning to work around the error.
# pylint: disable=too-many-instance-attributes

# disable another pylint nit-pick
# pylint: disable=too-many-public-methods
# This is a complex chip which requires exposing many attributes and state.


def ticks_diff(ticks1: int, ticks2: int) -> int:
@@ -226,17 +222,11 @@ class _RegisterBits:
# used by the parent RFM69 class instance vs. each having their own
# buffer and taking too much memory).

# Quirk of pylint that it requires public methods for a class. This
# is a decorator class in Python and by design it has no public methods.
# Instead it uses dunder accessors like get and set below. For some
# reason pylint can't figure this out so disable the check.
# pylint: disable=too-few-public-methods
# This is a decorator class in Python and by design it has no public methods.
# Instead it uses dunder accessors like get and set below.

# Again pylint fails to see the true intent of this code and warns
# against private access by calling the write and read functions below.
# This is by design as this is an internally used class. Disable the
# check from pylint.
# pylint: disable=protected-access
# This is an internally used class that calls the read/write functions
# of the parent class.

def __init__(self, address: int, *, offset: int = 0, bits: int = 1) -> None:
assert 0 <= offset <= 7
@@ -287,20 +277,18 @@ def __set__(self, obj: Optional["RFM69"], val: int) -> None:
mode_ready = _RegisterBits(_REG_IRQ_FLAGS1, offset=7)
dio_0_mapping = _RegisterBits(_REG_DIO_MAPPING1, offset=6, bits=2)

# pylint: disable=too-many-statements
# pylint: disable=too-many-arguments
def __init__( # pylint: disable=invalid-name
def __init__(
self,
spi: SPI,
cs: DigitalInOut,
reset: DigitalInOut,
frequency: int,
*,
sync_word: bytes = b"\x2D\xD4",
sync_word: bytes = b"\x2d\xd4",
preamble_length: int = 4,
encryption_key: Optional[bytes] = None,
high_power: bool = True,
baudrate: int = 2000000
baudrate: int = 2000000,
) -> None:
self._tx_power = 13
self.high_power = high_power
@@ -312,7 +300,7 @@ def __init__( # pylint: disable=invalid-name
self.reset() # Reset the chip.
# Check the version of the chip.
version = self._read_u8(_REG_VERSION)
if version not in (0x23, 0x24):
if version not in {0x23, 0x24}:
raise RuntimeError("Invalid RFM69 version, check wiring!")
self.idle() # Enter idle state.
# Setup the chip in a similar way to the RadioHead RFM69 library.
@@ -395,13 +383,8 @@ def __init__( # pylint: disable=invalid-name
Fourth byte of the RadioHead header.
"""

# pylint: enable=too-many-statements

# pylint: disable=no-member
# Reconsider this disable when it can be tested.
def _read_into(
self, address: int, buf: WriteableBuffer, length: Optional[int] = None
) -> None:
def _read_into(self, address: int, buf: WriteableBuffer, length: Optional[int] = None) -> None:
# Read a number of bytes from the specified address into the provided
# buffer. If length is not specified (the default) the entire buffer
# will be filled.
@@ -418,9 +401,7 @@ def _read_u8(self, address: int) -> int:
self._read_into(address, self._BUFFER, length=1)
return self._BUFFER[0]

def _write_from(
self, address: int, buf: ReadableBuffer, length: Optional[int] = None
) -> None:
def _write_from(self, address: int, buf: ReadableBuffer, length: Optional[int] = None) -> None:
# Write a number of bytes to the provided address and taken from the
# provided buffer. If no length is specified (the default) the entire
# buffer is written.
@@ -749,7 +730,6 @@ def payload_ready(self) -> bool:
"""Receive status"""
return (self._read_u8(_REG_IRQ_FLAGS2) & 0x4) >> 2

# pylint: disable=too-many-branches
def send(
self,
data: ReadableBuffer,
@@ -758,7 +738,7 @@ def send(
destination: Optional[int] = None,
node: Optional[int] = None,
identifier: Optional[int] = None,
flags: Optional[int] = None
flags: Optional[int] = None,
) -> bool:
"""Send a string of data using the transmitter.
You can only send 60 bytes at a time
@@ -773,13 +753,8 @@ def send(
Returns: True if success or False if the send timed out.
"""
# Disable pylint warning to not use length as a check for zero.
# This is a puzzling warning as the below code is clearly the most
# efficient and proper way to ensure a precondition that the provided
# buffer be within an expected range of bounds. Disable this check.
# pylint: disable=len-as-condition
# Ensure the provided buffer is within the expected range of bounds.
assert 0 < len(data) <= 60
# pylint: enable=len-as-condition
self.idle() # Stop receiving to clear FIFO and keep it clear.
# Fill the FIFO with a packet to send.
# Combine header and data to form payload
@@ -859,7 +834,7 @@ def receive(
keep_listening: bool = True,
with_ack: bool = False,
timeout: Optional[float] = None,
with_header: bool = False
with_header: bool = False,
) -> int:
"""Wait to receive a packet from the receiver. If a packet is found the payload bytes
are returned, otherwise None is returned (which indicates the timeout elapsed with no
@@ -904,11 +879,10 @@ def receive(
if fifo_length < 5:
packet = None
else:
if (
self.node != _RH_BROADCAST_ADDRESS
and packet[0] != _RH_BROADCAST_ADDRESS
and packet[0] != self.node
):
if self.node != _RH_BROADCAST_ADDRESS and packet[0] not in {
_RH_BROADCAST_ADDRESS,
self.node,
}:
packet = None
# send ACK unless this was an ACK or a broadcast
elif (
@@ -928,15 +902,11 @@ def receive(
flags=(packet[3] | _RH_FLAGS_ACK),
)
# reject Retries if we have seen this idetifier from this source before
if (self.seen_ids[packet[1]] == packet[2]) and (
packet[3] & _RH_FLAGS_RETRY
):
if (self.seen_ids[packet[1]] == packet[2]) and (packet[3] & _RH_FLAGS_RETRY):
packet = None
else: # save the packet identifier for this source
self.seen_ids[packet[1]] = packet[2]
if (
not with_header and packet is not None
): # skip the header if not wanted
if not with_header and packet is not None: # skip the header if not wanted
packet = packet[4:]
# Listen again if necessary and return the result packet.
if keep_listening:
6 changes: 6 additions & 0 deletions docs/api.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@

.. If you created a package, create one automodule per module in the package.
.. If your library file(s) are nested in a directory (e.g. /adafruit_foo/foo.py)
.. use this format as the module name: "adafruit_foo.foo"
API Reference
#############

.. automodule:: adafruit_rfm69
:members:
8 changes: 2 additions & 6 deletions docs/conf.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
# -*- coding: utf-8 -*-

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
#
# SPDX-License-Identifier: MIT

import datetime
import os
import sys
import datetime

sys.path.insert(0, os.path.abspath(".."))

@@ -49,9 +47,7 @@
creation_year = "2017"
current_year = str(datetime.datetime.now().year)
year_duration = (
current_year
if current_year == creation_year
else creation_year + " - " + current_year
current_year if current_year == creation_year else creation_year + " - " + current_year
)
copyright = year_duration + " Tony DiCola"
author = "Tony DiCola"
10 changes: 4 additions & 6 deletions examples/rfm69_header.py
Original file line number Diff line number Diff line change
@@ -3,10 +3,10 @@

# Example to display raw packets including header

#
import board
import busio
import digitalio

import adafruit_rfm69

# set the time interval (seconds) for sending packets
@@ -28,9 +28,7 @@

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# Wait to receive packets.
print("Waiting for packets...")
@@ -43,6 +41,6 @@
# Received a packet!
# Print out the raw bytes of the packet:
print("Received (raw header):", [hex(x) for x in packet[0:4]])
print("Received (raw payload): {0}".format(packet[4:]))
print("RSSI: {0}".format(rfm69.last_rssi))
print(f"Received (raw payload): {packet[4:]}")
print(f"RSSI: {rfm69.last_rssi}")
# send reading after any packet received
19 changes: 7 additions & 12 deletions examples/rfm69_node1.py
Original file line number Diff line number Diff line change
@@ -4,11 +4,12 @@
# Example to send a packet periodically between addressed nodes

import time

import board
import busio
import digitalio
import adafruit_rfm69

import adafruit_rfm69

# set the time interval (seconds) for sending packets
transmit_interval = 10
@@ -28,19 +29,15 @@

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# set node addresses
rfm69.node = 1
rfm69.destination = 2
# initialize counter
counter = 0
# send a broadcast message from my_node with ID = counter
rfm69.send(
bytes("Startup message {} from node {}".format(counter, rfm69.node), "UTF-8")
)
rfm69.send(bytes(f"Startup message {counter} from node {rfm69.node}", "UTF-8"))

# Wait to receive packets.
print("Waiting for packets...")
@@ -53,16 +50,14 @@
# Received a packet!
# Print out the raw bytes of the packet:
print("Received (raw header):", [hex(x) for x in packet[0:4]])
print("Received (raw payload): {0}".format(packet[4:]))
print("Received RSSI: {0}".format(rfm69.last_rssi))
print(f"Received (raw payload): {packet[4:]}")
print(f"Received RSSI: {rfm69.last_rssi}")
if time.monotonic() - now > transmit_interval:
now = time.monotonic()
counter = counter + 1
# send a mesage to destination_node from my_node
rfm69.send(
bytes(
"message number {} from node {}".format(counter, rfm69.node), "UTF-8"
),
bytes(f"message number {counter} from node {rfm69.node}", "UTF-8"),
keep_listening=True,
)
button_pressed = None
14 changes: 7 additions & 7 deletions examples/rfm69_node1_ack.py
Original file line number Diff line number Diff line change
@@ -4,9 +4,11 @@
# Example to send a packet periodically between addressed nodes with ACK

import time

import board
import busio
import digitalio

import adafruit_rfm69

# set the time interval (seconds) for sending packets
@@ -28,9 +30,7 @@

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# set delay before sending ACK
rfm69.ack_delay = 0.1
@@ -41,7 +41,7 @@
counter = 0
ack_failed_counter = 0
# send startup message from my_node
rfm69.send_with_ack(bytes("startup message from node {}".format(rfm69.node), "UTF-8"))
rfm69.send_with_ack(bytes(f"startup message from node {rfm69.node}", "UTF-8"))

# Wait to receive packets.
print("Waiting for packets...")
@@ -55,16 +55,16 @@
# Received a packet!
# Print out the raw bytes of the packet:
print("Received (raw header):", [hex(x) for x in packet[0:4]])
print("Received (raw payload): {0}".format(packet[4:]))
print("RSSI: {0}".format(rfm69.last_rssi))
print(f"Received (raw payload): {packet[4:]}")
print(f"RSSI: {rfm69.last_rssi}")
# send reading after any packet received
if time.monotonic() - time_now > transmit_interval:
# reset timeer
time_now = time.monotonic()
counter += 1
# send a mesage to destination_node from my_node
if not rfm69.send_with_ack(
bytes("message from node node {} {}".format(rfm69.node, counter), "UTF-8")
bytes(f"message from node node {rfm69.node} {counter}", "UTF-8")
):
ack_failed_counter += 1
print(" No Ack: ", counter, ack_failed_counter)
20 changes: 7 additions & 13 deletions examples/rfm69_node1_bonnet.py
Original file line number Diff line number Diff line change
@@ -3,12 +3,12 @@

# Example to send a packet periodically between addressed nodes

# Import the SSD1306 module.
import adafruit_ssd1306
import board
import busio
import digitalio

# Import the SSD1306 module.
import adafruit_ssd1306
import adafruit_rfm69

# Button A
@@ -68,19 +68,15 @@

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# set node addresses
rfm69.node = 1
rfm69.destination = 2
# initialize counter
counter = 0
# send a broadcast message from my_node with ID = counter
rfm69.send(
bytes("Startup message {} from node {}".format(counter, rfm69.node), "UTF-8")
)
rfm69.send(bytes(f"Startup message {counter} from node {rfm69.node}", "UTF-8"))

# Wait to receive packets.
print("Waiting for packets...")
@@ -93,8 +89,8 @@
# Received a packet!
# Print out the raw bytes of the packet:
print("Received (raw header):", [hex(x) for x in packet[0:4]])
print("Received (raw payload): {0}".format(packet[4:]))
print("Received RSSI: {0}".format(rfm69.last_rssi))
print(f"Received (raw payload): {packet[4:]}")
print(f"Received RSSI: {rfm69.last_rssi}")
# Check buttons
if not btnA.value:
button_pressed = "A"
@@ -120,9 +116,7 @@
# send a mesage to destination_node from my_node
rfm69.send(
bytes(
"message number {} from node {} button {}".format(
counter, rfm69.node, button_pressed
),
f"message number {counter} from node {rfm69.node} button {button_pressed}",
"UTF-8",
),
keep_listening=True,
14 changes: 7 additions & 7 deletions examples/rfm69_node2.py
Original file line number Diff line number Diff line change
@@ -4,9 +4,11 @@
# Example to send a packet periodically between addressed nodes

import time

import board
import busio
import digitalio

import adafruit_rfm69

# Define radio parameters.
@@ -25,17 +27,15 @@

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# set node addresses
rfm69.node = 2
rfm69.destination = 1
# initialize counter
counter = 0
# send a broadcast message from my_node with ID = counter
rfm69.send(bytes("startup message from node {} ".format(rfm69.node), "UTF-8"))
rfm69.send(bytes(f"startup message from node {rfm69.node} ", "UTF-8"))

# Wait to receive packets.
print("Waiting for packets...")
@@ -49,8 +49,8 @@
# Received a packet!
# Print out the raw bytes of the packet:
print("Received (raw header):", [hex(x) for x in packet[0:4]])
print("Received (raw payload): {0}".format(packet[4:]))
print("Received RSSI: {0}".format(rfm69.last_rssi))
print(f"Received (raw payload): {packet[4:]}")
print(f"Received RSSI: {rfm69.last_rssi}")
# send reading after any packet received
counter = counter + 1
# after 10 messages send a response to destination_node from my_node with ID = counter&0xff
@@ -59,7 +59,7 @@
rfm69.identifier = counter & 0xFF
rfm69.send(
bytes(
"message number {} from node {} ".format(counter, rfm69.node),
f"message number {counter} from node {rfm69.node} ",
"UTF-8",
),
keep_listening=True,
14 changes: 6 additions & 8 deletions examples/rfm69_node2_ack.py
Original file line number Diff line number Diff line change
@@ -4,9 +4,11 @@
# Example to receive addressed packed with ACK and send a response

import time

import board
import busio
import digitalio

import adafruit_rfm69

# Define radio parameters.
@@ -25,9 +27,7 @@

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# set delay before transmitting ACK (seconds)
rfm69.ack_delay = 0.1
@@ -48,14 +48,12 @@
# Received a packet!
# Print out the raw bytes of the packet:
print("Received (raw header):", [hex(x) for x in packet[0:4]])
print("Received (raw payload): {0}".format(packet[4:]))
print("RSSI: {0}".format(rfm69.last_rssi))
print(f"Received (raw payload): {packet[4:]}")
print(f"RSSI: {rfm69.last_rssi}")
# send response 2 sec after any packet received
time.sleep(2)
counter += 1
# send a mesage to destination_node from my_node
if not rfm69.send_with_ack(
bytes("response from node {} {}".format(rfm69.node, counter), "UTF-8")
):
if not rfm69.send_with_ack(bytes(f"response from node {rfm69.node} {counter}", "UTF-8")):
ack_failed_counter += 1
print(" No Ack: ", counter, ack_failed_counter)
26 changes: 11 additions & 15 deletions examples/rfm69_rpi_interrupt.py
Original file line number Diff line number Diff line change
@@ -6,31 +6,29 @@
# This example is for systems that support interrupts like the Raspberry Pi with "blinka"
# CircuitPython does not support interrupts so it will not work on Circutpython boards
import time

import board
import busio
import digitalio
import RPi.GPIO as io

import adafruit_rfm69


# setup interrupt callback function
def rfm69_callback(rfm69_irq):
global packet_received # pylint: disable=global-statement
print(
"IRQ detected on pin {0} payload_ready {1} ".format(
rfm69_irq, rfm69.payload_ready
)
)
global packet_received # noqa: PLW0603
print(f"IRQ detected on pin {rfm69_irq} payload_ready {rfm69.payload_ready} ")
# see if this was a payload_ready interrupt ignore if not
if rfm69.payload_ready:
packet = rfm69.receive(timeout=None)
if packet is not None:
# Received a packet!
packet_received = True
# Print out the raw bytes of the packet:
print("Received (raw bytes): {0}".format(packet))
print(f"Received (raw bytes): {packet}")
print([hex(x) for x in packet])
print("RSSI: {0}".format(rfm69.last_rssi))
print(f"RSSI: {rfm69.last_rssi}")


# Define radio parameters.
@@ -49,15 +47,13 @@ def rfm69_callback(rfm69_irq):

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# Print out some chip state:
print("Temperature: {0}C".format(rfm69.temperature))
print("Frequency: {0}mhz".format(rfm69.frequency_mhz))
print("Bit rate: {0}kbit/s".format(rfm69.bitrate / 1000))
print("Frequency deviation: {0}hz".format(rfm69.frequency_deviation))
print(f"Temperature: {rfm69.temperature}C")
print(f"Frequency: {rfm69.frequency_mhz}mhz")
print(f"Bit rate: {rfm69.bitrate / 1000}kbit/s")
print(f"Frequency deviation: {rfm69.frequency_deviation}hz")

# configure the interrupt pin and event handling.
RFM69_G0 = 22
17 changes: 7 additions & 10 deletions examples/rfm69_rpi_simpletest.py
Original file line number Diff line number Diff line change
@@ -11,7 +11,6 @@

import adafruit_rfm69


# Define radio parameters.
RADIO_FREQ_MHZ = 915.0 # Frequency of the radio in Mhz. Must match your
# module! Can be a value like 915.0, 433.0, etc.
@@ -33,15 +32,13 @@

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# Print out some chip state:
print("Temperature: {0}C".format(rfm69.temperature))
print("Frequency: {0}mhz".format(rfm69.frequency_mhz))
print("Bit rate: {0}kbit/s".format(rfm69.bitrate / 1000))
print("Frequency deviation: {0}hz".format(rfm69.frequency_deviation))
print(f"Temperature: {rfm69.temperature}C")
print(f"Frequency: {rfm69.frequency_mhz}mhz")
print(f"Bit rate: {rfm69.bitrate / 1000}kbit/s")
print(f"Frequency deviation: {rfm69.frequency_deviation}hz")

# Send a packet. Note you can only send a packet up to 60 bytes in length.
# This is a limitation of the radio packet size, so if you need to send larger
@@ -66,10 +63,10 @@
else:
# Received a packet!
# Print out the raw bytes of the packet:
print("Received (raw bytes): {0}".format(packet))
print(f"Received (raw bytes): {packet}")
# And decode to ASCII text and print it too. Note that you always
# receive raw bytes and need to convert to a text format like ASCII
# if you intend to do string processing on your data. Make sure the
# sending side is sending ASCII data before you try to decode!
packet_text = str(packet, "ascii")
print("Received (ASCII): {0}".format(packet_text))
print(f"Received (ASCII): {packet_text}")
17 changes: 7 additions & 10 deletions examples/rfm69_simpletest.py
Original file line number Diff line number Diff line change
@@ -10,7 +10,6 @@

import adafruit_rfm69


# Define radio parameters.
RADIO_FREQ_MHZ = 915.0 # Frequency of the radio in Mhz. Must match your
# module! Can be a value like 915.0, 433.0, etc.
@@ -35,15 +34,13 @@

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# Print out some chip state:
print("Temperature: {0}C".format(rfm69.temperature))
print("Frequency: {0}mhz".format(rfm69.frequency_mhz))
print("Bit rate: {0}kbit/s".format(rfm69.bitrate / 1000))
print("Frequency deviation: {0}hz".format(rfm69.frequency_deviation))
print(f"Temperature: {rfm69.temperature}C")
print(f"Frequency: {rfm69.frequency_mhz}mhz")
print(f"Bit rate: {rfm69.bitrate / 1000}kbit/s")
print(f"Frequency deviation: {rfm69.frequency_deviation}hz")

# Send a packet. Note you can only send a packet up to 60 bytes in length.
# This is a limitation of the radio packet size, so if you need to send larger
@@ -70,10 +67,10 @@
# Received a packet!
LED.value = True
# Print out the raw bytes of the packet:
print("Received (raw bytes): {0}".format(packet))
print(f"Received (raw bytes): {packet}")
# And decode to ASCII text and print it too. Note that you always
# receive raw bytes and need to convert to a text format like ASCII
# if you intend to do string processing on your data. Make sure the
# sending side is sending ASCII data before you try to decode!
packet_text = str(packet, "ascii")
print("Received (ASCII): {0}".format(packet_text))
print(f"Received (ASCII): {packet_text}")
12 changes: 6 additions & 6 deletions examples/rfm69_transmit.py
Original file line number Diff line number Diff line change
@@ -4,9 +4,11 @@
# Example to send a packet periodically

import time

import board
import busio
import digitalio

import adafruit_rfm69

# set the time interval (seconds) for sending packets
@@ -28,14 +30,12 @@

# Optionally set an encryption key (16 byte AES key). MUST match both
# on the transmitter and receiver (or be set to None to disable/the default).
rfm69.encryption_key = (
b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"
)
rfm69.encryption_key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08"

# initialize counter
counter = 0
# send a broadcast mesage
rfm69.send(bytes("message number {}".format(counter), "UTF-8"))
rfm69.send(bytes(f"message number {counter}", "UTF-8"))

# Wait to receive packets.
print("Waiting for packets...")
@@ -49,12 +49,12 @@
if packet is not None:
# Received a packet!
# Print out the raw bytes of the packet:
print("Received (raw bytes): {0}".format(packet))
print(f"Received (raw bytes): {packet}")
# send reading after any packet received
if time.monotonic() - time_now > transmit_interval:
# reset timeer
time_now = time.monotonic()
# clear flag to send data
send_reading = False
counter = counter + 1
rfm69.send(bytes("message number {}".format(counter), "UTF-8"))
rfm69.send(bytes(f"message number {counter}", "UTF-8"))
105 changes: 105 additions & 0 deletions ruff.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries
#
# SPDX-License-Identifier: MIT

target-version = "py38"
line-length = 100

[lint]
preview = true
select = ["I", "PL", "UP"]

extend-select = [
"D419", # empty-docstring
"E501", # line-too-long
"W291", # trailing-whitespace
"PLC0414", # useless-import-alias
"PLC2401", # non-ascii-name
"PLC2801", # unnecessary-dunder-call
"PLC3002", # unnecessary-direct-lambda-call
"E999", # syntax-error
"PLE0101", # return-in-init
"F706", # return-outside-function
"F704", # yield-outside-function
"PLE0116", # continue-in-finally
"PLE0117", # nonlocal-without-binding
"PLE0241", # duplicate-bases
"PLE0302", # unexpected-special-method-signature
"PLE0604", # invalid-all-object
"PLE0605", # invalid-all-format
"PLE0643", # potential-index-error
"PLE0704", # misplaced-bare-raise
"PLE1141", # dict-iter-missing-items
"PLE1142", # await-outside-async
"PLE1205", # logging-too-many-args
"PLE1206", # logging-too-few-args
"PLE1307", # bad-string-format-type
"PLE1310", # bad-str-strip-call
"PLE1507", # invalid-envvar-value
"PLE2502", # bidirectional-unicode
"PLE2510", # invalid-character-backspace
"PLE2512", # invalid-character-sub
"PLE2513", # invalid-character-esc
"PLE2514", # invalid-character-nul
"PLE2515", # invalid-character-zero-width-space
"PLR0124", # comparison-with-itself
"PLR0202", # no-classmethod-decorator
"PLR0203", # no-staticmethod-decorator
"UP004", # useless-object-inheritance
"PLR0206", # property-with-parameters
"PLR0904", # too-many-public-methods
"PLR0911", # too-many-return-statements
"PLR0912", # too-many-branches
"PLR0913", # too-many-arguments
"PLR0914", # too-many-locals
"PLR0915", # too-many-statements
"PLR0916", # too-many-boolean-expressions
"PLR1702", # too-many-nested-blocks
"PLR1704", # redefined-argument-from-local
"PLR1711", # useless-return
"C416", # unnecessary-comprehension
"PLR1733", # unnecessary-dict-index-lookup
"PLR1736", # unnecessary-list-index-lookup

# ruff reports this rule is unstable
#"PLR6301", # no-self-use

"PLW0108", # unnecessary-lambda
"PLW0120", # useless-else-on-loop
"PLW0127", # self-assigning-variable
"PLW0129", # assert-on-string-literal
"B033", # duplicate-value
"PLW0131", # named-expr-without-context
"PLW0245", # super-without-brackets
"PLW0406", # import-self
"PLW0602", # global-variable-not-assigned
"PLW0603", # global-statement
"PLW0604", # global-at-module-level

# fails on the try: import typing used by libraries
#"F401", # unused-import

"F841", # unused-variable
"E722", # bare-except
"PLW0711", # binary-op-exception
"PLW1501", # bad-open-mode
"PLW1508", # invalid-envvar-default
"PLW1509", # subprocess-popen-preexec-fn
"PLW2101", # useless-with-lock
"PLW3301", # nested-min-max
]

ignore = [
"PLR2004", # magic-value-comparison
"UP030", # format literals
"PLW1514", # unspecified-encoding
"PLR0913", # too-many-arguments
"PLR0915", # too-many-statements
"PLR0917", # too-many-positional-arguments
"PLR0904", # too-many-public-methods
"PLR0912", # too-many-branches
"PLR0916", # too-many-boolean-expressions
]

[format]
line-ending = "lf"