Closed
Description
I'm trying to implement a bit-bang controller for a peripheral (ADNS5050, specifically), based an CPP arduino code.
The problem I've run into, is that I need to be able to use one of the pins as both input and output. If there's an ergonomic/intuitive way to do this as things already are, I've missed it.
Ideally, I'd be able to write something like this:
struct ADNSDriver<'a, MODE>
{
sdio: &'a mut dyn IOPin<Error = Infallible, MODE>,
srl_clk: &'a mut dyn OutputPin<Error = Infallible>,
not_reset: &'a mut dyn OutputPin<Error = Infallible>,
not_chip_sel: &'a mut dyn OutputPin<Error = Infallible>,
pix: [u8; 360],
}
Reason being, is I have code a bit like this:
fn read_reg(&mut self, addr: ADNSRegs, delay: &mut Delay) -> u8 {
let stdio_writer = self.sdio.into_push_pull_output();
let mut addr = addr as u8;
for _ in 0..8 {
// use bit-banging to write with the sdio pin as an output
// in order to choose which memory address to read from
}
let mut res = 0u8;
for i in 0..8 {
// use bit-baning to read from the sdio-pin as an InputPin in order to get the value at
// that memory address
}
res
}
...the ADNSDriver can use the sdio
field either an output pin XOR an input pin. If there's a way to dance between the two modes in a nice way, I been unable to come across it.
Context: rust-embedded/embedded-hal#357 in short: embedded-hal
has the IoPin
trait as well as some others, but is removing it for 1.0.0
(follow link for details).
Metadata
Metadata
Assignees
Type
Projects
Status
Done