diff --git a/Cargo.lock b/Cargo.lock index dcb44c4c..3904549f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -474,7 +474,7 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "ledger_device_sdk" -version = "1.19.6" +version = "1.20.0" dependencies = [ "const-zero", "include_gif", diff --git a/ledger_device_sdk/Cargo.toml b/ledger_device_sdk/Cargo.toml index 1e93ced6..a30f9f1e 100644 --- a/ledger_device_sdk/Cargo.toml +++ b/ledger_device_sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ledger_device_sdk" -version = "1.19.6" +version = "1.20.0" authors = ["yhql", "yogh333", "agrojean-ledger", "kingofpayne"] edition = "2021" license.workspace = true diff --git a/ledger_device_sdk/examples/nbgl_spinner.rs b/ledger_device_sdk/examples/nbgl_spinner.rs index d711d77d..568dc180 100644 --- a/ledger_device_sdk/examples/nbgl_spinner.rs +++ b/ledger_device_sdk/examples/nbgl_spinner.rs @@ -49,7 +49,7 @@ extern "C" fn sample_main() { .glyph(&FERRIS) .show(&my_field); - NbglSpinner::new().text("Please wait...").show(); + NbglSpinner::new().show("Please wait..."); // Simulate an idle state of the app where it just // waits for some event to happen (such as APDU reception), going through diff --git a/ledger_device_sdk/src/libcall/swap.rs b/ledger_device_sdk/src/libcall/swap.rs index dfd8e5f7..41a06978 100644 --- a/ledger_device_sdk/src/libcall/swap.rs +++ b/ledger_device_sdk/src/libcall/swap.rs @@ -217,7 +217,7 @@ pub fn sign_tx_params(arg0: u32) -> CreateTxParams { } #[cfg(any(target_os = "stax", target_os = "flex"))] - NbglSpinner::new().text("Signing").show(); + NbglSpinner::new().show("Signing"); create_tx_params } diff --git a/ledger_device_sdk/src/nbgl/nbgl_spinner.rs b/ledger_device_sdk/src/nbgl/nbgl_spinner.rs index 83c99368..b13ff56b 100644 --- a/ledger_device_sdk/src/nbgl/nbgl_spinner.rs +++ b/ledger_device_sdk/src/nbgl/nbgl_spinner.rs @@ -1,28 +1,34 @@ use super::*; +extern crate alloc; +use alloc::ffi::CString; /// A wrapper around the asynchronous NBGL nbgl_useCaseSpinner C API binding. /// Draws a spinner page with the given parameters. The spinner will "turn" automatically every /// 800 ms, provided the IO event loop is running to process TickerEvents. +#[derive(Debug, Default)] pub struct NbglSpinner { - text: CString, + text: [CString; 2], + write_idx: usize, + read_idx: usize, } impl NbglSpinner { pub fn new() -> NbglSpinner { NbglSpinner { - text: CString::new("").unwrap(), + text: [CString::default(), CString::default()], + write_idx: 0, + read_idx: 0, } } - pub fn text(self, text: &str) -> NbglSpinner { - NbglSpinner { - text: CString::new(text).unwrap(), - } - } - - pub fn show(&self) { + /// Shows the spinner with the current text. + /// Every call make the spinner "turn" to the next text. + pub fn show(&mut self, text: &str) { + self.text[self.write_idx] = CString::new(text).unwrap(); + self.read_idx = self.write_idx; + self.write_idx = (self.write_idx + 1) % 2; unsafe { - nbgl_useCaseSpinner(self.text.as_ptr() as *const c_char); + nbgl_useCaseSpinner(self.text[self.read_idx].as_ptr() as *const c_char); } } }