"""Generate components/samsung_vfd/charmaps.h from Python's code page codecs. Each table lists the Unicode code point shown for bytes 0x80..0xFF in one of the display's CG-ROM fonts (datasheet section 6), or 0 where there is none. CP10 (for DP86-20) has no standard codec, so it gets no table. Run from the repo root: python tools/gen_charmaps.py """ from pathlib import Path # Same order as the ESC t n argument (datasheet 5.4.18). TABLES = [ ("PC437", "cp437"), ("PC850", "cp850"), ("PC866", "cp866"), ("PC737", "cp737"), ("PC775", "cp775"), ("CP10", None), ("PC864", "cp864"), ("PC852", "cp852"), ] OUT = Path(__file__).resolve().parent.parent / "components" / "samsung_vfd" / "charmaps.h" def high_half(codec): points = [] for b in range(0x80, 0x100): try: ch = bytes([b]).decode(codec) except UnicodeDecodeError: ch = "" points.append(ord(ch) if len(ch) == 1 else 0) return points def main(): lines = [ "// Generated by tools/gen_charmaps.py -- do not edit.", "#pragma once", "", "#include ", "", "namespace esphome {", "namespace samsung_vfd {", "", ] names = [] for name, codec in TABLES: if codec is None: names.append("nullptr") continue ident = f"CHARMAP_{name}" names.append(ident) pts = high_half(codec) lines.append(f"// {name} ({codec}), bytes 0x80..0xFF") lines.append(f"static const uint16_t {ident}[128] = {{") for i in range(0, 128, 8): row = ", ".join(f"0x{p:04X}" for p in pts[i : i + 8]) lines.append(f" {row}, // 0x{0x80 + i:02X}") lines.append("};") lines.append("") lines.append("// Indexed by CodeTable (the ESC t argument); nullptr = no mapping known.") lines.append(f"static const uint16_t *const CHARMAPS[{len(TABLES)}] = {{") for (name, _), ident in zip(TABLES, names): lines.append(f" {ident}, // {name}") lines.append("};") lines.append("") lines.append("} // namespace samsung_vfd") lines.append("} // namespace esphome") lines.append("") OUT.write_text("\n".join(lines), encoding="utf-8", newline="\n") print(f"wrote {OUT}") if __name__ == "__main__": main()