yourovo/README.md
Monster Robot Party 3056fd70fc Windows Urovo D812R+ print+encode daemon + full assessment
- pricegod-urovo-daemon: C# :7790 HTTP service, drives the Urovo D812R+ via
  the GTSPL SDK; prints a label AND encodes the UHF chip in one pass. Drop-in
  for the PriceGod extension's daemon.js (same :7790, CORS *).
- chafcheck: Chafon H-102 UHFPrimeReader P/Invoke probe.
- ASSESSMENT.md: everything done + learned this session -- the ribbon-latch
  fix, PET-labels-are-not-direct-thermal finding, unreliable-status-byte
  quirk, SKU->EPC scheme, the Chafon HID-mode dead end, and how to port the
  print+encode recipe to the Mac (GTSPL Java SDK / raw TSPL).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 15:18:39 +10:00

55 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# pricegod-urovo-daemon
The **Windows** counterpart to the Mac `rfid-daemon`. Instead of a Chafon gun writing a
loose chip while a Dymo prints a separate sticker, this drives the **Urovo D812R+ (RFID)**
to **print the label AND encode the UHF chip in one pass** on the composite (paper+chip) rolls.
It listens on `http://localhost:7790/` with `CORS *`, so it's a drop-in for the PriceGod
extension's existing `daemon.js` client — same port, same JSON shape.
## Run it
Double-click **`start-daemon.cmd`** (leave the window open while you work). That's it —
no Node, no .NET SDK, no gitea clone. It's a self-contained `.exe`.
To rebuild after editing `daemon.cs`: double-click **`build.cmd`**.
## What's inside
- `daemon.cs` — the service (C#, .NET Framework 4.x).
- `pricegod-urovo-daemon.exe` — the compiled daemon.
- `GTSPL_SDK.dll`, `GTSPL_SDK_C.dll`, `zlib.net.dll` — the Gainscha/Urovo print SDK
(must sit beside the .exe). Copied from the vendor Windows SDK.
The print/encode sequence is a straight port of the proven `gtcheck.cs` `rfidgo` path:
`SET RIBBON OFF` → continuous geometry (`GAP 0`, RFID rolls blind the optical gap sensor)
`writeUHF` → draw text + QR → `printlabel` → read-back verify.
## Routes
| method | path | body | returns |
|---|---|---|---|
| GET | `/status` | — | `{ok, ready, status, statusText, printer}` |
| POST | `/print-encode` | `{sku, releaseId, artist?, title?, price?, condition?, w?, h?, gap?}` | `{ok, sku, releaseId, epc, verified, status}` |
| POST | `/write-tag` | alias of `/print-encode` (the daemon.js name) | same |
| GET | `/read-tag` | — | `{ok, epc, sku, releaseId, recognized}` |
| POST | `/calibrate` | — | RFID auto-calibration |
| POST | `/recover` | — | ribbon-off + one feed to clear a fault |
Quick test (PowerShell):
```powershell
Invoke-RestMethod http://localhost:7790/status
```
## SKU ↔ EPC scheme (⚠ verify)
The 96-bit EPC (12 bytes) is packed as: **6 bytes** 14-digit timestamp SKU · **4 bytes**
release_id · **2 bytes** `0xEC01` marker. This lives in the `Epc` class in `daemon.cs` and
is the **only** thing that needs to change if it must match a different (Mac/Chafon) layout —
nothing else depends on the byte order. Confirm by reading an existing tag: put a
Chafon-written record at the antenna and `GET /read-tag`.
## Notes / open items
- Default label geometry is `65×37 mm`, continuous (`GAP 0`). Adjust to your actual RFID
roll via the `w`/`h`/`gap` fields, or change the `DEF_*` constants.
- The label layout (text lines + QR) is functional, not yet pixel-matched to the 51×19
Dymo design in the extension's `labels.js`.
- The Chafon gun is still needed for **reading a loose tag off a shelf** — the Urovo can
only read/write a tag physically inside the printer.