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 126 127 128 129 130
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; use crate::ross_protocol::BROADCAST_ADDRESS; #[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() != 8 { 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 = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap()); let firmware_version = u32::from_be_bytes(packet.data[4..=7].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 u16::to_be_bytes(self.programmer_address).iter() { data.push(*byte); } for byte in u32::to_be_bytes(self.firmware_version).iter() { data.push(*byte); } RossPacket { is_error: false, device_address: BROADCAST_ADDRESS, data, } } } #[derive(Debug, PartialEq)] pub struct RossProgrammerStartUploadEvent { pub receiver_address: u16, pub programmer_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 receiver_address = packet.device_address; let programmer_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 { receiver_address, programmer_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.programmer_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.receiver_address, data, } } }