1use num_enum::IntoPrimitive;
2use num_enum::TryFromPrimitive;
3use std::convert::TryFrom;
4use byteorder::{ByteOrder, LittleEndian};
5
6use crate::protocol::Serializable;
7use crate::communication::extractor::Extractor;
8
9
10#[derive(Clone, Copy, Debug, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
12#[repr(u8)]
13pub enum Mode {
14 #[num_enum(default)]
15 Stop = 0, MuteInstantly = 1, MuteContinually = 2, ScaleInstantly = 3, ScaleContinually = 4, HzInstantly = 5, HzContinually = 6, }
26
27
28impl Mode {
29 pub fn from_u8(data_u8: u8) -> Mode {
30 match Mode::try_from( data_u8 ) {
31 Ok(data) => { data },
32 _ => { Mode::Stop },
33 }
34 }
35}
36
37
38#[derive(Clone, Copy, Debug, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
40#[repr(u16)]
41pub enum Scale {
42 #[num_enum(default)]
43
44 C1, CS1, D1, DS1, E1, F1, FS1, G1, GS1, A1, AS1, B1,
45 C2, CS2, D2, DS2, E2, F2, FS2, G2, GS2, A2, AS2, B2,
46 C3, CS3, D3, DS3, E3, F3, FS3, G3, GS3, A3, AS3, B3,
47 C4, CS4, D4, DS4, E4, F4, FS4, G4, GS4, A4, AS4, B4,
48 C5, CS5, D5, DS5, E5, F5, FS5, G5, GS5, A5, AS5, B5,
49 C6, CS6, D6, DS6, E6, F6, FS6, G6, GS6, A6, AS6, B6,
50 C7, CS7, D7, DS7, E7, F7, FS7, G7, GS7, A7, AS7, B7,
51 C8, CS8, D8, DS8, E8, F8, FS8, G8, GS8, A8, AS8, B8,
52
53 Mute = 0xEE, Fin = 0xFF, }
56
57
58impl Scale {
59 pub fn from_u16(data_u8: u16) -> Scale {
60 match Scale::try_from( data_u8 ) {
61 Ok(data) => { data },
62 _ => { Scale::Mute },
63 }
64 }
65
66 pub fn to_array(&self) -> [u8; 2] {
67 let mut buf = [0; 2];
68 LittleEndian::write_u16(&mut buf, self.clone().into());
69 buf
70 }
71}
72
73
74#[derive(Debug, Copy, Clone)]
76pub struct Melody {
77 pub melody: u8,
78 pub repeat: u8,
79}
80
81
82impl Melody {
83 pub fn new() -> Melody{
84 Melody {
85 melody: 0,
86 repeat: 0,
87 }
88 }
89
90
91 pub const fn size() -> usize { 2 }
92
93
94 pub fn parse(slice_data: &[u8]) -> Result<Melody, &'static str> {
95 if slice_data.len() == Melody::size() {
96 let mut ext: Extractor = Extractor::from_slice(slice_data);
97 Ok(Melody{
98 melody: ext.get_u8(),
99 repeat: ext.get_u8(),
100 })
101 }
102 else { Err("Wrong length") }
103 }
104}
105
106
107impl Serializable for Melody {
108 fn to_vec(&self) -> Vec<u8> {
109 let mut vec_data : Vec<u8> = Vec::new();
110
111 vec_data.push(self.melody);
112 vec_data.push(self.repeat);
113
114 vec_data
115 }
116}
117
118
119#[derive(Debug, Copy, Clone)]
121pub struct BuzzerScale {
122 pub mode: Mode,
123 pub scale: Scale,
124 pub time: u16,
125}
126
127
128impl BuzzerScale {
129 pub fn new() -> BuzzerScale{
130 BuzzerScale {
131 mode: Mode::ScaleInstantly,
132 scale: Scale::C5,
133 time: 0,
134 }
135 }
136
137
138 pub const fn size() -> usize { 5 }
139
140
141 pub fn parse(slice_data: &[u8]) -> Result<BuzzerScale, &'static str> {
142 if slice_data.len() == BuzzerScale::size() {
143 let mut ext: Extractor = Extractor::from_slice(slice_data);
144 Ok(BuzzerScale{
145 mode: Mode::from_u8(ext.get_u8()),
146 scale: Scale::from_u16(ext.get_u16()),
147 time: ext.get_u16(),
148 })
149 }
150 else { Err("Wrong length") }
151 }
152}
153
154
155impl Serializable for BuzzerScale {
156 fn to_vec(&self) -> Vec<u8> {
157 let mut vec_data : Vec<u8> = Vec::new();
158
159 vec_data.push(self.mode.into());
160 vec_data.extend_from_slice(&self.scale.to_array());
161 vec_data.extend_from_slice(&self.time.to_le_bytes());
162
163 vec_data
164 }
165}
166
167
168#[derive(Debug, Copy, Clone)]
170pub struct BuzzerHz {
171 pub mode: Mode,
172 pub hz: u16,
173 pub time: u16,
174}
175
176
177impl BuzzerHz {
178 pub fn new() -> BuzzerHz{
179 BuzzerHz {
180 mode: Mode::HzInstantly,
181 hz: 0,
182 time: 0,
183 }
184 }
185
186
187 pub const fn size() -> usize { 5 }
188
189
190 pub fn parse(slice_data: &[u8]) -> Result<BuzzerHz, &'static str> {
191 if slice_data.len() == BuzzerHz::size() {
192 let mut ext: Extractor = Extractor::from_slice(slice_data);
193 Ok(BuzzerHz{
194 mode: Mode::from_u8(ext.get_u8()),
195 hz: ext.get_u16(),
196 time: ext.get_u16(),
197 })
198 }
199 else { Err("Wrong length") }
200 }
201}
202
203
204impl Serializable for BuzzerHz {
205 fn to_vec(&self) -> Vec<u8> {
206 let mut vec_data : Vec<u8> = Vec::new();
207
208 vec_data.push(self.mode.into());
209 vec_data.extend_from_slice(&self.hz.to_le_bytes());
210 vec_data.extend_from_slice(&self.time.to_le_bytes());
211
212 vec_data
213 }
214}
215