From 3f1996faf2d6c391252de20046dcb7dc6730e6f6 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Mon, 19 May 2025 19:10:42 -0400 Subject: [PATCH 01/13] Add beacon functionality --- .gitignore | 1 + lib/proveskit_rp2040_v4/__init__.py | 0 lib/proveskit_rp2040_v4/register.py | 8 ++++ main.py | 69 +++++++++++++++++------------ repl.py | 7 +-- 5 files changed, 51 insertions(+), 34 deletions(-) create mode 100644 lib/proveskit_rp2040_v4/__init__.py create mode 100644 lib/proveskit_rp2040_v4/register.py diff --git a/.gitignore b/.gitignore index 75b636d..0d454ea 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ firmware.uf2 # libs /lib/* !/lib/requirements.txt +!/lib/proveskit_rp2040_v4/ diff --git a/lib/proveskit_rp2040_v4/__init__.py b/lib/proveskit_rp2040_v4/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/proveskit_rp2040_v4/register.py b/lib/proveskit_rp2040_v4/register.py new file mode 100644 index 0000000..46bbc83 --- /dev/null +++ b/lib/proveskit_rp2040_v4/register.py @@ -0,0 +1,8 @@ +class Register: + boot_count = 0 + error_count = 7 + flag = 16 + + +class BitIndex: + use_fsk = 7 diff --git a/main.py b/main.py index 62b28c2..619b4eb 100644 --- a/main.py +++ b/main.py @@ -23,7 +23,8 @@ import os import lib.pysquared.functions as functions -import lib.pysquared.nvm.register as register +from lib.proveskit_rp2040_v4.register import BitIndex, Register +from lib.pysquared.beacon import Beacon from lib.pysquared.cdh import CommandDataHandler from lib.pysquared.config.config import Config from lib.pysquared.hardware.busio import _spi_init, initialize_i2c_bus @@ -35,15 +36,20 @@ from lib.pysquared.nvm.counter import Counter from lib.pysquared.nvm.flag import Flag from lib.pysquared.rtc.manager.microcontroller import MicrocontrollerManager -from lib.pysquared.satellite import Satellite from lib.pysquared.sleep_helper import SleepHelper from lib.pysquared.watchdog import Watchdog from version import __version__ +boot_time: float = time.monotonic() + rtc = MicrocontrollerManager() +(boot_count := Counter(index=Register.boot_count)).increment() +error_count: Counter = Counter(index=Register.error_count) +use_fsk = Flag(index=Register.flag, bit_index=BitIndex.use_fsk) + logger: Logger = Logger( - error_counter=Counter(index=register.ERRORCNT), + error_counter=error_count, colorized=False, ) @@ -53,9 +59,8 @@ software_version=__version__, ) -loiter_time: int = 5 - try: + loiter_time: int = 5 for i in range(loiter_time): logger.info(f"Code Starting in {loiter_time-i} seconds") time.sleep(1) @@ -77,7 +82,7 @@ radio = RFM9xManager( logger, config.radio, - Flag(index=register.FLAG, bit_index=7), + use_fsk, spi0, initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True), initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), @@ -94,38 +99,43 @@ imu = LSM6DSOXManager(logger, i2c1, 0x6B) - c = Satellite(logger, config) - - sleep_helper = SleepHelper(c, logger, watchdog, config) + sleep_helper = SleepHelper(logger, watchdog, config) cdh = CommandDataHandler(config, logger, radio) + beacon = Beacon( + logger, + config.cubesat_name, + radio, + boot_time, + imu, + magnetometer, + radio, + use_fsk, + error_count, + boot_count, + ) + f = functions.functions( - c, logger, config, sleep_helper, radio, - magnetometer, - imu, watchdog, cdh, ) def initial_boot(): watchdog.pet() - f.beacon() + beacon.send() watchdog.pet() f.listen() watchdog.pet() try: - c.boot_count.increment() - logger.info( "FC Board Stats", bytes_remaining=gc.mem_free(), - boot_number=c.boot_count.get(), ) initial_boot() @@ -146,11 +156,12 @@ def send_imu_data(): radio.send(IMUData) def main(): - f.beacon() + beacon.send() f.listen_loiter() - f.state_of_health() + # TODO(nateinaction): replace me + # f.state_of_health() f.listen_loiter() @@ -182,22 +193,22 @@ def minimum_power_operations(): try: while True: # L0 automatic tasks no matter the battery level - c.check_reboot() + # TODO(nateinaction): reemplement power level check when we have state of health + # c.check_reboot() - if c.power_mode == "critical": - critical_power_operations() + # if c.power_mode == "critical": + # critical_power_operations() - elif c.power_mode == "minimum": - minimum_power_operations() + # elif c.power_mode == "minimum": + # minimum_power_operations() - elif c.power_mode == "normal": - main() + # elif c.power_mode == "normal": + # main() - elif c.power_mode == "maximum": - main() + # elif c.power_mode == "maximum": + # main() - else: - f.listen() + main() except Exception as e: logger.critical("Critical in Main Loop", e) diff --git a/repl.py b/repl.py index 1ba2b67..3dd7438 100644 --- a/repl.py +++ b/repl.py @@ -1,13 +1,10 @@ -import lib.pysquared.nvm.register as register +from lib.proveskit_rp2040_v4.register import Register from lib.pysquared.config.config import Config from lib.pysquared.logger import Logger from lib.pysquared.nvm.counter import Counter -from lib.pysquared.satellite import Satellite logger: Logger = Logger( - error_counter=Counter(index=register.ERRORCNT), + error_counter=Counter(index=Register.error_count), colorized=False, ) config: Config = Config("config.json") -logger.info("Initializing a cubesat object as `c` in the REPL...") -c: Satellite = Satellite(logger, config) From d01008f224c342a2a89b6e186e28ad46289b685b Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Fri, 30 May 2025 20:42:17 -0400 Subject: [PATCH 02/13] Using packet manager --- config.json | 2 +- main.py | 102 +++++++++++++++++++++++++++++++++++++--------------- uv.lock | 66 ---------------------------------- 3 files changed, 75 insertions(+), 95 deletions(-) diff --git a/config.json b/config.json index af56489..2e9e731 100644 --- a/config.json +++ b/config.json @@ -56,7 +56,7 @@ "longest_allowable_sleep_time": 600, "turbo_clock": false, "radio": { - "license": "", + "license": "KK4PDM", "receiver_id": 250, "sender_id": 251, "start_time": 80000, diff --git a/main.py b/main.py index 619b4eb..4f67f5d 100644 --- a/main.py +++ b/main.py @@ -9,6 +9,8 @@ """ import gc +import os +import random import time import digitalio @@ -20,9 +22,6 @@ except ImportError: import board -import os - -import lib.pysquared.functions as functions from lib.proveskit_rp2040_v4.register import BitIndex, Register from lib.pysquared.beacon import Beacon from lib.pysquared.cdh import CommandDataHandler @@ -32,6 +31,7 @@ from lib.pysquared.hardware.imu.manager.lsm6dsox import LSM6DSOXManager from lib.pysquared.hardware.magnetometer.manager.lis2mdl import LIS2MDLManager from lib.pysquared.hardware.radio.manager.rfm9x import RFM9xManager +from lib.pysquared.hardware.radio.packetizer.packet_manager import PacketManager from lib.pysquared.logger import Logger from lib.pysquared.nvm.counter import Counter from lib.pysquared.nvm.flag import Flag @@ -40,7 +40,7 @@ from lib.pysquared.watchdog import Watchdog from version import __version__ -boot_time: float = time.monotonic() +boot_time: float = time.time() rtc = MicrocontrollerManager() @@ -88,6 +88,13 @@ initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), ) + packet_manager = PacketManager( + logger, + radio, + config.radio.license, + 0.2, + ) + i2c1 = initialize_i2c_bus( logger, board.I2C1_SCL, @@ -106,7 +113,7 @@ beacon = Beacon( logger, config.cubesat_name, - radio, + packet_manager, boot_time, imu, magnetometer, @@ -116,20 +123,13 @@ boot_count, ) - f = functions.functions( - logger, - config, - sleep_helper, - radio, - watchdog, - cdh, - ) - def initial_boot(): watchdog.pet() beacon.send() watchdog.pet() - f.listen() + message: bytes | None = packet_manager.listen() + if message: + cdh.message_handler(message) watchdog.pet() try: @@ -153,41 +153,87 @@ def send_imu_data(): logger.info("IMU has baton") IMUData = imu.get_gyro_data() watchdog.pet() - radio.send(IMUData) + packet_manager.send(str(IMUData).encode("utf-8")) def main(): + radio.send(config.radio.license.encode("utf-8")) + beacon.send() - f.listen_loiter() + watchdog.pet() + + message: bytes | None = packet_manager.listen() + if message: + cdh.message_handler(message) + + watchdog.pet() + + sleep_helper.safe_sleep(config.sleep_duration) + + watchdog.pet() # TODO(nateinaction): replace me # f.state_of_health() - f.listen_loiter() + message: bytes | None = packet_manager.listen() + if message: + cdh.message_handler(message) + + watchdog.pet() + + sleep_helper.safe_sleep(config.sleep_duration) + + watchdog.pet() + + message: bytes | None = packet_manager.listen() + if message: + cdh.message_handler(message) watchdog.pet() - f.listen_loiter() + sleep_helper.safe_sleep(config.sleep_duration) + + watchdog.pet() send_imu_data() - f.listen_loiter() + watchdog.pet() - f.joke() + message: bytes | None = packet_manager.listen() + if message: + cdh.message_handler(message) - f.listen_loiter() + watchdog.pet() + + sleep_helper.safe_sleep(config.sleep_duration) - def critical_power_operations(): - initial_boot() watchdog.pet() - sleep_helper.long_hibernate() + packet_manager.send(random.choice(config.jokes).encode("utf-8")) + + watchdog.pet() + + message: bytes | None = packet_manager.listen() + if message: + cdh.message_handler(message) + + watchdog.pet() + + sleep_helper.safe_sleep(config.sleep_duration) - def minimum_power_operations(): - initial_boot() watchdog.pet() - sleep_helper.short_hibernate() + # def critical_power_operations(): + # initial_boot() + # watchdog.pet() + + # sleep_helper.long_hibernate() + + # def minimum_power_operations(): + # initial_boot() + # watchdog.pet() + + # sleep_helper.short_hibernate() ######################### MAIN LOOP ############################## try: diff --git a/uv.lock b/uv.lock index f7bf2fa..1a0d04c 100644 --- a/uv.lock +++ b/uv.lock @@ -101,15 +101,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/6b/0f13486003aea3eb349c2946b7ec9753e7558b78e35d22c938062a96959c/binho_host_adapter-0.1.6-py3-none-any.whl", hash = "sha256:f71ca176c1e2fc1a5dce128beb286da217555c6c7c805f2ed282a6f3507ec277", size = 10540 }, ] -[[package]] -name = "certifi" -version = "2025.4.26" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618 }, -] - [[package]] name = "cfgv" version = "3.4.0" @@ -119,28 +110,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, ] -[[package]] -name = "charset-normalizer" -version = "3.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622 }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435 }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653 }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231 }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243 }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442 }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147 }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057 }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454 }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174 }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166 }, - { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064 }, - { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641 }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626 }, -] - [[package]] name = "circuitpy-flight-software" version = "2.0.0" @@ -152,7 +121,6 @@ dependencies = [ { name = "pre-commit" }, { name = "pyright", extra = ["nodejs"] }, { name = "pytest" }, - { name = "requests" }, ] [package.metadata] @@ -163,7 +131,6 @@ requires-dist = [ { name = "pre-commit", specifier = "==4.0.1" }, { name = "pyright", extras = ["nodejs"], specifier = "==1.1.399" }, { name = "pytest", specifier = "==8.3.2" }, - { name = "requests", specifier = "==2.32.3" }, ] [[package]] @@ -239,15 +206,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/74/a1/68a395c17eeefb04917034bd0a1bfa765e7654fa150cca473d669aa3afb5/identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881", size = 99083 }, ] -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, -] - [[package]] name = "iniconfig" version = "2.0.0" @@ -405,21 +363,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, ] -[[package]] -name = "requests" -version = "2.32.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, -] - [[package]] name = "sysv-ipc" version = "1.1.0" @@ -435,15 +378,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, ] -[[package]] -name = "urllib3" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, -] - [[package]] name = "virtualenv" version = "20.29.1" From c88146235b4e62af19c812209c46b87a4c40a1fb Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sat, 31 May 2025 23:44:47 -0400 Subject: [PATCH 03/13] Remove extra watchdog pets --- main.py | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/main.py b/main.py index 4f67f5d..7d3e534 100644 --- a/main.py +++ b/main.py @@ -146,15 +146,6 @@ def initial_boot(): finally: pass - def send_imu_data(): - logger.info("Looking to get imu data...") - IMUData = [] - watchdog.pet() - logger.info("IMU has baton") - IMUData = imu.get_gyro_data() - watchdog.pet() - packet_manager.send(str(IMUData).encode("utf-8")) - def main(): radio.send(config.radio.license.encode("utf-8")) @@ -166,12 +157,8 @@ def main(): if message: cdh.message_handler(message) - watchdog.pet() - sleep_helper.safe_sleep(config.sleep_duration) - watchdog.pet() - # TODO(nateinaction): replace me # f.state_of_health() @@ -179,36 +166,20 @@ def main(): if message: cdh.message_handler(message) - watchdog.pet() - sleep_helper.safe_sleep(config.sleep_duration) - watchdog.pet() - message: bytes | None = packet_manager.listen() if message: cdh.message_handler(message) - watchdog.pet() - sleep_helper.safe_sleep(config.sleep_duration) - watchdog.pet() - - send_imu_data() - - watchdog.pet() - message: bytes | None = packet_manager.listen() if message: cdh.message_handler(message) - watchdog.pet() - sleep_helper.safe_sleep(config.sleep_duration) - watchdog.pet() - packet_manager.send(random.choice(config.jokes).encode("utf-8")) watchdog.pet() @@ -217,12 +188,8 @@ def main(): if message: cdh.message_handler(message) - watchdog.pet() - sleep_helper.safe_sleep(config.sleep_duration) - watchdog.pet() - # def critical_power_operations(): # initial_boot() # watchdog.pet() From 9f98a210197ca5811a15758b3a4e87f57f8c3160 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Mon, 16 Jun 2025 19:19:51 -0500 Subject: [PATCH 04/13] Split flight and ground station software --- .gitignore | 10 ++- Makefile | 49 +++++++------ config.json | 1 + .../pyproject.toml | 4 ++ boot.py => flight-software/src/boot.py | 0 .../src/lib}/proveskit_rp2040_v4/__init__.py | 0 .../src/lib}/proveskit_rp2040_v4/register.py | 0 .../src/lib}/requirements.txt | 0 main.py => flight-software/src/main.py | 0 repl.py => flight-software/src/repl.py | 0 .../src/safemode.py | 0 version.py => flight-software/src/version.py | 0 ground-station/pyproject.toml | 69 +++++++++++++++++++ ground-station/src/boot.py | 0 .../src/lib/proveskit_rp2040_v4/__init__.py | 0 .../src/lib/proveskit_rp2040_v4/register.py | 8 +++ ground-station/src/lib/requirements.txt | 3 + ground-station/src/main.py | 5 ++ ground-station/src/repl.py | 49 +++++++++++++ ground-station/src/safemode.py | 8 +++ ground-station/src/version.py | 3 + 21 files changed, 185 insertions(+), 24 deletions(-) rename pyproject.toml => flight-software/pyproject.toml (92%) rename boot.py => flight-software/src/boot.py (100%) rename {lib => flight-software/src/lib}/proveskit_rp2040_v4/__init__.py (100%) rename {lib => flight-software/src/lib}/proveskit_rp2040_v4/register.py (100%) rename {lib => flight-software/src/lib}/requirements.txt (100%) rename main.py => flight-software/src/main.py (100%) rename repl.py => flight-software/src/repl.py (100%) rename safemode.py => flight-software/src/safemode.py (100%) rename version.py => flight-software/src/version.py (100%) create mode 100644 ground-station/pyproject.toml create mode 100644 ground-station/src/boot.py create mode 100644 ground-station/src/lib/proveskit_rp2040_v4/__init__.py create mode 100644 ground-station/src/lib/proveskit_rp2040_v4/register.py create mode 100644 ground-station/src/lib/requirements.txt create mode 100644 ground-station/src/main.py create mode 100644 ground-station/src/repl.py create mode 100644 ground-station/src/safemode.py create mode 100644 ground-station/src/version.py diff --git a/.gitignore b/.gitignore index 0d454ea..d5875b1 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,10 @@ venv firmware.uf2 # libs -/lib/* -!/lib/requirements.txt -!/lib/proveskit_rp2040_v4/ +flight-software/src/lib/* +!flight-software/src/lib/requirements.txt +!flight-software/src/lib/proveskit_rp2040_v4/ + +ground-station/src/lib/* +!ground-station/src/lib/requirements.txt +!ground-station/src/lib/proveskit_rp2040_v4/ diff --git a/Makefile b/Makefile index 5e52b07..f003561 100644 --- a/Makefile +++ b/Makefile @@ -14,16 +14,20 @@ help: ## Display this help. @echo "Creating virtual environment..." @$(MAKE) uv @$(UV) venv - @$(UV) pip install --requirement pyproject.toml + @$(UV) pip install --requirement flight-software/pyproject.toml + @$(UV) pip install --requirement ground-station/pyproject.toml .PHONY: download-libraries -download-libraries: uv .venv ## Download the required libraries - @echo "Downloading libraries..." - @$(UV) pip install --requirement lib/requirements.txt --target lib --no-deps --upgrade --quiet - @$(UV) pip --no-cache install $(PYSQUARED) --target lib --no-deps --upgrade --quiet +download-libraries: download-libraries/flight-software download-libraries/ground-station - @rm -rf lib/*.dist-info - @rm -rf lib/.lock +.PHONY: download-libraries/% +download-libraries/%: uv .venv ## Download the required libraries + @echo "Downloading libraries for $*..." + @$(UV) pip install --requirement $*/src/lib/requirements.txt --target $*/src/lib --no-deps --upgrade --quiet + @$(UV) pip --no-cache install $(PYSQUARED) --target $*/src/lib --no-deps --upgrade --quiet + + @rm -rf $*/src/lib/*.dist-info + @rm -rf $*/src/lib/.lock .PHONY: pre-commit-install pre-commit-install: uv @@ -45,13 +49,13 @@ BOARD_MOUNT_POINT ?= "" VERSION ?= $(shell git tag --points-at HEAD --sort=-creatordate < /dev/null | head -n 1) .PHONY: install -install: build ## Install the project onto a connected PROVES Kit use `make install BOARD_MOUNT_POINT=/my_board_destination/` to specify the mount point +install-%: build-% ## Install the project onto a connected PROVES Kit use `make install BOARD_MOUNT_POINT=/my_board_destination/` to specify the mount point ifeq ($(OS),Windows_NT) rm -rf $(BOARD_MOUNT_POINT) - cp -r artifacts/proves/* $(BOARD_MOUNT_POINT) + cp -r artifacts/proves/$*/* $(BOARD_MOUNT_POINT) else @rm $(BOARD_MOUNT_POINT)/code.py > /dev/null 2>&1 || true - $(call rsync_to_dest,artifacts/proves,$(BOARD_MOUNT_POINT)) + $(call rsync_to_dest,artifacts/proves/$*,$(BOARD_MOUNT_POINT)) endif # install-firmware @@ -66,15 +70,18 @@ clean: ## Remove all gitignored files such as downloaded libraries and artifacts ##@ Build .PHONY: build -build: download-libraries mpy-cross ## Build the project, store the result in the artifacts directory - @echo "Creating artifacts/proves" - @mkdir -p artifacts/proves - @echo "__version__ = '$(VERSION)'" > artifacts/proves/version.py - $(call compile_mpy) - $(call rsync_to_dest,.,artifacts/proves/) - @$(UV) run python -c "import os; [os.remove(os.path.join(root, file)) for root, _, files in os.walk('artifacts/proves/lib') for file in files if file.endswith('.py')]" - @echo "Creating artifacts/proves.zip" - @zip -r artifacts/proves.zip artifacts/proves > /dev/null +build: build-flight-software build-ground-station ## Build all projects + +.PHONY: build-* +build-%: download-libraries/% mpy-cross ## Build the project, store the result in the artifacts directory + @echo "Creating artifacts/proves/$*" + @mkdir -p artifacts/proves/$* + @echo "__version__ = '$(VERSION)'" > artifacts/proves/$*/version.py + $(call compile_mpy,$*) + $(call rsync_to_dest,$*/src,artifacts/proves/$*/) + @$(UV) run python -c "import os; [os.remove(os.path.join(root, file)) for root, _, files in os.walk('artifacts/proves/$*/lib') for file in files if file.endswith('.py')]" + @echo "Creating artifacts/proves/$*.zip" + @zip -r artifacts/proves/$*.zip artifacts/proves/$* > /dev/null define rsync_to_dest @if [ -z "$(1)" ]; then \ @@ -87,7 +94,7 @@ define rsync_to_dest exit 1; \ fi - @rsync -avh $(1)/config.json artifacts/proves/version.py $(1)/*.py $(1)/lib --exclude=".*" --exclude='requirements.txt' --exclude='__pycache__' $(2) --delete --times --checksum + @rsync -avh ./config.json $(2)/version.py $(1)/*.py $(1)/lib --exclude=".*" --exclude='requirements.txt' --exclude='__pycache__' $(2) --delete --times --checksum endef ##@ Build Tools @@ -136,5 +143,5 @@ endif endif define compile_mpy - @$(UV) run python -c "import os, subprocess; [subprocess.run(['$(MPY_CROSS)', os.path.join(root, file)]) for root, _, files in os.walk('lib') for file in files if file.endswith('.py')]" || exit 1 + @$(UV) run python -c "import os, subprocess; [subprocess.run(['$(MPY_CROSS)', os.path.join(root, file)]) for root, _, files in os.walk('$(1)/src/lib') for file in files if file.endswith('.py')]" || exit 1 endef diff --git a/config.json b/config.json index 2e9e731..edddd14 100644 --- a/config.json +++ b/config.json @@ -57,6 +57,7 @@ "turbo_clock": false, "radio": { "license": "KK4PDM", + "modulation": "LoRa", "receiver_id": 250, "sender_id": 251, "start_time": 80000, diff --git a/pyproject.toml b/flight-software/pyproject.toml similarity index 92% rename from pyproject.toml rename to flight-software/pyproject.toml index b7c3f27..e049517 100644 --- a/pyproject.toml +++ b/flight-software/pyproject.toml @@ -13,6 +13,10 @@ dependencies = [ "pytest==8.3.2", ] +[tool.setuptools.packages.find] +where = ["src/"] +include = ["circuitpython_rp2040_v4.flight_software"] + [tool.ruff.format] # Use `\n` line endings for all files line-ending = "lf" diff --git a/boot.py b/flight-software/src/boot.py similarity index 100% rename from boot.py rename to flight-software/src/boot.py diff --git a/lib/proveskit_rp2040_v4/__init__.py b/flight-software/src/lib/proveskit_rp2040_v4/__init__.py similarity index 100% rename from lib/proveskit_rp2040_v4/__init__.py rename to flight-software/src/lib/proveskit_rp2040_v4/__init__.py diff --git a/lib/proveskit_rp2040_v4/register.py b/flight-software/src/lib/proveskit_rp2040_v4/register.py similarity index 100% rename from lib/proveskit_rp2040_v4/register.py rename to flight-software/src/lib/proveskit_rp2040_v4/register.py diff --git a/lib/requirements.txt b/flight-software/src/lib/requirements.txt similarity index 100% rename from lib/requirements.txt rename to flight-software/src/lib/requirements.txt diff --git a/main.py b/flight-software/src/main.py similarity index 100% rename from main.py rename to flight-software/src/main.py diff --git a/repl.py b/flight-software/src/repl.py similarity index 100% rename from repl.py rename to flight-software/src/repl.py diff --git a/safemode.py b/flight-software/src/safemode.py similarity index 100% rename from safemode.py rename to flight-software/src/safemode.py diff --git a/version.py b/flight-software/src/version.py similarity index 100% rename from version.py rename to flight-software/src/version.py diff --git a/ground-station/pyproject.toml b/ground-station/pyproject.toml new file mode 100644 index 0000000..4049394 --- /dev/null +++ b/ground-station/pyproject.toml @@ -0,0 +1,69 @@ +[project] +name = "circuitpy-ground-station" +version = "2.0.0" +description = "Ground Station for the PROVES Kit" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "adafruit-circuitpython-typing==1.11.2", + "circuitpython-stubs==9.2.5", + "coverage==7.6.10", + "pre-commit==4.0.1", + "pyright[nodejs]==1.1.399", + "pytest==8.3.2", +] + +[tool.setuptools.packages.find] +where = ["src/"] +include = ["circuitpython_rp2040_v4.ground_station"] + +[tool.ruff.format] +# Use `\n` line endings for all files +line-ending = "lf" + +[tool.pytest.ini_options] +pythonpath = "." +markers = [ + "slow: marks tests as slow (deselect with '-m \"not slow\"')", +] + +[tool.coverage.run] +branch = true +relative_files = true + +[tool.coverage.report] +show_missing = true +skip_covered = false +include = [ + "lib/**/*.py", + "boot.py", + "main.py", + "repl.py", + "safemode.py", + ] +omit = [ + "lib/adafruit_*/**", + "lib/asyncio_*/**", + "lib/rv3028*/**", + "lib/neopixel.py", + "lib/pysquared/**" + ] + +[tool.coverage.html] +directory = ".coverage-reports/html" + +[tool.coverage.xml] +output = ".coverage-reports/coverage.xml" + +[tool.pyright] +include = ["main.py", "boot.py", "repl.py", "safemode.py"] +exclude = [ + "**/__pycache__", + ".venv", + ".git", + "artifacts", + "lib", + "typings", +] +stubPath = "./typings" +reportMissingModuleSource = false diff --git a/ground-station/src/boot.py b/ground-station/src/boot.py new file mode 100644 index 0000000..e69de29 diff --git a/ground-station/src/lib/proveskit_rp2040_v4/__init__.py b/ground-station/src/lib/proveskit_rp2040_v4/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ground-station/src/lib/proveskit_rp2040_v4/register.py b/ground-station/src/lib/proveskit_rp2040_v4/register.py new file mode 100644 index 0000000..46bbc83 --- /dev/null +++ b/ground-station/src/lib/proveskit_rp2040_v4/register.py @@ -0,0 +1,8 @@ +class Register: + boot_count = 0 + error_count = 7 + flag = 16 + + +class BitIndex: + use_fsk = 7 diff --git a/ground-station/src/lib/requirements.txt b/ground-station/src/lib/requirements.txt new file mode 100644 index 0000000..5a82f42 --- /dev/null +++ b/ground-station/src/lib/requirements.txt @@ -0,0 +1,3 @@ +adafruit-circuitpython-asyncio @ git+https://github.com/adafruit/adafruit_circuitpython_asyncio@1.3.3 +adafruit-circuitpython-rfm==1.0.3 +adafruit-circuitpython-ticks==1.1.1 diff --git a/ground-station/src/main.py b/ground-station/src/main.py new file mode 100644 index 0000000..9e7d61e --- /dev/null +++ b/ground-station/src/main.py @@ -0,0 +1,5 @@ +import time + +while True: + print("CTRL + C to start the ground station") + time.sleep(1) diff --git a/ground-station/src/repl.py b/ground-station/src/repl.py new file mode 100644 index 0000000..3ec617d --- /dev/null +++ b/ground-station/src/repl.py @@ -0,0 +1,49 @@ +import digitalio +from busio import SPI + +try: + from board_definitions import proveskit_rp2040_v4 as board +except ImportError: + import board + +from lib.proveskit_rp2040_v4.register import Register +from lib.pysquared.config.config import Config +from lib.pysquared.hardware.busio import _spi_init +from lib.pysquared.hardware.digitalio import initialize_pin +from lib.pysquared.hardware.radio.manager.rfm9x import RFM9xManager +from lib.pysquared.hardware.radio.packetizer.packet_manager import PacketManager +from lib.pysquared.logger import Logger +from lib.pysquared.nvm.counter import Counter + +logger: Logger = Logger( + error_counter=Counter(index=Register.error_count), + colorized=False, +) +config: Config = Config("config.json") + +spi0: SPI = _spi_init( + logger, + board.SPI0_SCK, + board.SPI0_MOSI, + board.SPI0_MISO, +) + +radio = RFM9xManager( + logger, + config.radio, + spi0, + initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True), + initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), +) + +packet_manager = PacketManager( + logger, + radio, + config.radio.license, + 0.2, +) + +while True: + bytes = packet_manager.listen(3) + if bytes is not None: + logger.info(f"Received {len(bytes)} bytes: {bytes.hex()}") diff --git a/ground-station/src/safemode.py b/ground-station/src/safemode.py new file mode 100644 index 0000000..0d4496a --- /dev/null +++ b/ground-station/src/safemode.py @@ -0,0 +1,8 @@ +import time + +import microcontroller + +print("I am in safemode. Help!") + +time.sleep(10) +microcontroller.reset() diff --git a/ground-station/src/version.py b/ground-station/src/version.py new file mode 100644 index 0000000..5b2ad39 --- /dev/null +++ b/ground-station/src/version.py @@ -0,0 +1,3 @@ +# Empty string as the contents of this file is provided by the Makefile +# (Either a version number or an empty string if running an unknown version) +__version__ = "" From 1f0a8b0bed27f12958cf6d7c1fd94f6c5d29bd0c Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Mon, 16 Jun 2025 19:40:53 -0500 Subject: [PATCH 05/13] Fix fsk flag --- flight-software/src/main.py | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/flight-software/src/main.py b/flight-software/src/main.py index 7d3e534..9c8f603 100644 --- a/flight-software/src/main.py +++ b/flight-software/src/main.py @@ -22,7 +22,7 @@ except ImportError: import board -from lib.proveskit_rp2040_v4.register import BitIndex, Register +from lib.proveskit_rp2040_v4.register import Register from lib.pysquared.beacon import Beacon from lib.pysquared.cdh import CommandDataHandler from lib.pysquared.config.config import Config @@ -34,7 +34,6 @@ from lib.pysquared.hardware.radio.packetizer.packet_manager import PacketManager from lib.pysquared.logger import Logger from lib.pysquared.nvm.counter import Counter -from lib.pysquared.nvm.flag import Flag from lib.pysquared.rtc.manager.microcontroller import MicrocontrollerManager from lib.pysquared.sleep_helper import SleepHelper from lib.pysquared.watchdog import Watchdog @@ -46,7 +45,6 @@ (boot_count := Counter(index=Register.boot_count)).increment() error_count: Counter = Counter(index=Register.error_count) -use_fsk = Flag(index=Register.flag, bit_index=BitIndex.use_fsk) logger: Logger = Logger( error_counter=error_count, @@ -82,7 +80,6 @@ radio = RFM9xManager( logger, config.radio, - use_fsk, spi0, initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True), initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), @@ -118,7 +115,6 @@ imu, magnetometer, radio, - use_fsk, error_count, boot_count, ) @@ -127,9 +123,7 @@ def initial_boot(): watchdog.pet() beacon.send() watchdog.pet() - message: bytes | None = packet_manager.listen() - if message: - cdh.message_handler(message) + cdh.listen_for_commands() watchdog.pet() try: @@ -153,30 +147,22 @@ def main(): watchdog.pet() - message: bytes | None = packet_manager.listen() - if message: - cdh.message_handler(message) + cdh.listen_for_commands() sleep_helper.safe_sleep(config.sleep_duration) # TODO(nateinaction): replace me # f.state_of_health() - message: bytes | None = packet_manager.listen() - if message: - cdh.message_handler(message) + cdh.listen_for_commands() sleep_helper.safe_sleep(config.sleep_duration) - message: bytes | None = packet_manager.listen() - if message: - cdh.message_handler(message) + cdh.listen_for_commands() sleep_helper.safe_sleep(config.sleep_duration) - message: bytes | None = packet_manager.listen() - if message: - cdh.message_handler(message) + cdh.listen_for_commands() sleep_helper.safe_sleep(config.sleep_duration) @@ -184,9 +170,7 @@ def main(): watchdog.pet() - message: bytes | None = packet_manager.listen() - if message: - cdh.message_handler(message) + cdh.listen_for_commands() sleep_helper.safe_sleep(config.sleep_duration) From f6a8e8fe153b39482ee791b5f9ce50cb84311049 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Thu, 19 Jun 2025 12:53:53 -0500 Subject: [PATCH 06/13] Simplify main, add json autoformat precommit --- .pre-commit-config.yaml | 3 + config.json | 160 ++++++++++++++++++------------------ flight-software/src/main.py | 86 ++----------------- ground-station/src/repl.py | 20 ++++- 4 files changed, 107 insertions(+), 162 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 84e38cd..e830218 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,6 +7,9 @@ repos: - id: check-yaml - id: check-json - id: check-added-large-files + - id: pretty-format-json + args: [--autofix] + exclude: '.vscode/.*' #- id: mixed-line-ending # args: [ --fix=lf ] diff --git a/config.json b/config.json index edddd14..6d367af 100644 --- a/config.json +++ b/config.json @@ -1,88 +1,86 @@ { -"cubesat_name": "Orpheus", -"last_battery_temp": 20.0, -"sleep_duration": 30, -"detumble_enable_z": true, -"detumble_enable_x":true, -"detumble_enable_y": true, -"jokes": [ - "Hey it is pretty cold up here, did someone forget to pay the electric bill?", - "sudo rf - rf*", - "Why did the astronaut break up with his girlfriend? He needed space.", - "Why did the sun go to school? To get a little brighter.", - "why is the mall called the mall? because instead of going to one store you go to them all", - "Alien detected. Blurring photo...", - "Wait it is all open source? Always has been... www.github.com/proveskit", - "What did 0 say to 1? You're a bit too much.", - "Pleiades - Orpheus has been recently acquired by the Onion News Network", - "This jokesat was brought to you by the Bronco Space Ministry of Labor and Job Placement", - "Catch you on the next pass!", - "Pleiades - Orpheus was not The Impostor", - "Sorry for messing with your long-exposure astrophoto!", - "Better buy a telescope. Wanna see me. Buy a telescope. Gonna be in space.", - "According to all known laws of aviation, there is no way bees should be able to fly...", - "You lost the game ", - "Bobby Tables is a good friend of mine", - "Why did the computer cross the road? To get a byte to eat!", - "Why are the astronauts not hungry when they got to space? They had a big launch.", - "Why did the computer get glasses? To improve its web sight!", - "What are computers favorite snacks? Chips!", - "Wait! I think I see a White 2019 Subaru Crosstrek 2.0i Premium", - "IS THAT A SUPRA?!", - "Finally escpaed the LA Traffic", - "My CubeSat is really good at jokes, but its delivery is always delayed.", - "exec order 66", - "I had a joke about UDP, but I am not sure if you'd get it.", - "I am not saying FSK modulation is the best way to send jokes, but at least it is never monotone!", - "I am sorry David, I am afrain I can not do that.", - "My memory is volatile like RAM, so it only makes sense that I forget things.", - "Imagine it gets stuck and just keeps repeating this joke every 2 mins", - "Check Engine: Error Code 404: Joke Not Found", - "CQ CQ KN6NAQ ... KN6NAT are you out there?", - "Woah is that the Launcher Orbiter?????", - "Everything in life is a spring if you think hard enough!" - ], -"debug": true, -"heating": false, -"normal_temp": 20, -"normal_battery_temp": 1, -"normal_micro_temp": 20, -"normal_charge_current": 0.5, -"normal_battery_voltage": 6.9, -"critical_battery_voltage": 6.6, -"battery_voltage": 5.2, -"current_draw": 240.5, -"reboot_time": 3600, -"longest_allowable_sleep_time": 600, -"turbo_clock": false, -"radio": { + "battery_voltage": 5.2, + "critical_battery_voltage": 6.6, + "cubesat_name": "PROVES-MY_SATELLITE_NAME", + "current_draw": 240.5, + "debug": true, + "detumble_enable_x": true, + "detumble_enable_y": true, + "detumble_enable_z": true, + "heating": false, + "jokes": [ + "Hey it is pretty cold up here, did someone forget to pay the electric bill?", + "sudo rf - rf*", + "Why did the astronaut break up with his girlfriend? He needed space.", + "Why did the sun go to school? To get a little brighter.", + "why is the mall called the mall? because instead of going to one store you go to them all", + "Alien detected. Blurring photo...", + "Wait it is all open source? Always has been... www.github.com/proveskit", + "What did 0 say to 1? You're a bit too much.", + "Pleiades - Orpheus has been recently acquired by the Onion News Network", + "This jokesat was brought to you by the Bronco Space Ministry of Labor and Job Placement", + "Catch you on the next pass!", + "Pleiades - Orpheus was not The Impostor", + "Sorry for messing with your long-exposure astrophoto!", + "Better buy a telescope. Wanna see me. Buy a telescope. Gonna be in space.", + "According to all known laws of aviation, there is no way bees should be able to fly...", + "You lost the game ", + "Bobby Tables is a good friend of mine", + "Why did the computer cross the road? To get a byte to eat!", + "Why are the astronauts not hungry when they got to space? They had a big launch.", + "Why did the computer get glasses? To improve its web sight!", + "What are computers favorite snacks? Chips!", + "Wait! I think I see a White 2019 Subaru Crosstrek 2.0i Premium", + "IS THAT A SUPRA?!", + "Finally escpaed the LA Traffic", + "My CubeSat is really good at jokes, but its delivery is always delayed.", + "exec order 66", + "I had a joke about UDP, but I am not sure if you'd get it.", + "I am not saying FSK modulation is the best way to send jokes, but at least it is never monotone!", + "I am sorry David, I am afrain I can not do that.", + "My memory is volatile like RAM, so it only makes sense that I forget things.", + "Imagine it gets stuck and just keeps repeating this joke every 2 mins", + "Check Engine: Error Code 404: Joke Not Found", + "CQ CQ KN6NAQ ... KN6NAT are you out there?", + "Woah is that the Launcher Orbiter?????", + "Everything in life is a spring if you think hard enough!", + "Your Mom", + "Your Mum", + "Your Face", + "not True lol", + "I have brought peace, freedom, justice, and security to my new empire! Your New Empire?" + ], + "last_battery_temp": 20.0, + "longest_allowable_sleep_time": 600, + "normal_battery_temp": 1, + "normal_battery_voltage": 6.9, + "normal_charge_current": 0.5, + "normal_micro_temp": 20, + "normal_temp": 20, + "radio": { + "fsk": { + "broadcast_address": 255, + "modulation_type": 0, + "node_address": 1 + }, "license": "KK4PDM", + "lora": { + "ack_delay": 0.2, + "coding_rate": 8, + "cyclic_redundancy_check": true, + "max_output": true, + "spreading_factor": 8, + "transmit_power": 23 + }, "modulation": "LoRa", "receiver_id": 250, "sender_id": 251, "start_time": 80000, - "transmit_frequency": 437.4, - "lora": { - "ack_delay": 0.2, - "coding_rate": 8, - "cyclic_redundancy_check": true, - "max_output": true, - "spreading_factor": 8, - "transmit_power": 23 - }, - "fsk": { - "broadcast_address": 255, - "node_address": 1, - "modulation_type": 0 - } -}, -"super_secret_code": "ABCD", -"repeat_code": "RP", -"joke_reply": [ - "Your Mom", - "Your Mum", - "Your Face", - "not True lol", - "I have brought peace, freedom, justice, and security to my new empire! Your New Empire?" - ] + "transmit_frequency": 437.4 + }, + "reboot_time": 3600, + "repeat_code": "RP", + "sleep_duration": 30, + "super_secret_code": "ABCD", + "turbo_clock": false } diff --git a/flight-software/src/main.py b/flight-software/src/main.py index 9c8f603..57f6206 100644 --- a/flight-software/src/main.py +++ b/flight-software/src/main.py @@ -10,7 +10,6 @@ import gc import os -import random import time import digitalio @@ -32,7 +31,7 @@ from lib.pysquared.hardware.magnetometer.manager.lis2mdl import LIS2MDLManager from lib.pysquared.hardware.radio.manager.rfm9x import RFM9xManager from lib.pysquared.hardware.radio.packetizer.packet_manager import PacketManager -from lib.pysquared.logger import Logger +from lib.pysquared.logger import Logger, LogLevel from lib.pysquared.nvm.counter import Counter from lib.pysquared.rtc.manager.microcontroller import MicrocontrollerManager from lib.pysquared.sleep_helper import SleepHelper @@ -49,6 +48,7 @@ logger: Logger = Logger( error_counter=error_count, colorized=False, + log_level=LogLevel.INFO, ) logger.info( @@ -119,93 +119,25 @@ boot_count, ) - def initial_boot(): - watchdog.pet() - beacon.send() - watchdog.pet() - cdh.listen_for_commands() - watchdog.pet() - - try: - logger.info( + def nominal_power_loop(): + logger.debug( "FC Board Stats", bytes_remaining=gc.mem_free(), ) - initial_boot() - - except Exception as e: - logger.error("Error in Boot Sequence", e) - - finally: - pass - - def main(): - radio.send(config.radio.license.encode("utf-8")) + packet_manager.send(config.radio.license.encode("utf-8")) beacon.send() - watchdog.pet() - - cdh.listen_for_commands() + cdh.listen_for_commands(10) sleep_helper.safe_sleep(config.sleep_duration) - # TODO(nateinaction): replace me - # f.state_of_health() - - cdh.listen_for_commands() - - sleep_helper.safe_sleep(config.sleep_duration) - - cdh.listen_for_commands() - - sleep_helper.safe_sleep(config.sleep_duration) - - cdh.listen_for_commands() - - sleep_helper.safe_sleep(config.sleep_duration) - - packet_manager.send(random.choice(config.jokes).encode("utf-8")) - - watchdog.pet() - - cdh.listen_for_commands() - - sleep_helper.safe_sleep(config.sleep_duration) - - # def critical_power_operations(): - # initial_boot() - # watchdog.pet() - - # sleep_helper.long_hibernate() - - # def minimum_power_operations(): - # initial_boot() - # watchdog.pet() - - # sleep_helper.short_hibernate() - - ######################### MAIN LOOP ############################## try: + logger.info("Entering main loop") while True: - # L0 automatic tasks no matter the battery level - # TODO(nateinaction): reemplement power level check when we have state of health - # c.check_reboot() - - # if c.power_mode == "critical": - # critical_power_operations() - - # elif c.power_mode == "minimum": - # minimum_power_operations() - - # elif c.power_mode == "normal": - # main() - - # elif c.power_mode == "maximum": - # main() - - main() + # TODO(nateinaction): Modify behavior based on power state + nominal_power_loop() except Exception as e: logger.critical("Critical in Main Loop", e) diff --git a/ground-station/src/repl.py b/ground-station/src/repl.py index 3ec617d..cc34e3e 100644 --- a/ground-station/src/repl.py +++ b/ground-station/src/repl.py @@ -7,6 +7,7 @@ import board from lib.proveskit_rp2040_v4.register import Register +from lib.pysquared.cdh import CommandDataHandler from lib.pysquared.config.config import Config from lib.pysquared.hardware.busio import _spi_init from lib.pysquared.hardware.digitalio import initialize_pin @@ -14,6 +15,7 @@ from lib.pysquared.hardware.radio.packetizer.packet_manager import PacketManager from lib.pysquared.logger import Logger from lib.pysquared.nvm.counter import Counter +from lib.pysquared.repl.radio_test import RadioTest logger: Logger = Logger( error_counter=Counter(index=Register.error_count), @@ -43,7 +45,17 @@ 0.2, ) -while True: - bytes = packet_manager.listen(3) - if bytes is not None: - logger.info(f"Received {len(bytes)} bytes: {bytes.hex()}") +cdh = CommandDataHandler( + logger, + config, + packet_manager, +) + +radio_test = RadioTest( + logger, + config, + packet_manager, + cdh, +) + +radio_test.run() From b30fae2a74c5bb170ce4b6d8447494cf164bfa85 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Thu, 19 Jun 2025 17:07:00 -0500 Subject: [PATCH 07/13] native namespace packages --- .gitignore | 10 +- Makefile | 22 +- flight-software/pyproject.toml | 69 ----- .../src/lib/proveskit_rp2040_v4/register.py | 8 - ground-station/pyproject.toml | 69 ----- .../src/lib/proveskit_rp2040_v4/__init__.py | 0 .../src/lib/proveskit_rp2040_v4/register.py | 8 - pyproject.toml | 42 +++ .../src => src/flight-software}/boot.py | 0 .../lib/proveskit_rp2040_v4/__init__.py | 0 .../lib/proveskit_rp2040_v4/register.py | 3 + .../flight-software}/lib/requirements.txt | 0 .../src => src/flight-software}/main.py | 2 +- .../src => src/flight-software}/repl.py | 0 .../src => src/flight-software}/safemode.py | 0 .../src => src/flight-software}/version.py | 0 .../src => src/ground-station}/boot.py | 0 .../ground-station}/lib/requirements.txt | 1 + .../src => src/ground-station}/main.py | 0 .../src => src/ground-station}/repl.py | 9 +- .../src => src/ground-station}/safemode.py | 0 .../src => src/ground-station}/version.py | 0 uv.lock | 260 ++++++------------ 23 files changed, 156 insertions(+), 347 deletions(-) delete mode 100644 flight-software/pyproject.toml delete mode 100644 flight-software/src/lib/proveskit_rp2040_v4/register.py delete mode 100644 ground-station/pyproject.toml delete mode 100644 ground-station/src/lib/proveskit_rp2040_v4/__init__.py delete mode 100644 ground-station/src/lib/proveskit_rp2040_v4/register.py create mode 100644 pyproject.toml rename {flight-software/src => src/flight-software}/boot.py (100%) rename {flight-software/src => src/flight-software}/lib/proveskit_rp2040_v4/__init__.py (100%) create mode 100644 src/flight-software/lib/proveskit_rp2040_v4/register.py rename {flight-software/src => src/flight-software}/lib/requirements.txt (100%) rename {flight-software/src => src/flight-software}/main.py (98%) rename {flight-software/src => src/flight-software}/repl.py (100%) rename {flight-software/src => src/flight-software}/safemode.py (100%) rename {flight-software/src => src/flight-software}/version.py (100%) rename {ground-station/src => src/ground-station}/boot.py (100%) rename {ground-station/src => src/ground-station}/lib/requirements.txt (64%) rename {ground-station/src => src/ground-station}/main.py (100%) rename {ground-station/src => src/ground-station}/repl.py (85%) rename {ground-station/src => src/ground-station}/safemode.py (100%) rename {ground-station/src => src/ground-station}/version.py (100%) diff --git a/.gitignore b/.gitignore index d5875b1..c9fd160 100644 --- a/.gitignore +++ b/.gitignore @@ -12,10 +12,6 @@ venv firmware.uf2 # libs -flight-software/src/lib/* -!flight-software/src/lib/requirements.txt -!flight-software/src/lib/proveskit_rp2040_v4/ - -ground-station/src/lib/* -!ground-station/src/lib/requirements.txt -!ground-station/src/lib/proveskit_rp2040_v4/ +src/*/lib/* +!src/*/lib/requirements.txt +!src/flight-software/lib/proveskit_rp2040_v4/ diff --git a/Makefile b/Makefile index f003561..2eeb7f5 100644 --- a/Makefile +++ b/Makefile @@ -18,16 +18,16 @@ help: ## Display this help. @$(UV) pip install --requirement ground-station/pyproject.toml .PHONY: download-libraries -download-libraries: download-libraries/flight-software download-libraries/ground-station +download-libraries: download-libraries-flight-software download-libraries-ground-station -.PHONY: download-libraries/% -download-libraries/%: uv .venv ## Download the required libraries +.PHONY: download-libraries-% +download-libraries-%: uv .venv ## Download the required libraries @echo "Downloading libraries for $*..." - @$(UV) pip install --requirement $*/src/lib/requirements.txt --target $*/src/lib --no-deps --upgrade --quiet - @$(UV) pip --no-cache install $(PYSQUARED) --target $*/src/lib --no-deps --upgrade --quiet + @$(UV) pip install --requirement src/$*/lib/requirements.txt --target src/$*/lib --no-deps --upgrade --quiet + @$(UV) pip --no-cache install $(PYSQUARED) --target src/$*/lib --no-deps --upgrade --quiet - @rm -rf $*/src/lib/*.dist-info - @rm -rf $*/src/lib/.lock + @rm -rf src/$*/lib/*.dist-info + @rm -rf src/$*/lib/.lock .PHONY: pre-commit-install pre-commit-install: uv @@ -73,12 +73,12 @@ clean: ## Remove all gitignored files such as downloaded libraries and artifacts build: build-flight-software build-ground-station ## Build all projects .PHONY: build-* -build-%: download-libraries/% mpy-cross ## Build the project, store the result in the artifacts directory +build-%: download-libraries-% mpy-cross ## Build the project, store the result in the artifacts directory @echo "Creating artifacts/proves/$*" @mkdir -p artifacts/proves/$* @echo "__version__ = '$(VERSION)'" > artifacts/proves/$*/version.py $(call compile_mpy,$*) - $(call rsync_to_dest,$*/src,artifacts/proves/$*/) + $(call rsync_to_dest,src/$*,artifacts/proves/$*/) @$(UV) run python -c "import os; [os.remove(os.path.join(root, file)) for root, _, files in os.walk('artifacts/proves/$*/lib') for file in files if file.endswith('.py')]" @echo "Creating artifacts/proves/$*.zip" @zip -r artifacts/proves/$*.zip artifacts/proves/$* > /dev/null @@ -103,7 +103,7 @@ $(TOOLS_DIR): mkdir -p $(TOOLS_DIR) ### Tool Versions -UV_VERSION ?= 0.5.24 +UV_VERSION ?= 0.7.13 MPY_CROSS_VERSION ?= 9.0.5 UV_DIR ?= $(TOOLS_DIR)/uv-$(UV_VERSION) @@ -143,5 +143,5 @@ endif endif define compile_mpy - @$(UV) run python -c "import os, subprocess; [subprocess.run(['$(MPY_CROSS)', os.path.join(root, file)]) for root, _, files in os.walk('$(1)/src/lib') for file in files if file.endswith('.py')]" || exit 1 + @$(UV) run python -c "import os, subprocess; [subprocess.run(['$(MPY_CROSS)', os.path.join(root, file)]) for root, _, files in os.walk('src/$(1)/lib') for file in files if file.endswith('.py')]" || exit 1 endef diff --git a/flight-software/pyproject.toml b/flight-software/pyproject.toml deleted file mode 100644 index e049517..0000000 --- a/flight-software/pyproject.toml +++ /dev/null @@ -1,69 +0,0 @@ -[project] -name = "circuitpy-flight-software" -version = "2.0.0" -description = "Flight Software for the PROVES Kit" -readme = "README.md" -requires-python = ">=3.13" -dependencies = [ - "adafruit-circuitpython-typing==1.11.2", - "circuitpython-stubs==9.2.5", - "coverage==7.6.10", - "pre-commit==4.0.1", - "pyright[nodejs]==1.1.399", - "pytest==8.3.2", -] - -[tool.setuptools.packages.find] -where = ["src/"] -include = ["circuitpython_rp2040_v4.flight_software"] - -[tool.ruff.format] -# Use `\n` line endings for all files -line-ending = "lf" - -[tool.pytest.ini_options] -pythonpath = "." -markers = [ - "slow: marks tests as slow (deselect with '-m \"not slow\"')", -] - -[tool.coverage.run] -branch = true -relative_files = true - -[tool.coverage.report] -show_missing = true -skip_covered = false -include = [ - "lib/**/*.py", - "boot.py", - "main.py", - "repl.py", - "safemode.py", - ] -omit = [ - "lib/adafruit_*/**", - "lib/asyncio_*/**", - "lib/rv3028*/**", - "lib/neopixel.py", - "lib/pysquared/**" - ] - -[tool.coverage.html] -directory = ".coverage-reports/html" - -[tool.coverage.xml] -output = ".coverage-reports/coverage.xml" - -[tool.pyright] -include = ["main.py", "boot.py", "repl.py", "safemode.py"] -exclude = [ - "**/__pycache__", - ".venv", - ".git", - "artifacts", - "lib", - "typings", -] -stubPath = "./typings" -reportMissingModuleSource = false diff --git a/flight-software/src/lib/proveskit_rp2040_v4/register.py b/flight-software/src/lib/proveskit_rp2040_v4/register.py deleted file mode 100644 index 46bbc83..0000000 --- a/flight-software/src/lib/proveskit_rp2040_v4/register.py +++ /dev/null @@ -1,8 +0,0 @@ -class Register: - boot_count = 0 - error_count = 7 - flag = 16 - - -class BitIndex: - use_fsk = 7 diff --git a/ground-station/pyproject.toml b/ground-station/pyproject.toml deleted file mode 100644 index 4049394..0000000 --- a/ground-station/pyproject.toml +++ /dev/null @@ -1,69 +0,0 @@ -[project] -name = "circuitpy-ground-station" -version = "2.0.0" -description = "Ground Station for the PROVES Kit" -readme = "README.md" -requires-python = ">=3.13" -dependencies = [ - "adafruit-circuitpython-typing==1.11.2", - "circuitpython-stubs==9.2.5", - "coverage==7.6.10", - "pre-commit==4.0.1", - "pyright[nodejs]==1.1.399", - "pytest==8.3.2", -] - -[tool.setuptools.packages.find] -where = ["src/"] -include = ["circuitpython_rp2040_v4.ground_station"] - -[tool.ruff.format] -# Use `\n` line endings for all files -line-ending = "lf" - -[tool.pytest.ini_options] -pythonpath = "." -markers = [ - "slow: marks tests as slow (deselect with '-m \"not slow\"')", -] - -[tool.coverage.run] -branch = true -relative_files = true - -[tool.coverage.report] -show_missing = true -skip_covered = false -include = [ - "lib/**/*.py", - "boot.py", - "main.py", - "repl.py", - "safemode.py", - ] -omit = [ - "lib/adafruit_*/**", - "lib/asyncio_*/**", - "lib/rv3028*/**", - "lib/neopixel.py", - "lib/pysquared/**" - ] - -[tool.coverage.html] -directory = ".coverage-reports/html" - -[tool.coverage.xml] -output = ".coverage-reports/coverage.xml" - -[tool.pyright] -include = ["main.py", "boot.py", "repl.py", "safemode.py"] -exclude = [ - "**/__pycache__", - ".venv", - ".git", - "artifacts", - "lib", - "typings", -] -stubPath = "./typings" -reportMissingModuleSource = false diff --git a/ground-station/src/lib/proveskit_rp2040_v4/__init__.py b/ground-station/src/lib/proveskit_rp2040_v4/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/ground-station/src/lib/proveskit_rp2040_v4/register.py b/ground-station/src/lib/proveskit_rp2040_v4/register.py deleted file mode 100644 index 46bbc83..0000000 --- a/ground-station/src/lib/proveskit_rp2040_v4/register.py +++ /dev/null @@ -1,8 +0,0 @@ -class Register: - boot_count = 0 - error_count = 7 - flag = 16 - - -class BitIndex: - use_fsk = 7 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..a321358 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "proveskit-circuitpython-rp2040-v4" +version = "1.0.0" +description = "PROVESKIT Software RP2040 v4 board" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [] + +[dependency-groups] +dev = [ + "adafruit-circuitpython-typing==1.12.1", + "circuitpython-stubs==9.2.8", + "pre-commit==4.2.0", + "pyright[nodejs]==1.1.402", +] + +[tool.ruff.format] +# Use `\n` line endings for all files +line-ending = "lf" + +[tool.pyright] +include = [ + "src/flight-software/boot.py", + "src/flight-software/main.py", + "src/flight-software/repl.py", + "src/flight-software/safemode.py", + "src/flight-software/lib/proveskit_rp2040_v4/*", + "src/ground_station/boot.py", + "src/ground_station/main.py", + "src/ground_station/repl.py", + "src/ground_station/safemode.py", +] +exclude = [ + "**/__pycache__", + ".venv", + ".git", + "artifacts", + "src/*/lib", + "typings", +] +stubPath = "./typings" +reportMissingModuleSource = false diff --git a/flight-software/src/boot.py b/src/flight-software/boot.py similarity index 100% rename from flight-software/src/boot.py rename to src/flight-software/boot.py diff --git a/flight-software/src/lib/proveskit_rp2040_v4/__init__.py b/src/flight-software/lib/proveskit_rp2040_v4/__init__.py similarity index 100% rename from flight-software/src/lib/proveskit_rp2040_v4/__init__.py rename to src/flight-software/lib/proveskit_rp2040_v4/__init__.py diff --git a/src/flight-software/lib/proveskit_rp2040_v4/register.py b/src/flight-software/lib/proveskit_rp2040_v4/register.py new file mode 100644 index 0000000..ce5d29e --- /dev/null +++ b/src/flight-software/lib/proveskit_rp2040_v4/register.py @@ -0,0 +1,3 @@ +class Register: + boot_count = 0 + error_count = 1 diff --git a/flight-software/src/lib/requirements.txt b/src/flight-software/lib/requirements.txt similarity index 100% rename from flight-software/src/lib/requirements.txt rename to src/flight-software/lib/requirements.txt diff --git a/flight-software/src/main.py b/src/flight-software/main.py similarity index 98% rename from flight-software/src/main.py rename to src/flight-software/main.py index 57f6206..f8c16ca 100644 --- a/flight-software/src/main.py +++ b/src/flight-software/main.py @@ -105,7 +105,7 @@ sleep_helper = SleepHelper(logger, watchdog, config) - cdh = CommandDataHandler(config, logger, radio) + cdh = CommandDataHandler(logger, config, packet_manager) beacon = Beacon( logger, diff --git a/flight-software/src/repl.py b/src/flight-software/repl.py similarity index 100% rename from flight-software/src/repl.py rename to src/flight-software/repl.py diff --git a/flight-software/src/safemode.py b/src/flight-software/safemode.py similarity index 100% rename from flight-software/src/safemode.py rename to src/flight-software/safemode.py diff --git a/flight-software/src/version.py b/src/flight-software/version.py similarity index 100% rename from flight-software/src/version.py rename to src/flight-software/version.py diff --git a/ground-station/src/boot.py b/src/ground-station/boot.py similarity index 100% rename from ground-station/src/boot.py rename to src/ground-station/boot.py diff --git a/ground-station/src/lib/requirements.txt b/src/ground-station/lib/requirements.txt similarity index 64% rename from ground-station/src/lib/requirements.txt rename to src/ground-station/lib/requirements.txt index 5a82f42..d0a3a9b 100644 --- a/ground-station/src/lib/requirements.txt +++ b/src/ground-station/lib/requirements.txt @@ -1,3 +1,4 @@ adafruit-circuitpython-asyncio @ git+https://github.com/adafruit/adafruit_circuitpython_asyncio@1.3.3 adafruit-circuitpython-rfm==1.0.3 adafruit-circuitpython-ticks==1.1.1 +proveskit-ground-station @ git+https://github.com/proveskit/circuitpython_ground_station@main diff --git a/ground-station/src/main.py b/src/ground-station/main.py similarity index 100% rename from ground-station/src/main.py rename to src/ground-station/main.py diff --git a/ground-station/src/repl.py b/src/ground-station/repl.py similarity index 85% rename from ground-station/src/repl.py rename to src/ground-station/repl.py index cc34e3e..f34c821 100644 --- a/ground-station/src/repl.py +++ b/src/ground-station/repl.py @@ -6,7 +6,7 @@ except ImportError: import board -from lib.proveskit_rp2040_v4.register import Register +from lib.proveskit_ground_station.proveskit_ground_station import GroundStation from lib.pysquared.cdh import CommandDataHandler from lib.pysquared.config.config import Config from lib.pysquared.hardware.busio import _spi_init @@ -15,10 +15,9 @@ from lib.pysquared.hardware.radio.packetizer.packet_manager import PacketManager from lib.pysquared.logger import Logger from lib.pysquared.nvm.counter import Counter -from lib.pysquared.repl.radio_test import RadioTest logger: Logger = Logger( - error_counter=Counter(index=Register.error_count), + error_counter=Counter(1), colorized=False, ) config: Config = Config("config.json") @@ -51,11 +50,11 @@ packet_manager, ) -radio_test = RadioTest( +ground_station = GroundStation( logger, config, packet_manager, cdh, ) -radio_test.run() +ground_station.run() diff --git a/ground-station/src/safemode.py b/src/ground-station/safemode.py similarity index 100% rename from ground-station/src/safemode.py rename to src/ground-station/safemode.py diff --git a/ground-station/src/version.py b/src/ground-station/version.py similarity index 100% rename from ground-station/src/version.py rename to src/ground-station/version.py diff --git a/uv.lock b/uv.lock index 1a0d04c..85fbbb9 100644 --- a/uv.lock +++ b/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 2 requires-python = ">=3.13" [[package]] @@ -13,9 +14,9 @@ dependencies = [ { name = "pyftdi" }, { name = "sysv-ipc", marker = "platform_machine != 'mips' and sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2c/5b/5083c60638c3fa3f8307d5d56e724908edc7f29079807d9161837eba5eb0/adafruit_blinka-8.51.0.tar.gz", hash = "sha256:844f15be775ee5c418446969a427c5a3847928e644f2b1a35542acff5b208f3a", size = 249212 } +sdist = { url = "https://files.pythonhosted.org/packages/2c/5b/5083c60638c3fa3f8307d5d56e724908edc7f29079807d9161837eba5eb0/adafruit_blinka-8.51.0.tar.gz", hash = "sha256:844f15be775ee5c418446969a427c5a3847928e644f2b1a35542acff5b208f3a", size = 249212, upload-time = "2025-01-16T19:08:17.614Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/78/1325d33bd9bc7270124d1e8315a226e42a7dd195543a78e775be69daa2ed/Adafruit_Blinka-8.51.0-py3-none-any.whl", hash = "sha256:f01635f4fb5c5255167dea5c0b8feb20cc162f8e8d0140696e236796f897a834", size = 364720 }, + { url = "https://files.pythonhosted.org/packages/29/78/1325d33bd9bc7270124d1e8315a226e42a7dd195543a78e775be69daa2ed/Adafruit_Blinka-8.51.0-py3-none-any.whl", hash = "sha256:f01635f4fb5c5255167dea5c0b8feb20cc162f8e8d0140696e236796f897a834", size = 364720, upload-time = "2025-01-16T19:08:15.596Z" }, ] [[package]] @@ -26,9 +27,9 @@ dependencies = [ { name = "adafruit-blinka" }, { name = "adafruit-circuitpython-typing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/c0/f6347ab32f077413c20f55bc4b0f1592f35affd4d26753394c5ed6c36c4c/adafruit_circuitpython_busdevice-5.2.11.tar.gz", hash = "sha256:a9a1310bee7021703ccc247bb3ff04d0873573948a6c7bee9016361cd6707a71", size = 27627 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/c0/f6347ab32f077413c20f55bc4b0f1592f35affd4d26753394c5ed6c36c4c/adafruit_circuitpython_busdevice-5.2.11.tar.gz", hash = "sha256:a9a1310bee7021703ccc247bb3ff04d0873573948a6c7bee9016361cd6707a71", size = 27627, upload-time = "2025-01-16T19:31:48.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/c7/9f0e2b2674cb5b1fb35d067a7585a2a76596a36044264eb390980d428ccf/adafruit_circuitpython_busdevice-5.2.11-py3-none-any.whl", hash = "sha256:d4379c9ae86a15f7044dea815a94525ca9eda6a7c0b2fa0e75cf9e700c9384b8", size = 7539 }, + { url = "https://files.pythonhosted.org/packages/e0/c7/9f0e2b2674cb5b1fb35d067a7585a2a76596a36044264eb390980d428ccf/adafruit_circuitpython_busdevice-5.2.11-py3-none-any.whl", hash = "sha256:d4379c9ae86a15f7044dea815a94525ca9eda6a7c0b2fa0e75cf9e700c9384b8", size = 7539, upload-time = "2025-01-16T19:31:38.015Z" }, ] [[package]] @@ -38,9 +39,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "adafruit-blinka" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/8b/8316002905f97a7f7e9c3a53dd9bb5a17889033ec55c403a6e55077f6298/adafruit_circuitpython_connectionmanager-3.1.3.tar.gz", hash = "sha256:0f133bdedf454ede0c0a866ed605fe166cc85f75cfcea74758e3622ae403e5f9", size = 37381 } +sdist = { url = "https://files.pythonhosted.org/packages/69/8b/8316002905f97a7f7e9c3a53dd9bb5a17889033ec55c403a6e55077f6298/adafruit_circuitpython_connectionmanager-3.1.3.tar.gz", hash = "sha256:0f133bdedf454ede0c0a866ed605fe166cc85f75cfcea74758e3622ae403e5f9", size = 37381, upload-time = "2025-01-16T19:42:03.074Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/7d/896b31bd31eff89e5cab5d3acec9d3d34f5a0654ceab25e01865e628d9f9/adafruit_circuitpython_connectionmanager-3.1.3-py3-none-any.whl", hash = "sha256:9df3a4c617dae27bad1ac8607f1a084312c8498d831ebe1c6a2c8d5cb309daea", size = 7811 }, + { url = "https://files.pythonhosted.org/packages/55/7d/896b31bd31eff89e5cab5d3acec9d3d34f5a0654ceab25e01865e628d9f9/adafruit_circuitpython_connectionmanager-3.1.3-py3-none-any.whl", hash = "sha256:9df3a4c617dae27bad1ac8607f1a084312c8498d831ebe1c6a2c8d5cb309daea", size = 7811, upload-time = "2025-01-16T19:42:00.823Z" }, ] [[package]] @@ -51,14 +52,14 @@ dependencies = [ { name = "adafruit-blinka" }, { name = "adafruit-circuitpython-connectionmanager" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/45/070129e6b77f801514cd974524c6b9fd502aa04dd5c2e45ab03e85c96cac/adafruit_circuitpython_requests-4.1.9.tar.gz", hash = "sha256:b9eeb252b43946f1a90c34ca8844e07bb1e01cd210c927f561d0e10b97c5ff9d", size = 66232 } +sdist = { url = "https://files.pythonhosted.org/packages/6a/45/070129e6b77f801514cd974524c6b9fd502aa04dd5c2e45ab03e85c96cac/adafruit_circuitpython_requests-4.1.9.tar.gz", hash = "sha256:b9eeb252b43946f1a90c34ca8844e07bb1e01cd210c927f561d0e10b97c5ff9d", size = 66232, upload-time = "2025-01-16T20:00:08.727Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/40/ff356fd61ef3ea044b7944687d62419c304217381ee20d9fa444aeb98339/adafruit_circuitpython_requests-4.1.9-py3-none-any.whl", hash = "sha256:d0f0a899c6ef143eab9a50a9625be43f5f8da7b9688c1496891999fa20107c93", size = 10721 }, + { url = "https://files.pythonhosted.org/packages/b7/40/ff356fd61ef3ea044b7944687d62419c304217381ee20d9fa444aeb98339/adafruit_circuitpython_requests-4.1.9-py3-none-any.whl", hash = "sha256:d0f0a899c6ef143eab9a50a9625be43f5f8da7b9688c1496891999fa20107c93", size = 10721, upload-time = "2025-01-16T20:00:07.437Z" }, ] [[package]] name = "adafruit-circuitpython-typing" -version = "1.11.2" +version = "1.12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "adafruit-blinka" }, @@ -66,27 +67,27 @@ dependencies = [ { name = "adafruit-circuitpython-requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/80/8c280fa7d42a23dce40b2fe64f708d18fa32b384adbf6934955d2c2ebecf/adafruit_circuitpython_typing-1.11.2.tar.gz", hash = "sha256:c7ac8532a9ad7e4a65d5588764b7483c0b6967d305c37faebcc0c5356d677e33", size = 29277 } +sdist = { url = "https://files.pythonhosted.org/packages/77/d6/cb9a842dd89afcc53d21327cef5d3ee0149cfd3d90677c9dd68274b0bfae/adafruit_circuitpython_typing-1.12.1.tar.gz", hash = "sha256:e4b06e07cb385dc098574f2479cd77d07e0a06987c814eab33b9f525ac83a935", size = 26001, upload-time = "2025-05-30T17:46:34.679Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/d5/76a6bca9cf08907b48dfc8ccbccbd190155353f521876e02d6b7bb244003/adafruit_circuitpython_typing-1.11.2-py3-none-any.whl", hash = "sha256:e1401a09bbfdf67e43875cc6755b3af0eda8381b12c9c8f759bd7676b7425e1c", size = 11101 }, + { url = "https://files.pythonhosted.org/packages/6c/d9/fe145e99e1251a0dcdace585477875eef8db915f04647197aa3aa50c51d6/adafruit_circuitpython_typing-1.12.1-py3-none-any.whl", hash = "sha256:f1e511f48a76cb4467050db9334fed6761cc1f05921e9edddce7fd3a0b69b459", size = 11627, upload-time = "2025-05-30T17:46:33.322Z" }, ] [[package]] name = "adafruit-platformdetect" version = "3.77.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/4e/2b2ca031227de47e2aab6cf092b78934c9c0033a685075ddab3e0c0b55fe/adafruit_platformdetect-3.77.0.tar.gz", hash = "sha256:adce6386059637e92b4cb5d3430d016119cd3eb19f9276920c54515f3d798949", size = 48024 } +sdist = { url = "https://files.pythonhosted.org/packages/6b/4e/2b2ca031227de47e2aab6cf092b78934c9c0033a685075ddab3e0c0b55fe/adafruit_platformdetect-3.77.0.tar.gz", hash = "sha256:adce6386059637e92b4cb5d3430d016119cd3eb19f9276920c54515f3d798949", size = 48024, upload-time = "2025-01-16T18:57:59.87Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/18/b18e9ff2aee42f03082675c5d18d4eb02411477e07c86d74833d3396792e/Adafruit_PlatformDetect-3.77.0-py3-none-any.whl", hash = "sha256:93f599c21e7db2d92bc32ac69ba5063876404c4af87d11358863e62f407409be", size = 25542 }, + { url = "https://files.pythonhosted.org/packages/30/18/b18e9ff2aee42f03082675c5d18d4eb02411477e07c86d74833d3396792e/Adafruit_PlatformDetect-3.77.0-py3-none-any.whl", hash = "sha256:93f599c21e7db2d92bc32ac69ba5063876404c4af87d11358863e62f407409be", size = 25542, upload-time = "2025-01-16T18:57:57.354Z" }, ] [[package]] name = "adafruit-pureio" version = "1.1.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/b7/f1672435116822079bbdab42163f9e6424769b7db778873d95d18c085230/Adafruit_PureIO-1.1.11.tar.gz", hash = "sha256:c4cfbb365731942d1f1092a116f47dfdae0aef18c5b27f1072b5824ad5ea8c7c", size = 35511 } +sdist = { url = "https://files.pythonhosted.org/packages/e5/b7/f1672435116822079bbdab42163f9e6424769b7db778873d95d18c085230/Adafruit_PureIO-1.1.11.tar.gz", hash = "sha256:c4cfbb365731942d1f1092a116f47dfdae0aef18c5b27f1072b5824ad5ea8c7c", size = 35511, upload-time = "2023-05-25T19:01:34.654Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/9d/28e9d12f36e13c5f2acba3098187b0e931290ecd1d8df924391b5ad2db19/Adafruit_PureIO-1.1.11-py3-none-any.whl", hash = "sha256:281ab2099372cc0decc26326918996cbf21b8eed694ec4764d51eefa029d324e", size = 10678 }, + { url = "https://files.pythonhosted.org/packages/19/9d/28e9d12f36e13c5f2acba3098187b0e931290ecd1d8df924391b5ad2db19/Adafruit_PureIO-1.1.11-py3-none-any.whl", hash = "sha256:281ab2099372cc0decc26326918996cbf21b8eed694ec4764d51eefa029d324e", size = 10678, upload-time = "2023-05-25T19:01:32.397Z" }, ] [[package]] @@ -96,180 +97,93 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyserial" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/36/29b7b896e83e195fac6d64ccff95c0f24a18ee86e7437a22e60e0331d90a/binho-host-adapter-0.1.6.tar.gz", hash = "sha256:1e6da7a84e208c13b5f489066f05774bff1d593d0f5bf1ca149c2b8e83eae856", size = 10068 } +sdist = { url = "https://files.pythonhosted.org/packages/68/36/29b7b896e83e195fac6d64ccff95c0f24a18ee86e7437a22e60e0331d90a/binho-host-adapter-0.1.6.tar.gz", hash = "sha256:1e6da7a84e208c13b5f489066f05774bff1d593d0f5bf1ca149c2b8e83eae856", size = 10068, upload-time = "2020-06-04T19:38:11.789Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/6b/0f13486003aea3eb349c2946b7ec9753e7558b78e35d22c938062a96959c/binho_host_adapter-0.1.6-py3-none-any.whl", hash = "sha256:f71ca176c1e2fc1a5dce128beb286da217555c6c7c805f2ed282a6f3507ec277", size = 10540 }, + { url = "https://files.pythonhosted.org/packages/7b/6b/0f13486003aea3eb349c2946b7ec9753e7558b78e35d22c938062a96959c/binho_host_adapter-0.1.6-py3-none-any.whl", hash = "sha256:f71ca176c1e2fc1a5dce128beb286da217555c6c7c805f2ed282a6f3507ec277", size = 10540, upload-time = "2020-06-04T19:38:10.612Z" }, ] [[package]] name = "cfgv" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, -] - -[[package]] -name = "circuitpy-flight-software" -version = "2.0.0" -source = { virtual = "." } -dependencies = [ - { name = "adafruit-circuitpython-typing" }, - { name = "circuitpython-stubs" }, - { name = "coverage" }, - { name = "pre-commit" }, - { name = "pyright", extra = ["nodejs"] }, - { name = "pytest" }, -] - -[package.metadata] -requires-dist = [ - { name = "adafruit-circuitpython-typing", specifier = "==1.11.2" }, - { name = "circuitpython-stubs", specifier = "==9.2.5" }, - { name = "coverage", specifier = "==7.6.10" }, - { name = "pre-commit", specifier = "==4.0.1" }, - { name = "pyright", extras = ["nodejs"], specifier = "==1.1.399" }, - { name = "pytest", specifier = "==8.3.2" }, + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, ] [[package]] name = "circuitpython-stubs" -version = "9.2.5" +version = "9.2.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/d7/ce0a51ba9f6b15bdde6a79cfa96f3c63117dd749465be18980461771cfa9/circuitpython_stubs-9.2.5.tar.gz", hash = "sha256:2b2be4172552bdb9c5a1e9923124ee62f0bed4c0b128d862ad1baf8866e67174", size = 348760 } +sdist = { url = "https://files.pythonhosted.org/packages/7c/ff/dc3b631854ba75d14cdbcb121616e896cc7118211b4cdbf4df1a47c49f12/circuitpython_stubs-9.2.8.tar.gz", hash = "sha256:49250e168a00491719216bd43f8c6431f45ae9a74df5caccde44b1059b0d3c27", size = 348440, upload-time = "2025-05-28T21:30:08.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/27/72e6715132a325db32ff06475c7da1a217e65082d710b1a7e8ce3c36ca0e/circuitpython_stubs-9.2.5-py3-none-any.whl", hash = "sha256:9b2e8ba04e7fee6a0155e5915b36a1a911e2e3486c795669baa9c2db76102a7c", size = 1006110 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "coverage" -version = "7.6.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 }, - { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 }, - { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 }, - { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 }, - { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 }, - { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 }, - { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 }, - { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 }, - { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 }, - { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 }, - { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 }, - { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 }, - { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 }, - { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 }, - { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 }, - { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 }, - { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 }, - { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, - { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, - { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, + { url = "https://files.pythonhosted.org/packages/c9/1a/34091af39e17f81c9fbcbe3a1336dac99e7297e5931b4803ed9c041515f2/circuitpython_stubs-9.2.8-py3-none-any.whl", hash = "sha256:54be0d8b2f5d4547028e30c96a1b5b60a55033bf382d2cdac2c5c27dffadb0fb", size = 1008714, upload-time = "2025-05-28T21:30:06.231Z" }, ] [[package]] name = "distlib" version = "0.3.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923, upload-time = "2024-10-09T18:35:47.551Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" }, ] [[package]] name = "filelock" version = "3.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027 } +sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027, upload-time = "2025-01-21T20:04:49.099Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, + { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164, upload-time = "2025-01-21T20:04:47.734Z" }, ] [[package]] name = "identify" version = "2.6.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/bf/c68c46601bacd4c6fb4dd751a42b6e7087240eaabc6487f2ef7a48e0e8fc/identify-2.6.6.tar.gz", hash = "sha256:7bec12768ed44ea4761efb47806f0a41f86e7c0a5fdf5950d4648c90eca7e251", size = 99217 } +sdist = { url = "https://files.pythonhosted.org/packages/82/bf/c68c46601bacd4c6fb4dd751a42b6e7087240eaabc6487f2ef7a48e0e8fc/identify-2.6.6.tar.gz", hash = "sha256:7bec12768ed44ea4761efb47806f0a41f86e7c0a5fdf5950d4648c90eca7e251", size = 99217, upload-time = "2025-01-20T20:38:02.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/a1/68a395c17eeefb04917034bd0a1bfa765e7654fa150cca473d669aa3afb5/identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881", size = 99083 }, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, + { url = "https://files.pythonhosted.org/packages/74/a1/68a395c17eeefb04917034bd0a1bfa765e7654fa150cca473d669aa3afb5/identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881", size = 99083, upload-time = "2025-01-20T20:38:00.261Z" }, ] [[package]] name = "nodeenv" version = "1.9.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, ] [[package]] name = "nodejs-wheel-binaries" version = "22.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/c7/4fd3871d2b7fd5122216245e273201ab98eda92bbd6fe9ad04846b758c56/nodejs_wheel_binaries-22.14.0.tar.gz", hash = "sha256:c1dc43713598c7310d53795c764beead861b8c5021fe4b1366cb912ce1a4c8bf", size = 8055 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/c7/4fd3871d2b7fd5122216245e273201ab98eda92bbd6fe9ad04846b758c56/nodejs_wheel_binaries-22.14.0.tar.gz", hash = "sha256:c1dc43713598c7310d53795c764beead861b8c5021fe4b1366cb912ce1a4c8bf", size = 8055, upload-time = "2025-02-11T18:15:17.714Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/b6/66ef4ef75ea7389ea788f2d5505bf9a8e5c3806d56c7a90cf46a6942f1cf/nodejs_wheel_binaries-22.14.0-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:d8ab8690516a3e98458041286e3f0d6458de176d15c14f205c3ea2972131420d", size = 50326597 }, - { url = "https://files.pythonhosted.org/packages/7d/78/023d91a293ba73572a643bc89d11620d189f35f205a309dd8296aa45e69a/nodejs_wheel_binaries-22.14.0-py2.py3-none-macosx_11_0_x86_64.whl", hash = "sha256:b2f200f23b3610bdbee01cf136279e005ffdf8ee74557aa46c0940a7867956f6", size = 51158258 }, - { url = "https://files.pythonhosted.org/packages/af/86/324f6342c79e5034a13319b02ba9ed1f4ac8813af567d223c9a9e56cd338/nodejs_wheel_binaries-22.14.0-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0877832abd7a9c75c8c5caafa37f986c9341ee025043c2771213d70c4c1defa", size = 57180264 }, - { url = "https://files.pythonhosted.org/packages/6d/9f/42bdaab26137e31732bff00147b9aca2185d475b5752b57a443e6c7ba93f/nodejs_wheel_binaries-22.14.0-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fded5a70a8a55c2135e67bd580d8b7f2e94fcbafcc679b6a2d5b92f88373d69", size = 57693251 }, - { url = "https://files.pythonhosted.org/packages/ab/d7/94f8f269aa86cf35f9ed2b70d09aca48dc971fb5656fdc4a3b69364b189f/nodejs_wheel_binaries-22.14.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c1ade6f3ece458b40c02e89c91d5103792a9f18aaad5026da533eb0dcb87090e", size = 58841717 }, - { url = "https://files.pythonhosted.org/packages/2d/a0/43b7316eaf22b4ee9bfb897ee36c724efceac7b89d7d1bedca28057b7be1/nodejs_wheel_binaries-22.14.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:34fa5ed4cf3f65cbfbe9b45c407ffc2fc7d97a06cd8993e6162191ff81f29f48", size = 59808791 }, - { url = "https://files.pythonhosted.org/packages/10/0a/814491f751a25136e37de68a2728c9a9e3c1d20494aba5ff3c230d5f9c2d/nodejs_wheel_binaries-22.14.0-py2.py3-none-win_amd64.whl", hash = "sha256:ca7023276327455988b81390fa6bbfa5191c1da7fc45bc57c7abc281ba9967e9", size = 40478921 }, - { url = "https://files.pythonhosted.org/packages/f4/5c/cab444afaa387dceac8debb817b52fd00596efcd2d54506c27311c6fe6a8/nodejs_wheel_binaries-22.14.0-py2.py3-none-win_arm64.whl", hash = "sha256:fd59c8e9a202221e316febe1624a1ae3b42775b7fb27737bf12ec79565983eaf", size = 36206637 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, + { url = "https://files.pythonhosted.org/packages/61/b6/66ef4ef75ea7389ea788f2d5505bf9a8e5c3806d56c7a90cf46a6942f1cf/nodejs_wheel_binaries-22.14.0-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:d8ab8690516a3e98458041286e3f0d6458de176d15c14f205c3ea2972131420d", size = 50326597, upload-time = "2025-02-11T18:14:18.467Z" }, + { url = "https://files.pythonhosted.org/packages/7d/78/023d91a293ba73572a643bc89d11620d189f35f205a309dd8296aa45e69a/nodejs_wheel_binaries-22.14.0-py2.py3-none-macosx_11_0_x86_64.whl", hash = "sha256:b2f200f23b3610bdbee01cf136279e005ffdf8ee74557aa46c0940a7867956f6", size = 51158258, upload-time = "2025-02-11T18:14:25.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/86/324f6342c79e5034a13319b02ba9ed1f4ac8813af567d223c9a9e56cd338/nodejs_wheel_binaries-22.14.0-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0877832abd7a9c75c8c5caafa37f986c9341ee025043c2771213d70c4c1defa", size = 57180264, upload-time = "2025-02-11T18:14:34.123Z" }, + { url = "https://files.pythonhosted.org/packages/6d/9f/42bdaab26137e31732bff00147b9aca2185d475b5752b57a443e6c7ba93f/nodejs_wheel_binaries-22.14.0-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fded5a70a8a55c2135e67bd580d8b7f2e94fcbafcc679b6a2d5b92f88373d69", size = 57693251, upload-time = "2025-02-11T18:14:42.071Z" }, + { url = "https://files.pythonhosted.org/packages/ab/d7/94f8f269aa86cf35f9ed2b70d09aca48dc971fb5656fdc4a3b69364b189f/nodejs_wheel_binaries-22.14.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c1ade6f3ece458b40c02e89c91d5103792a9f18aaad5026da533eb0dcb87090e", size = 58841717, upload-time = "2025-02-11T18:14:49.971Z" }, + { url = "https://files.pythonhosted.org/packages/2d/a0/43b7316eaf22b4ee9bfb897ee36c724efceac7b89d7d1bedca28057b7be1/nodejs_wheel_binaries-22.14.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:34fa5ed4cf3f65cbfbe9b45c407ffc2fc7d97a06cd8993e6162191ff81f29f48", size = 59808791, upload-time = "2025-02-11T18:14:59.428Z" }, + { url = "https://files.pythonhosted.org/packages/10/0a/814491f751a25136e37de68a2728c9a9e3c1d20494aba5ff3c230d5f9c2d/nodejs_wheel_binaries-22.14.0-py2.py3-none-win_amd64.whl", hash = "sha256:ca7023276327455988b81390fa6bbfa5191c1da7fc45bc57c7abc281ba9967e9", size = 40478921, upload-time = "2025-02-11T18:15:07.3Z" }, + { url = "https://files.pythonhosted.org/packages/f4/5c/cab444afaa387dceac8debb817b52fd00596efcd2d54506c27311c6fe6a8/nodejs_wheel_binaries-22.14.0-py2.py3-none-win_arm64.whl", hash = "sha256:fd59c8e9a202221e316febe1624a1ae3b42775b7fb27737bf12ec79565983eaf", size = 36206637, upload-time = "2025-02-11T18:15:13.39Z" }, ] [[package]] name = "platformdirs" version = "4.3.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302, upload-time = "2024-09-17T19:06:50.688Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439, upload-time = "2024-09-17T19:06:49.212Z" }, ] [[package]] name = "pre-commit" -version = "4.0.1" +version = "4.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -278,9 +192,32 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload-time = "2025-03-18T21:35:20.987Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload-time = "2025-03-18T21:35:19.343Z" }, +] + +[[package]] +name = "proveskit-circuitpython-rp2040-v4" +version = "1.0.0" +source = { virtual = "." } + +[package.dev-dependencies] +dev = [ + { name = "adafruit-circuitpython-typing" }, + { name = "circuitpython-stubs" }, + { name = "pre-commit" }, + { name = "pyright", extra = ["nodejs"] }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [ + { name = "adafruit-circuitpython-typing", specifier = "==1.12.1" }, + { name = "circuitpython-stubs", specifier = "==9.2.8" }, + { name = "pre-commit", specifier = "==4.2.0" }, + { name = "pyright", extras = ["nodejs"], specifier = "==1.1.402" }, ] [[package]] @@ -292,20 +229,20 @@ dependencies = [ { name = "pyusb" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/96/a8de7b7e5556d4b00d1ca1969fc34c89a1b6d177876c7a31d42631b090fc/pyftdi-0.56.0-py3-none-any.whl", hash = "sha256:3ef0baadbf9031dde9d623ae66fac2d16ded36ce1b66c17765ca1944cb38b8b0", size = 145718 }, + { url = "https://files.pythonhosted.org/packages/5a/96/a8de7b7e5556d4b00d1ca1969fc34c89a1b6d177876c7a31d42631b090fc/pyftdi-0.56.0-py3-none-any.whl", hash = "sha256:3ef0baadbf9031dde9d623ae66fac2d16ded36ce1b66c17765ca1944cb38b8b0", size = 145718, upload-time = "2024-11-23T23:00:50.868Z" }, ] [[package]] name = "pyright" -version = "1.1.399" +version = "1.1.402" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/db/9d/d91d5f6d26b2db95476fefc772e2b9a16d54c6bd0ea6bb5c1b6d635ab8b4/pyright-1.1.399.tar.gz", hash = "sha256:439035d707a36c3d1b443aec980bc37053fbda88158eded24b8eedcf1c7b7a1b", size = 3856954 } +sdist = { url = "https://files.pythonhosted.org/packages/aa/04/ce0c132d00e20f2d2fb3b3e7c125264ca8b909e693841210534b1ea1752f/pyright-1.1.402.tar.gz", hash = "sha256:85a33c2d40cd4439c66aa946fd4ce71ab2f3f5b8c22ce36a623f59ac22937683", size = 3888207, upload-time = "2025-06-11T08:48:35.759Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/b5/380380c9e7a534cb1783c70c3e8ac6d1193c599650a55838d0557586796e/pyright-1.1.399-py3-none-any.whl", hash = "sha256:55f9a875ddf23c9698f24208c764465ffdfd38be6265f7faf9a176e1dc549f3b", size = 5592584 }, + { url = "https://files.pythonhosted.org/packages/fe/37/1a1c62d955e82adae588be8e374c7f77b165b6cb4203f7d581269959abbc/pyright-1.1.402-py3-none-any.whl", hash = "sha256:2c721f11869baac1884e846232800fe021c33f1b4acb3929cff321f7ea4e2982", size = 5624004, upload-time = "2025-06-11T08:48:33.998Z" }, ] [package.optional-dependencies] @@ -317,65 +254,50 @@ nodejs = [ name = "pyserial" version = "3.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", size = 159125 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0", size = 90585 }, -] - -[[package]] -name = "pytest" -version = "8.3.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b4/8c/9862305bdcd6020bc7b45b1b5e7397a6caf1a33d3025b9a003b39075ffb2/pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce", size = 1439314 } +sdist = { url = "https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", size = 159125, upload-time = "2020-11-23T03:59:15.045Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", size = 341802 }, + { url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0", size = 90585, upload-time = "2020-11-23T03:59:13.41Z" }, ] [[package]] name = "pyusb" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/6b/ce3727395e52b7b76dfcf0c665e37d223b680b9becc60710d4bc08b7b7cb/pyusb-1.3.1.tar.gz", hash = "sha256:3af070b607467c1c164f49d5b0caabe8ac78dbed9298d703a8dbf9df4052d17e", size = 77281 } +sdist = { url = "https://files.pythonhosted.org/packages/00/6b/ce3727395e52b7b76dfcf0c665e37d223b680b9becc60710d4bc08b7b7cb/pyusb-1.3.1.tar.gz", hash = "sha256:3af070b607467c1c164f49d5b0caabe8ac78dbed9298d703a8dbf9df4052d17e", size = 77281, upload-time = "2025-01-08T23:45:01.866Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl", hash = "sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430", size = 58465 }, + { url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl", hash = "sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430", size = 58465, upload-time = "2025-01-08T23:45:00.029Z" }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, ] [[package]] name = "sysv-ipc" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0c/d7/5d2f861155e9749f981e6c58f2a482d3ab458bf8c35ae24d4b4d5899ebf9/sysv_ipc-1.1.0.tar.gz", hash = "sha256:0f063cbd36ec232032e425769ebc871f195a7d183b9af32f9901589ea7129ac3", size = 99448 } +sdist = { url = "https://files.pythonhosted.org/packages/0c/d7/5d2f861155e9749f981e6c58f2a482d3ab458bf8c35ae24d4b4d5899ebf9/sysv_ipc-1.1.0.tar.gz", hash = "sha256:0f063cbd36ec232032e425769ebc871f195a7d183b9af32f9901589ea7129ac3", size = 99448, upload-time = "2021-01-17T19:07:44.217Z" } [[package]] name = "typing-extensions" version = "4.12.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321, upload-time = "2024-06-07T18:52:15.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438, upload-time = "2024-06-07T18:52:13.582Z" }, ] [[package]] @@ -387,7 +309,7 @@ dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/ca/f23dcb02e161a9bba141b1c08aa50e8da6ea25e6d780528f1d385a3efe25/virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35", size = 7658028 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/ca/f23dcb02e161a9bba141b1c08aa50e8da6ea25e6d780528f1d385a3efe25/virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35", size = 7658028, upload-time = "2025-01-17T17:32:23.085Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/9b/599bcfc7064fbe5740919e78c5df18e5dceb0887e676256a1061bb5ae232/virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779", size = 4282379 }, + { url = "https://files.pythonhosted.org/packages/89/9b/599bcfc7064fbe5740919e78c5df18e5dceb0887e676256a1061bb5ae232/virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779", size = 4282379, upload-time = "2025-01-17T17:32:19.864Z" }, ] From be8dfac9514e760f71c66af490b88cc7a526c83c Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Thu, 19 Jun 2025 17:23:13 -0500 Subject: [PATCH 08/13] Fix archive --- .github/workflows/ci.yaml | 11 ++++++++--- Makefile | 2 +- README.md | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4a5d01f..70752c3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,8 +28,13 @@ jobs: - name: Build run: | make build - - name: Archive + - name: Archive Flight Software uses: actions/upload-artifact@v4 with: - name: proves - path: artifacts/proves.zip + name: proveskit-flight-software + path: artifacts/proves/flight-software + - name: Archive Ground Station + uses: actions/upload-artifact@v4 + with: + name: proveskit-ground-station + path: artifacts/proves/ground-station diff --git a/Makefile b/Makefile index 2eeb7f5..be2c0bd 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ BOARD_MOUNT_POINT ?= "" VERSION ?= $(shell git tag --points-at HEAD --sort=-creatordate < /dev/null | head -n 1) .PHONY: install -install-%: build-% ## Install the project onto a connected PROVES Kit use `make install BOARD_MOUNT_POINT=/my_board_destination/` to specify the mount point +install-%: build-% ## Install the project onto a connected PROVES Kit use `make install-flight-software BOARD_MOUNT_POINT=/my_board_destination/` to specify the mount point ifeq ($(OS),Windows_NT) rm -rf $(BOARD_MOUNT_POINT) cp -r artifacts/proves/$*/* $(BOARD_MOUNT_POINT) diff --git a/README.md b/README.md index be75fe8..1b67e4e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# ProvesKit RP2040 v4 CircuitPython Flight Software +# ProvesKit RP2040 v4 CircuitPython Flight Software and Ground Station [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) ![CI](https://github.com/proveskit/CircuitPython_RP2040_v4/actions/workflows/ci.yaml/badge.svg) -This is the reference software for the v4x PROVES Kit Flight Controller boards. Clone this repository and use the `make install ...` tooling to get your v4x Flight Controller Board up and running! +This is the reference software for the v4x PROVES Kit Flight Controller boards. Clone this repository and use the `make install-flight-software ...` tooling to get your v4x Flight Controller Board up and running! # Development Getting Started We welcome contributions, so please feel free to join us. If you have any questions about contributing please open an issue or a discussion. From c8fc855aa04043d65fde568aa1948f12312c5f43 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sat, 21 Jun 2025 05:18:14 -0500 Subject: [PATCH 09/13] Update sleep helper arg ordering --- src/flight-software/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flight-software/main.py b/src/flight-software/main.py index f8c16ca..547ef06 100644 --- a/src/flight-software/main.py +++ b/src/flight-software/main.py @@ -103,7 +103,7 @@ imu = LSM6DSOXManager(logger, i2c1, 0x6B) - sleep_helper = SleepHelper(logger, watchdog, config) + sleep_helper = SleepHelper(logger, config, watchdog) cdh = CommandDataHandler(logger, config, packet_manager) From ed2d94f91bcd5227a4f552995e75fea6a681cdba Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Tue, 24 Jun 2025 19:59:11 -0500 Subject: [PATCH 10/13] A few more changes --- Makefile | 3 +-- config.json | 2 -- src/flight-software/repl.py | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index be2c0bd..61f701e 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,7 @@ help: ## Display this help. @echo "Creating virtual environment..." @$(MAKE) uv @$(UV) venv - @$(UV) pip install --requirement flight-software/pyproject.toml - @$(UV) pip install --requirement ground-station/pyproject.toml + @$(UV) sync .PHONY: download-libraries download-libraries: download-libraries-flight-software download-libraries-ground-station diff --git a/config.json b/config.json index 6d367af..7c1a5e9 100644 --- a/config.json +++ b/config.json @@ -73,8 +73,6 @@ "transmit_power": 23 }, "modulation": "LoRa", - "receiver_id": 250, - "sender_id": 251, "start_time": 80000, "transmit_frequency": 437.4 }, diff --git a/src/flight-software/repl.py b/src/flight-software/repl.py index d96f209..7c6a522 100644 --- a/src/flight-software/repl.py +++ b/src/flight-software/repl.py @@ -89,7 +89,7 @@ imu = LSM6DSOXManager(logger, i2c1, 0x6B) - sleep_helper = SleepHelper(logger, watchdog, config) + sleep_helper = SleepHelper(logger, config, watchdog) cdh = CommandDataHandler(logger, config, packet_manager) From 329699bfc51411e5358fbb4892afe700464dfc51 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Tue, 24 Jun 2025 20:11:06 -0500 Subject: [PATCH 11/13] Set ground station to 0.0.1 --- src/ground-station/lib/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ground-station/lib/requirements.txt b/src/ground-station/lib/requirements.txt index d0a3a9b..05be484 100644 --- a/src/ground-station/lib/requirements.txt +++ b/src/ground-station/lib/requirements.txt @@ -1,4 +1,4 @@ adafruit-circuitpython-asyncio @ git+https://github.com/adafruit/adafruit_circuitpython_asyncio@1.3.3 adafruit-circuitpython-rfm==1.0.3 adafruit-circuitpython-ticks==1.1.1 -proveskit-ground-station @ git+https://github.com/proveskit/circuitpython_ground_station@main +proveskit-ground-station @ git+https://github.com/proveskit/circuitpython_ground_station@0.0.1 From 104fbb5533c9ea4f92b331a4bc2c4721c5e828ca Mon Sep 17 00:00:00 2001 From: Michael Pham Date: Fri, 27 Jun 2025 10:31:11 -0700 Subject: [PATCH 12/13] Updated to pysquared 25w26-2 Signed-off-by: Michael Pham --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 61f701e..6d85aec 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PYSQUARED_VERSION ?= v2.0.0-alpha-25w20 +PYSQUARED_VERSION ?= v2.0.0-alpha-25w26-2 PYSQUARED ?= git+https://github.com/proveskit/pysquared@$(PYSQUARED_VERSION) .PHONY: all From 53fb332a652fdd820832874906ff5f12022f16cc Mon Sep 17 00:00:00 2001 From: Michael Pham Date: Fri, 27 Jun 2025 11:43:12 -0700 Subject: [PATCH 13/13] Updated readme with GS install command Signed-off-by: Michael Pham --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1b67e4e..7366d0b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ This is the reference software for the v4x PROVES Kit Flight Controller boards. Clone this repository and use the `make install-flight-software ...` tooling to get your v4x Flight Controller Board up and running! +If your are looking to setup ground station software you can use `make install-ground-station` to get simple receiver software running! + # Development Getting Started We welcome contributions, so please feel free to join us. If you have any questions about contributing please open an issue or a discussion.