O padrĂŁo de estado de tipo

#[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 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.
  • Muitos crates HAL seguem esse padrĂŁo.