e_drone/protocol/
buzzer.rs

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// -- Mode ----------------------------------------------------------------------------------------------
11#[derive(Clone, Copy, Debug, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
12#[repr(u8)]
13pub enum Mode {
14    #[num_enum(default)]
15    Stop                = 0,    // 정지(Mode에서의 Stop은 통신에서 받았을 때 Buzzer를 끄는 용도로 사용, set으로만 호출)
16    
17    MuteInstantly       = 1,    // 묵음 즉시 적용
18    MuteContinually     = 2,    // 묵음 예약
19    
20    ScaleInstantly      = 3,    // 음계 즉시 적용
21    ScaleContinually    = 4,    // 음계 예약
22    
23    HzInstantly         = 5,    // 주파수 즉시 적용
24    HzContinually       = 6,    // 주파수 예약
25}
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// -- Scale ----------------------------------------------------------------------------------------------
39#[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,     // 묵음
54    Fin     = 0xFF,     // 악보의 끝
55}
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// -- Melody -----------------------------------------------------------------------------------------------
75#[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// -- BuzzerScale -----------------------------------------------------------------------------------------------
120#[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// -- BuzzerHz -----------------------------------------------------------------------------------------------
169#[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