Skip to main content

ql_label/
media.rs

1#[derive(Debug, Clone, Copy, PartialEq)]
2pub enum Media {
3    Continuous(ContinuousType),
4    DieCut(DieCutType),
5}
6
7#[derive(Debug, Clone, Copy, PartialEq)]
8pub enum ContinuousType {
9    Continuous12,
10    Continuous29,
11    Continuous38,
12    Continuous50,
13    Continuous54,
14    Continuous62,
15    Continuous62Red,
16}
17
18#[derive(Debug, Clone, Copy, PartialEq)]
19pub enum DieCutType {
20    DieCut17x54,
21    DieCut17x87,
22    DieCut23x23,
23    DieCut29x42,
24    DieCut29x90,
25    DieCut38x90,
26    DieCut39x48,
27    DieCut52x29,
28    DieCut54x29,
29    DieCut60x86,
30    DieCut62x29,
31    DieCut62x100,
32    DieCut12Dia,
33    DieCut24Dia,
34    DieCut58Dia,
35}
36
37#[allow(dead_code)]
38struct MediaSize {
39    mm: f32,
40    dots: u32,
41}
42
43#[allow(dead_code)]
44struct Width {
45    mm: u8,
46    left: u32,
47    effective: u32,
48    right: u32,
49}
50
51#[allow(dead_code)]
52struct Length {
53    mm: u8,
54    dots: u32,
55}
56
57#[allow(dead_code)]
58pub struct MediaSpec {
59    id: u16,
60    width: Width,
61    length: Length,
62    margin: MediaSize,
63    offset: Option<MediaSize>,
64}
65
66impl MediaSpec {
67    pub fn width_mm(&self) -> u8 {
68        self.width.mm
69    }
70    
71    pub fn length_mm(&self) -> u8 {
72        self.length.mm
73    }
74}
75
76impl Media {
77    pub fn spec(&self) -> MediaSpec {
78        match self {
79            Self::Continuous(t) => match t {
80                ContinuousType::Continuous12 => MediaSpec {
81                    id: 257,
82                    width: Width {
83                        mm: 12,
84                        left: 585,
85                        effective: 106,
86                        right: 29,
87                    },
88                    length: Length { mm: 0, dots: 0 },
89                    margin: MediaSize { mm: 1.5, dots: 18 },
90                    offset: None,
91                },
92                ContinuousType::Continuous29 => MediaSpec {
93                    id: 258,
94                    width: Width {
95                        mm: 29,
96                        left: 408,
97                        effective: 306,
98                        right: 6,
99                    },
100                    length: Length { mm: 0, dots: 0 },
101                    margin: MediaSize { mm: 1.5, dots: 18 },
102                    offset: None,
103                },
104                ContinuousType::Continuous38 => MediaSpec {
105                    id: 264,
106                    width: Width {
107                        mm: 38,
108                        left: 295,
109                        effective: 413,
110                        right: 12,
111                    },
112                    length: Length { mm: 0, dots: 0 },
113                    margin: MediaSize { mm: 1.5, dots: 18 },
114                    offset: None,
115                },
116                ContinuousType::Continuous50 => MediaSpec {
117                    id: 262,
118                    width: Width {
119                        mm: 50,
120                        left: 154,
121                        effective: 554,
122                        right: 12,
123                    },
124                    length: Length { mm: 0, dots: 0 },
125                    margin: MediaSize { mm: 1.5, dots: 18 },
126                    offset: None,
127                },
128                ContinuousType::Continuous54 => MediaSpec {
129                    id: 261,
130                    width: Width {
131                        mm: 54,
132                        left: 130,
133                        effective: 590,
134                        right: 0,
135                    },
136                    length: Length { mm: 0, dots: 0 },
137                    margin: MediaSize { mm: 1.9, dots: 23 },
138                    offset: None,
139                },
140                ContinuousType::Continuous62 => MediaSpec {
141                    id: 259,
142                    width: Width {
143                        mm: 62,
144                        left: 12,
145                        effective: 696,
146                        right: 12,
147                    },
148                    length: Length { mm: 0, dots: 0 },
149                    margin: MediaSize { mm: 1.5, dots: 18 },
150                    offset: None,
151                },
152                ContinuousType::Continuous62Red => MediaSpec {
153                    id: 259,
154                    width: Width {
155                        mm: 62,
156                        left: 12,
157                        effective: 696,
158                        right: 12,
159                    },
160                    length: Length { mm: 0, dots: 0 },
161                    margin: MediaSize { mm: 1.5, dots: 18 },
162                    offset: None,
163                },
164            },
165            Self::DieCut(t) => match t {
166                DieCutType::DieCut17x54 => MediaSpec {
167                    id: 269,
168                    width: Width {
169                        mm: 17,
170                        left: 555,
171                        effective: 165,
172                        right: 0,
173                    },
174                    length: Length { mm: 54, dots: 636 },
175                    margin: MediaSize { mm: 1.5, dots: 18 },
176                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
177                },
178                DieCutType::DieCut17x87 => MediaSpec {
179                    id: 270,
180                    width: Width {
181                        mm: 17,
182                        left: 555,
183                        effective: 165,
184                        right: 0,
185                    },
186                    length: Length { mm: 87, dots: 1026 },
187                    margin: MediaSize { mm: 1.5, dots: 18 },
188                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
189                },
190                DieCutType::DieCut23x23 => MediaSpec {
191                    id: 370,
192                    width: Width {
193                        mm: 23,
194                        left: 442,
195                        effective: 236,
196                        right: 42,
197                    },
198                    length: Length { mm: 23, dots: 272 },
199                    margin: MediaSize { mm: 1.5, dots: 18 },
200                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
201                },
202                DieCutType::DieCut29x42 => MediaSpec {
203                    id: 358,
204                    width: Width {
205                        mm: 29,
206                        left: 408,
207                        effective: 306,
208                        right: 6,
209                    },
210                    length: Length { mm: 42, dots: 495 },
211                    margin: MediaSize { mm: 1.5, dots: 18 },
212                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
213                },
214                DieCutType::DieCut29x90 => MediaSpec {
215                    id: 271,
216                    width: Width {
217                        mm: 29,
218                        left: 408,
219                        effective: 306,
220                        right: 6,
221                    },
222                    length: Length { mm: 90, dots: 1061 },
223                    margin: MediaSize { mm: 1.5, dots: 18 },
224                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
225                },
226                DieCutType::DieCut38x90 => MediaSpec {
227                    id: 272,
228                    width: Width {
229                        mm: 38,
230                        left: 295,
231                        effective: 413,
232                        right: 12,
233                    },
234                    length: Length { mm: 90, dots: 1061 },
235                    margin: MediaSize { mm: 1.5, dots: 18 },
236                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
237                },
238                DieCutType::DieCut39x48 => MediaSpec {
239                    id: 367,
240                    width: Width {
241                        mm: 39,
242                        left: 289,
243                        effective: 425,
244                        right: 6,
245                    },
246                    length: Length { mm: 48, dots: 565 },
247                    margin: MediaSize { mm: 1.5, dots: 18 },
248                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
249                },
250                DieCutType::DieCut52x29 => MediaSpec {
251                    id: 374,
252                    width: Width {
253                        mm: 52,
254                        left: 142,
255                        effective: 578,
256                        right: 0,
257                    },
258                    length: Length { mm: 29, dots: 341 },
259                    margin: MediaSize { mm: 1.5, dots: 18 },
260                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
261                },
262                DieCutType::DieCut54x29 => MediaSpec {
263                    id: 382,
264                    width: Width {
265                        mm: 54,
266                        left: 59,
267                        effective: 602,
268                        right: 59,
269                    },
270                    length: Length { mm: 29, dots: 341 },
271                    margin: MediaSize { mm: 1.5, dots: 18 },
272                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
273                },
274                DieCutType::DieCut60x86 => MediaSpec {
275                    id: 383,
276                    width: Width {
277                        mm: 60,
278                        left: 24,
279                        effective: 672,
280                        right: 24,
281                    },
282                    length: Length { mm: 86, dots: 1024 },
283                    margin: MediaSize { mm: 1.5, dots: 18 },
284                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
285                },
286                DieCutType::DieCut62x29 => MediaSpec {
287                    id: 274,
288                    width: Width {
289                        mm: 62,
290                        left: 12,
291                        effective: 696,
292                        right: 12,
293                    },
294                    length: Length { mm: 29, dots: 341 },
295                    margin: MediaSize { mm: 1.5, dots: 18 },
296                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
297                },
298                DieCutType::DieCut62x100 => MediaSpec {
299                    id: 275,
300                    width: Width {
301                        mm: 62,
302                        left: 12,
303                        effective: 696,
304                        right: 12,
305                    },
306                    length: Length {
307                        mm: 100,
308                        dots: 1179,
309                    },
310                    margin: MediaSize { mm: 1.5, dots: 18 },
311                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
312                },
313                DieCutType::DieCut12Dia => MediaSpec {
314                    id: 362,
315                    width: Width {
316                        mm: 12,
317                        left: 513,
318                        effective: 94,
319                        right: 113,
320                    },
321                    length: Length { mm: 12, dots: 142 },
322                    margin: MediaSize { mm: 2.0, dots: 24 },
323                    offset: Some(MediaSize { mm: 2.0, dots: 24 }),
324                },
325                DieCutType::DieCut24Dia => MediaSpec {
326                    id: 363,
327                    width: Width {
328                        mm: 24,
329                        left: 442,
330                        effective: 236,
331                        right: 42,
332                    },
333                    length: Length { mm: 24, dots: 284 },
334                    margin: MediaSize { mm: 2.0, dots: 24 },
335                    offset: Some(MediaSize { mm: 2.0, dots: 24 }),
336                },
337                DieCutType::DieCut58Dia => MediaSpec {
338                    id: 273,
339                    width: Width {
340                        mm: 58,
341                        left: 51,
342                        effective: 618,
343                        right: 51,
344                    },
345                    length: Length { mm: 58, dots: 686 },
346                    margin: MediaSize { mm: 3.0, dots: 35 },
347                    offset: Some(MediaSize { mm: 3.0, dots: 35 }),
348                },
349            },
350        }
351    }
352
353    pub fn from_id(id: u16) -> Option<Self> {
354        match id {
355            // Document says it is 0x4A but actual value seems to be 0x0A
356            257 => Some(Self::Continuous(ContinuousType::Continuous12)),
357            258 => Some(Self::Continuous(ContinuousType::Continuous29)),
358            264 => Some(Self::Continuous(ContinuousType::Continuous38)),
359            262 => Some(Self::Continuous(ContinuousType::Continuous50)),
360            261 => Some(Self::Continuous(ContinuousType::Continuous54)),
361            259 => Some(Self::Continuous(ContinuousType::Continuous62)),
362            //   0x81 => Some(Self::Continuous(ContinuousType::Continuous62Red)),
363            // Same as above, 0x0B not 0x4B
364            269 => Some(Self::DieCut(DieCutType::DieCut17x54)),
365            270 => Some(Self::DieCut(DieCutType::DieCut17x87)),
366            370 => Some(Self::DieCut(DieCutType::DieCut23x23)),
367            358 => Some(Self::DieCut(DieCutType::DieCut29x42)),
368            271 => Some(Self::DieCut(DieCutType::DieCut29x90)),
369            272 => Some(Self::DieCut(DieCutType::DieCut38x90)),
370            367 => Some(Self::DieCut(DieCutType::DieCut39x48)),
371            374 => Some(Self::DieCut(DieCutType::DieCut52x29)),
372            382 => Some(Self::DieCut(DieCutType::DieCut54x29)),
373            383 => Some(Self::DieCut(DieCutType::DieCut60x86)),
374            274 => Some(Self::DieCut(DieCutType::DieCut62x29)),
375            275 => Some(Self::DieCut(DieCutType::DieCut62x100)),
376            362 => Some(Self::DieCut(DieCutType::DieCut12Dia)),
377            363 => Some(Self::DieCut(DieCutType::DieCut24Dia)),
378            273 => Some(Self::DieCut(DieCutType::DieCut58Dia)),
379            _ => None,
380        }
381    }
382
383    pub fn get_default_feed_dots(&self) -> u16 {
384        match self {
385            Self::Continuous(_) => 35,
386            Self::DieCut(_) => 0,
387        }
388    }
389
390    pub fn check_feed_value(&self, feed: u16) -> Result<[u8; 2], String> {
391        match self {
392            Self::Continuous(_) => {
393                if feed < 35 || feed > 1500 {
394                    Err(format!("Feed value {} is out range.", feed))
395                } else {
396                    Ok(feed.to_le_bytes())
397                }
398            }
399            Self::DieCut(_) => {
400                if feed != 0 {
401                    Err(format!(
402                        "Feed value {} must be zero for die-cut medias",
403                        feed
404                    ))
405                } else {
406                    Ok([0x00, 0x00])
407                }
408            }
409        }
410    }
411    pub fn set_media(&self, buf: &mut Vec<u8>, qualiy: bool) {
412        let qualiry: u8 = if qualiy { 0b01000000 } else { 0b00000000 };
413        let spec = self.spec();
414        match self {
415            Self::Continuous(_) => {
416                buf.push(0x86 | qualiry);
417                buf.push(0x0A);
418            }
419            Self::DieCut(_) => {
420                buf.push(0x8E | qualiry);
421                buf.push(0x0B);
422            }
423        }
424        buf.push(spec.width.mm);
425        buf.push(spec.length.mm);
426    }
427
428    pub fn from_buf(buf: [u8; 32]) -> Option<Self> {
429        let w = buf[10];
430        let t = buf[11];
431        let l = buf[17];
432        let c = buf[25];
433
434        match t {
435            0x0A => match w {
436                // Document says it is 0x4A but actual value seems to be 0x0A
437                12 => Some(Self::Continuous(ContinuousType::Continuous12)),
438                29 => Some(Self::Continuous(ContinuousType::Continuous29)),
439                38 => Some(Self::Continuous(ContinuousType::Continuous38)),
440                50 => Some(Self::Continuous(ContinuousType::Continuous50)),
441                54 => Some(Self::Continuous(ContinuousType::Continuous54)),
442                62 => match c {
443                    0x01 => Some(Self::Continuous(ContinuousType::Continuous62)),
444                    0x81 => Some(Self::Continuous(ContinuousType::Continuous62Red)),
445                    _ => None,
446                },
447                _ => None,
448            },
449            0x0B => match (w, l) {
450                // Same as above, 0x0B not 0x4B
451                (17, 54) => Some(Self::DieCut(DieCutType::DieCut17x54)),
452                (17, 87) => Some(Self::DieCut(DieCutType::DieCut17x87)),
453                (23, 23) => Some(Self::DieCut(DieCutType::DieCut23x23)),
454                (29, 42) => Some(Self::DieCut(DieCutType::DieCut29x42)),
455                (29, 90) => Some(Self::DieCut(DieCutType::DieCut29x90)),
456                (38, 90) => Some(Self::DieCut(DieCutType::DieCut38x90)),
457                (39, 48) => Some(Self::DieCut(DieCutType::DieCut39x48)),
458                (52, 29) => Some(Self::DieCut(DieCutType::DieCut52x29)),
459                (54, 29) => Some(Self::DieCut(DieCutType::DieCut54x29)),
460                (60, 86) => Some(Self::DieCut(DieCutType::DieCut60x86)),
461                (62, 29) => Some(Self::DieCut(DieCutType::DieCut62x29)),
462                (62, 100) => Some(Self::DieCut(DieCutType::DieCut62x100)),
463                (12, 12) => Some(Self::DieCut(DieCutType::DieCut12Dia)),
464                (24, 24) => Some(Self::DieCut(DieCutType::DieCut24Dia)),
465                (58, 58) => Some(Self::DieCut(DieCutType::DieCut58Dia)),
466                _ => None,
467            },
468            _ => None,
469        }
470    }
471}