- 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>
55 lines
2.8 KiB
Markdown
55 lines
2.8 KiB
Markdown
# 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.
|