diff --git a/sphinx-key/src/core/events.rs b/sphinx-key/src/core/events.rs index 8670a1a..b39770b 100644 --- a/sphinx-key/src/core/events.rs +++ b/sphinx-key/src/core/events.rs @@ -41,6 +41,9 @@ pub enum Status { Connected, Signing, Ota, + Reset1, + Reset2, + Reset3, } pub const ROOT_STORE: &str = "/sdcard/store"; diff --git a/sphinx-key/src/main.rs b/sphinx-key/src/main.rs index 8ce3c02..4d18b42 100644 --- a/sphinx-key/src/main.rs +++ b/sphinx-key/src/main.rs @@ -7,6 +7,7 @@ mod periph; use crate::core::control::{controller_from_seed, FlashPersister}; use crate::core::{config::*, events::*}; // use crate::periph::led::led_control_loop; +use crate::periph::button::button_loop; #[allow(unused_imports)] use crate::periph::sd::{mount_sd_card, simple_fs_test}; @@ -39,12 +40,17 @@ fn main() -> Result<()> { thread::sleep(Duration::from_secs(1)); let peripherals = Peripherals::take().unwrap(); - let _pins = peripherals.pins; + let pins = peripherals.pins; let (led_tx, _led_rx) = mpsc::channel(); // LED control thread // led_control_loop(pins.gpio0, peripherals.rmt.channel0, led_rx); + // BUTTON thread + // button_loop(pins.gpio8, led_tx.clone()); + + // thread::sleep(Duration::from_secs(100)); + led_tx.send(Status::MountingSDCard).unwrap(); println!("About to mount the sdcard..."); while let Err(_e) = mount_sd_card() { diff --git a/sphinx-key/src/periph/button.rs b/sphinx-key/src/periph/button.rs new file mode 100644 index 0000000..91793e7 --- /dev/null +++ b/sphinx-key/src/periph/button.rs @@ -0,0 +1,50 @@ +use crate::core::events::Status; +use esp_idf_hal::gpio; +use esp_idf_hal::gpio::*; +use std::sync::mpsc; +use std::thread; +use std::time::Duration; + +const MILLIS: u16 = 10_000; + +const PAUSE: u16 = 15; + +pub fn button_loop(gpio8: gpio::Gpio8, tx: mpsc::Sender) { + thread::spawn(move || { + let mut button = PinDriver::input(gpio8).unwrap(); + button.set_pull(Pull::Up).unwrap(); + let mut high = false; + let mut high_times = 0; + let mut low_times = 0; + loop { + // we are using thread::sleep here to make sure the watchdog isn't triggered + thread::sleep(Duration::from_millis(PAUSE.into())); + if button.is_high() { + if !high { + high = true; + log::info!("=> GPIO8 HIGH!"); + high_times = 0; + } + if high { + high_times = high_times + 1; + if PAUSE * high_times > MILLIS { + // stayed not held down + } + } + } else { + if high { + high = false; + log::info!("=> GPIO8 LOW!"); + low_times = 0; + } + if !high { + low_times = low_times + 1; + if PAUSE * low_times > MILLIS { + // stayed held down + tx.send(Status::Reset1).unwrap(); + } + } + } + } + }); +} diff --git a/sphinx-key/src/periph/led.rs b/sphinx-key/src/periph/led.rs index 05fef42..37ecdeb 100644 --- a/sphinx-key/src/periph/led.rs +++ b/sphinx-key/src/periph/led.rs @@ -1,6 +1,4 @@ use crate::core::events::Status; -// use embedded_hal::delay::blocking::DelayUs; -use esp_idf_hal::delay::FreeRtos; use esp_idf_hal::rmt::config::TransmitConfig; use esp_idf_hal::rmt::{FixedLengthSignal, PinState, Pulse, TxRmtDriver}; use esp_idf_hal::{gpio, rmt}; @@ -84,7 +82,8 @@ impl Led { } // Set high and wait tx.start_blocking(&signal).unwrap(); - FreeRtos::delay_ms(self.blink_length); + // FreeRtos::delay_ms(self.blink_length); + thread::sleep(Duration::from_millis(self.blink_length.into())); // Set low let mut signal = FixedLengthSignal::<24>::new(); for i in 0..24 { diff --git a/sphinx-key/src/periph/mod.rs b/sphinx-key/src/periph/mod.rs index bb1f34b..9677bf2 100644 --- a/sphinx-key/src/periph/mod.rs +++ b/sphinx-key/src/periph/mod.rs @@ -1,2 +1,3 @@ +pub mod button; pub mod led; pub mod sd; diff --git a/sphinx-key/up.sh b/sphinx-key/up.sh new file mode 100755 index 0000000..bd293d4 --- /dev/null +++ b/sphinx-key/up.sh @@ -0,0 +1,66 @@ +check_exists() { + command -v "$1" > /dev/null +} +check_port() { + cargo espflash board-info "$1" &> /dev/null +} +if ! check_exists esptool.py +then + echo "esptool.py not installed!" + echo "install with this command: pip install esptool" + exit 1 +fi +if ! check_exists ldproxy +then + echo "ldproxy not installed!" + echo "install with this command: cargo install ldproxy" + exit 1 +fi +if ! check_exists cargo-espflash +then + echo "cargo-espflash not installed!" + echo "install with this command: cargo install cargo-espflash" + exit 1 +fi +if [ -z "$SSID" ] +then + echo "Please set environment variable SSID to the SSID of the wifi you'll use to configure your sphinx-key." + exit 1 +fi +if [ -z "$PASS" ] +then + echo "Please set environment variable PASS to the password of the wifi you'll use to configure your sphinx-key." + exit 1 +fi +if [ ${#PASS} -lt 8 ] +then + echo "Please set PASS to a password longer than 7 characters." + exit 1 +fi +for FILE in /dev/tty.* +do + # Check for port on macOS + if check_port $FILE + then + PORT=$FILE + break + fi +done +if [ -z "$PORT" ] +then + # Check for port on linux + if check_port /dev/ttyUSB0 + then + PORT=/dev/ttyUSB0 + fi +fi +if [ -z "$PORT" ] +then + echo "ESP likely not connected! Exiting now." + echo "Make sure the ESP is connected with a data USB cable, and try again." + exit 1 +fi +cargo build --release && +esptool.py --chip esp32c3 elf2image target/riscv32imc-esp-espidf/release/sphinx-key && +esptool.py --chip esp32c3 -p $PORT -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 4MB 0x10000 target/riscv32imc-esp-espidf/release/sphinx-key.bin && +espmonitor $PORT