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 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 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 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 (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}