1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//! Core types for describing communication with Luminator flip-dot and LED signs.
//!
//! For the basic task of sign communication, you likely want to use the high-level API
//! in the [`flipdot`] crate instead.
//!
//! However, `flipdot_core` is useful for crates that want to interact with the sign protocol
//! at a lower level than the `flipdot` crate, or who want to provide their own [`SignBus`]
//! implementations for use by `flipdot`.
//!
//! Tested with a MAX3000 90 × 7 side sign. Should work with any flip-dot or LED sign that uses the 7-pin circular
//! connector, but no guarantees.
//!
//! Intended only for hobbyist and educational purposes. Not affiliated with Luminator in any way.
//!
//! # Examples
//!
//! ```no_run
//! use flipdot_core::{Address, Message, Operation, PageFlipStyle, SignBus, SignType, State};
//! # use flipdot_testing::{VirtualSign, VirtualSignBus};
//!
//! # fn get_bus() -> Box<dyn SignBus> { Box::new(VirtualSignBus::new(vec![VirtualSign::new(Address(3), PageFlipStyle::Manual)])) }
//! # fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
//! #
//! // Assume we have a helper function to obtain a SignBus.
//! let mut bus: Box<dyn SignBus> = get_bus();
//!
//! // Discover the sign and verify that is has not yet been configured.
//! let message = Message::Hello(Address(3));
//! let response = bus.process_message(message)?;
//! assert_eq!(Some(Message::ReportState(Address(3), State::Unconfigured)), response);
//!
//! // Request that the sign receive the configuration data and verify that it acknowledges.
//! let message = Message::RequestOperation(Address(3), Operation::ReceiveConfig);
//! let response = bus.process_message(message)?;
//! assert_eq!(Some(Message::AckOperation(Address(3), Operation::ReceiveConfig)), response);
//!
//! #
//! # Ok(()) }
//! ```
//!
//! [`flipdot`]: https://docs.rs/flipdot
#![doc(html_root_url = "https://docs.rs/flipdot-core/0.7.1")]
#![deny(
    missing_copy_implementations,
    missing_debug_implementations,
    trivial_casts,
    trivial_numeric_casts,
    unsafe_code
)]
#![warn(
    missing_docs,
    unused_extern_crates,
    unused_import_braces,
    unused_qualifications,
    unused_results
)]

mod frame;
mod message;
mod page;
mod sign_bus;
mod sign_type;

pub use self::frame::{Address, Data, Frame, FrameError, MsgType};
pub use self::message::{ChunkCount, Message, Offset, Operation, State};
pub use self::page::{Page, PageError, PageFlipStyle, PageId};
pub use self::sign_bus::SignBus;
pub use self::sign_type::{SignType, SignTypeError};