diff --git a/src/app_dio.rs b/src/app_dio.rs index 15a7562..c9072fc 100644 --- a/src/app_dio.rs +++ b/src/app_dio.rs @@ -4,9 +4,11 @@ use crate::uart_debug::uart_debug_print; use crate::{api_dio::PicohaDioAnswer, api_dio::PicohaDioRequest, print_debug_message}; use core::fmt::Write; +use rp2040_hal::gpio::new_pin; // Message deserialization support use femtopb::Message; +use rp2040_hal::gpio::DynPinId; // USB Communications Class Device support use usbd_serial::SerialPort; @@ -37,7 +39,7 @@ pub struct AppDio { // Decode buffer decode_buffer: [u8; BUFFER_CAPACITY], - // rp_pins: rp_pico::Pins, + pins_id: [Option; MAX_PINS], pins_o: [Option; MAX_PINS], pins_i: [Option; MAX_PINS], } @@ -45,23 +47,43 @@ pub struct AppDio { impl AppDio { /// Create a new instance of the AppDio /// - pub fn new() -> Self { + pub fn new(pins_id: [Option; MAX_PINS]) -> Self { AppDio { in_buf: [0u8; 64], in_buf_size: 0, decode_buffer: [0u8; 64], - // rp_pins: rp_pins, + pins_id: pins_id, pins_o: [PINO_NONE; MAX_PINS], pins_i: [PINI_NONE; MAX_PINS], } } - // fn set_pin_as_output(&mut self, pin_num: u32) { - // let pin_num = pin_num as usize; - // if pin_num < MAX_PINS { - // self.pins_o[pin_num] = Some(pin.into_push_pull_output().into_dyn_pin()); - // } - // } + /// Set a pin as output + /// + fn set_pin_as_output(&mut self, pin_num: u32) { + self.pins_id[pin_num as usize] + .map(|dyn_id| unsafe { + let pin = new_pin(dyn_id); + pin.try_into_function::() + .and_then(|pin_out| { + self.pins_o[pin_num as usize] = Some(pin_out); + Ok(()) + }) + // Ignore the error, just a warning + .map_err(|_| { + print_debug_message!( + " * error converting pin {:?} to output", + pin_num + ); + }) + .ok(); + }) + // Ignore the error, just a warning + .ok_or_else(|| { + print_debug_message!(" * pin {:?} not available", pin_num); + }) + .ok(); + } /// Accumulate new data /// @@ -181,11 +203,17 @@ impl AppDio { Self::send_answer(serial, answer); } + /// Process a set pin direction request + /// fn process_request_set_pin_direction( serial: &mut SerialPort, request: PicohaDioRequest, ) { print_debug_message!(b" * processing request: SET_PIN_DIRECTION"); + + // self + // request.pin_num + let mut answer = PicohaDioAnswer::default(); answer.r#type = femtopb::EnumValue::Known(crate::api_dio::AnswerType::Success); Self::send_answer(serial, answer); diff --git a/src/main.rs b/src/main.rs index e131ff8..2258381 100644 --- a/src/main.rs +++ b/src/main.rs @@ -114,34 +114,29 @@ unsafe fn main() -> ! { // .into_push_pull_output() // .into_pull_type() // .into_dyn_pin(); - let p2 = pins - .gpio3 - .into_floating_input() - .into_pull_type() - .into_dyn_pin(); - - let did = pins.led.into_push_pull_output().into_dyn_pin().id(); - let pppppp = new_pin(did); - - let mut neerr = pppppp - .try_into_function::() - .ok() - .unwrap(); + + // let did: rp2040_hal::gpio::DynPinId = pins.led.into_push_pull_output().into_dyn_pin().id(); + // let pppppp = new_pin(did); + + // let mut neerr = pppppp + // .try_into_function::() + // .ok() + // .unwrap(); // let pppppppppppp = neerr.into_push_pull_output(); - neerr.set_high().unwrap(); + // neerr.set_high().unwrap(); - delay.delay_ms(2000u32); + // delay.delay_ms(2000u32); - let pppppp2 = new_pin(did); + // let pppppp2 = new_pin(did); - let mut neerr2 = pppppp2 - .try_into_function::() - .ok() - .unwrap(); + // let mut neerr2 = pppppp2 + // .try_into_function::() + // .ok() + // .unwrap(); - print_debug_message!("Hello World! {}\r\n", neerr2.is_high().unwrap()); + // print_debug_message!("Hello World! {}\r\n", neerr2.is_high().unwrap()); // let dd = p2.reconfigure(); @@ -155,12 +150,6 @@ unsafe fn main() -> ! { // pins_array_oooo[0].as_mut().unwrap().set_high().unwrap(); - let pins_array: [Pin< - rp2040_hal::gpio::DynPinId, - rp2040_hal::gpio::FunctionSio, - rp2040_hal::gpio::DynPullType, - >; 1] = [p2]; - // // configure LED pin for Pio0. // // let led: Pin<_, FunctionPio0, _> = pins.led.into_function(); // let p0: Pin<_, FunctionPio0, _> = pins.gpio0.into_function(); @@ -214,7 +203,42 @@ unsafe fn main() -> ! { // -------------------------------------------------------------- // - let mut app = AppDio::new(); + let pins_id = [ + // Some(pins.gpio0.into_dyn_pin().id()), + // Some(pins.gpio1.into_dyn_pin().id()), + None, // 0 debug uart + None, // 1 debug uart + Some(pins.gpio2.into_dyn_pin().id()), + Some(pins.gpio3.into_dyn_pin().id()), + Some(pins.gpio4.into_dyn_pin().id()), + Some(pins.gpio5.into_dyn_pin().id()), + Some(pins.gpio6.into_dyn_pin().id()), + Some(pins.gpio7.into_dyn_pin().id()), + Some(pins.gpio8.into_dyn_pin().id()), + Some(pins.gpio9.into_dyn_pin().id()), + Some(pins.gpio10.into_dyn_pin().id()), + Some(pins.gpio11.into_dyn_pin().id()), + Some(pins.gpio12.into_dyn_pin().id()), + Some(pins.gpio13.into_dyn_pin().id()), + Some(pins.gpio14.into_dyn_pin().id()), + Some(pins.gpio15.into_dyn_pin().id()), + Some(pins.gpio16.into_dyn_pin().id()), + Some(pins.gpio17.into_dyn_pin().id()), + Some(pins.gpio18.into_dyn_pin().id()), + Some(pins.gpio19.into_dyn_pin().id()), + Some(pins.gpio20.into_dyn_pin().id()), + Some(pins.gpio21.into_dyn_pin().id()), + Some(pins.gpio22.into_dyn_pin().id()), + None, // 23 + None, // 24 + Some(pins.led.into_dyn_pin().id()), // 25 led + None, // 26 + None, // 27 + Some(pins.gpio28.into_dyn_pin().id()), + None, + ]; + + let mut app = AppDio::new(pins_id); loop { // Check for new data if usb_dev.poll(&mut [&mut serial]) {