From faec97c91f4eaa661dd13605d407cd8618869f8c Mon Sep 17 00:00:00 2001 From: maxwase Date: Sun, 16 Nov 2025 18:12:49 +0200 Subject: [PATCH 1/6] Remove std dependency --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1d92480..96b9420 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ features = ["std"] embassy-time = { version = "0.5.0", optional = true } embedded-hal-old = { package = "embedded-hal", version = "0.2.7", optional = true } embedded-hal = { version = "1.0.0", optional = true } -js-sys = { version = "0.3", optional = true } +js-sys = { version = "0.3", default-features = false, optional = true } [dev-dependencies] parking_lot = "0.12.4" @@ -32,4 +32,4 @@ embedded_hal_old = ["dep:embedded-hal-old", "embedded-hal-old/unproven"] esp = ["dep:embedded-hal"] embedded_hal = ["dep:embedded-hal"] std = [] -wasm = ["dep:js-sys", "std"] +wasm = ["dep:js-sys"] From 334b7ff419105d35d569d6e25818027647627acd Mon Sep 17 00:00:00 2001 From: maxwase Date: Sun, 16 Nov 2025 18:22:52 +0200 Subject: [PATCH 2/6] wasm module --- README.md | 4 ++-- src/instant.rs | 39 +++++++++++++++++++++++---------------- src/lib.rs | 3 --- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 473240b..c47a5d3 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,14 @@ Button driver [![doc](https://img.shields.io/docsrs/button-driver?style=for-the-badge)](https://docs.rs/button-driver/latest/) This crate is a button driver for embedded Rust projects. -It offers various usage scenarios, supports ESP, `embedded_hal`, `embassy` and `no_std` targets. +It offers various usage scenarios, supports ESP, `embedded_hal`, `embassy`, `wasm` and `no_std` targets. This crate aims to be as flexible as possible to support various HALs and use-cases. ## Examples For more examples consider looking into the [examples](https://github.com/maxwase/button-driver/tree/master/examples) folder. -You can easily flash them using `cargo run` command! +You can easily flash/rub them using `cargo run` command! Use `trunk serve` to run the wasm example. For **ESP32C3** with std: diff --git a/src/instant.rs b/src/instant.rs index d5361c1..4043193 100644 --- a/src/instant.rs +++ b/src/instant.rs @@ -33,25 +33,32 @@ impl InstantProvider for embassy_time::Instant { } #[cfg(feature = "wasm")] -/// A wrapper around `js_sys::Date` that implements `InstantProvider`. -/// -/// This type stores the timestamp as milliseconds since the Unix epoch. -#[derive(Clone, PartialEq)] -pub struct JsInstant(f64); +pub mod wasm { + //! A JS Date-based implementation of `InstantProvider`. + //! This can be useful for `wasm32-*` targets. -#[cfg(feature = "wasm")] -impl Sub for JsInstant { - type Output = Duration; + use core::{ops::Sub, time::Duration}; + + use crate::InstantProvider; + + /// A wrapper around `js_sys::Date` that implements `InstantProvider`. + /// + /// This type stores the timestamp as milliseconds since the Unix epoch. + #[derive(Clone, PartialEq)] + pub struct Instant(f64); - fn sub(self, rhs: Self) -> Self::Output { - let delta_ms = self.0 - rhs.0; - Duration::from_millis(delta_ms as u64) + impl Sub for Instant { + type Output = Duration; + + fn sub(self, rhs: Self) -> Self::Output { + let delta_ms = self.0 - rhs.0; + Duration::from_millis(delta_ms as u64) + } } -} -#[cfg(feature = "wasm")] -impl InstantProvider for JsInstant { - fn now() -> Self { - JsInstant(js_sys::Date::now()) + impl InstantProvider for Instant { + fn now() -> Self { + Instant(js_sys::Date::now()) + } } } diff --git a/src/lib.rs b/src/lib.rs index 0fb0c05..36e0a35 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,9 +8,6 @@ pub use config::{ButtonConfig, Mode}; pub use instant::InstantProvider; pub use pin_wrapper::PinWrapper; -#[cfg(feature = "wasm")] -pub use instant::JsInstant; - /// Button configuration. pub mod config; /// Different current global time sources. From 1bedda0b34887b9b597528f4e0ca59ad8b097be3 Mon Sep 17 00:00:00 2001 From: maxwase Date: Sun, 16 Nov 2025 18:30:19 +0200 Subject: [PATCH 3/6] Cleanup --- .vscode/settings.json | 7 ++- Cargo.toml | 2 +- examples/stm32-embassy/Cargo.lock | 56 ++++++++++----------- examples/stm32/Cargo.lock | 30 +++++------ examples/wasm/Cargo.lock | 84 +++++++++++++++---------------- examples/wasm/src/lib.rs | 13 +++-- 6 files changed, 100 insertions(+), 92 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 49d678a..343e73e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,8 @@ { - "rust-analyzer.cargo.features": ["std"] + "rust-analyzer.cargo.features": [ + "std", + "embedded_hal", + "wasm", + "embassy" + ] } \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 96b9420..52e3f3d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ readme = "README.md" exclude = [".*"] [package.metadata.docs.rs] -features = ["std"] +features = ["std", "embassy", "embedded_hal", "wasm"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/examples/stm32-embassy/Cargo.lock b/examples/stm32-embassy/Cargo.lock index dd7b0ef..3c01e4b 100644 --- a/examples/stm32-embassy/Cargo.lock +++ b/examples/stm32-embassy/Cargo.lock @@ -55,9 +55,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.3" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "block-device-driver" @@ -70,7 +70,7 @@ dependencies = [ [[package]] name = "button-driver" -version = "0.2.3" +version = "0.2.4" dependencies = [ "embassy-time", "embedded-hal 0.2.7", @@ -84,9 +84,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cortex-m" @@ -205,9 +205,9 @@ dependencies = [ [[package]] name = "defmt-rtt" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cac3b8a5644a9e02b75085ebad3b6deafdbdbdec04bb25086523828aa4dfd1" +checksum = "93d5a25c99d89c40f5676bec8cefe0614f17f0f40e916f98e345dae941807f9e" dependencies = [ "critical-section", "defmt 1.0.1", @@ -215,9 +215,9 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] @@ -243,9 +243,9 @@ dependencies = [ [[package]] name = "embassy-executor" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c80c92a31c7f6b02a938f10feea17ea3cc0e8d33bcac7f3fe8cede3723bb56" +checksum = "06070468370195e0e86f241c8e5004356d696590a678d47d6676795b2e439c6b" dependencies = [ "cortex-m", "critical-section", @@ -308,7 +308,7 @@ checksum = "0d972eab325cc96afee98f80a91ca6b00249b6356dc0fdbff68b70c200df9fae" dependencies = [ "aligned", "bit_field", - "bitflags 2.9.3", + "bitflags 2.10.0", "block-device-driver", "cfg-if", "cortex-m", @@ -563,9 +563,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "litrs" -version = "0.4.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "nb" @@ -637,18 +637,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -697,9 +697,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -750,9 +750,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.106" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -761,18 +761,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -781,9 +781,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "vcell" diff --git a/examples/stm32/Cargo.lock b/examples/stm32/Cargo.lock index 0d13ed0..07be746 100644 --- a/examples/stm32/Cargo.lock +++ b/examples/stm32/Cargo.lock @@ -31,7 +31,7 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "button-driver" -version = "0.2.3" +version = "0.2.4" dependencies = [ "embedded-hal", ] @@ -108,9 +108,9 @@ dependencies = [ [[package]] name = "fugit" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17186ad64927d5ac8f02c1e77ccefa08ccd9eaa314d5a4772278aa204a22f7e7" +checksum = "4e639847d312d9a82d2e75b0edcc1e934efcc64e6cb7aa94f0b1fbec0bc231d6" dependencies = [ "gcd", ] @@ -160,27 +160,27 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] [[package]] name = "rtt-target" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4235cd78091930e907d2a510adb0db1369e82668eafa338f109742fa0c83059d" +checksum = "e7afed1f4302eeba88c601636cf2c554c45e1cbb464bab44c6012bab0e71473c" dependencies = [ "critical-section", "portable-atomic", @@ -213,9 +213,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stm32" @@ -274,9 +274,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -291,9 +291,9 @@ checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "usb-device" diff --git a/examples/wasm/Cargo.lock b/examples/wasm/Cargo.lock index fb39b93..6dbeae2 100644 --- a/examples/wasm/Cargo.lock +++ b/examples/wasm/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "button-driver" @@ -17,54 +17,61 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "log" -version = "0.4.22" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "syn" -version = "2.0.68" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -73,9 +80,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "wasm" @@ -90,34 +97,22 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", "once_cell", - "proc-macro2", - "quote", - "syn", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -125,22 +120,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-logger" @@ -155,9 +153,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/examples/wasm/src/lib.rs b/examples/wasm/src/lib.rs index 03c9596..1718868 100644 --- a/examples/wasm/src/lib.rs +++ b/examples/wasm/src/lib.rs @@ -1,16 +1,16 @@ //! A WebAssembly example demonstrating button driver usage in the browser. -//! This example uses the built-in `JsInstant` type which wraps `js_sys::Date::now()`. +//! This example uses the built-in [instant::wasm::Instant] type which wraps `js_sys::Date::now()`. //! //! To run this example: //! 1. Install trunk: `cargo install trunk` //! 2. Run: `trunk serve` //! 3. Open your browser at `http://localhost:8080` //! -//! Required features: `wasm` (which includes `std` and `js-sys`). +//! Required features: `wasm`. use std::{cell::RefCell, rc::Rc}; -use button_driver::{Button, ButtonConfig, JsInstant, Mode, PinWrapper}; +use button_driver::{instant::wasm::Instant, Button, ButtonConfig, Mode, PinWrapper}; use log::info; use wasm_bindgen::{closure::Closure, JsCast}; use web_sys::MouseEvent; @@ -27,9 +27,12 @@ impl PinWrapper for ButtonInput { #[wasm_bindgen::prelude::wasm_bindgen(start)] pub fn main() { wasm_logger::init(wasm_logger::Config::default()); + let document = web_sys::window().unwrap().document().unwrap(); let clickable_area = document.query_selector(".clickable-area").unwrap().unwrap(); + let pin_state = ButtonInput::default(); + { let pin_state_ref = pin_state.clone(); let mouse_down_handler = Closure::wrap(Box::new(move |_: MouseEvent| { @@ -43,6 +46,7 @@ pub fn main() { .unwrap(); mouse_down_handler.forget(); } + { let pin_state_ref = pin_state.clone(); let mouse_up_handler = Closure::wrap(Box::new(move |_: MouseEvent| { @@ -54,8 +58,9 @@ pub fn main() { .unwrap(); mouse_up_handler.forget(); } + { - let mut button = Button::<_, JsInstant>::new( + let mut button = Button::<_, Instant>::new( pin_state, ButtonConfig { mode: Mode::PullDown, From e46ff1807f2a058b88f99cf7b887e89613081415 Mon Sep 17 00:00:00 2001 From: maxwase Date: Sun, 16 Nov 2025 18:32:54 +0200 Subject: [PATCH 4/6] Simplify CI --- .github/workflows/rust.yml | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 8139a5e..b13689f 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -19,17 +19,11 @@ jobs: - name: Format run: cargo fmt --check - - name: Clippy std - run: cargo clippy --features std --tests -- -D warnings - - name: Clippy embassy - run: cargo clippy --features embassy -- -D warnings - - name: Clippy embedded_hal - run: | - cargo clippy --features embedded_hal -- -D warnings - cargo clippy --features embedded_hal_old -- -D warnings - - name: Clippy wasm - run: cargo clippy --features wasm -- -D warnings - - name: Clippy default + - name: Clippy first + run: cargo clippy --features std,wasm,embassy,embedded_hal --tests -- -D warnings + - name: Clippy embedded_hal_old + run: cargo clippy --features embedded_hal_old -- -D warnings + - name: Clippy no default run: cargo clippy --no-default-features -- -D warnings - name: Install dependencies @@ -45,7 +39,7 @@ jobs: run: cargo clippy -- -D warnings - name: Build example wasm working-directory: examples/wasm - run: cargo build --target wasm32-unknown-unknown --release + run: cargo build --target wasm32-unknown-unknown - name: Tests run: cargo test tests --features std From a5360f58bc6dd20aaf5a212f816a6c7d63e51c57 Mon Sep 17 00:00:00 2001 From: maxwase Date: Sun, 16 Nov 2025 18:34:57 +0200 Subject: [PATCH 5/6] Version bump --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 52e3f3d..b2d51bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "button-driver" -version = "0.2.4" +version = "0.2.5" edition = "2021" authors = ["maxwase", "Max T "] description = "Advanced button handling crate" From c57ff4f0cbd330c545dd1bf126fcf4b13845a1cc Mon Sep 17 00:00:00 2001 From: maxwase Date: Sun, 16 Nov 2025 18:44:22 +0200 Subject: [PATCH 6/6] Review fixes --- .github/workflows/rust.yml | 2 +- README.md | 2 +- examples/wasm/Cargo.lock | 2 +- examples/wasm/src/lib.rs | 2 +- src/instant.rs | 5 ++++- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b13689f..61bc076 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -19,7 +19,7 @@ jobs: - name: Format run: cargo fmt --check - - name: Clippy first + - name: Clippy common run: cargo clippy --features std,wasm,embassy,embedded_hal --tests -- -D warnings - name: Clippy embedded_hal_old run: cargo clippy --features embedded_hal_old -- -D warnings diff --git a/README.md b/README.md index c47a5d3..4dc8c87 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ This crate aims to be as flexible as possible to support various HALs and use-ca ## Examples For more examples consider looking into the [examples](https://github.com/maxwase/button-driver/tree/master/examples) folder. -You can easily flash/rub them using `cargo run` command! Use `trunk serve` to run the wasm example. +You can easily flash/run them using `cargo run` command! Use `trunk serve` to run the wasm example. For **ESP32C3** with std: diff --git a/examples/wasm/Cargo.lock b/examples/wasm/Cargo.lock index 6dbeae2..77487cf 100644 --- a/examples/wasm/Cargo.lock +++ b/examples/wasm/Cargo.lock @@ -10,7 +10,7 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "button-driver" -version = "0.2.4" +version = "0.2.5" dependencies = [ "js-sys", ] diff --git a/examples/wasm/src/lib.rs b/examples/wasm/src/lib.rs index 1718868..b7b0276 100644 --- a/examples/wasm/src/lib.rs +++ b/examples/wasm/src/lib.rs @@ -1,5 +1,5 @@ //! A WebAssembly example demonstrating button driver usage in the browser. -//! This example uses the built-in [instant::wasm::Instant] type which wraps `js_sys::Date::now()`. +//! This example uses the built-in [button_driver::instant::wasm::Instant] type which wraps `js_sys::Date::now()`. //! //! To run this example: //! 1. Install trunk: `cargo install trunk` diff --git a/src/instant.rs b/src/instant.rs index 4043193..c75aec0 100644 --- a/src/instant.rs +++ b/src/instant.rs @@ -51,8 +51,11 @@ pub mod wasm { type Output = Duration; fn sub(self, rhs: Self) -> Self::Output { + // Instant should be monotonic, so self.0 >= rhs.0 let delta_ms = self.0 - rhs.0; - Duration::from_millis(delta_ms as u64) + let millis = delta_ms.trunc() as u64; + let micros = (delta_ms.fract() * 1000.0) as u64; + Duration::from_millis(millis) + Duration::from_micros(micros) } }