use crate::{
impl_message_ops, len::START_DOWNLOAD_COMMAND, ExtendedNoteReporting, MessageOps, MessageType,
};
pub mod index {
pub const DATA2: usize = 5;
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Default, PartialEq)]
pub struct StartDownloadCommand {
buf: [u8; START_DOWNLOAD_COMMAND],
}
impl StartDownloadCommand {
pub fn new() -> Self {
let mut msg = Self {
buf: [0u8; START_DOWNLOAD_COMMAND],
};
msg.init();
msg.set_message_type(MessageType::FirmwareDownload);
msg
}
pub fn extended_note(&self) -> ExtendedNoteReporting {
(self.buf[index::DATA2] >> 4).into()
}
pub fn set_extended_note(&mut self, extended: ExtendedNoteReporting) {
let b: u8 = extended.into();
self.buf[index::DATA2] = b << 4;
}
}
impl_message_ops!(StartDownloadCommand);
#[cfg(test)]
mod tests {
use super::*;
use crate::Result;
#[test]
#[rustfmt::skip]
fn start_download_command_from_buf() -> Result<()> {
let msg_bytes = [
0x02, 0x08, 0x50,
0x00, 0x00, 0x10,
0x03, 0x48,
];
let mut msg = StartDownloadCommand::new();
msg.from_buf(msg_bytes.as_ref())?;
assert_eq!(msg.message_type(), MessageType::FirmwareDownload);
assert_eq!(msg.extended_note(), ExtendedNoteReporting::Set);
let msg_bytes = [
0x02, 0x08, 0x50,
0x00, 0x00, 0x00,
0x03, 0x58,
];
msg.from_buf(msg_bytes.as_ref())?;
assert_eq!(msg.message_type(), MessageType::FirmwareDownload);
assert_eq!(msg.extended_note(), ExtendedNoteReporting::Unset);
Ok(())
}
}