Skip to main content

ajazz_rs/
info.rs

1/// A Mirabox vendor ID
2pub const MIRABOX_VENDOR_ID_1: u16 = 0x5548;
3
4/// Product ID of Ajazz AKP153
5pub const PID_AJAZZ_AKP153: u16 = 0x6674;
6
7/// Product ID of Ajazz AKP815
8pub const PID_AJAZZ_AKP815: u16 = 0x6672;
9
10/// A Mirabox vendor ID
11pub const MIRABOX_VENDOR_ID_2: u16 = 0x0300;
12
13/// Product ID of Ajazz AKP153E
14pub const PID_AJAZZ_AKP153E: u16 = 0x1010;
15
16/// Product ID of Ajazz AKP153R
17pub const PID_AJAZZ_AKP153R: u16 = 0x1020;
18
19/// Product ID of Ajazz AKP03
20pub const PID_AJAZZ_AKP03: u16 = 0x1001;
21
22/// Product ID of Ajazz AKP03E
23pub const PID_AJAZZ_AKP03E: u16 = 0x3002;
24
25/// Product ID of Ajazz AKP03R
26pub const PID_AJAZZ_AKP03R: u16 = 0x1003;
27
28/// Product ID of Ajazz AKP03R rev 2
29pub const PID_AJAZZ_AKP03R_REV2: u16 = 0x3003;
30
31const RECOGNIZED_VENDORS: [u16; 2] = [MIRABOX_VENDOR_ID_1, MIRABOX_VENDOR_ID_2];
32
33/// Returns true for vendors IDs that are recognized by the library
34pub fn is_vendor_familiar(vendor: &u16) -> bool {
35    RECOGNIZED_VENDORS.contains(vendor)
36}
37
38/// Enum describing kinds of Ajazz devices
39#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
40pub enum Kind {
41    /// Ajazz AKP153
42    Akp153,
43    /// Ajazz AKP153E
44    Akp153E,
45    /// Ajazz AKP153R
46    Akp153R,
47    /// Ajazz AKP815
48    Akp815,
49    /// Ajazz AKP03
50    Akp03,
51    /// Ajazz AKP03E
52    Akp03E,
53    /// Ajazz AKP03R
54    Akp03R,
55    /// Ajazz AKP03R rev 2
56    Akp03RRev2,
57}
58
59impl Kind {
60    /// Creates [Kind] variant from Vendor ID and Product ID
61    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    /// Retrieves Product ID of the device
84    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    /// Retrieves Vendor ID
98    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    /// Amount of keys the device has
112    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    /// Amount of button rows the device has
121    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    /// Amount of button columns the device has
130    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    /// Amount of encoders/knobs the device has
139    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    /// Size of the LCD strip on the device
147    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    /// Tells if the device kind has a screen
156    pub fn is_visual(&self) -> bool {
157        true
158    }
159
160    /// Key layout of the device kind as (rows, columns)
161    pub fn key_layout(&self) -> (u8, u8) {
162        (self.row_count(), self.column_count())
163    }
164
165    /// Image format used by the device kind
166    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    /// Returns blank image data appropriate for the device kind
199    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    /// Returns true for devices with 512 byte packet length
230    pub fn is_ajazz_v1(&self) -> bool {
231        matches!(self, Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815)
232    }
233
234    /// Returns true for devices with 1024 byte packet length
235    pub fn is_ajazz_v2(&self) -> bool {
236        matches!(self, Kind::Akp03 | Kind::Akp03E | Kind::Akp03R | Kind::Akp03RRev2)
237    }
238}
239
240/// Image format used by the device
241#[derive(Copy, Clone, Debug, Hash)]
242pub struct ImageFormat {
243    /// Image format/mode
244    pub mode: ImageMode,
245    /// Image size
246    pub size: (usize, usize),
247    /// Image rotation
248    pub rotation: ImageRotation,
249    /// Image mirroring
250    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/// Image rotation
265#[derive(Copy, Clone, Debug, Hash)]
266pub enum ImageRotation {
267    /// No rotation
268    Rot0,
269    /// 90 degrees clockwise
270    Rot90,
271    /// 180 degrees
272    Rot180,
273    /// 90 degrees counter-clockwise
274    Rot270,
275}
276
277/// Image mirroring
278#[derive(Copy, Clone, Debug, Hash)]
279pub enum ImageMirroring {
280    /// No image mirroring
281    None,
282    /// Flip by X
283    X,
284    /// Flip by Y
285    Y,
286    /// Flip by both axes
287    Both,
288}
289
290/// Image format
291#[derive(Copy, Clone, Debug, Hash)]
292pub enum ImageMode {
293    /// No image
294    None,
295    /// Jpeg image
296    JPEG,
297}