aic8800 0.3.0

OS-independent AIC8800 Wi-Fi driver core
use aic8800::{
    AicAction, AicDevice, AicInput, AicInputEvent, ChipVariant, MonotonicTime, SdioCompletion,
    SdioRequestKind, SdioResponse,
};

#[test]
fn public_startup_api_owns_the_sdio_function_lifecycle() {
    let now = MonotonicTime::from_nanos(0);
    let mut device = AicDevice::new(ChipVariant::Aic8800D80).expect("AIC8800 D80 is supported");
    device.start(now).expect("stopped device can start");

    let AicAction::SubmitSdio(block_size) = device.advance(AicInput::tick(now)) else {
        panic!("startup must configure the SDIO function block size")
    };
    assert!(matches!(
        block_size.kind,
        SdioRequestKind::SetBlockSize { function, .. } if function.get() == 1
    ));

    let action = device.advance(AicInput {
        now,
        event: Some(AicInputEvent::Sdio(SdioCompletion {
            request_id: block_size.id,
            result: Ok(SdioResponse::Unit),
        })),
    });
    assert!(matches!(
        action,
        AicAction::SubmitSdio(request)
            if matches!(request.kind, SdioRequestKind::EnableFunction(function) if function.get() == 1)
    ));
}