e_drone/protocol/
battle.rs

1use crate::protocol::Serializable;
2use crate::communication::extractor::Extractor;
3use crate::protocol::light::{*};
4use crate::protocol::command::{*};
5
6
7// -- IrMessage -----------------------------------------------------------------------------------------------
8#[derive(Debug, Copy, Clone)]
9pub struct IrMessage {
10    pub ir_message: u8,
11}
12
13
14impl IrMessage {
15    pub fn new() -> IrMessage{
16        IrMessage {
17            ir_message: 0,
18        }
19    }
20
21
22    pub const fn size() -> usize { 1 }
23
24
25    pub fn parse(slice_data: &[u8]) -> Result<IrMessage, &'static str> {
26        if slice_data.len() == IrMessage::size() {
27            let mut ext: Extractor = Extractor::from_slice(slice_data);
28            Ok(IrMessage{
29                ir_message: ext.get_u8(),
30            })
31        }
32        else { Err("Wrong length") }
33    }
34}
35
36
37impl Serializable for IrMessage {
38    fn to_vec(&self) -> Vec<u8> {
39        let mut vec_data : Vec<u8> = Vec::new();
40
41        vec_data.extend_from_slice(&self.ir_message.to_le_bytes());
42
43        vec_data
44    }
45}
46
47
48// -- LightEventColorCommand -----------------------------------------------------------------------------------------------
49#[derive(Debug, Copy, Clone)]
50pub struct LightEventCommand {
51    pub event: Event,
52    pub color: Color,
53    pub command: Command,
54}
55
56
57impl LightEventCommand {
58    pub fn new() -> LightEventCommand{
59        LightEventCommand {
60            event: Event::new(),
61            color: Color::new(),
62            command: Command::new(),
63        }
64    }
65
66
67    pub const fn size() -> usize { 9 }
68
69
70    pub fn parse(slice_data: &[u8]) -> Result<LightEventCommand, &'static str> {
71        if slice_data.len() == LightEventCommand::size() {
72            let mut ext: Extractor = Extractor::from_slice(slice_data);
73            Ok( LightEventCommand{
74                event: Event {
75                    event: ext.get_u8(),
76                    interval: ext.get_u16(),
77                    repeat: ext.get_u8(),
78                },
79                color: Color {
80                    r: ext.get_u8(),
81                    g: ext.get_u8(),
82                    b: ext.get_u8(),
83                },
84                command: Command {
85                    command_type: CommandType::None,
86                    option: 0,
87                }
88            })
89        }
90        else { Err("Wrong length") }
91    }
92}
93
94
95impl Serializable for LightEventCommand {
96    fn to_vec(&self) -> Vec<u8> {
97        let mut vec_data : Vec<u8> = Vec::new();
98
99        vec_data.extend_from_slice(&self.event.event.to_le_bytes());
100        vec_data.extend_from_slice(&self.event.interval.to_le_bytes());
101        vec_data.extend_from_slice(&self.event.repeat.to_le_bytes());
102        vec_data.extend_from_slice(&self.color.r.to_le_bytes());
103        vec_data.extend_from_slice(&self.color.g.to_le_bytes());
104        vec_data.extend_from_slice(&self.color.b.to_le_bytes());
105        vec_data.push(self.command.command_type.into());
106        vec_data.extend_from_slice(&self.command.option.to_le_bytes());
107
108        vec_data
109    }
110}
111
112
113// -- IrMessageLightEventCommand -----------------------------------------------------------------------------------------------
114#[derive(Debug, Copy, Clone)]
115pub struct IrMessageLightEventCommand {
116    pub ir_message: u8,
117    pub event: Event,
118    pub color: Color,
119    pub command: Command,
120}
121
122
123impl IrMessageLightEventCommand {
124    pub fn new() -> IrMessageLightEventCommand{
125        IrMessageLightEventCommand {
126            ir_message: 0,
127            event: Event::new(),
128            color: Color::new(),
129            command: Command::new(),
130        }
131    }
132
133
134    pub const fn size() -> usize { 10 }
135
136
137    pub fn parse(slice_data: &[u8]) -> Result<IrMessageLightEventCommand, &'static str> {
138        if slice_data.len() == IrMessageLightEventCommand::size() {
139            let mut ext: Extractor = Extractor::from_slice(slice_data);
140            Ok( IrMessageLightEventCommand{
141                ir_message: ext.get_u8(),
142                event: Event {
143                    event: ext.get_u8(),
144                    interval: ext.get_u16(),
145                    repeat: ext.get_u8(),
146                },
147                color: Color {
148                    r: ext.get_u8(),
149                    g: ext.get_u8(),
150                    b: ext.get_u8(),
151                },
152                command: Command {
153                    command_type: CommandType::None,
154                    option: 0,
155                }
156            })
157        }
158        else { Err("Wrong length") }
159    }
160}
161
162
163impl Serializable for IrMessageLightEventCommand {
164    fn to_vec(&self) -> Vec<u8> {
165        let mut vec_data : Vec<u8> = Vec::new();
166
167        vec_data.extend_from_slice(&self.ir_message.to_le_bytes());
168        vec_data.extend_from_slice(&self.event.event.to_le_bytes());
169        vec_data.extend_from_slice(&self.event.interval.to_le_bytes());
170        vec_data.extend_from_slice(&self.event.repeat.to_le_bytes());
171        vec_data.extend_from_slice(&self.color.r.to_le_bytes());
172        vec_data.extend_from_slice(&self.color.g.to_le_bytes());
173        vec_data.extend_from_slice(&self.color.b.to_le_bytes());
174        vec_data.push(self.command.command_type.into());
175        vec_data.extend_from_slice(&self.command.option.to_le_bytes());
176
177        vec_data
178    }
179}
180
181