can_aerospace_lite 0.1.3

A lite version of CAN Aerospace Implementation according to 'Interface specification for airborne CAN applications V 1.7'
Documentation
use can_aerospace_lite::{
    driver::CANAerospaceDriver,
    message::{CANAerospaceFrame, RawMessage},
    types::{DataType, HardwareRevision, MessageType, SoftwareRevision},
    CANAerospaceLite,
};

static mut COUNT: u32 = 0;

struct CANDriver;

impl CANAerospaceDriver for CANDriver {
    fn send_frame(&mut self, frame: CANAerospaceFrame) {
        println!("Send frame: {:#X?}", frame);
    }

    fn recv_frame(&mut self) -> Option<CANAerospaceFrame> {
        unsafe {
            return match COUNT {
                1 => Some(CANAerospaceFrame {
                    message_type: MessageType::NSH(128),
                    message: RawMessage::from([
                        10,
                        DataType::ULONG(0).type_id(),
                        2,
                        3,
                        0xBA,
                        0xBA,
                        0xDE,
                        0xDE,
                    ]),
                }),
                0 => Some(CANAerospaceFrame {
                    message_type: MessageType::NOD(300),
                    message: RawMessage::from([
                        0,
                        DataType::BSHORT2(0, 0).type_id(),
                        2,
                        3,
                        0xDE,
                        0xDE,
                        0xDE,
                        0xDE,
                    ]),
                }),
                2 => Some(CANAerospaceFrame {
                    message_type: MessageType::UDH(200),
                    message: RawMessage::from([
                        0,
                        DataType::BSHORT2(0, 0).type_id(),
                        2,
                        3,
                        0xA,
                        0xB,
                        0xC,
                        0xD,
                    ]),
                }),
                3 => Some(CANAerospaceFrame {
                    message_type: MessageType::NSH(128),
                    message: RawMessage::from([
                        10,
                        DataType::NODATA.type_id(),
                        0,
                        3,
                        0xFB,
                        0xFB,
                        0xDE,
                        0xDE,
                    ]),
                }),
                _ => None,
            };
        }
    }
}

fn main() {
    let mut can_aerospace: CANAerospaceLite<CANDriver> = CANAerospaceLite::new(10, CANDriver {});
    can_aerospace.set_hw_revision(HardwareRevision(0x02));
    can_aerospace.set_sw_revision(SoftwareRevision(0x01));

    can_aerospace.notify_receive_event();
    unsafe {
        COUNT += 1;
    }
    can_aerospace.notify_receive_event();
    unsafe {
        COUNT += 1;
    }
    can_aerospace.notify_receive_event();
    unsafe {
        COUNT += 1;
    }
    can_aerospace.notify_receive_event();
    can_aerospace.notify_receive_event();

    let mut message = can_aerospace.read_message().unwrap();
    println!("Message {:#X?}", message);
    message.message_type = MessageType::NSH(message.message_type.id() + 1);
    message.data = DataType::ULONG(0xDEAD_BEEF);
    can_aerospace.send_message(message);

    message = can_aerospace.read_message().unwrap();
    println!("Message {:#X?}", message);
    message = can_aerospace.read_message().unwrap();
    println!("Message {:#X?}", message);
}