#[entry]
fn main() -> ! {
let p = Peripherals::take().unwrap();
let gpio0 = p0::Parts::new(p.P0);
let pin: P0_01<Disconnected> = gpio0.p0_01;
// let gpio0_01_again = gpio0.p0_01; // Erro, movido.
let mut pin_input: P0_01<Input<Floating>> = pin.into_floating_input();
if pin_input.is_high().unwrap() {
// ...
}
let mut pin_output: P0_01<Output<OpenDrain>> = pin_input
.into_open_drain_output(OpenDrainConfig::Disconnect0Standard1, Level::Low);
pin_output.set_high().unwrap();
// pin_input.is_high(); // Erro, movido.
let _pin2: P0_02<Output<OpenDrain>> = gpio0
.p0_02
.into_open_drain_output(OpenDrainConfig::Disconnect0Standard1, Level::Low);
let _pin3: P0_03<Output<PushPull>> =
gpio0.p0_03.into_push_pull_output(Level::Low);
loop {}
}
Pins não implementam Copy ou Clone, portanto, apenas uma instância de cada um pode existir. Uma vez que um pin é movido para fora da estrutura da porta, ninguém mais pode pegá-lo.
Alterar a configuração de um pin consome a instância antiga do pin, portanto, você não pode continuar usando a instância antiga depois.
O tipo de um valor indica o estado em que ele está: por exemplo, neste caso, o estado de configuração de um pin GPIO. Isso codifica a máquina de estados no sistema de tipos e garante que você não tente usar um pin de uma certa maneira sem configurá-lo corretamente primeiro. Transições de estado ilegais são capturadas em tempo de compilação.
Você pode chamar is_high em um pin de entrada e set_high em um pin de saída, mas não o contrário.