shared-bus 0.3.1

Abstraction for sharing a bus between multiple devices.
Documentation
use embedded_hal::prelude::*;
use embedded_hal_mock::adc;
use std::thread;

#[test]
fn adc_mock_device() {
    let expectations = [
        adc::Transaction::read(0, 0xabcd),
        adc::Transaction::read(1, 0xabba),
        adc::Transaction::read(2, 0xbaab),
    ];

    let mut device = adc::Mock::new(&expectations);
    assert_eq!(0xabcd, device.read(&mut adc::MockChan0).unwrap());
    assert_eq!(0xabba, device.read(&mut adc::MockChan1).unwrap());
    assert_eq!(0xbaab, device.read(&mut adc::MockChan2).unwrap());
    device.done()
}

#[test]
fn adc_manager_simple() {
    let expectations = [
        adc::Transaction::read(0, 0xabcd),
        adc::Transaction::read(1, 0xabba),
        adc::Transaction::read(2, 0xbaab),
    ];

    let mut device = adc::Mock::new(&expectations);
    let manager = shared_bus::BusManagerSimple::new(device.clone());
    let mut proxy = manager.acquire_adc();

    assert_eq!(0xabcd, proxy.read(&mut adc::MockChan0).unwrap());
    assert_eq!(0xabba, proxy.read(&mut adc::MockChan1).unwrap());
    assert_eq!(0xbaab, proxy.read(&mut adc::MockChan2).unwrap());
    device.done()
}

#[test]
fn adc_manager_std() {
    let expectations = [
        adc::Transaction::read(0, 0xabcd),
        adc::Transaction::read(1, 0xabba),
        adc::Transaction::read(2, 0xbaab),
    ];

    let mut device = adc::Mock::new(&expectations);
    let manager: &'static shared_bus::BusManagerStd<_> =
        shared_bus::new_std!(adc::Mock<u16> = device.clone()).unwrap();
    let mut proxy = manager.acquire_adc();

    assert_eq!(0xabcd, proxy.read(&mut adc::MockChan0).unwrap());
    assert_eq!(0xabba, proxy.read(&mut adc::MockChan1).unwrap());
    assert_eq!(0xbaab, proxy.read(&mut adc::MockChan2).unwrap());
    device.done()
}

#[test]
fn adc_proxy_multi() {
    let expectations = [
        adc::Transaction::read(0, 0xabcd),
        adc::Transaction::read(1, 0xabba),
        adc::Transaction::read(2, 0xbaab),
    ];

    let mut device = adc::Mock::new(&expectations);
    let manager = shared_bus::BusManagerSimple::new(device.clone());
    let mut proxy1 = manager.acquire_adc();
    let mut proxy2 = manager.acquire_adc();
    let mut proxy3 = manager.acquire_adc();

    assert_eq!(0xabcd, proxy1.read(&mut adc::MockChan0).unwrap());
    assert_eq!(0xabba, proxy2.read(&mut adc::MockChan1).unwrap());
    assert_eq!(0xbaab, proxy3.read(&mut adc::MockChan2).unwrap());
    device.done()
}

#[test]
fn adc_proxy_concurrent() {
    let expectations = [
        adc::Transaction::read(0, 0xabcd),
        adc::Transaction::read(1, 0xabba),
        adc::Transaction::read(2, 0xbaab),
    ];

    let mut device = adc::Mock::new(&expectations);
    let manager: &'static shared_bus::BusManagerStd<_> =
        shared_bus::new_std!(adc::Mock<u32> = device.clone()).unwrap();
    let mut proxy1 = manager.acquire_adc();
    let mut proxy2 = manager.acquire_adc();
    let mut proxy3 = manager.acquire_adc();

    thread::spawn(move || {
        assert_eq!(0xabcd, proxy1.read(&mut adc::MockChan0).unwrap());
    })
    .join()
    .unwrap();

    thread::spawn(move || {
        assert_eq!(0xabba, proxy2.read(&mut adc::MockChan1).unwrap());
    })
    .join()
    .unwrap();

    assert_eq!(0xbaab, proxy3.read(&mut adc::MockChan2).unwrap());

    device.done()
}