86 lines
3.1 KiB
Markdown
86 lines
3.1 KiB
Markdown
# Printer Beep Strategy
|
||
|
||
## How beeping works on the Jolimark TP850UE
|
||
|
||
The printer has a built-in buzzer. Three commands are available:
|
||
|
||
| Command | Bytes | Parameters | Notes |
|
||
|---------|-------|------------|-------|
|
||
| `BEL` | `0x07` | none | Single short beep, ~50ms. Simplest. |
|
||
| `ESC BEL n1 n2 n3` | `0x1B 0x07 n1 n2 n3` | n1=on-time (×100ms), n2=off-time (×100ms), n3=count | Full control over length, gap, repetitions. |
|
||
| `GS BEL n1 n2 n3` | `0x1D 0x07 n1 n2 n3` | n1=count, n2=on-time (×100ms), n3=off-time (×100ms) | Same as ESC BEL but parameter order differs. |
|
||
|
||
**Confirmed working on our test:** `ESC BEL` with `n1=2, n2=2, n3=1` = one 200ms beep.
|
||
Pattern beeps also work: `ESC BEL 1 1 3` = three short beeps in quick succession.
|
||
|
||
The beep is triggered by sending these bytes **immediately before or after** the print job —
|
||
it does not need to be part of a complete print page. You can send a beep-only job
|
||
(connect, send beep bytes, close) without printing anything.
|
||
|
||
---
|
||
|
||
## Where to add beeps in the system
|
||
|
||
### 1. New kitchen ticket arrives (MOST IMPORTANT)
|
||
**Where:** `printer_service.py` → `_print_kitchen_ticket()`, just before or after the cut command.
|
||
**Pattern:** 2 short beeps — signals a new order without being annoying.
|
||
```python
|
||
p._raw(bytes([0x1b, 0x07, 1, 1, 2])) # 2× 100ms beeps
|
||
p.cut()
|
||
```
|
||
|
||
### 2. Re-print of an existing ticket
|
||
**Where:** Same function, but only 1 beep to distinguish from a new order.
|
||
```python
|
||
p._raw(bytes([0x1b, 0x07, 1, 2, 1])) # 1× 100ms beep
|
||
```
|
||
|
||
### 3. Urgent / rush order (future feature)
|
||
**Where:** If we add an "urgent" flag to orders, trigger a longer or triple beep.
|
||
```python
|
||
p._raw(bytes([0x1b, 0x07, 3, 1, 3])) # 3× 300ms beeps
|
||
```
|
||
|
||
### 4. Test print
|
||
**Where:** `send_test_print()` — already sends a test page, add 1 beep so the cook knows
|
||
to look at the printer.
|
||
|
||
---
|
||
|
||
## Implementation plan (when ready)
|
||
|
||
1. **Add a per-printer setting:** `print.beep_on_ticket` = `true`/`false`
|
||
(some stations may not want beeping, e.g. a bar printer near customers)
|
||
|
||
2. **Add a beep pattern setting:** `print.beep_pattern` = `single` / `double` / `triple`
|
||
|
||
3. **In `_print_kitchen_ticket`:** After building the ticket, before `p.cut()`:
|
||
```python
|
||
if beep_enabled:
|
||
p._raw(beep_bytes_for_pattern)
|
||
```
|
||
|
||
4. **No separate beep job needed** — bake it into the ticket job. The buzzer fires
|
||
as the paper is cutting, which is the natural attention signal.
|
||
|
||
---
|
||
|
||
## Settings keys to add (future)
|
||
|
||
```
|
||
print.beep_on_ticket "true" / "false" default: "true"
|
||
print.beep_pattern "single" / "double" / "triple" default: "double"
|
||
```
|
||
|
||
These can go in the Printer management UI (per-printer toggle) and in the
|
||
Print Settings tab (global default pattern).
|
||
|
||
---
|
||
|
||
## Notes
|
||
|
||
- Beep bytes are sent over the same TCP socket as print data — no separate connection needed.
|
||
- The buzzer is hardware-limited; very short intervals (< 50ms) may be ignored.
|
||
- Beeping does NOT require paper to be loaded or printing to succeed — it fires independently.
|
||
- If spoof-printing mode is ON, the beep should also be suppressed (no real connection is made).
|