Skip to content

Commit 9038af0

Browse files
authored
Improve ZPL mark sense (#69)
Older ZPL printers have a more awkward way to detect the print mode apparently. This also adds a "query printer status" button to the advanced and editor demos so you can see why your printer is blinking at you.
1 parent 82f7b10 commit 9038af0

File tree

7 files changed

+146
-54
lines changed

7 files changed

+146
-54
lines changed

demo/advanced.html

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -446,18 +446,21 @@ <h4>${titleHtml}</h4>
446446
<span class="visually-hidden">Settings</span>
447447
</button>
448448
<ul class="dropdown-menu">
449-
<li><a id="printtest_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
450-
Print test page
451-
</a></li>
452-
<li><a id="feedlabel_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
453-
Feed blank label
454-
</a></li>
455-
<li><a id="configprinter_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
456-
Set label config
457-
</a></li>
458-
<li><a id="printconfig_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
459-
Print config on labels
460-
</a></li>
449+
<li><a id="printerStatus_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
450+
Query printer status
451+
</a></li>
452+
<li><a id="printtest_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
453+
Print test page
454+
</a></li>
455+
<li><a id="feedlabel_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
456+
Feed blank label
457+
</a></li>
458+
<li><a id="configprinter_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
459+
Set label config
460+
</a></li>
461+
<li><a id="printconfig_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
462+
Print config on labels
463+
</a></li>
461464
</ul>
462465
</div>
463466
</div>
@@ -487,6 +490,14 @@ <h4>${titleHtml}</h4>
487490
this.redrawPrinterButtonHighlights();
488491
this.redrawTextCanvas();
489492
});
493+
document.getElementById(`printerStatus_${idx}`)!
494+
.addEventListener('click', async (e) => {
495+
e.preventDefault();
496+
const printerIdx = (e.currentTarget as HTMLAnchorElement).dataset.printerIdx as unknown as number;
497+
const printer = this.printers[printerIdx];
498+
const doc = printer.getConfigDocument().queryStatus().finalize();
499+
await printer.sendDocument(doc);
500+
});
490501
document.getElementById(`printtest_${idx}`)!
491502
.addEventListener('click', async (e) => {
492503
e.preventDefault();
@@ -709,12 +720,19 @@ <h4>${titleHtml}</h4>
709720
// And send the whole shebang to the printer!
710721
await printer.sendDocument(doc);
711722

723+
// Then get the updated printer info..
724+
await printer.sendDocument(WebLabel.ReadyToPrintDocuments.configDocument);
725+
726+
// Hide the config modal
712727
form.modalWithAutosense.checked = false;
713728
form.modalZplWithSensorGraph.checked = false;
714729
form.modalSubmit.removeAttribute("disabled");
715730
form.modalCancel.removeAttribute("disabled");
716731
this.activePrinterIndex = printerIdx;
717732
this.configModalHandle.hide();
733+
734+
// Redraw the buttons with the updated config
735+
this.redrawPrinterButtons();
718736
}
719737
}
720738

demo/editor.html

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -412,18 +412,21 @@ <h4>${titleHtml}</h4>
412412
<span class="visually-hidden">Settings</span>
413413
</button>
414414
<ul class="dropdown-menu">
415-
<li><a id="printtest_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
416-
Print test page
417-
</a></li>
418-
<li><a id="feedlabel_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
419-
Feed blank label
420-
</a></li>
421-
<li><a id="configprinter_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
422-
Set label config
423-
</a></li>
424-
<li><a id="printconfig_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
425-
Print config on labels
426-
</a></li>
415+
<li><a id="printerStatus_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
416+
Query printer status
417+
</a></li>
418+
<li><a id="printtest_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
419+
Print test page
420+
</a></li>
421+
<li><a id="feedlabel_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
422+
Feed blank label
423+
</a></li>
424+
<li><a id="configprinter_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
425+
Set label config
426+
</a></li>
427+
<li><a id="printconfig_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
428+
Print config on labels
429+
</a></li>
427430
</ul>
428431
</div>
429432
</div>
@@ -453,6 +456,14 @@ <h4>${titleHtml}</h4>
453456
this.redrawPrinterButtonHighlights();
454457
this.redrawLabelCanvas();
455458
});
459+
document.getElementById(`printerStatus_${idx}`)!
460+
.addEventListener('click', async (e) => {
461+
e.preventDefault();
462+
const printerIdx = (e.currentTarget as HTMLAnchorElement).dataset.printerIdx as unknown as number;
463+
const printer = this.printers[printerIdx];
464+
const doc = printer.getConfigDocument().queryStatus().finalize();
465+
await printer.sendDocument(doc);
466+
});
456467
document.getElementById(`printtest_${idx}`)!
457468
.addEventListener('click', async (e) => {
458469
e.preventDefault();
@@ -639,12 +650,19 @@ <h4>${titleHtml}</h4>
639650
// And send the whole shebang to the printer!
640651
await printer.sendDocument(doc);
641652

653+
// Then get the updated printer info..
654+
await printer.sendDocument(WebLabel.ReadyToPrintDocuments.configDocument);
655+
656+
// Hide the config modal
642657
form.modalWithAutosense.checked = false;
643658
form.modalZplWithSensorGraph.checked = false;
644659
form.modalSubmit.removeAttribute("disabled");
645660
form.modalCancel.removeAttribute("disabled");
646661
this.activePrinterIndex = printerIdx;
647662
this.configModalHandle.hide();
663+
664+
// Redraw the buttons with the updated config
665+
this.redrawPrinterButtons();
648666
}
649667
}
650668

demo/test_advanced.ts

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -377,18 +377,21 @@ class BasicLabelDesignerApp {
377377
<span class="visually-hidden">Settings</span>
378378
</button>
379379
<ul class="dropdown-menu">
380-
<li><a id="printtest_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
381-
Print test page
382-
</a></li>
383-
<li><a id="feedlabel_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
384-
Feed blank label
385-
</a></li>
386-
<li><a id="configprinter_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
387-
Set label config
388-
</a></li>
389-
<li><a id="printconfig_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
390-
Print config on labels
391-
</a></li>
380+
<li><a id="printerStatus_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
381+
Query printer status
382+
</a></li>
383+
<li><a id="printtest_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
384+
Print test page
385+
</a></li>
386+
<li><a id="feedlabel_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
387+
Feed blank label
388+
</a></li>
389+
<li><a id="configprinter_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
390+
Set label config
391+
</a></li>
392+
<li><a id="printconfig_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
393+
Print config on labels
394+
</a></li>
392395
</ul>
393396
</div>
394397
</div>
@@ -418,6 +421,14 @@ class BasicLabelDesignerApp {
418421
this.redrawPrinterButtonHighlights();
419422
this.redrawTextCanvas();
420423
});
424+
document.getElementById(`printerStatus_${idx}`)!
425+
.addEventListener('click', async (e) => {
426+
e.preventDefault();
427+
const printerIdx = (e.currentTarget as HTMLAnchorElement).dataset.printerIdx as unknown as number;
428+
const printer = this.printers[printerIdx];
429+
const doc = printer.getConfigDocument().queryStatus().finalize();
430+
await printer.sendDocument(doc);
431+
});
421432
document.getElementById(`printtest_${idx}`)!
422433
.addEventListener('click', async (e) => {
423434
e.preventDefault();
@@ -640,12 +651,19 @@ class BasicLabelDesignerApp {
640651
// And send the whole shebang to the printer!
641652
await printer.sendDocument(doc);
642653

654+
// Then get the updated printer info..
655+
await printer.sendDocument(WebLabel.ReadyToPrintDocuments.configDocument);
656+
657+
// Hide the config modal
643658
form.modalWithAutosense.checked = false;
644659
form.modalZplWithSensorGraph.checked = false;
645660
form.modalSubmit.removeAttribute("disabled");
646661
form.modalCancel.removeAttribute("disabled");
647662
this.activePrinterIndex = printerIdx;
648663
this.configModalHandle.hide();
664+
665+
// Redraw the buttons with the updated config
666+
this.redrawPrinterButtons();
649667
}
650668
}
651669

demo/test_editor.ts

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -348,18 +348,21 @@ class BasicLabelDesignerApp {
348348
<span class="visually-hidden">Settings</span>
349349
</button>
350350
<ul class="dropdown-menu">
351-
<li><a id="printtest_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
352-
Print test page
353-
</a></li>
354-
<li><a id="feedlabel_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
355-
Feed blank label
356-
</a></li>
357-
<li><a id="configprinter_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
358-
Set label config
359-
</a></li>
360-
<li><a id="printconfig_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
361-
Print config on labels
362-
</a></li>
351+
<li><a id="printerStatus_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
352+
Query printer status
353+
</a></li>
354+
<li><a id="printtest_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
355+
Print test page
356+
</a></li>
357+
<li><a id="feedlabel_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
358+
Feed blank label
359+
</a></li>
360+
<li><a id="configprinter_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
361+
Set label config
362+
</a></li>
363+
<li><a id="printconfig_${idx}" data-printer-idx="${idx}" class="dropdown-item" href="#">
364+
Print config on labels
365+
</a></li>
363366
</ul>
364367
</div>
365368
</div>
@@ -389,6 +392,14 @@ class BasicLabelDesignerApp {
389392
this.redrawPrinterButtonHighlights();
390393
this.redrawLabelCanvas();
391394
});
395+
document.getElementById(`printerStatus_${idx}`)!
396+
.addEventListener('click', async (e) => {
397+
e.preventDefault();
398+
const printerIdx = (e.currentTarget as HTMLAnchorElement).dataset.printerIdx as unknown as number;
399+
const printer = this.printers[printerIdx];
400+
const doc = printer.getConfigDocument().queryStatus().finalize();
401+
await printer.sendDocument(doc);
402+
});
392403
document.getElementById(`printtest_${idx}`)!
393404
.addEventListener('click', async (e) => {
394405
e.preventDefault();
@@ -575,12 +586,19 @@ class BasicLabelDesignerApp {
575586
// And send the whole shebang to the printer!
576587
await printer.sendDocument(doc);
577588

589+
// Then get the updated printer info..
590+
await printer.sendDocument(WebLabel.ReadyToPrintDocuments.configDocument);
591+
592+
// Hide the config modal
578593
form.modalWithAutosense.checked = false;
579594
form.modalZplWithSensorGraph.checked = false;
580595
form.modalSubmit.removeAttribute("disabled");
581596
form.modalCancel.removeAttribute("disabled");
582597
this.activePrinterIndex = printerIdx;
583598
this.configModalHandle.hide();
599+
600+
// Redraw the buttons with the updated config
601+
this.redrawPrinterButtons();
584602
}
585603
}
586604

src/Documents/ConfigDocument.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ export class ConfigDocumentBuilder
2626
// to commit the changes to stored memory. EPL does this automatically, ZPL does not
2727
// so to bring them closer to parity this is automatically implied.
2828
private _doSave = false;
29-
// TODO: Consider whether this should move to a ZPL extended command.
3029
override finalize() {
3130
if (this._doSave) {
32-
this.andThen(new Cmds.SaveCurrentConfigurationCommand());
31+
this.andThen(new Cmds.SaveCurrentConfigurationCommand())
32+
.andThen(new Cmds.EndLabel())
33+
.andThen(new Cmds.StartLabel())
34+
.andThen(new Cmds.QueryConfigurationCommand());
3335
}
3436
return super.finalize();
3537
}

src/Languages/Zpl/CmdHostConfig.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ export function parseCmdHostConfig(
8888
// Store these for disambiguation later on..
8989
let markLed, ribbonLed: number | undefined;
9090
let sawGain = false;
91+
let sawNonCont = false;
92+
let sawSensorType: string | undefined;
9193

9294
response
9395
.split('\n')
@@ -125,19 +127,25 @@ export function parseCmdHostConfig(
125127
update.printerMedia!.mediaGapDetectMode = Conf.MediaMediaGapDetectionMode.continuous;
126128
break;
127129
case "GAP/NOTCH":
128-
case "NON-CONTINUOUS":
129130
update.printerMedia!.mediaGapDetectMode = Conf.MediaMediaGapDetectionMode.webSensing;
130131
break;
132+
case "NON-CONTINUOUS":
133+
// Older printers use this for both mark and web, then use SENSOR TYPE
134+
// to determine what type of non-continuous.
135+
sawNonCont = true;
136+
break;
131137
}
132138
break;
133139
}
134140
case "SENSOR SELECT": // TRANSMISSIVE, REFLECTIVE, MANUAL
141+
// Seems to be present on newer firmware revisions
135142
// This should be set automatically with MEDIA TYPE.
136143
// TODO: Don't ignore this if it disagrees with MEDIA TYPE?
137144
break;
138145
case "SENSOR TYPE": // MARK, WEB
139-
// This should be set automatically with MEDIA TYPE. LP2844-Z units.
140-
// TODO: Don't ignore this if it disagrees with MEDIA TYPE?
146+
// Seems to be present on older firmware revisions. Will still be set
147+
// when in continuous mode, so disambiguate later on.
148+
sawSensorType = l.value
141149
break;
142150

143151
// Cases handled by XML.
@@ -360,6 +368,16 @@ export function parseCmdHostConfig(
360368
update.printerZplSettings!.ribbonGain = ribbonLed;
361369
}
362370

371+
// On older printers 'NON-CONTINOUS' media type is used for web and mark
372+
// then the SENSOR TYPE is used to determine the gap mode.
373+
if (sawNonCont && sawSensorType !== undefined) {
374+
if (sawSensorType === "MARK") {
375+
update.printerMedia!.mediaGapDetectMode = Conf.MediaMediaGapDetectionMode.markSensing;
376+
} else if (sawSensorType === "WEB") {
377+
update.printerMedia!.mediaGapDetectMode = Conf.MediaMediaGapDetectionMode.webSensing;
378+
}
379+
}
380+
363381
result.messages = [update];
364382
return result
365383
}

src/Languages/Zpl/test_files/LP2844_Z_CONF.ts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"messageType": "SettingUpdateMessage",
77
"printerHardware": {},
88
"printerMedia": {
9-
"mediaGapDetectMode": 1,
9+
"mediaGapDetectMode": 2,
1010
"mediaLengthDots": 235,
1111
},
1212
"printerSettings": {},

0 commit comments

Comments
 (0)