qr: every version, 1 to 40
PSOGM mode will put the kernel log on screen as QR codes, a page per symbol, and version 6 held 134 bytes. Version 40 at level L holds 2,953. What grew: blocks of two lengths and the interleave that steps around them, the alignment-pattern grid, the version-information blocks from version 7, the 16-bit character count from version 10. The per-version table is down to the two columns that are genuinely transcription (EC codewords per block, block count); total codewords come from the geometry. Checked against segno module for module at every version (exact-fill payloads), and 120 symbols across all 40 versions decode with zbar. OpenCV's detector cannot find symbols above about version 24 at all, segno's included, so qrcheck reports those as the detector's limit. The crash card stays a version-6 symbol (QR_CARD_BYTES), so a phone still reads it from across the desk. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1giNvrHTrPMPw7V6x1kQ4
This commit is contained in:
parent
5ea03c4cf5
commit
d8e8ae604f
5 changed files with 147 additions and 83 deletions
|
|
@ -8,25 +8,26 @@
|
|||
// no second machine on the desk. A phone camera is a working out-of-band
|
||||
// channel that needs no drivers on our side at all. See docs/architecture/graphics.md.
|
||||
//
|
||||
// Deliberately small, in three ways:
|
||||
// Deliberately small, in two ways:
|
||||
//
|
||||
// - Byte mode only. The report is arbitrary bytes; alphanumeric mode would
|
||||
// pack tighter but only for a restricted character set.
|
||||
// - Error correction level L only. The screen is a clean, evenly lit,
|
||||
// high-contrast source -- the failure mode QR's stronger levels protect
|
||||
// against (dirt, print damage, curved packaging) does not apply.
|
||||
// - Versions 1 to 6 only. Version 7 is where QR starts requiring an extra
|
||||
// 18-bit version-information block in two more places on the symbol, and
|
||||
// version 10 is where the character count field grows and the alignment
|
||||
// pattern grid becomes 2-dimensional. Stopping at 6 avoids both, and
|
||||
// 134 bytes is a large crash report.
|
||||
//
|
||||
// If a payload ever needs more than 134 bytes, the honest fix is to shorten the
|
||||
// report -- not to reach for version 10 and its two extra tables.
|
||||
// Every version, 1 to 40. It stopped at 6 -- 134 bytes, enough for the crash
|
||||
// card -- until PSOGM mode wanted the log itself off the machine, a page of it
|
||||
// per symbol: version 40 at level L carries 2,953 bytes. A struct qr is
|
||||
// therefore about 62 KB; keep one static, never on a stack.
|
||||
|
||||
#define QR_MAX_VERSION 6
|
||||
#define QR_MAX_SIZE (17 + 4 * QR_MAX_VERSION) // 41 modules per side
|
||||
#define QR_MAX_BYTES 134
|
||||
#define QR_MAX_VERSION 40
|
||||
#define QR_MAX_SIZE (17 + 4 * QR_MAX_VERSION) // 177 modules per side
|
||||
#define QR_MAX_BYTES 2953
|
||||
|
||||
// The crash card on the PSOGM stays small, so a phone reads it from across a
|
||||
// desk: a version-6 symbol at most.
|
||||
#define QR_CARD_BYTES 134
|
||||
|
||||
struct qr {
|
||||
int size; // modules per side; 0 if unencoded
|
||||
|
|
|
|||
Loading…
Reference in a new issue