{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# RBPU16 数据手册\n", "\nRun All → 生成自包含 HTML(可直接发送给他人)。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import sys, os, csv, json, re, subprocess, base64, mimetypes\n", "from datetime import datetime\n", "from pathlib import Path\n", "from html import escape\n", "\n", "try:\n", " import markdown as md_lib\n", "except ImportError:\n", " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"markdown\", \"Pygments\", \"-q\"])\n", " import markdown as md_lib\n", "\n", "BASE = Path(os.getcwd()).resolve()\n", "print(f\" {BASE.name}\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Build" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ============================================================\n", "# Data loaders\n", "# ============================================================\n", "\n", "def csv_dicts(path):\n", " rows = []\n", " with open(path, encoding=\"utf-8\") as f:\n", " for row in csv.DictReader(f):\n", " rows.append({k.strip(): v.strip() if v else \"\" for k, v in row.items()})\n", " return rows\n", "\n", "def csv_raw(path):\n", " rows = []\n", " with open(path, encoding=\"utf-8\") as f:\n", " for row in csv.reader(f): rows.append([c.strip() for c in row])\n", " return rows\n", "\n", "pins = csv_dicts(BASE / \"data\" / \"pin_name.csv\")\n", "pin_loc_raw = csv_raw(BASE / \"data\" / \"pin_loc.csv\")\n", "with open(BASE / \"data\" / \"ids.json\", encoding=\"utf-8\") as f:\n", " ids = json.load(f)\n", "reg_modules = ids.get(\"Modules\", {})\n", "print(f\" {len(pins)} pins, {len(reg_modules)} reg modules\")\n", "\n", "# ============================================================\n", "# Table renderers\n", "# ============================================================\n", "\n", "def eh(s): return escape(str(s))\n", "\n", "def render_table(rows, cols=None):\n", " if not rows: return \"
no data
\"\n", " cols = cols or list(rows[0].keys())\n", " h = [\"| {eh(c)} | \")\n", " h.append(\"
|---|
| {eh(str(r.get(c,\\\"\\\")))} | \")\n", " h.append(\"
no data
\"\n", " ncols = len(raw[0]) - 1\n", " h = ['| ']\n", " for c in range(1, ncols+1): h.append(f' | {c} | ')\n", " h.append(\"
|---|---|
| {eh(r[0])} | ')\n", " for c in range(1, ncols+1):\n", " val = r[c] if c < len(r) else \"\"\n", " h.append(f'{eh(val)} | ')\n", " h.append(\"
{len(entries)} 个寄存器/存储段
\")\n", " for sn, seg in entries.items():\n", " addr = seg.get(\"OffsetAddress\",\"\"); perm = seg.get(\"Permission\",\"\")\n", " sd = seg.get(\"SegDescription\",\"\"); fields = seg.get(\"Fields\",[])\n", " h.append(f'地址:{eh(addr)} 权限:{perm_b(perm)} 描述:{eh(sd)}
| Bits | Field | Reset | Range | Description |
|---|---|---|---|---|
| {bits_str(b)} | {eh(f.get(\"FieldName\",\"\"))} | {eh(f.get(\"ResetValue\",\"\"))} | {rng_str(f.get(\"Range\"))} | {eh(f.get(\"FieldDescription\",\"\"))} |
unsupported: {import_path}
'\n", " except Exception as e:\n", " import traceback\n", " return f'{traceback.format_exc()}| 版本 | 日期 | 修订内容 | 作者 |
|---|---|---|---|
| 1.0 | {DATE} | 初版发布 | {AUTHOR} |