A step sequencer for Adafruit's RP2040-based macropad

some baseline stuff, much work ahead

+2612
+9
.cargo/config.toml
··· 1 + [target.'cfg(all(target_arch = "arm", target_os = "none"))'] 2 + # runner = "probe-rs run --chip RP2040" # for jtag 3 + runner = "elf2uf2-rs --deploy --serial --verbose" # for elf2uf2 4 + 5 + [build] 6 + target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ 7 + 8 + [env] 9 + DEFMT_LOG = "debug"
+1
.gitignore
··· 1 + /target
+4
.vscode/.gitignore
··· 1 + *.cortex-debug.*.json 2 + launch.json 3 + tasks.json 4 + *.cfg
+11
.vscode/extensions.json
··· 1 + { 2 + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. 3 + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp 4 + // List of extensions which should be recommended for users of this workspace. 5 + "recommendations": [ 6 + "rust-lang.rust-analyzer", 7 + "tamasfe.even-better-toml", 8 + ], 9 + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. 10 + "unwantedRecommendations": [] 11 + }
+18
.vscode/settings.json
··· 1 + { 2 + "editor.formatOnSave": true, 3 + "[toml]": { 4 + "editor.formatOnSave": false 5 + }, 6 + "[markdown]": { 7 + "editor.formatOnSave": false 8 + }, 9 + "rust-analyzer.check.allTargets": false, 10 + "rust-analyzer.check.noDefaultFeatures": true, 11 + "rust-analyzer.cargo.noDefaultFeatures": true, 12 + "rust-analyzer.showUnlinkedFileNotification": false, 13 + // uncomment the target of your chip. 14 + "rust-analyzer.cargo.target": "thumbv6m-none-eabi", 15 + //"rust-analyzer.cargo.target": "thumbv7m-none-eabi", 16 + //"rust-analyzer.cargo.target": "thumbv7em-none-eabi", 17 + //"rust-analyzer.cargo.target": "thumbv8m.main-none-eabihf", 18 + }
+1840
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "ahash" 7 + version = "0.8.12" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 10 + dependencies = [ 11 + "cfg-if", 12 + "once_cell", 13 + "version_check", 14 + "zerocopy", 15 + ] 16 + 17 + [[package]] 18 + name = "aho-corasick" 19 + version = "1.1.4" 20 + source = "registry+https://github.com/rust-lang/crates.io-index" 21 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 22 + dependencies = [ 23 + "memchr", 24 + ] 25 + 26 + [[package]] 27 + name = "arrayvec" 28 + version = "0.7.6" 29 + source = "registry+https://github.com/rust-lang/crates.io-index" 30 + checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 31 + 32 + [[package]] 33 + name = "ascii-canvas" 34 + version = "4.0.0" 35 + source = "registry+https://github.com/rust-lang/crates.io-index" 36 + checksum = "ef1e3e699d84ab1b0911a1010c5c106aa34ae89aeac103be5ce0c3859db1e891" 37 + dependencies = [ 38 + "term", 39 + ] 40 + 41 + [[package]] 42 + name = "autocfg" 43 + version = "1.5.0" 44 + source = "registry+https://github.com/rust-lang/crates.io-index" 45 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 46 + 47 + [[package]] 48 + name = "az" 49 + version = "1.2.1" 50 + source = "registry+https://github.com/rust-lang/crates.io-index" 51 + checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" 52 + 53 + [[package]] 54 + name = "bare-metal" 55 + version = "0.2.5" 56 + source = "registry+https://github.com/rust-lang/crates.io-index" 57 + checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" 58 + dependencies = [ 59 + "rustc_version", 60 + ] 61 + 62 + [[package]] 63 + name = "bit-set" 64 + version = "0.8.0" 65 + source = "registry+https://github.com/rust-lang/crates.io-index" 66 + checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 67 + dependencies = [ 68 + "bit-vec", 69 + ] 70 + 71 + [[package]] 72 + name = "bit-vec" 73 + version = "0.8.0" 74 + source = "registry+https://github.com/rust-lang/crates.io-index" 75 + checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 76 + 77 + [[package]] 78 + name = "bitfield" 79 + version = "0.13.2" 80 + source = "registry+https://github.com/rust-lang/crates.io-index" 81 + checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" 82 + 83 + [[package]] 84 + name = "bitfield" 85 + version = "0.14.0" 86 + source = "registry+https://github.com/rust-lang/crates.io-index" 87 + checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" 88 + 89 + [[package]] 90 + name = "bitflags" 91 + version = "1.3.2" 92 + source = "registry+https://github.com/rust-lang/crates.io-index" 93 + checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 94 + 95 + [[package]] 96 + name = "bitflags" 97 + version = "2.10.0" 98 + source = "registry+https://github.com/rust-lang/crates.io-index" 99 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 100 + 101 + [[package]] 102 + name = "block-buffer" 103 + version = "0.10.4" 104 + source = "registry+https://github.com/rust-lang/crates.io-index" 105 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 106 + dependencies = [ 107 + "generic-array", 108 + ] 109 + 110 + [[package]] 111 + name = "bytemuck" 112 + version = "1.24.0" 113 + source = "registry+https://github.com/rust-lang/crates.io-index" 114 + checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" 115 + 116 + [[package]] 117 + name = "byteorder" 118 + version = "1.5.0" 119 + source = "registry+https://github.com/rust-lang/crates.io-index" 120 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 121 + 122 + [[package]] 123 + name = "cfg-if" 124 + version = "1.0.4" 125 + source = "registry+https://github.com/rust-lang/crates.io-index" 126 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 127 + 128 + [[package]] 129 + name = "codespan-reporting" 130 + version = "0.11.1" 131 + source = "registry+https://github.com/rust-lang/crates.io-index" 132 + checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 133 + dependencies = [ 134 + "termcolor", 135 + "unicode-width", 136 + ] 137 + 138 + [[package]] 139 + name = "cortex-m" 140 + version = "0.7.7" 141 + source = "registry+https://github.com/rust-lang/crates.io-index" 142 + checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" 143 + dependencies = [ 144 + "bare-metal", 145 + "bitfield 0.13.2", 146 + "embedded-hal 0.2.7", 147 + "volatile-register", 148 + ] 149 + 150 + [[package]] 151 + name = "cortex-m-rt" 152 + version = "0.7.5" 153 + source = "registry+https://github.com/rust-lang/crates.io-index" 154 + checksum = "801d4dec46b34c299ccf6b036717ae0fce602faa4f4fe816d9013b9a7c9f5ba6" 155 + dependencies = [ 156 + "cortex-m-rt-macros", 157 + ] 158 + 159 + [[package]] 160 + name = "cortex-m-rt-macros" 161 + version = "0.7.5" 162 + source = "registry+https://github.com/rust-lang/crates.io-index" 163 + checksum = "e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472" 164 + dependencies = [ 165 + "proc-macro2", 166 + "quote", 167 + "syn 2.0.112", 168 + ] 169 + 170 + [[package]] 171 + name = "cpufeatures" 172 + version = "0.2.17" 173 + source = "registry+https://github.com/rust-lang/crates.io-index" 174 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 175 + dependencies = [ 176 + "libc", 177 + ] 178 + 179 + [[package]] 180 + name = "crc-any" 181 + version = "2.5.0" 182 + source = "registry+https://github.com/rust-lang/crates.io-index" 183 + checksum = "a62ec9ff5f7965e4d7280bd5482acd20aadb50d632cf6c1d74493856b011fa73" 184 + dependencies = [ 185 + "debug-helper", 186 + ] 187 + 188 + [[package]] 189 + name = "critical-section" 190 + version = "1.2.0" 191 + source = "registry+https://github.com/rust-lang/crates.io-index" 192 + checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" 193 + 194 + [[package]] 195 + name = "crunchy" 196 + version = "0.2.4" 197 + source = "registry+https://github.com/rust-lang/crates.io-index" 198 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 199 + 200 + [[package]] 201 + name = "crypto-common" 202 + version = "0.1.7" 203 + source = "registry+https://github.com/rust-lang/crates.io-index" 204 + checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" 205 + dependencies = [ 206 + "generic-array", 207 + "typenum", 208 + ] 209 + 210 + [[package]] 211 + name = "darling" 212 + version = "0.20.11" 213 + source = "registry+https://github.com/rust-lang/crates.io-index" 214 + checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 215 + dependencies = [ 216 + "darling_core", 217 + "darling_macro", 218 + ] 219 + 220 + [[package]] 221 + name = "darling_core" 222 + version = "0.20.11" 223 + source = "registry+https://github.com/rust-lang/crates.io-index" 224 + checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 225 + dependencies = [ 226 + "fnv", 227 + "ident_case", 228 + "proc-macro2", 229 + "quote", 230 + "strsim", 231 + "syn 2.0.112", 232 + ] 233 + 234 + [[package]] 235 + name = "darling_macro" 236 + version = "0.20.11" 237 + source = "registry+https://github.com/rust-lang/crates.io-index" 238 + checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 239 + dependencies = [ 240 + "darling_core", 241 + "quote", 242 + "syn 2.0.112", 243 + ] 244 + 245 + [[package]] 246 + name = "debug-helper" 247 + version = "0.3.13" 248 + source = "registry+https://github.com/rust-lang/crates.io-index" 249 + checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" 250 + 251 + [[package]] 252 + name = "defmt" 253 + version = "0.3.100" 254 + source = "registry+https://github.com/rust-lang/crates.io-index" 255 + checksum = "f0963443817029b2024136fc4dd07a5107eb8f977eaf18fcd1fdeb11306b64ad" 256 + dependencies = [ 257 + "defmt 1.0.1", 258 + ] 259 + 260 + [[package]] 261 + name = "defmt" 262 + version = "1.0.1" 263 + source = "registry+https://github.com/rust-lang/crates.io-index" 264 + checksum = "548d977b6da32fa1d1fda2876453da1e7df63ad0304c8b3dae4dbe7b96f39b78" 265 + dependencies = [ 266 + "bitflags 1.3.2", 267 + "defmt-macros", 268 + ] 269 + 270 + [[package]] 271 + name = "defmt-macros" 272 + version = "1.0.1" 273 + source = "registry+https://github.com/rust-lang/crates.io-index" 274 + checksum = "3d4fc12a85bcf441cfe44344c4b72d58493178ce635338a3f3b78943aceb258e" 275 + dependencies = [ 276 + "defmt-parser", 277 + "proc-macro-error2", 278 + "proc-macro2", 279 + "quote", 280 + "syn 2.0.112", 281 + ] 282 + 283 + [[package]] 284 + name = "defmt-parser" 285 + version = "1.0.0" 286 + source = "registry+https://github.com/rust-lang/crates.io-index" 287 + checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" 288 + dependencies = [ 289 + "thiserror", 290 + ] 291 + 292 + [[package]] 293 + name = "defmt-rtt" 294 + version = "1.1.0" 295 + source = "registry+https://github.com/rust-lang/crates.io-index" 296 + checksum = "93d5a25c99d89c40f5676bec8cefe0614f17f0f40e916f98e345dae941807f9e" 297 + dependencies = [ 298 + "critical-section", 299 + "defmt 1.0.1", 300 + ] 301 + 302 + [[package]] 303 + name = "digest" 304 + version = "0.10.7" 305 + source = "registry+https://github.com/rust-lang/crates.io-index" 306 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 307 + dependencies = [ 308 + "block-buffer", 309 + "crypto-common", 310 + ] 311 + 312 + [[package]] 313 + name = "document-features" 314 + version = "0.2.12" 315 + source = "registry+https://github.com/rust-lang/crates.io-index" 316 + checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" 317 + dependencies = [ 318 + "litrs", 319 + ] 320 + 321 + [[package]] 322 + name = "either" 323 + version = "1.15.0" 324 + source = "registry+https://github.com/rust-lang/crates.io-index" 325 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 326 + 327 + [[package]] 328 + name = "embassy-embedded-hal" 329 + version = "0.5.0" 330 + source = "registry+https://github.com/rust-lang/crates.io-index" 331 + checksum = "554e3e840696f54b4c9afcf28a0f24da431c927f4151040020416e7393d6d0d8" 332 + dependencies = [ 333 + "defmt 1.0.1", 334 + "embassy-futures", 335 + "embassy-hal-internal", 336 + "embassy-sync", 337 + "embedded-hal 0.2.7", 338 + "embedded-hal 1.0.0", 339 + "embedded-hal-async", 340 + "embedded-storage", 341 + "embedded-storage-async", 342 + "nb 1.1.0", 343 + ] 344 + 345 + [[package]] 346 + name = "embassy-executor" 347 + version = "0.9.1" 348 + source = "registry+https://github.com/rust-lang/crates.io-index" 349 + checksum = "06070468370195e0e86f241c8e5004356d696590a678d47d6676795b2e439c6b" 350 + dependencies = [ 351 + "cortex-m", 352 + "critical-section", 353 + "defmt 1.0.1", 354 + "document-features", 355 + "embassy-executor-macros", 356 + "embassy-executor-timer-queue", 357 + ] 358 + 359 + [[package]] 360 + name = "embassy-executor-macros" 361 + version = "0.7.0" 362 + source = "registry+https://github.com/rust-lang/crates.io-index" 363 + checksum = "dfdddc3a04226828316bf31393b6903ee162238576b1584ee2669af215d55472" 364 + dependencies = [ 365 + "darling", 366 + "proc-macro2", 367 + "quote", 368 + "syn 2.0.112", 369 + ] 370 + 371 + [[package]] 372 + name = "embassy-executor-timer-queue" 373 + version = "0.1.0" 374 + source = "registry+https://github.com/rust-lang/crates.io-index" 375 + checksum = "2fc328bf943af66b80b98755db9106bf7e7471b0cf47dc8559cd9a6be504cc9c" 376 + 377 + [[package]] 378 + name = "embassy-futures" 379 + version = "0.1.2" 380 + source = "registry+https://github.com/rust-lang/crates.io-index" 381 + checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01" 382 + 383 + [[package]] 384 + name = "embassy-hal-internal" 385 + version = "0.3.0" 386 + source = "registry+https://github.com/rust-lang/crates.io-index" 387 + checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" 388 + dependencies = [ 389 + "cortex-m", 390 + "critical-section", 391 + "defmt 1.0.1", 392 + "num-traits", 393 + ] 394 + 395 + [[package]] 396 + name = "embassy-net-driver" 397 + version = "0.2.0" 398 + source = "registry+https://github.com/rust-lang/crates.io-index" 399 + checksum = "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d" 400 + 401 + [[package]] 402 + name = "embassy-net-driver-channel" 403 + version = "0.3.2" 404 + source = "registry+https://github.com/rust-lang/crates.io-index" 405 + checksum = "b7b2739fbcf6cd206ae08779c7d709087b16577d255f2ea4a45bc4bbbf305b3f" 406 + dependencies = [ 407 + "embassy-futures", 408 + "embassy-net-driver", 409 + "embassy-sync", 410 + ] 411 + 412 + [[package]] 413 + name = "embassy-rp" 414 + version = "0.9.0" 415 + source = "registry+https://github.com/rust-lang/crates.io-index" 416 + checksum = "af8d5ac11a8bc209d359ad98bb10a10f786471dd474790f3a4f991c77ae94f6f" 417 + dependencies = [ 418 + "cfg-if", 419 + "cortex-m", 420 + "cortex-m-rt", 421 + "critical-section", 422 + "defmt 1.0.1", 423 + "document-features", 424 + "embassy-embedded-hal", 425 + "embassy-futures", 426 + "embassy-hal-internal", 427 + "embassy-sync", 428 + "embassy-time", 429 + "embassy-time-driver", 430 + "embassy-time-queue-utils", 431 + "embassy-usb-driver", 432 + "embedded-hal 0.2.7", 433 + "embedded-hal 1.0.0", 434 + "embedded-hal-async", 435 + "embedded-hal-nb", 436 + "embedded-io 0.6.1", 437 + "embedded-io-async 0.6.1", 438 + "embedded-storage", 439 + "embedded-storage-async", 440 + "fixed", 441 + "nb 1.1.0", 442 + "pio", 443 + "rand_core 0.6.4", 444 + "rand_core 0.9.3", 445 + "rp-pac", 446 + "rp2040-boot2", 447 + "sha2-const-stable", 448 + "smart-leds", 449 + ] 450 + 451 + [[package]] 452 + name = "embassy-sync" 453 + version = "0.7.2" 454 + source = "registry+https://github.com/rust-lang/crates.io-index" 455 + checksum = "73974a3edbd0bd286759b3d483540f0ebef705919a5f56f4fc7709066f71689b" 456 + dependencies = [ 457 + "cfg-if", 458 + "critical-section", 459 + "defmt 1.0.1", 460 + "embedded-io-async 0.6.1", 461 + "futures-core", 462 + "futures-sink", 463 + "heapless 0.8.0", 464 + ] 465 + 466 + [[package]] 467 + name = "embassy-time" 468 + version = "0.5.0" 469 + source = "registry+https://github.com/rust-lang/crates.io-index" 470 + checksum = "f4fa65b9284d974dad7a23bb72835c4ec85c0b540d86af7fc4098c88cff51d65" 471 + dependencies = [ 472 + "cfg-if", 473 + "critical-section", 474 + "defmt 1.0.1", 475 + "document-features", 476 + "embassy-time-driver", 477 + "embedded-hal 0.2.7", 478 + "embedded-hal 1.0.0", 479 + "embedded-hal-async", 480 + "futures-core", 481 + ] 482 + 483 + [[package]] 484 + name = "embassy-time-driver" 485 + version = "0.2.1" 486 + source = "registry+https://github.com/rust-lang/crates.io-index" 487 + checksum = "a0a244c7dc22c8d0289379c8d8830cae06bb93d8f990194d0de5efb3b5ae7ba6" 488 + dependencies = [ 489 + "document-features", 490 + ] 491 + 492 + [[package]] 493 + name = "embassy-time-queue-utils" 494 + version = "0.3.0" 495 + source = "registry+https://github.com/rust-lang/crates.io-index" 496 + checksum = "80e2ee86063bd028a420a5fb5898c18c87a8898026da1d4c852af2c443d0a454" 497 + dependencies = [ 498 + "embassy-executor-timer-queue", 499 + "heapless 0.8.0", 500 + ] 501 + 502 + [[package]] 503 + name = "embassy-usb" 504 + version = "0.5.1" 505 + source = "registry+https://github.com/rust-lang/crates.io-index" 506 + checksum = "dc4462e48b19a4f401a11901bdd981aab80c6a826608016a0bdc73cbbab31954" 507 + dependencies = [ 508 + "defmt 1.0.1", 509 + "embassy-futures", 510 + "embassy-net-driver-channel", 511 + "embassy-sync", 512 + "embassy-usb-driver", 513 + "embedded-io-async 0.6.1", 514 + "heapless 0.8.0", 515 + "ssmarshal", 516 + "usbd-hid 0.8.2", 517 + ] 518 + 519 + [[package]] 520 + name = "embassy-usb-driver" 521 + version = "0.2.0" 522 + source = "registry+https://github.com/rust-lang/crates.io-index" 523 + checksum = "17119855ccc2d1f7470a39756b12068454ae27a3eabb037d940b5c03d9c77b7a" 524 + dependencies = [ 525 + "defmt 1.0.1", 526 + "embedded-io-async 0.6.1", 527 + ] 528 + 529 + [[package]] 530 + name = "embassy-usb-logger" 531 + version = "0.5.1" 532 + source = "registry+https://github.com/rust-lang/crates.io-index" 533 + checksum = "deed6d36715838d6adbbff13b215b03a9deeaa66a64d5fccd6353708ccfb8b8f" 534 + dependencies = [ 535 + "embassy-futures", 536 + "embassy-sync", 537 + "embassy-usb", 538 + "log", 539 + ] 540 + 541 + [[package]] 542 + name = "embedded-graphics" 543 + version = "0.8.1" 544 + source = "registry+https://github.com/rust-lang/crates.io-index" 545 + checksum = "0649998afacf6d575d126d83e68b78c0ab0e00ca2ac7e9b3db11b4cbe8274ef0" 546 + dependencies = [ 547 + "az", 548 + "byteorder", 549 + "defmt 0.3.100", 550 + "embedded-graphics-core", 551 + "float-cmp", 552 + "micromath", 553 + ] 554 + 555 + [[package]] 556 + name = "embedded-graphics-core" 557 + version = "0.4.0" 558 + source = "registry+https://github.com/rust-lang/crates.io-index" 559 + checksum = "ba9ecd261f991856250d2207f6d8376946cd9f412a2165d3b75bc87a0bc7a044" 560 + dependencies = [ 561 + "az", 562 + "byteorder", 563 + "defmt 0.3.100", 564 + ] 565 + 566 + [[package]] 567 + name = "embedded-hal" 568 + version = "0.2.7" 569 + source = "registry+https://github.com/rust-lang/crates.io-index" 570 + checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" 571 + dependencies = [ 572 + "nb 0.1.3", 573 + "void", 574 + ] 575 + 576 + [[package]] 577 + name = "embedded-hal" 578 + version = "1.0.0" 579 + source = "registry+https://github.com/rust-lang/crates.io-index" 580 + checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" 581 + 582 + [[package]] 583 + name = "embedded-hal-async" 584 + version = "1.0.0" 585 + source = "registry+https://github.com/rust-lang/crates.io-index" 586 + checksum = "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884" 587 + dependencies = [ 588 + "embedded-hal 1.0.0", 589 + ] 590 + 591 + [[package]] 592 + name = "embedded-hal-bus" 593 + version = "0.3.0" 594 + source = "registry+https://github.com/rust-lang/crates.io-index" 595 + checksum = "513e0b3a8fb7d3013a8ae17a834283f170deaf7d0eeab0a7c1a36ad4dd356d22" 596 + dependencies = [ 597 + "critical-section", 598 + "embedded-hal 1.0.0", 599 + "embedded-hal-async", 600 + ] 601 + 602 + [[package]] 603 + name = "embedded-hal-nb" 604 + version = "1.0.0" 605 + source = "registry+https://github.com/rust-lang/crates.io-index" 606 + checksum = "fba4268c14288c828995299e59b12babdbe170f6c6d73731af1b4648142e8605" 607 + dependencies = [ 608 + "embedded-hal 1.0.0", 609 + "nb 1.1.0", 610 + ] 611 + 612 + [[package]] 613 + name = "embedded-io" 614 + version = "0.6.1" 615 + source = "registry+https://github.com/rust-lang/crates.io-index" 616 + checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" 617 + 618 + [[package]] 619 + name = "embedded-io" 620 + version = "0.7.1" 621 + source = "registry+https://github.com/rust-lang/crates.io-index" 622 + checksum = "9eb1aa714776b75c7e67e1da744b81a129b3ff919c8712b5e1b32252c1f07cc7" 623 + dependencies = [ 624 + "defmt 1.0.1", 625 + ] 626 + 627 + [[package]] 628 + name = "embedded-io-async" 629 + version = "0.6.1" 630 + source = "registry+https://github.com/rust-lang/crates.io-index" 631 + checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" 632 + dependencies = [ 633 + "embedded-io 0.6.1", 634 + ] 635 + 636 + [[package]] 637 + name = "embedded-io-async" 638 + version = "0.7.0" 639 + source = "registry+https://github.com/rust-lang/crates.io-index" 640 + checksum = "2564b9f813c544241430e147d8bc454815ef9ac998878d30cc3055449f7fd4c0" 641 + dependencies = [ 642 + "defmt 1.0.1", 643 + "embedded-io 0.7.1", 644 + ] 645 + 646 + [[package]] 647 + name = "embedded-storage" 648 + version = "0.3.1" 649 + source = "registry+https://github.com/rust-lang/crates.io-index" 650 + checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032" 651 + 652 + [[package]] 653 + name = "embedded-storage-async" 654 + version = "0.4.1" 655 + source = "registry+https://github.com/rust-lang/crates.io-index" 656 + checksum = "1763775e2323b7d5f0aa6090657f5e21cfa02ede71f5dc40eead06d64dcd15cc" 657 + dependencies = [ 658 + "embedded-storage", 659 + ] 660 + 661 + [[package]] 662 + name = "ena" 663 + version = "0.14.3" 664 + source = "registry+https://github.com/rust-lang/crates.io-index" 665 + checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" 666 + dependencies = [ 667 + "log", 668 + ] 669 + 670 + [[package]] 671 + name = "encode_unicode" 672 + version = "0.3.6" 673 + source = "registry+https://github.com/rust-lang/crates.io-index" 674 + checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 675 + 676 + [[package]] 677 + name = "equivalent" 678 + version = "1.0.2" 679 + source = "registry+https://github.com/rust-lang/crates.io-index" 680 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 681 + 682 + [[package]] 683 + name = "fixed" 684 + version = "1.29.0" 685 + source = "registry+https://github.com/rust-lang/crates.io-index" 686 + checksum = "707070ccf8c4173548210893a0186e29c266901b71ed20cd9e2ca0193dfe95c3" 687 + dependencies = [ 688 + "az", 689 + "bytemuck", 690 + "half", 691 + "typenum", 692 + ] 693 + 694 + [[package]] 695 + name = "fixed-macro" 696 + version = "1.2.0" 697 + source = "registry+https://github.com/rust-lang/crates.io-index" 698 + checksum = "1fd0c48af8cb14e02868f449f8a2187bd78af7a08da201fdc78d518ecb1675bc" 699 + dependencies = [ 700 + "fixed", 701 + "fixed-macro-impl", 702 + "fixed-macro-types", 703 + ] 704 + 705 + [[package]] 706 + name = "fixed-macro-impl" 707 + version = "1.2.0" 708 + source = "registry+https://github.com/rust-lang/crates.io-index" 709 + checksum = "c93086f471c0a1b9c5e300ea92f5cd990ac6d3f8edf27616ef624b8fa6402d4b" 710 + dependencies = [ 711 + "fixed", 712 + "paste", 713 + "proc-macro-error", 714 + "proc-macro2", 715 + "quote", 716 + "syn 1.0.109", 717 + ] 718 + 719 + [[package]] 720 + name = "fixed-macro-types" 721 + version = "1.2.0" 722 + source = "registry+https://github.com/rust-lang/crates.io-index" 723 + checksum = "044a61b034a2264a7f65aa0c3cd112a01b4d4ee58baace51fead3f21b993c7e4" 724 + dependencies = [ 725 + "fixed", 726 + "fixed-macro-impl", 727 + ] 728 + 729 + [[package]] 730 + name = "fixedbitset" 731 + version = "0.5.7" 732 + source = "registry+https://github.com/rust-lang/crates.io-index" 733 + checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 734 + 735 + [[package]] 736 + name = "float-cmp" 737 + version = "0.9.0" 738 + source = "registry+https://github.com/rust-lang/crates.io-index" 739 + checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" 740 + dependencies = [ 741 + "num-traits", 742 + ] 743 + 744 + [[package]] 745 + name = "fnv" 746 + version = "1.0.7" 747 + source = "registry+https://github.com/rust-lang/crates.io-index" 748 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 749 + 750 + [[package]] 751 + name = "futures" 752 + version = "0.3.31" 753 + source = "registry+https://github.com/rust-lang/crates.io-index" 754 + checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 755 + dependencies = [ 756 + "futures-channel", 757 + "futures-core", 758 + "futures-io", 759 + "futures-sink", 760 + "futures-task", 761 + "futures-util", 762 + ] 763 + 764 + [[package]] 765 + name = "futures-channel" 766 + version = "0.3.31" 767 + source = "registry+https://github.com/rust-lang/crates.io-index" 768 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 769 + dependencies = [ 770 + "futures-core", 771 + "futures-sink", 772 + ] 773 + 774 + [[package]] 775 + name = "futures-core" 776 + version = "0.3.31" 777 + source = "registry+https://github.com/rust-lang/crates.io-index" 778 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 779 + 780 + [[package]] 781 + name = "futures-io" 782 + version = "0.3.31" 783 + source = "registry+https://github.com/rust-lang/crates.io-index" 784 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 785 + 786 + [[package]] 787 + name = "futures-macro" 788 + version = "0.3.31" 789 + source = "registry+https://github.com/rust-lang/crates.io-index" 790 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 791 + dependencies = [ 792 + "proc-macro2", 793 + "quote", 794 + "syn 2.0.112", 795 + ] 796 + 797 + [[package]] 798 + name = "futures-sink" 799 + version = "0.3.31" 800 + source = "registry+https://github.com/rust-lang/crates.io-index" 801 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 802 + 803 + [[package]] 804 + name = "futures-task" 805 + version = "0.3.31" 806 + source = "registry+https://github.com/rust-lang/crates.io-index" 807 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 808 + 809 + [[package]] 810 + name = "futures-util" 811 + version = "0.3.31" 812 + source = "registry+https://github.com/rust-lang/crates.io-index" 813 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 814 + dependencies = [ 815 + "futures-core", 816 + "futures-macro", 817 + "futures-sink", 818 + "futures-task", 819 + "pin-project-lite", 820 + "pin-utils", 821 + ] 822 + 823 + [[package]] 824 + name = "generic-array" 825 + version = "0.14.7" 826 + source = "registry+https://github.com/rust-lang/crates.io-index" 827 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 828 + dependencies = [ 829 + "typenum", 830 + "version_check", 831 + ] 832 + 833 + [[package]] 834 + name = "half" 835 + version = "2.7.1" 836 + source = "registry+https://github.com/rust-lang/crates.io-index" 837 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 838 + dependencies = [ 839 + "cfg-if", 840 + "crunchy", 841 + "zerocopy", 842 + ] 843 + 844 + [[package]] 845 + name = "hash32" 846 + version = "0.3.1" 847 + source = "registry+https://github.com/rust-lang/crates.io-index" 848 + checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" 849 + dependencies = [ 850 + "byteorder", 851 + ] 852 + 853 + [[package]] 854 + name = "hashbrown" 855 + version = "0.13.2" 856 + source = "registry+https://github.com/rust-lang/crates.io-index" 857 + checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" 858 + dependencies = [ 859 + "ahash", 860 + ] 861 + 862 + [[package]] 863 + name = "hashbrown" 864 + version = "0.16.1" 865 + source = "registry+https://github.com/rust-lang/crates.io-index" 866 + checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 867 + 868 + [[package]] 869 + name = "heapless" 870 + version = "0.8.0" 871 + source = "registry+https://github.com/rust-lang/crates.io-index" 872 + checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" 873 + dependencies = [ 874 + "hash32", 875 + "stable_deref_trait", 876 + ] 877 + 878 + [[package]] 879 + name = "heapless" 880 + version = "0.9.2" 881 + source = "registry+https://github.com/rust-lang/crates.io-index" 882 + checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed" 883 + dependencies = [ 884 + "hash32", 885 + "stable_deref_trait", 886 + ] 887 + 888 + [[package]] 889 + name = "ident_case" 890 + version = "1.0.1" 891 + source = "registry+https://github.com/rust-lang/crates.io-index" 892 + checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 893 + 894 + [[package]] 895 + name = "indexmap" 896 + version = "2.12.1" 897 + source = "registry+https://github.com/rust-lang/crates.io-index" 898 + checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" 899 + dependencies = [ 900 + "equivalent", 901 + "hashbrown 0.16.1", 902 + ] 903 + 904 + [[package]] 905 + name = "itertools" 906 + version = "0.14.0" 907 + source = "registry+https://github.com/rust-lang/crates.io-index" 908 + checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 909 + dependencies = [ 910 + "either", 911 + ] 912 + 913 + [[package]] 914 + name = "keccak" 915 + version = "0.1.5" 916 + source = "registry+https://github.com/rust-lang/crates.io-index" 917 + checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" 918 + dependencies = [ 919 + "cpufeatures", 920 + ] 921 + 922 + [[package]] 923 + name = "lalrpop" 924 + version = "0.22.2" 925 + source = "registry+https://github.com/rust-lang/crates.io-index" 926 + checksum = "ba4ebbd48ce411c1d10fb35185f5a51a7bfa3d8b24b4e330d30c9e3a34129501" 927 + dependencies = [ 928 + "ascii-canvas", 929 + "bit-set", 930 + "ena", 931 + "itertools", 932 + "lalrpop-util", 933 + "petgraph", 934 + "pico-args", 935 + "regex", 936 + "regex-syntax", 937 + "sha3", 938 + "string_cache", 939 + "term", 940 + "unicode-xid", 941 + "walkdir", 942 + ] 943 + 944 + [[package]] 945 + name = "lalrpop-util" 946 + version = "0.22.2" 947 + source = "registry+https://github.com/rust-lang/crates.io-index" 948 + checksum = "b5baa5e9ff84f1aefd264e6869907646538a52147a755d494517a8007fb48733" 949 + dependencies = [ 950 + "regex-automata", 951 + "rustversion", 952 + ] 953 + 954 + [[package]] 955 + name = "libc" 956 + version = "0.2.178" 957 + source = "registry+https://github.com/rust-lang/crates.io-index" 958 + checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" 959 + 960 + [[package]] 961 + name = "litrs" 962 + version = "1.0.0" 963 + source = "registry+https://github.com/rust-lang/crates.io-index" 964 + checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" 965 + 966 + [[package]] 967 + name = "lock_api" 968 + version = "0.4.14" 969 + source = "registry+https://github.com/rust-lang/crates.io-index" 970 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 971 + dependencies = [ 972 + "scopeguard", 973 + ] 974 + 975 + [[package]] 976 + name = "log" 977 + version = "0.4.29" 978 + source = "registry+https://github.com/rust-lang/crates.io-index" 979 + checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 980 + 981 + [[package]] 982 + name = "macropad" 983 + version = "0.1.0" 984 + dependencies = [ 985 + "cortex-m", 986 + "cortex-m-rt", 987 + "defmt 1.0.1", 988 + "defmt-rtt", 989 + "embassy-embedded-hal", 990 + "embassy-executor", 991 + "embassy-futures", 992 + "embassy-rp", 993 + "embassy-sync", 994 + "embassy-time", 995 + "embassy-usb", 996 + "embassy-usb-logger", 997 + "embedded-graphics", 998 + "embedded-hal 1.0.0", 999 + "embedded-hal-async", 1000 + "embedded-hal-bus", 1001 + "embedded-io-async 0.7.0", 1002 + "embedded-storage", 1003 + "fixed", 1004 + "fixed-macro", 1005 + "futures", 1006 + "heapless 0.9.2", 1007 + "log", 1008 + "midi-convert", 1009 + "panic-probe", 1010 + "pio", 1011 + "pio-proc", 1012 + "portable-atomic", 1013 + "rand", 1014 + "sb-rotary-encoder", 1015 + "sh1106", 1016 + "smart-leds", 1017 + "static_cell", 1018 + "usbd-hid 0.9.0", 1019 + "usbd-midi", 1020 + "ws2812-spi", 1021 + ] 1022 + 1023 + [[package]] 1024 + name = "memchr" 1025 + version = "2.7.6" 1026 + source = "registry+https://github.com/rust-lang/crates.io-index" 1027 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 1028 + 1029 + [[package]] 1030 + name = "micromath" 1031 + version = "2.1.0" 1032 + source = "registry+https://github.com/rust-lang/crates.io-index" 1033 + checksum = "c3c8dda44ff03a2f238717214da50f65d5a53b45cd213a7370424ffdb6fae815" 1034 + 1035 + [[package]] 1036 + name = "midi-convert" 1037 + version = "0.2.0" 1038 + source = "registry+https://github.com/rust-lang/crates.io-index" 1039 + checksum = "18f4776f9d450d481dc41e3dce9c10b11a9ec5955aca7c13215e94fe9477f2f7" 1040 + dependencies = [ 1041 + "midi-types", 1042 + ] 1043 + 1044 + [[package]] 1045 + name = "midi-types" 1046 + version = "0.1.7" 1047 + source = "registry+https://github.com/rust-lang/crates.io-index" 1048 + checksum = "ef0bbe5256e5c434947d790788426bb65773502784aed7b23408f7e7fb4d8eb5" 1049 + 1050 + [[package]] 1051 + name = "nb" 1052 + version = "0.1.3" 1053 + source = "registry+https://github.com/rust-lang/crates.io-index" 1054 + checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" 1055 + dependencies = [ 1056 + "nb 1.1.0", 1057 + ] 1058 + 1059 + [[package]] 1060 + name = "nb" 1061 + version = "1.1.0" 1062 + source = "registry+https://github.com/rust-lang/crates.io-index" 1063 + checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" 1064 + 1065 + [[package]] 1066 + name = "new_debug_unreachable" 1067 + version = "1.0.6" 1068 + source = "registry+https://github.com/rust-lang/crates.io-index" 1069 + checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 1070 + 1071 + [[package]] 1072 + name = "num-traits" 1073 + version = "0.2.19" 1074 + source = "registry+https://github.com/rust-lang/crates.io-index" 1075 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1076 + dependencies = [ 1077 + "autocfg", 1078 + ] 1079 + 1080 + [[package]] 1081 + name = "num_enum" 1082 + version = "0.7.5" 1083 + source = "registry+https://github.com/rust-lang/crates.io-index" 1084 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 1085 + dependencies = [ 1086 + "num_enum_derive", 1087 + "rustversion", 1088 + ] 1089 + 1090 + [[package]] 1091 + name = "num_enum_derive" 1092 + version = "0.7.5" 1093 + source = "registry+https://github.com/rust-lang/crates.io-index" 1094 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 1095 + dependencies = [ 1096 + "proc-macro2", 1097 + "quote", 1098 + "syn 2.0.112", 1099 + ] 1100 + 1101 + [[package]] 1102 + name = "once_cell" 1103 + version = "1.21.3" 1104 + source = "registry+https://github.com/rust-lang/crates.io-index" 1105 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1106 + 1107 + [[package]] 1108 + name = "panic-probe" 1109 + version = "1.0.0" 1110 + source = "registry+https://github.com/rust-lang/crates.io-index" 1111 + checksum = "fd402d00b0fb94c5aee000029204a46884b1262e0c443f166d86d2c0747e1a1a" 1112 + dependencies = [ 1113 + "cortex-m", 1114 + "defmt 1.0.1", 1115 + ] 1116 + 1117 + [[package]] 1118 + name = "parking_lot" 1119 + version = "0.12.5" 1120 + source = "registry+https://github.com/rust-lang/crates.io-index" 1121 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 1122 + dependencies = [ 1123 + "lock_api", 1124 + "parking_lot_core", 1125 + ] 1126 + 1127 + [[package]] 1128 + name = "parking_lot_core" 1129 + version = "0.9.12" 1130 + source = "registry+https://github.com/rust-lang/crates.io-index" 1131 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 1132 + dependencies = [ 1133 + "cfg-if", 1134 + "libc", 1135 + "redox_syscall", 1136 + "smallvec", 1137 + "windows-link", 1138 + ] 1139 + 1140 + [[package]] 1141 + name = "paste" 1142 + version = "1.0.15" 1143 + source = "registry+https://github.com/rust-lang/crates.io-index" 1144 + checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1145 + 1146 + [[package]] 1147 + name = "petgraph" 1148 + version = "0.7.1" 1149 + source = "registry+https://github.com/rust-lang/crates.io-index" 1150 + checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" 1151 + dependencies = [ 1152 + "fixedbitset", 1153 + "indexmap", 1154 + ] 1155 + 1156 + [[package]] 1157 + name = "phf_shared" 1158 + version = "0.11.3" 1159 + source = "registry+https://github.com/rust-lang/crates.io-index" 1160 + checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 1161 + dependencies = [ 1162 + "siphasher", 1163 + ] 1164 + 1165 + [[package]] 1166 + name = "pico-args" 1167 + version = "0.5.0" 1168 + source = "registry+https://github.com/rust-lang/crates.io-index" 1169 + checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" 1170 + 1171 + [[package]] 1172 + name = "pin-project-lite" 1173 + version = "0.2.16" 1174 + source = "registry+https://github.com/rust-lang/crates.io-index" 1175 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1176 + 1177 + [[package]] 1178 + name = "pin-utils" 1179 + version = "0.1.0" 1180 + source = "registry+https://github.com/rust-lang/crates.io-index" 1181 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1182 + 1183 + [[package]] 1184 + name = "pio" 1185 + version = "0.3.0" 1186 + source = "registry+https://github.com/rust-lang/crates.io-index" 1187 + checksum = "d0ba4153cee9585abc451271aa437d9e8defdea8b468d48ba6b8f098cbe03d7f" 1188 + dependencies = [ 1189 + "pio-core", 1190 + "pio-proc", 1191 + ] 1192 + 1193 + [[package]] 1194 + name = "pio-core" 1195 + version = "0.3.0" 1196 + source = "registry+https://github.com/rust-lang/crates.io-index" 1197 + checksum = "61d90fddc3d67f21bbf93683bc461b05d6a29c708caf3ffb79947d7ff7095406" 1198 + dependencies = [ 1199 + "arrayvec", 1200 + "num_enum", 1201 + "paste", 1202 + ] 1203 + 1204 + [[package]] 1205 + name = "pio-parser" 1206 + version = "0.3.0" 1207 + source = "registry+https://github.com/rust-lang/crates.io-index" 1208 + checksum = "825266c1eaddf54f636d06eefa4bf3c99d774c14ec46a4a6c6e5128a0f10d205" 1209 + dependencies = [ 1210 + "lalrpop", 1211 + "lalrpop-util", 1212 + "pio-core", 1213 + ] 1214 + 1215 + [[package]] 1216 + name = "pio-proc" 1217 + version = "0.3.0" 1218 + source = "registry+https://github.com/rust-lang/crates.io-index" 1219 + checksum = "ed4a76571f5fe51af43cc80ac870fe0c79cc0cdd686b9002a6c4c84bfdd0176b" 1220 + dependencies = [ 1221 + "codespan-reporting", 1222 + "lalrpop-util", 1223 + "pio-core", 1224 + "pio-parser", 1225 + "proc-macro-error2", 1226 + "proc-macro2", 1227 + "quote", 1228 + "syn 2.0.112", 1229 + ] 1230 + 1231 + [[package]] 1232 + name = "portable-atomic" 1233 + version = "1.13.0" 1234 + source = "registry+https://github.com/rust-lang/crates.io-index" 1235 + checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" 1236 + dependencies = [ 1237 + "critical-section", 1238 + ] 1239 + 1240 + [[package]] 1241 + name = "precomputed-hash" 1242 + version = "0.1.1" 1243 + source = "registry+https://github.com/rust-lang/crates.io-index" 1244 + checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 1245 + 1246 + [[package]] 1247 + name = "proc-macro-error" 1248 + version = "1.0.4" 1249 + source = "registry+https://github.com/rust-lang/crates.io-index" 1250 + checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1251 + dependencies = [ 1252 + "proc-macro-error-attr", 1253 + "proc-macro2", 1254 + "quote", 1255 + "syn 1.0.109", 1256 + "version_check", 1257 + ] 1258 + 1259 + [[package]] 1260 + name = "proc-macro-error-attr" 1261 + version = "1.0.4" 1262 + source = "registry+https://github.com/rust-lang/crates.io-index" 1263 + checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1264 + dependencies = [ 1265 + "proc-macro2", 1266 + "quote", 1267 + "version_check", 1268 + ] 1269 + 1270 + [[package]] 1271 + name = "proc-macro-error-attr2" 1272 + version = "2.0.0" 1273 + source = "registry+https://github.com/rust-lang/crates.io-index" 1274 + checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" 1275 + dependencies = [ 1276 + "proc-macro2", 1277 + "quote", 1278 + ] 1279 + 1280 + [[package]] 1281 + name = "proc-macro-error2" 1282 + version = "2.0.1" 1283 + source = "registry+https://github.com/rust-lang/crates.io-index" 1284 + checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" 1285 + dependencies = [ 1286 + "proc-macro-error-attr2", 1287 + "proc-macro2", 1288 + "quote", 1289 + "syn 2.0.112", 1290 + ] 1291 + 1292 + [[package]] 1293 + name = "proc-macro2" 1294 + version = "1.0.104" 1295 + source = "registry+https://github.com/rust-lang/crates.io-index" 1296 + checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" 1297 + dependencies = [ 1298 + "unicode-ident", 1299 + ] 1300 + 1301 + [[package]] 1302 + name = "quote" 1303 + version = "1.0.42" 1304 + source = "registry+https://github.com/rust-lang/crates.io-index" 1305 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 1306 + dependencies = [ 1307 + "proc-macro2", 1308 + ] 1309 + 1310 + [[package]] 1311 + name = "rand" 1312 + version = "0.9.2" 1313 + source = "registry+https://github.com/rust-lang/crates.io-index" 1314 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 1315 + dependencies = [ 1316 + "rand_core 0.9.3", 1317 + ] 1318 + 1319 + [[package]] 1320 + name = "rand_core" 1321 + version = "0.6.4" 1322 + source = "registry+https://github.com/rust-lang/crates.io-index" 1323 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1324 + 1325 + [[package]] 1326 + name = "rand_core" 1327 + version = "0.9.3" 1328 + source = "registry+https://github.com/rust-lang/crates.io-index" 1329 + checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1330 + 1331 + [[package]] 1332 + name = "redox_syscall" 1333 + version = "0.5.18" 1334 + source = "registry+https://github.com/rust-lang/crates.io-index" 1335 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 1336 + dependencies = [ 1337 + "bitflags 2.10.0", 1338 + ] 1339 + 1340 + [[package]] 1341 + name = "regex" 1342 + version = "1.12.2" 1343 + source = "registry+https://github.com/rust-lang/crates.io-index" 1344 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 1345 + dependencies = [ 1346 + "aho-corasick", 1347 + "memchr", 1348 + "regex-automata", 1349 + "regex-syntax", 1350 + ] 1351 + 1352 + [[package]] 1353 + name = "regex-automata" 1354 + version = "0.4.13" 1355 + source = "registry+https://github.com/rust-lang/crates.io-index" 1356 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 1357 + dependencies = [ 1358 + "aho-corasick", 1359 + "memchr", 1360 + "regex-syntax", 1361 + ] 1362 + 1363 + [[package]] 1364 + name = "regex-syntax" 1365 + version = "0.8.8" 1366 + source = "registry+https://github.com/rust-lang/crates.io-index" 1367 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 1368 + 1369 + [[package]] 1370 + name = "rgb" 1371 + version = "0.8.52" 1372 + source = "registry+https://github.com/rust-lang/crates.io-index" 1373 + checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" 1374 + 1375 + [[package]] 1376 + name = "rp-pac" 1377 + version = "7.0.0" 1378 + source = "registry+https://github.com/rust-lang/crates.io-index" 1379 + checksum = "8af65855c40b2c35079514c5489abffc0429347fef25d8467ff98ad84b4322d3" 1380 + dependencies = [ 1381 + "cortex-m", 1382 + "cortex-m-rt", 1383 + ] 1384 + 1385 + [[package]] 1386 + name = "rp2040-boot2" 1387 + version = "0.3.0" 1388 + source = "registry+https://github.com/rust-lang/crates.io-index" 1389 + checksum = "7c92f344f63f950ee36cf4080050e4dce850839b9175da38f9d2ffb69b4dbb21" 1390 + dependencies = [ 1391 + "crc-any", 1392 + ] 1393 + 1394 + [[package]] 1395 + name = "rustc_version" 1396 + version = "0.2.3" 1397 + source = "registry+https://github.com/rust-lang/crates.io-index" 1398 + checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1399 + dependencies = [ 1400 + "semver", 1401 + ] 1402 + 1403 + [[package]] 1404 + name = "rustversion" 1405 + version = "1.0.22" 1406 + source = "registry+https://github.com/rust-lang/crates.io-index" 1407 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1408 + 1409 + [[package]] 1410 + name = "same-file" 1411 + version = "1.0.6" 1412 + source = "registry+https://github.com/rust-lang/crates.io-index" 1413 + checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1414 + dependencies = [ 1415 + "winapi-util", 1416 + ] 1417 + 1418 + [[package]] 1419 + name = "sb-rotary-encoder" 1420 + version = "0.1.0" 1421 + source = "registry+https://github.com/rust-lang/crates.io-index" 1422 + checksum = "42e8ca0f5532f70e0335143c59b82127455dfe3aa571d88a08206802bfa03938" 1423 + 1424 + [[package]] 1425 + name = "scopeguard" 1426 + version = "1.2.0" 1427 + source = "registry+https://github.com/rust-lang/crates.io-index" 1428 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1429 + 1430 + [[package]] 1431 + name = "semver" 1432 + version = "0.9.0" 1433 + source = "registry+https://github.com/rust-lang/crates.io-index" 1434 + checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1435 + dependencies = [ 1436 + "semver-parser", 1437 + ] 1438 + 1439 + [[package]] 1440 + name = "semver-parser" 1441 + version = "0.7.0" 1442 + source = "registry+https://github.com/rust-lang/crates.io-index" 1443 + checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1444 + 1445 + [[package]] 1446 + name = "serde" 1447 + version = "1.0.228" 1448 + source = "registry+https://github.com/rust-lang/crates.io-index" 1449 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 1450 + dependencies = [ 1451 + "serde_core", 1452 + ] 1453 + 1454 + [[package]] 1455 + name = "serde_core" 1456 + version = "1.0.228" 1457 + source = "registry+https://github.com/rust-lang/crates.io-index" 1458 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 1459 + dependencies = [ 1460 + "serde_derive", 1461 + ] 1462 + 1463 + [[package]] 1464 + name = "serde_derive" 1465 + version = "1.0.228" 1466 + source = "registry+https://github.com/rust-lang/crates.io-index" 1467 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 1468 + dependencies = [ 1469 + "proc-macro2", 1470 + "quote", 1471 + "syn 2.0.112", 1472 + ] 1473 + 1474 + [[package]] 1475 + name = "sh1106" 1476 + version = "0.5.0" 1477 + source = "registry+https://github.com/rust-lang/crates.io-index" 1478 + checksum = "dc12a0563ec9b3b1f99b1f64613581ebbade1347416a34766564f406c15d1bf3" 1479 + dependencies = [ 1480 + "embedded-graphics-core", 1481 + "embedded-hal 0.2.7", 1482 + ] 1483 + 1484 + [[package]] 1485 + name = "sha2-const-stable" 1486 + version = "0.1.0" 1487 + source = "registry+https://github.com/rust-lang/crates.io-index" 1488 + checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" 1489 + 1490 + [[package]] 1491 + name = "sha3" 1492 + version = "0.10.8" 1493 + source = "registry+https://github.com/rust-lang/crates.io-index" 1494 + checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" 1495 + dependencies = [ 1496 + "digest", 1497 + "keccak", 1498 + ] 1499 + 1500 + [[package]] 1501 + name = "siphasher" 1502 + version = "1.0.1" 1503 + source = "registry+https://github.com/rust-lang/crates.io-index" 1504 + checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 1505 + 1506 + [[package]] 1507 + name = "smallvec" 1508 + version = "1.15.1" 1509 + source = "registry+https://github.com/rust-lang/crates.io-index" 1510 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1511 + 1512 + [[package]] 1513 + name = "smart-leds" 1514 + version = "0.4.0" 1515 + source = "registry+https://github.com/rust-lang/crates.io-index" 1516 + checksum = "66df34e571fa9993fa6f99131a374d58ca3d694b75f9baac93458fe0d6057bf0" 1517 + dependencies = [ 1518 + "smart-leds-trait", 1519 + ] 1520 + 1521 + [[package]] 1522 + name = "smart-leds-trait" 1523 + version = "0.3.2" 1524 + source = "registry+https://github.com/rust-lang/crates.io-index" 1525 + checksum = "a7f4441a131924d58da6b83a7ad765c460e64630cce504376c3a87a2558c487f" 1526 + dependencies = [ 1527 + "rgb", 1528 + ] 1529 + 1530 + [[package]] 1531 + name = "ssmarshal" 1532 + version = "1.0.0" 1533 + source = "registry+https://github.com/rust-lang/crates.io-index" 1534 + checksum = "f3e6ad23b128192ed337dfa4f1b8099ced0c2bf30d61e551b65fda5916dbb850" 1535 + dependencies = [ 1536 + "encode_unicode", 1537 + "serde", 1538 + ] 1539 + 1540 + [[package]] 1541 + name = "stable_deref_trait" 1542 + version = "1.2.1" 1543 + source = "registry+https://github.com/rust-lang/crates.io-index" 1544 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 1545 + 1546 + [[package]] 1547 + name = "static_cell" 1548 + version = "2.1.1" 1549 + source = "registry+https://github.com/rust-lang/crates.io-index" 1550 + checksum = "0530892bb4fa575ee0da4b86f86c667132a94b74bb72160f58ee5a4afec74c23" 1551 + dependencies = [ 1552 + "portable-atomic", 1553 + ] 1554 + 1555 + [[package]] 1556 + name = "string_cache" 1557 + version = "0.8.9" 1558 + source = "registry+https://github.com/rust-lang/crates.io-index" 1559 + checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" 1560 + dependencies = [ 1561 + "new_debug_unreachable", 1562 + "parking_lot", 1563 + "phf_shared", 1564 + "precomputed-hash", 1565 + ] 1566 + 1567 + [[package]] 1568 + name = "strsim" 1569 + version = "0.11.1" 1570 + source = "registry+https://github.com/rust-lang/crates.io-index" 1571 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1572 + 1573 + [[package]] 1574 + name = "syn" 1575 + version = "1.0.109" 1576 + source = "registry+https://github.com/rust-lang/crates.io-index" 1577 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1578 + dependencies = [ 1579 + "proc-macro2", 1580 + "quote", 1581 + "unicode-ident", 1582 + ] 1583 + 1584 + [[package]] 1585 + name = "syn" 1586 + version = "2.0.112" 1587 + source = "registry+https://github.com/rust-lang/crates.io-index" 1588 + checksum = "21f182278bf2d2bcb3c88b1b08a37df029d71ce3d3ae26168e3c653b213b99d4" 1589 + dependencies = [ 1590 + "proc-macro2", 1591 + "quote", 1592 + "unicode-ident", 1593 + ] 1594 + 1595 + [[package]] 1596 + name = "term" 1597 + version = "1.2.1" 1598 + source = "registry+https://github.com/rust-lang/crates.io-index" 1599 + checksum = "d8c27177b12a6399ffc08b98f76f7c9a1f4fe9fc967c784c5a071fa8d93cf7e1" 1600 + dependencies = [ 1601 + "windows-sys", 1602 + ] 1603 + 1604 + [[package]] 1605 + name = "termcolor" 1606 + version = "1.4.1" 1607 + source = "registry+https://github.com/rust-lang/crates.io-index" 1608 + checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 1609 + dependencies = [ 1610 + "winapi-util", 1611 + ] 1612 + 1613 + [[package]] 1614 + name = "thiserror" 1615 + version = "2.0.17" 1616 + source = "registry+https://github.com/rust-lang/crates.io-index" 1617 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 1618 + dependencies = [ 1619 + "thiserror-impl", 1620 + ] 1621 + 1622 + [[package]] 1623 + name = "thiserror-impl" 1624 + version = "2.0.17" 1625 + source = "registry+https://github.com/rust-lang/crates.io-index" 1626 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 1627 + dependencies = [ 1628 + "proc-macro2", 1629 + "quote", 1630 + "syn 2.0.112", 1631 + ] 1632 + 1633 + [[package]] 1634 + name = "typenum" 1635 + version = "1.19.0" 1636 + source = "registry+https://github.com/rust-lang/crates.io-index" 1637 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 1638 + 1639 + [[package]] 1640 + name = "unicode-ident" 1641 + version = "1.0.22" 1642 + source = "registry+https://github.com/rust-lang/crates.io-index" 1643 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 1644 + 1645 + [[package]] 1646 + name = "unicode-width" 1647 + version = "0.1.14" 1648 + source = "registry+https://github.com/rust-lang/crates.io-index" 1649 + checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 1650 + 1651 + [[package]] 1652 + name = "unicode-xid" 1653 + version = "0.2.6" 1654 + source = "registry+https://github.com/rust-lang/crates.io-index" 1655 + checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 1656 + 1657 + [[package]] 1658 + name = "usb-device" 1659 + version = "0.3.2" 1660 + source = "registry+https://github.com/rust-lang/crates.io-index" 1661 + checksum = "98816b1accafbb09085168b90f27e93d790b4bfa19d883466b5e53315b5f06a6" 1662 + dependencies = [ 1663 + "heapless 0.8.0", 1664 + "portable-atomic", 1665 + ] 1666 + 1667 + [[package]] 1668 + name = "usbd-hid" 1669 + version = "0.8.2" 1670 + source = "registry+https://github.com/rust-lang/crates.io-index" 1671 + checksum = "e6f291ab53d428685cc780f08a2eb9d5d6ff58622db2b36e239a4f715f1e184c" 1672 + dependencies = [ 1673 + "serde", 1674 + "ssmarshal", 1675 + "usb-device", 1676 + "usbd-hid-macros 0.8.2", 1677 + ] 1678 + 1679 + [[package]] 1680 + name = "usbd-hid" 1681 + version = "0.9.0" 1682 + source = "registry+https://github.com/rust-lang/crates.io-index" 1683 + checksum = "9a7cd3bfb2bb57779f2aeab3f679e5ec6c80265adfe77894539792be7c22aaf0" 1684 + dependencies = [ 1685 + "serde", 1686 + "ssmarshal", 1687 + "usb-device", 1688 + "usbd-hid-macros 0.9.0", 1689 + ] 1690 + 1691 + [[package]] 1692 + name = "usbd-hid-descriptors" 1693 + version = "0.8.2" 1694 + source = "registry+https://github.com/rust-lang/crates.io-index" 1695 + checksum = "0eee54712c5d778d2fb2da43b1ce5a7b5060886ef7b09891baeb4bf36910a3ed" 1696 + dependencies = [ 1697 + "bitfield 0.14.0", 1698 + ] 1699 + 1700 + [[package]] 1701 + name = "usbd-hid-descriptors" 1702 + version = "0.9.0" 1703 + source = "registry+https://github.com/rust-lang/crates.io-index" 1704 + checksum = "ac781e4d4c61a4d3bea4cda03fb4ed4d13578c55386b29c5cdc70b3bd89c47df" 1705 + dependencies = [ 1706 + "bitfield 0.14.0", 1707 + ] 1708 + 1709 + [[package]] 1710 + name = "usbd-hid-macros" 1711 + version = "0.8.2" 1712 + source = "registry+https://github.com/rust-lang/crates.io-index" 1713 + checksum = "bb573c76e7884035ac5e1ab4a81234c187a82b6100140af0ab45757650ccda38" 1714 + dependencies = [ 1715 + "byteorder", 1716 + "hashbrown 0.13.2", 1717 + "log", 1718 + "proc-macro2", 1719 + "quote", 1720 + "serde", 1721 + "syn 1.0.109", 1722 + "usbd-hid-descriptors 0.8.2", 1723 + ] 1724 + 1725 + [[package]] 1726 + name = "usbd-hid-macros" 1727 + version = "0.9.0" 1728 + source = "registry+https://github.com/rust-lang/crates.io-index" 1729 + checksum = "ab457064302de0aca303a13cd520dcf035fdfd2aff713fa69d713d0a8e4291d8" 1730 + dependencies = [ 1731 + "byteorder", 1732 + "hashbrown 0.13.2", 1733 + "log", 1734 + "proc-macro2", 1735 + "quote", 1736 + "serde", 1737 + "syn 1.0.109", 1738 + "usbd-hid-descriptors 0.9.0", 1739 + ] 1740 + 1741 + [[package]] 1742 + name = "usbd-midi" 1743 + version = "0.5.0" 1744 + source = "registry+https://github.com/rust-lang/crates.io-index" 1745 + checksum = "a88782a02de4ea460cd84dc5cc8007a27618a5a8bb14514699dba5e7dcf9a590" 1746 + dependencies = [ 1747 + "num_enum", 1748 + "usb-device", 1749 + ] 1750 + 1751 + [[package]] 1752 + name = "vcell" 1753 + version = "0.1.3" 1754 + source = "registry+https://github.com/rust-lang/crates.io-index" 1755 + checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" 1756 + 1757 + [[package]] 1758 + name = "version_check" 1759 + version = "0.9.5" 1760 + source = "registry+https://github.com/rust-lang/crates.io-index" 1761 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1762 + 1763 + [[package]] 1764 + name = "void" 1765 + version = "1.0.2" 1766 + source = "registry+https://github.com/rust-lang/crates.io-index" 1767 + checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 1768 + 1769 + [[package]] 1770 + name = "volatile-register" 1771 + version = "0.2.2" 1772 + source = "registry+https://github.com/rust-lang/crates.io-index" 1773 + checksum = "de437e2a6208b014ab52972a27e59b33fa2920d3e00fe05026167a1c509d19cc" 1774 + dependencies = [ 1775 + "vcell", 1776 + ] 1777 + 1778 + [[package]] 1779 + name = "walkdir" 1780 + version = "2.5.0" 1781 + source = "registry+https://github.com/rust-lang/crates.io-index" 1782 + checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 1783 + dependencies = [ 1784 + "same-file", 1785 + "winapi-util", 1786 + ] 1787 + 1788 + [[package]] 1789 + name = "winapi-util" 1790 + version = "0.1.11" 1791 + source = "registry+https://github.com/rust-lang/crates.io-index" 1792 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 1793 + dependencies = [ 1794 + "windows-sys", 1795 + ] 1796 + 1797 + [[package]] 1798 + name = "windows-link" 1799 + version = "0.2.1" 1800 + source = "registry+https://github.com/rust-lang/crates.io-index" 1801 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 1802 + 1803 + [[package]] 1804 + name = "windows-sys" 1805 + version = "0.61.2" 1806 + source = "registry+https://github.com/rust-lang/crates.io-index" 1807 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 1808 + dependencies = [ 1809 + "windows-link", 1810 + ] 1811 + 1812 + [[package]] 1813 + name = "ws2812-spi" 1814 + version = "0.5.1" 1815 + source = "registry+https://github.com/rust-lang/crates.io-index" 1816 + checksum = "b2fd98e2b649252eced2ec3aa8d5048e7d2ac294276b0567939bbf47741f9934" 1817 + dependencies = [ 1818 + "embedded-hal 1.0.0", 1819 + "smart-leds-trait", 1820 + ] 1821 + 1822 + [[package]] 1823 + name = "zerocopy" 1824 + version = "0.8.31" 1825 + source = "registry+https://github.com/rust-lang/crates.io-index" 1826 + checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" 1827 + dependencies = [ 1828 + "zerocopy-derive", 1829 + ] 1830 + 1831 + [[package]] 1832 + name = "zerocopy-derive" 1833 + version = "0.8.31" 1834 + source = "registry+https://github.com/rust-lang/crates.io-index" 1835 + checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" 1836 + dependencies = [ 1837 + "proc-macro2", 1838 + "quote", 1839 + "syn 2.0.112", 1840 + ]
+76
Cargo.toml
··· 1 + [package] 2 + edition = "2024" 3 + rust-version = "1.85.0" 4 + name = "macropad" 5 + version = "0.1.0" 6 + authors = ["Eric Wood <eric@ericwood.org>"] 7 + resolver = "2" 8 + 9 + [dependencies] 10 + embassy-embedded-hal = { version = "0.5.0", features = ["defmt"] } 11 + embassy-sync = { version = "0.7.2", features = ["defmt"] } 12 + embassy-executor = { version = "0.9.1", features = [ 13 + "arch-cortex-m", 14 + "executor-thread", 15 + "executor-interrupt", 16 + "defmt", 17 + ] } 18 + embassy-time = { version = "0.5.0", features = [ 19 + "defmt", 20 + "defmt-timestamp-uptime", 21 + ] } 22 + embassy-rp = { version = "0.9.0", features = [ 23 + "defmt", 24 + "unstable-pac", 25 + "time-driver", 26 + "critical-section-impl", 27 + "rp2040", 28 + ] } 29 + embassy-futures = { version = "0.1.2" } 30 + embassy-usb = { version = "0.5.1", features = ["defmt"] } 31 + embassy-usb-logger = { version = "0.5.1" } 32 + usbd-hid = "0.9.0" 33 + 34 + defmt = "1.0.1" 35 + defmt-rtt = "1.1.0" 36 + fixed = "1.29.0" 37 + fixed-macro = "1.2.0" 38 + 39 + cortex-m = { version = "0.7.7", features = ["inline-asm"] } 40 + cortex-m-rt = "0.7.5" 41 + panic-probe = { version = "1.0.0", features = ["print-defmt"] } 42 + futures = { version = "0.3.31", default-features = false, features = [ 43 + "async-await", 44 + "cfg-target-has-atomic", 45 + "unstable", 46 + ] } 47 + heapless = "0.9.2" 48 + 49 + embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0" } 50 + embedded-hal-async = "1.0.0" 51 + embedded-hal-bus = { version = "0.3.0", features = ["async"] } 52 + embedded-io-async = { version = "0.7.0", features = ["defmt"] } 53 + embedded-storage = { version = "0.3" } 54 + static_cell = "2.1.1" 55 + portable-atomic = { version = "1.11.1", features = ["critical-section"] } 56 + log = "0.4.28" 57 + pio-proc = "0.3.0" 58 + pio = "0.3.0" 59 + rand = { version = "0.9.2", default-features = false } 60 + ws2812-spi = "0.5.1" 61 + smart-leds = "0.4.0" 62 + embedded-graphics = { version = "0.8.1", features = ["defmt"] } 63 + sh1106 = { version = "0.5.0", features = ["graphics"] } 64 + sb-rotary-encoder = "0.1.0" 65 + midi-convert = "0.2.0" 66 + usbd-midi = "0.5.0" 67 + 68 + [profile.release] 69 + debug = true 70 + 71 + # Below configs are here to mute the rust-analyzer error. 72 + # "Can't find crate for 'test'" as this is a no_std project 73 + [[bin]] 74 + name = "macropad" 75 + test = false 76 + bench = false
+21
LICENSE
··· 1 + MIT License 2 + 3 + Copyright (c) 2023 Mike Panetta 4 + 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 11 + 12 + The above copyright notice and this permission notice shall be included in all 13 + copies or substantial portions of the Software. 14 + 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 + SOFTWARE.
+36
build.rs
··· 1 + //! This build script copies the `memory.x` file from the crate root into 2 + //! a directory where the linker can always find it at build time. 3 + //! For many projects this is optional, as the linker always searches the 4 + //! project root directory -- wherever `Cargo.toml` is. However, if you 5 + //! are using a workspace or have a more complicated build setup, this 6 + //! build script becomes required. Additionally, by requesting that 7 + //! Cargo re-run the build script whenever `memory.x` is changed, 8 + //! updating `memory.x` ensures a rebuild of the application with the 9 + //! new memory settings. 10 + 11 + use std::env; 12 + use std::fs::File; 13 + use std::io::Write; 14 + use std::path::PathBuf; 15 + 16 + fn main() { 17 + // Put `memory.x` in our output directory and ensure it's 18 + // on the linker search path. 19 + let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); 20 + File::create(out.join("memory.x")) 21 + .unwrap() 22 + .write_all(include_bytes!("memory.x")) 23 + .unwrap(); 24 + println!("cargo:rustc-link-search={}", out.display()); 25 + 26 + // By default, Cargo will re-run a build script whenever 27 + // any file in the project changes. By specifying `memory.x` 28 + // here, we ensure the build script is only re-run when 29 + // `memory.x` is changed. 30 + println!("cargo:rerun-if-changed=memory.x"); 31 + 32 + println!("cargo:rustc-link-arg-bins=--nmagic"); 33 + println!("cargo:rustc-link-arg-bins=-Tlink.x"); 34 + println!("cargo:rustc-link-arg-bins=-Tlink-rp.x"); 35 + println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); 36 + }
+17
memory.x
··· 1 + MEMORY { 2 + BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100 3 + FLASH : ORIGIN = 0x10000100, LENGTH = 8192K - 0x100 4 + 5 + /* Pick one of the two options for RAM layout */ 6 + 7 + /* OPTION A: Use all RAM banks as one big block */ 8 + /* Reasonable, unless you are doing something */ 9 + /* really particular with DMA or other concurrent */ 10 + /* access that would benefit from striping */ 11 + RAM : ORIGIN = 0x20000000, LENGTH = 264K 12 + 13 + /* OPTION B: Keep the unstriped sections separate */ 14 + /* RAM: ORIGIN = 0x20000000, LENGTH = 256K */ 15 + /* SCRATCH_A: ORIGIN = 0x20040000, LENGTH = 4K */ 16 + /* SCRATCH_B: ORIGIN = 0x20041000, LENGTH = 4K */ 17 + }
+6
rust-toolchain.toml
··· 1 + [toolchain] 2 + channel = "stable" 3 + components = [ "rust-src", "rustfmt", "llvm-tools" ] 4 + targets = [ 5 + "thumbv6m-none-eabi", 6 + ]
+59
src/board.rs
··· 1 + use embassy_rp::{ 2 + Peri, 3 + gpio::{Input, Level, Output, Pull}, 4 + peripherals::{PIN_0, PIN_19, PIN_22, PIN_23, PIN_24, PIN_26, PIN_27, PIN_28, SPI0, SPI1}, 5 + spi::{Config as SpiConfig, Spi}, 6 + }; 7 + 8 + use crate::{display::Display, key_leds::KeyLeds}; 9 + 10 + pub struct Peripherals { 11 + pub key_leds_spi: Peri<'static, SPI0>, 12 + pub key_leds_mosi: Peri<'static, PIN_19>, 13 + pub rotary_button: Peri<'static, PIN_0>, 14 + pub display_spi: Peri<'static, SPI1>, 15 + pub display_cs: Peri<'static, PIN_22>, 16 + pub display_rst: Peri<'static, PIN_23>, 17 + pub display_dc: Peri<'static, PIN_24>, 18 + pub display_sck: Peri<'static, PIN_26>, 19 + pub display_mosi: Peri<'static, PIN_27>, 20 + pub display_miso: Peri<'static, PIN_28>, 21 + } 22 + 23 + pub struct Board { 24 + pub key_leds: KeyLeds, 25 + pub display: Display, 26 + pub rotary_button: Input<'static>, 27 + } 28 + 29 + impl Board { 30 + pub fn new(p: Peripherals) -> Self { 31 + let mut led_spi_config = SpiConfig::default(); 32 + led_spi_config.frequency = 3_000_000; 33 + let led_spi = 34 + Spi::new_blocking_txonly_nosck(p.key_leds_spi, p.key_leds_mosi, led_spi_config); 35 + let key_leds = KeyLeds::new(led_spi); 36 + 37 + let mut display_spi_config = SpiConfig::default(); 38 + display_spi_config.frequency = 8_000_000; 39 + let display_spi = Spi::new_blocking( 40 + p.display_spi, 41 + p.display_sck, 42 + p.display_mosi, 43 + p.display_miso, 44 + display_spi_config, 45 + ); 46 + let dc = Output::new(p.display_dc, Level::Low); 47 + let cs = Output::new(p.display_cs, Level::Low); 48 + let rst = Output::new(p.display_rst, Level::Low); 49 + let display = Display::new(display_spi, dc, cs, rst); 50 + 51 + let rotary_button = Input::new(p.rotary_button, Pull::Up); 52 + 53 + Self { 54 + key_leds, 55 + display, 56 + rotary_button, 57 + } 58 + } 59 + }
+29
src/debounced_button.rs
··· 1 + use embassy_rp::gpio::Input; 2 + use embassy_time::{Duration, Timer}; 3 + 4 + pub struct DebouncedButton<'a> { 5 + pub threshold: Duration, 6 + input: Input<'a>, 7 + } 8 + 9 + impl<'a> DebouncedButton<'a> { 10 + pub fn new(input: Input<'a>, threshold: Duration) -> Self { 11 + DebouncedButton { threshold, input } 12 + } 13 + 14 + pub async fn on_change(&mut self) -> bool { 15 + loop { 16 + let l1 = self.pressed(); 17 + self.input.wait_for_any_edge().await; 18 + Timer::after(self.threshold).await; 19 + let l2 = self.pressed(); 20 + if l1 != l2 { 21 + break l2; 22 + } 23 + } 24 + } 25 + 26 + fn pressed(&mut self) -> bool { 27 + self.input.is_low() 28 + } 29 + }
+36
src/display.rs
··· 1 + use embassy_rp::{ 2 + gpio::Output, 3 + peripherals::SPI1, 4 + spi::{Blocking, Config, Spi}, 5 + }; 6 + use sh1106::{mode::GraphicsMode, prelude::SpiInterface}; 7 + 8 + type SpiOut = Spi<'static, SPI1, Blocking>; 9 + pub struct Display { 10 + pub display: GraphicsMode<SpiInterface<SpiOut, Output<'static>, Output<'static>>>, 11 + rst: Output<'static>, 12 + } 13 + 14 + impl Display { 15 + pub fn new( 16 + spi: SpiOut, 17 + dc: Output<'static>, 18 + cs: Output<'static>, 19 + rst: Output<'static>, 20 + ) -> Self { 21 + let mut display_spi_config = Config::default(); 22 + display_spi_config.frequency = 8_000_000; 23 + let display: GraphicsMode<_> = sh1106::Builder::new().connect_spi(spi, dc, cs).into(); 24 + Self { display, rst } 25 + } 26 + 27 + pub fn init(&mut self) { 28 + self.rst.set_high(); 29 + self.display.init().unwrap(); 30 + self.display.flush().unwrap(); 31 + } 32 + 33 + pub fn flush(&mut self) { 34 + self.display.flush().unwrap(); 35 + } 36 + }
+38
src/key_leds.rs
··· 1 + use crate::{COLS, ROWS}; 2 + use embassy_rp::{ 3 + peripherals::SPI0, 4 + spi::{Blocking, Spi}, 5 + }; 6 + use smart_leds::{RGB, SmartLedsWrite}; 7 + use ws2812_spi::{Ws2812, devices}; 8 + 9 + const NUM_LEDS: usize = ROWS * COLS; 10 + 11 + pub type Coord = (u8, u8); 12 + 13 + type SpiOut = Spi<'static, SPI0, Blocking>; 14 + type Driver = Ws2812<SpiOut, devices::Ws2812>; 15 + 16 + pub struct KeyLeds { 17 + leds: [RGB<u8>; NUM_LEDS], 18 + driver: Driver, 19 + } 20 + 21 + impl KeyLeds { 22 + pub fn new(spi: SpiOut) -> Self { 23 + let leds = [RGB::default(); NUM_LEDS]; 24 + let mut driver = Ws2812::new(spi); 25 + driver.write(leds).unwrap(); 26 + 27 + Self { leds, driver } 28 + } 29 + 30 + pub fn set(&mut self, coord: Coord, value: RGB<u8>) { 31 + let index = coord.1 as usize * COLS + coord.0 as usize; 32 + self.leds[index] = value; 33 + } 34 + 35 + pub fn write(&mut self) { 36 + self.driver.write(self.leds).unwrap(); 37 + } 38 + }
+195
src/main.rs
··· 1 + #![no_std] 2 + #![no_main] 3 + 4 + use defmt::*; 5 + use embassy_executor::Spawner; 6 + use embassy_rp::{ 7 + Peri, bind_interrupts, 8 + gpio::{AnyPin, Level, Output}, 9 + peripherals::USB, 10 + usb::{Driver, Instance, InterruptHandler}, 11 + }; 12 + use embassy_time::{Delay, Duration, Timer}; 13 + use embassy_usb::{class::midi::MidiClass, driver::EndpointError}; 14 + use embedded_graphics::{ 15 + mono_font::{MonoTextStyleBuilder, ascii::FONT_6X10}, 16 + pixelcolor::BinaryColor, 17 + prelude::*, 18 + text::{Baseline, Text}, 19 + }; 20 + mod tasks; 21 + use embedded_hal_1::delay::DelayNs; 22 + use smart_leds::RGB; 23 + use tasks::{read_controls, read_key}; 24 + mod display; 25 + use crate::{ 26 + board::{Board, Peripherals}, 27 + tasks::{LIGHTS_CHANNEL, LedUpdate, read_button, sequencer, update_lights}, 28 + }; 29 + use midi_convert::{ 30 + midi_types::{MidiMessage, Note}, 31 + render_slice::MidiRenderSlice, 32 + }; 33 + use usbd_midi::{CableNumber, UsbMidiEventPacket}; 34 + 35 + use {defmt_rtt as _, panic_probe as _}; 36 + mod board; 37 + mod debounced_button; 38 + mod key_leds; 39 + mod usb; 40 + 41 + bind_interrupts!(struct Irqs { 42 + USBCTRL_IRQ => InterruptHandler<USB>; 43 + }); 44 + 45 + const COLS: usize = 3; 46 + const ROWS: usize = 4; 47 + 48 + type KeyGrid<T> = [[T; COLS]; ROWS]; 49 + 50 + #[embassy_executor::main] 51 + async fn main(spawner: Spawner) { 52 + let p = embassy_rp::init(Default::default()); 53 + 54 + let peripherals = Peripherals { 55 + key_leds_spi: p.SPI0, 56 + key_leds_mosi: p.PIN_19, 57 + rotary_button: p.PIN_0, 58 + display_spi: p.SPI1, 59 + display_cs: p.PIN_22, 60 + display_rst: p.PIN_23, 61 + display_dc: p.PIN_24, 62 + display_sck: p.PIN_26, 63 + display_mosi: p.PIN_27, 64 + display_miso: p.PIN_28, 65 + }; 66 + 67 + let mut board = Board::new(peripherals); 68 + 69 + board.display.init(); 70 + let text_style = MonoTextStyleBuilder::new() 71 + .font(&FONT_6X10) 72 + .text_color(BinaryColor::On) 73 + .build(); 74 + 75 + Text::with_baseline("Hello, world!", Point::zero(), text_style, Baseline::Top) 76 + .draw(&mut board.display.display) 77 + .unwrap(); 78 + 79 + board.display.flush(); 80 + 81 + spawner.spawn(read_controls()).unwrap(); 82 + spawner.spawn(update_lights(board.key_leds)).unwrap(); 83 + spawner.spawn(read_button(board.rotary_button)).unwrap(); 84 + spawner.spawn(sequencer()).unwrap(); 85 + 86 + LIGHTS_CHANNEL 87 + .send(LedUpdate { 88 + coord: (2, 3), 89 + color: RGB { 90 + r: 0x40, 91 + g: 0, 92 + b: 0, 93 + }, 94 + }) 95 + .await; 96 + 97 + let keys: [[Peri<'static, AnyPin>; COLS]; ROWS] = [ 98 + [p.PIN_1.into(), p.PIN_2.into(), p.PIN_3.into()], 99 + [p.PIN_4.into(), p.PIN_5.into(), p.PIN_6.into()], 100 + [p.PIN_7.into(), p.PIN_8.into(), p.PIN_9.into()], 101 + [p.PIN_10.into(), p.PIN_11.into(), p.PIN_12.into()], 102 + ]; 103 + 104 + for (y, row) in keys.into_iter().enumerate() { 105 + for (x, pin) in row.into_iter().enumerate() { 106 + spawner.spawn(read_key(pin, (x as u8, y as u8))).unwrap(); 107 + } 108 + } 109 + 110 + let mut led = Output::new(p.PIN_13, Level::Low); 111 + 112 + //let driver = embassy_rp::usb::Driver::new(p.USB, Irqs); 113 + //let mut usb_config = embassy_usb::Config::new(0xc0de, 0xcafe); 114 + //usb_config.manufacturer = Some("Heuristic Industries"); 115 + //usb_config.product = Some("Macropad"); 116 + //usb_config.serial_number = Some("123456789"); 117 + //usb_config.max_power = 100; 118 + //usb_config.max_packet_size_0 = 64; 119 + 120 + //let mut config_descriptor = [0; 256]; 121 + //let mut bos_descriptor = [0; 256]; 122 + //let mut control_buf = [0; 64]; 123 + 124 + //let mut usb_builder = embassy_usb::Builder::new( 125 + // driver, 126 + // usb_config, 127 + // &mut config_descriptor, 128 + // &mut bos_descriptor, 129 + // &mut [], // no msos descriptors 130 + // &mut control_buf, 131 + //); 132 + 133 + //let mut class = MidiClass::new(&mut usb_builder, 1, 1, 64); 134 + //let mut usb = usb_builder.build(); 135 + //let usb_fut = usb.run(); 136 + 137 + //let midi_fut = async { 138 + // loop { 139 + // class.wait_connection().await; 140 + // let _ = midi_echo(&mut class, &mut led).await; 141 + // } 142 + //}; 143 + 144 + //join(usb_fut, midi_fut).await; 145 + loop { 146 + Timer::after_millis(500).await; 147 + led.toggle(); 148 + } 149 + } 150 + 151 + struct Disconnected {} 152 + 153 + impl From<EndpointError> for Disconnected { 154 + fn from(val: EndpointError) -> Self { 155 + match val { 156 + EndpointError::BufferOverflow => defmt::panic!("Buffer overflow"), 157 + EndpointError::Disabled => Disconnected {}, 158 + } 159 + } 160 + } 161 + 162 + async fn midi_echo<'d, T: Instance + 'd>( 163 + class: &mut MidiClass<'d, Driver<'d, T>>, 164 + led: &mut Output<'_>, 165 + ) -> Result<(), Disconnected> { 166 + //let mut buf = [0; 64]; 167 + 168 + let on_message = MidiMessage::NoteOn(1.into(), Note::C0, 0x34.into()); 169 + let mut on_buffer = [0u8; 3]; 170 + on_message.render_slice(&mut on_buffer); 171 + let on_packet = 172 + UsbMidiEventPacket::try_from_payload_bytes(CableNumber::Cable0, &on_buffer).unwrap(); 173 + 174 + let off_message = MidiMessage::NoteOff(1.into(), Note::C0, 0x34.into()); 175 + let mut off_buffer = [0u8; 3]; 176 + off_message.render_slice(&mut off_buffer); 177 + let off_packet = 178 + UsbMidiEventPacket::try_from_payload_bytes(CableNumber::Cable0, &off_buffer).unwrap(); 179 + 180 + loop { 181 + led.set_high(); 182 + class.write_packet(on_packet.as_raw_bytes()).await?; 183 + Timer::after(Duration::from_millis(500)).await; 184 + 185 + led.set_low(); 186 + class.write_packet(off_packet.as_raw_bytes()).await?; 187 + Timer::after(Duration::from_millis(500)).await; 188 + 189 + //let n = class.read_packet(&mut buf).await?; 190 + //let data = &buf[..n]; 191 + 192 + //info!("data: {:x}", data); 193 + //class.write_packet(data).await?; 194 + } 195 + }
+36
src/tasks/buttons.rs
··· 1 + use embassy_rp::{ 2 + Peri, 3 + gpio::{AnyPin, Input, Pull}, 4 + }; 5 + use embassy_time::Duration; 6 + 7 + use crate::{ 8 + debounced_button::DebouncedButton, 9 + key_leds::Coord, 10 + tasks::controls::{CONTROLS_CHANNEL, ControlEvent}, 11 + }; 12 + 13 + #[embassy_executor::task(pool_size = 12)] 14 + pub async fn read_key(pin: Peri<'static, AnyPin>, coord: Coord) { 15 + let input = Input::new(pin, Pull::Up); 16 + let mut button = DebouncedButton::new(input, Duration::from_millis(10)); 17 + 18 + loop { 19 + let pressed = button.on_change().await; 20 + CONTROLS_CHANNEL 21 + .send(ControlEvent::Key { pressed, coord }) 22 + .await; 23 + } 24 + } 25 + 26 + #[embassy_executor::task] 27 + pub async fn read_button(input: Input<'static>) { 28 + let mut button = DebouncedButton::new(input, Duration::from_millis(10)); 29 + 30 + loop { 31 + let pressed = button.on_change().await; 32 + CONTROLS_CHANNEL 33 + .send(ControlEvent::RotaryButton { pressed }) 34 + .await; 35 + } 36 + }
+84
src/tasks/controls.rs
··· 1 + use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, channel::Channel}; 2 + use smart_leds::RGB; 3 + 4 + use crate::{ 5 + COLS, KeyGrid, ROWS, 6 + key_leds::Coord, 7 + tasks::lights::{LIGHTS_CHANNEL, LedUpdate}, 8 + }; 9 + 10 + pub static CONTROLS_CHANNEL: Channel<ThreadModeRawMutex, ControlEvent, 10> = Channel::new(); 11 + 12 + pub enum ControlEvent { 13 + Key { pressed: bool, coord: Coord }, 14 + RotaryButton { pressed: bool }, 15 + SequencerStep { coord: Coord }, 16 + } 17 + 18 + #[embassy_executor::task] 19 + pub async fn read_controls() { 20 + let mut key_state: KeyGrid<bool> = [[false; COLS]; ROWS]; 21 + let active = RGB { 22 + r: 0x40, 23 + g: 0x00, 24 + b: 0x00, 25 + }; 26 + 27 + let off = RGB { r: 0, g: 0, b: 0 }; 28 + let mut step: Coord = (0, 0); 29 + 30 + loop { 31 + match CONTROLS_CHANNEL.receive().await { 32 + ControlEvent::Key { pressed, coord } => { 33 + if !pressed { 34 + continue; 35 + } 36 + 37 + let mut state = key_state[coord.1 as usize][coord.0 as usize]; 38 + state = !state; 39 + key_state[coord.1 as usize][coord.0 as usize] = state; 40 + let color = if state { active } else { off }; 41 + LIGHTS_CHANNEL.send(LedUpdate { coord, color }).await; 42 + } 43 + ControlEvent::RotaryButton { pressed } => { 44 + if !pressed { 45 + continue; 46 + } 47 + 48 + for y in 0..4 { 49 + for x in 0..3 { 50 + LIGHTS_CHANNEL 51 + .send(LedUpdate { 52 + coord: (x, y), 53 + color: RGB { 54 + r: 0x40, 55 + g: 0, 56 + b: 0, 57 + }, 58 + }) 59 + .await; 60 + } 61 + } 62 + } 63 + ControlEvent::SequencerStep { coord } => { 64 + LIGHTS_CHANNEL 65 + .send(LedUpdate { 66 + coord: step, 67 + color: RGB { r: 0, g: 0, b: 0 }, 68 + }) 69 + .await; 70 + LIGHTS_CHANNEL 71 + .send(LedUpdate { 72 + coord, 73 + color: RGB { 74 + r: 0, 75 + g: 0, 76 + b: 0x50, 77 + }, 78 + }) 79 + .await; 80 + step = coord; 81 + } 82 + } 83 + } 84 + }
+20
src/tasks/lights.rs
··· 1 + use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, channel::Channel}; 2 + use smart_leds::RGB; 3 + 4 + use crate::key_leds::{Coord, KeyLeds}; 5 + 6 + pub static LIGHTS_CHANNEL: Channel<ThreadModeRawMutex, LedUpdate, 3> = Channel::new(); 7 + 8 + pub struct LedUpdate { 9 + pub coord: Coord, 10 + pub color: RGB<u8>, 11 + } 12 + 13 + #[embassy_executor::task] 14 + pub async fn update_lights(mut key_leds: KeyLeds) { 15 + loop { 16 + let led_update = LIGHTS_CHANNEL.receive().await; 17 + key_leds.set(led_update.coord, led_update.color); 18 + key_leds.write(); 19 + } 20 + }
+9
src/tasks/mod.rs
··· 1 + mod buttons; 2 + mod controls; 3 + mod lights; 4 + mod sequencer; 5 + 6 + pub use buttons::{read_button, read_key}; 7 + pub use controls::{CONTROLS_CHANNEL, read_controls}; 8 + pub use lights::{LIGHTS_CHANNEL, LedUpdate, update_lights}; 9 + pub use sequencer::sequencer;
+26
src/tasks/sequencer.rs
··· 1 + use embassy_time::Timer; 2 + 3 + use crate::{ 4 + COLS, 5 + tasks::{CONTROLS_CHANNEL, controls::ControlEvent}, 6 + }; 7 + 8 + #[embassy_executor::task] 9 + pub async fn sequencer() { 10 + let mut step: u8 = 0; 11 + let cols = COLS as u8; 12 + 13 + loop { 14 + let coord = (step % cols, step / cols); 15 + CONTROLS_CHANNEL 16 + .send(ControlEvent::SequencerStep { coord }) 17 + .await; 18 + 19 + step += 1; 20 + if step == 12 { 21 + step = 0; 22 + } 23 + 24 + Timer::after_millis(500).await; 25 + } 26 + }
+41
src/usb.rs
··· 1 + //use embassy_rp::{peripherals::USB, usb::Driver}; 2 + //use embassy_usb::{Config}; 3 + // 4 + //type UsbDriver = Driver<'static, USB>; 5 + // 6 + //pub struct Usb<'a> { 7 + // config: Config<'a>, 8 + // config_descriptor: [u8; 256], 9 + // bos_descriptor: [u8; 256] 10 + // control_buf: [u8; 64], 11 + //} 12 + // 13 + //impl<'a> Usb<'a> { 14 + // pub fn new() -> Self { 15 + // let mut config = embassy_usb::Config::new(0xc0de, 0xcafe); 16 + // config.manufacturer = Some("Heuristic Industries"); 17 + // config.product = Some("Macropad"); 18 + // config.serial_number = Some("123456789"); 19 + // config.max_power = 100; 20 + // config.max_packet_size_0 = 64; 21 + // 22 + // let config_descriptor = [0; 256]; 23 + // let bos_descriptor = [0; 256]; 24 + // let control_buf = [0; 64]; 25 + // 26 + // Self { config, config_descriptor, bos_descriptor, control_buf} 27 + // } 28 + // pub fn init(&mut self, driver: UsbDriver) { 29 + // let builder = embassy_usb::Builder::new( 30 + // driver, 31 + // self.config, 32 + // &mut self.config_descriptor, 33 + // &mut self.bos_descriptor, 34 + // &mut [], // no msos descriptors 35 + // &mut self.control_buf, 36 + // ); 37 + // 38 + // let mut usb = builder.build(); 39 + // usb.run(); 40 + // } 41 + //}