From 126c98e5afcd2629c0deba0af53b2d991ff39ae1 Mon Sep 17 00:00:00 2001 From: Daniel Bulant Date: Mon, 11 May 2026 17:01:04 +0200 Subject: [PATCH] esp32 folder --- esp32/.cargo/config.toml | 9 + esp32/.gitignore | 1 + esp32/Cargo.lock | 2116 +++++++++++++++++++++++++++++++ esp32/Cargo.toml | 52 + esp32/build.rs | 36 + esp32/elf2uf2.nix | 26 + esp32/esp32_quiz/esp32_quiz.ino | 39 - esp32/firmware/43439A0.bin | Bin 0 -> 231077 bytes esp32/firmware/43439A0_clm.bin | Bin 0 -> 984 bytes esp32/firmware/nvram_rp2040.bin | Bin 0 -> 742 bytes esp32/flake.lock | 130 ++ esp32/flake.nix | 49 + esp32/memory.x | 17 + esp32/src/bin/logger.rs | 36 + esp32/src/bin/scan.rs | 101 ++ esp32/src/buffer.rs | 63 + esp32/src/input.rs | 90 ++ esp32/src/main.rs | 312 +++++ esp32/src/net.rs | 183 +++ esp32/src/owned_str_writer.rs | 50 + esp32/src/screen.rs | 103 ++ pico/.cargo/config.toml | 5 +- pico/flake.nix | 5 - 23 files changed, 3375 insertions(+), 48 deletions(-) create mode 100644 esp32/.cargo/config.toml create mode 100644 esp32/.gitignore create mode 100644 esp32/Cargo.lock create mode 100644 esp32/Cargo.toml create mode 100644 esp32/build.rs create mode 100644 esp32/elf2uf2.nix delete mode 100644 esp32/esp32_quiz/esp32_quiz.ino create mode 100644 esp32/firmware/43439A0.bin create mode 100644 esp32/firmware/43439A0_clm.bin create mode 100644 esp32/firmware/nvram_rp2040.bin create mode 100644 esp32/flake.lock create mode 100644 esp32/flake.nix create mode 100644 esp32/memory.x create mode 100644 esp32/src/bin/logger.rs create mode 100644 esp32/src/bin/scan.rs create mode 100644 esp32/src/buffer.rs create mode 100644 esp32/src/input.rs create mode 100644 esp32/src/main.rs create mode 100644 esp32/src/net.rs create mode 100644 esp32/src/owned_str_writer.rs create mode 100644 esp32/src/screen.rs diff --git a/esp32/.cargo/config.toml b/esp32/.cargo/config.toml new file mode 100644 index 0000000..0b3ebe5 --- /dev/null +++ b/esp32/.cargo/config.toml @@ -0,0 +1,9 @@ + +[target.xtensa-esp32-none-elf] +runner = "espflash flash --monitor" + +[build] +target = "xtensa-esp32-none-elf" + +[env] +DEFMT_LOG = "debug" diff --git a/esp32/.gitignore b/esp32/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/esp32/.gitignore @@ -0,0 +1 @@ +target diff --git a/esp32/Cargo.lock b/esp32/Cargo.lock new file mode 100644 index 0000000..3c9e56d --- /dev/null +++ b/esp32/Cargo.lock @@ -0,0 +1,2116 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ag-lcd" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d33be4690212133536fac4ad4eea4b313bf4df60b5d2a27f78e8303e36b93a7" +dependencies = [ + "embedded-hal 1.0.0", + "shared-bus", + "ufmt 0.1.2", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "as5600" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fdbe60b23e3ae22f4618c03b63aa884c4ca641830880f9d64b770d6467b4b7f" +dependencies = [ + "embedded-hal 1.0.0", + "num-derive", + "num-traits", +] + +[[package]] +name = "ascii-canvas" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1e3e699d84ab1b0911a1010c5c106aa34ae89aeac103be5ce0c3859db1e891" +dependencies = [ + "term", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "az" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be5eb007b7cacc6c660343e96f650fedf4b5a77512399eb952ca6642cf8d13f7" + +[[package]] +name = "bare-metal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitfield" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" + +[[package]] +name = "bitfield" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bt-hci" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "211713d2e9fb4793ce4360a712c0764264aff6be48932ccf02ca2a331c0436a9" +dependencies = [ + "btuuid", + "defmt 1.0.1", + "embassy-sync 0.8.0", + "embedded-io 0.7.1", + "embedded-io-async 0.7.0", + "futures-intrusive", + "heapless 0.9.2", +] + +[[package]] +name = "btuuid" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f48f1e9b0aad0a4f05d17bdeae0fa20ff798e272a03a6940ca27ad9c5a6ae7" +dependencies = [ + "defmt 0.3.100", +] + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cc" +version = "1.2.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "defmt 1.0.1", + "num-traits", + "pure-rust-locales", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + +[[package]] +name = "cortex-m" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" +dependencies = [ + "bare-metal", + "bitfield 0.13.2", + "embedded-hal 0.2.7", + "volatile-register", +] + +[[package]] +name = "cortex-m-rt" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d4dec46b34c299ccf6b036717ae0fce602faa4f4fe816d9013b9a7c9f5ba6" +dependencies = [ + "cortex-m-rt-macros", +] + +[[package]] +name = "cortex-m-rt-macros" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc-any" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62ec9ff5f7965e4d7280bd5482acd20aadb50d632cf6c1d74493856b011fa73" +dependencies = [ + "debug-helper", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cyw43" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "033e856bf6f38c96fee3e3f398cceff0ca2c2fae5db255bcd23495216c7047da" +dependencies = [ + "aligned", + "bt-hci", + "cortex-m", + "cortex-m-rt", + "defmt 1.0.1", + "embassy-futures", + "embassy-net-driver-channel 0.4.0", + "embassy-sync 0.8.0", + "embassy-time", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-io-async 0.7.0", + "futures", + "heapless 0.9.2", +] + +[[package]] +name = "cyw43-pio" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "768b74f36be804f7b1020938e711d91c0ab5a847cf620d3756245ae7e641e1e2" +dependencies = [ + "cyw43", + "defmt 1.0.1", + "embassy-rp", + "fixed", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "debug-helper" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" + +[[package]] +name = "defmt" +version = "0.3.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0963443817029b2024136fc4dd07a5107eb8f977eaf18fcd1fdeb11306b64ad" +dependencies = [ + "defmt 1.0.1", +] + +[[package]] +name = "defmt" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "548d977b6da32fa1d1fda2876453da1e7df63ad0304c8b3dae4dbe7b96f39b78" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d4fc12a85bcf441cfe44344c4b72d58493178ce635338a3f3b78943aceb258e" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror", +] + +[[package]] +name = "defmt-rtt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d5a25c99d89c40f5676bec8cefe0614f17f0f40e916f98e345dae941807f9e" +dependencies = [ + "critical-section", + "defmt 1.0.1", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "embassy-embedded-hal" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0641612053b2f34fc250bb63f6630ae75de46e02ade7f457268447081d709ce" +dependencies = [ + "embassy-futures", + "embassy-hal-internal 0.4.0", + "embassy-sync 0.8.0", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + +[[package]] +name = "embassy-executor" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0d3b15c9d7dc4fec1d8cb77112472fb008b3b28c51ad23838d83587a6d2f1e" +dependencies = [ + "cordyceps", + "cortex-m", + "critical-section", + "defmt 1.0.1", + "document-features", + "embassy-executor-macros", + "embassy-executor-timer-queue", +] + +[[package]] +name = "embassy-executor-macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d11a246f53de5f97a387f40ac24726817cd0b6f833e7603baac784f29d6ff276" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "embassy-executor-timer-queue" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc328bf943af66b80b98755db9106bf7e7471b0cf47dc8559cd9a6be504cc9c" + +[[package]] +name = "embassy-futures" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01" + +[[package]] +name = "embassy-hal-internal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f10ce10a4dfdf6402d8e9bd63128986b96a736b1a0a6680547ed2ac55d55dba" +dependencies = [ + "num-traits", +] + +[[package]] +name = "embassy-hal-internal" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568659fc53866d3d85c60fa33723fb751aa69e71507634fc2c19e7649432fb75" +dependencies = [ + "cortex-m", + "critical-section", + "defmt 1.0.1", + "num-traits", +] + +[[package]] +name = "embassy-net" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "347bc855bdbdf50ed9c5a1d80e8204badb0ba149b8732dde38e1e9708ed9d313" +dependencies = [ + "defmt 1.0.1", + "document-features", + "embassy-net-driver", + "embassy-sync 0.8.0", + "embassy-time", + "embedded-io-async 0.7.0", + "embedded-nal-async", + "heapless 0.9.2", + "managed", + "smoltcp", +] + +[[package]] +name = "embassy-net-driver" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d" +dependencies = [ + "defmt 0.3.100", +] + +[[package]] +name = "embassy-net-driver-channel" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b2739fbcf6cd206ae08779c7d709087b16577d255f2ea4a45bc4bbbf305b3f" +dependencies = [ + "embassy-futures", + "embassy-net-driver", + "embassy-sync 0.7.2", +] + +[[package]] +name = "embassy-net-driver-channel" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a07d2eb9f05a6fc876500949856ea1be40773d866d8cb99384f72d0ae4568c16" +dependencies = [ + "embassy-futures", + "embassy-net-driver", + "embassy-sync 0.8.0", +] + +[[package]] +name = "embassy-rp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d98f472894c1ecffac5596c657af5305c57282d29e8746d7fec033951931bc8" +dependencies = [ + "cfg-if", + "chrono", + "cortex-m", + "cortex-m-rt", + "critical-section", + "defmt 1.0.1", + "document-features", + "embassy-embedded-hal", + "embassy-futures", + "embassy-hal-internal 0.5.0", + "embassy-sync 0.8.0", + "embassy-time", + "embassy-time-driver", + "embassy-time-queue-utils", + "embassy-usb-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-hal-nb", + "embedded-io 0.7.1", + "embedded-io-async 0.7.0", + "embedded-storage", + "embedded-storage-async", + "fixed", + "nb 1.1.0", + "pio", + "rand_core 0.6.4", + "rand_core 0.9.5", + "rp-pac", + "rp2040-boot2", + "sha2-const-stable", + "smart-leds", +] + +[[package]] +name = "embassy-sync" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73974a3edbd0bd286759b3d483540f0ebef705919a5f56f4fc7709066f71689b" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io-async 0.6.1", + "futures-core", + "futures-sink", + "heapless 0.8.0", +] + +[[package]] +name = "embassy-sync" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbd85cf5a5ae56bdf26f618364af642d1d0a4e245cdd75cd9aabda382f65a81" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io-async 0.7.0", + "futures-core", + "futures-sink", + "heapless 0.9.2", +] + +[[package]] +name = "embassy-time" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592b0c143ec626e821d4d90da51a2bd91d559d6c442b7c74a47d368c9e23d97a" +dependencies = [ + "cfg-if", + "critical-section", + "defmt 1.0.1", + "document-features", + "embassy-time-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "futures-core", +] + +[[package]] +name = "embassy-time-driver" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ee71af1b3a0deaa53eaf2d39252f83504c853646e472400b763060389b9fcc9" +dependencies = [ + "document-features", +] + +[[package]] +name = "embassy-time-queue-utils" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168297bf80aaf114b3c9ad589bf38b01b3009b9af7f97cd18086c5bbf96f5693" +dependencies = [ + "embassy-executor-timer-queue", + "heapless 0.9.2", +] + +[[package]] +name = "embassy-usb" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc4462e48b19a4f401a11901bdd981aab80c6a826608016a0bdc73cbbab31954" +dependencies = [ + "embassy-futures", + "embassy-net-driver-channel 0.3.2", + "embassy-sync 0.7.2", + "embassy-usb-driver", + "embedded-io-async 0.6.1", + "heapless 0.8.0", + "ssmarshal", + "usbd-hid", +] + +[[package]] +name = "embassy-usb-driver" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17119855ccc2d1f7470a39756b12068454ae27a3eabb037d940b5c03d9c77b7a" +dependencies = [ + "defmt 1.0.1", + "embedded-io-async 0.6.1", +] + +[[package]] +name = "embassy-usb-logger" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deed6d36715838d6adbbff13b215b03a9deeaa66a64d5fccd6353708ccfb8b8f" +dependencies = [ + "embassy-futures", + "embassy-sync 0.7.2", + "embassy-usb", + "log", +] + +[[package]] +name = "embedded-hal" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" +dependencies = [ + "nb 0.1.3", + "void", +] + +[[package]] +name = "embedded-hal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" + +[[package]] +name = "embedded-hal-async" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884" +dependencies = [ + "embedded-hal 1.0.0", +] + +[[package]] +name = "embedded-hal-compat" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08ecac72f6be75ad2d4809c9f07d45502e2e5c9a4e9579077f28d7135de81df3" +dependencies = [ + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "nb 1.1.0", +] + +[[package]] +name = "embedded-hal-nb" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba4268c14288c828995299e59b12babdbe170f6c6d73731af1b4648142e8605" +dependencies = [ + "embedded-hal 1.0.0", + "nb 1.1.0", +] + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "embedded-io" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eb1aa714776b75c7e67e1da744b81a129b3ff919c8712b5e1b32252c1f07cc7" +dependencies = [ + "defmt 1.0.1", +] + +[[package]] +name = "embedded-io-async" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" +dependencies = [ + "embedded-io 0.6.1", +] + +[[package]] +name = "embedded-io-async" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564b9f813c544241430e147d8bc454815ef9ac998878d30cc3055449f7fd4c0" +dependencies = [ + "defmt 1.0.1", + "embedded-io 0.7.1", +] + +[[package]] +name = "embedded-nal" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56a28be191a992f28f178ec338a0bf02f63d7803244add736d026a471e6ed77" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "embedded-nal-async" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5a1bd585135d302f8f6d7de329310938093da6271b37a6c94b8798795c0c6d" +dependencies = [ + "embedded-io-async 0.7.0", + "embedded-nal", +] + +[[package]] +name = "embedded-storage" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032" + +[[package]] +name = "embedded-storage-async" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1763775e2323b7d5f0aa6090657f5e21cfa02ede71f5dc40eead06d64dcd15cc" +dependencies = [ + "embedded-storage", +] + +[[package]] +name = "ena" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1" +dependencies = [ + "log", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixed" +version = "1.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af2cbf772fa6d1c11358f92ef554cb6b386201210bcf0e91fb7fba8a907fb40" +dependencies = [ + "az", + "bytemuck", + "half", + "typenum", +] + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", +] + +[[package]] +name = "generator" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link", + "windows-result", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "heapless" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed" +dependencies = [ + "defmt 1.0.1", + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.0", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lalrpop" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4ebbd48ce411c1d10fb35185f5a51a7bfa3d8b24b4e330d30c9e3a34129501" +dependencies = [ + "ascii-canvas", + "bit-set", + "ena", + "itertools", + "lalrpop-util", + "petgraph", + "pico-args", + "regex", + "regex-syntax", + "sha3", + "string_cache", + "term", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5baa5e9ff84f1aefd264e6869907646538a52147a755d494517a8007fb48733" +dependencies = [ + "regex-automata", + "rustversion", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "managed" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "nb" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "nb" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "owned_str" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b42c259c35d8ad3e87b6dbedd4818b7b54a112f6370fdf11cd45d2f355d0f4" + +[[package]] +name = "panic-probe" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd402d00b0fb94c5aee000029204a46884b1262e0c443f166d86d2c0747e1a1a" +dependencies = [ + "cortex-m", + "defmt 1.0.1", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico" +version = "0.1.0" +dependencies = [ + "ag-lcd", + "arrayvec", + "as5600", + "cortex-m", + "cortex-m-rt", + "critical-section", + "cyw43", + "cyw43-pio", + "defmt 1.0.1", + "defmt-rtt", + "embassy-executor", + "embassy-futures", + "embassy-net", + "embassy-rp", + "embassy-sync 0.8.0", + "embassy-time", + "embassy-usb-logger", + "embedded-hal-compat", + "embedded-io 0.7.1", + "embedded-io-async 0.7.0", + "log", + "owned_str", + "panic-probe", + "portable-atomic", + "static_cell", + "ufmt 0.2.0", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pio" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0ba4153cee9585abc451271aa437d9e8defdea8b468d48ba6b8f098cbe03d7f" +dependencies = [ + "pio-core", + "pio-proc", +] + +[[package]] +name = "pio-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61d90fddc3d67f21bbf93683bc461b05d6a29c708caf3ffb79947d7ff7095406" +dependencies = [ + "arrayvec", + "num_enum", + "paste", +] + +[[package]] +name = "pio-parser" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "825266c1eaddf54f636d06eefa4bf3c99d774c14ec46a4a6c6e5128a0f10d205" +dependencies = [ + "lalrpop", + "lalrpop-util", + "pio-core", +] + +[[package]] +name = "pio-proc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed4a76571f5fe51af43cc80ac870fe0c79cc0cdd686b9002a6c4c84bfdd0176b" +dependencies = [ + "codespan-reporting", + "lalrpop-util", + "pio-core", + "pio-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +dependencies = [ + "critical-section", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pure-rust-locales" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "869675ad2d7541aea90c6d88c81f46a7f4ea9af8cd0395d38f11a95126998a0d" +dependencies = [ + "defmt 1.0.1", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" + +[[package]] +name = "rp-pac" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8af65855c40b2c35079514c5489abffc0429347fef25d8467ff98ad84b4322d3" +dependencies = [ + "cortex-m", + "cortex-m-rt", +] + +[[package]] +name = "rp2040-boot2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c92f344f63f950ee36cf4080050e4dce850839b9175da38f9d2ffb69b4dbb21" +dependencies = [ + "crc-any", +] + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shared-bus" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f8438a40b91c8b9531c664e9680c55b92bd78cd6809a8b45b4512b1e5765f2" +dependencies = [ + "embedded-hal 0.2.7", + "nb 0.1.3", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smart-leds" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66df34e571fa9993fa6f99131a374d58ca3d694b75f9baac93458fe0d6057bf0" +dependencies = [ + "smart-leds-trait", +] + +[[package]] +name = "smart-leds-trait" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f4441a131924d58da6b83a7ad765c460e64630cce504376c3a87a2558c487f" +dependencies = [ + "rgb", +] + +[[package]] +name = "smoltcp" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f73d40463bba65efc9adc6370b56df76d563cc46e2482bba58351b4afb7535e" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "cfg-if", + "defmt 0.3.100", + "heapless 0.9.2", + "managed", +] + +[[package]] +name = "ssmarshal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e6ad23b128192ed337dfa4f1b8099ced0c2bf30d61e551b65fda5916dbb850" +dependencies = [ + "encode_unicode", + "serde", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_cell" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0530892bb4fa575ee0da4b86f86c667132a94b74bb72160f58ee5a4afec74c23" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "term" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8c27177b12a6399ffc08b98f76f7c9a1f4fe9fc967c784c5a071fa8d93cf7e1" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "typenum" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "ufmt" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d3c0c63312dfc9d8e5c71114d617018a19f6058674003c0da29ee8d8036cdd" +dependencies = [ + "proc-macro-hack", + "ufmt-macros 0.2.0", + "ufmt-write", +] + +[[package]] +name = "ufmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a64846ec02b57e9108d6469d98d1648782ad6bb150a95a9baac26900bbeab9d" +dependencies = [ + "ufmt-macros 0.3.0", + "ufmt-write", +] + +[[package]] +name = "ufmt-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ab6c92f30c996394a8bd525aef9f03ce01d0d7ac82d81902968057e37dd7d9" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ufmt-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d337d3be617449165cb4633c8dece429afd83f84051024079f97ad32a9663716" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ufmt-write" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "usb-device" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98816b1accafbb09085168b90f27e93d790b4bfa19d883466b5e53315b5f06a6" +dependencies = [ + "heapless 0.8.0", + "portable-atomic", +] + +[[package]] +name = "usbd-hid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f291ab53d428685cc780f08a2eb9d5d6ff58622db2b36e239a4f715f1e184c" +dependencies = [ + "serde", + "ssmarshal", + "usb-device", + "usbd-hid-macros", +] + +[[package]] +name = "usbd-hid-descriptors" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee54712c5d778d2fb2da43b1ce5a7b5060886ef7b09891baeb4bf36910a3ed" +dependencies = [ + "bitfield 0.14.0", +] + +[[package]] +name = "usbd-hid-macros" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb573c76e7884035ac5e1ab4a81234c187a82b6100140af0ab45757650ccda38" +dependencies = [ + "byteorder", + "hashbrown 0.13.2", + "log", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "usbd-hid-descriptors", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcell" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "volatile-register" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de437e2a6208b014ab52972a27e59b33fa2920d3e00fe05026167a1c509d19cc" +dependencies = [ + "vcell", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] diff --git a/esp32/Cargo.toml b/esp32/Cargo.toml new file mode 100644 index 0000000..be339de --- /dev/null +++ b/esp32/Cargo.toml @@ -0,0 +1,52 @@ +[package] +name = "pico" +version = "0.1.0" +edition = "2024" + + +[dependencies] +embedded-hal-compat = "0.13.0" +embassy-usb-logger = "0.5.1" +ufmt = "0.2.0" +log = "0.4" +ag-lcd={ version = "0.3", features = ["ufmt"]} +as5600 = "0.8.0" +embassy-futures = "0.1.2" +embedded-io-async = "0.7.0" +embedded-io = "0.7.1" +owned_str = "0.1.2" +embassy-sync = "0.8.0" +arrayvec = { version = "0.7.6", default-features = false } +embassy-net = { version = "0.9.1",features = ["defmt", "icmp", "tcp", "udp", "raw", "dhcpv4", "medium-ethernet", "dns", "proto-ipv4", "proto-ipv6", "multicast"]} +embassy-executor = { version = "0.10.0", features = [ + "platform-cortex-m", + "executor-thread", + "executor-interrupt", + "defmt", +] } +embassy-rp = { version = "0.10.0", features = [ + "defmt", + "unstable-pac", + "time-driver", + "critical-section-impl", + "rp2040", +] } +embassy-time = { version = "0.5.1", features = [ + "defmt", + "defmt-timestamp-uptime", +] } + +cortex-m = { version = "0.7.7", features = ["inline-asm"] } +cortex-m-rt = "0.7.5" +critical-section = "1.2.0" +static_cell = "2.1.1" +portable-atomic = { version = "1.13.1", features = ["critical-section"] } + + +defmt = "1.0.1" +defmt-rtt = "1.1.0" + +panic-probe = { version = "1.0.0", features = ["print-defmt"] } + +cyw43 = { version = "0.7.0", features = ["defmt", "firmware-logs"] } +cyw43-pio = { version = "0.10.0", features = ["defmt"] } diff --git a/esp32/build.rs b/esp32/build.rs new file mode 100644 index 0000000..3f915f9 --- /dev/null +++ b/esp32/build.rs @@ -0,0 +1,36 @@ +//! This build script copies the `memory.x` file from the crate root into +//! a directory where the linker can always find it at build time. +//! For many projects this is optional, as the linker always searches the +//! project root directory -- wherever `Cargo.toml` is. However, if you +//! are using a workspace or have a more complicated build setup, this +//! build script becomes required. Additionally, by requesting that +//! Cargo re-run the build script whenever `memory.x` is changed, +//! updating `memory.x` ensures a rebuild of the application with the +//! new memory settings. + +use std::env; +use std::fs::File; +use std::io::Write; +use std::path::PathBuf; + +fn main() { + // Put `memory.x` in our output directory and ensure it's + // on the linker search path. + let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); + File::create(out.join("memory.x")) + .unwrap() + .write_all(include_bytes!("memory.x")) + .unwrap(); + println!("cargo:rustc-link-search={}", out.display()); + + // By default, Cargo will re-run a build script whenever + // any file in the project changes. By specifying `memory.x` + // here, we ensure the build script is only re-run when + // `memory.x` is changed. + println!("cargo:rerun-if-changed=memory.x"); + + println!("cargo:rustc-link-arg-bins=--nmagic"); + println!("cargo:rustc-link-arg-bins=-Tlink.x"); + println!("cargo:rustc-link-arg-bins=-Tlink-rp.x"); + println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); +} diff --git a/esp32/elf2uf2.nix b/esp32/elf2uf2.nix new file mode 100644 index 0000000..a2185e7 --- /dev/null +++ b/esp32/elf2uf2.nix @@ -0,0 +1,26 @@ +{ lib, stdenv, rustPlatform, fetchFromGitHub, pkg-config, libudev-zero }: + +rustPlatform.buildRustPackage rec { + pname = "elf2uf2-rs"; + version = "2038e9a199101ee8a16d046a87136be2a607001d"; + + src = fetchFromGitHub { + owner = "JoNil"; + repo = pname; + rev = "${version}"; +# sha256 = "sha256-CHuTpnAnD4I5PY47sceSxfjGdPZznXWfARE4YBfYoIg="; +# sha256 = "sha256-tvjncEmVHFurhRtWN6m8JT0XIgrti4QTnZ2XioBtqxo="; + sha256 = "sha256-CHuTpnAnD4I5PY47sceSxfjGdPZznXWfARE4YBfYoIg="; + }; + + nativeBuildInputs = [ + pkg-config + ]; + + buildInputs = [ + libudev-zero + ]; + +# cargoHash = "sha256-OefAKK5rvh4HSHd26Pac4BSbcNO3ntqBReYepulV8Dk="; + cargoHash = "sha256-tvjncEmVHFurhRtWN6m8JT0XIgrti4QTnZ2XioBtqxo="; +} diff --git a/esp32/esp32_quiz/esp32_quiz.ino b/esp32/esp32_quiz/esp32_quiz.ino deleted file mode 100644 index 292cc8f..0000000 --- a/esp32/esp32_quiz/esp32_quiz.ino +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include - -// LCD pins: RS, EN, D4, D5, D6, D7 -LiquidCrystal lcd(18, 19, 13, 14, 15, 26); - -const int LED_PIN = 2; // built-in LED on most ESP32 devkits - -void setup() { - Serial.begin(115200); - - // WiFi chip init (not connected yet) - WiFi.mode(WIFI_STA); - WiFi.disconnect(); - Serial.println("WiFi initialized"); - - // Let LCD power up before init (ESP32 boots faster than LCD expects) - delay(500); - lcd.begin(16, 2); - lcd.clear(); - - pinMode(LED_PIN, OUTPUT); -} - -void loop() { - Serial.println("led on!"); - digitalWrite(LED_PIN, HIGH); - delay(1000); - - lcd.clear(); - lcd.print("Test message!"); - - Serial.println("led off!"); - digitalWrite(LED_PIN, LOW); - delay(1000); - - lcd.clear(); - lcd.print("Test message2!"); -} diff --git a/esp32/firmware/43439A0.bin b/esp32/firmware/43439A0.bin new file mode 100644 index 0000000000000000000000000000000000000000..a05482fe957fbbf27d334e9b5c4fa6c53022f0bf GIT binary patch literal 231077 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

w>?fhn1I6lG&!cVPT)KYe*G<|KS;7b>wI z+M-XZjzS%N0~W8Sj6f^)>C^&ng|Lcq*|_1;s3U;;4Xpa1snLe!KAo`t_g~gyrN(Dh zQ5zynAQLM9KC6+e+Yn|oqW!mTyL=V;?~~}8m*6SFvlM-DA)Xz0KEhLg{yGu$?;7gm z7TAp+>^Hv!2>Z=%QEPi_ zKV6UQhjs|LcjtiY-nIT5w6(?muiXCM<6^#_i_hA`OaJ#|;hR^WcC$Gwux!-~(ho^{ zSl!k=yWrFRVNd(#7+C%D&oL+eSb+LA9>QAev#{{}!urum6MfXh(-F6SB73{at8&9dg{^M|H1uMybJ7v7qQ z_O7V!lX5Aa#)bgZ^c!5JB|rH_kbzIB%1^n`*9eTB+j?oOP~Z<;i;%U1<+olc5Z3vz z1;7>%R_`>|7h}9lg$N{czAOK5kIipvs7yZzQjCKlx$*U5`g9v75qx zFF0h{i)?fxR12x2pdWlF53USke(Z*&-jGVA#M;oEqid`_ zs2p0sl@Hh%R+(7V=~*VL%mXTZmXxjRtQGb#PhqESd41^CTAX?R2JIjeeX$j`;&1T0 zf#*Fu2k|7K-;PDUt%Hs|AMJ+r0MSY8Ej8*gwRy8yQw^V?h6;0^t=FZG-1E{S^SH4| z;$Hib#m1PRi;;$CoXew=W|FkJm5bJ#<3}n+Im~LOY7{?`cLt48j@*M&1Cr!{$B81d zqCpWI+Nj39`p3=JaYj3d>x1_W&mOPJoapHAlzacAR^kK)z4a;WQ^7?)*6_2mk$Es! zj#GntKP7$@{URFsIQvwh{go?9)w`l`j*r`_1cz@*K~9{_{^$uEJQ0nV&{Da~Qp^5&BB;mu*Xa^t4&!mox0ysdN&N~aV4{K&z(X5+-G=EFGn zQRwsxmS@)v#)-J0Hk|hl;YFbn|3aVip_YL-74fq)-mQVh+R)s=m7IVx_gt98ch)eN zmD@z@&sq&TXg9`A)1h#)vQo7>#qo%PiyCH$vM9G5y=H<3qp@{iW)plHnU3=Cus9T_ z%_yFHC@4c?o@#s3!AFs7IsI7k_nx2*!9iYU+A&~fY$p#BPR*4kcYKQzv=%yT=A%J#lpuM z3m=<#^*kpSH(3i~=;X-j#6A7XIC%-bu8`u|#U?Y(Y#7&Ow&zYZU(Wj(eDM=MKJcQA zyI*WHZW7GTMi>jNo1TkUScrYH-rwbp%1wl1Lk=A)P{!yQb`Rrj9#`@4nU?o0$5!8w zDV-|qFAmp`_Z!X4$A{1kw~QN`;A=P7%!|Wy@D(c2iP$Od-H~RlJ8)gP;d;^jf&F{? zK6nT<;0%t>$75+G&i}?8f#=|-9N<1q(WaBv4#O#A<$T+Q8#={&%Mi@vki@j&a87yi z=^>-+NUL6T<=q%1KyGTiI4 zc3D!EsGUVi(*01;k_uZx3%sV(vGao{Ri&8|&<~pG5BNNZ^|7V6lj8eWbhbV=&Yfg3 zGN`IGDRvfoC-GeF!@5J$mju)nF3~&eIJtGz%L_Q!WY*!Vk@)aMS+EZ;33w;OyvaNe zr+_A#=`{FHQod({`5Nj}Xq(mppCePwhaYVBNH3&V?>iseK~;zS%jI;gHjHVZZKQsK24Re6m(!!&^BN2|;q%Y#k9 zW_!+boWdO4sQPdC1q$JIs9F|i_#Hdp86m@MkA>H)$5kz}HNh=|l?t4B-ADd@8jd37 z|IznwDLfG*gn}}QdK&w)Vb;3!d_PJ0dIK?d$~3OAF|~ zf8z?Otd}^`N7nLmr9Q^O88*r$?u0y{iq1b>5p@PN&Q$X|uS>Zu&bUz?W#TG-%=#$n zNQ?KOfpyQCPvR8z$$lku$8H7$oPg)Aqmb|ivN`tzM!f+|0dx0P}+ zGaL3V3AHt8RcDP@R|vHLvV63JYWFVGN=b@!CEc2;tVkZvcr8bg9&o9n0~+XUqDvR8 zVs9o_P_(kKJI+T-;OAC7Ab6-_zAYJh@pvanbma;8qyWFdZs&lqppEh&_HI!;5xi0U zT!^qK#iUgceK*QSOmu4h(S{sw^lcAEfGkV=9MPArwe;qwrKOvrA6vRPy4pem!Hp-v%;_z@U4r@(WI9<$-IROv9C*l`e`@`3^@W>aHdMtdmlV8puU3ll{?MmlH`BV6d3O0K0{{Uqk)Z`r> zfD@!@?9<W1b9~CMMWXFR@(M)Q7sXK+ z&BzN~X;-~tB;FNx-`rK|pgcY6*bY8YYCl?bu*IICYdVY8L2t??9vogYDZ$}Q>3a_s zMZN&L-s0-$RJtVPwUV!_K)mrS$5dKqA-wp{HZD4-P7snX4hndvKT?@T<^+7G8oww9 zV-a_Y0wybn;MqoyH#WK1m)=KDDRh zC~j&7Dc$nCj2q#j=gO+7{DXaJxl!*q1#`v2)IYpy_gv)-pC`?gL#7T*=EO4l9bS5K zeY%CT2p`wS!OId+YZ-JqXsp4(j|p$!<6dr@;m>aX^Kz+C}&sfp;z9t(APV zBK(71U+P^C{=xjt`|3eGczn^Lws9lXBCqb|v7}eb-qJsCPs}vLgKM0Z(hY{ZFDt&TiGWB5r4XLg$<4$-}b+qot2&x-ygth1# z1Fd_iQLXnPXWx4+$f#=yUk&@-^PYU4@RM{5p0zaSWjF<;8Rg`Y@0S^a6c*@3IOPHUjx5nSPB4s(w3qDGV# z{UKQ4)QI9MuLR%CC;Y@RK7Wwz@L6ydpS{2SQqR{j+<(Q_1McGUPAzvy3wkJ%Tnj+y zZoQXJ;o#kT@)vLQWjsFhO5biC?_;ve^7FW@7ms7^;<5LahxdFr!~GY0`LovEvg|GO zz#hsZ*Bns3&v-nP{AD9a@_z8g&B}e4?&!nlhB2X^d1DPHl%@{C=x|*cEm?3jf3kTH zJm}u^YMoxsH7|K*u4!*=<($wRh1XNBOM@ly2MM2&uY+kY#g+7ZU_9B;ckkV9a?Cp z2@Q98wC>!+A)U%wcj^?i#Q0W)t&YpMRkSKJNh=m8)Gh0^-T?lg(<~ zEgael1DrvVxbdqS;!C&~sWI0{BfE}`bQl{AE-8t9k;mvtqdW2aPq)H$Fi!!F58f>6 z_jJR=HB#OZYhoH(7yWiNw{w*kwNHpl-2QR@#uF>O1LxO z!|PI43%t-zx^>`>$>Qn9oVt&=@&I^eBVQ89X6;Acdq&8-aWwqLQoSohy(6z9Wu3+x zK4$F2I}+-hw^jG#tq(kCXnK0H-nHiWdnj*7O4zw}YrI8Q3F(vvRKlZ0Iryl&;z{h( zqO6G%@_(M*#YI;)`n;D?KL#0Oa8a+Lf9-2lZC7u1Nq><>n~T7;B)#0SCv^j6(5_1* zEwfPm$T z)=J&CsHX$be(Nw!3`Dzb2W$d-i`sKcj9(_C)6diRbb6Qcw|i1sc-MD(m&@UMC}+D= z_-<%Qj73%Xk>gIO_vZE8o;VrqW8ifX;wUZZyXbpM{k0x?U*7IR-jtSD^Ao7sS3H+H zGu&;KAEjyV!#@u)tMzEvTrByP8iaP~l5nLhyW0%Dtv#{uBv1OL*YjQ{)tfO$VN#pl zpMH`{+Vxo?bQ5@;i5b_Jf)OF`;;~+~9r}O9%U%6HM*3eblQBJf`$mdCwZOi>?&lcX zkTdpTcj~=!+W&v0UVT^Uy(Qn?V>|j%FGuPaRaolq28P+Z#6#p04tGSg(_BB@e8)Ppe4ok$948DeCPx5pxD9N(+CF+Gbt+lj^6Sds{s9MIrZ4SBuM(m@T%DpIXf<@<@wYHd?a+KyUkN!%wZ;X1Ymvf_(gz+L?&^y)2$rkTCXZlKTi{c}t4cN4 zXa*(`_QvMJrSSc_GnsrL$r(Y2>2ObX!Ap(pN9i^A?ks?hNInQ&s+@dWctEqy+$-|78K|Vi5b(_Z;X6l zlruu+-_pWsb`a9cn(1leZz^<~7HDrOF!M7lKr1Us@r^zR)$%Ryyb6B8WJOgF9zHG& zw>{;DQHolbuYY64(~%lye_2t3G=lmdR`ZO5Grv5|$15iGk2&0kxq=M%J^Bp)Z{fc5 zLw(_8Uj@mGaGN00cHB*2b9`mdK4vneSmJH3Ta*@`e*L_6BGy)9c;p<)$w#+AuDU~- z^a$IOT6KE3P47@+H6{?+{5M_>v+NYU?-ic;Y?cp&q-)KQw)@OqIGSyhj^Ibf*mfoN zYjjCBBqvJZ^exU9W6?Sj%~9|}>BQR1kJ6uSjWu&)aess{-a>0hlpd{Htva-ExyroE z(IB5Raaf5sEuRsT%dzIxn6$hap2aXTfU&GanhQ_=iVvsDx@j8oVzf+tf3SGA>z!*F zF2n5=u1Y_(Qvd3bTHMXcpM|IUlY;8z2E{4)Oo(CmR+Nur`Dn~g6)+!wKTCgv?Ud2* z!SZE9X`&Sn`mT|E*K*f)!{H~8{06(E<8B_F2|4s36hFgl?;i;K&+y@vgno?PKE!O4 z{UzV~TgWwZNpHV&UjLP>nwa74SoM{xo9GLD7ol{s)2{y`w{Kbh{X%1Ww@HV?-8OuUEGk}t`Y6mwJs{PYMQ;i2 z{;3u#y~Vlvr54L`F>`wj{{Iy`e-<7+ohiKXtOAk7MC)itK0BIb#eFH%jyEpRAP#cq_UX~v?$MSohPTm&!q z#-c^X7AarMeb~OZUaGf{*ErwortY19_u4!Q*}Zfw=^xD7cZ+1a6&U?>U6VZ4WXb%x zZf~|Bx=B`<2=jYkFEE!g&vB7w4bcPH3}yebR5$28qZTQf+0rg)ztkYBCUJUe7S*7= z@Xd!5CRwwvU&Ca?_~W$hwP39xzS+{>Xw2Nhd?^fZP6zE4)Q}eG6l!&g^j+(Hj&J3G zvF|1;8@|Pg&3nmw;|b`av|}xxMHN84fHD6%^YZD@Xm7a^-Nqpoc@A-gP+B2G@7(Mu zfj78lgVs#*L)_LD$Ct3!HVm}o^utNnQX)S}?xhrUm z4D0BClUsOJ-(Au)7Kd<&z)eBQwC>XEc>wzUhR$2DolK@RK3L8&UV z43F1-prrPUZ0B^Sb%B!oz-$JoY222m{@JmXtHauL$k8pRE0uUs7He_8YQRM<7HgE) zX)^*NGjD8>(y^Zb-!k<*s>P@z8~U&uCbiOBL*Jt`R(P>GXtI})ui?^u82ha&Y0QFG z&vy=EuK;-u;dEEgrl}NgLk8|2Sx^e!-0%XdveOz@l6b;ScIyN1N$B+?z%Ij`lJ*R- z{>h=X(0&ScuHI-VKY)M5fZ(ibYN-K1<;l%feRg0^d)48#y}hktQpUq?y`qVFhe2J| zrGlC6S;XCfMzYx+F(J*zA27Fh-o8zxN^`%P?eNq55%wvp+j4CdM=~agDTrSMJ_=AS z@PW|@pViyRq9t#|dzaDq1uiRPK})66Flc{_RbB&`Wg+>N8r(< zE7}}_5Q8fZJO$(JHk*;gonW0B+! Mw%74+XFL}sCCRg@9XeigZBR{>d7oT<#-;) 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 Nw`jEfwa=eK{sQ=&t>FLw literal 0 HcmV?d00001 diff --git a/esp32/firmware/nvram_rp2040.bin b/esp32/firmware/nvram_rp2040.bin new file mode 100644 index 0000000000000000000000000000000000000000..7a24de5ec16c277bb0ec68b4665683d7c4cd1683 GIT binary patch literal 742 zcmZ9KO^@Rs42Jz<=GaPxd^Qq?-e>19hq+b+NEQuA*g#X}->*q3ZM8&-@;=xmFZRdR z=k?d8*~A;Y-e8jRV70)+HG*Fky$fu31Dlx-#Y$6xHru{c7KTH=$W_N5ZzvJlwmHB` zRWUJ!ce5vP!n#a3iLoPLaB>W}B$o8xD=ji6mKUTb z-LRTJqG$-gyr@+P269Bfs|uv#BT1zeZN&Bc9lS&vL$HyGa0HX0m!q^Zg^_8BmMG4w zZclYxUQXwxY2mtkO;+C&=5tS&R7>@~{bOB*A()7wB45exsci`{(N?d%mqFAyuzzsm zqhF}LGvhMo=^sgT&GrS83NN^6ngdfC{0r9_ash3}!MeELI&1$&y%7Yx^m@v!+5Wjn zXLU3o?pkG)$a7ikyT*sZj5rth8ob^couIi}rXjq=oH;xf(9vd=J)t~J!QWT4 f(4bPkQURm0QT@L4G8pR68YVlF!9J?n(>uUl1QqMk literal 0 HcmV?d00001 diff --git a/esp32/flake.lock b/esp32/flake.lock new file mode 100644 index 0000000..f5b3df2 --- /dev/null +++ b/esp32/flake.lock @@ -0,0 +1,130 @@ +{ + "nodes": { + "esp-rs": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1772358514, + "narHash": "sha256-EV0KKHtOmqFyAX4HakujCYwnX7ef+Hr8AKf73cd9n7s=", + "owner": "leighleighleigh", + "repo": "esp-rs-nix", + "rev": "8baa40f096e7f52a10e8438b0bd55ef5dc280164", + "type": "github" + }, + "original": { + "owner": "leighleighleigh", + "repo": "esp-rs-nix", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1759362264, + "narHash": "sha256-wfG0S7pltlYyZTM+qqlhJ7GMw2fTF4mLKCIVhLii/4M=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "758cf7296bee11f1706a574c77d072b8a7baa881", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1760038930, + "narHash": "sha256-Oncbh0UmHjSlxO7ErQDM3KM0A5/Znfofj2BSzlHLeVw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0b4defa2584313f3b781240b29d61f6f9f7e0df3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1754788789, + "narHash": "sha256-x2rJ+Ovzq0sCMpgfgGaaqgBSwY+LST+WbZ6TytnT9Rk=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "a73b9c743612e4244d865a2fdee11865283c04e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1777383249, + "narHash": "sha256-b6T90GXUr21iIu6Aw+KGy5uSiB/cVT/UecId1YSESys=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "61a7520db583d9b41be602b4c1e1b1b1b1faa1f4", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1744536153, + "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "esp-rs": "esp-rs", + "nixpkgs": "nixpkgs_2", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1777346187, + "narHash": "sha256-oVxyGjpiIsrXhWTJVUOs38fZQkLjd0nZGOY9K7Kfot8=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "146e7bf7569b8288f24d41d806b9f584f7cfd5b5", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/esp32/flake.nix b/esp32/flake.nix new file mode 100644 index 0000000..0d8d30c --- /dev/null +++ b/esp32/flake.nix @@ -0,0 +1,49 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs"; + rust-overlay.url = "github:oxalica/rust-overlay"; + esp-rs.url = "github:leighleighleigh/esp-rs-nix"; + }; + + outputs = + { + self, + rust-overlay, + nixpkgs, + esp-rs, + }: + let + overlays = [ (import rust-overlay) ]; + pkgs = import nixpkgs { + system = "x86_64-linux"; + inherit overlays; + }; + in + { + packages.x86_64-linux.elf2uf2-rs = pkgs.callPackage ./elf2uf2.nix { }; + devShell.x86_64-linux = pkgs.mkShell { + buildInputs = with pkgs; [ + espflash + esptool + esp-rs.packages.${system}.default + cargo-espmonitor + # (pkgs.rust-bin.selectLatestNightlyWith ( + # toolchain: + # toolchain.default.override { + # targets = [ + # "thumbv6m-none-eabi" + # "xtensa-esp32-none-eabi" + # ]; + # extensions = [ "rust-src" ]; + # } + # )) + pkgs.rust-analyzer + pkgs.flip-link + pkgs.probe-rs-tools + self.packages.x86_64-linux.elf2uf2-rs + pkgs.rustfmt + # pkgs.picotool + ]; + }; + }; +} diff --git a/esp32/memory.x b/esp32/memory.x new file mode 100644 index 0000000..ef19dff --- /dev/null +++ b/esp32/memory.x @@ -0,0 +1,17 @@ +MEMORY { + BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100 + FLASH : ORIGIN = 0x10000100, LENGTH = 2048K - 0x100 + + /* Pick one of the two options for RAM layout */ + + /* OPTION A: Use all RAM banks as one big block */ + /* Reasonable, unless you are doing something */ + /* really particular with DMA or other concurrent */ + /* access that would benefit from striping */ + RAM : ORIGIN = 0x20000000, LENGTH = 264K + + /* OPTION B: Keep the unstriped sections separate */ + /* RAM: ORIGIN = 0x20000000, LENGTH = 256K */ + /* SCRATCH_A: ORIGIN = 0x20040000, LENGTH = 4K */ + /* SCRATCH_B: ORIGIN = 0x20041000, LENGTH = 4K */ +} diff --git a/esp32/src/bin/logger.rs b/esp32/src/bin/logger.rs new file mode 100644 index 0000000..ed2333e --- /dev/null +++ b/esp32/src/bin/logger.rs @@ -0,0 +1,36 @@ +//! This example shows how to use USB (Universal Serial Bus) in the RP2040 chip. +//! +//! This creates the possibility to send log::info/warn/error/debug! to USB serial port. + +#![no_std] +#![no_main] + +use embassy_executor::Spawner; +use embassy_rp::bind_interrupts; +use embassy_rp::peripherals::USB; +use embassy_rp::usb::{Driver, InterruptHandler}; +use embassy_time::Timer; +use {defmt_rtt as _, panic_probe as _}; + +bind_interrupts!(struct Irqs { + USBCTRL_IRQ => InterruptHandler; +}); + +#[embassy_executor::task] +async fn logger_task(driver: Driver<'static, USB>) { + embassy_usb_logger::run!(1024, log::LevelFilter::Info, driver); +} + +#[embassy_executor::main] +async fn main(spawner: Spawner) { + let p = embassy_rp::init(Default::default()); + let driver = Driver::new(p.USB, Irqs); + spawner.spawn(logger_task(driver).unwrap()); + + let mut counter = 0; + loop { + counter += 1; + log::info!("Tick {}", counter); + Timer::after_secs(1).await; + } +} diff --git a/esp32/src/bin/scan.rs b/esp32/src/bin/scan.rs new file mode 100644 index 0000000..d9917a3 --- /dev/null +++ b/esp32/src/bin/scan.rs @@ -0,0 +1,101 @@ +//! This example uses the RP Pico W board Wifi chip (cyw43). +//! Scans Wifi for ssid names. + +#![no_std] +#![no_main] +#![allow(async_fn_in_trait)] + +use core::str; + +use cyw43::aligned_bytes; +use cyw43_pio::{DEFAULT_CLOCK_DIVIDER, PioSpi}; +use defmt::*; +use embassy_executor::Spawner; +use embassy_rp::gpio::{Level, Output}; +use embassy_rp::peripherals::{DMA_CH0, PIO0, USB}; +use embassy_rp::pio::{InterruptHandler, Pio}; +use embassy_rp::{bind_interrupts, dma, usb}; +use embassy_time::Timer; +use static_cell::StaticCell; +use {defmt_rtt as _, panic_probe as _}; + +bind_interrupts!(struct Irqs { + PIO0_IRQ_0 => InterruptHandler; + USBCTRL_IRQ => usb::InterruptHandler; + DMA_IRQ_0 => dma::InterruptHandler; +}); + +#[embassy_executor::task] +async fn cyw43_task( + runner: cyw43::Runner<'static, cyw43::SpiBus, PioSpi<'static, PIO0, 0>>>, +) -> ! { + runner.run().await +} +#[embassy_executor::task] +async fn logger_task(usb: embassy_rp::Peri<'static, embassy_rp::peripherals::USB>) { + let driver = embassy_rp::usb::Driver::new(usb, Irqs); + + embassy_usb_logger::run!(1024, log::LevelFilter::Info, driver); +} +#[embassy_executor::task] +async fn periodic_log() { + loop { + info!("periodic log"); + Timer::after_millis(1000).await; + } +} + +#[embassy_executor::main] +async fn main(spawner: Spawner) { + let p = embassy_rp::init(Default::default()); + spawner.spawn(unwrap!(logger_task(p.USB))); + spawner.spawn(unwrap!(periodic_log())); + + info!("Hello World!"); + + let fw = aligned_bytes!("../../firmware/43439A0.bin"); + let clm = aligned_bytes!("../../firmware/43439A0_clm.bin"); + let nvram = aligned_bytes!("../../firmware/nvram_rp2040.bin"); + + // To make flashing faster for development, you may want to flash the firmwares independently + // at hardcoded addresses, instead of baking them into the program with `include_bytes!`: + // probe-rs download 43439A0.bin --binary-format bin --chip RP2040 --base-address 0x10100000 + // probe-rs download 43439A0_clm.bin --binary-format bin --chip RP2040 --base-address 0x10140000 + //let fw = unsafe { core::slice::from_raw_parts(0x10100000 as *const u8, 230321) }; + //let clm = unsafe { core::slice::from_raw_parts(0x10140000 as *const u8, 4752) }; + + let pwr = Output::new(p.PIN_23, Level::Low); + let cs = Output::new(p.PIN_25, Level::High); + let mut pio = Pio::new(p.PIO0, Irqs); + let spi = PioSpi::new( + &mut pio.common, + pio.sm0, + DEFAULT_CLOCK_DIVIDER, + pio.irq0, + cs, + p.PIN_24, + p.PIN_29, + dma::Channel::new(p.DMA_CH0, Irqs), + ); + + static STATE: StaticCell = StaticCell::new(); + let state = STATE.init(cyw43::State::new()); + let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw, nvram).await; + spawner.spawn(unwrap!(cyw43_task(runner))); + + control.init(clm).await; + control + .set_power_management(cyw43::PowerManagementMode::PowerSave) + .await; + + loop { + info!("scan loop"); + let mut scanner = control.scan(Default::default()).await; + while let Some(bss) = scanner.next().await { + if let Ok(ssid_str) = str::from_utf8(&bss.ssid) { + info!("scanned {} == {:x}", ssid_str, bss.bssid); + } + } + Timer::after_millis(1000).await; + } +} diff --git a/esp32/src/buffer.rs b/esp32/src/buffer.rs new file mode 100644 index 0000000..df0ac3c --- /dev/null +++ b/esp32/src/buffer.rs @@ -0,0 +1,63 @@ +use core::{convert::Infallible, fmt::Display, ops::Deref}; + +use arrayvec::ArrayVec; +use embassy_futures::yield_now; +use embassy_net::Stack; + +pub struct WriteBuffer(ArrayVec); + +impl Display for WriteBuffer { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str(str::from_utf8(self).map_err(|_| core::fmt::Error)?) + } +} + +impl Deref for WriteBuffer { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl WriteBuffer { + pub fn new() -> Self { + Self(ArrayVec::new()) + } + + pub fn clear(&mut self) { + self.0.clear(); + } +} + +impl embedded_io::ErrorType for WriteBuffer { + type Error = Infallible; +} + +impl embedded_io::Write for WriteBuffer { + #[inline] + fn write(&mut self, buf: &[u8]) -> Result { + let _ = self.0.try_extend_from_slice(buf); //silently fails! + Ok(buf.len()) + } + + #[inline] + fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> { + self.write(buf)?; + Ok(()) + } + + #[inline] + fn flush(&mut self) -> Result<(), Self::Error> { + Ok(()) + } +} + +pub async fn wait_for_config(stack: Stack<'static>) -> embassy_net::StaticConfigV4 { + loop { + if let Some(config) = stack.config_v4() { + return config.clone(); + } + yield_now().await; + } +} diff --git a/esp32/src/input.rs b/esp32/src/input.rs new file mode 100644 index 0000000..8bf35d9 --- /dev/null +++ b/esp32/src/input.rs @@ -0,0 +1,90 @@ +use as5600::As5600; +use embassy_executor::Spawner; +use embassy_rp::{ + Peri, + gpio::{AnyPin, Input}, + i2c::{Config, I2c}, + peripherals::{I2C0, PIN_4, PIN_5}, +}; +use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Channel, mutex::Mutex}; +use embassy_time::{Duration, Timer}; +use ufmt::uwrite; + +use crate::{Irqs, WHEEL_VALUE, screen::SCREEN_BUFFER, unwrap}; + +/// Button input notification channel +pub static INPUT: Channel = Channel::new(); + +#[embassy_executor::task(pool_size = 4)] +/// Polls a single pin for falling edge (assumes buttons are pulled up and shorted when pressed) +/// Sends [INPUT] with given id +pub async fn button_poll_task(mut button: Input<'static>, id: u8) { + loop { + button.wait_for_falling_edge().await; + INPUT.send(id).await; + // uwrite!(SCREEN_BUFFER.lock().await.line1(), "btn {}", id); + Timer::after(Duration::from_millis(50)).await; + } +} + +pub static ANGLE: Mutex = Mutex::new(0); + +#[embassy_executor::task] +pub async fn rotation_read_task( + i2c: Peri<'static, I2C0>, + scl: Peri<'static, PIN_5>, + sda: Peri<'static, PIN_4>, +) { + let i2c = I2c::new_async(i2c, scl, sda, Irqs, Config::default()); + let mut as5600 = As5600::new(i2c); + + loop { + Timer::after(Duration::from_millis(50)).await; + let angle = as5600.angle().unwrap_or(0); + let mut locked = ANGLE.lock().await; + let old = *locked as i32; + *locked = angle; + drop(locked); + let left_diff = old - angle as i32; + let right_diff = angle as i32 - old; + let diff = if left_diff.abs() < right_diff.abs() { + -left_diff + } else { + right_diff + }; + let mut wheel = WHEEL_VALUE.lock().await; + if wheel.max != wheel.min { + let wheel_range = wheel.max - wheel.min; + wheel.value += diff * wheel_range / 4096; + if wheel.value < wheel.min { + wheel.value = wheel.min; + } else if wheel.value > wheel.max { + wheel.value = wheel.max; + } + } + drop(wheel); + } +} + +pub struct InputConfig { + pub i2c0: Peri<'static, I2C0>, + pub scl: Peri<'static, PIN_5>, + pub sda: Peri<'static, PIN_4>, + + pub button_pins: [(Peri<'static, AnyPin>, u8); 4], +} + +pub fn setup(spawner: Spawner, config: InputConfig) { + spawner.spawn(unwrap!(rotation_read_task( + config.i2c0, + config.scl, + config.sda, + ))); + + for (pin, id) in config.button_pins { + spawner.spawn(unwrap!(button_poll_task( + Input::new(pin, embassy_rp::gpio::Pull::Up), + id, + ))); + } +} diff --git a/esp32/src/main.rs b/esp32/src/main.rs new file mode 100644 index 0000000..b856ebb --- /dev/null +++ b/esp32/src/main.rs @@ -0,0 +1,312 @@ +#![no_std] +#![no_main] + +use core::str::FromStr; + +use embassy_net::tcp::{TcpReader, TcpWriter}; +use embassy_rp::multicore::{Stack, spawn_core1}; +use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; +use embassy_sync::mutex::Mutex; +use embassy_sync::signal::Signal; +use embedded_io::Write; +use log::info; +use owned_str::OwnedStr; +use ufmt::uwrite; + +use crate::buffer::WriteBuffer; +use crate::input::{ANGLE, INPUT, InputConfig}; +use crate::net::network_setup_task; +use crate::owned_str_writer::{OwnedStrWriter, center_str}; +use crate::screen::{lcd_display_task, overwrite_lcd}; +use ag_lcd::{Blink, Cursor, Display, LcdDisplay}; +use defmt::*; +use embassy_executor::{Executor, Spawner}; +use embassy_rp::gpio::{Level, Output}; +use embassy_rp::i2c::{self}; +use embassy_rp::peripherals::{DMA_CH0, I2C0, PIO0}; +use embassy_rp::pio::InterruptHandler; +use embassy_rp::{bind_interrupts, dma}; +use embassy_rp::{peripherals::USB, usb}; +use embassy_time::{Delay, Timer}; +use static_cell::StaticCell; + +use {defmt_rtt as _, panic_probe as _}; + +mod buffer; +mod input; +mod net; +mod owned_str_writer; +mod screen; + +const WIFI_NETWORK: &str = "flamme"; +const WIFI_PASSWORD: &str = "12345678"; +const TARGET_IP: &str = "84.238.32.253"; +const TARGET_PORT: u16 = 7070; + +bind_interrupts!(struct Irqs { + PIO0_IRQ_0 => InterruptHandler; + DMA_IRQ_0 => dma::InterruptHandler; + USBCTRL_IRQ => usb::InterruptHandler; + I2C0_IRQ => i2c::InterruptHandler; +}); + +#[embassy_executor::task] +async fn logger_task(usb: embassy_rp::Peri<'static, embassy_rp::peripherals::USB>) { + let driver = embassy_rp::usb::Driver::new(usb, Irqs); + + embassy_usb_logger::run!(1024, log::LevelFilter::Info, driver); +} + +enum QuestionType { + Choice, + Numeric { min: i32, max: i32 }, +} + +struct QuestionData { + text: OwnedStr<256>, + q_type: QuestionType, + points: i32, + generation: usize, +} + +#[derive(Clone, Copy)] +struct WheelData { + value: i32, + min: i32, + max: i32, +} + +static QUESTION: Mutex> = Mutex::new(None); +static QUESTION_UPDATE: Signal = Signal::new(); +static WHEEL_VALUE: Mutex = Mutex::new(WheelData { + value: 0, + min: 0, + max: 0, +}); + +pub async fn tcp_read_loop(mut read: TcpReader<'_>) { + let mut buf = [0u8; 1024]; + let mut generation = 1; + + while let Ok(len) = read.read(&mut buf).await { + if len == 0 { + break; + } + let Ok(str) = str::from_utf8(&buf[..len]) else { + continue; + }; + let mut counter = 0; + let mut question_data = None; + let mut future_wheel = WheelData { + value: 0, + min: 0, + max: 0, + }; + for line in str.lines() { + if line == "$$" { + counter = 1; + continue; + } + if counter == 1 { + let mut q_type = QuestionType::Choice; + let mut points = -1; + + for pairs in line.split(" ") { + let (key, value) = pairs.split_once("=").unwrap(); + if key == "type" { + q_type = if value == "choice" { + QuestionType::Choice + } else { + QuestionType::Numeric { min: -1, max: -1 } + }; + } + if key == "points" { + points = value.parse().unwrap(); + } + if key == "rangeMin" || key == "rangeMax" { + match q_type { + QuestionType::Choice => {} + QuestionType::Numeric { + ref mut min, + ref mut max, + } => { + if key == "rangeMin" { + *min = value.parse().unwrap(); + future_wheel.min = *min; + } else { + *max = value.parse().unwrap(); + future_wheel.max = *max; + } + } + } + } + } + + match q_type { + QuestionType::Numeric { min, max } => { + let diff = max - min; + future_wheel.value = min + diff / 2; + } + _ => {} + } + + question_data = Some(QuestionData { + text: OwnedStr::new(), + q_type, + points, + generation, + }); + counter = 2; + continue; + } + if counter == 2 { + question_data.as_mut().unwrap().text = OwnedStr::from_str(line).unwrap(); + generation += 1; + counter = 0; + } + } + + if let Some(question_data) = question_data { + *QUESTION.lock().await = Some(question_data); + *WHEEL_VALUE.lock().await = future_wheel; + QUESTION_UPDATE.signal(()); + } + } +} + +pub async fn tcp_write_loop(mut write: TcpWriter<'_>) { + let mut buffer = WriteBuffer::<256>::new(); + loop { + let data = INPUT.receive().await; + info!("button={}", data); + let angle = *ANGLE.lock().await; + core::writeln!(buffer, "button={} angle={}", data, angle).ok(); + info!("write: {}", &buffer); + write.write(&buffer).await.ok(); + buffer.clear(); + } +} + +const ARROW_RIGHT: char = char::from_u32(0b0111_1110).unwrap(); +const ARROW_LEFT: char = char::from_u32(0b0111_1111).unwrap(); +const DOT: char = char::from_u32(0b1010_0101).unwrap(); + +#[embassy_executor::task] +pub async fn main_loop() { + let mut last_gen = 0; + let mut title_offset = 0; + info!("Main loop started"); + loop { + Timer::after_millis(50).await; + let wheel = *WHEEL_VALUE.lock().await; + let question = QUESTION.lock().await; + let Some(question) = question.as_ref() else { + continue; + }; + title_offset += 1; + if question.generation != last_gen { + last_gen = question.generation; + title_offset = 0; + } + let title_line = if question.text.len() > 16 { + title_offset %= question.text.len() - 16; + &question.text[title_offset..title_offset + 16] + } else { + &question.text + }; + let number_str: OwnedStr<16> = match question.q_type { + QuestionType::Choice => { + let mut writer = OwnedStrWriter::new(); + writer.push(DOT).unwrap(); + writer.push(' ').unwrap(); + uwrite!(writer, "{}", question.points).unwrap(); + writer.into() + } + QuestionType::Numeric { min, max } => { + let mut writer = OwnedStrWriter::new(); + if wheel.value > min { + writer.push(ARROW_LEFT).unwrap(); + writer.push(' ').unwrap(); + } + uwrite!(writer, "{}", wheel.value).unwrap(); + if wheel.value < max { + writer.push(ARROW_RIGHT).unwrap(); + writer.push(' ').unwrap(); + } + + writer.into() + } + }; + let second_line = center_str::<16>(&number_str, 16).unwrap(); + info!("lcd: {} {}", title_line, second_line); + overwrite_lcd(title_line, &second_line).await; + } +} + +static mut CORE1_STACK: Stack<4096> = Stack::new(); +// static EXECUTOR0: StaticCell = StaticCell::new(); +static EXECUTOR1: StaticCell = StaticCell::new(); + +// #[cortex_m_rt::entry] + +#[embassy_executor::main] +async fn main(spawner: Spawner) -> () { + let p = embassy_rp::init(Default::default()); + + let lcd: LcdDisplay<_, _> = LcdDisplay::new( + Output::new(p.PIN_10, Level::Low), + Output::new(p.PIN_11, Level::Low), + Delay, + ) + .with_half_bus( + Output::new(p.PIN_12, Level::Low), + Output::new(p.PIN_13, Level::Low), + Output::new(p.PIN_14, Level::Low), + Output::new(p.PIN_15, Level::Low), + ) + .with_autoscroll(ag_lcd::AutoScroll::Off) + .with_display(Display::On) + .with_blink(Blink::On) + .with_cursor(Cursor::On) + .with_lines(ag_lcd::Lines::TwoLines); + + spawn_core1( + p.CORE1, + unsafe { &mut *core::ptr::addr_of_mut!(CORE1_STACK) }, + move || { + let executor1 = EXECUTOR1.init(Executor::new()); + executor1.run(|spawner| { + let mut lcd = lcd.build(); + lcd.set_blink(Blink::Off); + lcd.set_cursor(Cursor::Off); + spawner.spawn(unwrap!(lcd_display_task(lcd))); + }); + }, + ); + + // let executor0 = EXECUTOR0.init(Executor::new()); + // executor0.run(|spawner| { + spawner.spawn(unwrap!(logger_task(p.USB))); + spawner.spawn(unwrap!(network_setup_task( + p.PIN_23, p.PIN_25, p.PIO0, p.PIN_24, p.PIN_29, p.DMA_CH0, spawner + ))); + // let mut lcd = lcd.build(); + // lcd.set_blink(Blink::Off); + // lcd.set_cursor(Cursor::Off); + // spawner.spawn(unwrap!(lcd_display_task(lcd))); + crate::input::setup( + spawner, + InputConfig { + i2c0: p.I2C0, + scl: p.PIN_5, + sda: p.PIN_4, + button_pins: [ + (p.PIN_18.into(), 1), + (p.PIN_19.into(), 2), + (p.PIN_20.into(), 3), + (p.PIN_21.into(), 4), + ], + }, + ); + // }); +} diff --git a/esp32/src/net.rs b/esp32/src/net.rs new file mode 100644 index 0000000..d7dd4f9 --- /dev/null +++ b/esp32/src/net.rs @@ -0,0 +1,183 @@ +use core::net::SocketAddrV4; +use core::str::FromStr; +use embassy_futures::join::join; +use embassy_net::tcp::TcpSocket; + +use crate::buffer::wait_for_config; +use crate::screen::SCREEN_BUFFER; +use crate::{ + Irqs, TARGET_IP, TARGET_PORT, WIFI_NETWORK, WIFI_PASSWORD, main_loop, tcp_read_loop, + tcp_write_loop, +}; +use cyw43::{JoinOptions, ScanOptions, aligned_bytes}; +use cyw43_pio::{DEFAULT_CLOCK_DIVIDER, PioSpi}; +use defmt::*; +use embassy_executor::Spawner; +use embassy_net::StackResources; +use embassy_rp::clocks::RoscRng; +use embassy_rp::gpio::{Level, Output}; +use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_24, PIN_25, PIN_29, PIO0}; +use embassy_rp::pio::Pio; +use embassy_rp::{Peri, dma}; +use embassy_time::{Duration, Timer}; +use static_cell::StaticCell; +use ufmt::uwrite; + +#[embassy_executor::task] +async fn cyw43_task( + runner: cyw43::Runner<'static, cyw43::SpiBus, PioSpi<'static, PIO0, 0>>>, +) -> ! { + runner.run().await +} + +#[embassy_executor::task] +async fn net_task(mut runner: embassy_net::Runner<'static, cyw43::NetDriver<'static>>) -> ! { + runner.run().await +} + +#[embassy_executor::task] +pub async fn network_setup_task( + pin23: Peri<'static, PIN_23>, + pin25: Peri<'static, PIN_25>, + pio: Peri<'static, PIO0>, + pin24: Peri<'static, PIN_24>, + pin29: Peri<'static, PIN_29>, + dma: Peri<'static, DMA_CH0>, + spawner: Spawner, +) { + let fw = aligned_bytes!("../firmware/43439A0.bin"); + let clm = aligned_bytes!("../firmware/43439A0_clm.bin"); + let nvram = aligned_bytes!("../firmware/nvram_rp2040.bin"); + let mut rng = RoscRng; + + // To make flashing faster for development, you may want to flash the firmwares independently + // at hardcoded addresses, instead of baking them into the program with `include_bytes!`: + // probe-rs download ../../cyw43-firmware/43439A0.bin --binary-format bin --chip RP2040 --base-address 0x10100000 + // probe-rs download ../../cyw43-firmware/43439A0_clm.bin --binary-format bin --chip RP2040 --base-address 0x10140000 + //let fw = unsafe { core::slice::from_raw_parts(0x10100000 as *const u8, 230321) }; + //let clm = unsafe { core::slice::from_raw_parts(0x10140000 as *const u8, 4752) }; + + let pwr = Output::new(pin23, Level::Low); + let cs = Output::new(pin25, Level::High); + let mut pio = Pio::new(pio, Irqs); + let spi = PioSpi::new( + &mut pio.common, + pio.sm0, + DEFAULT_CLOCK_DIVIDER, + pio.irq0, + cs, + pin24, + pin29, + dma::Channel::new(dma, Irqs), + ); + + static STATE: StaticCell = StaticCell::new(); + let state = STATE.init(cyw43::State::new()); + let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw, nvram).await; + spawner.spawn(unwrap!(cyw43_task(runner))); + + control.init(clm).await; + control + .set_power_management(cyw43::PowerManagementMode::Performance) + .await; + + static RESOURCES: StaticCell> = StaticCell::new(); + let (stack, runner) = embassy_net::new( + net_device, + embassy_net::Config::dhcpv4(Default::default()), + RESOURCES.init(StackResources::new()), + rng.next_u64(), + ); + spawner.spawn(unwrap!(net_task(runner))); + Timer::after_millis(1000).await; + uwrite!(SCREEN_BUFFER.lock().await.line1(), "con - scan"); + + info!("scan started"); + + let mut opts = ScanOptions::default(); + opts.scan_type = cyw43::ScanType::Active; + let mut scanner = control.scan(opts).await; + + while let Some(bss) = scanner.next().await { + let mut buf = SCREEN_BUFFER.lock().await; + if let Ok(ssid_str) = str::from_utf8(&bss.ssid) { + info!("scanned {} == {:x}", ssid_str, bss.bssid); + uwrite!(buf.line1(), "{}", ssid_str); + // uwrite!(buf.line2(), "{:x}", bss.bssid); + } else { + info!("scanned {:x}", bss.bssid); + uwrite!(buf.line1(), "not-utf8"); + // uwrite!(buf.line2(), "{:x}", bss.bssid); + } + drop(buf); + Timer::after_millis(500).await; + } + + info!("scan completed"); + + uwrite!(SCREEN_BUFFER.lock().await.line1(), "scan end."); + Timer::after_millis(500).await; + drop(scanner); + + while let Err(err) = control + .join(WIFI_NETWORK, JoinOptions::new(WIFI_PASSWORD.as_bytes())) + .await + { + let mut buf = SCREEN_BUFFER.lock().await; + buf.clear(); + match err { + cyw43::JoinError::AuthenticationFailure => { + uwrite!(buf.line1(), "join failure"); + uwrite!(buf.line2(), "bad password"); + info!("authentication failure"); + } + cyw43::JoinError::JoinFailure(e) => { + uwrite!(buf.line1(), "join failure"); + uwrite!(buf.line2(), "code {}", e); + info!("join failure: {}", e); + } + cyw43::JoinError::NetworkNotFound => { + uwrite!(buf.line1(), "join failure"); + uwrite!(buf.line2(), "wifi not found"); + info!("network not found"); + } + }; + Timer::after_millis(200).await; + } + + let mut buf = SCREEN_BUFFER.lock().await; + buf.clear(); + uwrite!(buf.line1(), "link."); + drop(buf); + + stack.wait_link_up().await; + + uwrite!(SCREEN_BUFFER.lock().await.line1(), "dhcp."); + + stack.wait_config_up().await; + let cfg = wait_for_config(stack).await; + let local_addr = cfg.address.address(); + info!("IP address: {:?}", local_addr); + + let host_addr = embassy_net::Ipv4Address::from_str(TARGET_IP).unwrap(); + let mut rx_buffer = [0; 4096]; + let mut tx_buffer = [0; 4096]; + let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); + socket.set_timeout(Some(Duration::from_secs(10))); + socket.set_keep_alive(Some(Duration::from_secs(1))); + if let Err(e) = socket + .connect(SocketAddrV4::new(host_addr, TARGET_PORT)) + .await + { + uwrite!(SCREEN_BUFFER.lock().await.line1(), "tcperr"); + error!("tcp connect error: {}", e); + } else { + uwrite!(SCREEN_BUFFER.lock().await.line1(), "tcpok"); + } + + let (read, write) = socket.split(); + + spawner.spawn(unwrap!(main_loop())); + + join(tcp_read_loop(read), tcp_write_loop(write)).await; +} diff --git a/esp32/src/owned_str_writer.rs b/esp32/src/owned_str_writer.rs new file mode 100644 index 0000000..c740050 --- /dev/null +++ b/esp32/src/owned_str_writer.rs @@ -0,0 +1,50 @@ +use owned_str::{Error, OwnedStr}; +use ufmt::uWrite; + +pub struct OwnedStrWriter(OwnedStr); + +impl OwnedStrWriter { + pub fn new() -> Self { + Self(OwnedStr::new()) + } + + pub fn push(&mut self, c: char) -> Result<(), Error> { + self.0.try_push(c).map(|_| ()) + } +} + +impl From> for OwnedStrWriter { + fn from(owned_str: OwnedStr) -> Self { + Self(owned_str) + } +} + +impl From> for OwnedStr { + fn from(writer: OwnedStrWriter) -> Self { + writer.0 + } +} + +impl uWrite for OwnedStrWriter { + type Error = owned_str::Error; + fn write_str(&mut self, s: &str) -> Result<(), Self::Error> { + self.0.try_push_str(s).map(|_| ()) + } + fn write_char(&mut self, c: char) -> Result<(), Self::Error> { + self.0.try_push(c).map(|_| ()) + } +} + +pub fn center_str( + str: &str, + width: usize, +) -> Result, owned_str::Error> { + let mut res = OwnedStr::new(); + let len = str.len(); + let padding = (width.saturating_sub(len) + 1) / 2; + for _ in 0..padding { + res.try_push(' ')?; + } + res.try_push_str(str)?; + Ok(res) +} diff --git a/esp32/src/screen.rs b/esp32/src/screen.rs new file mode 100644 index 0000000..6be00ba --- /dev/null +++ b/esp32/src/screen.rs @@ -0,0 +1,103 @@ +use core::convert::Infallible; + +use ag_lcd::LcdDisplay; +use embassy_rp::gpio::Output; +use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, mutex::Mutex, signal::Signal}; +use embassy_time::{Delay, Timer}; +use ufmt::uWrite; + +pub struct ScreenBuffer { + line1: [u8; 16], + line2: [u8; 16], + line1_ptr: u8, + line2_ptr: u8, +} + +impl ScreenBuffer { + pub fn clear(&mut self) { + self.line1.fill(0); + self.line2.fill(0); + self.line1_ptr = 0; + self.line2_ptr = 0; + } + + pub fn line1(&mut self) -> ScreenBufferWriter<'_> { + ScreenBufferWriter { buf: self, line: 0 } + } + + pub fn line2(&mut self) -> ScreenBufferWriter<'_> { + ScreenBufferWriter { buf: self, line: 1 } + } +} + +pub struct ScreenBufferWriter<'a> { + buf: &'a mut ScreenBuffer, + line: u8, +} + +impl<'a> uWrite for ScreenBufferWriter<'a> { + type Error = Infallible; + + fn write_char(&mut self, c: char) -> Result<(), Self::Error> { + if self.line == 0 { + let ptr = self.buf.line1_ptr as usize; + self.buf.line1[ptr] = c as u8; + self.buf.line1_ptr = (self.buf.line1_ptr + 1) % 16; + } else { + let ptr = self.buf.line2_ptr as usize; + self.buf.line2[ptr] = c as u8; + self.buf.line2_ptr = (self.buf.line2_ptr + 1) % 16; + } + Ok(()) + } + + fn write_str(&mut self, s: &str) -> Result<(), Self::Error> { + for c in s.chars() { + self.write_char(c)?; + } + Ok(()) + } +} + +impl Drop for ScreenBufferWriter<'_> { + fn drop(&mut self) { + LCD_UPDATE.signal(()); + } +} + +pub static SCREEN_BUFFER: Mutex = Mutex::new(ScreenBuffer { + line1: [0; 16], + line1_ptr: 0, + line2: [0; 16], + line2_ptr: 0, +}); + +static LCD_UPDATE: Signal = Signal::new(); + +#[embassy_executor::task] +pub async fn lcd_display_task(mut lcd: LcdDisplay, Delay>) { + loop { + LCD_UPDATE.wait().await; + let buffer = SCREEN_BUFFER.lock().await; + lcd.clear(); + for byte in &buffer.line1 { + lcd.write(*byte); + } + lcd.set_position(0, 1); + for byte in &buffer.line2 { + lcd.write(*byte); + } + Timer::after_millis(20).await; + } +} + +pub async fn overwrite_lcd(line1: &str, line2: &str) { + let mut buffer = SCREEN_BUFFER.lock().await; + buffer.line1_ptr = 0; + buffer.line2_ptr = 0; + buffer.line1.fill(0); + buffer.line2.fill(0); + buffer.line1[..line1.len()].copy_from_slice(line1.as_bytes()); + buffer.line2[..line2.len()].copy_from_slice(line2.as_bytes()); + LCD_UPDATE.signal(()); +} diff --git a/pico/.cargo/config.toml b/pico/.cargo/config.toml index 9740544..90a37aa 100644 --- a/pico/.cargo/config.toml +++ b/pico/.cargo/config.toml @@ -2,11 +2,8 @@ # runner = "probe-rs run --chip RP2040" runner = "sudo picotool load -u -v -x -t elf" -[target.xtensa-esp32-none-elf] -runner = "espflash flash --monitor" - [build] -target = "xtensa-esp32-none-elf" +target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0 [env] DEFMT_LOG = "debug" diff --git a/pico/flake.nix b/pico/flake.nix index ba232f7..ab261ea 100644 --- a/pico/flake.nix +++ b/pico/flake.nix @@ -2,7 +2,6 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs"; rust-overlay.url = "github:oxalica/rust-overlay"; - esp-rs.url = "github:leighleighleigh/esp-rs-nix"; }; outputs = @@ -10,7 +9,6 @@ self, rust-overlay, nixpkgs, - esp-rs, }: let overlays = [ (import rust-overlay) ]; @@ -23,14 +21,11 @@ packages.x86_64-linux.elf2uf2-rs = pkgs.callPackage ./elf2uf2.nix { }; devShell.x86_64-linux = pkgs.mkShell { buildInputs = with pkgs; [ - espflash - esptool (pkgs.rust-bin.selectLatestNightlyWith ( toolchain: toolchain.default.override { targets = [ "thumbv6m-none-eabi" - "xtensa-esp32-none-eabi" ]; extensions = [ "rust-src" ]; }