diff --git a/.github/workflows/koishi.yml b/.github/workflows/koishi.yml index fb3f4be9..7d99d572 100644 --- a/.github/workflows/koishi.yml +++ b/.github/workflows/koishi.yml @@ -28,34 +28,6 @@ jobs: - name: Clippy run: nix develop --command cargo clippy -- -Dwarnings - formatting-firmware-tests: - name: Formatting (firmware tests) - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./koishi/firmware-tests - - steps: - - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@V27 - - - name: Clippy - run: nix develop --command cargo clippy -- -Dwarnings - - formatting-telemetry-receiver: - name: Formatting (telemetry-receiver) - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./koishi/telemetry-receiver - - steps: - - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@V27 - - - name: Clippy - run: nix develop --command cargo clippy -- -Dwarnings - build-and-test-firmware: name: Build and Test (firmware) runs-on: ubuntu-latest @@ -67,24 +39,5 @@ jobs: - name: Build working-directory: ./koishi/firmware run: | - # Build as intended for hardware first nix develop --command cargo build --release - nix develop --command cargo build --release --features reporting_postcard - # Build for simulator tests - nix develop --command cargo build --release --features simulator - - - name: In Simulator Tests - working-directory: ./koishi/firmware-tests - run: nix develop --command cargo test - - build-and-test-telemetry-receiver: - name: Build and Test (telemetry-receiver) - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@V27 - - - name: Build - working-directory: ./koishi/firmware - run: nix develop --command cargo build + nix develop --command cargo build --release --features telemetry diff --git a/.github/workflows/satori.yml b/.github/workflows/satori.yml new file mode 100644 index 00000000..6c8fdadc --- /dev/null +++ b/.github/workflows/satori.yml @@ -0,0 +1,47 @@ +--- +name: Satori + +on: + push: + branches: + - main + paths: + - 'flake.*' + - 'satori/**' + pull_request: + paths: + - 'flake.*' + - 'satori/**' + +jobs: + formatting-firmware: + name: Formatting + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./satori/firmware + + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@V27 + + - run: rustup target add thumbv6m-none-eabi + + - name: Clippy + run: nix develop --command cargo clippy -- -Dwarnings + + build-and-test-firmware: + name: Build and Test + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@V27 + + - run: rustup target add thumbv6m-none-eabi + + - name: Build + working-directory: ./satori/firmware + run: | + nix develop --command cargo build --release + nix develop --command cargo build --release --features panic-probe diff --git a/koishi/telemetry-receiver/Cargo.lock b/common/Cargo.lock similarity index 61% rename from koishi/telemetry-receiver/Cargo.lock rename to common/Cargo.lock index 127576bd..d526cf6c 100644 --- a/koishi/telemetry-receiver/Cargo.lock +++ b/common/Cargo.lock @@ -2,80 +2,59 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "CoreFoundation-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e9889e6db118d49d88d84728d0e964d973a5680befb5f85f55141beea5c20b" -dependencies = [ - "libc", - "mach", -] - -[[package]] -name = "IOKit-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99696c398cbaf669d2368076bdb3d627fb0ce51a26899d7c61228c5c0af3bf4a" -dependencies = [ - "CoreFoundation-sys", - "libc", - "mach", -] - [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys", @@ -89,15 +68,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.0.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487f1e0fcbe47deb8b0574e646def1c903389d95241dd1bbcc6ce4a715dfc0c1" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] -name = "cc" -version = "1.0.79" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cfg-if" @@ -107,20 +86,19 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.3.18" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b6396aa128fe4149d2af114f746eb048b5667e2844cc51ae90830f45de7ccb" +checksum = "a9689a29b593160de5bc4aacab7b5d54fb52231de70122626c178e6a368994c7" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.18" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d011140df54d9c4c592974ccd7d694dd4ab5b92ea0436435fa900a211d6b0f6" +checksum = "2e5387378c84f6faa26890ebf9f0a92989f8873d4d380467bcd0d8d8620424df" dependencies = [ "anstream", "anstyle", @@ -130,21 +108,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.12" +version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.27", + "syn", ] [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "cobs" @@ -154,15 +132,21 @@ checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "darling" -version = "0.20.3" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -170,28 +154,34 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "syn 2.0.27", + "syn", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.27", + "syn", ] +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + [[package]] name = "enumset" version = "1.1.3" @@ -211,28 +201,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.27", -] - -[[package]] -name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", + "syn", ] [[package]] @@ -243,90 +212,82 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "git-version" -version = "0.3.5" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" dependencies = [ "git-version-macro", - "proc-macro-hack", ] [[package]] name = "git-version-macro" -version = "0.3.5" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ - "proc-macro-hack", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "ident_case" -version = "1.0.1" +name = "hash32" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] [[package]] -name = "io-lifetimes" -version = "1.0.11" +name = "heapless" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ - "hermit-abi", - "libc", - "windows-sys", + "hash32", + "serde", + "stable_deref_trait", ] [[package]] -name = "is-terminal" -version = "0.4.7" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" -dependencies = [ - "hermit-abi", - "io-lifetimes", - "rustix", - "windows-sys", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "koishi-telemetry-protocol" +name = "hoshiguma-foundational-data" version = "0.1.0" dependencies = [ "enumset", + "heapless", "postcard", "serde", ] [[package]] -name = "koishi-telemetry-receiver" -version = "0.1.0" +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" dependencies = [ - "clap", - "git-version", - "koishi-telemetry-protocol", - "postcard", - "serde", - "serialport", - "tracing", - "tracing-subscriber", + "core-foundation-sys", + "mach2", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "lazy_static" version = "1.4.0" @@ -335,9 +296,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libudev" @@ -359,52 +320,36 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - [[package]] name = "log" -version = "0.4.19" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" - -[[package]] -name = "mach" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd13ee2dd61cc82833ba05ade5a30bb3d63f7ced605ef827063c63078302de9" -dependencies = [ - "libc", -] +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "mach2" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "nix" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "static_assertions", ] [[package]] @@ -419,9 +364,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "overload" @@ -431,55 +376,50 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "postcard" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ee729232311d3cd113749948b689627618133b1c5012b77342c1950b25eaeb" +checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" dependencies = [ "cobs", + "embedded-io", "serde", ] -[[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.66" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.31" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] [[package]] name = "regex" -version = "1.9.1" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -489,9 +429,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -500,23 +440,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - -[[package]] -name = "rustix" -version = "0.37.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4eb579851244c2c03e7c24f501c3432bed80b8f720af1d6e5b0e0f01555a035" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys", -] +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "scopeguard" @@ -526,74 +452,75 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.174" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b88756493a5bd5e5395d53baa70b194b05764ab85b59e43e4b8f4e1192fa9b1" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.174" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5c3a298c7f978e53536f95a63bdc4c4a64550582f31a0359a9afda6aede62e" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn", ] [[package]] name = "serialport" -version = "4.2.1" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353dc2cbfc67c9a14a89a1292a9d8e819bd51066b083e08c1974ba08e3f48c62" +checksum = "8f5a15d0be940df84846264b09b51b10b931fb2f275becb80934e3568a016828" dependencies = [ - "CoreFoundation-sys", - "IOKit-sys", - "bitflags 2.0.2", + "bitflags 2.5.0", "cfg-if", + "core-foundation-sys", + "io-kit-sys", "libudev", "mach2", "nix", "regex", "scopeguard", + "unescaper", "winapi", ] [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[package]] name = "smallvec" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] -name = "static_assertions" -version = "1.1.0" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -601,21 +528,44 @@ dependencies = [ ] [[package]] -name = "syn" -version = "2.0.27" +name = "telemetry-receiver" +version = "0.1.0" +dependencies = [ + "clap", + "git-version", + "hoshiguma-foundational-data", + "postcard", + "serde", + "serialport", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "thiserror" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "unicode-ident", + "syn", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -623,11 +573,10 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -635,20 +584,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -656,20 +605,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -679,17 +628,26 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "unescaper" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0adf6ad32eb5b3cadff915f7b770faaac8f7ff0476633aa29eb0d9584d889d34" +dependencies = [ + "thiserror", +] + [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" @@ -721,22 +679,23 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -745,42 +704,48 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" diff --git a/common/Cargo.toml b/common/Cargo.toml new file mode 100644 index 00000000..4b9234fe --- /dev/null +++ b/common/Cargo.toml @@ -0,0 +1,15 @@ +[workspace] +resolver = "2" +members = [ + "foundational-data", + "telemetry-receiver", +] + +[workspace.package] +license = "MIT" +version = "0.1.0" +edition = "2021" + +[workspace.dependencies] +postcard = { version = "1.0.6", default-features = false } +serde = { version = "1.0.174", default-features = false, features = ["derive"] } diff --git a/common/foundational-data/Cargo.toml b/common/foundational-data/Cargo.toml new file mode 100644 index 00000000..a2d6a7c6 --- /dev/null +++ b/common/foundational-data/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "hoshiguma-foundational-data" +version.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +enumset = { version = "1.1.3", features = ["serde"] } +heapless = { version = "0.8.0", features = ["serde"] } +postcard.workspace = true +serde.workspace = true + +[features] +default = ["std"] +std = ["serde/std", "postcard/use-std"] diff --git a/common/foundational-data/src/koishi.rs b/common/foundational-data/src/koishi.rs new file mode 100644 index 00000000..9f738a41 --- /dev/null +++ b/common/foundational-data/src/koishi.rs @@ -0,0 +1,130 @@ +use crate::TimeMillis; +use enumset::{EnumSet, EnumSetType}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub enum Payload { + InputsChanged(Inputs), + OutputsChanged(Outputs), + + MachineStatusChanged(MachineStatus), + AirAssistStatusChanged(AirAssistStatus), + ExtractionStatusChanged(ExtractionStatus), +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct Inputs { + pub doors_closed: bool, + pub external_enable: bool, + pub machine_running: bool, + pub air_pump_demand: bool, + pub extraction_mode: ExtractionMode, +} + +impl From<&Inputs> for Payload { + fn from(value: &Inputs) -> Self { + Self::InputsChanged(value.clone()) + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub enum ExtractionMode { + Normal, + Run, +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct Outputs { + pub controller_machine_alarm: AlarmState, + pub controller_cooling_alarm: AlarmState, + pub laser_enable: bool, + pub status_light: StatusLight, + pub air_pump: bool, + pub extractor_fan: bool, +} + +impl From<&Outputs> for Payload { + fn from(value: &Outputs) -> Self { + Self::OutputsChanged(value.clone()) + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub enum AlarmState { + Normal, + Alarm, +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub enum StatusLight { + Green, + Amber, + Red, +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub enum MachineStatus { + /// The machine is currently running a job. + Running, + + /// The machine is not running, but is ready to run a job. + Idle, + + /// The machine is not running, and cannot run for some reason. + Problem(EnumSet), +} + +impl From<&MachineStatus> for Payload { + fn from(value: &MachineStatus) -> Self { + Self::MachineStatusChanged(value.clone()) + } +} + +#[derive(Debug, Serialize, Deserialize, EnumSetType)] +pub enum MachineProblem { + /// Any door to a protected area is open. + DoorOpen, + + /// An external controller has indicated a fault condition. + External, +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct AirAssistStatus { + pub state: run_on_delay::RunOnDelay, +} + +impl From<&AirAssistStatus> for Payload { + fn from(value: &AirAssistStatus) -> Self { + Self::AirAssistStatusChanged(value.clone()) + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct ExtractionStatus { + pub state: run_on_delay::RunOnDelay, + pub r#override: bool, +} + +impl From<&ExtractionStatus> for Payload { + fn from(value: &ExtractionStatus) -> Self { + Self::ExtractionStatusChanged(value.clone()) + } +} + +pub mod run_on_delay { + use serde::{Deserialize, Serialize}; + + #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] + pub struct RunOnDelay { + pub delay: T, + pub state: State, + } + + #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] + pub enum State { + Demand, + RunOn { end: T }, + Idle, + } +} diff --git a/common/foundational-data/src/lib.rs b/common/foundational-data/src/lib.rs new file mode 100644 index 00000000..25185ad8 --- /dev/null +++ b/common/foundational-data/src/lib.rs @@ -0,0 +1,57 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +pub mod koishi; +pub mod satori; + +use serde::{Deserialize, Serialize}; + +#[cfg(feature = "std")] +pub type String = std::string::String; +#[cfg(not(feature = "std"))] +pub type String = heapless::String<64>; + +pub type TimeMillis = u32; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[allow(dead_code)] +pub struct Message { + pub time: TimeMillis, + pub iteration_id: Option, + pub payload: Payload

, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub enum Payload

{ + Boot(Boot), + Panic(Panic), + Application(P), +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[allow(dead_code)] +pub struct Boot { + pub name: String, + pub git_revision: String, +} + +#[derive(Debug, Default, Serialize, Deserialize, Clone)] +#[allow(dead_code)] +pub struct Panic { + pub file: Option, + pub line: Option, + pub column: Option, +} + +impl From<&core::panic::PanicInfo<'_>> for Panic { + fn from(info: &core::panic::PanicInfo) -> Self { + match info.location() { + None => Panic::default(), + Some(loc) => Self { + #[allow(clippy::unnecessary_fallible_conversions)] + file: loc.file().try_into().ok(), + line: Some(loc.line()), + column: Some(loc.column()), + }, + } + } +} diff --git a/common/foundational-data/src/satori.rs b/common/foundational-data/src/satori.rs new file mode 100644 index 00000000..ee4a1978 --- /dev/null +++ b/common/foundational-data/src/satori.rs @@ -0,0 +1,96 @@ +use serde::{Deserialize, Serialize}; + +#[cfg(feature = "std")] +pub type Vec = std::vec::Vec; +#[cfg(not(feature = "std"))] +pub type Vec = heapless::Vec; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub enum Payload { + StateChanged(Status), +} + +pub type PotentialMachineProblems = Vec; +pub type MachineProblems = Vec; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Status { + pub observed: ObservedState, + pub potential_problems: PotentialMachineProblems, + pub problems: MachineProblems, +} + +impl From<&Status> for Payload { + fn from(value: &Status) -> Self { + Self::StateChanged(value.clone()) + } +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct ObservedState { + pub temperature: Temperatures, + + pub coolant_level: Option, + + pub coolant_pump_rpm: f32, + + pub coolant_flow_rate: f32, +} + +#[derive(Debug, Default, Serialize, Deserialize, Clone)] +pub struct Temperatures { + pub coolant_flow: Option, + pub coolant_return: Option, + + pub coolant_resevoir_upper: Option, + pub coolant_resevoir_lower: Option, + + pub coolant_pump: Option, + + pub room_ambient: Option, + pub laser_bay: Option, + pub electronics_bay: Option, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub enum CoolantLevel { + Full, + Low, + CriticallyLow, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MachineProblem { + pub kind: ProblemKind, + pub severity: ProblemSeverity, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum ProblemSeverity { + Warning, + Critical, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PotentialMachineProblem { + pub problem: MachineProblem, + pub since: super::TimeMillis, +} + +#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)] +pub enum ProblemKind { + CoolantLevelSensorFault, + CoolantLevelInsufficient, + + CoolantFlowRateSensorFault, + CoolantFlowRateInsufficient, + + CoolantPumpSpeedSensorFault, + CoolantPumpSpeedOutOfSpec, + + TemperatureSensorFault, + CoolantFlowOvertemperature, + CoolantReturnOvertemperature, + ElectronicsBayOvertemperature, + LaserBayOvertemperature, +} diff --git a/koishi/firmware-tests/rust-toolchain.toml b/common/rust-toolchain.toml similarity index 100% rename from koishi/firmware-tests/rust-toolchain.toml rename to common/rust-toolchain.toml diff --git a/common/telemetry-receiver/Cargo.toml b/common/telemetry-receiver/Cargo.toml new file mode 100644 index 00000000..41b66762 --- /dev/null +++ b/common/telemetry-receiver/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "telemetry-receiver" +version.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +clap = { version = "4.3.18", features = ["derive"] } +git-version = "0.3.5" +postcard = { workspace = true, features = ["use-std"] } +serde.workspace = true +serialport = "4.2.1" +hoshiguma-foundational-data = { path = "../foundational-data" } +tracing = "0.1.37" +tracing-subscriber = "0.3.17" diff --git a/common/telemetry-receiver/src/main.rs b/common/telemetry-receiver/src/main.rs new file mode 100644 index 00000000..877de571 --- /dev/null +++ b/common/telemetry-receiver/src/main.rs @@ -0,0 +1,101 @@ +use clap::{Parser, Subcommand}; +use hoshiguma_foundational_data::{ + koishi::Payload as KoishiPayload, satori::Payload as SatoriPayload, Boot, Message, Payload, +}; +use std::{io::Read, time::Duration}; +use tracing::{debug, error, info, warn}; + +/// Tool to receive data from coprocessors via the postcard protocol. +#[derive(Parser)] +struct Cli { + /// Serial port + #[arg(short, long)] + port: String, + + /// Serial baud rate + #[arg(short, long, default_value = "57600")] + baud: u32, + + #[command(subcommand)] + payload_kind: PayloadKind, +} + +#[derive(Subcommand)] +enum PayloadKind { + Satori, + Koishi, +} + +fn main() { + tracing_subscriber::fmt::init(); + + let cli = Cli::parse(); + + let port = serialport::new(cli.port, cli.baud) + .timeout(Duration::from_millis(10)) + .open(); + + match port { + Ok(port) => { + let mut rx_buffer: Vec = vec![]; + + for b in port.bytes().flatten() { + rx_buffer.push(b); + + if b == 0 { + debug!("Received {} bytes: {:?}", rx_buffer.len(), rx_buffer); + + if let Some(msg) = match cli.payload_kind { + PayloadKind::Koishi => { + try_parse_payload::(rx_buffer.to_vec()) + } + PayloadKind::Satori => { + try_parse_payload::(rx_buffer.to_vec()) + } + } { + info!("Received:\n{:#?}", msg); + } + + rx_buffer.clear(); + } + } + } + Err(e) => { + error!("Failed to open port: {}", e); + ::std::process::exit(1); + } + } +} + +fn try_parse_payload< + P: for<'de> serde::de::Deserialize<'de> + std::fmt::Debug + Clone + 'static, +>( + mut rx_buffer: Vec, +) -> Option> { + debug!("Receive buffer: {:?} (len {})", rx_buffer, rx_buffer.len()); + + match postcard::from_bytes_cobs::>(&mut rx_buffer) { + Ok(msg) => { + if let Payload::Boot(ref msg) = msg.payload { + check_firmware_version(msg); + } + Some(Box::new(msg)) + } + Err(e) => { + warn!("Failed to parse message: {e}"); + None + } + } +} + +fn check_firmware_version(msg: &Boot) { + let our_version = git_version::git_version!(); + let their_version = &msg.git_revision; + + debug!("Host Git revision: {}", our_version); + debug!("Device Git revision: {}", their_version); + + if our_version != their_version { + warn!("Git revisions do not match between host and device, this program may not read data correctly from the device!"); + } +} diff --git a/flake.lock b/flake.lock index b3c076e2..a4e9efd1 100644 --- a/flake.lock +++ b/flake.lock @@ -33,10 +33,26 @@ "type": "github" } }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1718815430, + "narHash": "sha256-8F/0WhN2JQn/U+2ZAVgIxNABQilz//znSAztxIYPdlE=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d62d2c6b491b8d59c43949eb02b8d44f657ff17d", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "nixpkgs-unstable": "nixpkgs-unstable" } }, "systems": { diff --git a/flake.nix b/flake.nix index 1065b6af..2d1c27bd 100644 --- a/flake.nix +++ b/flake.nix @@ -1,16 +1,19 @@ { inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; + nixpkgs-unstable.url = "github:nixos/nixpkgs"; }; outputs = { self, nixpkgs, + nixpkgs-unstable, flake-utils, }: flake-utils.lib.eachDefaultSystem ( system: let pkgs = import nixpkgs {inherit system;}; + pkgs-unstable = import nixpkgs-unstable {inherit system;}; in { devShell = pkgs.mkShell { packages = with pkgs; [ @@ -21,7 +24,7 @@ rustfmt # Common - rustup + pkgs-unstable.rustup pkg-config # koishi firmware @@ -29,12 +32,11 @@ ravedude pkgsCross.avr.buildPackages.gcc - # koishi firmware in-simulator tests - clang - libelf - zlib + # satori firmware + flip-link + probe-rs - # koishi telemetry receiver demo + # telemetry receiver systemd ]; diff --git a/koishi/firmware-tests/Cargo.lock b/koishi/firmware-tests/Cargo.lock deleted file mode 100644 index 509729d3..00000000 --- a/koishi/firmware-tests/Cargo.lock +++ /dev/null @@ -1,444 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "anyhow" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" - -[[package]] -name = "avr-simulator" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1fbb7d9bc9b4acb24ee297b67bce267b36e719e81867a25f98cee68ca508bae" -dependencies = [ - "libc", - "simavr-ffi", -] - -[[package]] -name = "avr-tester" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a4af741d3f6ab53edc5d383627eadf53d3a5af8c71253ca64396de6f2502533" -dependencies = [ - "avr-simulator", -] - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn", - "which", -] - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "either" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "koishi-tests" -version = "0.1.0" -dependencies = [ - "avr-tester", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libloading" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" -dependencies = [ - "cfg-if", - "windows-targets", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn", -] - -[[package]] -name = "proc-macro2" -version = "1.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "regex" -version = "1.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[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 = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "simavr-ffi" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883987e7a162f90bf254e4b3bf73948bbe2eb339d60f3ad75ae20d0cc103ada6" -dependencies = [ - "anyhow", - "bindgen", - "fs_extra", - "pkg-config", - "walkdir", -] - -[[package]] -name = "syn" -version = "2.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[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 = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" diff --git a/koishi/firmware-tests/Cargo.toml b/koishi/firmware-tests/Cargo.toml deleted file mode 100644 index 0bf36130..00000000 --- a/koishi/firmware-tests/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "koishi-tests" -version = "0.1.0" -edition = "2021" - -[dependencies] -avr-tester = "0.2" diff --git a/koishi/firmware-tests/src/devices/inputs.rs b/koishi/firmware-tests/src/devices/inputs.rs deleted file mode 100644 index c5fae80f..00000000 --- a/koishi/firmware-tests/src/devices/inputs.rs +++ /dev/null @@ -1,34 +0,0 @@ -#[macro_export] -macro_rules! door_interlock { - ($avr:expr) => { - $crate::input1!($avr) - }; -} - -#[macro_export] -macro_rules! extractor_override { - ($avr:expr) => { - $crate::input2!($avr) - }; -} - -#[macro_export] -macro_rules! machine_status { - ($avr:expr) => { - $crate::input4!($avr) - }; -} - -#[macro_export] -macro_rules! air_assist_demand { - ($avr:expr) => { - $crate::input5!($avr) - }; -} - -#[macro_export] -macro_rules! external_enable { - ($avr:expr) => { - $crate::input6!($avr) - }; -} diff --git a/koishi/firmware-tests/src/devices/mod.rs b/koishi/firmware-tests/src/devices/mod.rs deleted file mode 100644 index a78fc817..00000000 --- a/koishi/firmware-tests/src/devices/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod inputs; -mod relays; diff --git a/koishi/firmware-tests/src/devices/relays.rs b/koishi/firmware-tests/src/devices/relays.rs deleted file mode 100644 index 67db73d8..00000000 --- a/koishi/firmware-tests/src/devices/relays.rs +++ /dev/null @@ -1,72 +0,0 @@ -#[macro_export] -macro_rules! status_lamp_1 { - ($avr:expr) => { - $crate::relay8!($avr) - }; -} - -#[macro_export] -macro_rules! status_lamp_2 { - ($avr:expr) => { - $crate::relay7!($avr) - }; -} - -#[macro_export] -macro_rules! status_lamp_assert_red { - ($avr:expr) => { - $crate::relay_assert_open!($crate::status_lamp_1!($avr)); - $crate::relay_assert_open!($crate::status_lamp_2!($avr)); - }; -} - -#[macro_export] -macro_rules! status_lamp_assert_amber { - ($avr:expr) => { - $crate::relay_assert_open!($crate::status_lamp_1!($avr)); - $crate::relay_assert_closed!($crate::status_lamp_2!($avr)); - }; -} - -#[macro_export] -macro_rules! status_lamp_assert_green { - ($avr:expr) => { - $crate::relay_assert_closed!($crate::status_lamp_1!($avr)); - $crate::relay_assert_open!($crate::status_lamp_2!($avr)); - }; -} - -#[macro_export] -macro_rules! controller_door_interlock { - ($avr:expr) => { - $crate::relay6!($avr) - }; -} - -#[macro_export] -macro_rules! controller_cooling_interlock { - ($avr:expr) => { - $crate::relay5!($avr) - }; -} - -#[macro_export] -macro_rules! laser_enable { - ($avr:expr) => { - $crate::relay4!($avr) - }; -} - -#[macro_export] -macro_rules! fume_extractor { - ($avr:expr) => { - $crate::relay2!($avr) - }; -} - -#[macro_export] -macro_rules! air_assist_compressor { - ($avr:expr) => { - $crate::relay1!($avr) - }; -} diff --git a/koishi/firmware-tests/src/lib.rs b/koishi/firmware-tests/src/lib.rs deleted file mode 100644 index 8dc1f680..00000000 --- a/koishi/firmware-tests/src/lib.rs +++ /dev/null @@ -1,13 +0,0 @@ -mod devices; -mod pins; -mod tests; - -#[cfg(test)] -use avr_tester::*; - -#[cfg(test)] -fn avr() -> AvrTester { - AvrTester::atmega328p() - .with_clock_of_8_mhz() - .load("../firmware/target/avr-atmega328p/release/koishi.elf") -} diff --git a/koishi/firmware-tests/src/pins/inputs.rs b/koishi/firmware-tests/src/pins/inputs.rs deleted file mode 100644 index df0f55e0..00000000 --- a/koishi/firmware-tests/src/pins/inputs.rs +++ /dev/null @@ -1,41 +0,0 @@ -#[macro_export] -macro_rules! input1 { - ($avr:expr) => { - $avr.pins().pd2() - }; -} - -#[macro_export] -macro_rules! input2 { - ($avr:expr) => { - $avr.pins().pd3() - }; -} - -#[macro_export] -macro_rules! input3 { - ($avr:expr) => { - $avr.pins().pd4() - }; -} - -#[macro_export] -macro_rules! input4 { - ($avr:expr) => { - $avr.pins().pd5() - }; -} - -#[macro_export] -macro_rules! input5 { - ($avr:expr) => { - $avr.pins().pd6() - }; -} - -#[macro_export] -macro_rules! input6 { - ($avr:expr) => { - $avr.pins().pd7() - }; -} diff --git a/koishi/firmware-tests/src/pins/mod.rs b/koishi/firmware-tests/src/pins/mod.rs deleted file mode 100644 index a78fc817..00000000 --- a/koishi/firmware-tests/src/pins/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod inputs; -mod relays; diff --git a/koishi/firmware-tests/src/pins/relays.rs b/koishi/firmware-tests/src/pins/relays.rs deleted file mode 100644 index 80c1ed66..00000000 --- a/koishi/firmware-tests/src/pins/relays.rs +++ /dev/null @@ -1,69 +0,0 @@ -#[macro_export] -macro_rules! relay_assert_open { - ($pin:expr) => { - $pin.assert_high() - }; -} - -#[macro_export] -macro_rules! relay_assert_closed { - ($pin:expr) => { - $pin.assert_low() - }; -} - -#[macro_export] -macro_rules! relay1 { - ($avr:expr) => { - $avr.pins().pc3() - }; -} - -#[macro_export] -macro_rules! relay2 { - ($avr:expr) => { - $avr.pins().pc2() - }; -} - -#[macro_export] -macro_rules! relay3 { - ($avr:expr) => { - $avr.pins().pc1() - }; -} - -#[macro_export] -macro_rules! relay4 { - ($avr:expr) => { - $avr.pins().pc0() - }; -} - -#[macro_export] -macro_rules! relay5 { - ($avr:expr) => { - $avr.pins().pb4() - }; -} - -#[macro_export] -macro_rules! relay6 { - ($avr:expr) => { - $avr.pins().pb3() - }; -} - -#[macro_export] -macro_rules! relay7 { - ($avr:expr) => { - $avr.pins().pb2() - }; -} - -#[macro_export] -macro_rules! relay8 { - ($avr:expr) => { - $avr.pins().pb1() - }; -} diff --git a/koishi/firmware-tests/src/tests/cycle.rs b/koishi/firmware-tests/src/tests/cycle.rs deleted file mode 100644 index 451c1822..00000000 --- a/koishi/firmware-tests/src/tests/cycle.rs +++ /dev/null @@ -1,79 +0,0 @@ -#[test] -fn cycle() { - let mut avr = crate::avr(); - - avr.run_for_ms(100); - - crate::door_interlock!(avr).set_high(); - crate::external_enable!(avr).set_high(); - crate::extractor_override!(avr).set_low(); - crate::machine_status!(avr).set_low(); - crate::air_assist_demand!(avr).set_low(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_green!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_open!(crate::fume_extractor!(avr)); - - crate::machine_status!(avr).set_high(); - crate::air_assist_demand!(avr).set_high(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_amber!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_closed!(crate::air_assist_compressor!(avr)); - crate::relay_assert_closed!(crate::fume_extractor!(avr)); - - avr.run_for_ms(300); - - crate::air_assist_demand!(avr).set_low(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_amber!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_closed!(crate::air_assist_compressor!(avr)); - crate::relay_assert_closed!(crate::fume_extractor!(avr)); - - avr.run_for_ms(500); - avr.run_for_ms(10); - - crate::status_lamp_assert_amber!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_closed!(crate::fume_extractor!(avr)); - - avr.run_for_ms(300); - - crate::machine_status!(avr).set_low(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_green!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_closed!(crate::fume_extractor!(avr)); - - avr.run_for_ms(10); - avr.run_for_ms(500); - - crate::status_lamp_assert_green!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_open!(crate::fume_extractor!(avr)); -} diff --git a/koishi/firmware-tests/src/tests/door_open.rs b/koishi/firmware-tests/src/tests/door_open.rs deleted file mode 100644 index d4e8dfed..00000000 --- a/koishi/firmware-tests/src/tests/door_open.rs +++ /dev/null @@ -1,32 +0,0 @@ -#[test] -fn door_open() { - let mut avr = crate::avr(); - - avr.run_for_ms(100); - - crate::door_interlock!(avr).set_low(); - crate::external_enable!(avr).set_high(); - crate::extractor_override!(avr).set_low(); - crate::machine_status!(avr).set_low(); - crate::air_assist_demand!(avr).set_low(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_red!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_open!(crate::controller_door_interlock!(avr)); - crate::relay_assert_open!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_open!(crate::fume_extractor!(avr)); - - crate::door_interlock!(avr).set_high(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_green!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_open!(crate::fume_extractor!(avr)); -} diff --git a/koishi/firmware-tests/src/tests/external_disable.rs b/koishi/firmware-tests/src/tests/external_disable.rs deleted file mode 100644 index 7c5e30a0..00000000 --- a/koishi/firmware-tests/src/tests/external_disable.rs +++ /dev/null @@ -1,32 +0,0 @@ -#[test] -fn external_disable() { - let mut avr = crate::avr(); - - avr.run_for_ms(100); - - crate::door_interlock!(avr).set_high(); - crate::external_enable!(avr).set_low(); - crate::extractor_override!(avr).set_low(); - crate::machine_status!(avr).set_low(); - crate::air_assist_demand!(avr).set_low(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_red!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_open!(crate::controller_door_interlock!(avr)); - crate::relay_assert_open!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_open!(crate::fume_extractor!(avr)); - - crate::external_enable!(avr).set_high(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_green!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_open!(crate::fume_extractor!(avr)); -} diff --git a/koishi/firmware-tests/src/tests/extractor_override.rs b/koishi/firmware-tests/src/tests/extractor_override.rs deleted file mode 100644 index b67e00fe..00000000 --- a/koishi/firmware-tests/src/tests/extractor_override.rs +++ /dev/null @@ -1,32 +0,0 @@ -#[test] -fn extractor_override() { - let mut avr = crate::avr(); - - avr.run_for_ms(100); - - crate::door_interlock!(avr).set_high(); - crate::external_enable!(avr).set_high(); - crate::extractor_override!(avr).set_high(); - crate::machine_status!(avr).set_low(); - crate::air_assist_demand!(avr).set_low(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_green!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_closed!(crate::fume_extractor!(avr)); - - crate::extractor_override!(avr).set_low(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_green!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_open!(crate::fume_extractor!(avr)); -} diff --git a/koishi/firmware-tests/src/tests/good_init.rs b/koishi/firmware-tests/src/tests/good_init.rs deleted file mode 100644 index 48311d50..00000000 --- a/koishi/firmware-tests/src/tests/good_init.rs +++ /dev/null @@ -1,21 +0,0 @@ -#[test] -fn good_init() { - let mut avr = crate::avr(); - - avr.run_for_ms(100); - - crate::door_interlock!(avr).set_high(); - crate::external_enable!(avr).set_high(); - crate::extractor_override!(avr).set_low(); - crate::machine_status!(avr).set_low(); - crate::air_assist_demand!(avr).set_low(); - - avr.run_for_ms(10); - - crate::status_lamp_assert_green!(avr); - crate::relay_assert_closed!(crate::controller_cooling_interlock!(avr)); - crate::relay_assert_closed!(crate::controller_door_interlock!(avr)); - crate::relay_assert_closed!(crate::laser_enable!(avr)); - crate::relay_assert_open!(crate::air_assist_compressor!(avr)); - crate::relay_assert_open!(crate::fume_extractor!(avr)); -} diff --git a/koishi/firmware-tests/src/tests/mod.rs b/koishi/firmware-tests/src/tests/mod.rs deleted file mode 100644 index ae481f98..00000000 --- a/koishi/firmware-tests/src/tests/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod cycle; -mod door_open; -mod external_disable; -mod extractor_override; -mod good_init; diff --git a/koishi/firmware/Cargo.lock b/koishi/firmware/Cargo.lock index 5f3bffbc..31c8c5ee 100644 --- a/koishi/firmware/Cargo.lock +++ b/koishi/firmware/Cargo.lock @@ -5,7 +5,7 @@ version = 3 [[package]] name = "atmega-hal" version = "0.1.0" -source = "git+https://github.com/rahix/avr-hal?rev=4c9c44c314eb061ee20556ef10d45dea36e75ee4#4c9c44c314eb061ee20556ef10d45dea36e75ee4" +source = "git+https://github.com/rahix/avr-hal?rev=38549cc4142881d302374535b3621578ffccaff2#38549cc4142881d302374535b3621578ffccaff2" dependencies = [ "avr-device", "avr-hal-generic", @@ -28,9 +28,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "avr-device" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644690f9699830f0efce38ca9d41c7ad51a6ec1829364dd272638938c953673a" +checksum = "546b09da5e933d18b790ccb5aae351371c6c4f8094a7b011dcd7c7e7fb69cc94" dependencies = [ "avr-device-macros", "bare-metal", @@ -40,9 +40,9 @@ dependencies = [ [[package]] name = "avr-device-macros" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba8b49941a5148cec432d5180d205871f0132f9f15b7225a9f3ad9e2bae026cb" +checksum = "6b108541dc1ea060dfa9b824acbded94f658f8daecca549144d05a4d01e65b6f" dependencies = [ "proc-macro2", "quote", @@ -52,17 +52,19 @@ dependencies = [ [[package]] name = "avr-hal-generic" version = "0.1.0" -source = "git+https://github.com/rahix/avr-hal?rev=4c9c44c314eb061ee20556ef10d45dea36e75ee4#4c9c44c314eb061ee20556ef10d45dea36e75ee4" +source = "git+https://github.com/rahix/avr-hal?rev=38549cc4142881d302374535b3621578ffccaff2#38549cc4142881d302374535b3621578ffccaff2" dependencies = [ "avr-device", "cfg-if 0.1.10", - "embedded-hal", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-bus", "embedded-storage", - "nb 0.1.3", + "nb 1.1.0", "paste", "rustversion", - "ufmt", - "void", + "ufmt 0.2.0", + "unwrap-infallible", ] [[package]] @@ -121,7 +123,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -132,7 +134,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -145,6 +147,22 @@ dependencies = [ "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-bus" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b4e6ede84339ebdb418cd986e6320a34b017cdf99b5cc3efceec6450b06886" +dependencies = [ + "critical-section", + "embedded-hal 1.0.0", +] + [[package]] name = "embedded-storage" version = "0.2.0" @@ -170,7 +188,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -181,24 +199,22 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "git-version" -version = "0.3.5" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" dependencies = [ "git-version-macro", - "proc-macro-hack", ] [[package]] name = "git-version-macro" -version = "0.3.5" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ - "proc-macro-hack", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.32", ] [[package]] @@ -210,6 +226,15 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + [[package]] name = "heapless" version = "0.7.16" @@ -217,13 +242,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" dependencies = [ "atomic-polyfill", - "hash32", + "hash32 0.2.1", "rustc_version", "serde", "spin", "stable_deref_trait", ] +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32 0.3.1", + "serde", + "stable_deref_trait", +] + +[[package]] +name = "hoshiguma-foundational-data" +version = "0.1.0" +dependencies = [ + "enumset", + "heapless 0.8.0", + "postcard", + "serde", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -237,14 +283,15 @@ dependencies = [ "atmega-hal", "avr-device", "avr-hal-generic", - "embedded-hal", + "embedded-hal 0.2.7", "enumset", "git-version", - "heapless", + "heapless 0.8.0", + "hoshiguma-foundational-data", "nb 0.1.3", "postcard", "serde", - "ufmt", + "ufmt 0.1.2", ] [[package]] @@ -280,12 +327,12 @@ checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "postcard" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ee729232311d3cd113749948b689627618133b1c5012b77342c1950b25eaeb" +checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" dependencies = [ "cobs", - "heapless", + "heapless 0.7.16", "serde", ] @@ -342,22 +389,22 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.171" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.171" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -388,9 +435,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.26" +version = "2.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" dependencies = [ "proc-macro2", "quote", @@ -404,7 +451,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31d3c0c63312dfc9d8e5c71114d617018a19f6058674003c0da29ee8d8036cdd" dependencies = [ "proc-macro-hack", - "ufmt-macros", + "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", ] @@ -420,6 +477,17 @@ dependencies = [ "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" @@ -432,6 +500,12 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +[[package]] +name = "unwrap-infallible" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "151ac09978d3c2862c4e39b557f4eceee2cc72150bc4cb4f16abf061b6e381fb" + [[package]] name = "vcell" version = "0.1.3" diff --git a/koishi/firmware/Cargo.toml b/koishi/firmware/Cargo.toml index 2cbf31f1..93c15d5e 100644 --- a/koishi/firmware/Cargo.toml +++ b/koishi/firmware/Cargo.toml @@ -6,9 +6,9 @@ edition = "2021" license = "MIT OR Apache-2.0" [features] -reporting_postcard = ["dep:postcard"] +default = ["telemetry"] +telemetry = ["dep:postcard"] devkit = [] -simulator = [] [[bin]] name = "koishi" @@ -16,15 +16,16 @@ test = false bench = false [dependencies] -atmega-hal = { git = "https://github.com/rahix/avr-hal", rev = "4c9c44c314eb061ee20556ef10d45dea36e75ee4", features = ["atmega328p"] } -avr-device = { version = "0.5.1", features = ["rt", "atmega328p"] } -avr-hal-generic = { git = "https://github.com/rahix/avr-hal", rev = "4c9c44c314eb061ee20556ef10d45dea36e75ee4" } +atmega-hal = { git = "https://github.com/rahix/avr-hal", rev = "38549cc4142881d302374535b3621578ffccaff2", features = ["atmega328p"] } +avr-device = { version = "0.5.4", features = ["rt", "atmega328p"] } +avr-hal-generic = { git = "https://github.com/rahix/avr-hal", rev = "38549cc4142881d302374535b3621578ffccaff2" } embedded-hal = "0.2.3" enumset = { version = "1.1.3", features = ["serde"] } -git-version = "0.3.5" -heapless = { version = "0.7.16", features = ["serde"] } +git-version = "0.3.9" +heapless = { version = "0.8.0", features = ["serde"] } +hoshiguma-foundational-data = { path = "../../common/foundational-data", default-features = false } nb = "0.1.2" -postcard = { version = "1.0.6", optional = true } +postcard = { version = "1.0.8", optional = true } serde = { version = "1.0.171", default-features = false, features = ["derive"] } ufmt = "0.1.0" diff --git a/koishi/firmware/rust-toolchain.toml b/koishi/firmware/rust-toolchain.toml index 493e2a3a..8a6582fc 100644 --- a/koishi/firmware/rust-toolchain.toml +++ b/koishi/firmware/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "nightly-2023-07-16" -components = ["rust-src", "clippy", "rustfmt", "rust-analyzer"] +channel = "nightly-2024-06-19" +components = ["rust-src", "clippy", "rust-analyzer"] profile = "minimal" diff --git a/koishi/firmware/src/hal/pins.rs b/koishi/firmware/src/hal/pins.rs index 5f211125..96faff0c 100644 --- a/koishi/firmware/src/hal/pins.rs +++ b/koishi/firmware/src/hal/pins.rs @@ -1,9 +1,7 @@ use atmega_hal::port::Pin; avr_hal_generic::renamed_pins! { - type Pin = Pin; - - pub struct Pins from atmega_hal::Pins { + pub struct Pins { pub relay1: atmega_hal::port::PC3 = pc3, /// A3 pub relay2: atmega_hal::port::PC2 = pc2, /// A2 pub relay3: atmega_hal::port::PC1 = pc1, /// A1 @@ -27,4 +25,9 @@ avr_hal_generic::renamed_pins! { pub d8: atmega_hal::port::PB0 = pb0, pub d13: atmega_hal::port::PB5 = pb5, } + + impl Pins { + type Pin = Pin; + type McuPins = atmega_hal::Pins; + } } diff --git a/koishi/firmware/src/io/inputs/gpio_debug.rs b/koishi/firmware/src/io/inputs/gpio_debug.rs index 123972b5..39219853 100644 --- a/koishi/firmware/src/io/inputs/gpio_debug.rs +++ b/koishi/firmware/src/io/inputs/gpio_debug.rs @@ -1,7 +1,9 @@ -use super::{ExtractionMode, Inputs, ReadInputs}; +use super::ReadInputs; use crate::unwrap_simple::UnwrapSimple; use embedded_hal::digital::v2::InputPin; +use hoshiguma_foundational_data::koishi::{ExtractionMode, Inputs}; +#[allow(dead_code)] pub(crate) struct GpioDebugInputs { pub door_switches: A, pub external_enable: B, diff --git a/koishi/firmware/src/io/inputs/gpio_isolated.rs b/koishi/firmware/src/io/inputs/gpio_isolated.rs index f25bc185..8946cc34 100644 --- a/koishi/firmware/src/io/inputs/gpio_isolated.rs +++ b/koishi/firmware/src/io/inputs/gpio_isolated.rs @@ -1,7 +1,9 @@ -use super::{ExtractionMode, Inputs, ReadInputs}; +use super::ReadInputs; use crate::unwrap_simple::UnwrapSimple; use embedded_hal::digital::v2::InputPin; +use hoshiguma_foundational_data::koishi::{ExtractionMode, Inputs}; +#[allow(dead_code)] pub(crate) struct GpioIsolatedInputs< A: InputPin, B: InputPin, diff --git a/koishi/firmware/src/io/inputs/mod.rs b/koishi/firmware/src/io/inputs/mod.rs index 8b0a3b99..ee5ae350 100644 --- a/koishi/firmware/src/io/inputs/mod.rs +++ b/koishi/firmware/src/io/inputs/mod.rs @@ -1,25 +1,7 @@ pub(crate) mod gpio_debug; pub(crate) mod gpio_isolated; -use serde::Serialize; -use ufmt::derive::uDebug; - -#[derive(Clone, uDebug, Serialize, PartialEq)] -pub(crate) enum ExtractionMode { - Normal, - Run, -} - -#[derive(Clone, uDebug, Serialize, PartialEq)] -pub(crate) struct Inputs { - pub doors_closed: bool, - pub external_enable: bool, - - pub machine_running: bool, - pub air_pump_demand: bool, - - pub extraction_mode: ExtractionMode, -} +use hoshiguma_foundational_data::koishi::Inputs; pub(crate) trait ReadInputs { fn read(&self) -> Inputs; diff --git a/koishi/firmware/src/io/outputs/gpio_relays.rs b/koishi/firmware/src/io/outputs/gpio_relays.rs index 83378f42..c7952329 100644 --- a/koishi/firmware/src/io/outputs/gpio_relays.rs +++ b/koishi/firmware/src/io/outputs/gpio_relays.rs @@ -1,9 +1,7 @@ use super::{Outputs, WriteOutputs}; -use crate::{ - logic::{AlarmState, StatusLight}, - unwrap_simple::UnwrapSimple, -}; +use crate::unwrap_simple::UnwrapSimple; use embedded_hal::digital::v2::OutputPin; +use hoshiguma_foundational_data::koishi::{AlarmState, StatusLight}; pub(crate) struct GpioRelayOutputs< A: OutputPin, diff --git a/koishi/firmware/src/io/outputs/mod.rs b/koishi/firmware/src/io/outputs/mod.rs index 070cff06..b4bf27ee 100644 --- a/koishi/firmware/src/io/outputs/mod.rs +++ b/koishi/firmware/src/io/outputs/mod.rs @@ -1,24 +1,20 @@ pub(crate) mod gpio_relays; -use crate::logic::{ - air_assist::AirAssistStatus, extraction::ExtractionStatus, machine::MachineStatus, AlarmState, - StatusLight, +use crate::logic::{air_assist::AirAssistStatusExt, extraction::ExtractionStatusExt}; +use hoshiguma_foundational_data::koishi::{ + AirAssistStatus, AlarmState, ExtractionStatus, MachineStatus, Outputs, StatusLight, }; -use serde::Serialize; -use ufmt::derive::uDebug; -#[derive(Clone, uDebug, Serialize, PartialEq)] -pub(crate) struct Outputs { - pub controller_machine_alarm: AlarmState, - pub controller_cooling_alarm: AlarmState, - pub laser_enable: bool, - pub status_light: StatusLight, - pub air_pump: bool, - pub extractor_fan: bool, +pub(crate) trait OutputsExt { + fn new( + machine: &MachineStatus, + extraction: &ExtractionStatus, + air_assist: &AirAssistStatus, + ) -> Self; } -impl Outputs { - pub(crate) fn new( +impl OutputsExt for Outputs { + fn new( machine: &MachineStatus, extraction: &ExtractionStatus, air_assist: &AirAssistStatus, diff --git a/koishi/firmware/src/logic/air_assist.rs b/koishi/firmware/src/logic/air_assist.rs index 4b886c5e..54242c5c 100644 --- a/koishi/firmware/src/logic/air_assist.rs +++ b/koishi/firmware/src/logic/air_assist.rs @@ -1,20 +1,23 @@ -use crate::{hal::TimeMillis, io::inputs::Inputs, logic::run_on_delay::RunOnDelay}; -use serde::Serialize; -use ufmt::derive::uDebug; +use crate::{hal::TimeMillis, logic::run_on_delay::RunOnDelayExt}; +use hoshiguma_foundational_data::koishi::{run_on_delay::RunOnDelay, AirAssistStatus, Inputs}; const AIR_ASSIST_RUN_ON_DELAY: TimeMillis = 500; -#[derive(uDebug, Clone, PartialEq, Serialize)] -pub(crate) struct AirAssistStatus { - state: RunOnDelay, +pub(crate) trait AirAssistStatusExt { + fn default() -> Self; + fn active(&self) -> bool; } -impl Default for AirAssistStatus { +impl AirAssistStatusExt for AirAssistStatus { fn default() -> Self { Self { state: RunOnDelay::new(AIR_ASSIST_RUN_ON_DELAY), } } + + fn active(&self) -> bool { + self.state.should_run() + } } impl super::StatusUpdate for AirAssistStatus { @@ -27,9 +30,3 @@ impl super::StatusUpdate for AirAssistStatus { new_state } } - -impl AirAssistStatus { - pub fn active(&self) -> bool { - self.state.should_run() - } -} diff --git a/koishi/firmware/src/logic/extraction.rs b/koishi/firmware/src/logic/extraction.rs index 348050c1..ed5ec7f1 100644 --- a/koishi/firmware/src/logic/extraction.rs +++ b/koishi/firmware/src/logic/extraction.rs @@ -1,31 +1,27 @@ -use crate::{ - hal::TimeMillis, - io::inputs::{ExtractionMode, Inputs}, - logic::run_on_delay::RunOnDelay, +use crate::{hal::TimeMillis, logic::run_on_delay::RunOnDelayExt}; +use hoshiguma_foundational_data::koishi::{ + run_on_delay::RunOnDelay, ExtractionMode, ExtractionStatus, Inputs, }; -use serde::Serialize; -use ufmt::derive::uDebug; -const EXTRACTOR_RUN_ON_DELAY: TimeMillis = if cfg!(feature = "simulator") { - 500 -} else { - // Time in milliseconds that the extractor will continue to run after demand has ceased. - 45_000 -}; +/// Time in milliseconds that the extractor will continue to run after demand has ceased. +const EXTRACTOR_RUN_ON_DELAY: TimeMillis = 45_000; -#[derive(uDebug, Clone, PartialEq, Serialize)] -pub(crate) struct ExtractionStatus { - state: RunOnDelay, - r#override: bool, +pub(crate) trait ExtractionStatusExt { + fn default() -> Self; + fn active(&self) -> bool; } -impl Default for ExtractionStatus { +impl ExtractionStatusExt for ExtractionStatus { fn default() -> Self { Self { state: RunOnDelay::new(EXTRACTOR_RUN_ON_DELAY), r#override: false, } } + + fn active(&self) -> bool { + self.state.should_run() || self.r#override + } } impl super::StatusUpdate for ExtractionStatus { @@ -38,9 +34,3 @@ impl super::StatusUpdate for ExtractionStatus { new_state } } - -impl ExtractionStatus { - pub fn active(&self) -> bool { - self.state.should_run() || self.r#override - } -} diff --git a/koishi/firmware/src/logic/machine.rs b/koishi/firmware/src/logic/machine.rs index a1a064b4..0d7dc265 100644 --- a/koishi/firmware/src/logic/machine.rs +++ b/koishi/firmware/src/logic/machine.rs @@ -1,26 +1,7 @@ use super::StatusUpdate; -use crate::{hal::TimeMillis, io::inputs::Inputs}; -use enumset::{EnumSet, EnumSetType}; -use serde::Serialize; -use ufmt::derive::uDebug; - -#[derive(Clone, PartialEq, Serialize)] -pub(crate) enum MachineStatus { - /// The machine is currently running a job. - Running, - - /// The machine is not running, but is ready to run a job. - Idle, - - /// The machine is not running, and cannot run for some reason. - Problem(EnumSet), -} - -impl Default for MachineStatus { - fn default() -> Self { - Self::Idle - } -} +use crate::hal::TimeMillis; +use enumset::EnumSet; +use hoshiguma_foundational_data::koishi::{Inputs, MachineProblem, MachineStatus}; impl StatusUpdate for MachineStatus { fn update(&self, _: TimeMillis, current: &Inputs) -> Self { @@ -50,12 +31,3 @@ impl StatusUpdate for MachineStatus { state } } - -#[derive(uDebug, Serialize, EnumSetType)] -pub(crate) enum MachineProblem { - /// Any door to a protected area is open. - DoorOpen, - - /// An external controller has indicated a fault condition. - External, -} diff --git a/koishi/firmware/src/logic/mod.rs b/koishi/firmware/src/logic/mod.rs index 233798e1..5dbfa681 100644 --- a/koishi/firmware/src/logic/mod.rs +++ b/koishi/firmware/src/logic/mod.rs @@ -3,22 +3,8 @@ pub(crate) mod extraction; pub(crate) mod machine; mod run_on_delay; -use crate::{hal::TimeMillis, io::inputs::Inputs}; -use serde::Serialize; -use ufmt::derive::uDebug; - -#[derive(Clone, uDebug, PartialEq, Serialize)] -pub(crate) enum AlarmState { - Normal, - Alarm, -} - -#[derive(Clone, uDebug, PartialEq, Serialize)] -pub(crate) enum StatusLight { - Green, - Amber, - Red, -} +use crate::hal::TimeMillis; +use hoshiguma_foundational_data::koishi::Inputs; pub(crate) trait StatusUpdate { fn update(&self, time: TimeMillis, current: &Inputs) -> Self; diff --git a/koishi/firmware/src/logic/run_on_delay.rs b/koishi/firmware/src/logic/run_on_delay.rs index fdda5075..cf59f982 100644 --- a/koishi/firmware/src/logic/run_on_delay.rs +++ b/koishi/firmware/src/logic/run_on_delay.rs @@ -1,29 +1,22 @@ -use core::ops::Add; -use serde::Serialize; -use ufmt::derive::uDebug; +use hoshiguma_foundational_data::koishi::run_on_delay::{RunOnDelay, State}; -#[derive(uDebug, Clone, PartialEq, Serialize)] -enum State { - Demand, - RunOn { end: T }, - Idle, +pub(crate) trait RunOnDelayExt { + fn new(delay: T) -> Self; + fn update(&mut self, time: T, demand: bool); + fn should_run(&self) -> bool; } -#[derive(uDebug, Clone, PartialEq, Serialize)] -pub(crate) struct RunOnDelay { - delay: T, - state: State, -} - -impl> RunOnDelay { - pub(crate) fn new(delay: T) -> Self { +impl + Copy> RunOnDelayExt + for RunOnDelay +{ + fn new(delay: T) -> Self { Self { delay, state: State::Idle, } } - pub(crate) fn update(&mut self, time: T, demand: bool) { + fn update(&mut self, time: T, demand: bool) { self.state = if demand { State::Demand } else { @@ -44,7 +37,7 @@ impl> RunOnDelay { }; } - pub(crate) fn should_run(&self) -> bool { + fn should_run(&self) -> bool { self.state != State::Idle } } diff --git a/koishi/firmware/src/main.rs b/koishi/firmware/src/main.rs index 9982e358..d4389894 100644 --- a/koishi/firmware/src/main.rs +++ b/koishi/firmware/src/main.rs @@ -6,35 +6,35 @@ mod checked_update; mod hal; mod io; mod logic; -#[cfg(feature = "reporting_postcard")] -mod reporting; +#[cfg(feature = "telemetry")] +mod telemetry; mod unwrap_simple; use crate::{ checked_update::CheckedUpdate, io::{ inputs::ReadInputs, - outputs::{Outputs, WriteOutputs}, - }, - logic::{ - air_assist::AirAssistStatus, extraction::ExtractionStatus, machine::MachineStatus, - StatusUpdate, + outputs::{OutputsExt, WriteOutputs}, }, + logic::{air_assist::AirAssistStatusExt, extraction::ExtractionStatusExt, StatusUpdate}, }; use atmega_hal::prelude::*; +use hoshiguma_foundational_data::koishi::{ + AirAssistStatus, ExtractionStatus, MachineStatus, Outputs, +}; #[panic_handler] -fn panic(_info: &core::panic::PanicInfo) -> ! { +fn panic(info: &core::panic::PanicInfo) -> ! { avr_device::interrupt::disable(); let dp = unsafe { atmega_hal::Peripherals::steal() }; let pins = hal::Pins::with_mcu_pins(atmega_hal::pins!(dp)); - #[cfg(feature = "reporting_postcard")] + #[cfg(feature = "telemetry")] { let mut serial = serial!(dp, pins, 57600); - serial.write_byte(0u8); - reporting::panic(&mut serial, _info); + serial.write_byte(0); + telemetry::panic(&mut serial, info); } let mut led = pins.d13.into_output(); @@ -52,10 +52,10 @@ fn main() -> ! { hal::millis_init(dp.TC0); unsafe { avr_device::interrupt::enable() }; - #[cfg(feature = "reporting_postcard")] + #[cfg(feature = "telemetry")] let mut serial = serial!(dp, pins, 57600); - #[cfg(feature = "reporting_postcard")] - reporting::boot(&mut serial); + #[cfg(feature = "telemetry")] + telemetry::boot(&mut serial); #[cfg(feature = "devkit")] let inputs = gpio_debug_inputs!(pins); @@ -65,7 +65,7 @@ fn main() -> ! { let mut outputs = gpio_relay_outputs!(pins); let mut st_inputs = CheckedUpdate::default(); - let mut machine_status = CheckedUpdate::new(MachineStatus::default()); + let mut machine_status = CheckedUpdate::new(MachineStatus::Idle); let mut extraction_status = CheckedUpdate::new(ExtractionStatus::default()); let mut air_assist_status = CheckedUpdate::new(AirAssistStatus::default()); let mut st_outputs = CheckedUpdate::default(); @@ -76,23 +76,23 @@ fn main() -> ! { let time = crate::hal::millis(); if st_inputs.store(inputs.read()) { - #[cfg(feature = "reporting_postcard")] - reporting::status(&mut serial, iteration_id, st_inputs.get()); + #[cfg(feature = "telemetry")] + telemetry::status(&mut serial, iteration_id, st_inputs.get()); } if machine_status.store(machine_status.get().update(time, st_inputs.get())) { - #[cfg(feature = "reporting_postcard")] - reporting::status(&mut serial, iteration_id, machine_status.get()); + #[cfg(feature = "telemetry")] + telemetry::status(&mut serial, iteration_id, machine_status.get()); } if extraction_status.store(extraction_status.get().update(time, st_inputs.get())) { - #[cfg(feature = "reporting_postcard")] - reporting::status(&mut serial, iteration_id, extraction_status.get()); + #[cfg(feature = "telemetry")] + telemetry::status(&mut serial, iteration_id, extraction_status.get()); } if air_assist_status.store(air_assist_status.get().update(time, st_inputs.get())) { - #[cfg(feature = "reporting_postcard")] - reporting::status(&mut serial, iteration_id, air_assist_status.get()); + #[cfg(feature = "telemetry")] + telemetry::status(&mut serial, iteration_id, air_assist_status.get()); } if st_outputs.store(Outputs::new( @@ -100,8 +100,8 @@ fn main() -> ! { extraction_status.get(), air_assist_status.get(), )) { - #[cfg(feature = "reporting_postcard")] - reporting::status(&mut serial, iteration_id, st_outputs.get()); + #[cfg(feature = "telemetry")] + telemetry::status(&mut serial, iteration_id, st_outputs.get()); } outputs.write(st_outputs.get()); diff --git a/koishi/firmware/src/reporting/mod.rs b/koishi/firmware/src/reporting/mod.rs deleted file mode 100644 index 5f2fd66f..00000000 --- a/koishi/firmware/src/reporting/mod.rs +++ /dev/null @@ -1,44 +0,0 @@ -#[cfg(feature = "reporting_postcard")] -mod postcard; -mod protocol; - -use self::protocol::{BootPayload, Message, PanicPayload, Payload}; -use crate::hal::Usart; - -fn report, TX, RX>( - serial: &mut Usart, - msg: &Message, -) { - #[cfg(feature = "reporting_postcard")] - self::postcard::report(serial, &msg); -} - -pub(crate) fn boot, TX, RX>( - serial: &mut Usart, -) { - report( - serial, - &Message::new(None, Payload::Boot(BootPayload::default())), - ); -} - -pub(crate) fn panic, TX, RX>( - serial: &mut Usart, - info: &core::panic::PanicInfo, -) { - report( - serial, - &Message::new(None, Payload::Panic(PanicPayload::from(info))), - ); -} - -pub(crate) fn status, TX, RX, T>( - serial: &mut Usart, - iteration_id: u32, - status_payload: T, -) where - Payload: From, -{ - let msg = Message::new(Some(iteration_id), status_payload.into()); - report(serial, &msg); -} diff --git a/koishi/firmware/src/reporting/postcard.rs b/koishi/firmware/src/reporting/postcard.rs deleted file mode 100644 index 3cfbe014..00000000 --- a/koishi/firmware/src/reporting/postcard.rs +++ /dev/null @@ -1,14 +0,0 @@ -use super::Message; -use crate::hal::Usart; - -pub(super) fn report, TX, RX>( - serial: &mut Usart, - msg: &Message, -) { - let data = postcard::to_vec_cobs::(&msg).unwrap(); - - for i in data { - serial.write_byte(i); - } - serial.flush(); -} diff --git a/koishi/firmware/src/reporting/protocol.rs b/koishi/firmware/src/reporting/protocol.rs deleted file mode 100644 index 45f8ec2d..00000000 --- a/koishi/firmware/src/reporting/protocol.rs +++ /dev/null @@ -1,125 +0,0 @@ -use crate::hal::TimeMillis; -use serde::Serialize; - -#[derive(Serialize)] -pub(super) struct Message { - time: TimeMillis, - iteration_id: Option, - payload: Payload, -} - -impl Message { - pub(super) fn new(iteration_id: Option, payload: Payload) -> Self { - Self { - time: crate::hal::millis(), - iteration_id, - payload, - } - } -} - -#[derive(Serialize)] -pub(crate) enum Payload { - Boot(BootPayload), - Panic(PanicPayload), - - InputsChanged(crate::io::inputs::Inputs), - OutputsChanged(crate::io::outputs::Outputs), - - MachineStatusChanged(crate::logic::machine::MachineStatus), - AirAssistStatusChanged(crate::logic::air_assist::AirAssistStatus), - ExtractionStatusChanged(crate::logic::extraction::ExtractionStatus), -} - -impl From<&crate::io::inputs::Inputs> for Payload { - fn from(inputs: &crate::io::inputs::Inputs) -> Payload { - Payload::InputsChanged(inputs.clone()) - } -} - -impl From<&crate::io::outputs::Outputs> for Payload { - fn from(outputs: &crate::io::outputs::Outputs) -> Payload { - Payload::OutputsChanged(outputs.clone()) - } -} - -impl From<&crate::logic::machine::MachineStatus> for Payload { - fn from(status: &crate::logic::machine::MachineStatus) -> Payload { - Payload::MachineStatusChanged(status.clone()) - } -} - -impl From<&crate::logic::air_assist::AirAssistStatus> for Payload { - fn from(status: &crate::logic::air_assist::AirAssistStatus) -> Payload { - Payload::AirAssistStatusChanged(status.clone()) - } -} - -impl From<&crate::logic::extraction::ExtractionStatus> for Payload { - fn from(status: &crate::logic::extraction::ExtractionStatus) -> Payload { - Payload::ExtractionStatusChanged(status.clone()) - } -} - -#[derive(Serialize)] -pub(crate) struct BootPayload { - name: &'static str, - git_revision: &'static str, -} - -impl ufmt::uDebug for BootPayload { - fn fmt(&self, f: &mut ufmt::Formatter<'_, W>) -> Result<(), W::Error> - where - W: ufmt::uWrite + ?Sized, - { - ufmt::uwrite!(f, "{} {}", self.name, self.git_revision) - } -} - -impl Default for BootPayload { - fn default() -> Self { - Self { - name: "koishi", - git_revision: git_version::git_version!(), - } - } -} - -#[derive(Default, Serialize)] -pub(crate) struct PanicPayload { - file: Option>, - line: Option, - column: Option, -} - -impl ufmt::uDebug for PanicPayload { - fn fmt(&self, f: &mut ufmt::Formatter<'_, W>) -> Result<(), W::Error> - where - W: ufmt::uWrite + ?Sized, - { - if self.file.is_some() && self.line.is_some() && self.column.is_some() { - ufmt::uwrite!( - f, - "at {}:{}:{}", - self.file.as_ref().unwrap().as_str(), - self.line.unwrap(), - self.column.unwrap(), - ) - } else { - ufmt::uwrite!(f, "at unknown location") - } - } -} - -impl From<&core::panic::PanicInfo<'_>> for PanicPayload { - fn from(info: &core::panic::PanicInfo) -> Self { - match info.location() { - None => PanicPayload::default(), - Some(loc) => Self { - file: Some(loc.file().into()), - line: Some(loc.line()), - column: Some(loc.column()), - }, - } - } -} diff --git a/koishi/firmware/src/telemetry.rs b/koishi/firmware/src/telemetry.rs new file mode 100644 index 00000000..af9889ba --- /dev/null +++ b/koishi/firmware/src/telemetry.rs @@ -0,0 +1,59 @@ +use crate::hal::Usart; + +type Message = hoshiguma_foundational_data::Message; + +fn report, TX, RX>( + serial: &mut Usart, + msg: &Message, +) { + let data = postcard::to_vec_cobs::(msg).unwrap(); + + for i in data { + serial.write_byte(i); + } + serial.flush(); +} + +pub(crate) fn boot, TX, RX>( + serial: &mut Usart, +) { + let msg = Message { + time: crate::hal::millis(), + iteration_id: None, + payload: hoshiguma_foundational_data::Payload::Boot(hoshiguma_foundational_data::Boot { + name: "koishi".try_into().unwrap(), + git_revision: git_version::git_version!().try_into().unwrap(), + }), + }; + + report(serial, &msg); +} + +pub(crate) fn panic, TX, RX>( + serial: &mut Usart, + info: &core::panic::PanicInfo, +) { + let msg = Message { + time: crate::hal::millis(), + iteration_id: None, + payload: hoshiguma_foundational_data::Payload::Panic(info.into()), + }; + + report(serial, &msg); +} + +pub(crate) fn status, TX, RX, T>( + serial: &mut Usart, + iteration_id: u32, + status_payload: T, +) where + hoshiguma_foundational_data::koishi::Payload: From, +{ + let msg = Message { + time: crate::hal::millis(), + iteration_id: Some(iteration_id), + payload: hoshiguma_foundational_data::Payload::Application(status_payload.into()), + }; + + report(serial, &msg); +} diff --git a/koishi/telemetry-protocol/Cargo.toml b/koishi/telemetry-protocol/Cargo.toml deleted file mode 100644 index ed6c9f2f..00000000 --- a/koishi/telemetry-protocol/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "koishi-telemetry-protocol" -version = "0.1.0" -edition = "2021" - -[dependencies] -enumset = { version = "1.1.3", features = ["serde"] } -postcard = { version = "1.0.6", default-features = false, features = ["use-std"] } -serde = { version = "1.0.174", features = ["derive"] } diff --git a/koishi/telemetry-protocol/src/lib.rs b/koishi/telemetry-protocol/src/lib.rs deleted file mode 100644 index e30a0813..00000000 --- a/koishi/telemetry-protocol/src/lib.rs +++ /dev/null @@ -1,121 +0,0 @@ -use enumset::{EnumSet, EnumSetType}; -use serde::Deserialize; - -type TimeMillis = u32; - -#[derive(Debug, Deserialize)] -#[allow(dead_code)] -pub struct Message { - time: TimeMillis, - iteration_id: Option, - pub payload: Payload, -} - -#[derive(Debug, Deserialize)] -pub enum Payload { - Boot(Boot), - Panic(Panic), - - InputsChanged(Inputs), - OutputsChanged(Outputs), - - MachineStatusChanged(MachineStatus), - AirAssistStatusChanged(AirAssistStatus), - ExtractionStatusChanged(ExtractionStatus), -} - -#[derive(Debug, Deserialize)] -#[allow(dead_code)] -pub struct Boot { - name: String, - pub git_revision: String, -} - -#[derive(Debug, Deserialize)] -#[allow(dead_code)] -pub struct Panic { - file: Option, - line: Option, - column: Option, -} - -#[derive(Debug, Deserialize)] -#[allow(dead_code)] -pub struct Inputs { - doors_closed: bool, - cooling_ok: bool, - machine_running: bool, - air_pump_demand: bool, - extraction_mode: ExtractionMode, -} - -#[derive(Debug, Deserialize)] -pub enum ExtractionMode { - Normal, - Run, -} - -#[derive(Debug, Deserialize)] -#[allow(dead_code)] -pub struct Outputs { - controller_machine_alarm: AlarmState, - controller_cooling_alarm: AlarmState, - laser_enable: bool, - status_light: StatusLight, - air_pump: bool, - extractor_fan: bool, -} - -#[derive(Debug, Deserialize)] -pub enum AlarmState { - Normal, - Alarm, -} - -#[derive(Debug, Deserialize)] -pub enum StatusLight { - Green, - Amber, - Red, -} - -#[derive(Debug, Deserialize)] -pub enum MachineStatus { - Running, - Idle, - Problem(EnumSet), -} - -#[derive(Debug, Deserialize, EnumSetType)] -pub enum MachineProblem { - DoorOpen, - External, -} - -#[derive(Debug, Deserialize)] -#[allow(dead_code)] -pub struct AirAssistStatus { - state: RunOnDelay, -} - -#[derive(Debug, Deserialize)] -#[allow(dead_code)] -pub struct ExtractionStatus { - state: RunOnDelay, - r#override: bool, -} - -#[derive(Debug, Deserialize)] -#[allow(dead_code)] -pub struct RunOnDelay { - delay: TimeMillis, - state: RunOnDelayState, -} - -#[derive(Debug, Deserialize)] -#[allow(dead_code)] -pub enum RunOnDelayState { - Demand, - RunOn { end: TimeMillis }, - Idle, -} diff --git a/koishi/telemetry-receiver/Cargo.toml b/koishi/telemetry-receiver/Cargo.toml deleted file mode 100644 index 305d1804..00000000 --- a/koishi/telemetry-receiver/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "koishi-telemetry-receiver" -version = "0.1.0" -edition = "2021" - -[dependencies] -clap = { version = "4.3.18", features = ["derive"] } -git-version = "0.3.5" -postcard = { version = "1.0.6", default-features = false, features = ["use-std"] } -koishi-telemetry-protocol = { path = "../telemetry-protocol" } -serde = { version = "1.0.174", features = ["derive"] } -serialport = "4.2.1" -tracing = "0.1.37" -tracing-subscriber = "0.3.17" diff --git a/koishi/telemetry-receiver/rust-toolchain.toml b/koishi/telemetry-receiver/rust-toolchain.toml deleted file mode 100644 index e6bc8e70..00000000 --- a/koishi/telemetry-receiver/rust-toolchain.toml +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "stable" -components = ["clippy", "rustfmt", "rust-analyzer"] diff --git a/koishi/telemetry-receiver/src/main.rs b/koishi/telemetry-receiver/src/main.rs deleted file mode 100644 index 7464caaf..00000000 --- a/koishi/telemetry-receiver/src/main.rs +++ /dev/null @@ -1,70 +0,0 @@ -use clap::Parser; -use koishi_telemetry_protocol as protocol; -use std::{io::Read, time::Duration}; -use tracing::{debug, error, info, warn}; - -/// Tool to receive data from the koishi coprocessor via the postcard protocol. -#[derive(Parser)] -struct Cli { - /// Serial port - #[arg(short, long)] - port: String, - - /// Serial baud rate - #[arg(short, long, default_value = "57600")] - baud: u32, -} - -fn main() { - tracing_subscriber::fmt::init(); - - let cli = Cli::parse(); - - let port = serialport::new(cli.port, cli.baud) - .timeout(Duration::from_millis(10)) - .open(); - - match port { - Ok(port) => { - let mut rx_buffer: Vec = vec![]; - - for b in port.bytes().flatten() { - rx_buffer.push(b); - - if b == 0 { - debug!("Received {} bytes: {:?}", rx_buffer.len(), rx_buffer); - - match postcard::from_bytes_cobs::(&mut rx_buffer) { - Ok(msg) => { - info!("Received {:#?}", msg); - if let protocol::Payload::Boot(msg) = msg.payload { - check_firmware_version(&msg); - } - } - Err(e) => { - warn!("Failed to parse message: {}", e); - } - } - - rx_buffer.clear(); - } - } - } - Err(e) => { - error!("Failed to open port: {}", e); - ::std::process::exit(1); - } - } -} - -fn check_firmware_version(msg: &protocol::Boot) { - let our_version = git_version::git_version!(); - let their_version = &msg.git_revision; - - debug!("Host Git revision: {}", our_version); - debug!("Device Git revision: {}", their_version); - - if our_version != their_version { - warn!("Git revisions do not match between host and device, this program may not read data correctly from the device!"); - } -} diff --git a/satori/firmware/.cargo/config.toml b/satori/firmware/.cargo/config.toml new file mode 100644 index 00000000..8cce8916 --- /dev/null +++ b/satori/firmware/.cargo/config.toml @@ -0,0 +1,26 @@ +[target.'cfg(all(target_arch = "arm", target_os = "none"))'] +# Choose a default "cargo run" tool (see README for more info) +# - `probe-rs` provides flashing and defmt via a hardware debugger, and stack unwind on panic +# - elf2uf2-rs loads firmware over USB when the rp2040 is in boot mode +runner = "probe-rs run --chip RP2040 --protocol swd" +# runner = "elf2uf2-rs -d" + +rustflags = [ + "-C", "linker=flip-link", + "-C", "link-arg=--nmagic", + "-C", "link-arg=-Tlink.x", + "-C", "link-arg=-Tdefmt.x", + + # Code-size optimizations. + # trap unreachable can save a lot of space, but requires nightly compiler. + # uncomment the next line if you wish to enable it + # "-Z", "trap-unreachable=no", + "-C", "inline-threshold=5", + "-C", "no-vectorize-loops", +] + +[build] +target = "thumbv6m-none-eabi" + +[env] +DEFMT_LOG = "debug" diff --git a/satori/firmware/Cargo.lock b/satori/firmware/Cargo.lock new file mode 100644 index 00000000..b7dd5ba8 --- /dev/null +++ b/satori/firmware/Cargo.lock @@ -0,0 +1,1513 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "bare-metal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" +dependencies = [ + "rustc_version 0.2.3", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitfield" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[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 = "cortex-m" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" +dependencies = [ + "bare-metal", + "bitfield", + "embedded-hal 0.2.7", + "volatile-register", +] + +[[package]] +name = "cortex-m-rt" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee84e813d593101b1723e13ec38b6ab6abbdbaaa4546553f5395ed274079ddb1" +dependencies = [ + "cortex-m-rt-macros", +] + +[[package]] +name = "cortex-m-rt-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f6f3e36f203cfedbc78b357fb28730aa2c6dc1ab060ee5c2405e843988d3c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "darling" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.66", +] + +[[package]] +name = "darling_macro" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.66", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a99dd22262668b887121d4672af5a64b238f026099f1a2a1b322066c9ecfe9e0" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9f309eff1f79b3ebdf252954d90ae440599c26c2c553fe87a2d17195f2dcb" +dependencies = [ + "defmt-parser", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "defmt-parser" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4a5fefe330e8d7f31b16a318f9ce81000d8e35e69b93eae154d16d2278f70f" +dependencies = [ + "thiserror", +] + +[[package]] +name = "defmt-rtt" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab697b3dbbc1750b7c8b821aa6f6e7f2480b47a99bc057a2ed7b170ebef0c51" +dependencies = [ + "critical-section", + "defmt", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "document-features" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" +dependencies = [ + "litrs", +] + +[[package]] +name = "ds18b20" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9cd37ace0416c30c2874cd67135508de493e34135c67878b01e13aba91b53ce" +dependencies = [ + "embedded-hal 0.2.7", + "one-wire-bus", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "embassy-embedded-hal" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" +dependencies = [ + "embassy-futures", + "embassy-sync", + "embassy-time", + "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.5.0" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" +dependencies = [ + "cortex-m", + "critical-section", + "defmt", + "document-features", + "embassy-executor-macros", + "embassy-time-driver", + "embassy-time-queue-driver", +] + +[[package]] +name = "embassy-executor-macros" +version = "0.4.1" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "embassy-futures" +version = "0.1.1" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" + +[[package]] +name = "embassy-hal-internal" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" +dependencies = [ + "cortex-m", + "critical-section", + "defmt", + "num-traits", +] + +[[package]] +name = "embassy-rp" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" +dependencies = [ + "atomic-polyfill", + "cfg-if", + "cortex-m", + "cortex-m-rt", + "critical-section", + "defmt", + "document-features", + "embassy-embedded-hal", + "embassy-futures", + "embassy-hal-internal", + "embassy-sync", + "embassy-time", + "embassy-time-driver", + "embassy-usb-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-hal-nb", + "embedded-io", + "embedded-io-async", + "embedded-storage", + "embedded-storage-async", + "fixed", + "nb 1.1.0", + "pio", + "pio-proc", + "rand_core", + "rp-pac", + "rp2040-boot2", +] + +[[package]] +name = "embassy-sync" +version = "0.6.0" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io-async", + "futures-util", + "heapless 0.8.0", +] + +[[package]] +name = "embassy-time" +version = "0.3.1" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" +dependencies = [ + "cfg-if", + "critical-section", + "document-features", + "embassy-time-driver", + "embassy-time-queue-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "futures-util", + "heapless 0.8.0", +] + +[[package]] +name = "embassy-time-driver" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" +dependencies = [ + "document-features", +] + +[[package]] +name = "embassy-time-queue-driver" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" + +[[package]] +name = "embassy-usb-driver" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" +dependencies = [ + "defmt", +] + +[[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-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-async" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" +dependencies = [ + "embedded-io", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + +[[package]] +name = "enumset" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226c0da7462c13fb57e5cc9e0dc8f0635e7d27f276a3a7fd30054647f669007d" +dependencies = [ + "enumset_derive", + "serde", +] + +[[package]] +name = "enumset_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "fixed" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc715d38bea7b5bf487fcd79bcf8c209f0b58014f3018a7a19c2b855f472048" +dependencies = [ + "az", + "bytemuck", + "half", + "typenum", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "git-version" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" +dependencies = [ + "git-version-macro", +] + +[[package]] +name = "git-version-macro" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[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.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32 0.2.1", + "rustc_version 0.4.0", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32 0.3.1", + "serde", + "stable_deref_trait", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hoshiguma-foundational-data" +version = "0.1.0" +dependencies = [ + "enumset", + "heapless 0.8.0", + "postcard", + "serde", +] + +[[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.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "lalrpop" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" +dependencies = [ + "ascii-canvas", + "bit-set", + "diff", + "ena", + "is-terminal", + "itertools", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.6.29", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" +dependencies = [ + "regex", +] + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[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 = "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.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "one-wire-bus" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9761e13074f8f916702c1a1dbe0eda3fb8478704db00493f5a5c27ed5847710" +dependencies = [ + "embedded-hal 0.2.7", +] + +[[package]] +name = "panic-probe" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4047d9235d1423d66cc97da7d07eddb54d4f154d6c13805c6d0793956f4f25b0" +dependencies = [ + "cortex-m", + "defmt", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pio" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e09694b50f89f302ed531c1f2a7569f0be5867aee4ab4f8f729bbeec0078e3" +dependencies = [ + "arrayvec", + "num_enum", + "paste", +] + +[[package]] +name = "pio-parser" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77532c2b8279aef98dfc7207ef15298a5a3d6b6cc76ccc8b65913d69f3a8dd6b" +dependencies = [ + "lalrpop", + "lalrpop-util", + "pio", + "regex-syntax 0.6.29", +] + +[[package]] +name = "pio-proc" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b04dc870fb3a4fd8b3e4ca8c61b53bc8ac4eb78b66805d2b3c2e5c4829e0d7a" +dependencies = [ + "codespan-reporting", + "lalrpop-util", + "pio", + "pio-parser", + "proc-macro-error", + "proc-macro2", + "quote", + "regex-syntax 0.6.29", + "syn 1.0.109", +] + +[[package]] +name = "postcard" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" +dependencies = [ + "cobs", + "heapless 0.7.17", + "serde", +] + +[[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" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +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 = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "rp-pac" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30f6c4c846269293db805e9c77864ff7b923395b480550df44f0868e3765337" +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 0.9.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.23", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "satori" +version = "0.1.0" +dependencies = [ + "cortex-m", + "cortex-m-rt", + "defmt", + "defmt-rtt", + "ds18b20", + "embassy-executor", + "embassy-rp", + "embassy-time", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "enumset", + "git-version", + "heapless 0.8.0", + "hoshiguma-foundational-data", + "one-wire-bus", + "panic-probe", + "postcard", +] + +[[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" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[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.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "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.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[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 = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[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 = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[patch.unused]] +name = "embassy-usb" +version = "0.2.0" +source = "git+https://github.com/embassy-rs/embassy?rev=2766993099b6604739ae25724aa2f6a9877d9902#2766993099b6604739ae25724aa2f6a9877d9902" diff --git a/satori/firmware/Cargo.toml b/satori/firmware/Cargo.toml new file mode 100644 index 00000000..a473730c --- /dev/null +++ b/satori/firmware/Cargo.toml @@ -0,0 +1,95 @@ +[package] +name = "satori" +version = "0.1.0" +authors = ["Dan Nixon "] +edition = "2021" +license = "MIT" + +[features] +default = ["telemetry"] +telemetry = ["dep:postcard"] +panic-probe = ["dep:panic-probe"] + +[dependencies] +embedded-hal = { package = "embedded-hal", version = "1.0.0" } +embedded-hal-p2 = { package = "embedded-hal", version = "0.2.0" } + +defmt = "0.3" +defmt-rtt = "0.4" +panic-probe = { version = "0.3", features = ["print-defmt"], optional = true } + +embassy-executor = { version = "0.5.0", features = ["task-arena-size-1024", "arch-cortex-m", "executor-thread", "defmt", "integrated-timers", "executor-interrupt"] } +embassy-time = "0.3.1" + +cortex-m = "0.7" +cortex-m-rt = "0.7" +embassy-rp = { version = "0.1.0", features = ["defmt", "unstable-pac", "time-driver", "critical-section-impl"] } + +ds18b20 = "0.1.1" +enumset = { version = "1.1.3", features = ["serde"] } +git-version = "0.3.9" +heapless = { version = "0.8.0", features = ["serde"] } +hoshiguma-foundational-data = { path = "../../common/foundational-data", default-features = false } +one-wire-bus = "0.1.1" +postcard = { version = "1.0.8", optional = true } + +[patch.crates-io] +embassy-embedded-hal = { git = "https://github.com/embassy-rs/embassy", rev = "2766993099b6604739ae25724aa2f6a9877d9902" } +embassy-executor = { git = "https://github.com/embassy-rs/embassy", rev = "2766993099b6604739ae25724aa2f6a9877d9902" } +embassy-rp = { git = "https://github.com/embassy-rs/embassy", rev = "2766993099b6604739ae25724aa2f6a9877d9902" } +embassy-sync = { git = "https://github.com/embassy-rs/embassy", rev = "2766993099b6604739ae25724aa2f6a9877d9902" } +embassy-time = { git = "https://github.com/embassy-rs/embassy", rev = "2766993099b6604739ae25724aa2f6a9877d9902" } +embassy-usb = { git = "https://github.com/embassy-rs/embassy", rev = "2766993099b6604739ae25724aa2f6a9877d9902" } +embassy-usb-driver = { git = "https://github.com/embassy-rs/embassy", rev = "2766993099b6604739ae25724aa2f6a9877d9902" } + +# cargo build/run +[profile.dev] +codegen-units = 1 +debug = 2 +debug-assertions = true +incremental = false +opt-level = 3 +overflow-checks = true + +# cargo build/run --release +[profile.release] +codegen-units = 1 +debug = 2 +debug-assertions = false +incremental = false +lto = 'fat' +opt-level = 3 +overflow-checks = false + +# do not optimize proc-macro crates = faster builds from scratch +[profile.dev.build-override] +codegen-units = 8 +debug = false +debug-assertions = false +opt-level = 0 +overflow-checks = false + +[profile.release.build-override] +codegen-units = 8 +debug = false +debug-assertions = false +opt-level = 0 +overflow-checks = false + +# cargo test +[profile.test] +codegen-units = 1 +debug = 2 +debug-assertions = true +incremental = false +opt-level = 3 +overflow-checks = true + +# cargo test --release +[profile.bench] +codegen-units = 1 +debug = 2 +debug-assertions = false +incremental = false +lto = 'fat' +opt-level = 3 diff --git a/satori/firmware/README.md b/satori/firmware/README.md new file mode 100644 index 00000000..a25a348e --- /dev/null +++ b/satori/firmware/README.md @@ -0,0 +1,18 @@ +# Firmware + +## Dependencies + +- Nix (with flake support) +- direnv (or just run `nix shell` before running the commands below) + +## Build + +```shell +cargo build --release +``` + +## Flash + +```shell +cargo run --release -- -P /dev/ttyXXX +``` diff --git a/satori/firmware/build.rs b/satori/firmware/build.rs new file mode 100644 index 00000000..d534cc3d --- /dev/null +++ b/satori/firmware/build.rs @@ -0,0 +1,31 @@ +//! 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"); +} diff --git a/satori/firmware/memory.x b/satori/firmware/memory.x new file mode 100644 index 00000000..070eac78 --- /dev/null +++ b/satori/firmware/memory.x @@ -0,0 +1,15 @@ +MEMORY { + BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100 + FLASH : ORIGIN = 0x10000100, LENGTH = 2048K - 0x100 + RAM : ORIGIN = 0x20000000, LENGTH = 256K +} + +EXTERN(BOOT2_FIRMWARE) + +SECTIONS { + /* ### Boot loader */ + .boot2 ORIGIN(BOOT2) : + { + KEEP(*(.boot2)); + } > BOOT2 +} INSERT BEFORE .text; \ No newline at end of file diff --git a/satori/firmware/rust-toolchain.toml b/satori/firmware/rust-toolchain.toml new file mode 100644 index 00000000..e326c906 --- /dev/null +++ b/satori/firmware/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "stable" +components = ["rust-src", "clippy", "rust-analyzer"] +profile = "minimal" diff --git a/satori/firmware/src/main.rs b/satori/firmware/src/main.rs new file mode 100644 index 00000000..12fb1934 --- /dev/null +++ b/satori/firmware/src/main.rs @@ -0,0 +1,166 @@ +#![no_std] +#![no_main] + +mod rules; +mod sensors; + +use crate::rules::RuleEvaluationContext; +use defmt::info; +use defmt_rtt as _; +use embassy_executor::Spawner; +use embassy_rp::gpio::{Input, Level, Output, OutputOpenDrain, Pull}; +use embassy_time::{Duration, Instant, Ticker}; +use embedded_hal::digital::{OutputPin, PinState}; +use heapless::Vec; +use hoshiguma_foundational_data::satori::{ObservedState, Status}; +use one_wire_bus::OneWire; +#[cfg(feature = "panic-probe")] +use panic_probe as _; + +#[cfg(not(feature = "panic-probe"))] +#[panic_handler] +fn panic(_info: &core::panic::PanicInfo) -> ! { + use embassy_rp::Peripherals; + use embedded_hal::delay::DelayNs; + + let p = unsafe { Peripherals::steal() }; + + // Disable machine + let mut machine_enable = Output::new(p.PIN_9, Level::Low); + machine_enable.set_low(); + + // Blink the on board LED pretty fast + let mut led = Output::new(p.PIN_25, Level::Low); + loop { + led.toggle(); + embassy_time::Delay.delay_ms(50); + } +} + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let p = embassy_rp::init(Default::default()); + + let mut led = Output::new(p.PIN_25, Level::Low); + + let mut machine_enable = Output::new(p.PIN_9, Level::Low); + + let mut coolant_level_sensor = { + let top = Input::new(p.PIN_12, Pull::Up); + let bottom = Input::new(p.PIN_14, Pull::Up); + sensors::CoolantLevelSensor::new(top, bottom) + }; + + let mut onewire_bus = { + let pin = OutputOpenDrain::new(p.PIN_10, Level::Low); + OneWire::new(pin).unwrap() + }; + + for device_address in onewire_bus.devices(false, &mut embassy_time::Delay) { + let device_address = device_address.unwrap(); + info!("Found one wire device at address: {}", device_address.0); + } + + let mut temperature_sensors = + crate::sensors::TemperatureSensors::new(onewire_bus, embassy_time::Delay); + + let fc_p13 = embassy_rp::pwm::Pwm::new_input( + p.PWM_SLICE6, + p.PIN_13, + Pull::Down, + embassy_rp::pwm::InputMode::FallingEdge, + embassy_rp::pwm::Config::default(), + ); + + let fc_p15 = embassy_rp::pwm::Pwm::new_input( + p.PWM_SLICE7, + p.PIN_15, + Pull::Down, + embassy_rp::pwm::InputMode::FallingEdge, + embassy_rp::pwm::Config::default(), + ); + + let mut last_potential_problems = Vec::new(); + + let mut tick = Ticker::every(Duration::from_secs(2)); + + loop { + tick.next().await; + + let now = Instant::now().as_millis() as u32; + info!("{} ms", now); + + // TODO + let count = fc_p13.counter(); + info!("fc p13 count: {}", count); + fc_p13.set_counter(0); + let coolant_pump_rpm = 0.0; + + // TODO + let count = fc_p15.counter(); + info!("fc p15 count: {}", count); + fc_p15.set_counter(0); + let coolant_flow_rate = 0.0; + + let temperature = temperature_sensors.read(); + + let coolant_level = coolant_level_sensor.read(); + + // TODO + info!("{} C", temperature.coolant_flow); + info!("{} C", temperature.coolant_return); + info!("{} C", temperature.coolant_resevoir_lower); + info!("{} C", temperature.coolant_resevoir_upper); + info!("{} C", temperature.coolant_pump); + info!("{} C", temperature.room_ambient); + info!("{} C", temperature.laser_bay); + info!("{} C", temperature.electronics_bay); + info!( + "coolant level: {}", + match coolant_level { + Some(ref level) => match level { + hoshiguma_foundational_data::satori::CoolantLevel::Full => "full", + hoshiguma_foundational_data::satori::CoolantLevel::Low => "low", + hoshiguma_foundational_data::satori::CoolantLevel::CriticallyLow => "empty", + }, + None => "unknown", + } + ); + + let observed = ObservedState { + temperature, + coolant_level, + coolant_pump_rpm, + coolant_flow_rate, + }; + + let mut potential_problems = Vec::new(); + let mut problems = Vec::new(); + + crate::rules::evaluate(RuleEvaluationContext { + state: &observed, + now, + last_potential_problems: &last_potential_problems, + potential_problems: &mut potential_problems, + problems: &mut problems, + }); + + let status = Status { + observed, + potential_problems, + problems, + }; + + // Allow the machine to operate when there are no problems, otherwise disable it + machine_enable + .set_state(match status.problems.is_empty() { + true => PinState::High, + false => PinState::Low, + }) + .unwrap(); + + led.toggle(); + + last_potential_problems = status.potential_problems; + } +} diff --git a/satori/firmware/src/rules/coolant_level.rs b/satori/firmware/src/rules/coolant_level.rs new file mode 100644 index 00000000..41b07c80 --- /dev/null +++ b/satori/firmware/src/rules/coolant_level.rs @@ -0,0 +1,108 @@ +use super::RuleEvaluationContext; +use hoshiguma_foundational_data::satori::{ + CoolantLevel, MachineProblem, PotentialMachineProblem, ProblemKind, ProblemSeverity, +}; + +/// Ensure that the coolant level is sufficient. +/// +/// Resolutions: +/// - full: no problems +/// - low: potential problem, promote to problem in 10 seconds +/// - empty: immediate problem +/// - fault: potential problem, promote to problem in 10 seconds +pub(super) fn coolant_level(ctx: &mut RuleEvaluationContext) { + let sensor_potential_problem = ctx + .potential_problems + .iter() + .find(|i| i.problem.kind == ProblemKind::CoolantLevelSensorFault); + + let level_potential_problem = ctx + .potential_problems + .iter() + .find(|i| i.problem.kind == ProblemKind::CoolantLevelInsufficient); + + match &ctx.state.coolant_level { + Some(level) => match level { + CoolantLevel::Full => { + // Do nothing. + // There is no problem, water is reported to be full. + } + CoolantLevel::Low => { + match level_potential_problem { + Some(potential_problem) => { + // Low coolant level was a problem before and still is a problem. + // Check how long it has been a potential problem. + if ctx.now.wrapping_sub(potential_problem.since) > 5000 { + // Has been a potential problem long enough to now be an actual problem. + ctx.problems + .push(potential_problem.problem.clone()) + .unwrap(); + } else { + // Not long enough to be too concerned, yet... + // Just continue with the existing potential problem. + ctx.potential_problems + .push(potential_problem.clone()) + .unwrap(); + } + } + None => { + // Low coolant level was not a problem before but now is. + // Add a new potential problem. + ctx.potential_problems + .push(PotentialMachineProblem { + problem: MachineProblem { + kind: ProblemKind::CoolantLevelInsufficient, + severity: ProblemSeverity::Critical, + }, + since: ctx.now, + }) + .unwrap(); + } + } + } + CoolantLevel::CriticallyLow => { + // The coolant tank is effectively (< a few inches) empty. + // Add an active problem with critical severity. + ctx.problems + .push(MachineProblem { + kind: ProblemKind::CoolantLevelInsufficient, + severity: ProblemSeverity::Critical, + }) + .unwrap(); + } + }, + None => { + match sensor_potential_problem { + Some(potential_problem) => { + // Coolant level sensor failure was a problem before and still is a problem. + // Check how long it has been a potential problem. + if ctx.now.wrapping_sub(potential_problem.since) > 5000 { + // Has been a potential problem long enough to now be an actual problem. + ctx.problems + .push(potential_problem.problem.clone()) + .unwrap(); + } else { + // Not long enough to be too concerned, yet... + // Just continue with the existing potential problem. + ctx.potential_problems + .push(potential_problem.clone()) + .unwrap(); + } + } + None => { + // Sensor failure was not a probelm before but is now. + // Add a new potential problem. + ctx.potential_problems + .push(PotentialMachineProblem { + problem: MachineProblem { + kind: ProblemKind::CoolantLevelSensorFault, + severity: ProblemSeverity::Critical, + }, + since: ctx.now, + }) + .unwrap(); + } + } + } + } +} diff --git a/satori/firmware/src/rules/mod.rs b/satori/firmware/src/rules/mod.rs new file mode 100644 index 00000000..9cd801dc --- /dev/null +++ b/satori/firmware/src/rules/mod.rs @@ -0,0 +1,23 @@ +mod coolant_level; + +use hoshiguma_foundational_data::{ + satori::{MachineProblems, ObservedState, PotentialMachineProblems}, + TimeMillis, +}; + +pub(super) struct RuleEvaluationContext<'a> { + pub state: &'a ObservedState, + pub now: TimeMillis, + #[allow(dead_code)] + pub last_potential_problems: &'a PotentialMachineProblems, + pub potential_problems: &'a mut PotentialMachineProblems, + pub problems: &'a mut MachineProblems, +} + +pub(super) fn evaluate(mut ctx: RuleEvaluationContext) { + self::coolant_level::coolant_level(&mut ctx); + // TODO: coolant flow + // TODO: pump RPM + // TODO: temperatures + // TODO: sensor fault +} diff --git a/satori/firmware/src/sensors/coolant_level.rs b/satori/firmware/src/sensors/coolant_level.rs new file mode 100644 index 00000000..2092e716 --- /dev/null +++ b/satori/firmware/src/sensors/coolant_level.rs @@ -0,0 +1,40 @@ +use embedded_hal::digital::InputPin; +use hoshiguma_foundational_data::satori::CoolantLevel; + +pub(crate) struct CoolantLevelSensor { + top_float_switch: PH, + bottom_float_switch: PL, +} + +impl CoolantLevelSensor { + pub(crate) fn new(top_float_switch: PH, bottom_float_switch: PL) -> Self { + Self { + top_float_switch, + bottom_float_switch, + } + } + + pub(crate) fn read(&mut self) -> Option { + // If the sensor is submerged then the float is lifted up, opening the switch, hence the + // pin reads high. + let top_submerged = self.top_float_switch.is_high(); + let bottom_submerged = self.bottom_float_switch.is_high(); + + if let Ok(top_submerged) = top_submerged { + if let Ok(bottom_submerged) = bottom_submerged { + return match (top_submerged, bottom_submerged) { + // Both level switches are under water + (true, true) => Some(CoolantLevel::Full), + // Only the top level switch is under water (something's fucky...) + (true, false) => None, + // Only the bottom level switch is under water + (false, true) => Some(CoolantLevel::Low), + // Neither level switch is under water + (false, false) => Some(CoolantLevel::CriticallyLow), + }; + } + } + + None + } +} diff --git a/satori/firmware/src/sensors/mod.rs b/satori/firmware/src/sensors/mod.rs new file mode 100644 index 00000000..4ad0d166 --- /dev/null +++ b/satori/firmware/src/sensors/mod.rs @@ -0,0 +1,4 @@ +mod coolant_level; +mod temperature; + +pub(crate) use self::{coolant_level::CoolantLevelSensor, temperature::TemperatureSensors}; diff --git a/satori/firmware/src/sensors/temperature.rs b/satori/firmware/src/sensors/temperature.rs new file mode 100644 index 00000000..97c301c1 --- /dev/null +++ b/satori/firmware/src/sensors/temperature.rs @@ -0,0 +1,90 @@ +use ds18b20::{Ds18b20, Resolution}; +use embedded_hal_p2::{ + blocking::delay::{DelayMs, DelayUs}, + digital::v2::{InputPin, OutputPin}, +}; +use hoshiguma_foundational_data::satori::Temperatures; +use one_wire_bus::OneWire; + +fn sensor_from_address(address: &str) -> Ds18b20 { + let address = u64::from_str_radix(address, 16).unwrap(); + let address = one_wire_bus::Address(address); + Ds18b20::new::<()>(address).unwrap() +} + +macro_rules! read_temperature_sensor { + ($self: expr, $sensor: expr) => { + match $sensor.read_data(&mut $self.bus, &mut $self.delay) { + Ok(r) => Some(r.temperature), + Err(_) => None, + } + }; +} + +pub(crate) struct TemperatureSensors +where + P: InputPin + OutputPin, + D: DelayMs + DelayUs, +{ + bus: OneWire

, + delay: D, + + coolant_radiator_upper: Ds18b20, + coolant_radiator_lower: Ds18b20, + + coolant_pump_case: Ds18b20, + + coolant_flow: Ds18b20, + coolant_return: Ds18b20, + + laser_chamber_ambient: Ds18b20, + electronics_bay_ambient: Ds18b20, + room_ambient: Ds18b20, +} + +impl TemperatureSensors +where + P: InputPin + OutputPin, + D: DelayMs + DelayUs, +{ + pub(crate) fn new(bus: OneWire

, delay: D) -> Self { + Self { + bus, + delay, + coolant_radiator_upper: sensor_from_address("0D3CE1E3817D8828"), + coolant_radiator_lower: sensor_from_address("953C1FF648A2F028"), + coolant_pump_case: sensor_from_address("783CE1E3801EA628"), + coolant_flow: sensor_from_address("703CE1E380A2E828"), + coolant_return: sensor_from_address("523CE1E380B9B828"), + laser_chamber_ambient: sensor_from_address("8F3C53F649ABE528"), + electronics_bay_ambient: sensor_from_address("BAFC5B5509646128"), + room_ambient: sensor_from_address("F1561D5409646128"), + } + } + + fn begin_measurement(&mut self) -> Result<(), ()> { + match ds18b20::start_simultaneous_temp_measurement(&mut self.bus, &mut self.delay) { + Ok(_) => { + Resolution::Bits12.delay_for_measurement_time(&mut self.delay); + Ok(()) + } + Err(_) => Err(()), + } + } + + pub(crate) fn read(&mut self) -> Temperatures { + match self.begin_measurement() { + Ok(_) => Temperatures { + coolant_flow: read_temperature_sensor!(self, self.coolant_flow), + coolant_return: read_temperature_sensor!(self, self.coolant_return), + coolant_resevoir_upper: read_temperature_sensor!(self, self.coolant_radiator_upper), + coolant_resevoir_lower: read_temperature_sensor!(self, self.coolant_radiator_lower), + coolant_pump: read_temperature_sensor!(self, self.coolant_pump_case), + room_ambient: read_temperature_sensor!(self, self.room_ambient), + laser_bay: read_temperature_sensor!(self, self.laser_chamber_ambient), + electronics_bay: read_temperature_sensor!(self, self.electronics_bay_ambient), + }, + Err(_) => Temperatures::default(), + } + } +} diff --git a/satori/mounting_plate.FCStd b/satori/mounting_plate.FCStd new file mode 100644 index 00000000..29ee215f Binary files /dev/null and b/satori/mounting_plate.FCStd differ