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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
use alloc::vec; use core::convert::TryInto; use crate::ross_convert_packet::{RossConvertPacket, RossConvertPacketError}; use crate::ross_event::ross_event_code::*; use crate::ross_event::ross_event_packet::RossEventPacketError; use crate::ross_packet::RossPacket; #[derive(Debug, PartialEq)] pub struct RossProgrammerHelloEvent { pub programmer_address: u16, pub firmware_version: u32, } impl RossConvertPacket<RossProgrammerHelloEvent> for RossProgrammerHelloEvent { fn try_from_packet(packet: &RossPacket) -> Result<Self, RossConvertPacketError> { if packet.data.len() != 6 { return Err(RossConvertPacketError::WrongSize); } if packet.is_error { return Err(RossConvertPacketError::WrongType); } if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap()) != ROSS_PROGRAMMER_HELLO_EVENT_CODE { return Err(RossConvertPacketError::EventPacket( RossEventPacketError::WrongEventType, )); } let programmer_address = packet.device_address; let firmware_version = u32::from_be_bytes(packet.data[2..=5].try_into().unwrap()); Ok(RossProgrammerHelloEvent { programmer_address, firmware_version, }) } fn to_packet(&self) -> RossPacket { let mut data = vec![]; for byte in u16::to_be_bytes(ROSS_PROGRAMMER_HELLO_EVENT_CODE).iter() { data.push(*byte); } for byte in u32::to_be_bytes(self.firmware_version).iter() { data.push(*byte); } RossPacket { is_error: false, device_address: self.programmer_address, data, } } } #[derive(Debug, PartialEq)] pub struct RossProgrammerStartUploadEvent { pub programmer_address: u16, pub device_address: u16, pub new_firmware_version: u32, pub firmware_size: u32, } impl RossConvertPacket<RossProgrammerStartUploadEvent> for RossProgrammerStartUploadEvent { fn try_from_packet(packet: &RossPacket) -> Result<Self, RossConvertPacketError> { if packet.data.len() != 12 { return Err(RossConvertPacketError::WrongSize); } if packet.is_error { return Err(RossConvertPacketError::WrongType); } if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap()) != ROSS_PROGRAMMER_START_UPLOAD_EVENT_CODE { return Err(RossConvertPacketError::EventPacket( RossEventPacketError::WrongEventType, )); } let programmer_address = packet.device_address; let device_address = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap()); let new_firmware_version = u32::from_be_bytes(packet.data[4..=7].try_into().unwrap()); let firmware_size = u32::from_be_bytes(packet.data[8..=11].try_into().unwrap()); Ok(RossProgrammerStartUploadEvent { programmer_address, device_address, new_firmware_version, firmware_size, }) } fn to_packet(&self) -> RossPacket { let mut data = vec![]; for byte in u16::to_be_bytes(ROSS_PROGRAMMER_START_UPLOAD_EVENT_CODE).iter() { data.push(*byte); } for byte in u16::to_be_bytes(self.device_address).iter() { data.push(*byte); } for byte in u32::to_be_bytes(self.new_firmware_version).iter() { data.push(*byte); } for byte in u32::to_be_bytes(self.firmware_size).iter() { data.push(*byte); } RossPacket { is_error: false, device_address: self.programmer_address, data, } } }