1pub const MIRABOX_VENDOR_ID_1: u16 = 0x5548;
3
4pub const PID_AJAZZ_AKP153: u16 = 0x6674;
6
7pub const PID_AJAZZ_AKP815: u16 = 0x6672;
9
10pub const MIRABOX_VENDOR_ID_2: u16 = 0x0300;
12
13pub const PID_AJAZZ_AKP153E: u16 = 0x1010;
15
16pub const PID_AJAZZ_AKP153R: u16 = 0x1020;
18
19pub const PID_AJAZZ_AKP03: u16 = 0x1001;
21
22pub const PID_AJAZZ_AKP03E: u16 = 0x3002;
24
25pub const PID_AJAZZ_AKP03R: u16 = 0x1003;
27
28pub const PID_AJAZZ_AKP03R_REV2: u16 = 0x3003;
30
31const RECOGNIZED_VENDORS: [u16; 2] = [MIRABOX_VENDOR_ID_1, MIRABOX_VENDOR_ID_2];
32
33pub fn is_vendor_familiar(vendor: &u16) -> bool {
35 RECOGNIZED_VENDORS.contains(vendor)
36}
37
38#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
40pub enum Kind {
41 Akp153,
43 Akp153E,
45 Akp153R,
47 Akp815,
49 Akp03,
51 Akp03E,
53 Akp03R,
55 Akp03RRev2,
57}
58
59impl Kind {
60 pub fn from_vid_pid(vid: u16, pid: u16) -> Option<Kind> {
62 match vid {
63 MIRABOX_VENDOR_ID_1 => match pid {
64 PID_AJAZZ_AKP153 => Some(Kind::Akp153),
65 PID_AJAZZ_AKP815 => Some(Kind::Akp815),
66 _ => None,
67 },
68
69 MIRABOX_VENDOR_ID_2 => match pid {
70 PID_AJAZZ_AKP153E => Some(Kind::Akp153E),
71 PID_AJAZZ_AKP153R => Some(Kind::Akp153R),
72 PID_AJAZZ_AKP03 => Some(Kind::Akp03),
73 PID_AJAZZ_AKP03E => Some(Kind::Akp03E),
74 PID_AJAZZ_AKP03R => Some(Kind::Akp03R),
75 PID_AJAZZ_AKP03R_REV2 => Some(Kind::Akp03RRev2),
76 _ => None,
77 },
78
79 _ => None,
80 }
81 }
82
83 pub fn product_id(&self) -> u16 {
85 match self {
86 Kind::Akp153 => PID_AJAZZ_AKP153,
87 Kind::Akp153E => PID_AJAZZ_AKP153E,
88 Kind::Akp153R => PID_AJAZZ_AKP153R,
89 Kind::Akp815 => PID_AJAZZ_AKP815,
90 Kind::Akp03 => PID_AJAZZ_AKP03,
91 Kind::Akp03E => PID_AJAZZ_AKP03E,
92 Kind::Akp03R => PID_AJAZZ_AKP03R,
93 Kind::Akp03RRev2 => PID_AJAZZ_AKP03R_REV2,
94 }
95 }
96
97 pub fn vendor_id(&self) -> u16 {
99 match self {
100 Kind::Akp153 => MIRABOX_VENDOR_ID_1,
101 Kind::Akp153E => MIRABOX_VENDOR_ID_2,
102 Kind::Akp153R => MIRABOX_VENDOR_ID_2,
103 Kind::Akp815 => MIRABOX_VENDOR_ID_1,
104 Kind::Akp03 => MIRABOX_VENDOR_ID_2,
105 Kind::Akp03E => MIRABOX_VENDOR_ID_2,
106 Kind::Akp03R => MIRABOX_VENDOR_ID_2,
107 Kind::Akp03RRev2 => MIRABOX_VENDOR_ID_2,
108 }
109 }
110
111 pub fn key_count(&self) -> u8 {
113 match self {
114 Kind::Akp153 | Kind::Akp153E | Kind::Akp153R => 15 + 3,
115 Kind::Akp815 => 15,
116 Kind::Akp03 | Kind::Akp03E | Kind::Akp03R | Kind::Akp03RRev2 => 6 + 3,
117 }
118 }
119
120 pub fn row_count(&self) -> u8 {
122 match self {
123 Kind::Akp153 | Kind::Akp153E | Kind::Akp153R => 3,
124 Kind::Akp815 => 5,
125 Kind::Akp03 | Kind::Akp03E | Kind::Akp03R | Kind::Akp03RRev2 => 3,
126 }
127 }
128
129 pub fn column_count(&self) -> u8 {
131 match self {
132 Kind::Akp153 | Kind::Akp153E | Kind::Akp153R => 6,
133 Kind::Akp815 => 3,
134 Kind::Akp03 | Kind::Akp03E | Kind::Akp03R | Kind::Akp03RRev2 => 3,
135 }
136 }
137
138 pub fn encoder_count(&self) -> u8 {
140 match self {
141 Kind::Akp03 | Kind::Akp03E | Kind::Akp03R | Kind::Akp03RRev2 => 3,
142 _ => 0,
143 }
144 }
145
146 pub fn lcd_strip_size(&self) -> Option<(usize, usize)> {
148 match self {
149 Kind::Akp153 | Kind::Akp153E | Kind::Akp153R => Some((854, 480)),
150 Kind::Akp815 => Some((800, 480)),
151 _ => None,
152 }
153 }
154
155 pub fn is_visual(&self) -> bool {
157 true
158 }
159
160 pub fn key_layout(&self) -> (u8, u8) {
162 (self.row_count(), self.column_count())
163 }
164
165 pub fn key_image_format(&self) -> ImageFormat {
167 match self {
168 Kind::Akp153 | Kind::Akp153E | Kind::Akp153R => ImageFormat {
169 mode: ImageMode::JPEG,
170 size: (85, 85),
171 rotation: ImageRotation::Rot90,
172 mirror: ImageMirroring::Both,
173 },
174
175 Kind::Akp815 => ImageFormat {
176 mode: ImageMode::JPEG,
177 size: (100, 100),
178 rotation: ImageRotation::Rot180,
179 mirror: ImageMirroring::None,
180 },
181
182 Kind::Akp03 | Kind::Akp03E | Kind::Akp03R => ImageFormat {
183 mode: ImageMode::JPEG,
184 size: (60, 60),
185 rotation: ImageRotation::Rot0,
186 mirror: ImageMirroring::None,
187 },
188
189 Kind::Akp03RRev2 => ImageFormat {
190 mode: ImageMode::JPEG,
191 size: (64, 64),
192 rotation: ImageRotation::Rot90,
193 mirror: ImageMirroring::None,
194 },
195 }
196 }
197
198 pub fn blank_image(&self) -> Vec<u8> {
200 vec![
201 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, 0x00, 0x08, 0x06, 0x06, 0x07, 0x06,
202 0x05, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x08, 0x0a, 0x0c, 0x14, 0x0d, 0x0c, 0x0b, 0x0b, 0x0c, 0x19, 0x12, 0x13, 0x0f, 0x14, 0x1d, 0x1a, 0x1f, 0x1e, 0x1d, 0x1a, 0x1c, 0x1c, 0x20,
203 0x24, 0x2e, 0x27, 0x20, 0x22, 0x2c, 0x23, 0x1c, 0x1c, 0x28, 0x37, 0x29, 0x2c, 0x30, 0x31, 0x34, 0x34, 0x34, 0x1f, 0x27, 0x39, 0x3d, 0x38, 0x32, 0x3c, 0x2e, 0x33, 0x34, 0x32, 0xff,
204 0xdb, 0x00, 0x43, 0x01, 0x09, 0x09, 0x09, 0x0c, 0x0b, 0x0c, 0x18, 0x0d, 0x0d, 0x18, 0x32, 0x21, 0x1c, 0x21, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32,
205 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32,
206 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0x48, 0x00, 0x48, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00,
207 0x1f, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
208 0xff, 0xc4, 0x00, 0xb5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21,
209 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a,
210 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56,
211 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93,
212 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
213 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
214 0xf8, 0xf9, 0xfa, 0xff, 0xc4, 0x00, 0x1f, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
215 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02,
216 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15,
217 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47,
218 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84,
219 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
220 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
221 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0xf9, 0xfe, 0x8a, 0x28, 0xa0, 0x02, 0x8a,
222 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0,
223 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a,
224 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0,
225 0x02, 0x8a, 0x28, 0xa0, 0x0f, 0xff, 0xd9,
226 ]
227 }
228
229 pub fn is_ajazz_v1(&self) -> bool {
231 matches!(self, Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815)
232 }
233
234 pub fn is_ajazz_v2(&self) -> bool {
236 matches!(self, Kind::Akp03 | Kind::Akp03E | Kind::Akp03R | Kind::Akp03RRev2)
237 }
238}
239
240#[derive(Copy, Clone, Debug, Hash)]
242pub struct ImageFormat {
243 pub mode: ImageMode,
245 pub size: (usize, usize),
247 pub rotation: ImageRotation,
249 pub mirror: ImageMirroring,
251}
252
253impl Default for ImageFormat {
254 fn default() -> Self {
255 Self {
256 mode: ImageMode::None,
257 size: (0, 0),
258 rotation: ImageRotation::Rot0,
259 mirror: ImageMirroring::None,
260 }
261 }
262}
263
264#[derive(Copy, Clone, Debug, Hash)]
266pub enum ImageRotation {
267 Rot0,
269 Rot90,
271 Rot180,
273 Rot270,
275}
276
277#[derive(Copy, Clone, Debug, Hash)]
279pub enum ImageMirroring {
280 None,
282 X,
284 Y,
286 Both,
288}
289
290#[derive(Copy, Clone, Debug, Hash)]
292pub enum ImageMode {
293 None,
295 JPEG,
297}