negicon-protocol 1.0.0

Definitions and utility functions for the Negicon v3 communication protocol
Documentation
#![no_std]

pub mod negicon_message;
pub mod ringbuf;
pub mod util;

pub use negicon_message::*;
pub use util::*;

#[cfg(test)]
mod tests {
    use crate::negicon_message::{InvalidMessage, NegiconFrame};

    use super::*;

    #[test]
    fn frame_de_serialize() {
        let frame = NegiconFrame::nop();
        let serialized = frame.serialize();
        let deserialized = NegiconFrame::deserialize(&serialized).unwrap();
        assert_eq!(frame, deserialized);
    }

    #[test]
    fn detect_corruption() {
        let frame = NegiconFrame::nop();
        let mut serialized = frame.serialize();
        serialized[5] = serialized[5].reverse_bits();
        let deserialized = NegiconFrame::deserialize(&serialized);
        assert_eq!(InvalidMessage::CrcError, deserialized.unwrap_err());
    }

    #[test]
    fn ping() {
        let frame = NegiconFrame::ping(0x1234, NegiconModuleType::Router, 0x56, 39);
        let serialized = frame.serialize();
        let deserialized = NegiconFrame::deserialize(&serialized);
        assert_eq!(frame, deserialized.unwrap());
        assert!(frame.is_ping());
    }

    #[test]
    fn nop() {
        let frame = NegiconFrame::nop();
        let serialized = frame.serialize();
        let deserialized = NegiconFrame::deserialize(&serialized);
        assert!(deserialized.unwrap().is_nop());
    }

    #[test]
    fn module_message_double() {
        let first = NegiconModuleEventShortMessage::new(1, 39, 42);
        let second = NegiconModuleEventShortMessage::new(2, 40, 43);
        let serialized = NegiconModuleEventShortMessage::serialize_double(&first, &second);
        let (deserialized_first, deserialized_second) =
            NegiconModuleEventShortMessage::deserialize_double(&serialized);
        assert_eq!(first, deserialized_first);
        assert_eq!(second, deserialized_second);
    }
}