Struct VirtualSignBus

Source
pub struct VirtualSignBus<'a> { /* private fields */ }
Expand description

Mock implementation of a bus containing one or more signs.

The bus is populated with one or more VirtualSigns which actually implement the sign protocol. VirtualSignBus forwards messages to each virtual sign in turn until one of them handles it.

While most likely not a 100% accurate implementation of the protocol, it is sufficient for interacting with a real ODK.

Messages and responses are logged using the log crate for debugging purposes. Consuming binaries typically use the env_logger crate and can be run with the RUST_LOG=debug environment variable to watch the bus messages go by.

§Examples

use flipdot_core::PageFlipStyle;
use flipdot_serial::SerialSignBus;
use flipdot_testing::{Address, Odk, VirtualSign, VirtualSignBus};

let bus = VirtualSignBus::new(vec![VirtualSign::new(Address(3), PageFlipStyle::Manual)]);
let port = serial::open("/dev/ttyUSB0")?;
let mut odk = Odk::try_new(port, bus)?;
loop {
    // VirtualSignBus processes the messsages from the real ODK over serial.
    odk.process_message()?;
}

Implementations§

Source§

impl<'a> VirtualSignBus<'a>

Source

pub fn new<I>(signs: I) -> Self
where I: IntoIterator<Item = VirtualSign<'a>>,

Creates a new VirtualSignBus with the specified virtual signs.

§Examples
let bus = VirtualSignBus::new(vec![VirtualSign::new(Address(3), PageFlipStyle::Manual)]);
let port = serial::open("COM3")?;
let odk = Odk::try_new(port, bus)?;
Source

pub fn sign(&self, index: usize) -> &VirtualSign<'a>

Returns a reference to the VirtualSign at a specific index matching the original order passed to new.

Useful when writing tests in order to verify properties of an individual sign.

§Examples
let signs = vec![VirtualSign::new(Address(5), PageFlipStyle::Manual), VirtualSign::new(Address(16), PageFlipStyle::Manual)];
let bus = VirtualSignBus::new(signs);
let second_sign = bus.sign(1);
assert_eq!(Address(16), second_sign.address());

Trait Implementations§

Source§

impl<'a> Clone for VirtualSignBus<'a>

Source§

fn clone(&self) -> VirtualSignBus<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

const fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for VirtualSignBus<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> Hash for VirtualSignBus<'a>

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<'a> PartialEq for VirtualSignBus<'a>

Source§

fn eq(&self, other: &VirtualSignBus<'a>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

const fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl SignBus for VirtualSignBus<'_>

Source§

fn process_message<'a>( &mut self, message: Message<'_>, ) -> Result<Option<Message<'a>>, Box<dyn Error + Send + Sync>>

Handles a bus message by trying each sign in turn to see if it can handle it (i.e. returns a Some response).

Source§

impl<'a> Eq for VirtualSignBus<'a>

Source§

impl<'a> StructuralPartialEq for VirtualSignBus<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for VirtualSignBus<'a>

§

impl<'a> RefUnwindSafe for VirtualSignBus<'a>

§

impl<'a> Send for VirtualSignBus<'a>

§

impl<'a> Sync for VirtualSignBus<'a>

§

impl<'a> Unpin for VirtualSignBus<'a>

§

impl<'a> UnwindSafe for VirtualSignBus<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.