From e0a966372f745d12717bb1bfaac59fdc61026fe8 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Mon, 8 Jun 2026 14:28:16 +0000 Subject: [PATCH 01/49] Add documentation inventory across five PandABlocks repos Inventories all .rst and .md files under docs/ in PandABlocks-FPGA, PandABlocks-server, PandABlocks-rootfs, PandABlocks.github.io, and meta-panda, with word counts, last-commit dates, one-line summaries, audience notes, and an outdated/partial/current status flag. Co-Authored-By: Claude Sonnet 4.6 --- knowledge/01-inventory.md | 90 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 knowledge/01-inventory.md diff --git a/knowledge/01-inventory.md b/knowledge/01-inventory.md new file mode 100644 index 00000000..905e27d3 --- /dev/null +++ b/knowledge/01-inventory.md @@ -0,0 +1,90 @@ +# Documentation Inventory + +| Repo | File path (relative to docs/) | Words | Last commit | Covers | Audience | Status | +|------|-------------------------------|-------|-------------|--------|----------|--------| +| PandABlocks-FPGA | blocks.rst | 41 | 2019-01-03 | Lists the available block types that can be built into a PandABlocks app, with content pulled from a generated build artifact. | Developers and system integrators selecting blocks for an app. | outdated | +| PandABlocks-FPGA | index.rst | 257 | 2024-09-20 | Top-level documentation home page describing what PandABlocks does and routing different audiences to the relevant sections. | All users from end-users to core framework developers. | current | +| PandABlocks-FPGA | reference/app.rst | 364 | 2020-03-06 | Explains how to assemble blocks into an app using an ini file and how to build and query it at runtime. | Developers creating or configuring a new PandABlocks app. | outdated | +| PandABlocks-FPGA | reference/block.rst | 1610 | 2023-09-01 | Comprehensive reference for writing a new block, covering the ini file format, Python simulation, timing tests, and target ini. | FPGA firmware developers creating or extending blocks. | current | +| PandABlocks-FPGA | reference/changelog.rst | 3 | 2018-08-02 | Stub that includes the top-level CHANGELOG.rst file. | All users tracking version history. | partial | +| PandABlocks-FPGA | reference/cocotb.rst | 742 | 2025-11-27 | Documents how to run, interpret, and write VHDL timing tests using the cocotb-based test runner. | FPGA developers writing or debugging block timing tests. | current | +| PandABlocks-FPGA | reference/contributing.rst | 3 | 2018-08-02 | Stub that includes the top-level CONTRIBUTING.rst file. | Contributors to the project. | partial | +| PandABlocks-FPGA | reference/framework.rst | 500 | 2019-01-31 | Describes the internal autogeneration framework architecture, including how testbenches read timing data and compare signals. | Core framework developers working on the autogeneration pipeline. | outdated | +| PandABlocks-FPGA | reference/glossary.rst | 245 | 2018-08-09 | Defines key PandABlocks terminology such as App, Block, Field, Module, and PandABox. | All users needing to understand project-specific vocabulary. | outdated | +| PandABlocks-FPGA | reference/testing.rst | 274 | 2024-09-20 | Describes how to run the Python, simulation, and HDL testbench test suites via Makefile targets. | Developers running or debugging the project's test suite. | current | +| PandABlocks-FPGA | tutorials/tutorial1_blinking_leds.rst | 648 | 2020-01-03 | Step-by-step walkthrough of wiring PULSE and CLOCK blocks together to blink LEDs at different rates using the web GUI. | End users new to PandABlocks learning the basics of the block wiring interface. | outdated | +| PandABlocks-FPGA | tutorials/tutorial2_position_capture.rst | 1167 | 2020-01-27 | Hands-on guide to using the PCAP block to capture position bus values with various capture modes (Value, Diff, Min, Max, Mean). | End users learning how to set up and use position capture on a PandA device. | outdated | +| PandABlocks-FPGA | tutorials/tutorial3_position_compare.rst | 41 | 2019-02-18 | Stub introduction to position compare for generating trigger pulses at regular positional intervals. | End users learning position compare functionality. | partial | +| PandABlocks-FPGA | tutorials/tutorial4_snake_scan.rst | 52 | 2019-02-18 | Stub introduction to table-based position compare using the SEQ block for a 2D snake scan. | End users learning advanced scanning patterns. | partial | +| PandABlocks-server | docs/building.rst | 493 | 2017-06-26 | Explains build dependencies, CONFIG file setup, make targets, and generated output files for the PandABlocks server. | Developers building the server from source for the first time. | outdated | +| PandABlocks-server | docs/capture.rst | 1460 | 2024-02-16 | Documents the data capture port protocol, connection flow, capture options, data header format, transport modes, and completion codes. | Client developers integrating with the PandA data capture interface. | current | +| PandABlocks-server | docs/commands.rst | 1984 | 2025-07-11 | Describes the full ASCII command interface on port 8888, including all configuration and system command forms and their responses. | Client developers and integrators communicating with the PandA socket server. | current | +| PandABlocks-server | docs/config.rst | 1198 | 2025-09-03 | Specifies the syntax and semantics of the three server configuration files (config, registers, description) that define blocks, fields, and register mappings. | FPGA/firmware developers authoring or maintaining PandA configuration files. | current | +| PandABlocks-server | docs/extension.rst | 739 | 2021-08-13 | Describes the extension server mechanism for implementing custom fields via Python modules with a remote procedure call interface. | Developers writing custom Python extension modules for the PandA server. | outdated | +| PandABlocks-server | docs/fields.rst | 2671 | 2025-07-11 | Documents all block field types, sub-types, attributes, and their read/write/capture behaviours as exposed via the socket server. | Client developers and system integrators working with PandA block and field configuration. | current | +| PandABlocks-server | docs/index.rst | 20 | 2021-09-22 | Acts as the documentation root, including the README and linking the toctree to all other doc pages. | All documentation readers navigating the site. | partial | +| PandABlocks-server | docs/presentation-2016-05/building.rst | 341 | 2018-02-16 | Slide-deck instructions for building the PandABlocks-rootfs project and its boot image dependencies. | Developers or sysadmins attending the May 2016 PandA workshop. | outdated | +| PandABlocks-server | docs/presentation-2016-05/panda.rst | 1362 | 2017-06-26 | May 2016 conference presentation covering PandA hardware/software architecture, installation, network configuration, and zpkg package management. | Engineers being introduced to the PandA system at the 2016 workshop. | outdated | +| PandABlocks-server | docs/presentation-2016-05/server.rst | 649 | 2016-05-05 | May 2016 presentation slide set introducing the PandA socket server architecture, config file format, and field types. | Engineers attending the May 2016 PandA server overview talk. | outdated | +| PandABlocks-server | docs/startup.rst | 501 | 2019-04-05 | Lists and explains all command-line arguments for starting the PandA socket server manually. | System administrators and developers launching or scripting the server. | outdated | +| PandABlocks-server | docs/support.rst | 391 | 2016-09-19 | Covers supporting Python tools (sim_server, tcp_client, save/load-state) and the meaning of the PandA hardware status LEDs. | System operators and developers troubleshooting or interacting with a running PandA. | outdated | +| PandABlocks-rootfs | explanations.md | 19 | 2024-12-11 | Navigation stub listing explanations sub-pages via a toctree glob with no substantive content. | Documentation maintainers/contributors. | partial | +| PandABlocks-rootfs | how-to/building.md | 1302 | 2025-11-20 | Step-by-step instructions for building the PandABlocks root filesystem from source, including dependencies, configuration, output files, boot process, and zpkg package management. | Developers who need to compile and deploy the PandA rootfs image. | current | +| PandABlocks-rootfs | how-to.md | 55 | 2024-12-11 | Navigation stub introducing the three how-to guides: getting PandA on the network, updating via SSH, and building the rootfs. | Documentation maintainers/contributors. | partial | +| PandABlocks-rootfs | how-to/quickstart.md | 564 | 2024-12-11 | How to configure PandA networking via config.txt, use the USB override mechanism, and navigate the web interface and web admin panel. | Hardware operators and system administrators setting up a PandA device for the first time. | current | +| PandABlocks-rootfs | index.md | 174 | 2024-12-11 | Landing page for the PandABlocks-rootfs documentation, describing what the rootfs does and linking to the three main how-to guides. | All users of the PandABlocks-rootfs project. | current | +| PandABlocks-rootfs | reference.md | 20 | 2024-12-11 | Navigation stub listing reference sub-pages including APIs, release notes, and a generated index. | Documentation maintainers/contributors. | partial | +| PandABlocks-rootfs | tutorials.md | 8 | 2024-12-11 | Navigation stub for the tutorials section with no content beyond a toctree glob. | Documentation maintainers/contributors. | partial | +| PandABlocks.github.io | explanations/decisions/0001-record-architecture-decisions.rst | 57 | 2024-03-25 | ADR recording the decision to use Architecture Decision Records to document project architectural choices. | Project contributors and maintainers. | current | +| PandABlocks.github.io | explanations/decisions/0002-switched-to-pip-skeleton.rst | 93 | 2024-03-25 | ADR recording the decision to adopt the DiamondLightSource python3-pip-skeleton for consistent project structure and tooling. | Project contributors and maintainers. | current | +| PandABlocks.github.io | explanations/decisions.rst | 71 | 2024-03-25 | Index page listing all Architecture Decision Records for the project. | Project contributors and maintainers. | current | +| PandABlocks.github.io | explanations.rst | 16 | 2024-03-25 | Navigation stub for the explanations section. | Documentation maintainers/contributors. | partial | +| PandABlocks.github.io | how.rst | 19 | 2024-03-25 | Navigation stub for the how-to guides section. | Documentation maintainers/contributors. | partial | +| PandABlocks.github.io | how-to/contribute.rst | 3 | 2024-03-25 | Stub that includes the project's CONTRIBUTING.rst file from the .github directory. | Potential contributors to the project. | partial | +| PandABlocks.github.io | how-to/finedelay-test.rst | 183 | 2026-03-16 | Procedure for testing the fine delay functionality of LVDSOUT pins using an oscilloscope and a sweep script. | Hardware engineers and FPGA developers validating PandA timing outputs. | current | +| PandABlocks.github.io | how-to/make-release.rst | 97 | 2024-03-25 | Checklist for creating a new GitHub release for the project. | Project maintainers responsible for publishing releases. | current | +| PandABlocks.github.io | how-to/remote.rst | 471 | 2024-11-27 | Instructions for updating PandA rootfs and zpkg packages remotely over SSH, including an EEPROM update for 24V FMC cards. | System administrators and engineers managing PandA firmware deployments. | current | +| PandABlocks.github.io | how-to/run-container.rst | 167 | 2025-07-08 | Instructions for pulling and running the PandA development Docker container with the required volume mounts. | Developers setting up a local PandA build environment using containers. | current | +| PandABlocks.github.io | how-to/update-tools.rst | 84 | 2024-03-25 | Instructions for syncing the project with the latest DiamondLightSource python3-pip-skeleton via git rebase. | Project maintainers keeping developer tooling up to date. | current | +| PandABlocks.github.io | how-to/web-interface.rst | 329 | 2024-11-27 | Step-by-step guide for updating PandA rootfs and zpkg packages using the web admin interface and a USB memory stick. | System administrators and operators performing PandA firmware updates in the field. | current | +| PandABlocks.github.io | index.rst | 127 | 2024-03-25 | Top-level documentation landing page linking to all four documentation sections and listing the URLs for each PandABlocks sub-project. | All users and developers of the PandABlocks ecosystem. | current | +| PandABlocks.github.io | reference/genindex.rst | 5 | 2024-03-25 | Minimal stub page providing a placeholder for the API index. | Documentation maintainers/contributors. | partial | +| PandABlocks.github.io | reference/migration_guide.rst | 119 | 2024-03-25 | Guide for migrating PandA firmware between major versions, with API change tables for the 2.0-to-3.0 upgrade. | System administrators and developers upgrading PandA firmware between major releases. | current | +| PandABlocks.github.io | reference/release_compatibility.rst | 32 | 2024-03-25 | Table showing which rootfs versions are compatible with which zpkg release versions. | System administrators ensuring compatible component versions when deploying PandA firmware. | current | +| PandABlocks.github.io | reference.rst | 18 | 2024-03-25 | Navigation stub for the references section. | Documentation maintainers/contributors. | partial | +| PandABlocks.github.io | reference/standards.rst | 17 | 2024-03-25 | Stub defining code and documentation standards for the repository with only a section header and no body content. | Project contributors writing or reviewing code and documentation. | partial | +| PandABlocks.github.io | tutorial.rst | 18 | 2024-03-25 | Navigation stub for the tutorials section. | Documentation maintainers/contributors. | partial | +| PandABlocks.github.io | tutorials/tutorial1_blinking_leds.rst | 648 | 2024-03-25 | Hands-on tutorial introducing PandABlocks basics by wiring CLOCK and PULSE blocks to blink TTL output LEDs at different rates. | New users learning the PandABlocks web GUI and block-wiring concepts for the first time. | current | +| PandABlocks.github.io | tutorials/tutorial2_position_capture.rst | 1167 | 2024-03-25 | Tutorial explaining how to configure PCAP position capture with various capture modes and retrieve data via TCP. | Users learning to use PandA's position capture interface for data acquisition experiments. | current | +| PandABlocks.github.io | tutorials/tutorial3_position_compare.rst | 41 | 2024-03-25 | Stub introduction to the Position Compare tutorial covering 1D encoder scanning and trigger generation at positional intervals. | New users progressing through the PandABlocks tutorial series. | partial | +| PandABlocks.github.io | tutorials/tutorial4_snake_scan.rst | 52 | 2024-03-25 | Stub introduction to the Snake Scan tutorial covering table-based 2D position compare using the SEQ block. | New users progressing through the PandABlocks tutorial series. | partial | +| meta-panda | explanations/boot-process.rst | 141 | 2025-10-08 | Describes the five-stage boot sequence of the PandA Zynq device from SD card to running Linux. | Developers and engineers building or debugging the PandA firmware. | current | +| meta-panda | explanations.rst | 19 | 2025-10-08 | Top-level toctree wrapper for the Explanations section with no substantive content. | Navigation/structural page for documentation readers. | partial | +| meta-panda | how-to/build.rst | 275 | 2026-02-02 | Step-by-step instructions for building the PandA Linux image using kas and collecting output files. | Developers who want to build the PandA firmware from source. | current | +| meta-panda | how-to/make-release.rst | 97 | 2025-10-13 | Checklist for creating a new GitHub release of the project. | Project maintainers responsible for publishing releases. | current | +| meta-panda | how-to/packages.rst | 137 | 2025-10-18 | How to install IPK/opkg packages onto a PandA via USB or SSH. | System administrators and developers deploying software to a PandA. | current | +| meta-panda | how-to/pandablocks-sdk.rst | 161 | 2025-10-18 | How to use the PandABlocks Yocto SDK Docker image to cross-compile the PandABlocks-server outside of Yocto. | Developers needing to build and test PandABlocks-server binaries for the PandA target. | current | +| meta-panda | how-to/quickstart.rst | 817 | 2025-10-08 | How to get a PandA on the network, configure networking, use the web admin interface, and answers to common operational FAQs. | Users setting up or administering a PandA device for the first time. | current | +| meta-panda | how-to/remote.rst | 245 | 2025-10-13 | How to update PandA firmware and EEPROM remotely via SSH. | Administrators needing to update multiple PandAs or perform low-level maintenance without physical access. | current | +| meta-panda | how-to.rst | 9 | 2025-10-08 | Top-level toctree wrapper for the How-to Guides section with no substantive content. | Navigation/structural page for documentation readers. | partial | +| meta-panda | how-to/run-container.rst | 167 | 2025-10-13 | How to pull and run the PandABlocks development Docker container with the required volume mounts. | Developers setting up a containerised build environment for PandA FPGA work. | current | +| meta-panda | how-to/web-interface.rst | 240 | 2025-10-13 | How to update PandA rootfs firmware using the web admin interface and a USB stick. | End users and administrators performing firmware upgrades via the browser-based admin panel. | current | +| meta-panda | index.rst | 31 | 2025-10-08 | Top-level documentation index linking all Linux system and webcontrol documentation sections. | All readers navigating the meta-panda documentation. | partial | +| meta-panda | reference/opkg.rst | 41 | 2025-10-08 | Quick-reference listing of common opkg package management commands available on the PandA. | System administrators and developers managing installed packages on a PandA. | current | +| meta-panda | reference.rst | 16 | 2025-10-08 | Top-level toctree wrapper for the Reference section with no substantive content. | Navigation/structural page for documentation readers. | partial | +| meta-panda | tutorials/manual-build.rst | 153 | 2025-10-08 | Alternative manual Yocto build procedure for the PandA image without the kas helper, intended for learning. | Developers wanting to understand the underlying Yocto build steps in detail. | current | +| meta-panda | tutorials.rst | 8 | 2025-10-08 | Top-level toctree wrapper for the Tutorials section with no substantive content. | Navigation/structural page for documentation readers. | partial | +| meta-panda | tutorials/tutorial1_blinking_leds.rst | 648 | 2025-10-13 | Guided tutorial using the web GUI to wire PULSE and CLOCK blocks together to flash PandA front-panel LEDs. | New users learning PandABlocks concepts through hands-on experimentation. | current | +| meta-panda | tutorials/tutorial2_position_capture.rst | 1167 | 2025-10-13 | Guided tutorial on using the PCAP block to capture position bus values with various capture modes. | Users learning how to configure and use PandA position capture functionality. | current | +| meta-panda | tutorials/tutorial3_position_compare.rst | 41 | 2025-10-13 | Stub introduction to a tutorial on generating trigger pulses at positional intervals using position compare. | Users progressing through the PandABlocks tutorial series. | partial | +| meta-panda | tutorials/tutorial4_snake_scan.rst | 52 | 2025-10-13 | Stub introduction to a tutorial on using the SEQ block for table-based two-dimensional snake scans. | Users progressing through the PandABlocks tutorial series. | partial | +| meta-panda | webcontrol/contents.rst | 22 | 2025-10-07 | Toctree contents page organising the webcontrol overview and user guide sections. | Navigation/structural page for the webcontrol documentation. | partial | +| meta-panda | webcontrol/index.rst | 97 | 2025-10-07 | Introduction to the PandABlocks-webcontrol GUI, listing its capabilities and pointing to quick-start and detailed guides. | New users approaching the webcontrol documentation for the first time. | current | +| meta-panda | webcontrol/userguide/contents.rst | 22 | 2025-10-07 | Toctree contents page organising the webcontrol user guide sub-pages. | Navigation/structural page for the webcontrol user guide. | partial | +| meta-panda | webcontrol/userguide/glossary.rst | 732 | 2025-10-07 | Defines key terms used throughout the webcontrol documentation (Block, Attribute, Link, Port, Design, etc.). | Users who need precise definitions of webcontrol and MalcolmJS interface concepts. | current | +| meta-panda | webcontrol/userguide/index.rst | 97 | 2025-10-07 | Introduction to the PandABlocks-webcontrol GUI (mirrors webcontrol/index.rst content). | New users approaching the webcontrol documentation for the first time. | current | +| meta-panda | webcontrol/userguide/monitoring_attribute_values.rst | 991 | 2025-10-07 | Explains how to view attribute values as real-time charts or numerical tables within the webcontrol UI. | Users who want to monitor and inspect live or historical block attribute data. | current | +| meta-panda | webcontrol/userguide/quick-start.rst | 376 | 2025-10-07 | Brief walkthrough of connecting to a Malcolm instance, selecting a root block, and creating a link between blocks. | New users wanting a fast introduction to the MalcolmJS web interface. | current | +| meta-panda | webcontrol/userguide/understanding_attribute_state.rst | 535 | 2025-10-07 | Explains each attribute state (Normal, Processing, Locally Edited, Warning, Error, etc.) and how they are shown in the UI. | Users who need to interpret the status icons displayed next to attributes in the webcontrol UI. | partial | +| meta-panda | webcontrol/userguide/user_interface_overview.rst | 1150 | 2025-10-07 | Describes the four UI panels, Layout View, and Attribute View of the MalcolmJS webcontrol interface. | Users learning how to navigate and use the webcontrol graphical interface. | current | +| meta-panda | webcontrol/userguide/working_with_a_design.rst | 4882 | 2025-10-07 | Comprehensive reference for all design operations in the webcontrol UI including adding/removing blocks, setting attributes, linking, and saving/loading designs. | Users actively building and configuring PandA designs in the webcontrol interface. | partial | From a751ae0ecb3ab019dd4ea93e050627c61ebf697b Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Mon, 8 Jun 2026 14:48:13 +0000 Subject: [PATCH 02/49] Add documentation gap analysis draft Cross-repo analysis of duplications, gaps, and open questions based on the current/partial docs in knowledge/01-inventory.md. Co-Authored-By: Claude Opus 4.8 --- knowledge/02-gap-analysis-draft.md | 330 +++++++++++++++++++++++++++++ 1 file changed, 330 insertions(+) create mode 100644 knowledge/02-gap-analysis-draft.md diff --git a/knowledge/02-gap-analysis-draft.md b/knowledge/02-gap-analysis-draft.md new file mode 100644 index 00000000..3da3dbfa --- /dev/null +++ b/knowledge/02-gap-analysis-draft.md @@ -0,0 +1,330 @@ +# Documentation Gap Analysis (Draft) + +Scope: based on `knowledge/01-inventory.md` and a full read of every doc file +marked **current** or **partial** across the five repos (PandABlocks-FPGA, +PandABlocks-server, PandABlocks-rootfs, PandABlocks.github.io, meta-panda). +Files marked *outdated* were not re-read and are referenced only where a current +page points at them. + +--- + +## Section 1 — Duplications + +Pages (or large sections) that cover the same topic in more than one place. + +1. **Tutorials 1–4 exist in triplicate.** `tutorials/tutorial1_blinking_leds`, + `tutorial2_position_capture`, `tutorial3_position_compare`, + `tutorial4_snake_scan` are present in **PandABlocks-FPGA**, + **PandABlocks.github.io**, and **meta-panda**. Tutorials 3 and 4 are the same + ~40/52-word stub in all three repos (identical wording). Tutorials 1 and 2 + are the same 648/1167-word content in all three. Only the *status* differs + (FPGA's 1 & 2 are marked outdated; github.io and meta-panda are current). + +2. **"Make a release"** — `how-to/make-release.rst` is byte-for-byte identical + in **PandABlocks.github.io** and **meta-panda** (both 97 words). Notably + meta-panda's copy still links to + `github.com/PandABlocks/PandABlocks.github.io/releases` (see Q4). + +3. **"Run in a container"** — `how-to/run-container.rst` is identical in + **PandABlocks.github.io** and **meta-panda** (both 167 words, same REPO_DIR / + VIVADO_DIR / BUILD_DIR volume-mount instructions, same "reistry" typo). + +4. **"Updating a PandA via SSH"** — `how-to/remote.rst` in + **PandABlocks.github.io** (471 w) and **meta-panda** (245 w) cover the same + task (update rootfs, update packages, 24V EEPROM). They diverge on artifact + names and package tooling (zpkg/`boot-x.x.zip` vs opkg/`boot-{MACHINE}.tar.gz`). + The 24V-EEPROM section is duplicated almost verbatim between them. + +5. **"Updating a PandA via web interface"** — `how-to/web-interface.rst` in + **PandABlocks.github.io** (329 w) and **meta-panda** (240 w) duplicate the + same web-admin upgrade procedure, again diverging on zpkg vs opkg artifacts. + +6. **"Getting a PandA on the network" / quickstart** — the `config.txt` + network-configuration block, "Web Interface", and "Web Admin" sections are + duplicated between **PandABlocks-rootfs** `how-to/quickstart.md` (564 w) and + **meta-panda** `how-to/quickstart.rst` (817 w). meta-panda adds an FAQ + section; otherwise the shared content is near-identical. + +7. **Boot process** — the five-stage boot description appears in both + **PandABlocks-rootfs** `how-to/building.md` ("Boot Process" section) and + **meta-panda** `explanations/boot-process.rst`. Same five stages, but rootfs + describes `imagefile.cpio.gz` + SD repartitioning while meta-panda describes a + FIT image + `rootfs.squashfs`. + +8. **Building the image** — two overlapping-but-divergent build guides: + **PandABlocks-rootfs** `how-to/building.md` (Diamond rootfs builder + Xilinx + SDK + `CONFIG` + zpkg) vs **meta-panda** `how-to/build.rst` (kas/Yocto) and + **meta-panda** `tutorials/manual-build.rst` (manual Yocto/bitbake). Three + documents answer "how do I build the PandA image?" with different toolchains. + +9. **Package management** — **PandABlocks-rootfs** `how-to/building.md` + ("Installing zpkg Files" + "zpkg Command") vs **meta-panda** + `how-to/packages.rst` + `reference/opkg.rst`. Same concept (install via USB + admin page or scp+CLI; list/install/remove/show commands), zpkg vs opkg/ipk. + +10. **Capture-mode table** — the pos_out capture options + (No/Value/Diff/Sum/Mean/Min/Max/Min Max/Min Max Mean) appear three times: + **PandABlocks-server** `docs/capture.rst`, **PandABlocks-server** + `docs/fields.rst` (pos_out `CAPTURE` attribute), and **meta-panda** + `tutorials/tutorial2_position_capture.rst`. The three lists do not fully + agree (see Q21). + +11. **Webcontrol "Introduction"** — `webcontrol/index.rst` and + `webcontrol/userguide/index.rst` (both in meta-panda) are byte-for-byte + identical (97 w each). + +12. **Webcontrol "Contents"** — `webcontrol/contents.rst` and + `webcontrol/userguide/contents.rst` (both meta-panda) are byte-for-byte + identical toctree pages. + +13. **pip-skeleton / tooling** — **PandABlocks.github.io** + `how-to/update-tools.rst` and ADR `0002-switched-to-pip-skeleton.rst` both + document the python3-pip-skeleton relationship. + +14. **Version/compatibility** — **PandABlocks.github.io** + `reference/migration_guide.rst` and `reference/release_compatibility.rst` + both address "which versions go together", from different angles. + +15. **Navigation toctree stubs** — every repo carries near-identical empty + section wrappers: `explanations(.rst/.md)`, `how-to(.rst/.md)` / `how.rst`, + `reference(.rst/.md)`, `tutorials(.rst/.md)` / `tutorial.rst`. rootfs, + github.io and meta-panda each have their own set with the same boilerplate. + +--- + +## Section 2 — Apparent gaps + +Topics referenced but never fully documented (in the current/partial set). + +1. **Tutorials 3 & 4 are never written.** Both are intro-paragraph stubs in all + three repos. tutorial2's conclusion explicitly promises "In the next tutorial + we will read about how to use position compare…", but position compare and + snake scan are never delivered. + +2. **`block.rst` placeholder sections.** "Writing docs" ("Two RST directives, + how to structure"), "Block VHDL entity" ("How to structure the VHDL entity"), + and "Tables will be defined here too" / `table` ("Tables are treated + specially") are stubs with no real content. + +3. **rootfs SSH-update guide is missing but linked.** `index.md` and `how-to.md` + in **PandABlocks-rootfs** describe and toctree-include an "Updating a PandA + via SSH" guide (`how-to/remote.md`), but no `remote.md` exists in the rootfs + docs — only `building.md` and `quickstart.md` do. + +4. **Webcontrol attribute-state icons missing.** `understanding_attribute_state.rst` + has `*GET IMAGE*` placeholders for Processing, Update Error, and Disconnected + states, and references a "table above" of icons that is not present on the + page. + +5. **Webcontrol design screenshots missing.** `working_with_a_design.rst` has + several `*GET SCREENSHOT*` / `*GET SCREENHOST*` placeholders (View/Edit, + Dropdown List, Text Input, Checkbox) and an unfinished sentence in the Text + Input section ("shown in the ."). + +6. **Standards undocumented.** github.io `reference/standards.rst` has a "Code + Standards" heading with no body and no "Documentation Standards" section, + despite the intro promising both. + +7. **No API reference.** github.io `reference/genindex.rst` is an empty + placeholder, and rootfs `reference.md` toctrees a `genindex` and "APIs" that + do not exist. No actual API documentation is present anywhere in the set. + +8. **Per-block reference missing from the inventoried set.** Tutorials and + server docs constantly reference PULSE, CLOCK, PCAP, COUNTER, SEQ, TTLOUT, + ADDER, V2F, etc., but the only block listing (FPGA `blocks.rst`) is an + outdated generated artifact, and the `modules/*/*_doc.rst` files are not part + of the inventory. There is no current, authored "what each block does" page. + +9. **V2F block** is referenced (with an external paper link) in tutorial2 but is + never defined or documented. + +10. **Webcontrol install/launch is undocumented.** The webcontrol guide explains + the GUI thoroughly but never says how to install or start the webcontrol / + Malcolm server, nor what host/port to use (quick-start says + `http://{malcolm host}/gui/`, e.g. `localhost:3000`; the network/web-admin + docs imply the PandA's IP on port 80). See Q9. + +11. **Malcolm ↔ webcontrol relationship.** The glossary references `malcolm`, + `pymalcolm`, "MalcolmJS", "Web Control" and "PandABox User Interface" + interchangeably; the relationship between these is never explained. + +12. **Host SDK installer.** `pandablocks-sdk.rst` states "the sdk installer is + also provided to use it in the host directly" but never says where to get it + or how to run it. + +13. **Streaming tables.** server `fields.rst` documents the full `MODE` + transition matrix for streaming tables (`<<`, `<<|`) but no page explains + when or why a client would use streaming vs fixed tables. + +14. **Extension server.** server `config.rst` and FPGA `block.rst` reference the + extension mechanism (`:ref:`extension``, `extension_read`/`extension_write`, + extension `.py` files), but the only explainer (`extension.rst`) is marked + outdated. + +15. **Supported MACHINE values.** Build docs mention `pandabox` (default), + `xu5-s1`, `xu5-st1`, and ZedBoard, but no reference page enumerates the + supported targets or their differences. + +16. **kas image version ↔ firmware version.** `build.rst` sets + `KAS_IMAGE_VERSION="4.8"` with no explanation of how this relates to the + PandA firmware release a user is trying to build. + +17. **EEPROM / 24V FMC tooling.** The `write_eeprom` + `ipmi_definition.ini` + procedure appears in remote.rst but has no broader reference for which cards + need it or how the bitstream-variant selection (IPMI EEPROM) works end to end. + +18. **Pre-2.1 / legacy upgrade path.** github.io web-interface.rst carries a note + about rootfs "< 2.1" needing `imagefile.cpio.gz`; meta-panda's version drops + it. Whether legacy upgrades are still supported, and where that's documented, + is unclear. + +--- + +## Section 3 — Questions for the owner + +Numbered, specific. Cap is 50; there are 34 below. + +1. The rootfs `building.md` describes building via the Diamond rootfs builder + + Xilinx SDK + `CONFIG` + zpkg, while meta-panda `build.rst` describes building + via kas/Yocto producing opkg/ipk packages. Which is the canonical build path + for a new user in 2026, and is `building.md` now obsolete (should it be + retired or marked legacy)? + +2. Package tooling: github.io `remote.rst`/`web-interface.rst` still reference + `panda-*.zpg` and `zpkg install`, while meta-panda `packages.rst`/`opkg.rst` + use `.ipk` and `opkg install`. Which is correct for current firmware, and at + which release did zpkg → opkg happen? + +3. Release artifacts: github.io `remote.rst` says download `boot-x.x.zip` + containing `imagefile.cpio.gz`/`uImage`; meta-panda `remote.rst` says + `boot-{MACHINE}.tar.gz` containing `rootfs.squashfs`/`Image`. What is the + current release artifact name and format? + +4. meta-panda `how-to/make-release.rst` links to + `github.com/PandABlocks/PandABlocks.github.io/releases`. Should this point at + the meta-panda releases page instead (copy-paste leftover)? + +5. Tutorials 1–4 exist in three repos (FPGA, github.io, meta-panda). Which repo + is meant to be the canonical home, and should the other copies be deleted or + replaced with cross-links? + +6. Tutorials 3 (position compare) and 4 (snake scan) are stubs everywhere. Are + these planned to be written, and which repo should host the finished versions? + +7. `webcontrol/index.rst` and `webcontrol/userguide/index.rst` are identical, as + are the two `contents.rst` files. Which is the intended source, and can the + duplicate be removed? + +8. quickstart.rst's FAQ says to write a static network config to a file called + `boot.txt` on the SD card, but the rest of that doc (and rootfs + `quickstart.md`) uses `config.txt` / `panda-config.txt`. Which filename is + correct? (`boot.txt` is mentioned nowhere else.) + +9. The webcontrol `quick-start.rst` says to connect at `http://{malcolm host}/gui/` + e.g. `localhost:3000`, but `quickstart.rst`/`web-interface.rst` say the web + interface is reached at the PandA's IP/hostname (implying port 80). What is + the correct URL and port for reaching the webcontrol GUI on a real PandA in + 2026? + +10. rootfs `index.md` and `how-to.md` describe and toctree-include an "Updating a + PandA via SSH" guide (`how-to/remote.md`), but that file does not exist in + the rootfs docs. Should it be created, or should the references be removed + because the SSH guide now lives only in github.io/meta-panda? + +11. `migration_guide.rst` only covers 2.0 → 3.0, but `web-interface.rst` already + mentions "From PandA v4.0". Are 3.0 → 4.0 (and later) migration notes needed, + and who maintains them? + +12. `release_compatibility.rst` stops at rootfs 3.0 / zpkg 3.0. With v4.x and the + zpkg → opkg switch, what is the current compatibility matrix? + +13. server `building.rst` (CONFIG/make standalone build) vs meta-panda + `pandablocks-sdk.rst` (Yocto SDK cross-compile): is the standalone build of + PandABlocks-server still supported, or is the SDK the only sanctioned path? + +14. `block.rst` has empty placeholder sections "Writing docs", "Block VHDL + entity", and "Tables will be defined here too". Do you have the intended + content, or should these be removed? + +15. `understanding_attribute_state.rst` has `*GET IMAGE*` placeholders + (Processing, Update Error, Disconnected) and references a "table above" that + isn't present. Are the missing icons / table available to drop in? + +16. `working_with_a_design.rst` has several `*GET SCREENSHOT*` placeholders and + an unfinished sentence in the Text Input section. Are the source screenshots + available, and what was the Text Input sentence meant to say? + +17. github.io `standards.rst` has a "Code Standards" heading with no body and no + "Documentation Standards" section. What standards should be documented here, + or should the page be dropped? + +18. FPGA `testing.rst` says the Python tests run "as part of the Travis tests". + Is CI still Travis (vs GitHub Actions), and is this page current? + +19. `pandablocks-sdk.rst` says "the sdk installer is also provided to use it in + the host directly" but gives no instructions. Where is the host installer and + what are the steps to use it? + +20. The `CONFIG` example in `pandablocks-sdk.rst` mixes `KERNEL_DIR=...` (no + spaces) with `PYTHON = python3` (spaces around `=`). Which syntax does the + server Makefile's `CONFIG` actually require? + +21. Capture options disagree across three pages: `capture.rst` lists + No/Value/Diff/Sum/Mean/Min/Max/Min Max/Min Max Mean; `commands.rst` + (`*CAPTURE.OPTIONS?`) lists Value/Diff/Sum/Mean/Min/Max/**StdDev** (no Min Max + combos); `fields.rst` lists the Min Max combos but not Sum or StdDev; + tutorial2 omits StdDev. What is the authoritative list for current firmware? + +22. `capture.rst` states FRAMED RAW mode sustains ~60 MByte/s "when + panda-webcontrol is not installed". Is this figure still accurate for current + hardware/firmware? + +23. `commands.rst` shows `*IDN?` returning `SW: 1.1 … rootfs: PandA 1.1`. Is the + identification string format (and the `rootfs:` field introduced in 1.1) + unchanged in v4.x? + +24. The webcontrol glossary uses `malcolm`, `pymalcolm`, "MalcolmJS", "Web + Control" and "PandABox User Interface" interchangeably. Is the GUI still + MalcolmJS/pymalcolm-based, and should the docs standardise on one name? + +25. meta-panda `index.rst` simply `.. include::`s `../README.rst`. Does the + README hold the intended landing-page content, or should index.rst have its + own introduction? + +26. FPGA `index.rst` routes block authors to `blocks.rst` (outdated, generated) + and `app.rst` (outdated). Are these being regenerated/rewritten, or should + the index point somewhere else? + +27. The 24V FMC EEPROM update is described as "PandA 3.0 requires…". Is it still + required for v4.x installs, and is it a one-time migration step or per-install? + +28. `manual-build.rst` uses Xilinx's internal `gitenterprise.xilinx.com` manifest + on branch `rel-v2023.2`. Is that URL reachable by external users; if not, + what is the public equivalent (and is `rel-v2023.2` still the target branch + in 2026)? + +29. meta-panda `boot-process.rst` describes a FIT image + `rootfs.squashfs` + boot, while rootfs `building.md` describes `imagefile.cpio.gz` + SD-card + repartitioning. Is the cpio.gz/repartition flow fully superseded; should + building.md's "Boot Process" section be retired? + +30. server `config.rst` says config files load from `/opt/share/panda/config_d` + on a PandA. With the move to Yocto/opkg, is that path still correct? + +31. github.io `web-interface.rst` notes that rootfs "< 2.1" needs + `imagefile.cpio.gz`; meta-panda's version drops this note. Are pre-2.1 + upgrades still supported, and where is that documented now? + +32. `cocotb.rst` says "Modules using IP are currently unsupported" by the cocotb + runner. Is that still true, and does it block testing any production blocks + we should flag? + +33. Both `make-release.rst` files instruct maintainers to use PEP440 version + numbers and GitHub "Generate release notes". Given the firmware version + scheme (2.0/3.0/4.0), is PEP440 actually the intended scheme for + meta-panda/firmware releases, or only for the python (github.io) repo? + +34. Is there an intended single "documentation home" across the five repos + (e.g. PandABlocks.github.io aggregating the others), or should each repo's + docs remain standalone? This determines whether the duplications in Section 1 + should be consolidated or deliberately mirrored. From d98099a666d9d122b94e127ff992cb12d6e2f4d4 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Mon, 8 Jun 2026 14:52:27 +0000 Subject: [PATCH 03/49] added plan --- knowledge/00-plan.md | 434 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 434 insertions(+) create mode 100644 knowledge/00-plan.md diff --git a/knowledge/00-plan.md b/knowledge/00-plan.md new file mode 100644 index 00000000..74fdeeab --- /dev/null +++ b/knowledge/00-plan.md @@ -0,0 +1,434 @@ +# PandABlocks Documentation Project — Step by Step Plan + +This document covers all four phases: repo trawl, interview, planning, and output. +Each step specifies which tool to use, which model, and why. + +--- + +## Guiding principles + +**Git is the state store, not the context window.** Every artefact produced in +each phase is committed before moving on. Any session can be resumed cold. + +**Dumb inputs, smart outputs.** Claude reads raw source and produces structured +summaries. Those summaries — not the raw source — are the inputs to every +subsequent phase. Context stays manageable throughout. + +**Phases are independent.** You can pause between any two phases, hand the work +to a colleague, or resume weeks later. Each phase produces a well-defined set of +committed files that the next phase reads. + +--- + +## Phase 1 — Repo trawl (automated reading) + +**Goal:** Produce a structured inventory of everything that currently exists +across all five repos, without you doing any work. + +**Tool:** Claude Code +**Model:** Sonnet 4.6 (fast, cheap — this is mechanical reading, not deep reasoning) +**Why not web:** The repos are on disk. Fetching files via web would be 100× slower +and require you to ferry content manually. + +### What Claude Code does + +1. Finds every `.rst` and `.md` file under `docs/` in each repo. +2. For each file, records: path, word count, last git commit date, and a + two-sentence summary of what the page covers. +3. Identifies any doc pages that reference external URLs or other repo docs + (potential cross-links that will need updating). +4. Writes the results to `meta-panda/knowledge/01-inventory.md` in a structured + table, one section per repo. + +### The prompt you give Claude Code + +``` +Read every .rst and .md file under docs/ in each of these repos: +PandABlocks-FPGA, PandABlocks-server, PandABlocks-rootfs, +PandABlocks.github.io, meta-panda. + +For each file write a row in knowledge/01-inventory.md with: +- repo name +- file path relative to docs/ +- word count +- date of last git commit on this file +- one sentence: what does this page cover? +- one sentence: what audience is it written for? +- flag: does it look outdated, partial, or current? + +Commit when done. +``` + +### Output + +`knowledge/01-inventory.md` — a complete map of what exists. Commit it. + +--- + +## Phase 2 — Repo trawl (gap pre-analysis) + +**Goal:** Have Claude read the inventory and the actual doc content to form a +first-pass view of what is missing, duplicated, or contradictory — before you +are involved at all. + +**Tool:** Claude Code +**Model:** Sonnet 4.6 — see note below +**Why not web:** Still reading files on disk. + +> **Pro plan limitation:** Opus is not available in Claude Code on Pro — it is +> reserved for Max plans. Sonnet 4.6 will do a reasonable job of gap analysis +> for a codebase of this size. If you find it too shallow, run a follow-up pass +> in Claude web (Phase 2b below) where Opus 4.8 is available. + +### What Claude Code does + +1. Reads `01-inventory.md` plus the full content of every doc file flagged as + current or partial (skips ones it already flagged as clearly outdated). +2. Produces `knowledge/02-gap-analysis-draft.md` with three sections: + - **Duplications** — the same content appearing in multiple repos + - **Apparent gaps** — topics mentioned in passing but never given a full page + (e.g. a how-to that says "see the build docs" but those docs don't exist) + - **Questions for the owner** — things Claude cannot determine from the files + alone, numbered Q1, Q2, Q3 etc. This becomes the interview agenda. + +### The prompt you give Claude Code + +``` +Read knowledge/01-inventory.md and the content of every doc file marked +current or partial. Then write knowledge/02-gap-analysis-draft.md with: + +Section 1 — Duplications: list pages that cover the same topic across repos. +Section 2 — Apparent gaps: topics referenced but never fully documented. +Section 3 — Questions for the owner: numbered list of things you cannot +determine from the files. Be specific — not "is this accurate?" but +"the quickstart guide says to run build.sh but the rootfs docs say to use +kas — which is correct for a new user in 2026?". Cap at 30 questions. + +Commit when done. +``` + +### Output + +`knowledge/02-gap-analysis-draft.md` — your interview agenda. Commit it. + +### Optional Phase 2b — deeper gap analysis in Claude web + +If the Sonnet output feels thin, start a new Claude web conversation with Opus 4.8, +paste in `01-inventory.md` and the full content of the most important doc files, +and ask it to deepen the gap analysis. Paste the result back into +`02-gap-analysis-draft.md` and commit. This costs Opus quota but is a single +focused session, not a long interview — it should stay well within one 5-hour window. + +--- + +## Phase 3 — Interview (knowledge elicitation) + +**Goal:** Answer Claude's questions from Phase 2, capture your own knowledge +about what the docs should cover, and produce a durable knowledge base that +survives any crash. + +**Tool:** Claude web (this conversation) +**Model:** Opus 4.8 (the current flagship, available on Pro) +**Why not Claude Code:** This is a conversation, not a coding task. You are doing +significant cognitive work. The web interface is comfortable for long answers, +supports image uploads, works on mobile, and — critically — the conversation +history is preserved in Claude's servers regardless of what happens to your +container or machine. The container is not involved at all. + +> **Usage note:** Each interview session will likely run 20–30 exchanges on Opus +> 4.8 with substantial context. Realistically, one or two heavy sessions per day +> is your ceiling on Pro before the 5-hour window fills. With six sessions (A–F) +> spread across two weeks this is comfortable — but do not try to run two +> sessions back-to-back. Start each session in a fresh conversation, not as a +> continuation of the previous one, to keep context lean. + +### Session structure + +Each session covers one subsystem. Do not try to cover everything in one +conversation. Suggested split: + +| Session | Subsystem | Key files to paste in | +|---|---|---| +| A | Boot process and hardware overview | `02-gap-analysis-draft.md` questions about rootfs and meta-panda | +| B | Server command interface | Questions about PandABlocks-server | +| C | FPGA blocks and firmware | Questions about PandABlocks-FPGA | +| D | Web control and user-facing features | Questions about webcontrol | +| E | Tutorials — scope and accuracy | Cross-cutting questions about the four tutorials | +| F | Audience and scope decisions | Which docs live where, who reads them | + +### How to start each session + +Paste `02-gap-analysis-draft.md` into a new Claude web conversation with this +framing: + +``` +I am rewriting the documentation for the PandABlocks org. Here is a +gap analysis produced by reading the existing docs. This session covers +[subsystem]. Ask me the questions from Section 3 that relate to this +subsystem, one at a time. After each answer, summarise what I said in +2–4 bullet points. At the end of the session, compile all the bullet +points into a single knowledge file I can copy into my repo. +``` + +The "one at a time" instruction prevents Claude from overwhelming you with a +wall of questions. The "summarise after each answer" instruction means that +even if you give a rambling answer, the important information is extracted +cleanly. + +### After each session + +At the end, ask: + +``` +Write the full contents of knowledge/03-[subsystem].md based on +everything we discussed. Format it as structured markdown with clear +headings. Include: what this subsystem does, who the audiences are, +what currently exists, what is missing, and any specific facts I gave +you that aren't in the existing docs. +``` + +Copy the output into `knowledge/03-[subsystem].md` in your repo and commit it. +This is the crash-recovery checkpoint. You lose at most one session's work if +something goes wrong. + +### Output + +`knowledge/03-boot-process.md` +`knowledge/03-server.md` +`knowledge/03-fpga.md` +`knowledge/03-webcontrol.md` +`knowledge/03-tutorials.md` +`knowledge/03-scope-decisions.md` + +All committed to `meta-panda/knowledge/`. + +--- + +## Phase 4 — Planning (doc structure design) + +**Goal:** Decide which documents exist, what they contain, which repo they live +in, and what the MyST-MD structure for each repo looks like. Produce a plan that +can be handed directly to the output phase. + +**Tool:** Claude web +**Model:** Opus 4.8 +**Why not Claude Code:** This is design work, not file work. You want to be able +to push back, ask "what if we merged these two pages", and have a real +conversation. The output is a plan document, not code. + +> **Usage note:** This is likely one or two long sessions. Paste all the +> `knowledge/03-*.md` files in one go at the start — this is a large context +> load, but prompt caching means subsequent turns are much cheaper than the +> first. Start a fresh conversation; do not continue from a Phase 3 session. + +### How to run this session + +Start a new conversation and paste in all the `knowledge/03-*.md` files plus +`02-gap-analysis-draft.md`. Then: + +``` +Based on this knowledge base, design the full documentation structure for the +PandABlocks organisation. Each repo should have its own MyST-MD based doc +structure. Apply Diátaxis strictly: tutorials, how-to guides, explanations, +and reference. Follow the target structure from this GitHub issue [paste +the issue text]. + +For each document produce: +- repo it lives in +- Diátaxis category +- filename +- one-paragraph description of what it covers +- audience (new user / developer / operator) +- whether it can be written from the knowledge base alone, or needs + more input from me + +Output this as knowledge/04-doc-plan.md. +``` + +Review the plan carefully. This is the last moment to change your mind about +scope. When you are happy, copy `04-doc-plan.md` into the repo and commit it. + +### MyST-MD structure in the plan + +Ask Claude to also produce, for each repo, the skeleton `myst.yml` / +`_toc.yml` entries so the output phase has a template to fill, e.g.: + +```yaml +# meta-panda/_toc.yml +format: jb-book +root: index +chapters: + - file: tutorials/tutorial1_blinking_leds + - file: how-to/quickstart + - file: how-to/build + ... +``` + +### Output + +`knowledge/04-doc-plan.md` — full doc inventory with repo assignments +`knowledge/04-toc-meta-panda.yml` +`knowledge/04-toc-fpga.yml` +`knowledge/04-toc-server.yml` + +All committed. + +--- + +## Phase 5 — Output (writing the docs) + +**Goal:** Write each document. Use the knowledge base as the source of truth. +Reference the existing docs only as inspiration, not as copy-paste material. + +**Tool:** Claude Code for file creation and structure; Claude web for any doc +that needs significant back-and-forth with you +**Model:** Opus 4.8 for the first draft of complex docs; Sonnet 4.6 for +mechanical docs (reference tables, toc files, redirect pages) +**Why Claude Code here:** The writing phase is now a defined coding task. Claude +Code reads the plan file, knows exactly what to produce, and can write all the +files, set up the MyST directory structure, and commit as it goes. You review +PRs rather than driving each doc. + +> **Usage note:** Sonnet 4.6 is the right default for Claude Code sessions here. +> Use the `/model opusplan` pattern — plan with Opus, execute with Sonnet — +> for any doc that needs real architectural thinking before writing. Switching +> models mid-session does not clear context, so Sonnet sees everything Opus +> planned. + +### How to run this phase + +One Claude Code session per repo. Each session: + +``` +Read knowledge/04-doc-plan.md and knowledge/04-toc-[repo].yml. +Write all the docs assigned to [repo] into docs/ using MyST markdown. +Use knowledge/03-*.md as your primary source. Where you need content +that isn't in the knowledge base, write a clearly marked placeholder: + + +Create the _toc.yml, index.md, and conf.py for a MyST-MD build. +Commit after writing each document, not at the end. +``` + +The "commit after each document" instruction means a crash loses at most one +document. + +### Docs that need your input during writing + +Some docs — particularly the conceptual explanations and any tutorial that is +being significantly rewritten — will hit TODOs that need answers. Handle these +in Claude web, using the same session format as Phase 3: + +``` +Claude Code has written a draft of [doc] but flagged these TODOs. +[Paste the TODOs]. Answer my questions one at a time, then revise the draft. +``` + +Paste the revised draft back into the file and commit. + +### Output + +All documentation files in their final target repos, committed as draft PRs +for review. + +--- + +## Summary table + +| Phase | Name | Tool | Model | Crash risk | Output | +|---|---|---|---|---|---| +| 1 | Repo trawl — inventory | Claude Code | Sonnet 4.6 | Low — pure file reading | `01-inventory.md` | +| 2 | Repo trawl — gap analysis | Claude Code | Sonnet 4.6 | Low — produces one file | `02-gap-analysis-draft.md` | +| 2b | Gap analysis deepening (optional) | Claude web | Opus 4.8 | None — chat history durable | updated `02-gap-analysis-draft.md` | +| 3 | Interview | Claude web | Opus 4.8 | None — chat history is durable | `03-*.md` per subsystem | +| 4 | Planning | Claude web | Opus 4.8 | None — chat history is durable | `04-doc-plan.md`, toc files | +| 5 | Output | Claude Code | Sonnet 4.6 + Opus 4.8 via `/model opusplan` | Low — commits per document | Final doc files | + +--- + +## Pro plan usage limits and model versions + +### What's available on Pro + +All three current Opus versions (4.6, 4.7, 4.8) are available on Pro in Claude +web. **Opus 4.8 is the right default** — it is the current flagship with the +best reasoning, and costs no more quota than 4.6 or 4.7. There is no reason to +reach for an older Opus version. + +Sonnet 4.6 is the only Sonnet version currently on Pro. No version decision needed. + +**Opus is not available in Claude Code on Pro.** It is reserved for Max plans. +Claude Code on Pro uses Sonnet 4.6 only. Plan accordingly: phases that need +Opus reasoning (gap analysis deepening, planning, complex doc drafts) must happen +in Claude web, not Claude Code. + +### How limits work + +Usage runs on a **5-hour rolling window**, not a daily reset. Approximate ceilings +on Pro: ~45 Opus messages or ~100 Sonnet messages per window. These are for +short, fresh conversations — a long interview session where Claude is re-processing +20 previous exchanges may consume 5–10× the quota of a first message. One or two +heavy Opus sessions per day is a realistic ceiling. + +**The single biggest lever is conversation length.** Every previous message is +resent on every turn. Starting a fresh conversation for each interview session +(rather than continuing one long thread) is the most effective way to preserve +quota. Paste in only what that session needs — not the entire knowledge base. + +### Version-specific tokenizer note + +Opus 4.7 introduced a new tokenizer that encodes text 1.0–1.35× less efficiently +than Opus 4.6. Opus 4.8 uses the same tokenizer as 4.7, so moving from 4.7 to +4.8 has no token cost impact. For this project — mostly short RST/Markdown files +and your own prose — the tokenizer difference is unlikely to materially affect +how many sessions you get per window. + +### If you hit a limit mid-session + +- Switch to Sonnet 4.6 for the remainder of that session (non-reasoning turns + like "write the knowledge file from our discussion" are fine on Sonnet). +- Or end the session, commit what you have, and resume in a new conversation + after the window resets (5 hours from your first message). +- If limits are consistently blocking you by week 1, a one-month upgrade to + Max 5× (£80) removes the constraint entirely. + +--- + +## What lives in `meta-panda/knowledge/` at each checkpoint + +After Phase 1: `01-inventory.md` +After Phase 2: `01-inventory.md`, `02-gap-analysis-draft.md` +After Phase 3: above + `03-boot-process.md`, `03-server.md`, `03-fpga.md`, +`03-webcontrol.md`, `03-tutorials.md`, `03-scope-decisions.md` +After Phase 4: above + `04-doc-plan.md`, `04-toc-*.yml` +After Phase 5: above + all final doc files in their repos + +The `knowledge/` directory is the complete audit trail of the project. Anyone +joining later can read it and understand every decision made. + +--- + +## One thing to do before you start + +Add this to `meta-panda/CLAUDE.md`: + +```markdown +## Doc project status + +Phase 1 — inventory: [ ] +Phase 2 — gap analysis: [ ] +Phase 3 — interviews: + - [ ] Boot process and hardware (Session A) + - [ ] Server command interface (Session B) + - [ ] FPGA blocks and firmware (Session C) + - [ ] Web control (Session D) + - [ ] Tutorials (Session E) + - [ ] Scope decisions (Session F) +Phase 4 — planning: [ ] +Phase 5 — output: [ ] + +To resume any Claude Code session: read this file and knowledge/04-doc-plan.md. +``` + +Tick boxes off as you go. Claude Code reads this at the start of every session +and knows exactly where you are. From b13adffb5f94b68d96a4a722828ae82c9b4e6bb9 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 09:14:17 +0000 Subject: [PATCH 04/49] docs: Stage A scaffold Instantiate the DLS python-copier-template MyST docs skeleton into meta-panda as a one-off scaffold (Stage A, runbook Prompt A). Building, complete-but-empty docs tree; no content conversion yet. - Move the legacy Sphinx/RST tree to docs/_legacy_rst/ (ignored by myst build) so Stage D/E conversion can read the cited sources in-tree; keep docs/images/. - New myst.yml: title/github/logo swapped (PandA logo), meta-panda TOC + page stubs for every v4 target page, Release Notes url kept. - Drop apidoc plugins block, reference/api.{md,json}, tutorials/installation.md, how-to/run-container.md (skeleton Python-only artifacts). - index.md README-include and how-to/contribute CONTRIBUTING-include both resolve; add root README.md and .github/CONTRIBUTING.md. - xref/intersphinx prototype in myst.yml project.references; probe link into the PandABlocks-client Sphinx repo resolves in built output. Other core repos + devcontainer + fastcs kept commented until their docs publish. - docs/PROGRESS.md tracks Stage-A items and per-page status. myst build: green (exit 0, no warnings/errors). Co-Authored-By: Claude Opus 4.8 --- .github/CONTRIBUTING.md | 18 ++++ .gitignore | 3 + README.md | 23 +++++ docs/PROGRESS.md | 76 ++++++++++++++++ docs/{ => _legacy_rst}/_static/css/custom.css | 0 docs/{ => _legacy_rst}/conf.py | 0 docs/{ => _legacy_rst}/explanations.rst | 0 .../explanations/boot-process.rst | 0 docs/{ => _legacy_rst}/how-to.rst | 0 docs/{ => _legacy_rst}/how-to/build.rst | 0 .../{ => _legacy_rst}/how-to/make-release.rst | 0 docs/{ => _legacy_rst}/how-to/packages.rst | 0 .../how-to/pandablocks-sdk.rst | 0 docs/{ => _legacy_rst}/how-to/quickstart.rst | 0 docs/{ => _legacy_rst}/how-to/remote.rst | 0 .../how-to/run-container.rst | 0 .../how-to/web-interface.rst | 0 docs/{ => _legacy_rst}/index.rst | 0 docs/{ => _legacy_rst}/reference.rst | 0 docs/{ => _legacy_rst}/reference/opkg.rst | 0 docs/{ => _legacy_rst}/tutorials.rst | 0 .../tutorials/manual-build.rst | 0 .../tutorials/template_tutorial1_leds.json | 0 .../tutorials/template_tutorial2_pcap.json | 0 .../tutorials/tutorial1_blinking_leds.rst | 0 .../tutorials/tutorial2.timing.ini | 0 .../tutorials/tutorial2_position_capture.rst | 0 .../tutorials/tutorial3_position_compare.rst | 0 .../tutorials/tutorial4_snake_scan.rst | 0 .../webcontrol/_static/theme_overrides.css | 0 .../webcontrol/_templates/layout.html | 0 .../webcontrol/_templates/page.html | 0 .../webcontrol/build_popping_screenshot.js | 0 docs/{ => _legacy_rst}/webcontrol/conf.py | 0 .../{ => _legacy_rst}/webcontrol/contents.rst | 0 .../webcontrol/copy_screenshots_from_e2e.js | 0 docs/{ => _legacy_rst}/webcontrol/index.rst | 0 .../webcontrol/malcolm-logo.ico | Bin .../webcontrol/malcolm-logo.png | Bin .../webcontrol/malcolm-logo.svg | 0 .../webcontrol/requirements.txt | 0 .../webcontrol/userguide/contents.rst | 0 .../webcontrol/userguide/glossary.rst | 0 .../userguide/images/attribute_lifecycle.svg | 0 .../userguide/images/design_context.png | Bin .../userguide/images/disconnected_icon.png | Bin .../userguide/images/error_icon.png | Bin .../userguide/images/information_icon.png | Bin .../userguide/images/locally_edited_icon.png | Bin .../userguide/images/put_process.svg | 0 .../userguide/images/system_context.svg | 0 .../userguide/images/ui_schematic.png | Bin .../userguide/images/warning_icon.png | Bin .../webcontrol/userguide/index.rst | 0 .../userguide/monitoring_attribute_values.rst | 0 .../webcontrol/userguide/quick-start.rst | 0 .../screenshots/PANDA-block-details.png | Bin .../screenshots/PANDA-layout-spread-out.png | Bin .../userguide/screenshots/PANDA-layout.png | Bin .../userguide/screenshots/PANDA-new-link.png | Bin .../userguide/screenshots/attribute_table.png | Bin .../screenshots/attribute_value_table.png | Bin .../screenshots/attribute_view_chart.png | Bin .../userguide/screenshots/block-list.png | Bin .../userguide/screenshots/chart_options.png | Bin .../userguide/screenshots/continuous_plot.png | Bin .../userguide/screenshots/example-ui.png | Bin .../userguide/screenshots/layout-button.png | Bin .../userguide/screenshots/panel_popping.png | Bin .../userguide/screenshots/popping-1.png | Bin .../userguide/screenshots/popping-2.png | Bin .../userguide/screenshots/popping-3.png | Bin .../userguide/screenshots/popping-4.png | Bin .../userguide/screenshots/starting-ui.png | Bin .../screenshots/window_popping_output.svg | 0 .../screenshots/window_popping_template.svg | 0 .../understanding_attribute_state.rst | 0 .../userguide/user_interface_overview.rst | 0 .../userguide/working_with_a_design.rst | 0 docs/explanations.md | 7 ++ docs/explanations/architecture.md | 11 +++ docs/explanations/boot-process.md | 11 +++ docs/explanations/decisions.md | 5 ++ .../0001-record-architecture-decisions.md | 18 ++++ ...0002-switched-to-python-copier-template.md | 28 ++++++ docs/explanations/decisions/COPYME | 19 ++++ docs/explanations/hardware-targets.md | 13 +++ .../understanding-attribute-state.md | 11 +++ docs/explanations/web-control-ui-overview.md | 11 +++ docs/how-to.md | 7 ++ docs/how-to/build.md | 11 +++ docs/how-to/choose-fpga-bitstream.md | 11 +++ docs/how-to/contribute.md | 2 + docs/how-to/integrate-with-a-panda.md | 18 ++++ docs/how-to/make-release.md | 11 +++ docs/how-to/manual-build.md | 11 +++ docs/how-to/monitor-attribute-values.md | 11 +++ docs/how-to/packages.md | 11 +++ docs/how-to/quickstart.md | 11 +++ docs/how-to/save-restore-design.md | 11 +++ docs/how-to/test-firmware-changes.md | 11 +++ docs/how-to/upgrade-via-ssh.md | 11 +++ docs/how-to/upgrade-via-web-admin.md | 11 +++ .../use-web-control-to-set-up-a-panda.md | 11 +++ docs/index.md | 42 +++++++++ docs/myst.yml | 81 ++++++++++++++++++ docs/reference.md | 7 ++ docs/reference/changes.md | 13 +++ docs/reference/glossary.md | 11 +++ docs/reference/machine-targets.md | 11 +++ docs/reference/opkg.md | 11 +++ docs/reference/troubleshooting.md | 11 +++ docs/tutorials.md | 7 ++ .../tutorial0_connecting_to_web_control.md | 11 +++ docs/tutorials/tutorial1_blinking_leds.md | 11 +++ docs/tutorials/tutorial2_position_capture.md | 11 +++ docs/tutorials/tutorial3_position_compare.md | 13 +++ docs/tutorials/tutorial4_snake_scan.md | 13 +++ 118 files changed, 666 insertions(+) create mode 100644 .github/CONTRIBUTING.md create mode 100644 README.md create mode 100644 docs/PROGRESS.md rename docs/{ => _legacy_rst}/_static/css/custom.css (100%) rename docs/{ => _legacy_rst}/conf.py (100%) rename docs/{ => _legacy_rst}/explanations.rst (100%) rename docs/{ => _legacy_rst}/explanations/boot-process.rst (100%) rename docs/{ => _legacy_rst}/how-to.rst (100%) rename docs/{ => _legacy_rst}/how-to/build.rst (100%) rename docs/{ => _legacy_rst}/how-to/make-release.rst (100%) rename docs/{ => _legacy_rst}/how-to/packages.rst (100%) rename docs/{ => _legacy_rst}/how-to/pandablocks-sdk.rst (100%) rename docs/{ => _legacy_rst}/how-to/quickstart.rst (100%) rename docs/{ => _legacy_rst}/how-to/remote.rst (100%) rename docs/{ => _legacy_rst}/how-to/run-container.rst (100%) rename docs/{ => _legacy_rst}/how-to/web-interface.rst (100%) rename docs/{ => _legacy_rst}/index.rst (100%) rename docs/{ => _legacy_rst}/reference.rst (100%) rename docs/{ => _legacy_rst}/reference/opkg.rst (100%) rename docs/{ => _legacy_rst}/tutorials.rst (100%) rename docs/{ => _legacy_rst}/tutorials/manual-build.rst (100%) rename docs/{ => _legacy_rst}/tutorials/template_tutorial1_leds.json (100%) rename docs/{ => _legacy_rst}/tutorials/template_tutorial2_pcap.json (100%) rename docs/{ => _legacy_rst}/tutorials/tutorial1_blinking_leds.rst (100%) rename docs/{ => _legacy_rst}/tutorials/tutorial2.timing.ini (100%) rename docs/{ => _legacy_rst}/tutorials/tutorial2_position_capture.rst (100%) rename docs/{ => _legacy_rst}/tutorials/tutorial3_position_compare.rst (100%) rename docs/{ => _legacy_rst}/tutorials/tutorial4_snake_scan.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/_static/theme_overrides.css (100%) rename docs/{ => _legacy_rst}/webcontrol/_templates/layout.html (100%) rename docs/{ => _legacy_rst}/webcontrol/_templates/page.html (100%) rename docs/{ => _legacy_rst}/webcontrol/build_popping_screenshot.js (100%) rename docs/{ => _legacy_rst}/webcontrol/conf.py (100%) rename docs/{ => _legacy_rst}/webcontrol/contents.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/copy_screenshots_from_e2e.js (100%) rename docs/{ => _legacy_rst}/webcontrol/index.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/malcolm-logo.ico (100%) rename docs/{ => _legacy_rst}/webcontrol/malcolm-logo.png (100%) rename docs/{ => _legacy_rst}/webcontrol/malcolm-logo.svg (100%) rename docs/{ => _legacy_rst}/webcontrol/requirements.txt (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/contents.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/glossary.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/attribute_lifecycle.svg (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/design_context.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/disconnected_icon.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/error_icon.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/information_icon.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/locally_edited_icon.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/put_process.svg (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/system_context.svg (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/ui_schematic.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/images/warning_icon.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/index.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/monitoring_attribute_values.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/quick-start.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/PANDA-block-details.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/PANDA-layout-spread-out.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/PANDA-layout.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/PANDA-new-link.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/attribute_table.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/attribute_value_table.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/attribute_view_chart.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/block-list.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/chart_options.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/continuous_plot.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/example-ui.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/layout-button.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/panel_popping.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/popping-1.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/popping-2.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/popping-3.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/popping-4.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/starting-ui.png (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/window_popping_output.svg (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/screenshots/window_popping_template.svg (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/understanding_attribute_state.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/user_interface_overview.rst (100%) rename docs/{ => _legacy_rst}/webcontrol/userguide/working_with_a_design.rst (100%) create mode 100644 docs/explanations.md create mode 100644 docs/explanations/architecture.md create mode 100644 docs/explanations/boot-process.md create mode 100644 docs/explanations/decisions.md create mode 100644 docs/explanations/decisions/0001-record-architecture-decisions.md create mode 100644 docs/explanations/decisions/0002-switched-to-python-copier-template.md create mode 100644 docs/explanations/decisions/COPYME create mode 100644 docs/explanations/hardware-targets.md create mode 100644 docs/explanations/understanding-attribute-state.md create mode 100644 docs/explanations/web-control-ui-overview.md create mode 100644 docs/how-to.md create mode 100644 docs/how-to/build.md create mode 100644 docs/how-to/choose-fpga-bitstream.md create mode 100644 docs/how-to/contribute.md create mode 100644 docs/how-to/integrate-with-a-panda.md create mode 100644 docs/how-to/make-release.md create mode 100644 docs/how-to/manual-build.md create mode 100644 docs/how-to/monitor-attribute-values.md create mode 100644 docs/how-to/packages.md create mode 100644 docs/how-to/quickstart.md create mode 100644 docs/how-to/save-restore-design.md create mode 100644 docs/how-to/test-firmware-changes.md create mode 100644 docs/how-to/upgrade-via-ssh.md create mode 100644 docs/how-to/upgrade-via-web-admin.md create mode 100644 docs/how-to/use-web-control-to-set-up-a-panda.md create mode 100644 docs/index.md create mode 100644 docs/myst.yml create mode 100644 docs/reference.md create mode 100644 docs/reference/changes.md create mode 100644 docs/reference/glossary.md create mode 100644 docs/reference/machine-targets.md create mode 100644 docs/reference/opkg.md create mode 100644 docs/reference/troubleshooting.md create mode 100644 docs/tutorials.md create mode 100644 docs/tutorials/tutorial0_connecting_to_web_control.md create mode 100644 docs/tutorials/tutorial1_blinking_leds.md create mode 100644 docs/tutorials/tutorial2_position_capture.md create mode 100644 docs/tutorials/tutorial3_position_compare.md create mode 100644 docs/tutorials/tutorial4_snake_scan.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..3a0cec24 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Contributions and issues are most welcome! All issues and pull requests are handled +through [GitHub](https://github.com/PandABlocks/meta-panda/issues). Please check for any +existing issues before filing a new one. + +## Issue or Pull Request? + +Raise an issue if you want to report a bug or request a feature. Open a pull request if +you already have a change ready to propose. If you are unsure, raise an issue first to +discuss the change. + +## Documentation + +Documentation is built with [MyST](https://mystmd.org) and published to GitHub Pages. +The docs follow the [Diátaxis](https://diataxis.fr) framework — tutorials, how-to +guides, reference and explanations. See `how-to/contribute` for the documentation +authoring conventions and the cross-repository link setup. diff --git a/.gitignore b/.gitignore index 640d2a27..1e894b86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ build/ sources/ + +# MyST build output +docs/_build/ diff --git a/README.md b/README.md new file mode 100644 index 00000000..bb0071e0 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# meta-panda + +The `meta-panda` layer contains the Yocto recipes and configuration for building the +Linux system that runs on a PandA. + +- Machines provided: `pandabox`, `pandabox2`, `pandabrick` +- Distro provided: `panda-petalinux` +- Image provided: `panda-image` + +The Linux system brings up the network from a `config.txt` file on the SD card, runs an +SSH server for debugging access, programs the FPGA and runs services such as the TCP +server and Web Control, and serves a Web Admin interface on port 80 for installing and +removing packages and adding SSH keys. + + + +## Where to find things + +| | | +|---|---| +| Source code | | +| Documentation | | +| Releases | | diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md new file mode 100644 index 00000000..8bc02aaa --- /dev/null +++ b/docs/PROGRESS.md @@ -0,0 +1,76 @@ +# Docs Rewrite Progress — meta-panda + +Tracks every target page for this repo. Update the relevant line **in the same commit** as the file +it refers to. Statuses: ☐ todo · ◐ stub · ✅ converted · 🔍 needs-review · ⛔ blocked (→ issue #). +Page list expanded from `06-source-provenance-map.md`. + +## Stage A — scaffold +- ✅ skeleton instantiated (title/github/logo swapped, apidoc + pip-tutorial + run-container removed) +- ✅ TOC + stubs for every target page present (33 stubs + 4 landing + index + decisions) +- ✅ `index.md` README-include + `how-to/contribute` CONTRIBUTING-include resolve +- ✅ xref/intersphinx wired + cross-link probe resolves in built output +- ☐ (FPGA only) — N/A for meta-panda +- ✅ `myst build` green (exit 0, no warnings/errors) +- ☐ Pages deploy green — existing `.github/workflows/docs.yml` still builds Sphinx; needs switch to `myst build` (see Notes) + +## Tutorials +- ◐ tutorials/tutorial0_connecting_to_web_control — source: webcontrol/userguide/quick-start.rst — writable-now +- ◐ tutorials/tutorial1_blinking_leds — source: tutorials/tutorial1_blinking_leds.rst — writable-now +- ◐ tutorials/tutorial2_position_capture — source: tutorials/tutorial2_position_capture.rst — writable-now +- ⛔ tutorials/tutorial3_position_compare — source: tutorials/tutorial3_position_compare.rst (stub) — blocked: capture +- ⛔ tutorials/tutorial4_snake_scan — source: tutorials/tutorial4_snake_scan.rst (stub) — blocked: capture + +## How-to +- ◐ how-to/quickstart — source: how-to/quickstart.rst + rootfs quickstart.md — writable-now +- ◐ how-to/build — source: how-to/build.rst + run-container.rst (KAS) — writable-now (KAS_IMAGE_VERSION = verify) +- ◐ how-to/manual-build — source: tutorials/manual-build.rst — writable-now (post-5.0 branch = verify) +- ◐ how-to/make-release — source: how-to/make-release.rst — writable-now +- ◐ how-to/packages — source: how-to/packages.rst — writable-now +- ◐ how-to/upgrade-via-ssh — source: how-to/remote.rst — writable-now (gap audit = verify) +- ◐ how-to/upgrade-via-web-admin — source: how-to/web-interface.rst — partial (zpg filename = verify) +- ◐ how-to/use-web-control-to-set-up-a-panda — source: webcontrol/userguide/working_with_a_design.rst — writable-now (widget screenshots = capture) [Prompt E] +- ◐ how-to/save-restore-design — source: working_with_a_design.rst (Saving/Opening) — writable-now [Prompt E split] +- ◐ how-to/monitor-attribute-values — source: webcontrol/userguide/monitoring_attribute_values.rst — writable-now +- ◐ how-to/integrate-with-a-panda — source: NEW (Interview5; client + fastcs) — writable-now (skeleton). Holds the Stage A xref probe. +- ◐ how-to/test-firmware-changes — source: NEW (Interview5 §1-2) — writable-now +- ◐ how-to/choose-fpga-bitstream — source: NEW (Interview5 §10; Interview3 §4) — writable-now +- ✅ how-to/contribute — source: `{include} .github/CONTRIBUTING.md` — scaffold include resolves (content merge later) + +## Reference +- ◐ reference/opkg — source: reference/opkg.rst — writable-now +- ⛔ reference/changes — source: github.io migration_guide.rst + release_compatibility.rst — blocked: verify (3.0->4.0) +- ◐ reference/machine-targets — source: NEW (Interview6 §A) — partial (PandABrick = verify) +- ◐ reference/glossary — source: webcontrol glossary.rst + FPGA glossary.rst — writable-now (canonical merge) +- ◐ reference/troubleshooting — source: quickstart.rst FAQ (7 Qs) — writable-now (seed) + +## Explanations +- ◐ explanations/boot-process — source: explanations/boot-process.rst — writable-now +- ◐ explanations/architecture — source: NEW (Interview1) — writable-now (skeleton) +- ⛔ explanations/hardware-targets — source: NEW (Interview6 §A) — blocked: author +- ◐ explanations/web-control-ui-overview — source: webcontrol/userguide/user_interface_overview.rst — writable-now +- ◐ explanations/understanding-attribute-state — source: webcontrol/userguide/understanding_attribute_state.rst — writable-now (8 icons via Prompt C) +- ✅ explanations/decisions + decisions/0001,0002,COPYME — kept byte-for-byte from skeleton (ADR migration of 0002-switched-to-pip-skeleton is a later `move` task) + +## Blocked (issues raised) +Issues not yet created — Stage B (Prompt B) will create and link them. Blocked pages: +- ⛔ tutorials/tutorial3_position_compare — issue #TBD — human-capture +- ⛔ tutorials/tutorial4_snake_scan — issue #TBD — human-capture +- ⛔ reference/changes — issue #TBD — verify (3.0->4.0) +- ⛔ explanations/hardware-targets — issue #TBD — author +- ⛔ how-to/use-web-control-to-set-up-a-panda (4 widget screenshots + trailing sentence) — issue #TBD — capture + +## Notes +- **Legacy sources preserved.** The original Sphinx/RST tree was moved to `docs/_legacy_rst/` + (not in the TOC, ignored by `myst build`) so Stage D/E conversion can read the cited source + files in-tree at their `06` paths (under `docs/_legacy_rst/...`). They also remain on + `origin/main` / `origin/rel-v2023.2`. Screenshots stay reusable in place there; tutorial + screenshots also live at `docs/images/`. Delete `_legacy_rst/` once conversion is complete. +- **Logo / icon swap** already done upstream in the skeleton: `images/PandA-logo-for-black-background.svg`. +- **xref/intersphinx prototype.** `myst.yml project.references` currently activates only + `PandABlocks-client` (deployed). The probe link in `how-to/integrate-with-a-panda` resolves in + built output to `.../PandABlocks-client/main/reference/api.html#pandablocks.blocking.blockingclient`. + The other core repos + devcontainer + fastcs are kept commented (their docs aren't published yet); + uncomment in Stage F and upstream the block into python-copier-template. +- **Pages workflow.** `.github/workflows/docs.yml` still runs `python3 -m sphinx`. It must be switched + to `myst build` for the new docs to deploy (Stage A spec §8). Left for a follow-up so this scaffold + PR stays docs-only; flagged here and in the PR. diff --git a/docs/_static/css/custom.css b/docs/_legacy_rst/_static/css/custom.css similarity index 100% rename from docs/_static/css/custom.css rename to docs/_legacy_rst/_static/css/custom.css diff --git a/docs/conf.py b/docs/_legacy_rst/conf.py similarity index 100% rename from docs/conf.py rename to docs/_legacy_rst/conf.py diff --git a/docs/explanations.rst b/docs/_legacy_rst/explanations.rst similarity index 100% rename from docs/explanations.rst rename to docs/_legacy_rst/explanations.rst diff --git a/docs/explanations/boot-process.rst b/docs/_legacy_rst/explanations/boot-process.rst similarity index 100% rename from docs/explanations/boot-process.rst rename to docs/_legacy_rst/explanations/boot-process.rst diff --git a/docs/how-to.rst b/docs/_legacy_rst/how-to.rst similarity index 100% rename from docs/how-to.rst rename to docs/_legacy_rst/how-to.rst diff --git a/docs/how-to/build.rst b/docs/_legacy_rst/how-to/build.rst similarity index 100% rename from docs/how-to/build.rst rename to docs/_legacy_rst/how-to/build.rst diff --git a/docs/how-to/make-release.rst b/docs/_legacy_rst/how-to/make-release.rst similarity index 100% rename from docs/how-to/make-release.rst rename to docs/_legacy_rst/how-to/make-release.rst diff --git a/docs/how-to/packages.rst b/docs/_legacy_rst/how-to/packages.rst similarity index 100% rename from docs/how-to/packages.rst rename to docs/_legacy_rst/how-to/packages.rst diff --git a/docs/how-to/pandablocks-sdk.rst b/docs/_legacy_rst/how-to/pandablocks-sdk.rst similarity index 100% rename from docs/how-to/pandablocks-sdk.rst rename to docs/_legacy_rst/how-to/pandablocks-sdk.rst diff --git a/docs/how-to/quickstart.rst b/docs/_legacy_rst/how-to/quickstart.rst similarity index 100% rename from docs/how-to/quickstart.rst rename to docs/_legacy_rst/how-to/quickstart.rst diff --git a/docs/how-to/remote.rst b/docs/_legacy_rst/how-to/remote.rst similarity index 100% rename from docs/how-to/remote.rst rename to docs/_legacy_rst/how-to/remote.rst diff --git a/docs/how-to/run-container.rst b/docs/_legacy_rst/how-to/run-container.rst similarity index 100% rename from docs/how-to/run-container.rst rename to docs/_legacy_rst/how-to/run-container.rst diff --git a/docs/how-to/web-interface.rst b/docs/_legacy_rst/how-to/web-interface.rst similarity index 100% rename from docs/how-to/web-interface.rst rename to docs/_legacy_rst/how-to/web-interface.rst diff --git a/docs/index.rst b/docs/_legacy_rst/index.rst similarity index 100% rename from docs/index.rst rename to docs/_legacy_rst/index.rst diff --git a/docs/reference.rst b/docs/_legacy_rst/reference.rst similarity index 100% rename from docs/reference.rst rename to docs/_legacy_rst/reference.rst diff --git a/docs/reference/opkg.rst b/docs/_legacy_rst/reference/opkg.rst similarity index 100% rename from docs/reference/opkg.rst rename to docs/_legacy_rst/reference/opkg.rst diff --git a/docs/tutorials.rst b/docs/_legacy_rst/tutorials.rst similarity index 100% rename from docs/tutorials.rst rename to docs/_legacy_rst/tutorials.rst diff --git a/docs/tutorials/manual-build.rst b/docs/_legacy_rst/tutorials/manual-build.rst similarity index 100% rename from docs/tutorials/manual-build.rst rename to docs/_legacy_rst/tutorials/manual-build.rst diff --git a/docs/tutorials/template_tutorial1_leds.json b/docs/_legacy_rst/tutorials/template_tutorial1_leds.json similarity index 100% rename from docs/tutorials/template_tutorial1_leds.json rename to docs/_legacy_rst/tutorials/template_tutorial1_leds.json diff --git a/docs/tutorials/template_tutorial2_pcap.json b/docs/_legacy_rst/tutorials/template_tutorial2_pcap.json similarity index 100% rename from docs/tutorials/template_tutorial2_pcap.json rename to docs/_legacy_rst/tutorials/template_tutorial2_pcap.json diff --git a/docs/tutorials/tutorial1_blinking_leds.rst b/docs/_legacy_rst/tutorials/tutorial1_blinking_leds.rst similarity index 100% rename from docs/tutorials/tutorial1_blinking_leds.rst rename to docs/_legacy_rst/tutorials/tutorial1_blinking_leds.rst diff --git a/docs/tutorials/tutorial2.timing.ini b/docs/_legacy_rst/tutorials/tutorial2.timing.ini similarity index 100% rename from docs/tutorials/tutorial2.timing.ini rename to docs/_legacy_rst/tutorials/tutorial2.timing.ini diff --git a/docs/tutorials/tutorial2_position_capture.rst b/docs/_legacy_rst/tutorials/tutorial2_position_capture.rst similarity index 100% rename from docs/tutorials/tutorial2_position_capture.rst rename to docs/_legacy_rst/tutorials/tutorial2_position_capture.rst diff --git a/docs/tutorials/tutorial3_position_compare.rst b/docs/_legacy_rst/tutorials/tutorial3_position_compare.rst similarity index 100% rename from docs/tutorials/tutorial3_position_compare.rst rename to docs/_legacy_rst/tutorials/tutorial3_position_compare.rst diff --git a/docs/tutorials/tutorial4_snake_scan.rst b/docs/_legacy_rst/tutorials/tutorial4_snake_scan.rst similarity index 100% rename from docs/tutorials/tutorial4_snake_scan.rst rename to docs/_legacy_rst/tutorials/tutorial4_snake_scan.rst diff --git a/docs/webcontrol/_static/theme_overrides.css b/docs/_legacy_rst/webcontrol/_static/theme_overrides.css similarity index 100% rename from docs/webcontrol/_static/theme_overrides.css rename to docs/_legacy_rst/webcontrol/_static/theme_overrides.css diff --git a/docs/webcontrol/_templates/layout.html b/docs/_legacy_rst/webcontrol/_templates/layout.html similarity index 100% rename from docs/webcontrol/_templates/layout.html rename to docs/_legacy_rst/webcontrol/_templates/layout.html diff --git a/docs/webcontrol/_templates/page.html b/docs/_legacy_rst/webcontrol/_templates/page.html similarity index 100% rename from docs/webcontrol/_templates/page.html rename to docs/_legacy_rst/webcontrol/_templates/page.html diff --git a/docs/webcontrol/build_popping_screenshot.js b/docs/_legacy_rst/webcontrol/build_popping_screenshot.js similarity index 100% rename from docs/webcontrol/build_popping_screenshot.js rename to docs/_legacy_rst/webcontrol/build_popping_screenshot.js diff --git a/docs/webcontrol/conf.py b/docs/_legacy_rst/webcontrol/conf.py similarity index 100% rename from docs/webcontrol/conf.py rename to docs/_legacy_rst/webcontrol/conf.py diff --git a/docs/webcontrol/contents.rst b/docs/_legacy_rst/webcontrol/contents.rst similarity index 100% rename from docs/webcontrol/contents.rst rename to docs/_legacy_rst/webcontrol/contents.rst diff --git a/docs/webcontrol/copy_screenshots_from_e2e.js b/docs/_legacy_rst/webcontrol/copy_screenshots_from_e2e.js similarity index 100% rename from docs/webcontrol/copy_screenshots_from_e2e.js rename to docs/_legacy_rst/webcontrol/copy_screenshots_from_e2e.js diff --git a/docs/webcontrol/index.rst b/docs/_legacy_rst/webcontrol/index.rst similarity index 100% rename from docs/webcontrol/index.rst rename to docs/_legacy_rst/webcontrol/index.rst diff --git a/docs/webcontrol/malcolm-logo.ico b/docs/_legacy_rst/webcontrol/malcolm-logo.ico similarity index 100% rename from docs/webcontrol/malcolm-logo.ico rename to docs/_legacy_rst/webcontrol/malcolm-logo.ico diff --git a/docs/webcontrol/malcolm-logo.png b/docs/_legacy_rst/webcontrol/malcolm-logo.png similarity index 100% rename from docs/webcontrol/malcolm-logo.png rename to docs/_legacy_rst/webcontrol/malcolm-logo.png diff --git a/docs/webcontrol/malcolm-logo.svg b/docs/_legacy_rst/webcontrol/malcolm-logo.svg similarity index 100% rename from docs/webcontrol/malcolm-logo.svg rename to docs/_legacy_rst/webcontrol/malcolm-logo.svg diff --git a/docs/webcontrol/requirements.txt b/docs/_legacy_rst/webcontrol/requirements.txt similarity index 100% rename from docs/webcontrol/requirements.txt rename to docs/_legacy_rst/webcontrol/requirements.txt diff --git a/docs/webcontrol/userguide/contents.rst b/docs/_legacy_rst/webcontrol/userguide/contents.rst similarity index 100% rename from docs/webcontrol/userguide/contents.rst rename to docs/_legacy_rst/webcontrol/userguide/contents.rst diff --git a/docs/webcontrol/userguide/glossary.rst b/docs/_legacy_rst/webcontrol/userguide/glossary.rst similarity index 100% rename from docs/webcontrol/userguide/glossary.rst rename to docs/_legacy_rst/webcontrol/userguide/glossary.rst diff --git a/docs/webcontrol/userguide/images/attribute_lifecycle.svg b/docs/_legacy_rst/webcontrol/userguide/images/attribute_lifecycle.svg similarity index 100% rename from docs/webcontrol/userguide/images/attribute_lifecycle.svg rename to docs/_legacy_rst/webcontrol/userguide/images/attribute_lifecycle.svg diff --git a/docs/webcontrol/userguide/images/design_context.png b/docs/_legacy_rst/webcontrol/userguide/images/design_context.png similarity index 100% rename from docs/webcontrol/userguide/images/design_context.png rename to docs/_legacy_rst/webcontrol/userguide/images/design_context.png diff --git a/docs/webcontrol/userguide/images/disconnected_icon.png b/docs/_legacy_rst/webcontrol/userguide/images/disconnected_icon.png similarity index 100% rename from docs/webcontrol/userguide/images/disconnected_icon.png rename to docs/_legacy_rst/webcontrol/userguide/images/disconnected_icon.png diff --git a/docs/webcontrol/userguide/images/error_icon.png b/docs/_legacy_rst/webcontrol/userguide/images/error_icon.png similarity index 100% rename from docs/webcontrol/userguide/images/error_icon.png rename to docs/_legacy_rst/webcontrol/userguide/images/error_icon.png diff --git a/docs/webcontrol/userguide/images/information_icon.png b/docs/_legacy_rst/webcontrol/userguide/images/information_icon.png similarity index 100% rename from docs/webcontrol/userguide/images/information_icon.png rename to docs/_legacy_rst/webcontrol/userguide/images/information_icon.png diff --git a/docs/webcontrol/userguide/images/locally_edited_icon.png b/docs/_legacy_rst/webcontrol/userguide/images/locally_edited_icon.png similarity index 100% rename from docs/webcontrol/userguide/images/locally_edited_icon.png rename to docs/_legacy_rst/webcontrol/userguide/images/locally_edited_icon.png diff --git a/docs/webcontrol/userguide/images/put_process.svg b/docs/_legacy_rst/webcontrol/userguide/images/put_process.svg similarity index 100% rename from docs/webcontrol/userguide/images/put_process.svg rename to docs/_legacy_rst/webcontrol/userguide/images/put_process.svg diff --git a/docs/webcontrol/userguide/images/system_context.svg b/docs/_legacy_rst/webcontrol/userguide/images/system_context.svg similarity index 100% rename from docs/webcontrol/userguide/images/system_context.svg rename to docs/_legacy_rst/webcontrol/userguide/images/system_context.svg diff --git a/docs/webcontrol/userguide/images/ui_schematic.png b/docs/_legacy_rst/webcontrol/userguide/images/ui_schematic.png similarity index 100% rename from docs/webcontrol/userguide/images/ui_schematic.png rename to docs/_legacy_rst/webcontrol/userguide/images/ui_schematic.png diff --git a/docs/webcontrol/userguide/images/warning_icon.png b/docs/_legacy_rst/webcontrol/userguide/images/warning_icon.png similarity index 100% rename from docs/webcontrol/userguide/images/warning_icon.png rename to docs/_legacy_rst/webcontrol/userguide/images/warning_icon.png diff --git a/docs/webcontrol/userguide/index.rst b/docs/_legacy_rst/webcontrol/userguide/index.rst similarity index 100% rename from docs/webcontrol/userguide/index.rst rename to docs/_legacy_rst/webcontrol/userguide/index.rst diff --git a/docs/webcontrol/userguide/monitoring_attribute_values.rst b/docs/_legacy_rst/webcontrol/userguide/monitoring_attribute_values.rst similarity index 100% rename from docs/webcontrol/userguide/monitoring_attribute_values.rst rename to docs/_legacy_rst/webcontrol/userguide/monitoring_attribute_values.rst diff --git a/docs/webcontrol/userguide/quick-start.rst b/docs/_legacy_rst/webcontrol/userguide/quick-start.rst similarity index 100% rename from docs/webcontrol/userguide/quick-start.rst rename to docs/_legacy_rst/webcontrol/userguide/quick-start.rst diff --git a/docs/webcontrol/userguide/screenshots/PANDA-block-details.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/PANDA-block-details.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/PANDA-block-details.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/PANDA-block-details.png diff --git a/docs/webcontrol/userguide/screenshots/PANDA-layout-spread-out.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout-spread-out.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/PANDA-layout-spread-out.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout-spread-out.png diff --git a/docs/webcontrol/userguide/screenshots/PANDA-layout.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/PANDA-layout.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout.png diff --git a/docs/webcontrol/userguide/screenshots/PANDA-new-link.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/PANDA-new-link.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/PANDA-new-link.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/PANDA-new-link.png diff --git a/docs/webcontrol/userguide/screenshots/attribute_table.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/attribute_table.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/attribute_table.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/attribute_table.png diff --git a/docs/webcontrol/userguide/screenshots/attribute_value_table.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/attribute_value_table.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/attribute_value_table.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/attribute_value_table.png diff --git a/docs/webcontrol/userguide/screenshots/attribute_view_chart.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/attribute_view_chart.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/attribute_view_chart.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/attribute_view_chart.png diff --git a/docs/webcontrol/userguide/screenshots/block-list.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/block-list.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/block-list.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/block-list.png diff --git a/docs/webcontrol/userguide/screenshots/chart_options.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/chart_options.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/chart_options.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/chart_options.png diff --git a/docs/webcontrol/userguide/screenshots/continuous_plot.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/continuous_plot.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/continuous_plot.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/continuous_plot.png diff --git a/docs/webcontrol/userguide/screenshots/example-ui.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/example-ui.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/example-ui.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/example-ui.png diff --git a/docs/webcontrol/userguide/screenshots/layout-button.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/layout-button.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/layout-button.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/layout-button.png diff --git a/docs/webcontrol/userguide/screenshots/panel_popping.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/panel_popping.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/panel_popping.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/panel_popping.png diff --git a/docs/webcontrol/userguide/screenshots/popping-1.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/popping-1.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/popping-1.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/popping-1.png diff --git a/docs/webcontrol/userguide/screenshots/popping-2.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/popping-2.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/popping-2.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/popping-2.png diff --git a/docs/webcontrol/userguide/screenshots/popping-3.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/popping-3.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/popping-3.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/popping-3.png diff --git a/docs/webcontrol/userguide/screenshots/popping-4.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/popping-4.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/popping-4.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/popping-4.png diff --git a/docs/webcontrol/userguide/screenshots/starting-ui.png b/docs/_legacy_rst/webcontrol/userguide/screenshots/starting-ui.png similarity index 100% rename from docs/webcontrol/userguide/screenshots/starting-ui.png rename to docs/_legacy_rst/webcontrol/userguide/screenshots/starting-ui.png diff --git a/docs/webcontrol/userguide/screenshots/window_popping_output.svg b/docs/_legacy_rst/webcontrol/userguide/screenshots/window_popping_output.svg similarity index 100% rename from docs/webcontrol/userguide/screenshots/window_popping_output.svg rename to docs/_legacy_rst/webcontrol/userguide/screenshots/window_popping_output.svg diff --git a/docs/webcontrol/userguide/screenshots/window_popping_template.svg b/docs/_legacy_rst/webcontrol/userguide/screenshots/window_popping_template.svg similarity index 100% rename from docs/webcontrol/userguide/screenshots/window_popping_template.svg rename to docs/_legacy_rst/webcontrol/userguide/screenshots/window_popping_template.svg diff --git a/docs/webcontrol/userguide/understanding_attribute_state.rst b/docs/_legacy_rst/webcontrol/userguide/understanding_attribute_state.rst similarity index 100% rename from docs/webcontrol/userguide/understanding_attribute_state.rst rename to docs/_legacy_rst/webcontrol/userguide/understanding_attribute_state.rst diff --git a/docs/webcontrol/userguide/user_interface_overview.rst b/docs/_legacy_rst/webcontrol/userguide/user_interface_overview.rst similarity index 100% rename from docs/webcontrol/userguide/user_interface_overview.rst rename to docs/_legacy_rst/webcontrol/userguide/user_interface_overview.rst diff --git a/docs/webcontrol/userguide/working_with_a_design.rst b/docs/_legacy_rst/webcontrol/userguide/working_with_a_design.rst similarity index 100% rename from docs/webcontrol/userguide/working_with_a_design.rst rename to docs/_legacy_rst/webcontrol/userguide/working_with_a_design.rst diff --git a/docs/explanations.md b/docs/explanations.md new file mode 100644 index 00000000..a1dca5ac --- /dev/null +++ b/docs/explanations.md @@ -0,0 +1,7 @@ +# Explanations + +Explanations of how it works and why it works that way. + +```{toc} +:context: children +``` diff --git a/docs/explanations/architecture.md b/docs/explanations/architecture.md new file mode 100644 index 00000000..1bbbb470 --- /dev/null +++ b/docs/explanations/architecture.md @@ -0,0 +1,11 @@ +# Architecture + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now (skeleton; detail deferrable) + +**Source:** NEW (Interview1; client + fastcs repos) — points out integration options (TCP / Python client / EPICS+Tango) +::: diff --git a/docs/explanations/boot-process.md b/docs/explanations/boot-process.md new file mode 100644 index 00000000..4b43b41f --- /dev/null +++ b/docs/explanations/boot-process.md @@ -0,0 +1,11 @@ +# The boot process + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** explanations/boot-process.rst +::: diff --git a/docs/explanations/decisions.md b/docs/explanations/decisions.md new file mode 100644 index 00000000..44e42668 --- /dev/null +++ b/docs/explanations/decisions.md @@ -0,0 +1,5 @@ +# Architectural Decision Records + +Architectural decisions are made throughout a project's lifetime. As a way of keeping track of these decisions, we record these decisions in Architecture Decision Records (ADRs) listed below. + +For more information on ADRs see this [blog by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions). diff --git a/docs/explanations/decisions/0001-record-architecture-decisions.md b/docs/explanations/decisions/0001-record-architecture-decisions.md new file mode 100644 index 00000000..44d234ef --- /dev/null +++ b/docs/explanations/decisions/0001-record-architecture-decisions.md @@ -0,0 +1,18 @@ +# 1. Record architecture decisions + +## Status + +Accepted + +## Context + +We need to record the architectural decisions made on this project. + +## Decision + +We will use Architecture Decision Records, as [described by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions). + +## Consequences + +See Michael Nygard's article, linked above. To create new ADRs we will copy and +paste from existing ones. diff --git a/docs/explanations/decisions/0002-switched-to-python-copier-template.md b/docs/explanations/decisions/0002-switched-to-python-copier-template.md new file mode 100644 index 00000000..66fe5d8b --- /dev/null +++ b/docs/explanations/decisions/0002-switched-to-python-copier-template.md @@ -0,0 +1,28 @@ +# 2. Adopt python-copier-template for project structure + +## Status + +Accepted + +## Context + +We should use the following [python-copier-template](https://github.com/DiamondLightSource/python-copier-template). +The template will ensure consistency in developer +environments and package management. + +## Decision + +We have switched to using the template. + +## Consequences + +This module will use a fixed set of tools as developed in `python-copier-template` +and can pull from this template to update the packaging to the latest techniques. + +As such, the developer environment may have changed, the following could be +different: + +- linting +- formatting +- pip venv setup +- CI/CD diff --git a/docs/explanations/decisions/COPYME b/docs/explanations/decisions/COPYME new file mode 100644 index 00000000..b466c792 --- /dev/null +++ b/docs/explanations/decisions/COPYME @@ -0,0 +1,19 @@ +# 3. Short descriptive title + +Date: Today's date + +## Status + +Accepted + +## Context + +Background to allow us to make the decision, to show how we arrived at our conclusions. + +## Decision + +What decision we made. + +## Consequences + +What we will do as a result of this decision. diff --git a/docs/explanations/hardware-targets.md b/docs/explanations/hardware-targets.md new file mode 100644 index 00000000..5c71f1f9 --- /dev/null +++ b/docs/explanations/hardware-targets.md @@ -0,0 +1,13 @@ +# Hardware targets + +:::{admonition} 🚧 TODO — documentation stub +:class: warning + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** blocked: author + +**Source:** NEW (Interview6 §A) — per-target hardware (SoC/module, features) + +**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here. +::: diff --git a/docs/explanations/understanding-attribute-state.md b/docs/explanations/understanding-attribute-state.md new file mode 100644 index 00000000..81dfc49d --- /dev/null +++ b/docs/explanations/understanding-attribute-state.md @@ -0,0 +1,11 @@ +# Understanding attribute state + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** webcontrol/userguide/understanding_attribute_state.rst (535w, 8 states) — recreate 8 state icons (Prompt C); no malcolm reference in docs +::: diff --git a/docs/explanations/web-control-ui-overview.md b/docs/explanations/web-control-ui-overview.md new file mode 100644 index 00000000..8cbe8c30 --- /dev/null +++ b/docs/explanations/web-control-ui-overview.md @@ -0,0 +1,11 @@ +# Web Control UI overview + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** webcontrol/userguide/user_interface_overview.rst (1150w) — reuse screenshots +::: diff --git a/docs/how-to.md b/docs/how-to.md new file mode 100644 index 00000000..ba801fd7 --- /dev/null +++ b/docs/how-to.md @@ -0,0 +1,7 @@ +# How-to Guides + +Practical step-by-step guides for the more experienced user. + +```{toc} +:context: children +``` diff --git a/docs/how-to/build.md b/docs/how-to/build.md new file mode 100644 index 00000000..d348de2e --- /dev/null +++ b/docs/how-to/build.md @@ -0,0 +1,11 @@ +# How to build the PandA image + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now (KAS_IMAGE_VERSION = blocked: verify) + +**Source:** how-to/build.rst (275w) + how-to/run-container.rst (KAS part, 167w) — merge; fold in KAS_IMAGE_VERSION +::: diff --git a/docs/how-to/choose-fpga-bitstream.md b/docs/how-to/choose-fpga-bitstream.md new file mode 100644 index 00000000..79a84600 --- /dev/null +++ b/docs/how-to/choose-fpga-bitstream.md @@ -0,0 +1,11 @@ +# Choose the FPGA bitstream + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** NEW (Interview5 §10; Interview3 §4) — seed from quickstart FAQ "override FPGA bitstream variant" +::: diff --git a/docs/how-to/contribute.md b/docs/how-to/contribute.md new file mode 100644 index 00000000..6e419797 --- /dev/null +++ b/docs/how-to/contribute.md @@ -0,0 +1,2 @@ +```{include} ../../.github/CONTRIBUTING.md +``` diff --git a/docs/how-to/integrate-with-a-panda.md b/docs/how-to/integrate-with-a-panda.md new file mode 100644 index 00000000..2b898644 --- /dev/null +++ b/docs/how-to/integrate-with-a-panda.md @@ -0,0 +1,18 @@ +# Integrate with a PandA + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now (skeleton + links) + +**Source:** NEW (Interview5; PandABlocks-client + fastcs-PandABlocks repos) — TCP direct / Python client / EPICS+Tango; covers data-out (binary -> HDF5/numpy) +::: + + +The Python client provides +[`BlockingClient`](xref:PandABlocks-client#pandablocks.blocking.BlockingClient) +for talking to a PandA over the TCP server. + diff --git a/docs/how-to/make-release.md b/docs/how-to/make-release.md new file mode 100644 index 00000000..dd8fa029 --- /dev/null +++ b/docs/how-to/make-release.md @@ -0,0 +1,11 @@ +# Make a firmware release + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** how-to/make-release.rst — de-dupe vs github.io copy; fix releases link -> meta-panda +::: diff --git a/docs/how-to/manual-build.md b/docs/how-to/manual-build.md new file mode 100644 index 00000000..bc325539 --- /dev/null +++ b/docs/how-to/manual-build.md @@ -0,0 +1,11 @@ +# Manually build the PandA image + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now (post-5.0 branch = blocked: verify) + +**Source:** tutorials/manual-build.rst — fix manifest URL -> Xilinx/yocto-manifests, branch rel-v2023.2 +::: diff --git a/docs/how-to/monitor-attribute-values.md b/docs/how-to/monitor-attribute-values.md new file mode 100644 index 00000000..e60dae72 --- /dev/null +++ b/docs/how-to/monitor-attribute-values.md @@ -0,0 +1,11 @@ +# Monitor attribute values + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** webcontrol/userguide/monitoring_attribute_values.rst (991w) — reuse screenshots +::: diff --git a/docs/how-to/packages.md b/docs/how-to/packages.md new file mode 100644 index 00000000..1d90deeb --- /dev/null +++ b/docs/how-to/packages.md @@ -0,0 +1,11 @@ +# Install packages via opkg + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** how-to/packages.rst +::: diff --git a/docs/how-to/quickstart.md b/docs/how-to/quickstart.md new file mode 100644 index 00000000..79610e87 --- /dev/null +++ b/docs/how-to/quickstart.md @@ -0,0 +1,11 @@ +# How to get a PandA on the network + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** how-to/quickstart.rst (817w) + rootfs how-to/quickstart.md — merge; fix boot.txt->config.txt; add panda-config.txt USB override; FAQ moves to reference/troubleshooting +::: diff --git a/docs/how-to/save-restore-design.md b/docs/how-to/save-restore-design.md new file mode 100644 index 00000000..749ea2c2 --- /dev/null +++ b/docs/how-to/save-restore-design.md @@ -0,0 +1,11 @@ +# Save and restore a design + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** webcontrol/userguide/working_with_a_design.rst (Saving a Design, Opening an Existing Design) — reuse screenshots +::: diff --git a/docs/how-to/test-firmware-changes.md b/docs/how-to/test-firmware-changes.md new file mode 100644 index 00000000..11a2963b --- /dev/null +++ b/docs/how-to/test-firmware-changes.md @@ -0,0 +1,11 @@ +# Test firmware changes + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now + +**Source:** NEW (Interview5 §1-2) — replaces how-to/pandablocks-sdk.rst +::: diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md new file mode 100644 index 00000000..d5882f44 --- /dev/null +++ b/docs/how-to/upgrade-via-ssh.md @@ -0,0 +1,11 @@ +# Upgrading a PandA over SSH + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now (gap audit = blocked: verify) + +**Source:** how-to/remote.rst (245w) — keep 24V EEPROM as DLS-only one-time; cover pre-5.0 + post-5.0 +::: diff --git a/docs/how-to/upgrade-via-web-admin.md b/docs/how-to/upgrade-via-web-admin.md new file mode 100644 index 00000000..c8e15acf --- /dev/null +++ b/docs/how-to/upgrade-via-web-admin.md @@ -0,0 +1,11 @@ +# Upgrading a PandA via the web admin interface + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** partial (legacy zpg filename = blocked: verify) + +**Source:** how-to/web-interface.rst (240w) — + legacy pre-5.0 zpg path + fresh-SD-card install +::: diff --git a/docs/how-to/use-web-control-to-set-up-a-panda.md b/docs/how-to/use-web-control-to-set-up-a-panda.md new file mode 100644 index 00000000..812ea6af --- /dev/null +++ b/docs/how-to/use-web-control-to-set-up-a-panda.md @@ -0,0 +1,11 @@ +# Use Web Control to set up a PandA + +:::{admonition} 🚧 TODO — documentation stub +:class: note + +This page is a Stage A scaffold stub and has not yet been written. + +**Status:** writable-now (4 widget screenshots + trailing sentence = blocked: capture) + +**Source:** webcontrol/userguide/working_with_a_design.rst (4882w) — folds attribute widgets (View/Edit, Dropdown, Text Input, Checkbox) +::: diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..6c00c2f8 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,42 @@ +--- +site: + hide_outline: true +--- + +```{include} ../README.md +:end-before: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/knowledge/docs-skeleton/index.md b/knowledge/docs-skeleton/index.md new file mode 100644 index 00000000..e65e5b02 --- /dev/null +++ b/knowledge/docs-skeleton/index.md @@ -0,0 +1,42 @@ +--- +site: + hide_outline: true +--- + +```{include} ../README.md +:end-before: diff --git a/knowledge/docs-skeleton/tutorials.md b/knowledge/docs-skeleton/tutorials.md new file mode 100644 index 00000000..eac69798 --- /dev/null +++ b/knowledge/docs-skeleton/tutorials.md @@ -0,0 +1,7 @@ +# Tutorials + +Tutorials for installation and typical usage. New users start here. + +```{toc} +:context: children +``` diff --git a/knowledge/docs-skeleton/tutorials/installation.md b/knowledge/docs-skeleton/tutorials/installation.md new file mode 100644 index 00000000..4342d8d8 --- /dev/null +++ b/knowledge/docs-skeleton/tutorials/installation.md @@ -0,0 +1,53 @@ +# Installation + +## Check your version of python + +You will need python 3.11 or later. You can check your version of python by +typing into a terminal: + +``` +$ python3 --version +``` + +## Create a virtual environment + +It is recommended that you install into a “virtual environment” so this +installation will not interfere with any existing Python software: + +``` +$ python3 -m venv /path/to/venv +$ source /path/to/venv/bin/activate +``` + +## Installing the library + +You can now use `pip` to install the library and its dependencies: + +``` +$ python3 -m pip install dls-python-copier-template-example +``` + +If you require a feature that is not currently released you can also install +from github: + +``` +$ python3 -m pip install git+https://github.com/DiamondLightSource/python-copier-template-example.git +``` + +The library should now be installed and the commandline interface on your path. +You can check the version that has been installed by typing: + +``` +$ python-copier-template-example --version +``` + +## Verify the installation + +You can also verify the installation from a Python interpreter: + +```python +>>> from python_copier_template_example import greet +>>> greet("World") +'Hello, World!' + +``` From fc031726543eddd21b902841f6d9c4afb32451d2 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 12:07:26 +0000 Subject: [PATCH 07/49] ci: align docs workflow with python-copier-template; main branch + artifact Model .github/workflows/docs.yml on the python-copier-template-example _docs.yml: - checkout@v5 (fetch-depth 0); sanitize GITHUB_REF_NAME into DOCS_VERSION - upload-artifact@v4 of docs/_build as the 'docs' artifact (zipped) - move build to versioned .github/pages//; generate switcher.json via make_switcher.py (copied from the template) - publish via peaceiris v4.0.0 (pinned SHA), keep_files: true Root branch moved rel-* -> main: - publish gated on github.ref_name == 'main' || ref_type == 'tag' - .github/pages/index.html redirects to ./main/index.html Adaptations from the template (documented in PROGRESS.md): - build with npm + mystmd (myst build --html) rather than uv/tox: meta-panda is a Yocto layer, not a Python/uv project - keep BASE_URL=/meta-panda/ so assets resolve under the versioned Pages sub-path (template's mystmd migration doesn't set it yet) Validated locally end-to-end with DOCS_VERSION=main: green build, BASE_URL applied, artifact path populated, versioned move, switcher.json generated. Co-Authored-By: Claude Opus 4.8 --- .github/pages/index.html | 12 +++-- .github/pages/make_switcher.py | 96 ++++++++++++++++++++++++++++++++++ .github/workflows/docs.yml | 57 ++++++++++++-------- docs/PROGRESS.md | 18 ++++--- 4 files changed, 149 insertions(+), 34 deletions(-) create mode 100755 .github/pages/make_switcher.py diff --git a/.github/pages/index.html b/.github/pages/index.html index 30a217c8..c495f39f 100644 --- a/.github/pages/index.html +++ b/.github/pages/index.html @@ -1,9 +1,11 @@ - - Redirecting to master branch + + + Redirecting to main branch - - - + + + + diff --git a/.github/pages/make_switcher.py b/.github/pages/make_switcher.py new file mode 100755 index 00000000..c06813af --- /dev/null +++ b/.github/pages/make_switcher.py @@ -0,0 +1,96 @@ +"""Make switcher.json to allow docs to switch between different versions.""" + +import json +import logging +from argparse import ArgumentParser +from pathlib import Path +from subprocess import CalledProcessError, check_output + + +def report_output(stdout: bytes, label: str) -> list[str]: + """Print and return something received frm stdout.""" + ret = stdout.decode().strip().split("\n") + print(f"{label}: {ret}") + return ret + + +def get_branch_contents(ref: str) -> list[str]: + """Get the list of directories in a branch.""" + stdout = check_output(["git", "ls-tree", "-d", "--name-only", ref]) + return report_output(stdout, "Branch contents") + + +def get_sorted_tags_list() -> list[str]: + """Get a list of sorted tags in descending order from the repository.""" + stdout = check_output(["git", "tag", "-l", "--sort=-v:refname"]) + return report_output(stdout, "Tags list") + + +def get_versions(ref: str, add: str | None) -> list[str]: + """Generate the file containing the list of all GitHub Pages builds.""" + # Get the directories (i.e. builds) from the GitHub Pages branch + try: + builds = set(get_branch_contents(ref)) + except CalledProcessError: + builds = set() + logging.warning(f"Cannot get {ref} contents") + + # Add and remove from the list of builds + if add: + builds.add(add) + + # Get a sorted list of tags + tags = get_sorted_tags_list() + + # Make the sorted versions list from main branches and tags + versions: list[str] = [] + for version in ["master", "main"] + tags: + if version in builds: + versions.append(version) + builds.remove(version) + + # Add in anything that is left to the bottom + versions += sorted(builds) + print(f"Sorted versions: {versions}") + return versions + + +def write_json(path: Path, repository: str, versions: list[str]): + """Write the JSON switcher to path.""" + org, repo_name = repository.split("/") + struct = [ + {"version": version, "url": f"https://{org}.github.io/{repo_name}/{version}/"} + for version in versions + ] + text = json.dumps(struct, indent=2) + print(f"JSON switcher:\n{text}") + path.write_text(text, encoding="utf-8") + + +def main(args=None): + """Parse args and write switcher.""" + parser = ArgumentParser( + description="Make a versions.json file from gh-pages directories" + ) + parser.add_argument( + "--add", + help="Add this directory to the list of existing directories", + ) + parser.add_argument( + "repository", + help="The GitHub org and repository name: ORG/REPO", + ) + parser.add_argument( + "output", + type=Path, + help="Path of write switcher.json to", + ) + args = parser.parse_args(args) + + # Write the versions file + versions = get_versions("origin/gh-pages", args.add) + write_json(args.output, args.repository, versions) + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f3487521..94e37642 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,53 +4,66 @@ on: push: pull_request: +permissions: + contents: write + jobs: - make_docs: + build: runs-on: ubuntu-latest steps: - # Git repository - - name: Checkout Source - uses: actions/checkout@v4 + - name: Avoid git conflicts when tag and branch pushed at same time + if: github.ref_type == 'tag' + run: sleep 60 + + - name: Checkout + uses: actions/checkout@v5 with: - # require history to get back to last tag for version number of branches + # Need this to get version number from last tag fetch-depth: 0 + # meta-panda is a Yocto layer, not a Python/uv project, so we install + # mystmd directly with npm rather than via `uv run tox -e docs`. The build + # command itself (`cd docs && myst build --html`) matches the template. - name: Setup Node uses: actions/setup-node@v4 with: node-version: 20 - name: Install MyST - # Pin to the version the scaffold was validated against. run: npm install -g mystmd@1.10.1 - - name: Determine version - id: version - # e.g. rel-v2023.2 or a tag - run: echo "version=${GITHUB_REF##*/}" >> "$GITHUB_OUTPUT" + - name: Sanitize ref name for docs version + run: echo "DOCS_VERSION=${GITHUB_REF_NAME//[^A-Za-z0-9._-]/_}" >> $GITHUB_ENV - # Build docs. BASE_URL makes asset/links resolve under the versioned - # GitHub Pages sub-path (https://pandablocks.github.io/meta-panda//). - - name: Make docs + # BASE_URL is required so assets/links resolve under the versioned Pages + # sub-path (https://pandablocks.github.io/meta-panda/$DOCS_VERSION/). This + # is the one deviation from the template, whose mystmd migration does not + # yet set it. + - name: Build docs env: - BASE_URL: /meta-panda/${{ steps.version.outputs.version }} + BASE_URL: /meta-panda/${{ env.DOCS_VERSION }} run: | cd docs myst build --html + - name: Upload built docs artifact + uses: actions/upload-artifact@v4 + with: + name: docs + path: docs/_build + - name: Move to versioned directory - run: | - dest=".github/pages/${{ steps.version.outputs.version }}" - mkdir -p "$dest" - cp -r docs/_build/html/. "$dest/" + run: mv docs/_build/html .github/pages/$DOCS_VERSION + + - name: Write switcher.json + run: python3 .github/pages/make_switcher.py --add $DOCS_VERSION ${{ github.repository }} .github/pages/switcher.json - name: Publish Docs to gh-pages - # Only rel- branches and tags are published - if: "${{ github.repository_owner == 'PandABlocks' && (startsWith(github.ref, 'refs/heads/rel-') || startsWith(github.ref, 'refs/tags')) }}" + if: github.ref_type == 'tag' || github.ref_name == 'main' # We pin to the SHA, not the tag, for security reasons. - # https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions - uses: peaceiris/actions-gh-pages@bbdfb200618d235585ad98e965f4aafc39b4c501 # v3.7.3 + # https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: .github/pages diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 73942724..862a92b0 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -71,10 +71,14 @@ Issues not yet created — Stage B (Prompt B) will create and link them. Blocked built output to `.../PandABlocks-client/main/reference/api.html#pandablocks.blocking.blockingclient`. The other core repos + devcontainer + fastcs are kept commented (their docs aren't published yet); uncomment in Stage F and upstream the block into python-copier-template. -- **Pages workflow.** `.github/workflows/docs.yml` now installs mystmd (pinned 1.10.1) on - `ubuntu-latest`, runs `myst build --html` in `docs/` with `BASE_URL=/meta-panda/`, copies - `docs/_build/html` into the versioned `.github/pages//` dir, and publishes to `gh-pages` - via the same pinned peaceiris action with `keep_files: true` (preserving the catch-all - `.github/pages/index.html` redirect). Validated locally: green build, BASE_URL applied to asset - paths. Publish still gated to `rel-*` branches and tags under the PandABlocks org. The first real - deploy happens when this lands on a `rel-*` branch/tag. +- **Pages workflow.** `.github/workflows/docs.yml` is modelled on the python-copier-template-example + `_docs.yml` (checkout@v5, sanitized `DOCS_VERSION`, `upload-artifact@v4` of `docs/_build` as `docs`, + move to versioned `.github/pages//`, `make_switcher.py` → `switcher.json`, publish via + peaceiris v4.0.0 pinned SHA with `keep_files: true`). Adaptations from the template: (1) build uses + npm + mystmd (`myst build --html`) instead of `uv run tox -e docs` since meta-panda is a Yocto layer, + not a Python/uv project; (2) `BASE_URL=/meta-panda/` is set so assets resolve under the + versioned Pages sub-path (the template's in-progress mystmd migration doesn't set it yet). Root + branch is now **`main`**: publish is gated to `github.ref_name == 'main' || ref_type == 'tag'`, and + `.github/pages/index.html` redirects to `./main/index.html`. Validated locally end-to-end with + `DOCS_VERSION=main`. The version switcher is generated but wiring it into the theme is the deferred + R5 (versioned docs) item. From 38f5adb84722af288118f63c17234dff91abc26a Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 12:14:06 +0000 Subject: [PATCH 08/49] ci: match copier trigger conditions to avoid duplicate docs runs Restrict push triggers to main + tags (mirroring python-copier-template-example ci.yml on: block) so a feature-branch PR fires a single pull_request run instead of both a push and a pull_request run. No reusable-workflow nesting. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/docs.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 94e37642..ed27cbae 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -2,6 +2,10 @@ name: Docs CI on: push: + branches: + - main + tags: + - '*' pull_request: permissions: From 542fc6a6acfb690fc1c235905595a5a432f1c72b Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 12:19:50 +0000 Subject: [PATCH 09/49] ci: upload only rendered html as docs artifact (51MB -> ~7MB) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The artifact uploaded the whole docs/_build, which includes the ~135 MB templates/ dir (downloaded book-theme node sources) plus cache/ and site/ — build-time only, nothing deployable. Upload docs/_build/html instead, cutting the zipped artifact ~7x (measured 49 MB -> 7 MB). The remaining size is the mystmd client runtime (plotly + thebe + React chunks), inherent to a mystmd static site. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/docs.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ed27cbae..3218bec9 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -55,7 +55,10 @@ jobs: uses: actions/upload-artifact@v4 with: name: docs - path: docs/_build + # Only the rendered site, not docs/_build/{templates,cache,site} — the + # template (downloaded book-theme node sources) is ~135 MB of build-time + # cache and bloats the zip ~7x (51 MB -> ~7 MB) with nothing deployable. + path: docs/_build/html - name: Move to versioned directory run: mv docs/_build/html .github/pages/$DOCS_VERSION From 42c2880140641745b6e53623953f863f553c189d Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 12:28:56 +0000 Subject: [PATCH 10/49] ci: keep html/ wrapper in docs artifact, drop only templates cache Uploading docs/_build/html put the site contents flat at the artifact root, losing the intermediate html/ directory the original docs.zip had. Restore docs/_build as the upload root (so html/ is retained) and instead rm the ~135 MB templates/ build cache beforehand. Same ~7 MB result, original layout. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/docs.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 3218bec9..bf8585df 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -51,14 +51,18 @@ jobs: cd docs myst build --html + # Drop the ~135 MB templates/ dir (downloaded book-theme node sources, a + # build-time cache) before uploading. We keep docs/_build as the artifact + # root so the archive retains the intermediate html/ directory; this trims + # the zip ~7x (51 MB -> ~7 MB) without changing its layout. + - name: Remove build cache from artifact + run: rm -rf docs/_build/templates + - name: Upload built docs artifact uses: actions/upload-artifact@v4 with: name: docs - # Only the rendered site, not docs/_build/{templates,cache,site} — the - # template (downloaded book-theme node sources) is ~135 MB of build-time - # cache and bloats the zip ~7x (51 MB -> ~7 MB) with nothing deployable. - path: docs/_build/html + path: docs/_build - name: Move to versioned directory run: mv docs/_build/html .github/pages/$DOCS_VERSION From b1ad8fa21b32f88a906e67cc88d39a41eb362d95 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 13:23:25 +0000 Subject: [PATCH 11/49] docs: point commented FPGA xref at /main Co-Authored-By: Claude Opus 4.8 --- docs/myst.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/myst.yml b/docs/myst.yml index 68869fe1..d6344dd8 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -17,7 +17,7 @@ project: # wiring to uncomment in Stage F once each repo's `docs` branch publishes, and to # upstream into the python-copier-template. Keys/format are settled; only the # live fetch is pending. - # PandABlocks-FPGA: https://pandablocks.github.io/PandABlocks-FPGA + # PandABlocks-FPGA: https://pandablocks.github.io/PandABlocks-FPGA/main # PandABlocks-server: https://pandablocks.github.io/PandABlocks-server # PandABlocks-devcontainer: https://pandablocks.github.io/PandABlocks-devcontainer # fastcs-PandABlocks: https://diamondlightsource.github.io/fastcs-PandABlocks/main From 56ca8306aaf5a136db8299ed323f720ece4cced1 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 13:38:41 +0000 Subject: [PATCH 12/49] =?UTF-8?q?docs:=20Prompt=20D=20=E2=80=94=20tutorial?= =?UTF-8?q?s=20quadrant=20(tutorial0,=20tutorial1,=20tutorial2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert three tutorial RST sources to MyST Markdown. tutorial0 rewrites the MalcolmJS quick-start for PandA web control context; tutorial1 and tutorial2 are straightforward RST→MyST conversions with timing diagrams described inline (the custom timing_plot directive replaced with ASCII art + prose). Co-Authored-By: Claude Sonnet 4.6 --- docs/PROGRESS.md | 6 +- .../tutorial0_connecting_to_web_control.md | 109 ++++++++- docs/tutorials/tutorial1_blinking_leds.md | 83 ++++++- docs/tutorials/tutorial2_position_capture.md | 226 +++++++++++++++++- 4 files changed, 402 insertions(+), 22 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 862a92b0..8dd3a955 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -14,9 +14,9 @@ Page list expanded from `06-source-provenance-map.md`. - ✅ Pages deploy wired — `.github/workflows/docs.yml` switched from Sphinx to `myst build` (see Notes) ## Tutorials -- ◐ tutorials/tutorial0_connecting_to_web_control — source: webcontrol/userguide/quick-start.rst — writable-now -- ◐ tutorials/tutorial1_blinking_leds — source: tutorials/tutorial1_blinking_leds.rst — writable-now -- ◐ tutorials/tutorial2_position_capture — source: tutorials/tutorial2_position_capture.rst — writable-now +- ✅ tutorials/tutorial0_connecting_to_web_control — source: webcontrol/userguide/quick-start.rst — converted +- ✅ tutorials/tutorial1_blinking_leds — source: tutorials/tutorial1_blinking_leds.rst — converted +- ✅ tutorials/tutorial2_position_capture — source: tutorials/tutorial2_position_capture.rst — converted - ⛔ tutorials/tutorial3_position_compare — source: tutorials/tutorial3_position_compare.rst (stub) — blocked: capture - ⛔ tutorials/tutorial4_snake_scan — source: tutorials/tutorial4_snake_scan.rst (stub) — blocked: capture diff --git a/docs/tutorials/tutorial0_connecting_to_web_control.md b/docs/tutorials/tutorial0_connecting_to_web_control.md index 953f295a..79e3792f 100644 --- a/docs/tutorials/tutorial0_connecting_to_web_control.md +++ b/docs/tutorials/tutorial0_connecting_to_web_control.md @@ -1,11 +1,106 @@ -# Connecting to PandA Web Control +# Tutorial 0: Connecting to the PandA Web Control -:::{admonition} 🚧 TODO — documentation stub -:class: note +In this tutorial you will navigate to the PandA web control interface, +explore the block list, view block details, and open the layout panel. +By the end you will know how the main areas of the UI fit together and +be ready for the hands-on tutorials that follow. -This page is a Stage A scaffold stub and has not yet been written. +## Prerequisites -**Status:** writable-now +- A PandA that is powered on and connected to your network. +- Its IP address or hostname (e.g. `192.168.0.100` or `my-panda`). -**Source:** webcontrol/userguide/quick-start.rst ("Quick Start", 376w) — reuse screenshots -::: +## Steps + +### 1. Open the web control + +In a browser navigate to: + +``` +http:/// +``` + +where `` is the IP address or hostname of your PandA. +You will see the initial screen: + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/starting-ui.png +:align: center + +The initial web control screen +``` + +### 2. Select the PANDA block + +The drop-down at the top of the page lists the root blocks available on +your PandA. Click it and choose **PANDA**: + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/block-list.png +:align: center + +Selecting the PANDA root block +``` + +### 3. View the block details + +After selecting PANDA, the left-hand panel loads that block's details — +attributes, groups, and methods: + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-block-details.png +:align: center + +Details for the PANDA block +``` + +### 4. Open the layout + +Scroll down in the left-hand panel until you see the **Layout** attribute. +Click **Edit** to open the block layout in the centre panel: + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/layout-button.png +:align: center + +Click **Edit** in the Layout attribute row to open the layout panel +``` + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout.png +:align: center + +The layout panel showing the functional blocks of the PandA +``` + +### 5. Rearrange blocks + +Drag blocks to new positions to suit your preference. +A brief spinner indicates that the updated position is being saved to the +hardware: + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout-spread-out.png +:align: center + +Blocks dragged to new positions; clicking a block loads its details in the right-hand panel +``` + +Clicking any block in the layout loads its details in the right-hand panel +(the *child block* view). + +### 6. Wire two blocks together + +Click a port on one block and drag to a compatible port on another block +to create a signal link: + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-new-link.png +:align: center + +Dragging between two ports to create a new link +``` + +Blocks can be wired in any combination to build up more complex +signal-processing designs. + +## Next steps + +You now know how to reach the web control, inspect block attributes, and +connect blocks together in the layout view. Continue with: + +- {doc}`tutorial1_blinking_leds` — drive some output bits and see real + hardware changes. diff --git a/docs/tutorials/tutorial1_blinking_leds.md b/docs/tutorials/tutorial1_blinking_leds.md index ba2f2ad8..d7cd0814 100644 --- a/docs/tutorials/tutorial1_blinking_leds.md +++ b/docs/tutorials/tutorial1_blinking_leds.md @@ -1,11 +1,82 @@ -# Blinking LEDs +# Tutorial 1: Blinking LEDs -:::{admonition} 🚧 TODO — documentation stub -:class: note +This tutorial introduces the basics of PandABlocks: how to wire blocks together +so that different LEDs flash at different rates. -This page is a Stage A scaffold stub and has not yet been written. +## Prerequisites -**Status:** writable-now +- A PandA powered on and reachable in your browser + (see {doc}`tutorial0_connecting_to_web_control`). +- The `template_tutorial1_leds` design saved on your PandA (pre-loaded on all + standard PandA images). -**Source:** tutorials/tutorial1_blinking_leds.rst (648w) +## Opening the web control + +Navigate to `http:///` in your browser. +The welcome page has links for **Docs**, **Control** and **Admin** at the bottom. +Click **Control** to open the web control. + +## Loading the tutorial design + +The **Design** drop-down lists saved designs stored on the PandA. +Selecting one replaces the current block settings with the saved ones. + +Select **template_tutorial1_leds** from the drop-down. +The blocks and wiring will change to: + +```{image} ../images/tutorial1_layout.png +``` + +If you look at the front panel of the PandA you should see the first four TTL +output LEDs turn on sequentially, then turn off in reverse order. + +## How the design works + +The **CLOCKS** block generates a 50% duty-cycle pulse train with a 1 s period. +**PULSE1–4** each take this as an input trigger and produce a pulse with a +different width and delay. The PULSE blocks act as a delay line, queuing pulses +until each delay expires. + +Click on any PULSE block to see its settings: + +```{image} ../images/tutorial1_pulse.png +``` + +:::{tip} +Increase a PULSE delay beyond 1 s and the **Queued** field will grow — the block +continues producing pulses at the correct delay. If you increase the **Width** +beyond the period the block drops the pulse instead of merging it, reporting the +drop in the **Dropped** field. ::: + +You can also click the **CLOCKS** block to adjust the input pulse period. + +To explore further, try wiring pulse outputs to different TTLOUT blocks: +click the Palette icon, drag a **TTLOUT** block onto the canvas, then connect a +PULSE out port to the TTLOUT val port by dragging between them. + +## The bit bus + +All visible block ports are blue — they carry single boolean (bit) values. +You can view all bit values at once by clicking **Bits** in the left-hand panel: + +```{image} ../images/tutorial1_bits.png +``` + +Scroll to the PULSE section to see the same flashing pattern as on the PandA +front panel. + +:::{note} +The web control polls the PandA at 10 Hz, receiving the current value of each +bit and whether it has changed. It displays the current value for signals +toggling below 5 Hz and a 5 Hz pulsing indicator for faster signals — so even +short pulses are visible. Front-panel LEDs behave similarly, capped at 10 Hz. +::: + +## Summary and next steps + +You have loaded a saved design, inspected block parameters, and seen bit outputs +connected to hardware TTL outputs via TTLOUT blocks. + +Continue with {doc}`tutorial2_position_capture` to learn about position outputs +and data capture. diff --git a/docs/tutorials/tutorial2_position_capture.md b/docs/tutorials/tutorial2_position_capture.md index 90b530b0..2b5739f7 100644 --- a/docs/tutorials/tutorial2_position_capture.md +++ b/docs/tutorials/tutorial2_position_capture.md @@ -1,11 +1,225 @@ -# Position Capture +# Tutorial 2: Position Capture -:::{admonition} 🚧 TODO — documentation stub -:class: note +This tutorial introduces the Position Capture (PCAP) interface of PandABlocks: +how to provide trigger and gate signals that control when data is captured, and +how to receive and interpret the captured stream. -This page is a Stage A scaffold stub and has not yet been written. +## Prerequisites -**Status:** writable-now +- Completed {doc}`tutorial1_blinking_leds` or comfortable with the web control + layout view. +- `nc` (netcat) or any TCP client available on your workstation. -**Source:** tutorials/tutorial2_position_capture.rst (1167w) — keep the "next tutorial" promise +## Loading the tutorial design + +Select **template_tutorial2_pcap** from the Design drop-down. +The block wiring will change to: + +```{image} ../images/tutorial2_layout.png +``` + +## How the design works + +The design has two CLOCK blocks, both enabled as soon as the PCAP block becomes +active: + +- **CLOCK1** is wired to PCAP trigger *and* gate. + - **Gate** is a level-driven signal defining the capture window. + - **Trigger** is an edge-driven signal that captures data. + `PCAP.TRIG_EDGE="Falling"` so capture fires on the falling edge of the + trigger. +- **CLOCK2** is wired to a COUNTER, incrementing its value on each rising edge. + +With both CLOCKs set to a 1 s period, each second the COUNTER increments by one +and the PCAP trigger fires half a second later. + +**Timing diagram — Trigger Only (1 s clock):** + +``` + Gate: _____|‾‾‾‾‾‾|________|‾‾‾‾‾‾|___ + Trig: _________|__|_____________|__|___ + Capture: ↑ ↑ +``` + +The `PCAP` block settings and the Bits/Positions tables determine what is +captured on each trigger: + +| Capture mode | Description | +|---|---| +| No | Don't capture | +| Value | Instantaneous value at time of trigger | +| Diff | Difference in value while gate was high | +| Sum | Sum of all samples while gate was high | +| Min | Smallest value seen while gate was high | +| Max | Largest value seen while gate was high | +| Mean | Average value seen while gate was high | +| Min Max | Capture both Min and Max | +| Min Max Mean | Capture Min, Max and Mean | + +For Bits you can toggle instantaneous capture on or off for each bit signal. +Additional PCAP outputs (start-of-frame, end-of-frame, trigger time) can be +enabled on the PCAP block itself. + +If you click the PCAP block you can see the Outputs section: + +```{image} ../images/tutorial2_pcap.png +``` + +### Input delays + +In the Inputs section you will see a delay of **1** on both Trig and Gate. +Delays on bit inputs are measured in FPGA clock ticks and compensate for +different-length data paths. In this design both COUNTER1 and PCAP are +triggered by CLOCK1 in the same clock tick; the 1-tick delay on PCAP inputs +ensures PCAP sees the updated COUNTER1 value *after* the corresponding rising +edge. + +:::{note} +Delay values also appear as small badges on the input ports of the PCAP block in +the layout view. ::: + +## Capturing data + +### Set up Value capture + +Open the Positions table and set **COUNTER1.OUT** to capture **Value**, then +press Submit: + +```{image} ../images/tutorial2_positions.png +``` + +### Connect a client + +Open a TCP connection to port 8889 of your PandA: + +``` +$ nc 8889 +``` + +Press Return; you should see: + +``` +OK +``` + +### Arm and collect + +Go back to the PandA layout, click the PCAP block, and press **ARM**. +The Active indicator lights and data streams to the terminal until you press +**Disarm**: + +``` +missed: 0 +process: Scaled +format: ASCII +fields: + COUNTER1.OUT double Value scale: 1 offset: 0 units: + + 1 + 2 + 3 + 4 +END 4 Disarmed +``` + +The captured values match the instantaneous COUNTER1.OUT value at each +PCAP.TRIG falling edge — consistent with the 1 s timing above. + +### Speed up the counter + +Set **CLOCK2.PERIOD** to `0.2s`, then ARM again: + +``` +missed: 0 +process: Scaled +format: ASCII +fields: + COUNTER1.OUT double Value scale: 1 offset: 0 units: + + 3 + 8 + 13 + 18 +END 4 Disarmed +``` + +**Timing diagram — Counter 5× faster:** + +``` + Counter: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ... + Gate: __|‾‾‾‾‾‾‾‾‾‾‾|___|‾‾‾‾‾‾‾‾‾‾‾|__________________ + Capture: ↑ ↑ +``` + +The value is captured mid-way through each increment of 5. + +### Diff capture + +Change **COUNTER1.OUT** to capture **Diff** and ARM: + +``` +missed: 0 +process: Scaled +format: ASCII +fields: + COUNTER1.OUT double Diff scale: 1 offset: 0 units: + + 2 + 2 + 2 + 2 +END 4 Disarmed +``` + +`Diff` returns the difference between the value at the gate rising edge and the +gate falling edge. Gate rises when COUNTER was at 1 and falls at 3 → diff = 2. + +:::{note} +Without the 1-tick input delays, the gate would rise at 0 and fall at 3, +giving a diff of 3. +::: + +This capture mode is commonly used with a COUNTER connected to a +[V2F](https://hal.archives-ouvertes.fr/hal-01573024/document) (voltage-to- +frequency converter) to record the total counts within a gate window. + +### Min / Max / Mean capture + +Change **COUNTER1.OUT** to **Min Max Mean** and ARM: + +``` +missed: 0 +process: Scaled +format: ASCII +fields: + COUNTER1.OUT double Min scale: 1 offset: 0 units: + COUNTER1.OUT double Max scale: 1 offset: 0 units: + COUNTER1.OUT double Mean scale: 1 offset: 0 units: + + 1 3 1.8 + 6 8 6.8 + 11 13 11.8 + 16 18 16.8 +END 4 Disarmed +``` + +The Mean is the time-weighted average of the counter value over the gate window: + +``` +# (sum of counter_value × time_at_value) / gate_time = mean +(1×0.2 + 2×0.2 + 3×0.1) / 0.5 = 1.8 +(6×0.2 + 7×0.2 + 8×0.1) / 0.5 = 6.8 +``` + +This mode is useful with encoder inputs to record the min, max and mean encoder +position over a detector frame. + +## Summary and next steps + +You have used the PCAP interface to capture position data with different capture +modes (Value, Diff, Min/Max/Mean), and received the ASCII stream over TCP. + +The next tutorial ({doc}`tutorial3_position_compare`) covers position compare — +generating triggers automatically when an encoder reaches a set of target +positions. From 40d891c9e69217b9150d50f0a8ac2f938213c2b4 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 13:44:52 +0000 Subject: [PATCH 13/49] =?UTF-8?q?docs:=20Prompt=20D=20=E2=80=94=20how-to?= =?UTF-8?q?=20quadrant=20(12=20pages)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert all writable how-to pages from RST to MyST Markdown. Includes: - quickstart: merged with rootfs source, fixed boot.txt→config.txt, FAQ moved to reference/troubleshooting - build: merged kas + docker approaches; KAS_IMAGE_VERSION verify note - manual-build: fixed Xilinx manifest URL to Xilinx/yocto-manifests - make-release: releases link fixed to meta-panda repo - packages, upgrade-via-ssh, upgrade-via-web-admin, monitor-attribute-values - Three NEW authored pages: integrate-with-a-panda, test-firmware-changes, choose-fpga-bitstream (from Interview3/5 knowledge) - contribute: xref/intersphinx setup documented; CONTRIBUTING.md include kept Skipped (Prompt E): use-web-control-to-set-up-a-panda, save-restore-design Co-Authored-By: Claude Sonnet 4.6 --- docs/PROGRESS.md | 28 +++--- docs/how-to/build.md | 121 +++++++++++++++++++++++- docs/how-to/choose-fpga-bitstream.md | 53 +++++++++-- docs/how-to/contribute.md | 43 +++++++++ docs/how-to/integrate-with-a-panda.md | 75 ++++++++++++--- docs/how-to/make-release.md | 19 ++-- docs/how-to/manual-build.md | 63 ++++++++++-- docs/how-to/monitor-attribute-values.md | 92 +++++++++++++++++- docs/how-to/packages.md | 25 +++-- docs/how-to/quickstart.md | 112 ++++++++++++++++++++-- docs/how-to/test-firmware-changes.md | 72 ++++++++++++-- docs/how-to/upgrade-via-ssh.md | 76 ++++++++++++++- docs/how-to/upgrade-via-web-admin.md | 55 ++++++++++- 13 files changed, 752 insertions(+), 82 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 8dd3a955..ce5ba843 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -21,20 +21,20 @@ Page list expanded from `06-source-provenance-map.md`. - ⛔ tutorials/tutorial4_snake_scan — source: tutorials/tutorial4_snake_scan.rst (stub) — blocked: capture ## How-to -- ◐ how-to/quickstart — source: how-to/quickstart.rst + rootfs quickstart.md — writable-now -- ◐ how-to/build — source: how-to/build.rst + run-container.rst (KAS) — writable-now (KAS_IMAGE_VERSION = verify) -- ◐ how-to/manual-build — source: tutorials/manual-build.rst — writable-now (post-5.0 branch = verify) -- ◐ how-to/make-release — source: how-to/make-release.rst — writable-now -- ◐ how-to/packages — source: how-to/packages.rst — writable-now -- ◐ how-to/upgrade-via-ssh — source: how-to/remote.rst — writable-now (gap audit = verify) -- ◐ how-to/upgrade-via-web-admin — source: how-to/web-interface.rst — partial (zpg filename = verify) -- ◐ how-to/use-web-control-to-set-up-a-panda — source: webcontrol/userguide/working_with_a_design.rst — writable-now (widget screenshots = capture) [Prompt E] -- ◐ how-to/save-restore-design — source: working_with_a_design.rst (Saving/Opening) — writable-now [Prompt E split] -- ◐ how-to/monitor-attribute-values — source: webcontrol/userguide/monitoring_attribute_values.rst — writable-now -- ◐ how-to/integrate-with-a-panda — source: NEW (Interview5; client + fastcs) — writable-now (skeleton). Holds the Stage A xref probe. -- ◐ how-to/test-firmware-changes — source: NEW (Interview5 §1-2) — writable-now -- ◐ how-to/choose-fpga-bitstream — source: NEW (Interview5 §10; Interview3 §4) — writable-now -- ✅ how-to/contribute — source: `{include} .github/CONTRIBUTING.md` — scaffold include resolves (content merge later) +- ✅ how-to/quickstart — source: how-to/quickstart.rst + rootfs quickstart.md — merged; boot.txt→config.txt fixed; FAQ moved to reference/troubleshooting +- ✅ how-to/build — source: how-to/build.rst + run-container.rst (KAS) — merged; KAS_IMAGE_VERSION verify note added +- ✅ how-to/manual-build — source: tutorials/manual-build.rst — manifest URL fixed (Xilinx/yocto-manifests); post-5.0 branch verify noted +- ✅ how-to/make-release — source: how-to/make-release.rst — releases link fixed → meta-panda +- ✅ how-to/packages — source: how-to/packages.rst — converted +- ✅ how-to/upgrade-via-ssh — source: how-to/remote.rst — pre-5.0 + post-5.0 covered; 24V EEPROM DLS-only noted; gap audit verify noted +- ✅ how-to/upgrade-via-web-admin — source: how-to/web-interface.rst — pre-5.0 zpg path + fresh SD card install added; zpg filename verify noted +- ◐ how-to/use-web-control-to-set-up-a-panda — source: webcontrol/userguide/working_with_a_design.rst — SKIP (Prompt E) +- ◐ how-to/save-restore-design — source: working_with_a_design.rst (Saving/Opening) — SKIP (Prompt E split) +- ✅ how-to/monitor-attribute-values — source: webcontrol/userguide/monitoring_attribute_values.rst — converted +- ✅ how-to/integrate-with-a-panda — source: NEW (Interview5; client + fastcs) — skeleton written; xref probe preserved +- ✅ how-to/test-firmware-changes — source: NEW (Interview5 §1-2) — authored +- ✅ how-to/choose-fpga-bitstream — source: NEW (Interview5 §10; Interview3 §4) — authored +- ✅ how-to/contribute — content merge from github.io + xref/intersphinx setup documented ## Reference - ◐ reference/opkg — source: reference/opkg.rst — writable-now diff --git a/docs/how-to/build.md b/docs/how-to/build.md index d348de2e..27a58ec5 100644 --- a/docs/how-to/build.md +++ b/docs/how-to/build.md @@ -1,11 +1,122 @@ # How to build the PandA image -:::{admonition} 🚧 TODO — documentation stub -:class: note +## Prerequisites -This page is a Stage A scaffold stub and has not yet been written. +- [kas](https://kas.readthedocs.io/) installed, or Docker / Podman available + so that `kas-container` can pull and run the build container automatically. +- A clone of the `meta-panda` repository. -**Status:** writable-now (KAS_IMAGE_VERSION = blocked: verify) +## Build steps -**Source:** how-to/build.rst (275w) + how-to/run-container.rst (KAS part, 167w) — merge; fold in KAS_IMAGE_VERSION +1. Clone the repository: + + ```bash + git clone https://github.com/PandABlocks/meta-panda + cd meta-panda + ``` + +2. If `kas` is not already installed, create a virtual environment and install + it: + + ```bash + python3 -m venv venv && . venv/bin/activate && pip install kas + ``` + +3. Build the image. `kas-container` pulls the required build container image + automatically — no manual Docker setup is needed: + + ```bash + export KAS_IMAGE_VERSION="4.8" + kas-container build ./kas.yml + ``` + + :::{note} + `KAS_IMAGE_VERSION` pins the version of the build container. Check the + `meta-panda` release notes or the `kas.yml` file for the value appropriate + to the version you are building. + ::: + + To target a different machine set `KAS_MACHINE`, e.g.: + + ```bash + KAS_MACHINE=xu5-st1 kas-container build ./kas.yml + ``` + + The default machine is `pandabox`. Output lands under + `build/tmp/deploy/images/`. + +4. (Optional) Collect the output files, for example for pandabox: + + ```bash + mkdir boot + cp -Lf build/tmp/deploy/images/pandabox/fitImage-petalinux-initramfs-image-pandabox-pandabox \ + boot/image.ub + cp -f build/tmp/deploy/images/pandabox/{rootfs.squashfs,boot.bin,boot.scr,target-defs} boot/ + zip boot-pandabox.zip boot/* + ``` + + Alternatively, the `build.sh` helper script builds and collects everything + for a specific machine in one step: + + ```bash + ./build.sh + ``` + + A `boot-.zip` file is created in the current directory. + +## Running in a container manually + +For development work (e.g. FPGA builds requiring Vivado), a +`pandablocks-dev-container` image is published on the GitHub Container +Registry. + +Pull it: + +```bash +docker pull ghcr.io/pandablocks/pandablocks-dev-container:latest +``` + +Use a numbered tag instead of `latest` to pin a specific release. + +Create three host directories: + +- `REPO_DIR` — containing all PandA repositories +- `VIVADO_DIR` — containing a Vivado installation +- `BUILD_DIR` — an empty scratch directory + +Run the container with those directories mounted: + +```bash +docker run --rm --net=host -it \ + -v REPO_DIR:/repos:Z \ + -v BUILD_DIR:/build:Z \ + -v VIVADO_DIR:/scratch/Xilinx \ + ghcr.io/pandablocks/pandablocks-dev-container /bin/bash +``` + +:::{note} +The mount path for Vivado inside the container must match your local path. +For example, if Vivado is at `/FPGA/Xilinx` on the host use +`-v /FPGA/Xilinx:/FPGA/Xilinx` and edit `CONFIG` accordingly. ::: + +In each repository inside the container: + +```bash +cp CONFIG.example CONFIG +``` + +## Output files + +| File | Description | +|---|---| +| `boot.bin` | Zynq stage-0 boot loader + U-Boot (stage-2) | +| `boot.scr` | U-Boot script that locates and loads `image.ub` | +| `image.ub` | FIT image: Linux kernel + device tree + initramfs | +| `rootfs.squashfs` | Full Linux rootfs with all packages installed | +| `config.txt` | User-editable network and boot configuration | +| `target-defs` | Target-specific configuration functions | + +Copy these files to the SD card and insert it in the target; the system will +boot normally. On the first boot of a pandabox you will be prompted for a MAC +address. diff --git a/docs/how-to/choose-fpga-bitstream.md b/docs/how-to/choose-fpga-bitstream.md index 79a84600..abf0bdc3 100644 --- a/docs/how-to/choose-fpga-bitstream.md +++ b/docs/how-to/choose-fpga-bitstream.md @@ -1,11 +1,52 @@ # Choose the FPGA bitstream -:::{admonition} 🚧 TODO — documentation stub -:class: note +Each PandABlocks-FPGA `.ipk` package ships an FPGA bitstream and declares +which FMC hardware it requires. On boot, meta-panda selects the bitstream +to load as follows: -This page is a Stage A scaffold stub and has not yet been written. +1. If the `APP` variable is set in `config.txt`, that bitstream is used. +2. Otherwise the PandA reads the FMC EEPROM and auto-selects the bitstream + whose FMC requirements match. +3. If more than one installed bitstream would satisfy the EEPROM check, the + PandA reports an error. -**Status:** writable-now +## Automatic selection -**Source:** NEW (Interview5 §10; Interview3 §4) — seed from quickstart FAQ "override FPGA bitstream variant" -::: +Leave `APP` unset in `config.txt`. The PandA will select the bitstream that +matches the FMC card detected at boot. If no FMC EEPROM is found, the +`no-fmc` variant is used. + +## Manual override via `APP` + +To force a specific bitstream, add `APP=` to `config.txt` on the SD +card: + +```ini +APP = pandabox-fmc-acq430 +``` + +The `APP` variable takes effect only if the corresponding FPGA variant package +is installed. Available variant names are listed in the package names visible +in the web admin (**Packages → List Installed Packages**). + +### USB override (no SD card access needed) + +To override without opening the PandA, add `APP=` to +`panda-config.txt` on a USB stick and plug it in while the PandA boots: + +```ini +APP = pandabox-fmc-acq430 +``` + +See {doc}`quickstart` for full details of the USB override mechanism. + +## Installing a new bitstream package + +```bash +scp panda-fpga-_.ipk root@:/tmp/ +ssh root@ opkg install /tmp/panda-fpga-_.ipk +ssh root@ reboot +``` + +To build a custom bitstream package from source, see the +[PandABlocks-FPGA documentation](https://github.com/PandABlocks/PandABlocks-FPGA). diff --git a/docs/how-to/contribute.md b/docs/how-to/contribute.md index 6e419797..e5ae64d8 100644 --- a/docs/how-to/contribute.md +++ b/docs/how-to/contribute.md @@ -1,2 +1,45 @@ ```{include} ../../.github/CONTRIBUTING.md ``` + +## Cross-repository references + +This project uses [MyST](https://mystmd.org/) for documentation. Cross-links +to other PandABlocks repos (and to `PandABlocks-client` / `fastcs-PandABlocks`) +are configured in `docs/myst.yml` under `project.references`. + +### Adding a cross-link + +To link to a page in another PandABlocks repo: + +```markdown +[link text](xref:#) +``` + +For example, to link to the `BlockingClient` API in `PandABlocks-client`: + +```markdown +[`BlockingClient`](xref:PandABlocks-client#pandablocks.blocking.BlockingClient) +``` + +### Available reference targets + +| Key | Repo | Type | +|---|---|---| +| `PandABlocks-client` | `PandABlocks-client` | Sphinx (`objects.inv`) | +| `PandABlocks-FPGA` | `PandABlocks-FPGA` | MyST (`myst.xref.json`) | +| `PandABlocks-server` | `PandABlocks-server` | MyST (`myst.xref.json`) | +| `PandABlocks-devcontainer` | `PandABlocks-devcontainer` | MyST (`myst.xref.json`) | +| `fastcs-PandABlocks` | `fastcs-PandABlocks` | Sphinx (`objects.inv`) | + +The `PandABlocks-FPGA`, `PandABlocks-server`, `PandABlocks-devcontainer` and +`fastcs-PandABlocks` entries are present in `myst.yml` but commented out until +those repos publish their `docs` branches. Uncomment the relevant line once the +target site is live (Stage F). + +### Upstreaming to the copier template + +The `project.references` block in `docs/myst.yml` is a prototype intended for +upstreaming into the +[python-copier-template](https://github.com/DiamondLightSource/python-copier-template). +When upstreaming, verify that the URL format and key names are consistent with +any MyST version changes since Stage A. diff --git a/docs/how-to/integrate-with-a-panda.md b/docs/how-to/integrate-with-a-panda.md index 2b898644..5d444be2 100644 --- a/docs/how-to/integrate-with-a-panda.md +++ b/docs/how-to/integrate-with-a-panda.md @@ -1,18 +1,71 @@ # Integrate with a PandA -:::{admonition} 🚧 TODO — documentation stub -:class: note +A PandA exposes a plain TCP server on port 8888 (control) and port 8889 +(data capture). Several client libraries build on this interface: -This page is a Stage A scaffold stub and has not yet been written. +| Approach | When to use | +|---|---| +| Direct TCP | Low-level scripting; quick one-off checks | +| PandABlocks-client (Python) | Python applications; preferred for new integrations | +| fastcs-PandABlocks (EPICS / Tango) | Control-system integrations via EPICS or Tango | -**Status:** writable-now (skeleton + links) +## Direct TCP -**Source:** NEW (Interview5; PandABlocks-client + fastcs-PandABlocks repos) — TCP direct / Python client / EPICS+Tango; covers data-out (binary -> HDF5/numpy) -::: +Connect to port 8888 to send commands and read responses: - -The Python client provides -[`BlockingClient`](xref:PandABlocks-client#pandablocks.blocking.BlockingClient) -for talking to a PandA over the TCP server. +```bash +nc 8888 +``` +See the [PandABlocks-server reference](../reference/opkg.md) for the command +syntax. + +Connect to port 8889 for the data capture stream: + +```bash +nc 8889 +``` + +Press Return; you will see `OK`. After arming PCAP (in the web control or +via port 8888), data streams until you disarm. See +[Tutorial 2](../tutorials/tutorial2_position_capture.md) for a worked example. + +## Python client (`PandABlocks-client`) + +[PandABlocks-client](https://pandablocks.github.io/PandABlocks-client/main/) +provides both a blocking and an asyncio client. + +Install: + +```bash +pip install pandablocks +``` + +### Blocking client + +The [`BlockingClient`](xref:PandABlocks-client#pandablocks.blocking.BlockingClient) +is the simplest entry point: + +```python +from pandablocks.blocking import BlockingClient + +with BlockingClient("my-panda") as client: + responses = client.send(["PCAP.ARM=1"]) +``` + +### Data capture to HDF5 / numpy + +PandABlocks-client includes helpers to read the binary capture stream and +write it to HDF5 or convert it to numpy arrays. See the +[PandABlocks-client documentation](https://pandablocks.github.io/PandABlocks-client/main/) +for the `PcapHdf5Writer` and related utilities. + +## EPICS and Tango via `fastcs-PandABlocks` + +[fastcs-PandABlocks](https://github.com/DiamondLightSource/fastcs-PandABlocks) +wraps PandABlocks-client and exposes all PandA attributes as EPICS PVs or +Tango attributes via the [FastCS](https://github.com/DiamondLightSource/FastCS) +framework. + +Refer to the fastcs-PandABlocks repository for installation and configuration +instructions. diff --git a/docs/how-to/make-release.md b/docs/how-to/make-release.md index dd8fa029..55f76320 100644 --- a/docs/how-to/make-release.md +++ b/docs/how-to/make-release.md @@ -1,11 +1,18 @@ # Make a firmware release -:::{admonition} 🚧 TODO — documentation stub -:class: note +To make a new release, follow this checklist: -This page is a Stage A scaffold stub and has not yet been written. +1. Choose a new [PEP 440](https://peps.python.org/pep-0440/) compliant version + number. +2. Go to the [GitHub releases page](https://github.com/PandABlocks/meta-panda/releases). +3. Click **Draft a New Release**. +4. Click **Choose a tag** and type the new version tag (select **Create new + tag** when prompted). +5. Click **Generate release notes**, review and edit the auto-generated notes. +6. Add a title and click **Publish Release**. -**Status:** writable-now - -**Source:** how-to/make-release.rst — de-dupe vs github.io copy; fix releases link -> meta-panda +:::{note} +Pushing a tag to the `main` branch triggers the same release workflow, but you +will not have the opportunity to edit the release notes before they are +published. ::: diff --git a/docs/how-to/manual-build.md b/docs/how-to/manual-build.md index bc325539..e14829c8 100644 --- a/docs/how-to/manual-build.md +++ b/docs/how-to/manual-build.md @@ -1,11 +1,62 @@ # Manually build the PandA image -:::{admonition} 🚧 TODO — documentation stub -:class: note +:::{note} +This page describes a manual Yocto build without `kas-container`. For the +recommended approach see {doc}`build`. +::: -This page is a Stage A scaffold stub and has not yet been written. +The steps below can be run inside a Docker container (e.g. the `kas` image) if +the Yocto host dependencies are not available on your system. -**Status:** writable-now (post-5.0 branch = blocked: verify) +## Steps -**Source:** tutorials/manual-build.rst — fix manifest URL -> Xilinx/yocto-manifests, branch rel-v2023.2 -::: +1. Initialise the Yocto source tree using `repo` and the Xilinx manifest: + + ```bash + BRANCH="rel-v2023.2" + repo init -u https://github.com/Xilinx/yocto-manifests.git -b $BRANCH + repo sync + ``` + + :::{note} + `rel-v2023.2` is the manifest branch used for current PandA 5.x builds. + + ::: + +2. Load the Yocto build environment, passing the build directory as argument: + + ```bash + . setupsdk build + ``` + +3. Add the `meta-panda` layer: + + ```bash + git clone https://github.com/PandABlocks/meta-panda ../sources/meta-panda + bitbake-layers add-layer ../sources/meta-panda + ``` + +4. In `conf/local.conf` set: + + ```makefile + MACHINE = "pandabox" # or e.g. "xu5-st1" + DISTRO = "panda-petalinux" + ``` + +5. Build the image: + + ```bash + bitbake panda-image + ``` + +6. Collect the output files: + + ```bash + mkdir boot + cp -Lf tmp/deploy/images/pandabox/fitImage-petalinux-initramfs-image-pandabox-pandabox \ + boot/image.ub + cp -f tmp/deploy/images/pandabox/{rootfs.squashfs,boot.bin,boot.scr,target-defs} boot/ + zip boot-pandabox.zip boot/* + ``` + +See {doc}`build` for a description of each output file. diff --git a/docs/how-to/monitor-attribute-values.md b/docs/how-to/monitor-attribute-values.md index e60dae72..90d00d03 100644 --- a/docs/how-to/monitor-attribute-values.md +++ b/docs/how-to/monitor-attribute-values.md @@ -1,11 +1,93 @@ # Monitor attribute values -:::{admonition} 🚧 TODO — documentation stub -:class: note +The web control provides a near-real-time graphical and numerical view of block +attribute values over time. Each attribute can be displayed as a **chart** or a +**table**. -This page is a Stage A scaffold stub and has not yet been written. +## Working with charts -**Status:** writable-now +A chart starts recording when you open it by clicking the information icon next +to an attribute in its block's detail panel. Data is "for information only" — +it represents the attribute's behaviour over the time the chart is open. -**Source:** webcontrol/userguide/monitoring_attribute_values.rst (991w) — reuse screenshots +The web control renders every attribute type as a chart: + +| Attribute format | Plot type | +|---|---| +| Numerical | Continuous scatter plot; attribute value on Y axis, time on X axis | +| Text | Discrete scatter plot; each unique text string on Y axis | +| Boolean | On/off state plot on Y axis | + +### Chart controls + +Hover over the chart to reveal the menu bar: + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/chart_options.png +:align: center + +Chart controls toolbar +``` + +| Control | Description | +|---|---| +| Download Plot as PNG | Save a snapshot of the current chart | +| Edit in Chart Studio | Export data to the [Chart Studio](https://chart-studio.plotly.com/) online tool | +| Zoom | Draw a bounding box to zoom; smaller box = higher zoom; updates pause while zoomed | +| Pan | Pan horizontally or vertically; updates continue while panning | +| Zoom in / out | Auto-zoom centred on the most recent data; updates pause while zoomed | +| Autoscale | Scale the plot to show all data since the chart was opened | +| Home (Reset Axes) | Return to the default scale and resume live updates | +| Toggle Spike Lines | Overlay crosshair guide lines on hover | +| Show closest data on hover | Display the value of the nearest data point to the cursor | +| Compare data on hover | Display all attribute values at the time point under the cursor | + +:::{note} +The **Edit in Chart Studio** option is provided by a third-party service +(Plotly). The PandABlocks project is not responsible for its availability or +support. ::: + +### Chart update behaviour + +- Data is supplied at up to **20 Hz**. +- The on-screen chart updates at **1 Hz**; each update plots all 20 Hz samples + collected in the preceding second. +- Zooming **pauses** automatic chart updates so you can inspect a snapshot. + Automatic updates resume when you return to the default view (Home / Reset + Axes). + +### Exporting a chart + +Click **Download Plot as PNG** in the chart menu bar at any time. The snapshot +is saved to your browser's default downloads folder. + +### Advanced analysis with Chart Studio + +Click **Edit in Chart Studio** to export the current on-screen data to the +Plotly Chart Studio web application. See the +[Chart Studio documentation](https://help.plot.ly/) for its full feature set. + +## Working with numerical tables + +A table presents attribute values in numerical form. Each row records a value +change and shows: + +- The time of the change +- The new attribute value +- The attribute alarm status + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/attribute_value_table.png +:align: center + +Attribute values presented in a numerical table +``` + +The data shown is "for information only" and covers only the time the table has +been open. + +### Table update behaviour + +- Data is supplied at up to **20 Hz**. +- The table updates at **1 Hz**; each update appends all 20 Hz samples from the + preceding second. +- New rows are added at the **bottom** of the table. diff --git a/docs/how-to/packages.md b/docs/how-to/packages.md index 1d90deeb..ad7889c0 100644 --- a/docs/how-to/packages.md +++ b/docs/how-to/packages.md @@ -1,11 +1,24 @@ # Install packages via opkg -:::{admonition} 🚧 TODO — documentation stub -:class: note +PandA uses [opkg](https://openwrt.org/docs/guide-user/additional-software/opkg) +to manage application software. Packages are distributed as `.ipk` files whose +names follow the convention `_.ipk`. -This page is a Stage A scaffold stub and has not yet been written. +## Install via the web admin interface -**Status:** writable-now +1. Place the `.ipk` file(s) on a USB stick. +2. Insert the USB stick into the PandA. +3. Open the web admin interface at `http:///admin/`. +4. Navigate to **Packages → Install Packages from USB**. +5. Browse to the `.ipk` file and click **Install Selected**. -**Source:** how-to/packages.rst -::: +## Install over SSH + +Copy the `.ipk` to the PandA and install it with `opkg`: + +```bash +scp panda-fpga_.ipk root@:/tmp +ssh root@ opkg install /tmp/panda-fpga_.ipk +``` + +Replace `panda-fpga_.ipk` with the actual filename. diff --git a/docs/how-to/quickstart.md b/docs/how-to/quickstart.md index 79610e87..6494bcc9 100644 --- a/docs/how-to/quickstart.md +++ b/docs/how-to/quickstart.md @@ -1,11 +1,111 @@ # How to get a PandA on the network -:::{admonition} 🚧 TODO — documentation stub -:class: note +The SD card inside a PandA contains a `config.txt` file that controls networking +and other boot-time settings. Below is the default file with all options +commented out: -This page is a Stage A scaffold stub and has not yet been written. +```ini +# This file contains configuration settings. In this file network and other +# settings can be adjusted. -**Status:** writable-now +# If ADDRESS and NETMASK are not both specified DHCP will be used instead. +# The ADDRESS field can be set to a four part dotted IP address followed by a +# network mask specification thus: +# +# ADDRESS = 172.23.252.202 +# NETMASK = 255.255.240.0 -**Source:** how-to/quickstart.rst (817w) + rootfs how-to/quickstart.md — merge; fix boot.txt->config.txt; add panda-config.txt USB override; FAQ moves to reference/troubleshooting -::: +# If the ADDRESS field has been set then the GATEWAY and DNS fields should be +# set: +# +# GATEWAY = 172.23.240.254 +# DNS = 172.23.5.13 172.23.4.1 130.246.8.13 + +# Optionally the DNS search domain can be set: +# +# DNS_SEARCH = diamond.ac.uk + +# The NTP server or servers can be specified here: +# +# NTP = 172.23.240.2 172.23.199.1 + +# The machine hostname can be specified here: +# +# HOSTNAME = panda + +# To skip loading any zpackages at startup, either for testing or as an +# override to recover from a faulty zpkg install: +# +# NO_ZPKG +``` + +During startup the network is configured as follows: + +- If `ADDRESS` and `NETMASK` are both set, a static IP is assigned. + Set `GATEWAY` and `DNS` too; `NTP` is optional. +- Otherwise DHCP is attempted. On success it sets IP, gateway, DNS and may + set hostname. If the DHCP server advertises NTP servers those take priority + over the `NTP` key. +- If DHCP fails, ZeroConf is attempted. If that also fails the PandA will not + be reachable on the network. + +In the default (all-commented) configuration the PandA contacts +`0.pool.ntp.org` and pool peers for time. + +## Override file + +If a static IP needs to be set without opening the SD card, use the USB +override mechanism: + +Place a file named `panda-config.txt` on a USB drive and plug the drive into +the PandA **while it is booting**. The PandA will read `panda-config.txt` from +the USB drive instead of `config.txt` from the SD card. + +The override file uses the same format as `config.txt`, for example: + +```ini +ADDRESS = 192.168.0.2 +NETMASK = 255.255.255.0 +GATEWAY = 192.168.0.254 +HOSTNAME = mypanda +``` + +To make the USB settings permanent, use the **Show Network Configuration** +function in the Web Admin interface (described below), which writes the settings +back to `config.txt` on the SD card. + +## Web interface + +Once a PandA is on the network, navigate to its IP address or hostname in a +browser. The home page provides links to: + +- **Home** — summary of the web interface sections +- **Docs** — hardware, firmware and software documentation +- **Control** — the web control; wire functional blocks together, set parameters, + save and load designs (requires the web-control package to be installed) +- **Admin** — install packages from USB, manage SSH keys, and other remote + administration + +## Web Admin + +The Web Admin page provides the following functions: + +- **System** + - Reboot / Restart + - Show `/var/log/messages` + - Show Network Configuration +- **Packages** + - List Installed Packages + - Install Packages from USB + - Install Rootfs from USB +- **SSH Keys** + - Show Authorised SSH Keys + - Append SSH keys from USB + +Visit the relevant Web Admin page for instructions on each operation. + +## Troubleshooting + +See {doc}`../reference/troubleshooting` for answers to common questions such as +configuring a static IP, disabling subnet validation, recovering from a +corrupted SD card, and overriding the FPGA bitstream variant. diff --git a/docs/how-to/test-firmware-changes.md b/docs/how-to/test-firmware-changes.md index 11a2963b..96384fa0 100644 --- a/docs/how-to/test-firmware-changes.md +++ b/docs/how-to/test-firmware-changes.md @@ -1,11 +1,69 @@ -# Test firmware changes +# Test firmware changes on a PandA -:::{admonition} 🚧 TODO — documentation stub -:class: note +This guide covers the workflow for building and deploying server or FPGA +firmware changes to a live PandA for manual testing. -This page is a Stage A scaffold stub and has not yet been written. +## Simulation-mode testing (server) -**Status:** writable-now +Server changes can be unit-tested natively in **simulation mode** — no PandA +required. The only dependencies are `make` and `gcc`. -**Source:** NEW (Interview5 §1-2) — replaces how-to/pandablocks-sdk.rst -::: +```bash +cd PandABlocks-server +make sim +``` + +Simulation mode runs the server against a software model of the block +hardware. See the +[PandABlocks-server documentation](https://github.com/PandABlocks/PandABlocks-server) +for the full test flow. + +## Live testing with `devtool` (server and FPGA) + +To test changes against real hardware, use the Yocto `devtool` workflow inside +the `kas` build container: + +1. Open a shell in the `kas` container (see {doc}`build`). + +2. Use `devtool` to build an updated package in the Yocto workspace: + + ```bash + devtool modify + # make your changes in the workspace source tree + devtool build + devtool build-image panda-image + ``` + +3. Deploy the built `.ipk` to the PandA: + + ```bash + scp tmp/deploy/ipk//.ipk root@:/tmp/ + ssh root@ opkg install /tmp/.ipk + ``` + +4. Restart the relevant service on the PandA: + + ```bash + ssh root@ systemctl restart pandablocks-server + ``` + +5. Test your changes on the live hardware. + +## Deploying a custom FPGA bitstream + +To test a custom FPGA bitstream: + +1. Build the `.ipk` containing the bitstream in + [PandABlocks-FPGA](https://github.com/PandABlocks/PandABlocks-FPGA) + (see the FPGA repo docs). + +2. Install it on the PandA: + + ```bash + scp panda-fpga_.ipk root@:/tmp/ + ssh root@ opkg install /tmp/panda-fpga_.ipk + ``` + +3. Override the active bitstream if needed — see {doc}`choose-fpga-bitstream`. + +4. Reboot the PandA to load the new bitstream. diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md index d5882f44..4347fc9f 100644 --- a/docs/how-to/upgrade-via-ssh.md +++ b/docs/how-to/upgrade-via-ssh.md @@ -1,11 +1,77 @@ # Upgrading a PandA over SSH -:::{admonition} 🚧 TODO — documentation stub -:class: note +SSH access lets you upgrade a PandA without physical access, and is +particularly useful for upgrading multiple PandAs in one scripted pass. -This page is a Stage A scaffold stub and has not yet been written. +## Prerequisites -**Status:** writable-now (gap audit = blocked: verify) +SSH must be authorised on the PandA. You can either: -**Source:** how-to/remote.rst (245w) — keep 24V EEPROM as DLS-only one-time; cover pre-5.0 + post-5.0 +- Place an `authorized_keys` file on the SD card before first boot, or +- Load SSH keys from a USB stick via the Web Admin interface + (**SSH Keys → Append SSH keys from USB**). + +:::{warning} +A PandA has only a single `root` user. Remote operations run as root and can +break the system if commands are wrong — take care. ::: + +## Post-5.0 upgrade (opkg / `.ipk`) + +Download the `boot-{MACHINE}.tar.gz` release archive from +[GitHub Releases](https://github.com/PandABlocks/meta-panda/releases) and +extract it locally. Then copy the files to the PandA and reboot: + +```bash +ssh root@ rm /boot/rootfs.squashfs +scp boot-{MACHINE}/* root@:/boot +ssh root@ sync +``` + +The `/boot` directory on the PandA should contain: + +- `boot.bin` +- `boot.scr` +- `Image` +- `rootfs.squashfs` +- `target-defs` + +Power-cycle the PandA; it will install the new rootfs on next boot. + + + +## Pre-5.0 to 5.x upgrade (zpkg → opkg) + +If your PandA is running a pre-5.0 release (zpkg-based), follow the +web-admin upgrade path first ({doc}`upgrade-via-web-admin`) to move to a +5.x base image before attempting SSH-based updates. + +## Update the 24V FMC EEPROM (DLS-specific, one-time) + +:::{note} +This step applies **only to users of the 24V FMC card produced by Diamond +Light Source**. If you do not have this card you can skip this section +entirely. +::: + +From PandA 3.0 onwards the 24V FMC EEPROM must be populated once with +hardware metadata. This is a permanent, one-time write: + +1. Find the `ipmi_definition.ini` for your 24V FMC card + (in the + [`modules/fmc_24vio/`](https://github.com/PandABlocks/PandABlocks-FPGA/blob/master/modules/fmc_24vio/ipmi_definition.ini) + directory of the FPGA repo). +2. Copy it to the PandA: + + ```bash + scp ipmi_definition.ini root@:/tmp/ + ``` + +3. Write the EEPROM: + + ```bash + ssh root@ /opt/bin/write_eeprom /tmp/ipmi_definition.ini + ``` + + The script reads back the EEPROM after writing to confirm the content + matches. diff --git a/docs/how-to/upgrade-via-web-admin.md b/docs/how-to/upgrade-via-web-admin.md index c8e15acf..8503a1b5 100644 --- a/docs/how-to/upgrade-via-web-admin.md +++ b/docs/how-to/upgrade-via-web-admin.md @@ -1,11 +1,56 @@ # Upgrading a PandA via the web admin interface -:::{admonition} 🚧 TODO — documentation stub -:class: note +The Web Admin interface lets you upgrade a PandA using only a browser and a +USB stick — no SSH or network file transfer required. -This page is a Stage A scaffold stub and has not yet been written. +## Prerequisites -**Status:** partial (legacy zpg filename = blocked: verify) +- Physical access to the PandA (to insert a USB stick). +- The new firmware archive downloaded from + [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases). -**Source:** how-to/web-interface.rst (240w) — + legacy pre-5.0 zpg path + fresh-SD-card install +## Post-5.0 upgrade (opkg / `.ipk`) + +1. Download the `boot-{MACHINE}.tar.gz` archive for your machine type. + There is no need to unzip it. +2. Copy the archive to a USB stick. +3. Insert the USB stick into the USB port on the back of the PandA. +4. Open a browser and navigate to `http:///`. +5. Click **Admin** in the bottom banner. +6. Note the current version shown in the Version section. +7. Under **Admin Commands → Packages**, click **Install Rootfs from USB**. +8. Select your `boot-{MACHINE}.tar.gz` file from the list and follow the + on-screen instructions. + +:::{note} +If you are installing a major rootfs upgrade it is recommended to uninstall +all installed zpkgs/ipkgs **before** upgrading. From PandA v4.0 an option +to do this is offered as part of the rootfs install flow. ::: + +9. Power-cycle the PandA; it will apply the new rootfs on next boot. + +## Pre-5.0 to 5.x upgrade (zpkg → opkg) + +Pre-5.0 PandAs use a legacy zpkg-based firmware format. To upgrade to a +5.x release: + +1. Download the legacy-updater package for your machine type from + [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases). + +2. Copy the updater package to a USB stick. +3. Insert the USB stick and follow the post-5.0 web-admin flow above, + selecting the legacy-updater file instead. + +## Fresh SD card install + +If the PandA cannot be reached over the network or the rootfs is corrupted, +install from a fresh SD card: + +1. Download the `boot-{MACHINE}.tar.gz` archive from + [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases). +2. Extract the archive and copy all files to a freshly formatted SD card + (FAT32). +3. Optionally add a `config.txt` with network settings + (see {doc}`quickstart`). +4. Insert the SD card into the PandA and power on. From 9309f4a159e9cec478db7c793f3802f3f1a0e099 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 13:47:18 +0000 Subject: [PATCH 14/49] =?UTF-8?q?docs:=20Prompt=20D=20=E2=80=94=20referenc?= =?UTF-8?q?e=20quadrant=20(opkg,=20machine-targets,=20glossary,=20troubles?= =?UTF-8?q?hooting)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - opkg: RST→MyST quick-reference table - machine-targets: NEW from Interview6; MACHINE table with PandABrick verify note - glossary: canonical merge of webcontrol + FPGA glossaries using MyST {glossary} directive; Zpkg entry notes legacy status (pre-5.0) - troubleshooting: seeded from quickstart.rst FAQ (7 Qs); boot.txt→config.txt fixed - reference/changes left as stub (blocked: verify — 3.0→4.0 absent) Co-Authored-By: Claude Sonnet 4.6 --- docs/PROGRESS.md | 8 +- docs/reference/glossary.md | 154 ++++++++++++++++++++++++++++-- docs/reference/machine-targets.md | 21 ++-- docs/reference/opkg.md | 21 ++-- docs/reference/troubleshooting.md | 66 ++++++++++++- 5 files changed, 240 insertions(+), 30 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index ce5ba843..4223c42e 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -37,11 +37,11 @@ Page list expanded from `06-source-provenance-map.md`. - ✅ how-to/contribute — content merge from github.io + xref/intersphinx setup documented ## Reference -- ◐ reference/opkg — source: reference/opkg.rst — writable-now +- ✅ reference/opkg — converted from reference/opkg.rst - ⛔ reference/changes — source: github.io migration_guide.rst + release_compatibility.rst — blocked: verify (3.0->4.0) -- ◐ reference/machine-targets — source: NEW (Interview6 §A) — partial (PandABrick = verify) -- ◐ reference/glossary — source: webcontrol glossary.rst + FPGA glossary.rst — writable-now (canonical merge) -- ◐ reference/troubleshooting — source: quickstart.rst FAQ (7 Qs) — writable-now (seed) +- ✅ reference/machine-targets — NEW from Interview6 §A; PandABrick verify noted +- ✅ reference/glossary — canonical merge of webcontrol + FPGA glossaries; MyST {glossary} directive +- ✅ reference/troubleshooting — seeded from quickstart.rst FAQ (7 Qs); boot.txt→config.txt fixed ## Explanations - ◐ explanations/boot-process — source: explanations/boot-process.rst — writable-now diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md index db2217a0..0155f6eb 100644 --- a/docs/reference/glossary.md +++ b/docs/reference/glossary.md @@ -1,11 +1,153 @@ # Glossary -:::{admonition} 🚧 TODO — documentation stub -:class: note +These are commonly used terms across the PandABlocks documentation. +Terms from the web control UI and from the FPGA/firmware layer are merged here +as the canonical reference; all other repos link to this page. -This page is a Stage A scaffold stub and has not yet been written. +```{glossary} -**Status:** writable-now +App + An `.ini` file that specifies the type and number of {term}`Block` instances + to build together into an FPGA image (a {term}`Zpkg` or `.ipk` package + loadable on a PandABlocks device). -**Source:** webcontrol/userguide/glossary.rst (732w) + FPGA reference/glossary.rst — canonical merge; other repos link here -::: +Attribute + A property of a {term}`Block`. Attributes are divided into four categories: + + - {term}`Parameter Attribute` + - {term}`Input Attribute` + - {term}`Output Attribute` + - {term}`Readback Attribute` + +Attribute Group + A logical grouping of related {term}`Attribute` instances within a + {term}`Block`, presented as a collapsible section in the + {term}`Block Information Panel`. + +Block + A piece of FPGA logic (or a software equivalent) that has a number of + {term}`Field` instances and performs specified calculations on each FPGA clock + tick. In the web control UI a Block is the graphical manifestation of a + component within a {term}`Design`, encapsulating its attributes, methods and + connectivity to other blocks. + + Blocks may represent: + + - Input and output controllers (interfaces to the FPGA) + - Configurable clocks + - Logic lookup tables and logic gates + - Soft blocks such as a SEQ, or hardware-connected blocks such as TTLIN + +Block Information Panel + Panel in the web control UI showing the {term}`Attribute` and {term}`Method` + details of the currently selected {term}`Block`. + +Child Block + A {term}`Block` that appears within the {term}`Layout` of a + {term}`Parent Block`. + +Design + The complete technical description of a system: the {term}`Block` instances + it contains, their {term}`Attribute` values, and the {term}`Link` connections + between them. A Design is represented graphically as a {term}`Layout` in the + web interface. + +Design Element + Any {term}`Block`, {term}`Attribute` or {term}`Link` currently in focus + within the {term}`Layout` view. + +Field + An input, output or parameter of a {term}`Block`. + +Flowgraph + Synonym for {term}`Layout` — the graphical representation of a {term}`Design` + showing all {term}`Design Element` connections. + +FMC + [FPGA Mezzanine Card](https://en.wikipedia.org/wiki/FPGA_Mezzanine_Card) — + a standard expansion connector for FPGA carrier boards. Several PandABlocks + FPGA bitstreams target specific FMC cards. + +Input Attribute + An attribute that identifies the value (or stream of values) received into a + {term}`Block` via a {term}`Sink Port`. There is a 1:1 mapping between an + Input Attribute and a Sink Port. + +Input Port + Synonym for {term}`Sink Port`. + +Layout + The graphical representation of a {term}`Design` in the web control, showing + {term}`Block` instances and the {term}`Link` connections between them. + +Link + A connection that transfers data from a {term}`Source Port` on one + {term}`Block` to a {term}`Sink Port` on another. Links can only be made + between ports of the same logical type (e.g. bit→bit, position→position). + +Method + An **action** that can be performed by a {term}`Block`, such as ARM or + DISARM. + +Module + A directory in PandABlocks-FPGA containing {term}`Block` definitions, + logic, simulations and timing files. A module typically contains a single + soft Block definition or a set of hardware Blocks for a particular + {term}`Target Platform`, {term}`SFP` or {term}`FMC` card. + +Output Attribute + An attribute that identifies the value (or stream of values) transmitted via a + {term}`Source Port` out of a {term}`Block`. There is a 1:1 mapping between + an Output Attribute and a Source Port. + +Output Port + Synonym for {term}`Source Port`. + +PandABlocks Device + A Zynq 7030 (or compatible) based device loaded with the PandABlocks firmware, + running the PandABlocks server framework. + +PandABox + A {term}`PandABlocks Device` manufactured jointly by + [Diamond Light Source](https://www.diamond.ac.uk) and + [SOLEIL](https://www.synchrotron-soleil.fr). + Schematics are on [Open Hardware](https://www.ohwr.org/projects/pandabox/wiki). + +Parameter Attribute + An attribute whose value can be set by a user to influence the behaviour of + a {term}`Block`. + +Parent Block + A {term}`Block` that aggregates one or more {term}`Child Block` instances + each performing an activity in support of the parent's functionality. + +Readback Attribute + An attribute whose value is set automatically by the execution environment. + Readback attributes cannot be set manually via the UI. + +Root Block + The outermost entity displayed in the web control UI. Selecting the top-level + {term}`Design` block shows the whole system; navigating into a child presents + that child as the root. + +SFP + [Small Form-factor Pluggable transceiver](https://en.wikipedia.org/wiki/Small_form-factor_pluggable_transceiver) — + a standard optical/electrical interface used on some PandABlocks hardware. + +Sink Port + A port on a {term}`Block` that accepts incoming data. Every Sink Port has a + pre-defined type declared in the Block specification. + +Source Port + A port on a {term}`Block` that transmits data generated within that Block. + Every Source Port has a pre-defined type declared in the Block specification. + +Target Platform + The physical Zynq-based hardware loaded with PandABlocks firmware, such as a + {term}`PandABox` or a Picozed Carrier. + +Zpkg + A specially formatted tar file of built files that can be deployed to a + PandABlocks device (legacy pre-5.0 format; replaced by opkg `.ipk` packages + from release 5.0 onwards). +``` diff --git a/docs/reference/machine-targets.md b/docs/reference/machine-targets.md index 05375231..39ec3ade 100644 --- a/docs/reference/machine-targets.md +++ b/docs/reference/machine-targets.md @@ -1,11 +1,20 @@ # Machine targets -:::{admonition} 🚧 TODO — documentation stub -:class: note +This page lists the valid `MACHINE` values for building a PandA image and +describes the corresponding hardware. Set `MACHINE` in `conf/local.conf` (for +manual builds) or via `KAS_MACHINE` (for kas builds). -This page is a Stage A scaffold stub and has not yet been written. +| MACHINE | Hardware | Notes | +|---|---|---| +| `pandabox` | PandABox (default) | Zynq 7030; joint DLS/SOLEIL hardware; [Open Hardware](https://www.ohwr.org/projects/pandabox/wiki) | +| `xu5-st1` | ZynqMP-based target | — | +| `xu5-s1` | ZynqMP-based target | — | +| `zedboard` | Zedboard | Development/testing platform | +| `pandabrick` | PandABrick | | -**Status:** partial (PandABrick = blocked: verify) - -**Source:** NEW (Interview6 §A) — MACHINE table (pandabox/xu5-s1/xu5-st1/zedboard) + links to hardware-targets +:::{note} +`pandabox` is the default machine built when `KAS_MACHINE` is not set. ::: + +Per-target hardware descriptions (SoC, expansion connectors, FMC slots, +notable capabilities) are in {doc}`../explanations/hardware-targets`. diff --git a/docs/reference/opkg.md b/docs/reference/opkg.md index 25d4d0dc..80f89047 100644 --- a/docs/reference/opkg.md +++ b/docs/reference/opkg.md @@ -1,11 +1,14 @@ # opkg quick reference -:::{admonition} 🚧 TODO — documentation stub -:class: note - -This page is a Stage A scaffold stub and has not yet been written. - -**Status:** writable-now - -**Source:** reference/opkg.rst -::: +[opkg](https://openwrt.org/docs/guide-user/additional-software/opkg) is the +package manager used on PandA. + +| Command | Description | +|---|---| +| `opkg list-installed` | List all installed packages | +| `opkg install ...` | Install or replace named packages | +| `opkg remove ...` | Remove named packages | +| `opkg files ...` | Show files belonging to named packages | +| `opkg help` | Show all available options | + +For a step-by-step guide to installing packages see {doc}`../how-to/packages`. diff --git a/docs/reference/troubleshooting.md b/docs/reference/troubleshooting.md index 70c33a3f..b5f3f6c4 100644 --- a/docs/reference/troubleshooting.md +++ b/docs/reference/troubleshooting.md @@ -1,11 +1,67 @@ # Troubleshooting -:::{admonition} 🚧 TODO — documentation stub -:class: note +## Networking -This page is a Stage A scaffold stub and has not yet been written. +### How do I configure a static IP address? -**Status:** writable-now (seed; some = blocked: verify) +By default PandA uses DHCP. To set a static address, edit `config.txt` on the +SD card and uncomment or add the relevant lines: -**Source:** how-to/quickstart.rst "Frequently Asked Questions" (7 Qs) — seed page; add boot/FMC/upgrade errors +```ini +ADDRESS = 192.168.0.2 +NETMASK = 255.255.255.0 +GATEWAY = 192.168.0.254 +HOSTNAME = mypanda +``` + +See {doc}`../how-to/quickstart` for the full `config.txt` format and the USB +override mechanism (no SD card access required). + +### How do I disable subnet validation in the web control? + +Create an empty file called `no-subnet-validation` under `state/options/` on +the SD card. + +### How do I authorise a public SSH key? + +Add the public key to a file named `authorized_keys` on the SD card, or load +it from a USB stick via **Web Admin → SSH Keys → Append SSH keys from USB**. + +## Boot and recovery + +### How do I recover from a catastrophic configuration change? + +Remove the file `changes.ext4` from the SD card. This discards all +configuration changes and resets the PandA to factory defaults. + +### How do I load the full rootfs to RAM at boot? + +Create an empty file called `to-ram` on the SD card. + +:::{warning} +On some targets (such as ZedBoard) loading to RAM may cause the server to fail +because the driver cannot allocate sufficient DMA buffers. ::: + +### What do I do if the system freezes after loading the FPGA? + +Create an empty file called `no-fpga` on the SD card. The FPGA loader will +skip loading the bitstream, which lets you try alternative bitstreams manually. + +## FPGA bitstream + +### How do I override the FPGA bitstream variant used? + +By default PandA reads the FMC EEPROM and selects the bitstream whose FMC +requirements are satisfied. If no EEPROM is found the `no-fmc` variant is +used. + +To force a specific bitstream, set `APP` in `config.txt`: + +```ini +APP = pandabox-fmc-acq430 +``` + +This takes effect only if the corresponding FPGA variant package is installed. +See {doc}`../how-to/choose-fpga-bitstream` for the full bitstream selection +mechanism. From 6a45024a0e86d15a481ea238377805855c81a9f1 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 13:50:15 +0000 Subject: [PATCH 15/49] =?UTF-8?q?docs:=20Prompt=20D=20=E2=80=94=20explanat?= =?UTF-8?q?ions=20quadrant=20(4=20pages)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - boot-process: RST→MyST; numbered stages + key-files table - architecture: NEW skeleton from Interview1; layers diagram + data-flow ASCII art - web-control-ui-overview: RST→MyST from user_interface_overview.rst; all screenshots reused in-place from _legacy_rst - understanding-attribute-state: 8 states converted; 5 existing PNG icons referenced from _legacy_rst; Processing/Update-Error/Invalid marked as pending Prompt C SVGs (docs/images/attribute-state/) Skipped (blocked/done): hardware-targets (blocked: author), decisions (✅ from Stage A) Co-Authored-By: Claude Sonnet 4.6 --- docs/PROGRESS.md | 12 +- docs/explanations/architecture.md | 68 +++++++++- docs/explanations/boot-process.md | 40 +++++- .../understanding-attribute-state.md | 128 +++++++++++++++++- docs/explanations/web-control-ui-overview.md | 93 ++++++++++++- 5 files changed, 312 insertions(+), 29 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 4223c42e..045fe912 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -44,12 +44,12 @@ Page list expanded from `06-source-provenance-map.md`. - ✅ reference/troubleshooting — seeded from quickstart.rst FAQ (7 Qs); boot.txt→config.txt fixed ## Explanations -- ◐ explanations/boot-process — source: explanations/boot-process.rst — writable-now -- ◐ explanations/architecture — source: NEW (Interview1) — writable-now (skeleton) -- ⛔ explanations/hardware-targets — source: NEW (Interview6 §A) — blocked: author -- ◐ explanations/web-control-ui-overview — source: webcontrol/userguide/user_interface_overview.rst — writable-now -- ◐ explanations/understanding-attribute-state — source: webcontrol/userguide/understanding_attribute_state.rst — writable-now (8 icons via Prompt C) -- ✅ explanations/decisions + decisions/0001,0002,COPYME — kept byte-for-byte from skeleton (ADR migration of 0002-switched-to-pip-skeleton is a later `move` task) +- ✅ explanations/boot-process — converted from explanations/boot-process.rst +- ✅ explanations/architecture — skeleton authored from Interview1; TCP/client/EPICS/data flow +- ⛔ explanations/hardware-targets — blocked: author +- ✅ explanations/web-control-ui-overview — converted from user_interface_overview.rst; screenshots reused +- ✅ explanations/understanding-attribute-state — 8 states described; 5 existing PNG icons referenced from _legacy_rst; 3 missing icons (Processing, Update Error, Invalid) pending Prompt C SVGs +- ✅ explanations/decisions + decisions/0001,0002,COPYME — kept from scaffold (no change) ## Blocked (issues raised) Issues not yet created — Stage B (Prompt B) will create and link them. Blocked pages: diff --git a/docs/explanations/architecture.md b/docs/explanations/architecture.md index 1bbbb470..823b1bcf 100644 --- a/docs/explanations/architecture.md +++ b/docs/explanations/architecture.md @@ -1,11 +1,67 @@ # Architecture -:::{admonition} 🚧 TODO — documentation stub -:class: note +PandABlocks is a framework for building real-time signal processing and data +capture systems on Zynq FPGA hardware. The system has four main layers: -This page is a Stage A scaffold stub and has not yet been written. +## Layers -**Status:** writable-now (skeleton; detail deferrable) +### FPGA firmware (PandABlocks-FPGA) -**Source:** NEW (Interview1; client + fastcs repos) — points out integration options (TCP / Python client / EPICS+Tango) -::: +The FPGA runs a set of functional **blocks** — clock generators, counters, +pulse stretchers, position capture, lookup tables and more. Each block +has typed input and output ports (bit bus, position bus) and a set of +configurable fields. Block definitions live in the +[PandABlocks-FPGA](https://github.com/PandABlocks/PandABlocks-FPGA) repository. + +### Server (PandABlocks-server) + +The PandABlocks server runs on the Zynq ARM and exposes all block fields over +a plain TCP interface on port 8888 (control) and port 8889 (data capture). +The server is the sole point of contact for clients — it translates TCP +commands into register reads/writes to the FPGA. The server lives in +[PandABlocks-server](https://github.com/PandABlocks/PandABlocks-server). + +### Client libraries + +Several client layers build on the TCP interface: + +| Layer | Repo | Use case | +|---|---|---| +| Direct TCP | — | Low-level scripting, quick checks | +| Python client | [PandABlocks-client](https://pandablocks.github.io/PandABlocks-client/main/) | Python applications; preferred for new integrations | +| EPICS / Tango | [fastcs-PandABlocks](https://github.com/DiamondLightSource/fastcs-PandABlocks) | Control-system integrations | + +See {doc}`../how-to/integrate-with-a-panda` for step-by-step instructions. + +### Firmware build (meta-panda) + +The Yocto layer in this repository assembles the firmware image: it pulls the +rootfs, server, FPGA bitstreams and web-control packages together into a +bootable SD card image (see {doc}`../how-to/build`). + +## Data flow + +``` + Detector / instrument hardware + │ + ▼ + ┌──────────────┐ + │ FPGA blocks │ ← bit bus / position bus connections + │ (Zynq PL) │ configured via TCP server + └──────┬───────┘ + │ + ┌──────▼───────┐ port 8888 (control) + │ PandA server│ ─────────────────────────► clients + │ (Zynq PS) │ port 8889 (data stream) + └──────────────┘ +``` + +At trigger the server streams captured data over port 8889 in ASCII or binary +format. Binary frames can be decoded to numpy arrays or written to HDF5 by +PandABlocks-client. + +## Hardware targets + +PandABlocks firmware runs on several Zynq-based hardware platforms — see +{doc}`hardware-targets` for per-target descriptions and +{doc}`../reference/machine-targets` for the `MACHINE` build strings. diff --git a/docs/explanations/boot-process.md b/docs/explanations/boot-process.md index 4b43b41f..776b8a6a 100644 --- a/docs/explanations/boot-process.md +++ b/docs/explanations/boot-process.md @@ -1,11 +1,39 @@ # The boot process -:::{admonition} 🚧 TODO — documentation stub -:class: note +The boot process on a Zynq-based PandA proceeds through five stages: -This page is a Stage A scaffold stub and has not yet been written. +0. **Stage-0 boot loader (hard-wired in Zynq)** + Reads `boot.bin` from the SD card into memory and passes control to the + stage-1 loader. -**Status:** writable-now +1. **Stage-1 boot loader (inside `boot.bin`)** + Loads U-Boot from `boot.bin`. -**Source:** explanations/boot-process.rst -::: +2. **Stage-2 boot loader: U-Boot** + Runs the boot script (`boot.scr`) which locates the FIT image (`image.ub`), + checks its integrity, and boots the Linux kernel. + +3. **Kernel initialisation** + The kernel initialises hardware resources and then unpacks the initramfs + image contained inside the FIT image. The `init` script within the + initramfs is executed. + +4. **Initramfs init script** + Checks the configuration (including network settings from `config.txt`), + prompts for a MAC address if one has not been set, and mounts the main + rootfs image (`rootfs.squashfs`). + +5. **Rootfs init system** + The target system starts by running the init system inside the mounted + rootfs image. PandA services (TCP server, web interface) are started here. + +## Key files on the SD card + +| File | Role | +|---|---| +| `boot.bin` | Stage-0/1 boot loader + U-Boot | +| `boot.scr` | U-Boot boot script | +| `image.ub` | FIT image: kernel + device tree + initramfs | +| `rootfs.squashfs` | Main Linux rootfs | +| `config.txt` | Network and boot configuration (user-editable) | +| `target-defs` | Target-specific configuration functions | diff --git a/docs/explanations/understanding-attribute-state.md b/docs/explanations/understanding-attribute-state.md index 81dfc49d..e46295e1 100644 --- a/docs/explanations/understanding-attribute-state.md +++ b/docs/explanations/understanding-attribute-state.md @@ -1,11 +1,129 @@ # Understanding attribute state -:::{admonition} 🚧 TODO — documentation stub -:class: note +At any given time an attribute can be in one of eight states. State depends on: -This page is a Stage A scaffold stub and has not yet been written. +- The current value of the attribute. +- The pre-defined permissible operating range or threshold for that attribute. +- The workflow the attribute is currently involved in. +- The overall context of the control system. -**Status:** writable-now +State is shown as an icon to the left of the attribute name in the +{term}`Block Information Panel`. -**Source:** webcontrol/userguide/understanding_attribute_state.rst (535w, 8 states) — recreate 8 state icons (Prompt C); no malcolm reference in docs +:::{note} +Prompt C will recreate all eight state icons as SVGs in +`docs/images/attribute-state/`. Until then, existing PNG icons are referenced +from the legacy source tree and missing icons are marked as pending. +::: + +## State reference + +### Normal + +Data is within an acceptable operating threshold or range. For a +{term}`Parameter Attribute` this also means the value has been successfully +committed to the server. + +```{figure} ../_legacy_rst/webcontrol/userguide/images/information_icon.png +:align: center +:width: 32px + +Normal state icon +``` + +### Processing + +Data has been submitted to the server or a retrieval request has been made. +A response is being awaited. + + + +*(Icon — see Prompt C)* + +### Locally Edited + +The value has been changed in the UI but not yet committed to the server. +The local edit has no effect on the running system and will not be saved as +part of the {term}`Design` until it is submitted. + +```{figure} ../_legacy_rst/webcontrol/userguide/images/locally_edited_icon.png +:align: center +:width: 32px + +Locally Edited state icon +``` + +### Update Error + +The value submitted to the server was not accepted — typically because it +failed the validation defined in the Block specification. + + + +*(Icon — see Prompt C)* + +### Warning + +An issue has been detected that requires investigation. Data is outside +normal operating parameters but is still considered acceptable. + +```{figure} ../_legacy_rst/webcontrol/userguide/images/warning_icon.png +:align: center +:width: 32px + +Warning state icon +``` + +### Error + +An issue has been detected and an error has been reported by the server. +Data is outside acceptable operating conditions; immediate action is +recommended. + +```{figure} ../_legacy_rst/webcontrol/userguide/images/error_icon.png +:align: center +:width: 32px + +Error state icon +``` + +### Invalid + +The overall block context has changed since the UI was last accessed. +Displayed data may no longer be accurate or consistent with the current +{term}`Design`. + + + +*(Icon — see Prompt C)* + +### Disconnected + +Communication with the block hosting the attribute has been lost by the +server. Immediate investigation is recommended. + +```{figure} ../_legacy_rst/webcontrol/userguide/images/disconnected_icon.png +:align: center +:width: 32px + +Disconnected state icon +``` + +## Presenting status information + +Within Block Information Panels, the state icon appears to the left of each +attribute name. + +When viewing historical data in the +{doc}`attribute value table <../how-to/monitor-attribute-values>`, +the corresponding icon is shown against each row. + +When viewing historical data in the +{doc}`attribute chart <../how-to/monitor-attribute-values>`, +the line colour reflects the alarm state. + +:::{note} +Operating ranges and threshold values are not defined in the UI — they are +configured in the underlying Block specification and reflected into the UI. +Refer to the specific block documentation for details. ::: diff --git a/docs/explanations/web-control-ui-overview.md b/docs/explanations/web-control-ui-overview.md index 8cbe8c30..99e855da 100644 --- a/docs/explanations/web-control-ui-overview.md +++ b/docs/explanations/web-control-ui-overview.md @@ -1,11 +1,92 @@ -# Web Control UI overview +# Web control UI overview -:::{admonition} 🚧 TODO — documentation stub -:class: note +The web control provides a fully interactive environment for designing, +configuring and managing PandA block connections. -This page is a Stage A scaffold stub and has not yet been written. +## Components -**Status:** writable-now +The interface has four core components whose content changes dynamically +depending on the current activity: -**Source:** webcontrol/userguide/user_interface_overview.rst (1150w) — reuse screenshots +```{figure} ../_legacy_rst/webcontrol/userguide/images/ui_schematic.png +:align: center + +Web control UI components +``` + +| Component | Description | +|---|---| +| **Navigation bar** | Breadcrumb trail showing your current position within the Design, starting from the selected {term}`Root Block`. Use it to move between nested levels. | +| **Left-hand panel** | Information about the {term}`Parent Block` currently in focus. | +| **Central panel** | Details of the selected {term}`Attribute` or the {term}`Layout View` if **Layout** is selected. | +| **Right-hand panel** | Detailed information about the {term}`Block`, {term}`Attribute` or {term}`Link` currently in focus. | + +:::{tip} +- A Block is *always* displayed in the left-hand panel (Parent or Child). +- Attribute metadata is always shown in the right-hand panel. +- Link information is always shown in the right-hand panel. +::: + +## Views + +### Layout view + +The Layout view lets you create, modify and manage the overall {term}`Design`. +Open it by clicking **View** or **Edit** next to the *Layout* attribute on any +Parent Block. + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout-spread-out.png +:align: center + +Example Layout view — PANDA system with CLOCKS block selected +``` + +In this view: + +- Drag blocks to rearrange them; links are re-routed automatically. +- Click **Auto Layout** in the central panel to optimise the arrangement. +- Click a block to load its details in the right-hand panel. + +### Attribute view + +The interface transitions to Attribute view when you select an attribute from +either panel: + +- Selecting from the **left-hand panel** shows more detail about that attribute + in the right-hand panel. +- Selecting from the **right-hand panel** moves the corresponding block to the + left-hand panel as the new focus. + +The **central panel** shows the attribute's value over time as either: + +- **Plot** — an interactive line chart (pan, zoom, export). See + {doc}`../how-to/monitor-attribute-values` for chart controls. +- **Table** — a time-ordered list of value changes. + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/attribute_view_chart.png +:align: center + +Attribute view — example plot for a continuously updated attribute +``` + +:::{note} +In Attribute view the left-hand panel shows the selected block (e.g. "Input +Encoder 1"), not the top-level Parent Block. ::: + +## Panel popping + +In complex designs you may want to monitor several blocks at once. Click the +pop icon in the top-left corner of any Block Information Panel to open it in +its own independent window. Multiple panels can be popped simultaneously. + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/window_popping_output.svg +:align: center + +Three Child Blocks (CLOCKS, COUNTER1, BITS) popped into independent windows +alongside the PANDA Layout +``` + +Each independent window stays live — attribute updates are reflected in real +time, and any edits you make are sent back to the PandA just as they would be +from the integrated panel. From de18f5300bba66fb74fda370ebdf87b8af536185 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 16:00:25 +0000 Subject: [PATCH 16/49] docs: convert working_with_a_design into use-web-control + save-restore-design Split webcontrol/userguide/working_with_a_design.rst (Prompt E) into: - how-to/use-web-control-to-set-up-a-panda (the bulk; attribute widgets folded in) - how-to/save-restore-design (Saving a Design + Opening an Existing Design) The four attribute-widget subsections (View/Edit, Dropdown, Text Input, Checkbox) and the truncated trailing sentence are kept as a blocked: capture stub with its issue placeholder, pending new screenshots. Co-Authored-By: Claude Opus 4.8 --- docs/PROGRESS.md | 4 +- docs/how-to/save-restore-design.md | 61 ++- .../use-web-control-to-set-up-a-panda.md | 422 +++++++++++++++++- 3 files changed, 475 insertions(+), 12 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 045fe912..386aaa45 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -28,8 +28,8 @@ Page list expanded from `06-source-provenance-map.md`. - ✅ how-to/packages — source: how-to/packages.rst — converted - ✅ how-to/upgrade-via-ssh — source: how-to/remote.rst — pre-5.0 + post-5.0 covered; 24V EEPROM DLS-only noted; gap audit verify noted - ✅ how-to/upgrade-via-web-admin — source: how-to/web-interface.rst — pre-5.0 zpg path + fresh SD card install added; zpg filename verify noted -- ◐ how-to/use-web-control-to-set-up-a-panda — source: webcontrol/userguide/working_with_a_design.rst — SKIP (Prompt E) -- ◐ how-to/save-restore-design — source: working_with_a_design.rst (Saving/Opening) — SKIP (Prompt E split) +- ✅ how-to/use-web-control-to-set-up-a-panda — source: webcontrol/userguide/working_with_a_design.rst — converted (Prompt E); attribute widgets folded in; 4 widget subsections (View/Edit, Dropdown, Text Input, Checkbox) + trailing sentence kept as blocked: capture stub w/ issue link +- ✅ how-to/save-restore-design — source: working_with_a_design.rst (Saving/Opening) — split out (Prompt E); Saving a Design + Opening an Existing Design - ✅ how-to/monitor-attribute-values — source: webcontrol/userguide/monitoring_attribute_values.rst — converted - ✅ how-to/integrate-with-a-panda — source: NEW (Interview5; client + fastcs) — skeleton written; xref probe preserved - ✅ how-to/test-firmware-changes — source: NEW (Interview5 §1-2) — authored diff --git a/docs/how-to/save-restore-design.md b/docs/how-to/save-restore-design.md index 749ea2c2..1e37ec0c 100644 --- a/docs/how-to/save-restore-design.md +++ b/docs/how-to/save-restore-design.md @@ -1,11 +1,62 @@ # Save and restore a design -:::{admonition} 🚧 TODO — documentation stub -:class: note +A {term}`Design` can be saved to a {term}`Parent Block` and reopened later. This +page covers saving the current design and opening an existing one. To build or +edit a design, see +{doc}`use-web-control-to-set-up-a-panda`. -This page is a Stage A scaffold stub and has not yet been written. +:::{tip} +Saving a design saves only attributes already in the **server** state — locally +modified fields are not saved. See +[Local vs. server attribute state](use-web-control-to-set-up-a-panda.md#local-vs-server-attribute-state). +::: + +## Save a design + +You can save your design at any time during creation or modification, and we +recommend you do so regularly. + +1. Navigate to the {term}`Root Block` representing the highest level of the + design you wish to save. +2. Navigate to the *Save* attribute group at the bottom of the left-hand panel. + Expand it if necessary. +3. Enter a descriptive name for the design in the *Design* field. This name is + used later to identify the design. + + :::{tip} + To save the design with the same name as the currently open design, leave the + *Filename* field blank. + ::: + +4. Select the **Save** button. The information icon to the left of the button + spins while the save is in progress, returning to the information icon when + the design is saved. + +:::{note} +If an error is detected during the save, a red warning icon is displayed next to +the button. +::: + +## Open an existing design + +A {term}`Parent Block` may hold multiple {term}`Design`s, each reflecting +operation of that block in a different scenario. Only one design can be in use at +any given time; by default this is the design open at the time of system +execution. + +When a parent block is opened, a list of all its designs is available via the +*Design* attribute in the left-hand panel. Selecting an existing design presents +it in the central Layout panel. + +To open an existing design: -**Status:** writable-now +1. Navigate to the {term}`Parent Block` representing the highest level of the + system you wish to use. +2. Navigate to the *Design* attribute and select the dropdown arrow to display + the list of available designs. +3. Select the design you wish to use. +4. Select the **View/Edit** button on the *Layout* attribute. -**Source:** webcontrol/userguide/working_with_a_design.rst (Saving a Design, Opening an Existing Design) — reuse screenshots +:::{tip} +If no previously saved designs exist, the *Design* attribute list is empty. ::: diff --git a/docs/how-to/use-web-control-to-set-up-a-panda.md b/docs/how-to/use-web-control-to-set-up-a-panda.md index 812ea6af..c665d61f 100644 --- a/docs/how-to/use-web-control-to-set-up-a-panda.md +++ b/docs/how-to/use-web-control-to-set-up-a-panda.md @@ -1,11 +1,423 @@ # Use Web Control to set up a PandA -:::{admonition} 🚧 TODO — documentation stub -:class: note +A {term}`Design` is the heart of your system implementation. It is an +interactive graphical representation of your system that helps you build and +manage: -This page is a Stage A scaffold stub and has not yet been written. +- {term}`Block`s representing hardware components, logic gates, etc. +- The {term}`Link` connectivity between blocks, in terms of input + ({term}`Sink Port`) and output ({term}`Source Port`) ports. +- The {term}`Attribute`s associated with blocks and links. +- The {term}`Method`s available to influence behaviour within blocks. -**Status:** writable-now (4 widget screenshots + trailing sentence = blocked: capture) +A Design is created in the Web Control **Layout** view. -**Source:** webcontrol/userguide/working_with_a_design.rst (4882w) — folds attribute widgets (View/Edit, Dropdown, Text Input, Checkbox) +## Add a block to a design + +A block is added to a design by dragging it from the Block Palette into the +Layout view: + +1. Select the **Palette** icon at the bottom of the Layout panel. The Block + Palette opens, containing the set of blocks currently available to you. +2. Identify the block you wish to add. Hovering over it changes the mouse + pointer from an arrow to a hand. +3. Press and hold the left mouse button to select the block, then drag it into + the Layout panel. +4. Release the mouse button at the desired location. + +The Block Palette icon is replaced by a full representation of the selected +block, showing: + +- The block name (shown relative to its {term}`Parent Block`). +- An optional, configurable descriptive label (initially default text). +- {term}`Source Port`s that transmit output from the block, including their + type. +- {term}`Sink Port`s that receive input to the block, including their type. + +After adding a block, select it by hovering over it and clicking the left mouse +button. On selection, the {term}`Block Information Panel` listing every +attribute and method available to that block is shown in the right-hand panel. + +:::{note} +On initially adding a new block to your design it is configured according to +its pre-defined default settings, retrieved from the underlying design +specification of that block. +::: + +## Remove a block from a design + +A block can be removed in one of two ways: + +- **By dragging it to the Bin:** + 1. Select the block by hovering over it and clicking the left mouse button. A + **Bin** icon appears at the bottom of the Layout panel. + 2. Holding down the left mouse button, drag the block over the **Bin** icon. + The icon is highlighted. + 3. Release the left mouse button. +- **By pressing Delete or Backspace:** + 1. Select the block by hovering over it and clicking the left mouse button. + The selected block is highlighted. + 2. Press the *Delete* or *Backspace* key. + +:::{note} +Removing a block automatically removes all {term}`Source Port` and +{term}`Sink Port` links associated with it. +::: + +## Work with the Block Palette + +The Block Palette lists each block available to a design, based on the +constraints imposed by the underlying hardware. + +When a block is selected from the palette for inclusion in a design it is +removed from the palette, so it cannot be included more than once. If all blocks +of a particular type have been added to a design, no more can be added because +the underlying hardware cannot represent them. + +If a block is removed from a design it immediately becomes available again in +the Block Palette. + +## Specify block attributes + +The behaviour of a block is defined via its {term}`Attribute`s. Attributes are +pre-defined based on the function of the block and may carry default values as a +starting point for later customisation. A full list of the attributes for each +block is given in the documentation for that block. + +### Types of attribute + +Four types of attribute are available; a block may support zero or more +depending on its purpose: + +| Type | Description | +|---|---| +| {term}`Input Attribute` | Identifies the source of data received into a block via a {term}`Sink Port` of the same name. | +| {term}`Output Attribute` | Identifies the value (or stream of values) transmitted out of a block via a {term}`Source Port` of the same name. | +| {term}`Parameter Attribute` | Can be set by a user while configuring a block, influencing the block's behaviour. | +| {term}`Readback Attribute` | Set automatically by a process in the execution environment. Cannot be set manually via the UI. | + +Attributes whose value can be set at design time are denoted by a highlight +below the attribute value field. + +### Obtain information about an attribute + +Select the information icon next to an attribute in the +{term}`Block Information Panel` to open the Attribute Information Panel in the +right-hand panel. It displays: + +- The fully qualified path to the attribute, uniquely identifying it within the + design. +- Basic metadata: its type, a brief description, and whether it is writeable. +- The {doc}`attribute state <../explanations/understanding-attribute-state>`, + including the severity of any issue and any corresponding message. +- Timestamp details showing when the attribute was last updated. + +Attribute metadata and alarm-state information is derived from the underlying +block specification. + +### Set a block attribute + +Parameter, Input and Output attributes are set via the +{term}`Block Information Panel` of the block you wish to configure. The way an +attribute is set reflects its definition in the underlying block specification, +and this also hints at whether the attribute is editable. The UI provides four +input widgets — View/Edit button, Dropdown list, Text input, and Checkbox. + +:::{admonition} 🚧 TODO — attribute input widgets (blocked: capture) +:class: warning + +The four attribute input widgets (**View/Edit button**, **Dropdown list**, +**Text input** and **Checkbox**) need fresh screenshots before this subsection +can be written, and the source text for *Text input* is truncated mid-sentence +in the original. A GitHub issue covering the widget screenshots and the +trailing sentence will be created in Stage B (Prompt B) and linked here. + +In brief, until then: + +- **View/Edit button** — opens a {ref}`complex attribute ` + in the central panel; reads *Edit* if modifiable, *View* otherwise. +- **Dropdown list** — select a value from a list of pre-defined options valid + for the attribute in its current block context. +- **Text input** — a free-text field accepting any alphanumeric string; press + *Enter* to submit. +- **Checkbox** — switches the attribute's action on or off; an empty checkbox + means *off*. +::: + +:::{tip} +An attribute may hold a value that cannot be modified in the context of the +current design. Such attributes are shown greyed out. +::: + +To configure an attribute: + +1. Select the block by clicking it in the Layout panel. The block is highlighted + and its {term}`Block Information Panel` opens on the right. +2. Find the attribute you wish to configure. +3. Edit the attribute value field as appropriate for the widget described above. + +:::{note} +No data-type validation is performed on manually entered values in the UI. +Validation is performed by the backend server on receipt. If an invalid format +is detected, a [Warning](../explanations/understanding-attribute-state.md) icon +is shown. +::: + +While a new value is being submitted, a +[Processing](../explanations/understanding-attribute-state.md) (spinning) icon +is displayed to the left of the modified attribute — see +[Attribute change lifecycle](#attribute-change-lifecycle). On success the icon +reverts to the information icon; on failure an +[Update Error](../explanations/understanding-attribute-state.md) icon is shown. + +### Export attributes + +The UI presents a hierarchical view of the system, with one or more +{term}`Parent Block`s encapsulating deeper levels of your design. By default, +at the top level you see only attributes of parent blocks — but an underlying +attribute in a {term}`Child Block` may influence its parent's behaviour. Every +parent block can therefore **Export** one or more attributes from its children +so they are displayed within the parent. + +To specify an attribute for export: + +1. Identify the attribute you wish to monitor outside the current layout level. + Note its source, in the form `BlockName.Attribute`. +2. In the parent block, select the **View** option on the *Exports* attribute. +3. In the Export Table, select the first blank row (or add a new row). +4. In the **Source** column, use the dropdown to find the attribute to export. +5. In the **Export** column, enter the name to display when exported. Leave it + blank to use the attribute's default name. User-specified display names must + be in `camelCase`, e.g. *myAttribute*. + +:::{note} +The `camelCase` convention is required so an appropriate attribute label can be +generated in the parent {term}`Block Information Panel`. +::: + +Once exported, the attribute appears in the *Exported Attributes* section of the +parent's {term}`Block Information Panel`. Any number of attributes can be +exported from child blocks. Their order mirrors the order in which they were +added; to reorder, or to insert above/below an existing entry, use the +**Insert row above**, **Insert row below**, **Move Up** and **Move Down** +options in the Export Table. + +To remove an exported attribute, open the parent's *Export* attribute, +select the information icon for the relevant row, and choose **Delete** on the +**Delete row** field. + +To apply your changes, select **Submit** at the bottom of the Export Table, then +refresh the parent block to confirm the attributes have been promoted (or +removed). Select **Discard Changes** at any time to abandon edits without +affecting the recorded specification. + +### Local vs. server attribute state + +The physical hardware is configured from the design specification behind the +graphical representation. A change takes effect in hardware only when it is +submitted and recorded. It is therefore important to understand the difference +between *local* and *server* attribute state, particularly for +{term}`Parameter Attribute`s that can be modified directly in the UI. + +- **Local** state is a parameter attribute that has been modified in the UI but + not yet submitted. It has no effect on hardware. Locally modified attributes + show the *edit* icon next to the attribute name. An attribute enters local + state as soon as its value is changed and remains there until *Enter* is + pressed to submit. If the server reports an error, the attribute stays in + local state until the issue is resolved. +- **Server** state means the value has been recorded to the information server + hosting the design specification. Server-state attributes are reflected in + hardware and show the *information* icon. + +:::{tip} +Do not confuse local/server attribute state with a *saved* design. +[Saving a design](save-restore-design.md) saves only attributes already in the +**server** state; locally modified fields are not saved. Equally, a +server-state attribute is not stored permanently until the overall design is +saved. ::: + +(attribute-change-lifecycle)= +### Attribute change lifecycle + +Recording a modified attribute value is referred to as a *put* action. Once the +put completes, the value takes immediate effect on any executing processes. If +an error is detected during the put it is abandoned and reported back to the UI. + +The round trip from submission to use takes a small but non-deterministic time +while data is transferred, validated and recorded, so attribute modification is +not atomic. During this time the +[Processing](../explanations/understanding-attribute-state.md) (spinning) icon +replaces the information icon; its reversion is the only reliable indication +that the value has been recorded and is now in use. + +```{figure} ../_legacy_rst/webcontrol/userguide/images/attribute_lifecycle.svg +:align: center + +Attribute change lifecycle workflow +``` + +:::{tip} +Remember the three rules of attribute change: + +- Changing an attribute value in the UI has no effect on the physical system + until it has been *put*. +- Once the put completes, the change takes immediate effect. +- Changes are not stored permanently unless the design is + [saved](save-restore-design.md); only *put* values are recorded in the saved + design. +::: + +(complex-attributes)= +## Complex attributes + +An attribute may itself represent a collection of values that together define +the overall attribute. For example, the Sequencer block contains a single +attribute defining the sequence of steps performed by hardware when controlling +motor motion. + +These values are presented as an Attribute Table, generated dynamically from the +attribute's specification within its block. For details of a specific table, +refer to the technical documentation of its block. + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/attribute_table.png +:align: center + +Example Attribute Table associated with a complex attribute +``` + +### Identify table attributes + +A table attribute is identified by the **View/Edit** button associated with it. +Selecting the button opens the Attribute Table in the central panel. + +### Specify attribute table content + +On opening an Attribute Table you can define values, which (like attributes +themselves) may be selected from a list, enable/disable options, or text and +numerical inputs. After adding values, select **Submit** at the bottom of the +table to record them, or **Discard Changes** to abandon edits. + +### Static vs. dynamic attribute tables + +- **Static** tables have a fixed number of columns and rows; all fields must be + completed to fully define the attribute. +- **Dynamic** tables have a fixed number of columns but a varying number of + rows. At least one row must be present. + +New rows are added in one of two ways: + +- Select **Add** below the last row to append a new row. +- If row order matters (for example, a sequence of activities), select the edit + icon on an existing row (or the information icon on a new row) and use + **Insert row above**, **Insert row below**, **Move Up** or **Move Down**. + +To remove a row, select the information icon on the row and choose **Delete** on +the **Delete row** field. + +## Work with block methods + +While {term}`Attribute`s define a block's *behaviour*, {term}`Method`s define +the *actions* it can perform. A method is represented as a button labelled with +the action it performs, executed only when the button is pressed. + +A method may require input parameters. For example, the *Save* method on a +{term}`Parent Block` requires the name of the file to save the design to. Method +parameters: + +- Can be edited directly in the {term}`Block Information Panel`. +- Exist in *local* state until the method's button is pressed. +- Are properties of their method rather than entities in their own right; they + are never recorded on the server or saved in the persistent design. + +A full list of each block's methods and their parameters is in the documentation +for that block. + +### Obtain information about method execution + +Selecting the information icon on a method displays two sources of information: + +- The right-hand panel describes the method's purpose and required parameters. +- The central panel shows a log of each method execution in the current session, + including submission and completion times, the completion status (e.g. success + or failure), and any alarms. Selecting a parameter name in the table header + opens information about that parameter in the right-hand panel. + +## Block ports + +Blocks may *receive* input via one or more {term}`Sink Port`s and *transmit* +output via one or more {term}`Source Port`s. A block's ports are listed in its +documentation. Ports are colour-coded by the type of information they carry: + +| Port type | Key | +|---|---| +| Boolean | Blue | +| Int32 | Orange | +| Motor | Pink | +| NDArray | Brown | + +Information is transferred from a source port to a sink port via a +{term}`Link` — see [Linking blocks](#linking-blocks) below. + +(linking-blocks)= +## Link blocks + +Blocks are connected via {term}`Link`s. A link joins a {term}`Source Port` on +one block to a {term}`Sink Port` on another; both ports must be of the same +type. A block's ports and their specification are defined in its documentation. + +### Create a block link + +1. Hover over the {term}`Source Port` or {term}`Sink Port` at one terminus of + the link. The port is temporarily highlighted. +2. Press and hold the left mouse button and drag the link to the port at the + other terminus. The target port is temporarily highlighted. +3. Release the mouse button. If the link constraints below are respected, the + link is displayed in the Layout. + +```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-new-link.png +:align: center + +Creating a link between two blocks +``` + +:::{note} +If an error occurs during creation, details are displayed at the bottom of the +Layout panel. +::: + +:::{tip} +To confirm a link was created correctly, click it. The link is highlighted and +the Link Information Panel opens, showing the {term}`Source Port` and +{term}`Sink Port` names. +::: + +### Interrogate link attributes + +A link has no attributes of its own, but selecting it shows information about its +{term}`Source Port` origin and {term}`Sink Port` target in the right-hand panel: + +1. Hover over the link. It changes colour to denote it may be selected. +2. Click the left mouse button. The Link Information Panel opens on the right. + +:::{caution} +You can modify the source and sink of a link from the Link Information Panel. Do +so cautiously — this changes how blocks are connected without any acknowledgement +that a change has occurred. +::: + +### Remove a link + +- **By pressing Delete or Backspace:** hover over the link, click to select it, + then press *Delete* or *Backspace*. +- **Via the Link Information Panel:** select the link, then choose **Delete** in + the Link Information Panel. + +### Constraints when using links + +- A {term}`Sink Port` can accept only a single link. +- Multiple links can originate from a {term}`Source Port`, connecting it to + multiple blocks. +- Links can connect only a {term}`Source Port` and {term}`Sink Port` of the same + logical type (e.g. boolean, int32). Port types are colour-coded in the Layout + to aid identification. From bfec7c92d281a66bd9fc4693b72911e85782c616 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 11 Jun 2026 16:03:19 +0000 Subject: [PATCH 17/49] docs: fix glossary to use MyST definition-list syntax The {glossary} directive requires definition-list children: each term on its own line followed by a ': ' definition. The page used RST-style indented definitions (no colon), so no terms registered and every {term} reference failed repo-wide (32 'Unexpected node as a child of a glossary' errors). Convert all entries to the colon form and fix the stale {term}`Layout View` reference in web-control-ui-overview (the term is 'Layout'). Co-Authored-By: Claude Opus 4.8 --- docs/explanations/web-control-ui-overview.md | 2 +- docs/reference/glossary.md | 61 ++++++++++---------- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/docs/explanations/web-control-ui-overview.md b/docs/explanations/web-control-ui-overview.md index 99e855da..467e39d8 100644 --- a/docs/explanations/web-control-ui-overview.md +++ b/docs/explanations/web-control-ui-overview.md @@ -18,7 +18,7 @@ Web control UI components |---|---| | **Navigation bar** | Breadcrumb trail showing your current position within the Design, starting from the selected {term}`Root Block`. Use it to move between nested levels. | | **Left-hand panel** | Information about the {term}`Parent Block` currently in focus. | -| **Central panel** | Details of the selected {term}`Attribute` or the {term}`Layout View` if **Layout** is selected. | +| **Central panel** | Details of the selected {term}`Attribute` or the {term}`Layout` view if **Layout** is selected. | | **Right-hand panel** | Detailed information about the {term}`Block`, {term}`Attribute` or {term}`Link` currently in focus. | :::{tip} diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md index 0155f6eb..a416bc4c 100644 --- a/docs/reference/glossary.md +++ b/docs/reference/glossary.md @@ -5,14 +5,13 @@ Terms from the web control UI and from the FPGA/firmware layer are merged here as the canonical reference; all other repos link to this page. ```{glossary} - App - An `.ini` file that specifies the type and number of {term}`Block` instances +: An `.ini` file that specifies the type and number of {term}`Block` instances to build together into an FPGA image (a {term}`Zpkg` or `.ipk` package loadable on a PandABlocks device). Attribute - A property of a {term}`Block`. Attributes are divided into four categories: +: A property of a {term}`Block`. Attributes are divided into four categories: - {term}`Parameter Attribute` - {term}`Input Attribute` @@ -20,12 +19,12 @@ Attribute - {term}`Readback Attribute` Attribute Group - A logical grouping of related {term}`Attribute` instances within a +: A logical grouping of related {term}`Attribute` instances within a {term}`Block`, presented as a collapsible section in the {term}`Block Information Panel`. Block - A piece of FPGA logic (or a software equivalent) that has a number of +: A piece of FPGA logic (or a software equivalent) that has a number of {term}`Field` instances and performs specified calculations on each FPGA clock tick. In the web control UI a Block is the graphical manifestation of a component within a {term}`Design`, encapsulating its attributes, methods and @@ -39,115 +38,115 @@ Block - Soft blocks such as a SEQ, or hardware-connected blocks such as TTLIN Block Information Panel - Panel in the web control UI showing the {term}`Attribute` and {term}`Method` +: Panel in the web control UI showing the {term}`Attribute` and {term}`Method` details of the currently selected {term}`Block`. Child Block - A {term}`Block` that appears within the {term}`Layout` of a +: A {term}`Block` that appears within the {term}`Layout` of a {term}`Parent Block`. Design - The complete technical description of a system: the {term}`Block` instances +: The complete technical description of a system: the {term}`Block` instances it contains, their {term}`Attribute` values, and the {term}`Link` connections between them. A Design is represented graphically as a {term}`Layout` in the web interface. Design Element - Any {term}`Block`, {term}`Attribute` or {term}`Link` currently in focus +: Any {term}`Block`, {term}`Attribute` or {term}`Link` currently in focus within the {term}`Layout` view. Field - An input, output or parameter of a {term}`Block`. +: An input, output or parameter of a {term}`Block`. Flowgraph - Synonym for {term}`Layout` — the graphical representation of a {term}`Design` +: Synonym for {term}`Layout` — the graphical representation of a {term}`Design` showing all {term}`Design Element` connections. FMC - [FPGA Mezzanine Card](https://en.wikipedia.org/wiki/FPGA_Mezzanine_Card) — +: [FPGA Mezzanine Card](https://en.wikipedia.org/wiki/FPGA_Mezzanine_Card) — a standard expansion connector for FPGA carrier boards. Several PandABlocks FPGA bitstreams target specific FMC cards. Input Attribute - An attribute that identifies the value (or stream of values) received into a +: An attribute that identifies the value (or stream of values) received into a {term}`Block` via a {term}`Sink Port`. There is a 1:1 mapping between an Input Attribute and a Sink Port. Input Port - Synonym for {term}`Sink Port`. +: Synonym for {term}`Sink Port`. Layout - The graphical representation of a {term}`Design` in the web control, showing +: The graphical representation of a {term}`Design` in the web control, showing {term}`Block` instances and the {term}`Link` connections between them. Link - A connection that transfers data from a {term}`Source Port` on one +: A connection that transfers data from a {term}`Source Port` on one {term}`Block` to a {term}`Sink Port` on another. Links can only be made between ports of the same logical type (e.g. bit→bit, position→position). Method - An **action** that can be performed by a {term}`Block`, such as ARM or +: An **action** that can be performed by a {term}`Block`, such as ARM or DISARM. Module - A directory in PandABlocks-FPGA containing {term}`Block` definitions, +: A directory in PandABlocks-FPGA containing {term}`Block` definitions, logic, simulations and timing files. A module typically contains a single soft Block definition or a set of hardware Blocks for a particular {term}`Target Platform`, {term}`SFP` or {term}`FMC` card. Output Attribute - An attribute that identifies the value (or stream of values) transmitted via a +: An attribute that identifies the value (or stream of values) transmitted via a {term}`Source Port` out of a {term}`Block`. There is a 1:1 mapping between an Output Attribute and a Source Port. Output Port - Synonym for {term}`Source Port`. +: Synonym for {term}`Source Port`. PandABlocks Device - A Zynq 7030 (or compatible) based device loaded with the PandABlocks firmware, +: A Zynq 7030 (or compatible) based device loaded with the PandABlocks firmware, running the PandABlocks server framework. PandABox - A {term}`PandABlocks Device` manufactured jointly by +: A {term}`PandABlocks Device` manufactured jointly by [Diamond Light Source](https://www.diamond.ac.uk) and [SOLEIL](https://www.synchrotron-soleil.fr). Schematics are on [Open Hardware](https://www.ohwr.org/projects/pandabox/wiki). Parameter Attribute - An attribute whose value can be set by a user to influence the behaviour of +: An attribute whose value can be set by a user to influence the behaviour of a {term}`Block`. Parent Block - A {term}`Block` that aggregates one or more {term}`Child Block` instances +: A {term}`Block` that aggregates one or more {term}`Child Block` instances each performing an activity in support of the parent's functionality. Readback Attribute - An attribute whose value is set automatically by the execution environment. +: An attribute whose value is set automatically by the execution environment. Readback attributes cannot be set manually via the UI. Root Block - The outermost entity displayed in the web control UI. Selecting the top-level +: The outermost entity displayed in the web control UI. Selecting the top-level {term}`Design` block shows the whole system; navigating into a child presents that child as the root. SFP - [Small Form-factor Pluggable transceiver](https://en.wikipedia.org/wiki/Small_form-factor_pluggable_transceiver) — +: [Small Form-factor Pluggable transceiver](https://en.wikipedia.org/wiki/Small_form-factor_pluggable_transceiver) — a standard optical/electrical interface used on some PandABlocks hardware. Sink Port - A port on a {term}`Block` that accepts incoming data. Every Sink Port has a +: A port on a {term}`Block` that accepts incoming data. Every Sink Port has a pre-defined type declared in the Block specification. Source Port - A port on a {term}`Block` that transmits data generated within that Block. +: A port on a {term}`Block` that transmits data generated within that Block. Every Source Port has a pre-defined type declared in the Block specification. Target Platform - The physical Zynq-based hardware loaded with PandABlocks firmware, such as a +: The physical Zynq-based hardware loaded with PandABlocks firmware, such as a {term}`PandABox` or a Picozed Carrier. Zpkg - A specially formatted tar file of built files that can be deployed to a +: A specially formatted tar file of built files that can be deployed to a PandABlocks device (legacy pre-5.0 format; replaced by opkg `.ipk` packages from release 5.0 onwards). ``` From 3864506e6a24384345384681fb95341885e7b012 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Fri, 12 Jun 2026 09:08:40 +0000 Subject: [PATCH 18/49] docs: apply fresh-eyes review fixes and live-UI corrections - README: add PandABlocks-level framing before the Yocto-layer intro - myst.yml: band the how-to TOC (use / administer / develop) - machine-targets: ground-truth against conf/machine/ (drop xu5-s1, add pandabox2); mark xu5-st1/zedboard development-only - web-control pages: trim to live UI (port colours Boolean/Int32 only, single Save method, "Design Name" field); copy 19 images out of _legacy_rst into docs/images/webcontrol/ and repoint all references - upgrade-via-ssh: Image -> image.ub; integrate: fix opkg link - tutorial 1: CLOCKS -> CLOCK1; tutorials: quickstart signposts - glossary: App entry leads with .ipk, zpkg demoted to legacy - understanding-attribute-state: replace runbook jargon placeholders Co-Authored-By: Claude Opus 4.8 --- README.md | 15 ++++++++-- .../understanding-attribute-state.md | 27 +++++++++--------- docs/explanations/web-control-ui-overview.md | 8 +++--- docs/how-to/contribute.md | 9 +++--- docs/how-to/integrate-with-a-panda.md | 6 ++-- docs/how-to/monitor-attribute-values.md | 4 +-- docs/how-to/save-restore-design.md | 6 ++-- docs/how-to/upgrade-via-ssh.md | 2 +- .../use-web-control-to-set-up-a-panda.md | 17 ++++------- .../images/webcontrol/PANDA-block-details.png | Bin 0 -> 46427 bytes .../webcontrol/PANDA-layout-spread-out.png | Bin 0 -> 130071 bytes docs/images/webcontrol/PANDA-layout.png | Bin 0 -> 63651 bytes docs/images/webcontrol/PANDA-new-link.png | Bin 0 -> 132392 bytes .../images/webcontrol/attribute_lifecycle.svg | 2 ++ docs/images/webcontrol/attribute_table.png | Bin 0 -> 86615 bytes .../webcontrol/attribute_value_table.png | Bin 0 -> 98486 bytes .../webcontrol/attribute_view_chart.png | Bin 0 -> 77665 bytes docs/images/webcontrol/block-list.png | Bin 0 -> 50536 bytes docs/images/webcontrol/chart_options.png | Bin 0 -> 2930 bytes docs/images/webcontrol/disconnected_icon.png | Bin 0 -> 8660 bytes docs/images/webcontrol/error_icon.png | Bin 0 -> 4927 bytes docs/images/webcontrol/information_icon.png | Bin 0 -> 7431 bytes docs/images/webcontrol/layout-button.png | Bin 0 -> 2259 bytes .../images/webcontrol/locally_edited_icon.png | Bin 0 -> 1629 bytes docs/images/webcontrol/starting-ui.png | Bin 0 -> 22283 bytes docs/images/webcontrol/ui_schematic.png | Bin 0 -> 46519 bytes docs/images/webcontrol/warning_icon.png | Bin 0 -> 4640 bytes .../webcontrol/window_popping_output.svg | 2 ++ docs/myst.yml | 22 +++++++------- docs/reference/glossary.md | 4 +-- docs/reference/machine-targets.md | 9 ++++-- docs/tutorials.md | 3 ++ .../tutorial0_connecting_to_web_control.md | 20 ++++++++----- docs/tutorials/tutorial1_blinking_leds.md | 4 +-- 34 files changed, 92 insertions(+), 68 deletions(-) create mode 100644 docs/images/webcontrol/PANDA-block-details.png create mode 100644 docs/images/webcontrol/PANDA-layout-spread-out.png create mode 100644 docs/images/webcontrol/PANDA-layout.png create mode 100644 docs/images/webcontrol/PANDA-new-link.png create mode 100644 docs/images/webcontrol/attribute_lifecycle.svg create mode 100644 docs/images/webcontrol/attribute_table.png create mode 100644 docs/images/webcontrol/attribute_value_table.png create mode 100644 docs/images/webcontrol/attribute_view_chart.png create mode 100644 docs/images/webcontrol/block-list.png create mode 100644 docs/images/webcontrol/chart_options.png create mode 100644 docs/images/webcontrol/disconnected_icon.png create mode 100644 docs/images/webcontrol/error_icon.png create mode 100644 docs/images/webcontrol/information_icon.png create mode 100644 docs/images/webcontrol/layout-button.png create mode 100644 docs/images/webcontrol/locally_edited_icon.png create mode 100644 docs/images/webcontrol/starting-ui.png create mode 100644 docs/images/webcontrol/ui_schematic.png create mode 100644 docs/images/webcontrol/warning_icon.png create mode 100644 docs/images/webcontrol/window_popping_output.svg diff --git a/README.md b/README.md index bb0071e0..aa8fefca 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,18 @@ # meta-panda -The `meta-panda` layer contains the Yocto recipes and configuration for building the -Linux system that runs on a PandA. +PandA is a programmable logic box for synchronised triggering and position +capture in scientific experiments. You configure it by wiring together +functional blocks in its FPGA — from a web browser or over a simple TCP +protocol — and capture timestamped position data from it at high speed. + +This site is the root of the PandABlocks documentation: it covers getting a +PandA on the network, using the Web Control, capturing data, administering and +upgrading a PandA, and building its firmware and software. Documentation for +the individual components (FPGA framework, TCP server, Python client, EPICS / +Tango integration) is linked throughout. + +This repository itself is the `meta-panda` layer: the Yocto recipes and +configuration for building the Linux system that runs on a PandA. - Machines provided: `pandabox`, `pandabox2`, `pandabrick` - Distro provided: `panda-petalinux` diff --git a/docs/explanations/understanding-attribute-state.md b/docs/explanations/understanding-attribute-state.md index e46295e1..adddf52d 100644 --- a/docs/explanations/understanding-attribute-state.md +++ b/docs/explanations/understanding-attribute-state.md @@ -11,9 +11,8 @@ State is shown as an icon to the left of the attribute name in the {term}`Block Information Panel`. :::{note} -Prompt C will recreate all eight state icons as SVGs in -`docs/images/attribute-state/`. Until then, existing PNG icons are referenced -from the legacy source tree and missing icons are marked as pending. +Some state icons are still being recreated for these docs; states whose icon is +not yet shown are marked *icon pending* below. ::: ## State reference @@ -24,7 +23,7 @@ Data is within an acceptable operating threshold or range. For a {term}`Parameter Attribute` this also means the value has been successfully committed to the server. -```{figure} ../_legacy_rst/webcontrol/userguide/images/information_icon.png +```{figure} ../images/webcontrol/information_icon.png :align: center :width: 32px @@ -36,9 +35,9 @@ Normal state icon Data has been submitted to the server or a retrieval request has been made. A response is being awaited. - + -*(Icon — see Prompt C)* +*(icon pending)* ### Locally Edited @@ -46,7 +45,7 @@ The value has been changed in the UI but not yet committed to the server. The local edit has no effect on the running system and will not be saved as part of the {term}`Design` until it is submitted. -```{figure} ../_legacy_rst/webcontrol/userguide/images/locally_edited_icon.png +```{figure} ../images/webcontrol/locally_edited_icon.png :align: center :width: 32px @@ -58,16 +57,16 @@ Locally Edited state icon The value submitted to the server was not accepted — typically because it failed the validation defined in the Block specification. - + -*(Icon — see Prompt C)* +*(icon pending)* ### Warning An issue has been detected that requires investigation. Data is outside normal operating parameters but is still considered acceptable. -```{figure} ../_legacy_rst/webcontrol/userguide/images/warning_icon.png +```{figure} ../images/webcontrol/warning_icon.png :align: center :width: 32px @@ -80,7 +79,7 @@ An issue has been detected and an error has been reported by the server. Data is outside acceptable operating conditions; immediate action is recommended. -```{figure} ../_legacy_rst/webcontrol/userguide/images/error_icon.png +```{figure} ../images/webcontrol/error_icon.png :align: center :width: 32px @@ -93,16 +92,16 @@ The overall block context has changed since the UI was last accessed. Displayed data may no longer be accurate or consistent with the current {term}`Design`. - + -*(Icon — see Prompt C)* +*(icon pending)* ### Disconnected Communication with the block hosting the attribute has been lost by the server. Immediate investigation is recommended. -```{figure} ../_legacy_rst/webcontrol/userguide/images/disconnected_icon.png +```{figure} ../images/webcontrol/disconnected_icon.png :align: center :width: 32px diff --git a/docs/explanations/web-control-ui-overview.md b/docs/explanations/web-control-ui-overview.md index 467e39d8..6e165dc6 100644 --- a/docs/explanations/web-control-ui-overview.md +++ b/docs/explanations/web-control-ui-overview.md @@ -8,7 +8,7 @@ configuring and managing PandA block connections. The interface has four core components whose content changes dynamically depending on the current activity: -```{figure} ../_legacy_rst/webcontrol/userguide/images/ui_schematic.png +```{figure} ../images/webcontrol/ui_schematic.png :align: center Web control UI components @@ -35,7 +35,7 @@ The Layout view lets you create, modify and manage the overall {term}`Design`. Open it by clicking **View** or **Edit** next to the *Layout* attribute on any Parent Block. -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout-spread-out.png +```{figure} ../images/webcontrol/PANDA-layout-spread-out.png :align: center Example Layout view — PANDA system with CLOCKS block selected @@ -63,7 +63,7 @@ The **central panel** shows the attribute's value over time as either: {doc}`../how-to/monitor-attribute-values` for chart controls. - **Table** — a time-ordered list of value changes. -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/attribute_view_chart.png +```{figure} ../images/webcontrol/attribute_view_chart.png :align: center Attribute view — example plot for a continuously updated attribute @@ -80,7 +80,7 @@ In complex designs you may want to monitor several blocks at once. Click the pop icon in the top-left corner of any Block Information Panel to open it in its own independent window. Multiple panels can be popped simultaneously. -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/window_popping_output.svg +```{figure} ../images/webcontrol/window_popping_output.svg :align: center Three Child Blocks (CLOCKS, COUNTER1, BITS) popped into independent windows diff --git a/docs/how-to/contribute.md b/docs/how-to/contribute.md index e5ae64d8..fe3a7324 100644 --- a/docs/how-to/contribute.md +++ b/docs/how-to/contribute.md @@ -28,13 +28,12 @@ For example, to link to the `BlockingClient` API in `PandABlocks-client`: | `PandABlocks-client` | `PandABlocks-client` | Sphinx (`objects.inv`) | | `PandABlocks-FPGA` | `PandABlocks-FPGA` | MyST (`myst.xref.json`) | | `PandABlocks-server` | `PandABlocks-server` | MyST (`myst.xref.json`) | -| `PandABlocks-devcontainer` | `PandABlocks-devcontainer` | MyST (`myst.xref.json`) | | `fastcs-PandABlocks` | `fastcs-PandABlocks` | Sphinx (`objects.inv`) | -The `PandABlocks-FPGA`, `PandABlocks-server`, `PandABlocks-devcontainer` and -`fastcs-PandABlocks` entries are present in `myst.yml` but commented out until -those repos publish their `docs` branches. Uncomment the relevant line once the -target site is live (Stage F). +The `PandABlocks-FPGA`, `PandABlocks-server` and `fastcs-PandABlocks` entries +are present in `myst.yml` but commented out until those repos publish their +`docs` branches. Uncomment the relevant line once the target site is live +(Stage F). ### Upstreaming to the copier template diff --git a/docs/how-to/integrate-with-a-panda.md b/docs/how-to/integrate-with-a-panda.md index 5d444be2..f5c3b14d 100644 --- a/docs/how-to/integrate-with-a-panda.md +++ b/docs/how-to/integrate-with-a-panda.md @@ -17,8 +17,10 @@ Connect to port 8888 to send commands and read responses: nc 8888 ``` -See the [PandABlocks-server reference](../reference/opkg.md) for the command -syntax. +See the +[PandABlocks-server commands reference](https://pandablocks.github.io/PandABlocks-server/main/reference/commands.html) +for the command syntax. +. Connect to port 8889 for the data capture stream: diff --git a/docs/how-to/monitor-attribute-values.md b/docs/how-to/monitor-attribute-values.md index 90d00d03..4749d488 100644 --- a/docs/how-to/monitor-attribute-values.md +++ b/docs/how-to/monitor-attribute-values.md @@ -22,7 +22,7 @@ The web control renders every attribute type as a chart: Hover over the chart to reveal the menu bar: -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/chart_options.png +```{figure} ../images/webcontrol/chart_options.png :align: center Chart controls toolbar @@ -76,7 +76,7 @@ change and shows: - The new attribute value - The attribute alarm status -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/attribute_value_table.png +```{figure} ../images/webcontrol/attribute_value_table.png :align: center Attribute values presented in a numerical table diff --git a/docs/how-to/save-restore-design.md b/docs/how-to/save-restore-design.md index 1e37ec0c..51066bfc 100644 --- a/docs/how-to/save-restore-design.md +++ b/docs/how-to/save-restore-design.md @@ -20,12 +20,12 @@ recommend you do so regularly. design you wish to save. 2. Navigate to the *Save* attribute group at the bottom of the left-hand panel. Expand it if necessary. -3. Enter a descriptive name for the design in the *Design* field. This name is - used later to identify the design. +3. Enter a descriptive name for the design in the *Design Name* field. This + name is used later to identify the design. :::{tip} To save the design with the same name as the currently open design, leave the - *Filename* field blank. + *Design Name* field blank. ::: 4. Select the **Save** button. The information icon to the left of the button diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md index 4347fc9f..83ffe3c3 100644 --- a/docs/how-to/upgrade-via-ssh.md +++ b/docs/how-to/upgrade-via-ssh.md @@ -32,7 +32,7 @@ The `/boot` directory on the PandA should contain: - `boot.bin` - `boot.scr` -- `Image` +- `image.ub` - `rootfs.squashfs` - `target-defs` diff --git a/docs/how-to/use-web-control-to-set-up-a-panda.md b/docs/how-to/use-web-control-to-set-up-a-panda.md index c665d61f..ddcb756e 100644 --- a/docs/how-to/use-web-control-to-set-up-a-panda.md +++ b/docs/how-to/use-web-control-to-set-up-a-panda.md @@ -251,7 +251,7 @@ not atomic. During this time the replaces the information icon; its reversion is the only reliable indication that the value has been recorded and is now in use. -```{figure} ../_legacy_rst/webcontrol/userguide/images/attribute_lifecycle.svg +```{figure} ../images/webcontrol/attribute_lifecycle.svg :align: center Attribute change lifecycle workflow @@ -280,7 +280,7 @@ These values are presented as an Attribute Table, generated dynamically from the attribute's specification within its block. For details of a specific table, refer to the technical documentation of its block. -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/attribute_table.png +```{figure} ../images/webcontrol/attribute_table.png :align: center Example Attribute Table associated with a complex attribute @@ -321,18 +321,15 @@ While {term}`Attribute`s define a block's *behaviour*, {term}`Method`s define the *actions* it can perform. A method is represented as a button labelled with the action it performs, executed only when the button is pressed. -A method may require input parameters. For example, the *Save* method on a -{term}`Parent Block` requires the name of the file to save the design to. Method -parameters: +There is currently a single method: *Save* on the {term}`Parent Block`, which +requires the name of the file to save the design to as its input parameter. +Method parameters: - Can be edited directly in the {term}`Block Information Panel`. - Exist in *local* state until the method's button is pressed. - Are properties of their method rather than entities in their own right; they are never recorded on the server or saved in the persistent design. -A full list of each block's methods and their parameters is in the documentation -for that block. - ### Obtain information about method execution Selecting the information icon on a method displays two sources of information: @@ -353,8 +350,6 @@ documentation. Ports are colour-coded by the type of information they carry: |---|---| | Boolean | Blue | | Int32 | Orange | -| Motor | Pink | -| NDArray | Brown | Information is transferred from a source port to a sink port via a {term}`Link` — see [Linking blocks](#linking-blocks) below. @@ -375,7 +370,7 @@ type. A block's ports and their specification are defined in its documentation. 3. Release the mouse button. If the link constraints below are respected, the link is displayed in the Layout. -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-new-link.png +```{figure} ../images/webcontrol/PANDA-new-link.png :align: center Creating a link between two blocks diff --git a/docs/images/webcontrol/PANDA-block-details.png b/docs/images/webcontrol/PANDA-block-details.png new file mode 100644 index 0000000000000000000000000000000000000000..dda584ccee10eb0f18fb7785700bcbfaaccda424 GIT binary patch literal 46427 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 z%0A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 literal 0 HcmV?d00001 diff --git a/docs/images/webcontrol/PANDA-layout.png b/docs/images/webcontrol/PANDA-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..b8bf4d5791b1e06b109cc4501f55ed5ae0cd710c GIT binary patch literal 63651 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

uU zA(L?rtJ303*S=H)uy1tBl3F^wGlKfbkz@vT|F)tu`vP_M@xd2|jieb6|r zQ#SzD3boJ=Pfr9rSOIcGVL8kMijrmYWm@nMkl9k$q9~-E6yZwn zw}D(5x3MK+6}mx(Q~bZ|AxhsB?U*WDihC}Q|Lw?ka7UtPX< zk;1Ww$`GEWopi)3v{4{T?n5}H`~O`eVqr$h`>AduOtqhTmH(lvG#p~ihy;%zLuyt; zg%^?#@+b5e3>2cq)_y9O?Y!fAT-RuCZ)_Zo3#--#&uJ^TSbL{S>8Wr$2oG6#^JCOR>Bs8tvytI`%OtD=i;;5_I>;1CSVA?Re>_0%XUqrj=%rVtjo#8!p+6} z8#nT0$*&#;wklDb5Y$GNP`P7jJkNT|cz=~IR8yj#vcz@ydpO>zz^0KmDRe4ACg34MyRyD4Kc=$#EvU#-s z|KI(er#qf)jR9@|581GDD)U~35egJ${J(u;)3};<|8;9P5|WE*~yF(I>9YPYN^KVBq;5Je3nWk z4-bbP{O6aGm>=t?#cyb<+Vcj+0lo)X!UI7s_` zhmy~ymZNo<{e25xZPoh~zBJ5Gdv6+g5zIcveO{mMb-t8v)V&~j_ZE^ZNEo~_{t zwFN^h4N@Py{I@?eJNvSt9TFla7Y_!t{`)UgRaJ(i5}ze|5wK0XP#ZCa!JM1mZ~WsA zDI3t4N}o{aD4@Rsw~kfw)Y)}0Jk9`j%~Id+N_TH%J=1uE@vHf7tI12caAmh@bKSh_ z)}5hyADt^0IJUBWXTKtL2_8U9_vhpX$rs+#&E&{CA+yh(_hiG!5|?IU-0($Mi&jVe z9$WX%Td@(0N0NLFG<{>I+aBZL!tMy#tih1RQPZSQ{cpcb=URVr)>+@0YDQ6?FDq`v zmle10Uw#wDA3GCITo1>ufSdj0k@E2akA>^{FMR#Ja&!0LAnx~jb=DaA8*1OIw{g7C za%m5K$tPEdTRwBci!`g36*e>pBxNaUyV);i-bnxEhF>w=L3U*WF0HEv?)>C_{%ncU z#}w?8h}vzPtvx|6>gsnJ?6O+D&qhHlct3w?xTS0ER^Its%_jonZaBsJUVWh{EG!T# z$8zio4_B29-jv=~GRd&Q!gu2H!wh*j>YFMv9#`#G`It(Z>%jMl!RXZdioVEqM_xP? z5@wHpIlWHV%RhgUNYW4Xl@-7t#%likx2xE*Nzq=0_zZj}nN+m^w33ZCooW#cZcg0| z+s~%4EP`Hz7pNS6gRVe{6?N0L{Pp@U!;b><*Zuxsyy~XY?nx8xH1T%k^KCB4u_T4@ zmm_wWco#$Q{f_e)mS6ekSC>t|ddVbd4Po`Q%(MIZLT!ykC91l(qD6^J8@nt1EsUa6`nmh2|HCi=f@7U8ls@$)})@q~hC9U`3$*zU}ypA&74|kq2&dae_vTt7N!lNy@qHf`6qaMRj79WhOV!r1K z58e+_nqr~ZMqc#Uo%`p7=!$Lqefukv{Dq#yns}Qi`P2-SU+>f_XuzS>sPJ(fw_e@% zB)?N5Ku#o7OILyiPoP^@BGgJA#t!fS-n%p6`77&2FDKT(cwMq{PbyDo-FMUcY5I`o z{jXE_>^Pj8Fu3MsFFG^|Tks;B2ig5De5V)c-9LO&c+t&`zb{f+gKt|W&%WL3_qeD{ zP3qJWQnjCHxj&+|p;n_Qd?_{#-fnh$i6kTI?zz~Iqi(0;DxJUFD7C#UUdvs=%Wvvw zq7-pEgiKk~7WcIaSEt%G8J6@hEV0brO#|fU@qQeUJ7PXvS+sp{SS6rahqY#owVc&L5~iyXy4b+y03vv zOD@B~cKR#PcE(lMK-hEU6Mx|$_t&HE%yXQz?5U(=S;Nk48#kM*m@2v_5r)_K#g0%D zWBu&==RSoTWrtarxgr}lMJwUfl(JxayWI9$yY6&QFCt)ji_WSziKMCk1Js47%M;BI z4yZ*PUAa4UUFnOVwy>~P|52-Xe&G`0uDZ@S7cl)K zeoOPdhH@0{CbradX1J=pzLv6ThAW;iivmKUFHe5%L%hq^MWT6V&T}fkh}7Ls=LQpX zpnpv;6u^eR_nbti&6kSCr=tKXT2C&*3_o?rV=gABiAk9}3Ijh80)sT!$1X$ZtV8!q zx5F!T;O5!4-ygPit9>Rau&kCl3C|Rd5W9oS?6K4ra?Z zhh-DrwrdwPwkioeMr%0qRUwmIfxINAJ2{5fzSM3EildptZ_U)L+Hni0!vGXpU>BX1 zg1;Cxp(TsuZ6Yp(U*2qLqp8ZG^^o(ZovOQ z_?Uxs3VHL^K@bUYG?g){Xjn;0E-`;!H{_L~dfs;$(wA#6b&MJ{dB96-r`B8u+5nf6 z^%!%*7+BhysQi(j9jTL=m{bDZtH7ou>Y@^QSV$x`FYgMeO~|A^> zaOoQzaE%G^Kc`#HcK6Pb@|#L;tap!Yn!~i_9}8tu%{cO^7XHaDhJ=O(Hck&_CP1>^ zZ}UOEbd(0)o&IU^&aGb$*D3yugwjT%oKe)Fy~3 z1hce^Li^9}Y5I~G>q%4yvPMvQsJHs@F>+-T)!ot+LU6h5ITOMY9(d$vMpeyJ* z5i5vEVrb&d1PC5xXj6quUwPMVc45^!tnu}`s~waBzYo^+i(Pxs-T1iLx>>`&yLF23 zO0_@M34UiJ2YDSz*)x(+VrjE2WQF~YyB&ICGP9&-TTK6uq^XR|gK^goFJ$NJJ|LeQ$v39Ko4% z93UfyVGw99hg#V}VkgA6DvdzPdOrmJ384fj?!&2%H&Yx0e1Hz2KvRWXAGPMBJoY%y z#Jf=IpvE-R14===qHYdUJ7b@s_*gz~m+|^Fi)`NKohAT;)V$HlOtgmBd)BPo}^#4S=D<{!$m&snVD1A2d+Ju79qtbd2c+o z%{2dF!B~~ZosA~$+as>#29GPsto`G*!^M}`=Jh_(^`+B?oY!A8;KhoFuFrq2cw=Nl zV(Hpy5A73QKMC?Y7I4ggnZ7xQ*L0ag4gA6~q`M0R8E&v{TKUg(=kKY{|LONm^4%vl z4kEW<+4h%fVnzjsKmK9c7d0G%Lf#;3&ESg^wGy<7Tsizzl5G>(T%BzG8z>Vtkx(OTg&R6`4xvgmu5LLb7TQew({o}m^fuyOuQ<#D%X4+Nv6Z^aolo=wr zFf18CXtu_rW*WSLGVdTEiqMpF6!1>O{E0G02t5&f1G3C$Jw{ucbWg192}>o<+9?`bM_h8O54ai1vswfIL3Eyj_W{7 z*uoF3Cnsx*@3DK^>$s+S{n)lUKFq|1KVjmroAXwQ)^b}b;d2M^H?cHT9z4&!SJm#} zAl4A{EuGWG4MSMOWa^+3l$7UDW&Q)C9qIuHx9+21U0|a*rs8EJ*@ZG}5~?{VS6nYZ zgOcO~XhL2H`hoO8T&D?8#9}}l1KKmKcyT)jyoB_lEC5rG3S{AEHe;Sq0%D;Va3qC{O(B9`s?>%)BzV%;IdigN2 zLgq*Igj?x1F!-dJ*%5YWhnp$|fB%cQH-W~w{o01_yHTYOWk?w+QZg6GP{tBUA(eSn zGE0M~$UIb(2o)iUiUt&tDTG8xl#nD5Q6%vl`_g}Szvq3P_j%TOzqP)#Zru%B*Y*4T z&U2r8AN$zHp=r2vL*eMVy|vLaWPu^|9fpRaH9*t2P?D|AhTog{b@;>Apf|P^?W4BQ za#>b3y0Zk1Lu7|5gF2f#R;i)I3Q{0OQ3B~SC$FRqV&17y(gd0w1|+H1G)f0KQl@P< zqzW+<)8f8&T}nJctyU_i zx<4qET`BxHI{vQ;t-}FkUtFi^+3w3(BeK#zLiTN`t`$ash8ib85dXh>Qvo#}WkJu- zNc~CPj^?2Dm29FpU;3&b143%c-=PHN4*d?@`cDs_lth-Km83mHU-3bma!B&YaA_0q zL+GpG4R|DPum|0a8#55Gz&$yZO^?sE$vRC+O}vb^))dr3V_o5 zx2+kt_fjEzr|RH&UoW{>)HiOZKgO2!ufOS&99SH!$k%;%;`KS};&P|4gWg4v>_>X) z#KeE+g|Z(RR$e%@e&%flPNlu7=rT$vT`NVL(-k3xV(o{4?=b;Kxx}ha$9T1Za-?uMtK85-|%|P;IEl08Bj)JPY%}~G_GM~u-Fu8Qn{j@ zflk$${R<3R^LWp~FRvqaYK40gNBm|yNYq>MlA%RXYyzxIXY?kgC0zcs0D#Upo5rF| z{H(;&q>AjbK11B8Rvq;>U%I91;vl9&jvL=O_m{;!jQ)@-xP{LTFUnM)Ip?nConEuY zO5zP493DGA5{%#piV6kE@=fcaY2mw)q#xS(4 z`PYVT;y*EU9~iNpflX0oPi;os5Pk%R&{mlCF}@q*YDU?N=j5{3*G5oA&~|_4?j@O2=C&V6DB$Q z{W};HkU{?kXw(=yQ*Ij$RSc{8s|YZ@O+?Kffe)Qg$lf!q8ovlHelJ@2?3o(gBOhil ze?F&Hg3*bb6?Srhks@K1Kyii@8cJ#FHbfA&KE)&SorQ^!HT^~*M5n&1b_Xl zm<9t6T_lOcGIdFEc3|@!D~hVAOtpBPyi zgk~hE7a`w4C7=lvYX~1b0?Nev5~GHsO*p6!3H;DiND(@DC>t1u8Mw=l&Zth~p8=Ob z{|O$P<}K^##Yt)dQ{1Zn&Uef}yu@LokH{^xqyBTuARSUSaV_`bRzFEuCb+-h-AADGPE-PLGXoFd6 zCoq6kI~A!|614+DZnKAqKuk}+KeDXSdZ8H*58_EyyYi9_p8p(nRyJHb9u~q8JQ4~) zO6c4s6b1J08Ev7S?jy?*yAkOI!=bzYcg{|^1%roqQHtSK$xr5GZBuUY)Z@hc@3Gsn zSZlsIqScFRO2Sf;v*NCP1~z@;TKwHF-h}urOSh3*cH{#a34M5DjEIJ=K+AJ)(2-?Z z5V%z+ifqP^(Ey})40$tMOcy~3TKlrn(&}t`N5>DuIW`-8!bwu$KYnCmd~ezDVLfk9 zvo@Ihded|fKt&<^!A^kDckb;&FLyx{yyN5D$|z!UAc;jrUq~zA+nNN4NnDHjl*8H) zc$U+EJ#oOmMkN&l;6Ot(It)v}voy0#e0n0_ZS2qW+ZrX*{tG&8B#BFca|0$&IV9{3 zYdk+cpZqP-I%#?d91YZ2ph5+AAEAvwhh>GUQIU^gAz|w@$^s7{fUm^fVNo1rg`hk= zba1!5?-+$)E`ZX#*x@d5-&m+V#$n=mfOu@%y*thsi}SVPgh5!)GLIrXbrn`>Dgp*S?hCjpZV5#XAsw{ArOMvcyYj?QLOm?W3g7L1XWbM34| z|0h77+7Ip83)vbgv5k1R@fMds==79Ip8N5AZ>wI7dD3}^JOUb|IEyYJ`i1RPm<@nD zP8aHNjH!`PHz|{mH{m~omLM!ZPB2O>_kr^DIs0CMVTl_g4&0!1M{9v>!LVv-p`md7 z#tkb%qQF}Qc!-%Y(#(R6x)mZ1+4Wu>L;0Zv4i({3&JgJ%0vE;}6+w8!!A?T{*cYRq z@oQmn1RFBB4WmmmJ}vl!xOv{7fPKKDkjM8^3k08FVPpkEuLzHmv>QE4NM{VRbnnh3 zZSMn?IK6j<5g4h5kYZBL17!F#;6dt-BrS!BlS00Ufk3?2K*87JEN#FtiF-zq_yFUi zZ2+L*gAJk$L()M*s5fC;^0c=0BbX#M04`Ro(ykydvW;cV~$m%$6Gc2?+SfD-NQ zJiXjvX?K>H9ermVt#uwD0jZFSR8}uqZ^S?ZxCa~v19{K}(iE9l&eeDt&ygp-H~;$C zYEKgo>eAVfmpu2}nwA9pDZFt1FAYsCKw~UMmNRt(QW#P`)|IyLWF7g0S)xdhf zRz&a|sNC*z4$QfWyDVDPL*N10AsuoHaJXRCBWmKCr0F@(WF!cA)nowy0%;EB+@j@| zLY?7>SDoUBivsC1v zwX6rWJG^bhLflRl(0UzPguuZgmN0!F>_<%4s$l5uHxgiyF2OwO=()-jSe#IoW**-W<&p3TZ)9&i9ALa*%+0T5l(;>49+8(-=bmRJFsghw3gZmpt1tfu3J|uB+G0c zh#{8_Dd6@i)eVsj<8Ot!P7j<(uxYy-#L6^7ZqYx?LrLuevV{{*aEj6n+|WQmi+F1^ zYp9Jt&Y$#>kYT-Wu;u>MMwf$c?#^jb9BD1NL&7oWPCRP{)OkdRi&+X06d%lAJXRYF z@y*c5Mb1AuHZ}$!oNJf6kE~cY2X~+5ds=f{(IK#GS&sp$<#=Qu?Lyu?ztHg{Vr*!$5{RpEq_+u#JS-F|SM7f%9HhFGcXT_Xu8z%5FO!8WsWWcVj zd@&`qVov5+++n@>l#_HvK{&!4vT5wWYBZ)na34f6x;-#j%3ujY-BPy<=ZF?2iKYX7 zXCa7Sl%(D_L3G^m`c(Dg{*ngB(0x%yc#JVQ#7z$LA#1YU<2dZr-Up-xh@lmXzm1Re z-6MTpGU@rF%ooj*g@Nz(hmc(x!0ii0AM0XHjU{VAjUEUdOyIK-N(U@}2qAi(wQ=Ip zjL{OrpmHw6AN+Y3ixVfytcG{*bRp3V`#+q9bX=h;2W%3MHI7t#tKMf7+pue2>gEreMIaL#jxFkQ2*$)$2-3~Oi^S47+IelOC9 zCFB-bw@ z%Ht)P3a>VscuZL;cUUJL?`0vn}TDq&^KLyCq{V{gw=pU<6Py17OLfSis%4f&{QOq9b5~^ z(to>Q_B(|1P}xBMF^9c8&2Iou?m#1hkIYHs7;^w>U#A=? ziR3N!pvJ&;qV%EU;950B zlLB2!#&E4B5V&)wXXdm4h3C$Ia$0+i+{ycKX~fwAbz%xcidd9s{A3XQJT|e+$4y{Z zY9)w}Dbp1rQ4M4nW-xUWegRqlk^sMEtj;vc$%)@z+KTv6#AZ;|H41h;CF4+uzC;;)qv_V7QvSMY!@uLQhBa}-A*KH>X7yu8s@b3U; zc-LStbk6yATDaDHlN0Pgn)^3oC-ayQ)oOKNVpOG=7=b;+h^0;lAk4gCt`c)9)1G1k zSP`9_b{Z`@x#=$|+QKBm)UtY|b_kxmVkQ;4V(r@bp6v_SkZ>VBA3uJ4l_xRY@LJ`& z0k#2|D%#|U`GAy&m;ckZ1n&1=b7#TWJWh86d`c|m#?#f=qEnxx5=;9x{rwJ3 z}e8#ERXT7*irP>>#dma4It+3*nb@l1^@k5{8^C{-OFXH=$lXvAq!iS0TOFu zTT4|Uy9}`6w&DU`Gas~3iEgX6-uN}64$xSqmh2A3*%LtWnctncKA zZ-p$tGg5m-DGe1A)F0pAOfygiVM4ix5-7Iqfn^Mt1yDn(5F3k(^}eAh7$7qh%(c40 z2D5M|;VX{n0qUeb?9UJN{q?}t3I!o4Wpt9@2aFKxAR~r8uIo)?go(ZrM_>n{4*rdj z6*K5JNS%f-{MP=9j!8^SIzU^Qw4Z;b`Hl(K;`xBVu!(2RftmlJes&&g{KVJ&JQVIciN#qp#4fs z3}A6PKeyVrUO*ls3DHJsar9yc%Tcmi;*4Z~`&*2P$HD}P9ty!7zX8LN7|S5H6%7%; zesn|{S$&BYDKX%aqMRI9xo{4^(>jGAX0R!r&?jbO4u3xCMZ6f*q@ZA;rXiIWpf5D( zXZEvdcP?Zy5cFZ@xof*(84#_KyiyQS{#2i+Xt46+E-e-{+Jv)Kd8|GXoW#+|W(|Y} zfF~ zBO_UsEnBuK7>!*`6inr4WB;UqM)eAEoIGwyWepX zw;G%SvJ1gOgVSJnLj#!>SV78_7%M20HNtty;2A-_9}vYX-+#|?m6(_i#3Pp=6D~>y zkpUdVGteF(nK6P$p!B&Q&<{0>Ygg4GN|avUK9FA`AcZZ+7Y@Q@@}sSXiKZS$;dY2T z&Z4VJaNcQd&L1OYLSp9{$e`>%9OHr+8JzWQysY|Ods%rqbOr$0q~yVgBq%tz9iy@z z@S*QUU%A3h^M|+roZ_a}*5X$AW%a`G26pn${ecJccj%A7sZ_wS7Z+|m z^l<6Jw-Kx=LCz5^edSkr&DBFm;1X&{a-@j%zdpU&#bgw z`H-Z6(RTUJwWO z!<48L6oZ&?Z=o{j-u`4JbEM)AF8Z2vsiqt*Emf$Bx9saU^bmJIUGKT)QUQNfmAeNQ z<5%ymJ^8x((lS<)SUu8MtC;(5O^4(K z4K|~$hYfif1dguhVH_FGJ%F*Ezv{`4NLuCHmiN|)2fxkgy_*WbU6@?uQiwshmIp~1 zPNAsajrXvPkB;=$KvE>vt!u6qT%&Je-;>PpI}{%hG%}5D58YH+ZU|E9`>yrM%R(lA zO@&FI^fxD_+23aS2LvS1P2~4y?YP9aozLSuOe*Nvy~N9WYD{OJ1Sr1&j&qdDqifW8 z2v)36+H4IeDpC$7w*rjDg#-893J)h%4h|w+V*QDTidsXY39gaL4GhT7b8vXr8o*wV zGp9+@&s2yuHDC?n$3?`%$}v1&iWJ>S!nSGhWX7`g!>whkqk{%e2!%cX@JGG9d#gZDrNMl(l`XMOWy*Ry zD6}KAIA~$w|Iej&*yh0#aKH`L?B(D zu4jJ`K?c?Cd8lxKh@!e_(_ge+LG2`G9Vp|%l&T6~=^s>`G^n8GMFA1>zv#E{6R4`G zJjQ0``+FUxmf_3M+1FP?6Z3Q>;7f0(+SN8E_E*jRdu})}0RgH)`42SS)J&KbBMLBl zvuEZshm~0tTT5NdSPd6#4SfC5F)-L0myvN-X6ia#ywEpLXA)3rv7LGl2SbxqamnbE zTyfwT!S-d&&$7an@}g=nix4BTJN!f2)M5TuqMr89NgF+OY3q=-Q+t6bYBu812~W|dfyH&)GnZ=WrPkR7SZlO_0EOZ^b-{=o#IyI zVeJ|OpL%_LN1|sRzYPqSLuH7bnFgw6QW{udV`s?U)oAld!Cnrc)(w*dJ`MP4e_` zEQ8Q0LwBp|C=LknMoh-?Mv!F^h^xlw%Tynbo>2vKA;6u<*rr@?+JB9a47O_ztf!v_y} z99!6E*z{O^n5~AQ4hDLjR8-6!eCzq~88==QkDRds@hVsVu>Ek6v$wuul-q_qhev;o zK9t6`o&WaQYquI0$mlGWmybhAyc}0D@dl!fBUOz1{O6a07jdT3efMYeDiarCySL3* z!S7-FqJ_c5riU&Bd~ZpfxfF`zs(IUU9;lc zA<1C54Dnrg#}?gxGM&Et*gwBrW?#iw={a0yP8GXmh8+l$y?UNE?dl^YKRcHh`(u>u z@|`(_*Gbs9Snv2@_VW*S(@pO;%4LB(HH9Y9zpkre!NbP6hwVciPK-~1Q_XAhpI5#r zWw+?1=6cuUfNz34RiW3Fvgb_Za!g~l?NH{QximNX*rJgPvmzf%1t`BqO0Zm6nGd;) z$mY$PsVM|Y4rFvB`hxsL)T}TbadmIh>0jp1OdtN*#)tF?y@vp#M=%~E`P0$SQCj?e z?ng(Is9Qf;j`-i7&)R0G_0?9ez$r4W#Vm) z%IV}CI?O)n^3!6O7`z6cryKYd7pOWs9FELISR<&UZo@n4cy3Y~urg${#>H!bw0v z@H`+%%|pTs+;$T%=l~Q{M~6R=85C*+E9j9xSInH&5QWkhaWjAiiV9F@#9vc~)$~~3 zIy#te3Q0mh3;1vluKC8)#cqPz+zMu_9_$}~);2R!0X8n|#MZT$ALM4;I^)!;Yi!Jm zR?M|}R0E_e>#zV71mbJj_RDm=sKUAM(Lmq8BL6s-iRm$NP(wr`;yz=2;?7z$Uf1*J zeHBhZmKA)y@vu)ld--x*M_FjzS@=ZNgEK(60%Svk5PPw27qYVAESoKX1+gfn`5AiY z4ju^V;0tLWQ^3l-g*wRSw)x)ypq*IKZ}2W$jAh*MtGKHvIRAN|q>*FSVS~$^50R~) z^m$+@6^n#Mpmefg&5CIdfo0PP-ZCj1kQ7#t7mEnQY$|ZJm83<^*#n`#yAaNg_ay6c9u;pH^3Q!XpaT&qdX7w##K4aG2fP13CpJ(d6$f5u zH#i>QtmWt^in?Msx*#a6`!7^?!3tvT!?(J-JWSHSb3kb3_aC)&h$}}$3pY$U|47qj zBj^AO^8u_!@(zK+htGf?-))SKVRO^NhN}c=<>O(~Q$~o10r!Wdr7W()kZPo8QW4e; z*d;Fz`S9AL?)dtlmpFMeBG`dEPX@(2AkBr{v8s6Sz}ZaRtN$600Fpxuzz7wYr$F$h z7O^|e6sajlJUGJMLLt-=S5D8n3X9C)F65k;=PefH7ZI6L0)=rl74O+c?p1t?I(Sjv z*XhG2*5an+rrjqMLkBW|JjJa)$b%S7&aQZ-u0^OMIn>+R;7en#g$jUFu^(!GmHI1W z@-%CWjrf`;ST1$%nQ%ttE=eqA@xbO*f!C~sn!V%T3F7fcuqe#vW z+l{;HE_VZ<^XPeT8fw?fP!~rDO;?Aa&t7M7za9b@uqw*ukyPXP1*WA5;|_LUXz4v_ z6kcVYctEXj1RMctWQXe|^5}x2-=8==a4(1w-u~joZgHGrB(WX-qyOzTMA_vUVUGb< zAj&or`T7!#4!Bo2=2WptACgluncg5X)}i|Yw;SVpkKnJ_nok_VLX)DJ^&1_5X1pf zLGovXkG01qR^VP54Kiv&vCG0X`%X+ZQeGtBlvX%AqwkpT3nj7G&&x06F6o9azzkbH5DW~njA7;2`Uw(~c;^IkjmbD92jsf(@o_HD6CjBPN?;Vmsi6=Z zi1oS~s}4=Gl@QOPZZB*JsYssAqVO2qB#~9CuB_XWt4R}?;K7pm73Pc@kT)<>>)6gN z2gf}#ikxH|>&Vz3)>(mPjo!Kq{8^#SSN{pg2u()fnzAA3$#ed~1+oJmh#Ouaq-lui z9GmgZ{+Fwf%9_&SX`$!UX5f>kdm%#1!ozxgxTR`_#0tgXb=xKv)ih@ulCkM~bB{=f z0)_Wfj=nJdUVMB<^>&wJ8ov}X$-j+}C}wgs*|34zFC&9gUenNyy9}@frJdEiy?APr zxauazOCn6e9a7>`e(kTXMRhpl=nQ~ORyPen)kll$lDJfZv$MY7m>2Q6Q0Wme#p+ew zsKn89rN<~DOFd{`x?-$O;MJ(X0hTglvD5T?*e6^?4&P-#4$r)={qH!iEr>Rjdmd33 zD3rr6Y-Yg_<#QPJ)y}F*3Z1lTAv{;+ybWu z5E4HSV{BKN?%e}T3lM3j?gJ`=q1tPxXlKlr@xHGw9B=`?a|J*D2_)2X-OSiEFa-03 zYB`6%-fb?k`Bvx3g2K51@EuKAY5<>uR-Z*qvz*Vk98Qkcj_Xk&5Xc9F*A@-?i#4_o zW<|vFOLd4>Jhm7m0=73Iar;q7vLUDpff8;3xj5Lu^7lt9`@LK)e=*j)RCk?+)*dzU zC)&tLC=V~7Bbyr`8O4g_^=Ch&QMMmM9yy7|#pZqHn{h;pyty89Ak6!E+`hpfk8f^Y zVnl!M7LQXkFrckbW{K{EsX5G!xabpN!dex=>*RHVeSw<`aFXsh?hqa0z{@~M31!Xf z5~z?|ZNKd6w@w*MAx45pniT_U;~JWvpD}ahAV`cb2dxGZB9|LEOAVm_$W8?Nr(a%x zlovIg{?d19k56zsF*VXquf3di$XfbA2VaZ|u8i3rP}X9N0&>HkjdoKP@F|EV&dR8J z?kH!CTi=^?O23D9Sz1}$Y3aM35poqe+jPnvhK^m&n|m}sE(D7QWC>R5F98k1t@gLq z`54mR|B^4Q@gd6t%k(uRL!UP|eMCx0G+4rDz;6NVOAR|;XK-NPF)%yu;E{D9HeW?} z!;xh9pydcSpLs6r)0)#RH?gsXj8k9Fd5(8+xy#G{nFl&vc&B$tIlygj4hpCFp zh;&RU{4isFmpYe%-|~U}7fbM$3gfDhxC5o<-`+ra?dm0pbaT}7*lm;PHSOI!D;hOB zvvs#%T@|1>JVgm$ z1*o6uDp=1J*;hdnwddsxPB3JXAte5wB^+%G);|pm4giq`=bhPO%3=ae1PU55FG`pD}Y=xr+YHh>o&AD_FPdtIEXW~a7) zo1b#FviU^Ip_#@`3frBF88z&wN^2DZ1N?kAzD6$nudruI3IMBw>_y8S8y@}(;K-=j zf^uY9x6Uvz|Hu|Z67ss1@lO=hYJqSCt>4xl!yK3DdTR=OpX%UD?=A>Fb|s)?!@jPH zf^R>5d<2NR^4+_4*v8bt!@fr1V2S1?;B-KigWtZX++{Xt0&sy&5D1+T7qx|$Lz1qn znj4O5HFW?W)F2c7(M>)<248qisB>_rDo@^6KDnlyD`z{ije5EK%6>>f`KhDwAtQkL2f` zFN*)7u?uGj9$qQhVVcS4h2R;UBC8SPg~+<{Ou=jhhmUDcr-9dYv5oT6UGbUFZD|J zxMQ@sK0?i7*MLT=ct%DxtiIur5!CF6Hr+XNt-!B|g&`q|xpF9Ddwn$pr$`%oDI{lU zC~=5Uh7H=;*-6Mea*ENPKL?4`gc_d^6!fD>p+^I^t)dV4duxf$+>H~{|3eQFA9S$b z!LJ*CC5}m)^5ydh-fXd+$0Td$W8b5GZ&!hf$KZ8zlC^EI(^6MHMTmC}f2#L`&-5j9 ziEw&u(bfHk@{>5Sm{AQvnK}d*gGh22EDkb)VwhA~(M!*R~VRa05pYpV>6SXP|l70gt|CckN<1`w`BJ*Ex7;3Nal_xY{dE)GXiw(N1sksesCi zmvcP@6gZ9&=D1$4Bp7xIT`^|mj_b)Cf_5=r4pNAraS4F_*pwjh)yNh*OC&yRX(nG3$MTY`D z(WLlL=>y3T-f+LkntFj#84K9#Hy6x#`(Q>+PQ=4O8cf4NA+c1#sL?M9fl@jq^7jGx zK78z0L*embZ{i4lgOob;cu*1ME@j!r&CeHOS&Ny|#36U-OCG^-B-Q6)d7xxqF;Y>!9A@d4*cnofTs~KSC_lOepbd(KDd- zV+5aa1Z$f{zTHOc$l8yG_Ve-R{1Sig9>7FzI5H6&Hdxb#F|#B|KmpQT`9oixqUxZ; z5XUvOMesdiKl*5fe*L9zC|Hnx=kmRgl^v(0Iu;FIS@n8yy-MraqKj&cVg-ZD{QTKBsKFjC zeNcz2QB?QQmSfJcO~0xuoyNag%R1SB9j@@>wG|Z$I0#*Z;Rvq*p>$%NAkSqQ3}@=w z>b`D<8snNkz}GW1twk1yaTX!?{vc1pxo`yfJT%@x`oa>n&$x(FNt`2q9S~el_4cz| zR&m^kML%96Xk$D3x{Hs`N~4hI(f}xR__W#!F(Ee1?>4KwZau+qfV=Khry~7RZN8Ap z2W_NPd1rCO_|ChbTTAth$5y?)aeL9SO>{veACzpav50ipnucwlI``Vwh-4A6hD7Ov zq`8apm7jcEMb8oy_m{6;WjnViWi=t!7cgKrgaStVtZ9@Ro0|D`H1+f$k3V3Z@7VmNbnK> z{q;Lc)qsPKR-~|AlwhCyTjbMYWPSD`pqwv9&P|gT)UH$3PE_D7LA-w~E3$t51)@Bm zK7&CXc1Q#rZ5a0fj*7ztmA5-O4uBVQp)iqI`Q)Gn?}jKeJ-Al88|odmW|!T+N<8W6 zqac)!1CiSVBrJp`rtf@ya?QitgF2s^Zt*FP7PE|g$*F_?j3(~zq>Ox0z#&sHr|!!B zmEIny^Jl4Joii>-7eHQl2H4C-Z>F# zRqkGJYASr6eS@dwOI_dL7`|>pBu0jXms$nnC9>NcvLNPg!x^5G@I}aP9x- z1E5VtwLZGL;8WO=QPz!r?Z>hl8GKtZHuut*gKCLjux z41jC);@*MXx`_&aTmF}lc5~3H;g<&6Q_aTatdaM9nmHqWZ)9L**d>Be^7G?>9^xp} zIRY>}I3&ap?HTHM0uu(?N*gr->|Km+s6-(5wO|q-% zm3JE7!k^HZnj!RT1>%6?>Dl&cNO2#xmK)mnh@UVzz-jdu6Gtc8Q({b!F#Z1T^`IWG z{?FQ8b$BjYwY337p9bXl?r`V){xUSZNC*Wnpg-YOpr3r;?6sAS>zAXL+ufz!R6V(( zGTXoJ>Mb|vzFNoBl5`e_kW>fi(a5Y^w{DRt&@f@$`1dpvLR|rXtDv|v>_r`csso9W zQ(03}%-6YQEVH+=m{=NhyUG82<(^)9X}jp;d%k|VbOELm7g?3oi2p-F>%9|-t|*j% z7>Ek1v`&Ja9{I1?R4+zRKooSK_jim$K|C5DCkyOoC!4SD3aGP=`N{g#9B%Z zB_EZvV4_?EL@gpBV*Kdv*=34HZ$l}C&I)9M-0VD_G=H)3HdRqX+h~9Q1K99=J7385Msr#;5e3IaC`~u@ z{p|^V4{gAysO_(3R6)>h9*9`}sGc#HgNeil6wUBo(?v2*urxYYNT#X5iENfWGUb}I zc9AYj-Bw*>Zm6D6)qaDYCXM?OEQ^P_3(*?ExxRD zq+@e`AQmOzncxBj6{Dew0hGN_xGGaqQ*S=CS&aj4Zg+Zo%S_Y5cDLM9+fXa|(R9z# z*n*yrn$%>^CJX?#>$W^KKfR*Mgdc+9E%qd zX#^1O9pIeQ)gb*Kd}$)Y)(~Ns5}L?micc#m+mDi$8;q!kABWXPR#-$xqoxPQ8g$e_ zW&arj=Fm|ZLb4};Z=g91OiZdF*(C4|9L5e3Z=?wj?3>3|GFD@sJc7wN<=2>seU8M6 zOakFZO(YeZo9ayUN0CQM#%cq$b1gtGvTzPo%hFd%O74|hve!a{X|2NVn6xhjZ~s6m zC6^s@DM`+4g;YvmZNo=IwaDi;2znoI>Eojn%C=R}BD7biSiuUU1~sOdi8ey6iqPTu zpaJ>36)?gerpx%KE6p9^L4+$PC}0yFQ(H57RBrV5)8x@3@_Dgb)ei5zk4bhuQoXZ*t>eNY6+sF6 zl@)pW_Ex&0L-;m#pOTUiXtrn2ok8+HiHrUOs3{yf&ly&#Xjhl9E?QJ};_vB%YGXdC z{Sdf`=sN;vb^6fT8wwiga8Cn4w(xSX%4sHQB2G56(e7Y~8Z`)Yk^g|R1_snl1jY_% z+(Pd7m<-w+S5QE45i$&73YnW=H!N8~jiRrQh8D!7w)gaGMemnQ|r%wwZ zgEW7x72*B>04mobm3-Hj~{n}V~qNX z1>A+QaQr~eyMm2C%h2$(9QgiyC7z}RHaV6QjVCjM@N^Z;CtPG85Ofr$ZR;lU-&fDB z@QZCti%*Tu{AQ(Y$`W@D(^SMZ24KO{h1M$8G&A}iD0dM?tG-WR8ftfM?%efRT`>ww$Cwn@G9AGEf|No68vgqa9B2mFf!s>GiheB(Ky|Lya~RpR2p z^71_3J)q>5V6duUtcptO8Y(kA2A$0Ysl^`GXjv4#w|QMv7H(1es^iY zF7fd5_Theap#Ucbb}|q0Mx{dg3e+KVrSh}Tt+Dq2FP2={(8n5C4QLomWGT!iB8Aq( zL>hHF0duSn5<;v{#b1PzOehc9t+avl^*IOu)v|J z!P5VUdXkbxl6U|C4jf#bnT($(0Y+^f0=^u&Yl`Z6=yV{b^fD-)5YulqKjghZcC15% z)%ks=+q7GVsvg|LfUidhww|$AP;u|)B!uezcS2)@+j}lQ# zlhH^f*86*mAH4U$I#X}*#DmU5akY$cZf=V!Xy&saL53My~M1hv#)y=o4U2CXsa z!etA5l)tUgTe?55KGbzLcSAu$no`)6awm--=e-E}I2kZsQ8+Pn09-&7EF<(kT0@_n z*c+F;U3eq1mV%p1z(E0>qbbodWuW zB$Y1)1{*O>D?v-?nncqkkZx*jJS(BZgL3p`I`cY3>bYl8C3Eo0A$^BMiTAZQty)l_={4eaRYq3S{5$T^sYQV&_o^wCqqW71L47ElZ?5bUCs_iRr+?gy-!yOdgVSbeuS7ZND7$d%>$et zjXpg1Wbp55N4|7dXr2z16Bvsp-=wf0&b7|Jw~dcL_qYS21MO5au(Ou{qD42X*kx?k zp`)W?6xx&JZIcsTiN}BJL6e)HIHZk2SXe+4TtR|DcK|^I9qTMFoa^W*60wCS1Xw#fq{i94C(34Vtp)Cjb+v@S~9Er5QmIZ_RZ zx~h+$i)J@k3TH1~+=AD~aaDotE3#E^qv`6vgYo%2*52J+ z@f|0r4p7|XjSmuATys5v=%6e>?*Ppj%RA4XTHbLf0?%UGE`#$IQl}a+j5pUk-ZSUT zi0-xH#!|$!lzqdprPzGqu@fzz*;wIOQkAfi>Eyv7Be<<6ep@kV~qR1!&}ci z|0b&0gG-(pxZ8N=PDX{-&KGlPs^9|(ctr#dB}p?dM#N-+=~C8JLyR7xA|!xBPMHYM zGy5v2a?;G6Y|fN2C!?{Hmze4RB>|)avc3NWJHcM1uhLPTIUx+RWRM;J|CA;GyDCmT z&J=OLh5`N{Tp`;BG^DS88!aP7MnIn4(o^8_3)udKL6IOFcZ->JK4fd4odrIXI+BH^ zOCV$rocLfXK{7YokIn9wW!jhCCwpFgvNl)2doV*OuxLaQKX z@{*$5-?uUfISVkYSdi^y$h4K8UG)j85O>%~3AF_ZJo6WC4mP}bZ<^rZ&6#@3HnDuR zx>2WID{}1zYu9zT(o<^<*9sk6yE6TRDpRyT$ig$X*|OQBHZMF^kX`Y;@J9E?!bipd zO#Xu-KjT|5!A=v9!f#NLkTJJ4;L7qI{UaWx&F>;L1N*P48l7PO>392}ax`xcLgDp& zBl0HMmshTL7t-ij;Jr>PqPwafJj%5+jrGz7_HA$T!KM$YJ`ERe(w5zM#g)gi*EDV0 zkDOB5+S2Q-CvTOP4I1Y?aFvP}<*<~tvrNb9#himyNd$O$WLik2Hr%@dntD@i-ed-* z)uHkW8a|TDeu$og=h3VtR(&%VdHGq=z|(L>KgD>crnU8oikz0dc8rp>EoDh_EM_SVH;1)A72)w;dT5 z-?sMzUTa%rhQW=CzzRu30lfkU8i4Sz6@#3#c20jh^pG5eNlwNHI4}f-Kp(mQ{^~^} zI7rSbLFz;Zg5ISlg2k<-YS4eQB)G1@lCJako`zuCB8|Y?f2FxUJJ4xv#ns{4D|zbn zL$h{kZOs*$FMJkgu@$79;j_f9*N&AsJ+BL)RT$&l0+`leLrs{HRh2x{%9+kv*EG_0 z@zas0Cw+g%9X}*9U*OG$r(<14mM?OGtG$ChSv1QyuDO!(?Euz&iQvuP0gT`+Mzqv(6i?7PN>G75wp1{_4V( z>1}%-pZ#8q;SAS93)$I4#KmcxtK_|LY-(_sjE*S0d*g&s9Xc>q;ou;^F}FT*pRCU+ z41wVUhjjENW1fl3WAnwwTNdaFci*b??g)8en`5CzhSKMEhPVUC46t~fh_1W@^PAPI zOwaMfI`=drVW8UZEY?@G%%j^Q`c`m%nLE>vzIzgK9`IgO(M*LEB^>6ESP`Y1R2fkw z8Ie{Rc&QliL>=c|XkchaMFUb_`|aR)e}M8kV?LukQLjkQ-rfAyaM5kPRS5UdJMH5F zvU*2<`|L$P`-zFie|@SboCE=zk753#M8bYMXc$~H;d2e=?ERommo__oRP|S1=^{T- zzW?(p9VK0+~W}SBMP>=$5q^>0o~j>PJ&!>05n0 z_lNX5fq8}9ULHNqRid^h-;@t%>-$pkZY(06VL2dSF%4lD$Oyk!q4quUF^F#I(#oymgq^o-N4?!7A&4BYmvBLSH`JTj_U4gn`)441wo>Z za+Ob@Y6l41nID*;rIDn*tqn3_UiSwUTFhS_@aQuwK?LNQqmHeW#1iHS3oQ(!*^hlO3kf&vjz61qQt0<|#Kiy^1zm>5!0gcC5O z&s@mX!EOQN8k6e8yz6K+IO6f{XR2)GBU5qDaL-Tj9dZTtj(cmiydJL!TBH5I17!)5 zs{@UXxf(pQGFN;nKPDITYxdX9Jn@|l7>XmcYE;|k(xSvWS=R0{0D<{)7cV{~g(FnT zSfT*tXap6A46r~8Xq^GW=5X7w7y z#l@`>5h<2JHxjc1C&`aUdGcqS5q!%7Eci=L>mR=!cPUb|lP`g<-6MXTS#pziO(oFk zfCE{10U+njxYe``Iw2iW^)GN6jCDz`#y|IsJ(DXpeHd1ic)q1eH^0eHy?EKym#Yuc z9Lxe@caLi(Jj>XpmZx;#>-Pg2xGxpOj`~h;rXi=I03a+49B6MBcx7Ue^Jg>0a8roe zTx!tw%WA=6)qOI*O5`}t`i`6W{PmYv#a6Y=`e)CQI}KV(M}K^&L<%Fp?6=P;?=+++*_Q*wNUVpwnSpm=P2d&P`*=T&9@_~QTdHej1;96 z#HMb=I?aoZ6=1J2v~?F|( zH|-=k+TT0AuIRdsGA>AZ-a13JvC){xjrRt3tYTFHgK07U**QO;nZfn^1P~=8piwz z1+{?knbvfo;aIDf^)?)fvoB(P{-p(N&QEYJwM4{H+YWx!b~TWt?MsQ#&Lmehoch!B zD(M4=v7Xmn#ep-9@d2y1e|RrC{6Rpj<5;KmC%>|N1)OFzN^v8Or8!>g^lk~|EF2r; z<|!UwiWq$-$3BMO`L%3!PUJ_$C4*nymiEB^6|XjR%QiN!(H~@VqIWXh_!}$2?&~FX z3l}Fm4UV64+(l^kYUg{=@%aXgnPyW55v$$yIbG^Oa|Kw-7t+gA7DlsXc!%nxyc$s{g9GUQndiGvuxSfdumhn0n3FAOcX|He1#zZ`UIbR?yse$g|Lyl3)NUxH&8srb(jX&=k6oHl;-qTa z{_KOt>&fl@qXKkuqY}f*em~?z%2j&}c@#48bE#`r3MpP%JhDJxQA)fPKr>93TtP^A z1acVqJ8q8v^M1oHIPxYM!2{+KFHXXUIHQAtm_(sw_4)IDfSolU1)KmRdYZx#a&yRP zonY;#T90~PBaEvU{WCyB763YoeSd!+^;SasetPRt@r8Y+EMZ*E-`4$rM~jK88=2AxA_LM9$a+kC+mfL z&+5UKxpI0{twrXpUGK^Vagm>2trbS$aYwecbeCRLESllh^^&PSa~LHm5!^1VVRIcilo+x^3bXJtSCu1Uw|tJl3N zuU38$9JxdEZAWLs1kZ2zX1V%y+o-%rdyCFueih?68bU{M9o{Qtg(_DeHPdg@%>MB( zD?T`@moQ%-4*aEEt2bnv7OpUCF#l^^(2WzBORnV>mn+K+z!XaP{e&NSn7w#__9tCUJG>y}9{lLR8BXGu$0_N@myjW>#j1f$~y zog0F5XrCY{z>iu1h#+1Pg!ep5y5Wgs4(tcLS7Of5s~~N>4P-Z#{E~1)LQamf5rFQ3 zCqp8ogxamdGevO@?1Uyd!O0*UAPf!qv-YK-`GM-C-7Qaod3vY?mp2FtGzWqCSu#mE zo#ZXehW(Er-^K?Qd7b78s2yXd)NJ6xE@zZ6mUB+47+G$7bL2z7 z*NZamnKEB2{CubN<*jpOlkWV-dN;bQ#t4xuBo2{h!G`Ne9#Kdx5TmSCIfVlUIc^{N zaywAosEC~2IhS$R#*@H-bAHy4>WpcB?}e5Y6pK(Xjr@w;(D7HtXRA;xHJfLpgD)SV z2C1=CZSn+YcOIxNex%_Ys+j^vD;#U^O!$Ga#BO1t%#3ZFucqmiojH>YzD6;PqA@UjVoD zCv9i~dmwh`(sq0V_G!*8LID;7pi@c#StbsvySsG7!^w$X!9hXq%Q($S30)(k0wjVX zm?l8ygBd6+;+qtN8qkV~M8gstl<_Zi%B1l}!wxjLh1&KqR0s&k5e3tPFf`~l_@kU7 zA}Ch9c+t2Nz&@HEM5ozD-s97W8rx*(B6q$7|4Gt5Ughu$R?%=2w2OB4AB@+<{XikV zuwHmNRVMMTKXBCH!tFWn-5C_*&N=zQFne}#)9ly#iboA#cd{k8~QHU6f_T8 zOflmUm&iQT(i(a1dW80qkxMLLPQhm7a(><92Nj< zqW~`fmz1Dwje)KoU)$opo zKQK6UUUi*Y>(3#I8r9T@y_d(vHP-)dEFlj^_VU0{CzNQP{WtN>s z4W} z5i)A(raHJGFrztg1kz+|oSW5z{pHy0ROT+mIk;@QBytkxDeZnN-txDzaP$Sg3q zFpt#SkyvzMHir%>0Hi2KD_StgNDhP01Rp5yA`&$M9^c{zEvRMYgCg1CO^Un! zn{NcE7F;9@sT!jFPV5pxFq#zUoPtDD3daSU5Dh?b-XD5+hi3YiXZ^$sp~E8PS!^oC ziZZ$kG+}pVhyKow6Ej2CjI7r!-`)A70~s=FcT1J?xN(fV@WadH@n;t-dsJJz`{m|$ zqc1A#&Trlu{w4J)hod5Isnnwz31{ER;1OD3w>~W`v>5*CxP09^jlD?;{|{?#0@vf- zt&Klule8NYYAb1y+GsK~$dFV*5jI$}#qu63>Am#=Gh41PR!Jh;_$b7xU~Q*B|! zkaG8@wE~jkrB^uolLGg6zF#<5p0;peTOhm_u%ulFvjnENk08ko@+FBG-W*4M^ zqljH`1N0HQ1*}W6quOA8zuXHvZGf_N5fPCun5HMkxz3OD1BNu+BJQU=7is~6ib=&C^9X6SFE3g{3{gx$Sy4n{ z{CFV%wN(oc#K@DOGegO~A5xY*Sd57% zGhJa@YbU0xdu-HGPF|17Kalh$p)9mBLKD(* zO;u-vK00QE(lBL=e>Wor_SkTV)4jw*ACx5a5FHPaw8Rx6^*`!+2p|mBj!)k5GFa8b zh!X{E5Q*S=YX#D?A|eOXG(wjeATaegrKZ>K;&tLW>!M`_h8Rit*T|ESrXI9- zkcNR?)*I5!)#o{2eaHj~Cz#UTP(P1`9^euaxet|hbS#6HO8kml8YB_<_je$oU{KHw zpicLW_k#E%3l#?7729Ai6Oa${C0R6(a;bo#q$C<;m?+YleI<*sb6Utuo@!8X1GG0DED43h0K^ih-Wlmo zP5}Y0if^KL;U6gfGy-6C4#o`IfP-~5CgxYj$wK$fPy6;g6d8le^89mqdHmvdO3k?q zlvYwrFlTM3PM=* zNF6i)X#tt_CK8he#iNG$OSOj4QQ{SZL5i>r3y~z055{7rg#lq3SYl{1_Vk5L22o%M z*9`)TIV99id0VWf1o8#3kdnYwp#zt0>HJ_#9xAAZ(7c0$`10x6kSCak)60&SX7Ns(b2wl?r30uvHL+|Xy_XzS!})Y zKNcWUNENv-$~bN_k##1Jwy3BGCFT}czpi@+`F5;!qNianeaR+c|59IfRPz7{ehoi% z?(9oYxXZ)Qj1D{^;P2xG;iY_Xy5nwf$_Mo$0m3UzAdn7yw59glBh&xvyf;IbrJT~M`Oq{yb& zq4Zn0xz;}fAI_d!U+K)bZAmeJYmrt78JQc1t3X`aj?}3oiw+FY&s9v=vC5#XlEi=BuIvJy`aCDm)Bs>E49#X#A{>6S2#79nWne9afgHpYaIXNe9QT16 zf~nxaBYjbpNQbj#vmOEW4)s9rmz?3#g9<}!zhB{OgC2RrKK!!0egAR+$05O66eiHy zLfQjuCsaV3r+I|RTTn5yZRx&%I)iFr72ei%i~wA){}Vy4+y(9eRshb@C;QsEHJ|Vc zINuY@Zhw-TvCLF`;qI(u?*TO>aoz-Kll0v08A{^~5YZu2MK26J^Kh6%2tH61B3eNx zi&Lvj>UIOuluKiY6?Ycu;OHuVy9`(==y!YZXs!ivD4!>au^xyzuw`f-|z9b=e%#hs{@PO`MFcRDqFMd7di7}ciG9_ zZ`ThGths%_UhQ|d*1mj44YeUosWbzovmusU`f*(FCg!zESS`b)7LP68YPjREYTU>| z-F=xwgvgU7NV0hlfyH=|J}c^|2vUL*ObjdXY_XlORLrSI2&7~oq(!vbHnGDxspJaDbSgXURd$_*<6{se2*tNEOqo3TMRgnEH#RjeZJlGE6e zfOZCseSvlFP*6oBZHUy`K19tsrGIDh#gqzty~z^^pE(sVc`ceqVJxLb^7*PBaRk+27YG!r7b=VCNs&*Xx_^c8K z3=Ti1l-dCZFh`TeMdFJVGN8w`s-RdwA5?2Nl|lOt+qr=7LqH_#De}Mih%|tVScDx9 zQZ8MWWBuE>EKq0nCAS#(4rQm2D*a;iAeRz@t)IIxdbpTh_kWc7kW$Hebe0*%n^@(s zmmlAzU3%?i`5OK{mfVw16-Tr!R_7O`tv>xVW_PmKg`=gJOOLzT{Fb&%bk3}x{Nq=2 z>`(A@nI~=Qv7IrnhKaMm@=W20R{w7fHyo~A+cP|xzUrKXRLCBv_lrS>j%-vsBCOl+ z*>55K(uV2+&M>+6VEh8hKQgr7(J4>isOLgKdmIqqkrV(m89_>hq*74>ycm)IkOc_< zp=}WU9)Pm#sOLk}0Q$T~<4%aTVKLoARVqp-0E!wx1AqNkcNT^P!TK=Had8QW*HWyV zX@iG}WPyK_xI`5x!5~<1#o5M5KJfoRwx4!7BVm4l1}||Mvp@%mZu>MoGmJAu1}H3D zQo5RW>|i@h79qbzV$`H;4MHTy@I+IM0s#Te3DsgEXvW!VkaKkbxt-8mwZs!rIa#e; zD?iE&wj%#TFGfqJvuTiE#d$E+B(^bg^-hMouV(NYFeLE)L_ojvAm}QK%PZq8ZqH)> zn`D&JFWZ;-?xEbde}_q8vXlR%N4Z;d;J>NgdB**={^BH<9o*NB-@)htE7?~{>T)yO zGZtTgK=kS75q{zOFyOH6paAOg1pQvRIuR)*a1j_#J;Ks7h4Lh+Z%Zq(9gdfER1B3A z%^GevvcA<6I0{s>ZX@DYx@rkdE1VIaVD}9tpd<*19Y5_S+8P$1OA{4gD(SBSu#Nyb zK%YS5(Rx*i2N3|mSy~pDvY_jzvoIu~>39-;BQ088R_p_ch_Q=sjBs`X+L+Jcl2COL zbq0`H5_h?G95-Iq6+I2{!TqWe`fH3a`1_$jaE_r7S{z71rGo8Lu=}*hfkZK)++Z*kD7cn zpXN=q)^i2Og}KF*G31YQd69eZq)bL~;T5;3ZG2E7gAuH|X$h{kV}76Yc#1v7k&4MiRlx;qo8mz%LxH{A1Jh<_aWs4)FDeUlwB*L~=*}y*qJq%#Fq^ zDHG(F{-B*+To}4Bbo);1QLvykGg~;~;ewDwF_0AyTA|>ByFeQ&!!;l?S}RO9;pyEFz_A022Z>A?OHx8vf!GJS(9=442N;pYj=;0YA5NUIJCYdXN?T<=XR4 zF8FI=Mpw{OBVZQ;IElGr{0DaruzKne@6%U1E}eR-;+wr|^c93a#EJ{(U4s`eZls}q z^{V*}Sud=OGWqdcOr?$y<+mPT@$%go zc)LYe;Cc{)3i3**9$59)>!hN%p==O>; zNT8fURufhWwn&tlMISyiBX=8~hL|bwNajprBohGJ5_b-{$Xvv3$FEU9h97~ld;qDk zc+{;BZqSu6xk2Du_YD6_U>JKt6ON&oOgdSlXW+0~gA>FZa0f72QQTy=mPhT{5`OGRoc2(_$r=sJqV7gRootf9q=cH6bveljDZ^+WM~%X0oGC=F1_E{kVKAd!y5>v; znhOz>3;WQ7O5AXSS8#XXHev(MBTdZ!P{bJOa65e|W}>*a=PdC_sg?#u5&TM|&PimR zq^W4RL%dt?_uuD5mlhzHB>_nIFC>|VfEI90<`Is!h=uKdDH8UDAQ>Rfis{z?SVGp> zZeqBVQnqcVYQSre0whh`mOwK~vV*L%9ZoaC8n!VL zDHrQ4O9p6j38RHwXgRJBuZW6rK?NxZlOPaWbmP|T+c0v> z7J@|kN0)(nn!#XO8X@T6TYuJ@#74$`JaTFV1kwaR)fh4i2+!ccllS%AM)qW-6v|aS za+)oB0JQu>+&tGI(S_o6q7G08+;!FFv*3hn70m)bbaNo{9-$ZE72-G8icUYT!z~GTbU&WOb=yDC&yHIYioR z?pw^nSwx_q+T_3~-HxY3%8)1m=5p{ORdf$%h-)?tj?QJ8i9BI)?~^A_mS$Ix7q!EF z?ZUw>OG3YV5!!*b0Y}OYw2Fh(ij3qkfDDR4QLqEnC3-@EG|>$d22g*rFWS3e6%j}R z?;fO%;v9I9w8c;`5rwQEUZO>c~G35Q##~0?7xGUWAZ1`iw?_ia~wgpqfMZJqFR(1EAop zLx+lbKxl(br;wr|oIdBet~@YLr?Civd5%cA0YQc!gFK`TvC3d*Q3*$p)}oA|Uyza` z(C`)z4RY>#rgGbN!BHYEI=uH|8#Tmtls2K?JeKuT8vu)=V4UJB+LJEF?=bgl`S&OX zmJ;yx)+5}~LmY|I zg@Q_CpjWS3XQe>d82lOno=~zQK=cfuT4h3S2wWDs9F~4zmK1caqcASOU+?-MCc&s5 zcxt);L|Q^L(fX62&Mbp8M1Mz>FF*`R*R5I|#XZwcI|#?DJ`eI)a0oDV0Bob~;xs2M zNmMJr6l0aof&GCwWA2%Zreho~I?i=e3W9^C9Ha?m)a&s1-Ru4!=8r%u%)yk+1eui5 zxMEhIKcZN>08l4Y3@!A3yA}8|&-$}c;NVhYM_Q$5BQed>M!J$p`%uOw3_O6cS-4>z zU*Ai0U1ETYL0~}eL`IR4%P<@gly#7hV1fKQpn2p=VLHWt`J=pp>aA9B|B4A|nBNV( zLrlaQ0HZIUAx$feie&+FQQBoaw4w0mIDm!$mcBsC!~~!UU(DssLWzzP8je3jMx!%h z(h<;rOI{;I&fty8f|#q>43=Rt5DD@_^1l6;&&&j+OJOj9sHF~ti#=y?8XcGb#jg+N z<6|U}!Ma4k7U?81{wNZ&8|%pJz>w^+_Z6y+{5P0x`BZm!6X<2y`jWtZ(oASEg9!yghmPg6)GTbx474_S; zB;d6BvX?kG3dq5`fqr=LO3)4Nm=<7{D8p#2}U4;GL2GGoK%z_A?z6O5FPh2 zRENIupbA`lP@^FAIg4EXKd@Slq7ssNGeAkRH$q_C4P@(GM1xcg+5zYUffQ+=q$0px zHJherzfu(UBI;kwsGA_y3cMA$-H=rfLznQi@xXw^JS8#oA6`OE^U2qf@fI}9E6W8}Si+S6l#v=Dg5+g%urZT3Ef{R;A+dBdT5 z4W+>h2B^>~J%+o85AadRVZ^@WXxKsbNvtZ-qn&yQ$(Ck~M)+z4D1t%77)DABXaI;n zZFM!W1(ZXe+E_SEfW4+mZ{BnbA~KM_xof#f95fKA<4<@*1f%=}x8xRgN1Mgs2P_2L zQxEb=u#_mOLVd-q<(Cl{Oy3>5hB(q36p6zV!$F52i(^qKoMd9h-NGT%N7^xY{I=Z? zZh)UghcR4@MitoKpl#UukZ6SaAB<%I$IhRHv3cdt)er4C_Ai4^sC_l=W|6TlHw&Zi zfCU4C|LcS915OSK`|xsNaxhr3tIjiS219fQjX?i_*=NvrU^1p~eFU+HWrKcIJIAun z?CG^Vc5n))SQF-tW;v6Tw+`9XY(@H&+$Urr{QS5Ng2aR63qU+-CEO6emUqL#X5f}@ zf;|DZ7=jjjl7fOWN>^h8>8e8vS@59-W3j>1|F(E>d-V(1hBsWSvyY!XtxD99xM0Sv z4xzi#5C^4bLnu3A!(x8j-g+@6o`G91r_>a;FOTAAQ27tj5}MFcUkNpB=t~SjU>`U# zwQwb|djR1RkSMqT>jzBvENsm%%KY<5frBI_0?pDH%4T_uf~a)_#DrAHE#ilq`m~yw zh(dphYN`Q*B1Vcqhp7w50prmD$)|sE8O0;Q#`cH-9=E9%2}# zBG;;u(@~NOqJ#Huz|U2QTR2#u@@s*RX{89DQ}eaqACeN!4&1Vo0K~ajJcpD)VH>X0 zoQ{U?NfLG#Dg9wm(M9nzdF!Z-Za^Z6>VS}@TY)E~p`(TsV@P$6J5^p7U}yy>r`B$(Y;ScJkaR^PYtcT;1pxv)3d*T#_7{h8^873?RM#GO(+5&UJ>Y&Au9 zhyITbn>+PPORrILP4IQ5xo0PP@m36&(?4;XZ-?n>j z?5H<8(%d1pZY?Ax74`R0QL!+mT1C+xy zf87CN}zEvm-4F`3tKi(ToyqJ*b7_2cHK2aEFNV3 zdhYuEcUy=aJ0>qJD`Tw6?94G!kg1SWHmgudw$Q^PK=85H=gEq5p6k10{l1Rw+Gr}I z<6oq&_tEQ)dW@P`ZS6CkTWhvg`l5{TISv0&Tb!23pg&XvQ(F%()nYdcz9=D?2@(!* z%TG^+f8K_CpGokUg-CZsK7D!`>pQ&Wu|NkTS4 z*tT^Sq<*)xh zc=E9MqVr;omqHB1d=H=Ze75sf>yJ`~>r=F?`Zw8o2JbNLyO_ekDZe+;ZwN!M(_|M~ zW3lNNyQUc8#yUL%IHxAY2yb9(;&hpVS? zRSQ7&iKGLl-L`?p$K|2Vm`sb%>Zp&LOgMhU#CG9CU z_q*OOOS5GFb;*JbH}#UCHUnYHFK^n%JOe8^pN9MhhE=F5=a!hUue?FOiv9I8*OA>^ zRWDDn#Xs7h_4(dxnKf$ck#BpV_h5}jjchQg)m6B%Qme2A&#;Xa{{Nj)y}zb(H%8`afQ1~hAnj?~l&#oh3=_vpY-5g@ytZO{V)n{?L@5fqgnmkHY15+2J zEof+rW#$o(xRI7+{vNuh9g85%BdtWf<+2eHmtk?*@(bm3T{w=JnMJ>WsbH)qdX&7H zg3BC#JqxwTf&3lR1lA+HL0Mw#!Ndb_q+EG~a}0c-gy2glZ8M0o>z*mw7vwn7PO5kH zyNoei#;Unwg;;&Y-(%gaJaOyYk4URFg*HA@2lmKkgPUX&*RD-4G@P|ka#h&TqWO4` zR|_~feX_0w)OYR;pbb=yh1IFa?Cg=!i2uzIqOFasXRL}%cbgZ_b;KA?By4DGZDfp1 z7=ShUm;GS1ji&Vro4O0rS6Cy@%}uMC`mwQ}Z`(p;;-pN^cfS8U9_)xQeFMq&`N~Ji zV)vax+kh4nj+w*kAutAwn{M+e%3^4y@15^7CIB0%fU%EQWg~Vi|I(SPc;zwZ zpFQiG`qp*4q0ZuAyS~6NZ^6HNUn!x@kA2E^2II7Qf%4r5j+qE`KgctN&~s`C_t6yO zPnpyI=r)eb6{NwTwJn1+kgSNa3PYK!NY`xc%n!>f#Gv}j6@0gw77}h*MMWX-^XZgd zeTv%;CWwRIyh=D=EfJx2)8XI%eD+B55D6)DLi$%ni}pJQOaSvUXj(bJSHQnV0!xW zJ&DT~a8+wZj74PWRq6SLB4$K!6(-}-x+#aJK*z%;b?Vcl9NKyL**wy+z1;XcY1M(7 zDZUoAGO#2&uzO)haIa)Mkkh{*A-jd`yjjNhTACKf&S7Y#4i#fn4^CP-O@g`VwFVwd zD}R2X`#8V9vJ(j+u?^6kLphXWIG zHAe`Rd;NlITi-Ox*rDelex-IEhRobn;wB3$BkUxZa4A_CL8jP)IyzY4c648U^X<0( z{3IwO6ucjvl+R=+9UnN8D)s*F$>=>|oZpGb5@f=aF(6N#KCQ&Pyw9hQA zM)Qc?ZC-d|bTiV7GXp09V*zPn0T~J0<{hO+!*Kp>gS$3OpD|>H>pO8$ldn)6ocbR- z4vQFDlx)h)01Sjsunuk%MlgsrAen>e;OW;h%-6ph%61amEHHcfrwy%#k~H?GN@U-1 zTt~?AwzO<@a4?)xPsZJoPl#1JC-CR${^xBEzNS?vB^!$o+kz`7WY7hKt_Wf`R|SwM zapAyYaw}uq@4X;Y$z!;|IQ^O>WA*jK^#$)pB_`etKz!kc`pDSk{##co}O17Gx zUPY_wuV-p1qJ{r+tya@ob<0=8z%h>K=>h*gXW>#NW5l*>p-1Pm^Jm!YPyxmbvaN(E zz(V!M0%p86v%=Sk|2 z!}I}7zwLAW1D)k|?~OEmoUi=zRM+N@14~qDj{A2Hlvh-ZWuL^kxLKuEuV$1zVsa?( zzEU{*s9|2#;xI!N{U~@3;3k%g#w;GKV|g!gM8%v(1=reW(C}d zm^0r?K-KF#mw4G=SXZ`L!kKoywHu`ubJ|U^-tOLK`qd#R!_=#7%Vf{Go-2wOm&e+1 z_A%~mu<8D_Wmeg3?nY}RZx@vxwW|CR9^$99YZA^>@qJa>8QEG{@X;&8ZI({R?dxu- z8*wRLyOxy3Dgoiifr^hy-p`pb6*K{d&nUI?dGaXv6n+Y=RmWupjK4jmn`}%jDQR+h z&vpFJC?A}g1Vz$LyQOoQ8ocfW(KQjx7dz8OPm_StfKj#^C-EXlu9CDWYF>1{{FV$z z3!Un-YL1^g*+eKjvI!=7JE5_+J3=+_cR&n=kaxuKcb~D);JNQt$~(LT@k-T`Q>I5u zW|>W_32^0YY`>533S3lp50BNKdQ67yX5I9w2`dMA{x$;hMqP*RPpi-M6-D~VaZsQ2 zA*5M|W=-0_gmfbg*R?8IgR|i=TKNp*poXHdYF)3Mm zORCQ{UMFY`c(pXjOQ>ZVGHmkAetY24wmMCeOcp?jMODLHX&41jMe?mdS&-ZrYL;|z zcgxS@fR(`?AEmFB)$K;lRt9Hvt}f)!%JS&xD1H`Ym2b^&jRykG0;5Z*EeHo7GeBJ( zY5b5a=xf(Luh{bP<88uJmm6xr%$(_tFBSLx1bSK0RUp9JOi~Wflg{9x|ekn0G&N<;86{dCa!^l zC;>~xNAve6m1R*Xwb~j@EB~K9b!>^`wI=(u5N#tHGH3e>U1O-T!xI!_vN1ulNMQ_>-BFei zyKl#|sfye~wYfmd^?|h0`a>e82Lg{bUO-i2sB3aOLstJa6LB1o$SVT-dk9&GlG;eW ze8hf_laO+uWC|Moj()|fS|lfXB}uJfsAO_@qcDc)r}a|$l$hxJsdiS3y#3NsfxlG> zAhH!nLZH-DhOA@qmy7e{089<%t8I9VJYsUk$sOaL&SCCM$9I;#BoSpbK|%*GL?DQRdQG^?I^Yame}WkjVL{VE$e%o-hHFF|!E zR3ypCSul0LadK8gls_#gZS3FPCjC|B*{Z;-i8eYsZY}apkfa83;9w1*m1p5m|3kT? z)JNHX^pUbh2)-$p1K@B3DIO!rd8lpZZ(fpvI>WP-7izK zY4iwZa(xku8{gn?KtInJUI&6o^3FRh3s~o0JQc+n)%|>uL8G@^NsMzjE%)#iU`Qtq zt-VsdKQwy!X#UVVR2n0&hOE7e*{a|yKo!D5U7-Wz&zD=b=jLaOuNjRy^-VR>is6jH zj&)W27ifmh;Qp-1J^>!7`nZoD2aTPcoT^c8%-X1;aOLOer!^gI)A4d>PVg2O0=OOO z##p8{Cr{pO&Jo4kyxks@V!~B1OolE19obm8_t^pIe-f*1y|qVFVDmlm6c1zqGvYqU#^U+pTQK?PAdi!7V5$5PbX;b3@ z14t$qQ6|I@Kp0iq7H=3mNis)nZmG6-+Q`yreBpn##1bD>2P5{ex%Cru5YiGCy%QKH zUw@ga4Z{?GjF>r$qBJ-h8d3A%kuW6rLL557zP|kSuo3o|h~*klufeSzLP=90s#prh z)diWrQ?^*{l0jlV_3_bg56K#BTx&eI#3sh9%&14`0JLH!GP)8{Z z2OB!>^6>1aHi=%YE>4YDP_wLx9uw_tC}nCgn;bCPCfU78D#&Xh;7tX)T9UNXL4KrL2ilLw)SWc_GI(%zj@3K0ol zqtKvYg;8M*(uJAS@D(zp#0;dFK5k~Froxs^?a4q1h{eKDGlncD-&F<};Fce{#?afSlm74er@I zc8FAf!fg`=Citcp8*iKV?x&D;)!Z;_1gJ5@QDP#+&Z2(jTh_r)1KF@{B^3a84-{OJ>AAD#=5#lSuo z4a^qR!$5yNQ1W~`aGP=+s@??Qm$XJn<}nt9)mH;{FXyiGrLyqS&hQ+`2{ zcS~mnyRC`d3q}4HipII=gf8aR8=$l%==?wx)g*BWt9I8-e0DNK><07VsvVP!wlYL` zrGSn4EIj*sx)HqlBd;#ZIQLDbt^v>AfL>EgVE7ne*o;WSisBhnPricZ=|5IFPL9@r zw#B0<-^>keg0dPlb4sZjUj;(6QB%GTMTiiBq*&MztNQ~C0bwNIpAZj}-c^myf@vSo z%s|p>m7Hjh%ugL^xJKI+J-P`XvKgQdmM#PgDU^B-U=qc0^5^L}cmx_dLOh5f z2_7|!TQ!vNi2OqZw<)q%J~UK>d4xrpH@J&AE`}3r{nEBe6H14mJW!SaE&yd2Zfb}! zvJ5vhkY(uID{*tV|Jx=cDR!^&FF@iXTz8c(!cLVJy34fwhc9e7f|Pg^28yuvaZ}T9pddjOxxA!5qlf;uwD>^E zvVwa+wh^bU9I1B#I>9d+V8PKLf=YC}#3TVs3*cC4q&`oj>jYvDe+UW&6hq6k23g^$ zQHg+!Io84Ve^DmQqnr)k6OpAv6sy6cHo4tAqNr-G1*a( zAd;)D;l4hH2ggw~ArzDri&6=GQDJ0Q}3?9{2F`wKk?%@6+TO|wZ<9jtANKE6?Ubx!P5=)h-L9X$BD zrfLDDzB=U67ZGS*XOC9SFGrs>c^KF7Ar1KPsFEFA5R_&%M1VY zV|qO$MZsS|>aycHG6c9}hvrmpDIW>fkNiJa1zuZ|yq=m$``sI#9j^4}pY^rU_nG0# z4>mjYD||BlA#Q!@*u75oGaom;2)T1+B_%!7C}~;Ag`^5%&#IeK=Zs~(IX!E8K0WT| z4VC`aLzUdiot5Nvt(^7k7_Z#r3b9`W(-Uq+bm?sIiawlIn137DPtSlvF?>Mw>2cEZ zb<`QxiLtZ=jy90wX`Hq1(sBNCOm^yG6@71>t8wX7YJ^TEU+pY8dG8Hnm5g&kC~1t~ zT5ZbaMV4CG4rJHh3dq)V7VDVs<+w_+2?pDXbX~EwRFZU>oMo-^(mj1Jb<;Wh-+3AI zm_iS*g(#l$iJiKQ4>2#uH%7`gKx5~T((KJA$2zv1J>@+3Str7)C1-b9Tc4y;Q`=}c zlGsK_s2JMf1L8grV5js)VWq8!7SeDjd!9B{K724-e(b~Cnqgm=#vgH-_s(ou=Q*C) z$NdROPD)!N9LYnJ$yva}cx{t6+^p*0SpGbl=BSK~f!4~l3fJNdy`t*pw07H+9E_#w z3S-FDO+f|ie$~Ng7Phe;+-r^xWy+`4D1NAV!uHUlsIX7{lKrmcPRu@jeLe#z@X^ex zslwdV#F$F*o|rV2YZf+bfAA*lWx_yQbm?K4Se%l$bAHOsOvek}6eGab`y`%qTq!1` z_~99IrAOmM=J1qp9o%9*ImD^$M-tSxN*^ycb_sA(*=Zu94gQPmwFTB*NaU3da!Fs z60WY+Sv+#$in5@2zBp64o+3AcNrUmnEw2ZL1iUv_{jaq5boTq-`&5Nz-;V*nW;1#g zRO9=+_-oPT=hpnGWwRw$_jnq9{c>A@r<&`lsr-Rjg}8N!#ozLL-qwjQa*QB=8Ab}r zHXgYqjU~j$rM9C$)#!hQI%hw`SZT-XZM&bw{AkCL!p%wDqGy|aIq+=B9oqz*h>=Ve zu~%wZt}hR=eT?(f3~#w3CeG1Dv?UF9P|?`MMJX98F}0S1FQ)VzPFCD0u+itagBn}q zhcn#*{;waONfmorp81&ZMRRmknTh368`k@VAnwYIgsB#KU`a6$j?}4D8M!BJuY`5K zjo190p}d7NMt_(lPv{?b=4q>YcBbwI){*j_NB!}a-d@3-b$hn(n-6Lycj_Oj&2+Bp zck#7LQFHgicEk;{#MQ5p z>~?x#z|$2Q=OQikYP_V!vqx;pp_N@DZ3X6|ds5@<=IBnINH$#mvF!22XQ5?*r%O(Q zWl1~hD(vc*IOXZ=53ddYB5Csn(w9%u=IplpB$}G`;|#Kffqx@RO`8T2v*5BTP{hN zgxC#YVj*+1#r}spvJu{d*7pqQPiMeJG{~{Le2%)j<@{6Q$25kz03nM*U1F$LnB4=x_tztUJ8uH z#yi>4OF!+e3&)f1!^+&@`SO?yD1Yjd6eNf?_~|LryTE8c^9%#-O#H_2Hg~y%X7?($ z{IGfyo3+3tXr^o<$~`0%7b63rH}rbZv17-M0DVqfM9H~Dhpai#HqHpXct_E`{fBUJ z>u!$OE7aIYP!#Gt%~1ni3h|fv@aZE`=2>tB#uEF(m_Maond{ud44ZEQ(O(9lE8|8( zFTEeH6!={HE$jW@x_5v6y9re>e_hMD@J>X>M}A}#lBgOL^My{dhpLNPAW*YnK>4E%NDa7{EE2Ir4{5BQN9Va7k!@#yZuTef2j@>s(I1v^_a7i68y zD~qUqGv~+_*{-wtvL2mz>84$W4Pa|!8?|CakNfZX`aY17@JQr##KpgDd1u(Kg8Y7) z{ReqUTs)*G8`RXkN<*(6{PQ`EHPihiGsx!CaU^J!`n&2v3o9}v&QJ;rQOpp*RC<#? z^h%RVv|x7tOBldOB-n(UQAV_WJUW=6^pr8YZqik6{Of*7w-}+LizXx>hHD4Y^BA4f z_Gi4&8_Ut-fNz*hIWRD>w}}f1O@?llO!K2+9AFdF(C*>OuM!WF8(1dtCWi#*ehj^o zZUH95-Q}SX7V_*yCZx=VLOuk#?2g^DNKmEr+La~tZa}@P;DJjaRHlY$9zKDmU%FFd z!y^ndj+}VKu2hm_qc@?n8MSx6h5U`raPGSFOrVT!;nLf+gK+clpaQ?x8w;#^DOTA?4v5^;+w?a+J zIP{RThizHe>)TvsD@Ke5)Eu4*b!tXw>zlzh-Q(Y=DVB7qozEs3YwkB=4-;E5O!vOs zwW+&dzcqa*M-tp)FH(B0gBAuUyRAz8GIK*;KuLnl_k-#E zQIb6rM<96Vdr@-U6Zmv@Qs}q`nDUMTNuf0011*mxM;`Gi+N`*?NYWU&(-ntPZ!`D? z=Q|AD@@s?7l>bRof2XlLrzV1=(C_LT8XuaNK#^uGRh(`Ur#;M=hBySI#Ct|bogDDA zf@=G3@l;etlZzZb!G8p!lK7H`4}Q1w!v|$76GZ>=sQN|mR`ZimO<^iiwIA%KmE*o%@L+mlAmq6AO0vB(<@(>RPxUQ z;nXo>C%E`g#Me={hRiG_+zg$f_J<1Z`8=v((~9V<)o+hxJ#Ays-ux5T&GuU>>NDpE zL?XgEMEzN)p)z_5Atn9+=nX^%iJ$)@^a|A8VKBJa~39MaLpuO{v_*?D>+@mOsM19}^|QKbg@yXp zwF~ERww-(!wXU&qoZtDAK+PsCg}@VYBfXM?N~uDU^3ZHAY{}t`8g~<7#nH1qTOP zKS#AI^i8M+{45|?c|El56jV|Q#sL*%CGs8hd(c^-YVEsVSX0vn)EMsBwd=xQ2$g1{ zT*kO0WGCwV-Bm8)B{vil6i_`Z7y}mPMi(i@sA$AobG2U9eO$2kb7NqAPf>qWh_Lx* zr*{znFZx}qm+hL|k4Mm2-^1jLj0QoNjLi;V@s}xppI-nmq@Hz(b;E3BWo6V?w}0Q! zqoP#SjrB~emI>#eJELj@;0qCc3LDE0;+cj~TgC%3aQ>)Ari0e{B_`PDZp<*8)@9hG z>z9a8^#{H1?Wzv2`y|@PY`wbdLm;uxsY;OWyGW`?gkTt{ zLqN2s<~q`BXV(`)w&niAhq(u@xtS{nU37cr3))U1z({Btkp?K0hR(f`g}UzrQ6Gm# z@km28U5!uI9&Q+G$md4p#P?MNE_C0=M}t+^kG4Uzfo-u)=GYX~w#>3maD z)2=;xvVfS9Y zuWC%3N#TxZ`%Y-Z)jCiT1-glOq*scfS^`c1W|EdA>~ZQK!HA?Sg3f?KKFlabroxLk zOU_;+!8+d+RffyQ)-6i)AZQ3BKb_1%TR%{rD zYdHqgDA{TBxl_x5>L{zgh9Iotk%+(6t}3SYy!L9A+0k2c=7=YqWa0LT zdZeuOx&6_nZ?@7+Z?>`qyzp!MT>fs+ma7`fDjSzatOLrsMI{-nnFw;+x|};aEiD+O zCsc*aNj@V+;#~W7Jp-Ig)lQS+FeBtvQO`^C?F9ILIZGd{N-Ce8SVa1HPCxcLg^pIY4gq7^go33!F9E7`entIVkt?8#97xeocs~^VIZpJ2Mtl@|k2Cg9{NT_U zRFtRVAS2m3O3oxhKZe@%70cVpfDK2ksEy6q>8f$6#)iv51Qlv7L!+B9IhxUmla4rN zq%j85hxM&0~<$Q0>Y|Yi2@#2lv zhtL1mNB`{iz@F_-?_Kb6gc7Y(;Ah`gWajAmkeW>c>}xB6^5#`-7OXl92PuzOKRxw% z?O})SYlQ-_;qaT`%s*Vy%AroKtir+h;3-w}ad6&HxjZlD;592xYEX}q zi$RFyuTykryzjmV!|%k{ndc_8Cj;k zUXCLW7Jt=mv!3(M=-PbQ>W|ed#vT{H&yk0=`EOg_oGp2E)p#W7*iPPfoeJ+i z_bS(((lR&7$}l(hY$hKZCc8cVpt+cHdHe~ta=$Q~sMRjJrw)-rt6%T*d~&DJS~EXV zt8@9qNjq;VOEpgJ>q0j_*gogj@PRG&UFg%)AFR%W;qxCaI(Hq{l1o4J>-RY}@2hkf zc9}Il;|9L###$u!?&XD!TjhI@XFPG!+bj~mfw^Ck48$SK~%5#$|i$7gH zseS5*9oG!bu#6LS-*~a>Z#?~SLdCVkJMGJf{$)1d?h%V8T<}D=(UDctu0U)Z7pDr7 zA?vKV4f%5jP8lojn#SIxP=H>v!F zY576zqJ!IG|2(m6&54yU#_^(M|H%)d#A+RGqz*Er4xa6ro84$J-<_%FY*2?@**ohz zk>a<%x_B${gw(KnX16>jrg$MUQhDH!sk+v7bivd2Kw~*h4o=E*ZlVWYC30dVjoNd1 zu#uImd^4~mT7rbjus`ltdG56;_AxD%*DjJ*i&9S6BnA-9n)OPJwz`aK215R|>Y z;@R?w=aSo(pe>AhTiwb>clGG6LEni%H}nw1<)wn>x+*;n6t25d@XPMiELT-~>Tq#i z{)EBh@CkDKeI&9RpDiv8_y_0ATu_ECVq4tgRwWlvL%dAVjk(t0B^PJvpa`!aZq(>u zeB;pMa*qHa{3tNON4nb|4tO6hlU0~-ah{%t@0E4yEE5wl%#5-PKTm&~ z*^Qa;gk?9U-|Nh7ncO2Dnc4bHSw|zwo_wf_I&U82!|t!&fba6qL!4PQd&*YqMOg=v z%H@ZQ>ocw=$Z<8dAk9g(ewmun0@JHE9O@J=hg(cNF1?Z4yPI@Fe%h1!Aq@c=wEV|5 zgXz0Hv{&V_2q)H~aNK->!B3Xv6|1|RjzL{3d^8@cBEZBTY(@nW|p)<9a6ZPuy-#I;+-8Jm%F2*yVA}T)_$7jeYq)cX*F@SFG7IV`0 zu}oW|uN5jxT}rsq!6lrT4qno(Dnia~M;NPbg8A`;o!GNfpOz~oTml;|c=?W>7tWd( z)SSKdxq-)K6{*~%LQEdg7}pClT6ZyzqCd^(4;@@Fq?4|l%Y&Ue{Q=9=L)vI8-91$@ z^^JRAo>fC1mm9mlCW)vFClCF}I<}Krxr8plUSa;ET`x@ib$iD(b<3BhZS;>5SY8fV zS{~9O^XE=~;4!4zaoaA{;a_I-&_0xFd)|kE01NAdY^}-~k4*L3VkKsuR)F{`mJF?5 z+&ANIzbd|1HT%*s$=5A<+dhdJZWFMOclNx;-gdG!FD6aL&9Qq4)@ZRF4_4CG6-SG7 zUw=s~EyxevqnpBm1P3(~XydUy|M*s!x*+eGHG zo*&-gI%Xpva7gAKgE6|{R%qtAkImhgv)D!c{WjIDT(h3>WuKPcF?3*#&`cp7L%LI} zN5*zqDkS30e8?SNIr&RFvi(_6yUpkrTTK+gw|-84*|WVu2I&7YQZ74Xg3D~l1jm4} z)9_pGqm00Q{TJ5$K00*cRkHr?EIK&m93Gw#*{eu?l)T4HD~I14b?^F|MieqWLt!MV2xqPzoeNdi)(R$Ts zs{g7uBIsAn85nz-0md$q%Jnw#0DqFUwX$t4&qzu=#@~4NT<3_zA@xJg)>v2I{5P>$ znfE-N9LvWGs|((R&tLzpw_H}2l^8(?7^dPV!f4U^qJ>0aA3vTSH4^veT=Vbe>gVY# zo$t=kU2E0bv<+byiHDI0+ab`|uPb&YUxGe90v^@%OVAwKm74EDAnRoc0$0L0NZ5_& zer={e3`k-MLQwG4T0v_dW{g9l2wc2FKMj+!%0Mf%09+osQ!p>GO+lq zz`zRo7+G#`#vPSJ+-~9ea1OXHw01$eG+=;p^0x*(;VuHfvpU_Qq>RIHp`OB4!V}jeJ ze}V&mMDjjHZ^+rgu9QtcE-6TB0ngmFdGibaC}B|gO&=Pm$S9^v1uzAY_9Z3}&KY1fBjqp&S*xV;OOcD=T_ z{Nf`{xtI04*v##xtJ5-sca26YZi`KNaSMAz@I+>?(IE#hIGe>rpy?6KSNHsnGJ;po zS`4toFsg^#V3HKheC7UD@kp#&03C%Wf+ctZutg91WH&n#R4{pfWJ;!X&!i5_&H&K@ z%+56~2B9ldzo#JwtJrrnuv7GvDgnSoq`dyCM4pd_7ZF3q#rj?+g_ z*e&>2158m+9Do9;$orS`-|>;Ne{fH3)mc<}P$!^as?32P&4Gj?Gtdl?dbkn556&JZ z+ZB164xYIEkDy~P{43U%K1n}A2~b@`86bdU`j8MMGBCDeEx?+SLg5P9P!v#S2$Y=V z5>g9zKn_XQpcM@ z3y9Q8fP$@;(f|*^Yt*L>vr5#m1;776VneU%rKsb5Yg-YRWN#o150NDV&9CJ1zy%6` zU>LnPKpdDyb1`}`xVZB=`{#4f27o@dMO)W`I1bsZ3#s}-f zINVhT_C|VQ@(o%t{E4Zid;EoFEDSU~~{| zin;bDfUPU+0@S^Z05$|Js;aX`2fL!79`_I(7>AKe*mm; z@im!4ur-zxKyDNbaxYL@)U~vzMZu=^ zO9;klr6GsDI-o30(i4PyK1ukQfB_nGUF-bUJ;Z^dR2B5v0;!c$yw3CRk2$M+)R$5W zP`nRg1KC?@H3VjG!ikDiSipoTSrhGys--aUfUfn?3nR!AC#kfnEa6Od?_P+Fl}H~< z>ta;?b!V~np?ykeU}517tjF=KmR+&Q9|dt8uUWyGIs;7ffQ*o<)xH=11evBaKl*lmLMypAS+-{R*B3M_?+?eQFPt} zvurQ>&8LWo)|3|f6psA-m7Bz)KIW<6@$7|!MC`~LR_eilhm(z#3nN_ETZe8%99>Fc zS|Lq4h}BNg{VP`rSSa({YDHnH5`KZjKQW4r}XX|02OLt5*(11IQl8Bwa<6i8$80m%k{M3IMN zJd0ZnjtC*|K!B0_eyl*DC0=l2mjH@%&ub(b5lPH%nDO4xy2%jCA53!ABgY@VQ&{~j z5cy*|iy`zG^YG!aBOdi9sY4*dozbmAoyA3Y`5EazR2!pt6f`W}zk7G#>8)d{-ylzx zSl$pMd>n2qrP_n!EG}jY2WHR_4-2Co-%Kf+nw>bNkQepk_R9M+!%@juUF0gL^FHWx$E(txt}@vvS#>LU4tg^_XKAv5NykKr)I)>#&FnloUb z8(0`Od=zIC6pGm&V~=hOiV)*{@e32ai@W;r-v^PN0txM|#a}BycV_U`v7NBP=4CR# zC%ItHdj~(Ld1SR{g~44)PZ-`q86L}LRFeabhx!E)D*_gODV$gVDX5QaKqK`em<1{U z#o&@GSg|}BMZ5*3zT*ps?yKv~Z`YE@59siFAU23j4kSeN%P+r>`0FyXds+fQZ3D`S zsAnb`LQy+T>?4gs44Dt)3`0Adyrt@g;RbC1N z)Ii1tST5tuKVCARZH61}-1e z;3<+b;7~5WdLz+49*z4Ji-*|-z|MvkGb+-dYOjx>SfrzH zd*Bp$jC-$xi$o6!)G_zLqbH z<^AwVqcR<+bwkYn#?*PKLL%LD)T@AQh!+GxhT~c}#Fz6<<3nf9rZV0++PwalLbC-0 z6D#||+wvkSA(990iKU$~YZfs^V*)zVF!i|rf zaK08$mz@Qii{QVk47FToh|!WHQ2vH{KdSL*3hF~+IlU+5QF2CsZw3Pn#CEY#t7nU| zgx&zK<*mna?WX?=a;WKgLTxjGz@IoLEeX5m=>1Z}=FH@XP1BT_a3nP{aMxGQytWr@ zypvc+QX@YNcM=g2%5VdmYwkOT$gbGd_O`#=Bl((sfx)FN48ZTu>PUC}LW9c=Bojo~ zxE-sJnreY}=6@F@Gt{cBAb0Ex`gZY{Mc&WH<9hOJIU%uAFAE!^Ryp9vO#+3|uon0| z^5MrN2!Ss$6mBn7=BcVHjIlAsfnGSR*iHInj~U}1_?)NyYvQNv>4p1Rd#0?$2|1FX zum_{ze24{g%&oiIY|zbQP$Alun_QiuNh41A^5 z+TDn=F4mv3#|Jjma#gU@Op_qkfS2)7Uh)z3oS=b+asITI+hCZMRHuU?Zg~+Bn~ZUE z!FK=+Q-~Guex3c)yKWaxFlP(;wFNsL>*uAIyaC@sy^w3jKfpCLpA^T->hy8NN5KQ( zk4fwB?J*Mn^O>WxZtLu!?5LWflESydMj)y(?@}MQ56w?N4_T*oXYbs3GZV9-Qqx1ygVs$SAnPCa-#1=q nf6<$+PhfUhpCQY6(&@8fm)$uPGXLtwHuwn+ln0cIp1bBNhsX?} literal 0 HcmV?d00001 diff --git a/docs/images/webcontrol/attribute_lifecycle.svg b/docs/images/webcontrol/attribute_lifecycle.svg new file mode 100644 index 00000000..2faed034 --- /dev/null +++ b/docs/images/webcontrol/attribute_lifecycle.svg @@ -0,0 +1,2 @@ + +
Enter value in Attribute Field
Enter value in Attribute Field
Detect receipt of value
Detect receipt of value
Validate
value
Validate<br>value
Set value
Set value
Return completion status
Return completion status
Display alarm state
Display alarm state
User Interface
User Interface
Server
Server
Display new value
Display new value
Generate error
Generate error
[Valid]
[Valid]
[invalid]
[invalid]
'Local' Attribute State
'Local' Attribute State
Submit value
Submit value
'Server' Attribute State
'Server' Attribute State
\ No newline at end of file diff --git a/docs/images/webcontrol/attribute_table.png b/docs/images/webcontrol/attribute_table.png new file mode 100644 index 0000000000000000000000000000000000000000..da55436d3ad8f6b3028120235ed9a3f8ee8d8337 GIT binary patch literal 86615 zcmdqJbySw!*Dh)zA}Jk$G$_*2Argu-h=fQZCEcyGASKeJARr;#Al)Dx0wUerDeQUc z`}@xC`@Vg~8RzWt#~ypUgNKLvdG2+uwdS1HHRm;#?^}7s__rg-7P z<;4pZE`2~nfh$p*Heq^bFRC@kkqQeD|S7kE;-U?S~}{m?a~zyiza)64I%O*uF$RB#2AvYPbi zpWnz!@9O{RdkyQA;oL{4lrWmVFEW^hB3x)GaR2T6_bI4KI1f>++OoB35`BkqwL*|7 zcw-ab!%I}-@!pDYJG{VGkP%>%%jKuFoes#ee3HYE|BY^U(ipXW;ow z$s%L|$bKu^GQSZrQzj=~pRDHoHgL$BWyD{#$r2{89~^QTfIUsMNGQ2)8AL>~<z2R|mDE=ueq+`+ zgd#-=-L@Xpk-2@pkJOoZ?H|k8yvNI;s^+zjvFXbyej-|jjhBeFrCXBp&P$|T{fG9T zKK+a5nWxU_ArTZ;j25Tf*sqgnFZ5(!pKsh_d6X$#@7rw3L{3`wNr`gZv7w{KF{nw8 zda>srWvAf-O(%cD{X@r-Xb~lH(j{&6_dzvyC{9L7f?9LezL}kxdXNe}&sx0W=(VZ& zwywX@O+U&vuj>AH$=snkG9wDFEL%u5nW*`U1vq;|6te?FFDG4e5n^+6E)7}j!ww2s z{Jb@D(LQ+<4OeT&GS%5MHeBD`^?x?v|D4V%8K8VLXL$`S;SkDg zg*hkQnYHO9QNp#8*bBIQi-nq-*jr{Tqc2#lX^DxZc7{`2r}Z^z+Wb(VZ?0~Ea7)X! z;%#+3ljN>1XE@nrD|+q67g~&I6zJR9(mCnSy;AvkvMTAtw;v09h(K{X6ZLZSYaW;6 z!+j*)C%a?$JV#RX&m%wMgp0bG&n`YD*n9SAbTSC*(k#ENVui6Z8NQ^Vh9Ki}454&( zyUz(~f_Bb4haV(~r>$|!{9q-L`FD=+DUXYkaVFx~L)vUkPM@Ag+v5AuF1}mJ8sidkIcN4~J7yGGbB`n1HV%$^l!+oga#RF% zZ75P5$wY>z2&4AM-ykiU=H$GJV%xJgAxoRi)EMJhQ`+T8N=B5{wtRYlmmZ_pcCb9Z zu*)MPK)a+ev0jOi$$&h3VgD#&KZf(EqM+OMV&|abuP3hmvj5dC`I%n zpU?Awg>L7x%a9*i{Bq9muduPj4T2>Jw}` zh_D}AQ*(Bq$rxYltnW}{;!11IIF$AIV*Zs)|MR6Wnb_F@C(EklSPT@cCY4(>g`sj+ z+kS2=tV_z0zb!5NqV;;r`pB~q_x|WrQL^nU8arF;kdT@9w+R_rXdkXc7YwynF~K89 znQHEOD*V2M-u0C}u=~hWg#CuG`lD+hyU(VczCL+&^dp$IwQr3?$|8iOI6Xn_`8TFH zrQc)%eJWl`B4?_Z)-Hxut(^QzM4e;9KdVLn*7UOrRGnKW_*(?))Yr9R^M{bCYM!vR zvY1<18VZwgAM}hk()iE$Ucrb%p*N8^E*i9K%7DN!lD=rZ{%OZNzpj~Dq>GM--RZYB zc84hiO8M8^ASbU|r(be|5}HJUpT>9xZRGUxO3ZC8VXKH|ps#!mSDIgtR;*YOTg=n9 zc)f6NlwY;46WSudcj!(*I3_3jbmY{h=8&>k^a2xUMLoQV9fvl)Hq7uUtkb9b zR7CiO^yCyR#*Kz~9qDYJhWU` zcOL(kwDbtN-k`mN`H`x&Uf8KE`+@|2`7JBn|6;L$L!77w?&WVL@_M-x>-xT?*6-co zlpTtxdQLVQDMl(fV^<*cn{)rH4cl!j1KF(L>DzV}yGF7ou9W2$Hg8@@_+ZY*^70xg zX|LoXC7p(;+ogNOHZQIP`I@ho&Mb(MkqOzU2Jw3ChieQ@!*e$FTk!Dn=u^gz5RR4bk`!+iW0?Ppp{R@ zlFN(VL_dMm$Q*t%mDPzTKF62wxkHgHFuAZa?p}{KIZw_-ev4S-2IBn*`?pMdrLW{{JRRT${WWnmCWdZVgpq5jxg=cd#m9xQp0k5)lC)Wq4Gy5sfaxD zd-%tt!#rw+@2yx{w_>pYnMG&r*9XUADrn$NJIbI+na8}5@!>xndAyc}Te38B8-c%A z&)W;hQttx#(=3bl#9q8+X=S`&mCYw6<@a#-*`3H5ax_K4NzZ#ExFXK#G(bvS`X%zuw`@k#p3;PNfRvv4X5QzVbe_9KkJIRut*AU1Uw@ss2j;33^dtHb4m!#-b%n!t` z&Ujh{bFklC`ykEPRHy^wC_T|b*;CLk>2X&utW--L4RP%CF|?C;B0 zB!4*b`7z0z433z>^2Cxbv#h7#3mjKb{Ctm=>L+$?;o27wy%--62|LX9LsAP} zrmMhduWzt@NeMRCpht-WLrQ*og2{ z++S;bo1xC`)Z6|kBs?e-&T4^eElYyF^re?<2=B@pXM&)&+P%@J9~19i6=8xXg}-YH z(r&l@ytl`hj$eN9*({1tE9cSs2dGa>M7`G-Fcs(X`>TB(>H$Jbt24MNlIs3`BvOx= zfX2qDnPT&a{aGB>x|)b%1Z!lnzh>f4aWl``*ZTbgf^E)9dek z2|rCjEBNMFqZEywei5b8e$(ON&pCVF#;nfe>uNrnl(j#xY`HLc94(82=I+N+U-fG? zbaiDGQlmu-N&o673>&N2l!kuAlBzW(Mt||T^y#!oJ0Pp5CT#4;s!t(2QZ;- z0vi1BUWuT-V8Oet#V?wnEvgJSqW~qOsYJ-rbd@%@2A~KCC}% zb-Ba0L1f*^XR%j(Zl0XaLlAFPxc81c19M%f#KuL7R7IT82yJ2Z zafIY;{hMYgL?pSr@LHc>U5+07FK?rFrv= zKcxpYUzF;b~uX)`?V{7!bn^ZAsn7x+rtTszGPe`uc=GDm+{ ziJfb{&CZi^6*uL+;+r|w;x+Q{69viTYqQ(pzm;#kt_rw4y^Z}}L6VyJVuQC=1f@MW zw^93-E)q_|wIw7YcJrIcR%*>&qnr22o?=pW@fQ zAC*aWyKyxRjkuK0m_ffD%0u9;KKar}G~tToU~Z%BI3{5ok7L#c58om1RZ;Ymhp@%; zq2ndG1ih!~KRz-9Fghd^yu8iwg$ zREq-F>~n_JdnzlZCi+(l`@g1o$|!%i5j`8v89g9HpWSRR&7tjK>>mMv4?W`ed4_SF&~nkaFE7-4tp*6>zYtx;>U|VW4^pZ zHw|aZJ(+sFjH)SZB5drEs}CHJXvGM zqh-}z%`M85KOcFjLM?~tJK6L~*iX&}HPG~vwN^pG8x`ZCJP}Aghz8ZDn?Hrxus1^W zP)`=?dC6P4t8Jdj%QFCbSSyvy^mRg$ntMInZb5IgPra|Gh;{oz4JKfg2Z9hr+G zN}_L$^}dZT!mgO@b5y&xzG`(+TEgbm51gPVmkiD(oD_~v^o>P>(LFMTk4=3FW`ySF zw`1yl-@nN^qP0j}7|OD3^pn7Xx;zTQT9he%TANDbW$s>h@kBT2Tb!Sx_dM6aJ*yOq zLN|J%W500RL1_<0ag6Y==CP&QMJjq9lp}gqf&EX-H@=xwSyr|;*IzioO!y#6(#A&T zC$w9LXT|$vOVnK)Rs4-HF_f_W9gP@UeD`jlZ4g{@T5GtCp*$4#Zt=5~+qEFbF1z&A zf|Ihw#IT1Seqwu}TsCKt@HnnMDB-?uejTL!yT(~tAmh|#ae^WgpUt6`KryNN9N{bCo4Fhg zQi4(8DT8!r*Ku7&P-A;iBH9<3`NH_LCVM6)a*BKT9)4=J*#7;C3-2nI8`ar*fulr68{o)!emCrK`g+%(V8*tEQ8iHE^=lNR%bkY8|h}eM;{ZHBH zKThB$M%uCApoSTs!U z__Ut1wz$Q4a(?K!=Se$mMAMjbL$LF5iN&5}lCbBaoA>E3{k5q)7C3%9GrG-80ptw{ zDr8jbz4a*EG)9h>@=_Td>p>j{rCqW`c5~j91db8=fytoy+YWn$y{Z7Afh`i+TPRZv z0odKETU+~Vmpg)9*sAm5{o*4-$VuZazXoI6)7OZntP_^8vrI&<}gg)-PRrfZg@Wm-1?88h2?(@4b?r z^D+Q6AdK`QBb1xzLl*2i>iohK%eB_Y&9g^t?(CQ-<=6lgFe;*NyM})-?;ecS&|fkR zLu$roU-0)5FNVi^=M*?vT<(FQB#n5`1prCU*mp=3~0(L3LAUXzR^%%&;h-5SD#7hXSSltzf9aRh&ZVkZ$&JYq|v9T$bqw9+n zQ)zD_bGwU&2WCQlZe+Rxdb>|Ks8#S$bLITo$}hnDN1vAY zUlGOsPr7$^|86r5Itm;5<$g{!8Qgx(>q^Q<*Foln&qIa)&twL8Ni$xoz$~?xjl!~<@}s^hd^05 z|4U{-W~Qr>?Tf#C6O9q+{?C+uuZt@yKUEf2QO1|)m&dyrm}ZO!9?oz{S-F}qHtipa zjsLk|E3VMPi2?UTr%A$tZhK=V8>boTD!_fnRO`9Lhwc8EVW4rWDxP>Xx;|0BgN4Kk|E(xtBv*!jhf4qM zdbY?ytzJy<*c$~7a)SR+!RG%>0%y&-B$62H?p6svbt^X|d#vtMJciNd(c>cVj-sc7* zGxNOG`JPq`ml+9HTu|DTOBbJgRc~4z%sMLdIN@#%z9nUA%NZFEfTrp3+YUbRDcfdx zUhh(@jde1^TP&;v)98b zw6wH7BZY=DwtU9fRaNoyiH@FQ7BvYMFQfE?4zJ98JNPx@akk*Wz{2uKgO}i*dgJSh zmyKFk(S^JmPdke)-xTeat$WcybFE}b$zK)BY8TPbr=~L zI}-)tu!K)T%WW2@ss&+{5>d=Ac*2vDsUn%w>cN&@vaVQvK%>jH_NE);2bhGBQmodj-yW zCQqI`$=h8X3>+AE>b@PGG`Z!N2loBtx+Al_y>0X*JNun43KqGvv^2VGdbm!5Z$8{p zVm{v9oAL^27nt`rOv&1rm- z<7MZ^l9EWJblKh?-R}Dwib_hn*0ZR&RoiHhFkx7tn3&j=nxpR)d8ey}!qoTgM^HZs z-fX{{s|_nO==&@QpKr!ZociWnzJ?hZ6C)|Qx3`Cfho`;e{4HDaTkQMyH#ueW2EHhO z?eS##Rm&_Xr`xCZoYlTL-v`%Hb>3SRH!-;*eAFhl=_mj2S{Hw6yKQq~Gt-liXv+D;;L6%cD6AF=4qXT5b_DEg}7-7FrM@9SvB*ohczgPelK3 zHz2Jun$7FE#W&=xopj;f*EHN*#qLfh6@eQ(T zl9H0(5tH_nZ5_-W2fP&yW*LnIx``F3_zzdkcF6K;u@)YqqRJK3L`Z3~Bydulv9 zAcSQU6mTHAy=9VwZUv65rG5JRnMO8IppBzjK-9{LEmE%~IA6Q&k}u}1_5l35*ea3P z*-Z7*Gc)k0%*;FRD8%Dc!9C&mtTO%4fG*5Yfe_+-Js(B9h}iW}VRV80A9{F%gnDgl zZBxCEC}??kV;UR9)JtBqg;I(#+_^KI-$I^JRz@TxD~lN-bj$$XqoJd_Ie&0s1@nGu z9Q)zJ2iTbWS7RkX6X$0KyQ?F(R&)RJ)gJFIHQXQ8Xb8T=@3@-Zf_nGfJ%jnqn9r%H z`7Q_M0J7k=NJBqL%bge&EHP{cq1ce8(_qAK_ikX`;h`hod1fYB>6lD($6WF!A-7{z z^PfEJ?d^`ITP=)t?$j3mqL91oDgey2bS3a#=Ro&bAFs3-e&LXByQJ7y`W)O!XKQN< zs7+ZJAK90v4soUB<>klH()zF~tG~X*<>63Ed_*Y7|AwNLR)`Lf21Ct6NRxS~O^!q` zS(~!Ti>6=ST#zskblGp5v$o1XZ>U|e?JG7_sV^ujbUI#2SF3jAovs7`xQXUt^h8&e z>YjShZ5Ec0>1o}1K(NC#3y%&k8GsEn8(SElW@uE@BQU8B802)nw8o$*03T3$%g*VW z=A}0mrpFpK4)pTJ)@W#Hr*@8hRJ-wGnEl9m0}fSTzlMzOtMf7Q&e~XM`ln${mmu*# zf_&3qX6C2oXTOa{3TRyp)>FTH@y`R8186cH%*6kFazMY@_!jp=WF))ut`Q0bi8r>P zqN?g+h<30rC#QDpg+DyFRs6zbtynsS{iA!w=|)Wa{Bc2~+=?0+ox?b!q)3=cFLWh< zwI6C6`C?IYwT4k|oj`liF%olMwCnrbq+1+^< zFR7+RJU2H-Lr;%OO#IdWoW*u!2;*PIm1!_D0b}Xx%zx+H z9j-ZxXbL3M1Dxqh5>7hWS-^d!q|`84Y&ue5clR<1dhN?XtCm|1mhgl9OjEN9S580# zii7LduS2jYs;jqyGcS!6--Wq<_BcO_&jR+`YNJnLwOf7)m|eb<7RTeXO#??{34O;x58}5c|HX_WYTd+sc1_S?8dj6V=XtkGp>3%B5`e;($M4*T1BH zc6tP}qzKd@(l<2R`DxQlnIiz)1heMwICHHxF)>lCw7>Vf)O;?Oe|_>58Rj(w1qD2O zd<2YMcEz`0aR00o#S(1HRx5No|9x;&bABScy|Ys;pP6aR6`O{Gk1sB|w6p{}1V?mQ zUO0?5y~U-+PR<8YSx(koln5dbfARzk*0SJBYF=wznt~|E{yT^Vz*2fSgT~A&F8T<6~zuG_<^T zL~Nb_@CAn5i8p3wYDq2a&_X>v)jPENcYM;%&50TUbacxX70kgu$c6oR2u1<0|aBAMzo4sg+Y zP^Ba#b@o?BcoJlp$V2>Sr6RHIVX5pK90){-`eEYC{|6@`6I{uyNrV_xdivD6Y}@gh zCc*}ilGh_s9)&2%%Rh+LA&L*`UPvh^A&`Oz$O#?ML_&(kYBeo}#3T4s%S?!Hmk*lH z!+0Q@fuW&3RcB|u1bzoPSdH-cQ8#Mu2jCkv*F#GbOfr8U7l(~sPoF(Yrf$T)&CHA` zWo*m{$GCn1vaQ+cNj`q8y*!Zdj+8t2^whQf&qW)$G-E~B>9Mu>SAR*2b1v32hmwlQ zvn`yS!)aT;9$*31VAv6PFJ9)=E2iJadoutzU>5nOPaAKrRMnpSK8fMBAcy4}j1(C7 zTd)Amj;%HKRXSLhmrbG2$t6m|tb-B+oNh|N0Ff}-&ThY4$_gJYo%BaQHC3R)x3pYb z1RXFG0=&I;3D|1dA13fvU20%80!$5RYHo%SC0#BlEq`_O6^zw*P;>4E5EYCqgWQV*@1qcMpu66D zy+`0{AXFk1c?kw7mpsJyWS!Sie>zrFJFqkG5e;O(^hvJo|Mdf?uAr_S05hVbd{ekI zR?1Rn*!>dtlhby(@j7@L)N$4PK>H8|Kw;R##FBad%V5=M>+(ey7|`q0cm+P>AK!-> z*4EZW?OD0iPeep6A{<0Tb%`>z0LVW%C8hjmJ`NsVb+TT$_@}Njz01t}ayaJ&Y#1BR z{4e(tGp5+Iu=npDiq>g|{`{%Y^$2_maO=^Fl-H_lui_g z0aqt!@9swY_ows9*VAdj8c3bPVbc)OefaQFoi;YmjJvxK;uJ&AE#?So4zEIG2s@4> z12=EpL`Cs};D!1jAGQyo#pp|Qbs{)Z-v_g?lCb#rPVmOZa&nJcEA{pDL*Z}8bq)t} z-JAY_`;3f?fq{WM^Km{Ve*4vrS~c!S2D`sD1{n7+gj^8HO(d}gZ$lDbA4oS1`_p8Q z*)nOAg@RjY6AQZwtc@1WbbFj}0M-HKlI%EtgQxYB+ZgKV>S8DVsY&a-uQ#@|6k1FO z*>C&`3P#+LxfM{72;3ZKejead71k3i>>-5VBtVW7OXUS4uaGQOGMuhg9=HnV9-``f zc(|xud3iZf>eYE&D}?i!UGu`{JHkg>As)!`hy)y2BS%Noe>tz*i)4NgaA@wdkl;YX zs(pc4;@u=97n~3n?3r0v<#UnGqj_!UGBavN$ieTG{;cne z;Q&eG!R^|7y%xv02o*;d3n_Z6zuzCWgr6RH1Re#puE_j(3Ty^sH~tnBxx*bwa)M26 z2jeY0pG1*h_SKPBRc!@?|553{5(!%eWpRv<8(-;!J3m((Mg!~N;Y^6r(OgtpSJ%tc zANd+zU>Z|fj%6^-vh%Z({HIT!B6U%o$>5!?mr!DBIE>rHOOM{&RpX&ai(zFEWoOjmbUinudLF z^`6way9w6cb!ed9F`QcE^?o*-s>A4Rz@>aLw56Q6|25?>VnkK_MU*dWN0&KT;IP@t z@o7d*E`u#TuH5IHc-1;e1cl~1d<1eLs9R=)+&)b#LiJBo@FFTFsD7u~{u+Jp_S=FH zxw{pc(lk%jo1Mg2auvMd5f--d48eakJO4|(IIK}OFIt{_hzZ0(EU&f7I*(Rja&ZHO2xFRnp;W)+4oXEF$NBAy}pYU zxbo(EHt9Z-vCZK-!KLeGj@`HUe!Lld_{;HBC~?FKdpf|5I>n{r&3gw&12aa9h#WVc z)eL4|`timqT<;~RFE4D(3No)gnwXCIx7kLu6N}Mkc%>eHvx{$=YQp8Ia=c`y`1=z;U4onAU#~4req-Up`l=6NaW;sdAY!@yJAF$i6eye&))b!DX zfIWysou57^zx$<<)V-1JU|O>-bs<9WzFLO;(|yhLgd|yV!5E&M7F0Nk>9yE{Vj}fx z!HvWv=|IYaG803R^CnpIhDCCra9q^9a1;685Ggyf?W*mq<|hC*uV#i9rr`bY!#fH& z*M3wTU9A2b*)0>(T#HG&dbTw4O5h5av+sg0#;ox$D_vgXX{VtR(+-ixmT)2QM<6QKEL z0v;neaLzkkn#qq)?js|3k1E-k%cinPVG^=XlGp;rTUfiZHiBc=;@5nIzr}p#lz;Ad zi^mqvJobPAOL*iBL%m5|7w`5=?yS@*#E??5^E6f5*AYQtL1%Kg)ia?RTz}QnM)7nT zaYp^`KTaHjS>o6?bkgXQ3-*SE=Td_&9Mf)<)|vqVV9ujN4c(_Y0jqTO2E zv?^i0;?#dUT_Gd>&Bm+_6QIvg#p+sx-d2J@=T(07z@)C-m}cRoCY+W9=aRR{TpJkV z6Nf^`ZL}fn>i)}?_lEm^6l;u8qM6)nOL;STb9;X?qqtKoOvda(VCB3F;pWv;aEQIjyq4^A2Un=RLnVd#yg@mC7b7C@5yl;w zftxhHWICa{It~^}|aE~V`0U;J>zs>8J=}nLDeLK>1RWLmXPdA#&cGSqnG9; z;ol35ZB(T$XUJ`ic3;D>+r8)RbfC04mG$kv@)Kklf13=h+>7zzO+$oBp(UXuDI0Yz zOoZUlBzzF^GWn$|vVe=)fQwX6Ok_VfZ?>^HYqp6WS8@oMV~owSx;Qc6|Ch4}Bihv* z(HyJ*GgNP`Ydq|HE$JE&dAaX#na%ac{*A8UZLj!7Z7F0s1kV$6Fx zDAR4_i?IC#csSynZx?Mb?p^z=V@m8dx9hTkeEF{n!x+<9OYvUqHQ&VCteDLnO$2^5 zAj?nLn3KLVNRP}Eu=M}>>d(b^YPl(90iR0CeKOC&7HqP$${C}HTY(S-uJl+lyhS(Q zkqk2_w~ZRWZ6pSyJJj~VD66nXeG<2(`j%Jz90MJ;zWbPGH&qiJ%{+Nu|Juc zH^7^B*(K0+sJzQ86RHoet+-Dw1a8<~r+3Isn{Ra&NFr;Tu39!puB7dE|AA#yR2`65 zDlEAaJVXEO5TxYj3^d<8ND-kHE-cVuKY|lzo zGp0xcCCeoVaq7p?LD>SSW&sFS^{=={y-+ZcRdO|X$S^_k1F0Xi!8ESu#4Mgk_)TF^FrK=E-I(z_VYt&w~ZWSvG`w%EA1kx~na7cX8!L+zgDxTSj& z7x!o{*W-H_^`o*MNY?`HOI&c$N);36-l@vilr#{q7&DbSEgylI+P*7!I;e<6y5NsvV}w!$CI_vrRC*m=cSdE6!;XXU+uoW zzGwj_cF2qgUrtoJft;xzFJJp3UvFu3^)q}26mdG~=m(%P!ZTJUYABGlR{a#KVORVV zRAvhx5_&(Rq?3(*Y;Db+nwko`$Xo(N3(TFZ^r!WWDa+{d6OVJ2!NI}kvom)-K0c_f z78Ic-nt48POpx~J)0>Pt+28OAmTlySuxa;(G@N{UaliHZ~mdP${3bC7oWMIBe!dIxrX*7}7~X3Gd#a zgFhTW?I+Ge&;a(a>=r!0M)Ns5@HlsnjpwO@P6e;WnE=vFEG{mN27$l&_nHOtZ-_wB zg*s6O1e$2*!N@Bs`+x#EEquOk-sycE7vghn++kwQna^dP>Hhuu=ticdddNg6gcHH) z$X-fFpnU)S{d8HShKe9ihlGR#F(0bW!_$+RbAEc+c6ExIzFQELUB_ug2=>r0*~dCyKk;)Ze`+CxAv5OFcBbS9)s92i|2O;hDd!M7uNx@WI5~^l;d;Grbb4SP?mykv*|XX zg2KlJ9WiiJ6izNK@c)M(ZGuJ-{YljCW=IRTn?^Qh0sxcF&dz0;@c8n*q31~4cwq@m z>cYbzfC~x=%6@<}#0w^b1}~^90vjucfTLFUGAuN-7Iu}_ar5@uw{JUR?+3!iRirF9 z-8%vsY4&5|Qbb&L!fnRC7OlB?Wet`bU`TX(`0He-y^AdgUC$hM{H1bFP%xphQ@WzE z(g|V~rsR4!<#&3Nbj}N62K1KufBov(A@4IFD!@Kg(@w?d+^F*4NDeUmmg& zHQL(Rg2STvHT=akwnxEaQ{e5-MR%B0HBbs`fh&yWha<`2YNBX zO6uw)pauPz6v(93^PR*XST)15h%C=eoxrUj;;QRFZWhJiWL$BC8m{3K}}#0MH!x zkeEo0@E7z$AXuhMU?X-|&bL`WAMgchbAaXr{;;&T_%Smx0Ah8$e1SYoHlaNgLX5}t zko6iC`D{OQN7-%Wr6t}GiNLbf*48wFfQNBVuK;Ji1PL2_*K&7J0h2;VT22njs}6jn zt-YNJge*%QX>swZS_1&A-5|stF@Xr0{k#;jo0JKW;2}y95)#lC0hxi&6jCIn#vT8n zV)2J;#%Msk@@MI!n0kr@4;_DL1D!NN!;r^j9-WXMUWTPuiDu7EHWqZDSA)Pm9A3zI z1~aHRonwgs5&=x62ET)Kf;^6_2JE2m6%2|*D|BjrhY%4Cl=nbbI;e?8#>P{MzkmM* zH)GXa?D>SW@)6hiSW}Y(w;|^Y{vRLUItaiF`pYOg=Zk|f2mOa4XMcY_pkPkDK^Y?o=s_X))_8r89P5WVP#Y+hiza5K^>yx zkbQ4|-+Hl!GP##w9^u>j_i+N74ynKijf{+Hy&H7k#6umR#9J{cjjxDu5A1``68Izd zH%Qewqhn*n78VOTyL)?x*adFH`gid?gM&?ky*)h-L`5&tkzsOx&qC8hlIG?o$dYo^ z?dH#;9K0Yt>z`&2tzkK;}8v+ncO2OHJVJQa(?uG6odblDL1hfb7);~5T1tUP9 zPAS3-$N?Ii`YTAYY%lL0e_;EUJM2{54Qs`Ja{c>UiFnpyl9;+w*sadI-tcmRV-G6( zf}r36ncboF24uUI_exwJKN-SPEU;cO%a~ICtUssg{9LGU2gM5*t!HAQTV)NH9H@sK z2n9N6{!O~k0N8-=Na)DO$RMc*Oa&Y#C@2WPj1BR1pw;Ou9@r7r8PbW#{V|ILr1J*g zijE|84ZavNpwnOR5`iNh2o`SCoD2OyO~8%FNCM_Tupt1H%FO@gM-O+vag?KZ?ixwh zP~hYRU?=TbcqlQ~DMSD!3TY<=3CJqjh)5gN-H z9NVU3R8uN5n3jfED=rS z&@48(5fxA}jBA#=F#GA=yQ-6m<{es1t!h}<*Z4ZPwhZpL+R^Xud$eDcGn+TLH&Ny@ z_(|RUxK`;^^Nu+=abTkMcj~L&HlA0?Zj*c}&io)F&Z0Er>p)A#l4|+=$+lO7>q#%w zS#*LqPv@G$Ib+I#;N!7h++_qQ3&P$@IlmxbMga%?Cxc?Qo_&m*YXN`0j^YLR4)RA3 zBnVI#Ttj#uhTR9q3T&I6?gyFM4)6+xHZ+Ei@BrYfhT}=^Lqi`h5u~J~cp+ITQfmNZ zKwUylhKZd1fGi0PqYe2?Oh#%7{Nnp>_`>eOogvG3*9tHwc-L3LO5jS@~M3`24w)iwnP2W1K~G zTSP#U?uV!-B{;IMkn!cqM>v1iy)!m(7Ks!Ht|Pyk7H%OwIbyIi&>r00wic3uqyrxx z-!&52ap7`GN=l-T6ec0T6dOyzJUB2Qrlf?Mlv-XM<8kQcG1(8bP)|?K>jk&*f#G4~ z+{k*>jx2D7f6L5II5QD1=n@H?eaLvL>}k=rM7YLU zdQaU4O1iFOzlBiTMg4O*in*BSVaB^-&38S1GlWD9+-z-I;18K{^L;dwO(%Sf#34cv ze=4mPs_F1=jbZO2I#Mx(_(Qzle*>ThWUtR+6`i)$1e~u3i-#}`;`8&m_4 z0^JUQSes$*=CVDea0q6vu!W7@)KpiIRwGSxPW$Cf8%i$!_)(Hp(9=q>CaYJ zac9F?gYO~whseoi(WF%wAIf!{`zjR^F|_B|Gi3C;v5J2 zq1fEZfFzGZ75mLFULTe`KH+d9HennudV>+y z{AmwrbF@~9wisKzx!;t6 z+H0btvx8c`((grOd&Z9Da9~5(#dIK!QUY3Nf+hgk?Q^ z?i#pCi`idtAQM|cI0IgfIDYxf@^?BZ^g3Ofze$IerTc4iAZ=DX108Zr%xhdb`J*?h&&PGaBbn-FJmhk)ai*!aXZ?cXwvV(Yy8naM9Sono+R*a8;Y3Zvp$We#JlZD9eAAfr^}=}eD8t<| zW&_%Ttsf4NVHB7+U0RYnHLvk4@VC68uxhv4^ie+M=R|X%tbWYdliapukH+$5@4u~B z_vZ4crU8~hj;y9EiP#;6i8}gG`{KR|CNXt?IWelBBDRn3a$2?6w42{adlvQW?r^zV zaL5Vf#f025w0?PkWQD6~aqmP0=hvwwDAqghfv^tt9C&D}J+f|aHk{r=!5qmdT+9n07%IgzF7znNKf zDDJiFnCsf{JI>`gY@&tcFJ4DeVWF-{4z0=fohuMdOmkrtZ&ly$V$@^m#tqw&{2&%x zA!^SDtexTf4%;*y4Da(l+-2h>y2AIi#ELlP%H;>L7x^6sEHjF*f2D)KCj*oHV~m}u zI?AvP9*5*aaBZB&Nn$`QrtsSvil;1~!ZdWTKhIN4E~Qm&(Q zHoEl8QiL@^`~mTBW_%(l_IN{JoITDQR#Qdh8)MhRipN(_v0E>U9^!o!OUC|sZ>p*E zPT5mA+&|&xl*qkEYe~EyJD}%lIMGy0lITV_|MRVLjxr4iEzuqA?`}5HHWMW7RqWEC z!g%Py^&!JQTV~sA9AC|_r(IRgaQ%j^$?_?gqqZnQc>b+8G3$}gQ1);Bvok}}=zxXs z__XhB^d3#@Ndt(jy+CkpSzzD$;&F;y<%M;nZ=v}r{>|vPkXyF>Xld?dA|jxU-;qPH1Ga5{*PwL zDKVKt+$WO@ZX%KA63@4yos1%P`1F|ait|(os2mze)~I&?Ahs{aQ@Cl zV%qJmk?&OkG9X!(h3shN}S2LER^D0pZL>-q#s+y7fDiLW^>&lim_O9dz1YbPq*Y8kCz6s%R}xK z9@({%rg)>d*EipnQY%{2LGvhyy&9un;t+Ac3@_>#_H|#iz3`xHwF-Z6DGI&cS*A|M zZ4ZZ}n@GiID6dohZ~UL62IB%*7wy=iJR6+3)$BXYX_RKY79$e(U$0?)$o~`?{Ut&ve~dP#C>ik=f!bwYO4!WO)8upnOwj z=m@8)rPRXZ1}$pyA2d&zui+{`Uh#=VM?y((Kcelx?_w9D&2T}N0v=eo8P?(D=WC>; zMhrL94^5>@&%Ma5-dy>UZ`L2Dm54lE<`UsJaBr{vQv-+}qvjA?S&kBq0rxf_x@><= z=Wm8(oyGoL`l<)aMWdOX6#t#V>hj!F^mAyN(9`%9LGOLqf=ycH>YmdrC+0mE8#Z6l zYBpXh=6M-OW4onSkzv(X-k1VZf4^bJkvvZ3amL)2lV3dTR+u)s%tYu7G<#MjYQSJCsW~18} z$*W$I=hI$j{@dqIFlQ~m^JU$?w`GdVI)td2+Plwm>1%!euxzLE^d?-(p!|U8kvI3o zHee^8d*9a4$g=fcpSJ9?>r*_u$4M<(J`z!Zg!K=;s;sr6v2usB?OGI(wEz8hJgc=1 zxa(+r|Gf-nu76%U{gl$Oe|s(A>TgD7mQJBI55VC)vxJKqe&6ewY)@wkC9|HM-rv6*1%5kWY!8ws)5ItW zu>Nnn((;SV1mT9x>CRIBT$hYiC*b`-yhm~ZVM?L`K_7irI?t$H-AU46JkfEoMP0U` zZcpv(8l+@@52VK&XJEkIs9q12dUsV;zm8T|enGEy(U0^GXOKo@0o40LNnM-iT>Pn` z?RM|%QV`f~z|z#z)s1(_a|&+ofA{fYSqgR93N)EGM8zgQzPuy!ApkH!iI`C!5JgR! z5!Nhl&?Nv&Y4Hl`HZ~%YV*_}$!wx{BL`@2;hmcaJ7FmsZIuNAILvB*To}VE*z~`>6 zO*=(+GWF5)4{w_eD+9A4z(}Jy2kQve6>eqoPp1Ru7vlia{Q>tuQxlc~ig(=RMijk7 z0(QC!DsetwD4EN{lh6x4-#i6VT)tyiP|N|=%X{5dXfP~ixH^GDfp0A!_gGU5S&l}n^E+@S4@_t6#Zsx6k#jdX?Nk(I5|9*0mwtUP zUKGzMS!l5n0RaJXlEM%37{PsDOhK(c-P>`&zqAYAk;1odOIur0sA_W{9tS%B$i-y` zD7+{X)I()~VZI4XNk~*w8AP>Z<>dtcLdhfsuh)`$&G4QirJ>~jK_*XX(cR_**>grkpBYnx*Jd%yIP~|r)lNn23 zrqtLi)T`h5ZyY+pGKXMH{`CN4pY=y^=o$!ba9p^AVAi1F!N>r99@&ej-=9D0Nv1z} z|H}&*GC9FHkGGEHm0p4%LUC$P8DNxed3Ci33WK4a5k3F?qXdNB-ZHMu)Y)lLeOCja zdf}_{-v)CEj8M1<0_t63WBDZ-ji7EDLAm_na@EUkU7@ttM_HYRBtn2+=o(;MP_T@w zlGng?*gq#TtWNhPpR^-E?dNjIv+)WO zUf~d3!~g#H?%v9p!QuHB@thQrV`@Mq5Ge)0fCNKATxk+GngZ-xoo-hPfcv7%rM>dQ zKlrXFz=}|)AHZOT3TWO1OD}d8qfNx>U(+CJ_?Vep%y*Kyid4t6cH3?~^CC93s z{Cf5_b5zk<_J)J2X?$gi{|P>7aHsSOZ+=E)dN;VhaY0~M>*SWbtm-Ew3%B(koU-42 zKYUurpj0ZQVJNszxADa4Gump`?05T~ndh5+_|W01%D755TNBRc-J-s4U(N2A8IG<_ z8rquj-x^*x?q0Q9<68ao!`BloL@#uWcgZEC zFd$-4+c|g}_{HHDiT0ImqH)66i`YiXuB`=sg)IdeGH5((7<40uk8lsER3(F>7-S0z z3oKo*&frX&ottbplsscG`|=)MyS51O9tj*X1nVZ1VVHiPh9w{jaizwRI&qM?LpcTC zF*+y}BxKVi$XGB%+F#%EE0s$isdU-Y~8X2mIAApfTfiL#E)%m zu>3LQBi>S%jXQJu@ne6G&JrM*AmH&MwX3-K=G!Z9Xiwb5UU&T2nfd-KVx|y9k+lr| z4duOAoX|iNBd{fMCF-yswGgE`Fh z<3jh_S9t$j`OGPk*Tz+4mub@}LsvU(qF#JmEj6<>A(m3vF|dmz|AAew@0#%6>Pi2~eUe9u@iwePZ_^{=_F% z+l~PFtYYEN336NC$ z`Nnvndy(bViJ2qoG8}fZz6+rC^yW;+hYT&>YvXa>X;yuzSW0f=L0QULp7lAS4Jk*K zgoW=|^D)z#@@_lO$WGKyZV?tfy9?sML=+XLq~1_&Vs#pznjN>?01W=F%>cW8V1OHw zg!NGY`YXNOIeFX?1Q%pdZ#|Ou%)Vm}bfbi7&1k(K1Tov((M1k$eLs{%IZ*8KCIk}5 z=|4vRU2sQD52@?Hxt)C&Tr*Lw5w$^Ho+4J0OS1z5bQ%xx@;C=d)VnVLLCAFye4MpE zE&O`MbvIK6mYhN+PFF9bw;T8?sOtbd3RWc0-`P1W=J~+{+g& zw1~=y-R^tzVBS^jv_8uR=TG>it&V&iTOK{%{K>t{K<)1jtv;9Ma7gwnjG5Sf-->}n z=&99%&1P&u)b#kY5S#CxoG(QtTv%5#l9%~=VoIQ(JF2j74{n+`{^=37!$wTt2a6aq zL=HGJiG=NYd+Nye_W#HzX>DG;845P=$l!uyQQYeO^Lqh7gFT?cAYl!pUlLaJ!c_>m z+y-*Tpr9y0Y?F1G=UC3@d%dGWa?eHosuZ&58v8dn>7e@>#is5DR$D#JuDX-9ndMuz ze^ia{=GBZN-LyFQa<1!Vg%_s}ahWhP&Z8{;-hATqgZF#%bv}v6Y<(zNGTCKl$c>*wp}IOR8Tc+C1tfbE%F+gA z6#|?5DbL3=71c{}e9BIDiX-H@pKU11unMd)Tw*LIGL)cdC#d2ug9IwIAf(sGZ7H>;Iff4Rq%mk+GBUGQ&U`Y_)s=T+(@ zvBduXmrk7f_Yi5qoj@B905L4ydcM zqBQgRR$<}$w{OowJ?@)1&|ae?hoSt$3vbNxcaYTatX%&mn^~sC7z$1mXuctMRW;!I zb7|Q~j+icwOvNyzd(rKe!>p$p3rZy=mn|8$UL0D^w`Z@#niQ^fV<*+si+DUF)<2C~ z*X>pIZNe&Ei9iQm@*aKANgr~bzkqcYJ4;yYhgY}kwWKZTimh$CTzc%=F2;q`Ij}ON z4kd7LCk^eG`F12lxn=%ov7NhUAL7=X)iR|#BcJLRD%~NO)&DCkZQT)6`lCGFz(o^7 z(qiumVe!U@TYG6CJM?Kt(7@vS8~D94vMlg$tID^p;&&#LjQfoFKP;gi0aBqgkH^FN zy3WoOj#24GyjBaceXlJqOHc~jzPXSkwQF?Y6GoPs`9F`1Pgs4osOGaPUOt?(d$Eap z>OxQyP-buR}$#p_6p=twFt+&#wdF@WyYa5pV24E2~N_4Kl0QAxK=NXWv*rugby>e^@e zAhL6 zlGsiUTi+O)a=Xu$ynZhHgf#`qrLy{QZ0P{_tDYt=N`)==-% z;&9=S_0K1L3br{-#x*B;DM=&WtKPeRyRrG@j1YARqxi0a%lP@O@!hiacgU66milFO;R@ zmsw2SD)>JN`8UO-k-zirZ?Y;y*UbHpd^zRpH}`1ru>Ke7Z+<@<-$b6``SVIHc4E|a_1lw2sriDAJJ276A50%Ij40`K6yfm)*^SSizB@}vd+0o3Y`Hn0tfxQE=T9xT9&(-xm z$au6oG(zdB#F1oPvmpiK@lw;FZTH=pPO^D!i=Et@1-u4{6H&kdYH@gwNxrYD>ZU8r zQWO*vz=Qb$L4p4Xgj)Dq?2SA*>a1BK(dR}l-oJ0+l#c5lm$NL?_HKSg_`Q7B>$Dz6 ze5^nYuS%}XF7H~RyjR|Jn>c8rv^6Db*L28!_69<1*;wI#}pD=X9v=-bQpCnx1k*)V+hw(|<> z4pT|vl4?Hp3L9LKluiHDv=1|3_wvURaKYJAl4c_O>}~IFgf4V$1FYV{sgUlT|LLdg=5TGl5!Rbk?GaP7HBU?p8 zKEL{wYz%NU3W`G*4V1!I!y)qYHJ5|pBZ`iKZQhiV6YE6I*Epr;CG-9`zv<3{emBSK zcE<0YOqN9tOLPKrlN(%@uNkE9D?h8Zo7$B)@PyuQ(Q9@fJLC0@wl1a_78+&j@-d92 zM$wXYO-G9xd#J{8iBrLQV;^Nax{h0F?{<68`0|Yk5m}kT#Kr*OGj!ANN`ehl6daV6 zFfh2G)IT%IHfKl`7A!Ob$y>H;*~}K`h>|PdufWDopM(^+5Wz78u`_WF0H6X#ykPvq z35XZsabMMYu{+OSMmb8afnJ7VpQgU#Uihz9(H!=t;{ZXGp_*q!RED8+| zFTT6ipApv~i~xP3G!%fugl@@_CF3wU2p|e~A_fE81?3>o{St$c(K_9%p%V6J z;LrllzE2M1C%_B>`Y|ndBl&L-;eq1^JidNSPB!LKl~VG4ZKGug=^}1}iBJ(_cE$)t ziD3%hAZX#bM4v9D2M5a~G?!->uCl%ug%QaKjd(@xwUm2Z#ZOi1?{4~H`}lrpR;-iT z_jj|^o3dhy4%Jg9)aAXgv8>qP+3$E*a^wpZ)X2}5Il5&2rjBzSelc7g`!bB&f0ry1 zGc&ly?SpujSQ+9T0?!^oSMnr?(= z7(HSTf*L)EcjjSms@S$|n>ZfyyMm02DiS@!Zph-J;=k^P*b&gJDUmk0(_K1cqPoDC z#@;m|td{>dJ}|U#wzD;5N^IuhZjsquC=e}To#;|wV>0J%uve#8oz?iP%-1u$GOkN? zL|s`yCHpjQ-^Wls$?vH@u#r-0HoUlDR=dMS;A*Tg{{1yCD0?^{+Hq5&Nz+N%1G0j& zu`{j{WjagKKd|rfhS=<8=*kITjy(q{7WAn^C$14I8w}cn1kF*H`nXrbej*BLe%Q+p z+rh?62VMbq%y_L}3Bf&m1|Sle&6NC^ousD3D3P{p_9ebRKuyk?m>4GK{jvm> z@-fwn3BEkVSWE;D1IMANr^k+R7gF0YTq#BhWX^qAO^P6aB=+Bi8Qe3%&eRuV2rDxsu^z7?fcgod!Ov0=2bvg-QLTMOBJr)cg{x_ENC>S0xr+O~!R>MbKV zy4cS`6+TNJe*dDpEKb|ZiNeyelXI#f!G53GDq~l5yA@3d)G#qS%Z^CZQ>AUxZ*308 z*z9^c+UsZE2-f$1?(_H(Z#VRDrLF|`@;4_x&eZ02SBf=sHiuhW3X^eJ8|dIIqjvV= zysdWq0&G`ZKWS*0c=*x|MF%{cS)vxpuS0v7xT-UU|D;CSHNV*Y6oK5Q;Z$k+c`hag zD#Z$L&VAlo6NZ&%ilfwYC7zASHD|w!(;N6T=3!c%Fv#UXjZk{rqubr~ zLzbF#mYKoeLYTIlS4{t}<+Gl}SLL0%)#Y^popf(+REyJQ?xQy_8XEDPS5!;mGWRhb zFmRHj3S6Xc3FLm}npm$aw%USvnHn*?G)X|?T7l}_zP8d+jqium#d9@}#a2$)S(k<> zz3|PbZ93|uR+(_wiMQb4p?h#?>Yg@-9Vc$y``X$Q&y5zFscUN!ojRuO1$TEhF`|Y7 zE`k#k@a(WHrub?b`K~$1UpFMuV2(9WwLkWXJL%-{!@HHMc#m ztJ>pzaweF>oPl#oXVt3rV1K|N0#A;8gfcu*(1s}p_G>@~`#q`W$<2*}wHWcmM5zL? zXQg9OYGX2@#y3{pEktVNs#U}AzwMl<2CpRkSm$XWA)3O4bP>)DsFKeo$65lheZYUrH&tyxv8||u;YNy zn9D$?#!Fe32W*-HY5DgesiBVFgVertbDUJ$xae*)<9xqNrYo(9%J)A<-bBRMnz&6= zWiE8B<&I@vMrbWIw$5qD5Bzg-jG9=;=gdBK#ST$7_F&*5W_J|YBx$sR6T#DCUkh><9{Qp z7%lMZ)vH&rW>D0{8W9npiU@);s7o|gg?4AGdrj3tiO{Tr_ewNMe#FZcdcCszZvN^< z&g+CekE;T$fhHOpE2f`2dma-J{B>qe|H`Vaw(g+H0t89{_i2KD=}Ky8(`tA7v_sZ) z$-nU1cd6hsvjf+~@?@P2yt1_bzfOqT(V8zDj{^G`py7la5 zGzvuIJ&F!VJ1k6?jI-LP%w)!PWO(1yU_9qcSG}`s?l+g{O*S1~k?9MZCS>deTN*60 zdVAPizt5P+XPSx`+x~Kq|2f3Uabl7+FJ~>ib*%Hm$QSKvU&=-JIu*BQeQ$jICTL2I zgovlkF(F_aKHV+)$|tN!{+Ha1+Cy23>8e+7I)Hmt#cUxN2c!cC*%3mk;}C!P^y!p9 zyn8=|mIkv-X}i{{=!(ipFe-G^lpjNqCSi?8*Sa+)S_(d#q^Kks;rv5XvuhCRW3a)o zr1XSc+Pd9irhj1Oh9OpCb&O0ZUX5mkJdflwQZF+yQeoVQokh%ti7OE|7lw1Uu!6A? zvcCTHm{jQE7bT}ItfAe>?whw(pk@Eh?k4j`?(r*v5e8_OsZ&_K`t6tvEjO4@8o#PE zvy-}u>1E2M?rN)~o01U*Uw2-(*_~z3(aWFnAg)1XhGpi-ErZ%0RR+Vye;Ceu_g3oY z9T<+_v~*D_rZ)RI=|0?&B$c;cxP-Np@6kn(S)PjC05N9&-SRd9Ns^MRY_hv9R4R2U z9%qw&V){!kU#(+!mu}x_qNQ|Y1d)h9mHk9;nzcM=U!m~oG7av8rWM)jfA7W!M|SNK~w^k3wO zo>|6qH$iHLWa32;zo@gn1U-B`TO~gzr;Q}+SNh3^z4jKehwXN=5=cT#>mxn)PkYy; zS`w&%5e%SNna*{pml!srb(!P2JTHiRmY$r`_T+t%DO)xO^2lc8%c;;BN_sYlQ z8WPPX7Ls||(`VJ2{Pgx8+~CJnlex+J#AEJyo*C|#Lr3~EgbLlxNk`Utbh{zpEg_jy z(dGOHqh&R+3AkfXh*~s8g6X~1qNN0wc#9`uciEypGY>e&IuYt6CxTHFdDs0rgoB}U zmAqGZoCmv?l+s?Up;GfllUrK^J$D;4%OeDvJ_m(~ za;yEfkhy=EpY35D&{=wU^#XxwmzHs#*|Rk2|EPbi-qYUludXT{vQ^u|toon$pMYV1 zq|O`Qur7yerb>yYaD)5?xN*By3DH2kG!xzYUT1NvK~cY3L7|A7_f%3$9}>s`T0 zt({hpa-`@Tpl!#)B@%z!d$Ti!^4wx&Zk?R{-*4EQy|&}jMwi;@voyWSesR_v-Th|0 zR<3cE>x-hgzds7t7F+$%O~}`@J0zp?&`uYnND|` z$BrCW`sFG2FwG%f(Hbc&>vr+7D1TE!@;^~4FR(aK9(mT2U&sW6mn~j}h3FsP6 zPC7AC=rA17Qh7?fpI*bI@LG_otu#E@e(vaEuWfUPjj*xm{i{VCP_qE;h;gF+K3b>y z{_+Yl5;crSXyq!;n|EoRn#%5@=`R7W%Z}}Kgt(O0h|mzxs~~a$)(@;=q5andPYkt7?Gkm`&{h>^ zFuu-Zy7wL<$GD`DIamtO%Q55kC~gO57Z|vYGi)D;&`go+r%owU_Drpjc^;&xpS3(v zX;=TAcZD!^Q0pU%zdZMQN~fa5Cwx$73qV_;@B|M-lJuDBog0km{X3l}Z~@Jk+hji)CZ|yLSah?Fs(V^Vj2KBUC6eu3GiNiLND@2%#BAE@AdW zEM6+b@&kxZGa5_W0TuuYXJcf8nRs;qyRysJzR^ElcZ`6wuJSa!C27oWdj_9~AU!Jc)q_#-_e;=qvhTOVUfvm|K**BnNXlV$z4rAaw zn2be8&`IAC2r^-A5$j}o-_L$k?*lIWozgxZ%Qx&Cldp8I%c7qsq3P}3&KrrHs`qJY zL3V9bo{f@`!I%c>kVQIvWw$ewCbTz-^&C1CtZ|}I_N&48(u4_V{n^(pZsv``CHxB) zmNt%N2)T{#+Y$ARYn+|)lyuyWvuAF{d}W!r75-S}U6o$)>;i3hdj=D?@~Hk_flnrw zf=2YE?6Ts;L$AfWJ}Fd|MWXywP9oYlhy1@{4n z;{mJ#RDBO=J!$>|FgOv-VE(2_y35vJ8E%0Gx4r$%-}p}8qbEBaG_Ah1mrNN5#o+Z~2oO2v$9r{I`fV^1 z-;%R$0PQx0G1W)-@Da@C)CIp-<*)ax#07B>WpQ|RI~j-^JWS*)0-{wyJs zaw}=}m)Ll#_U18~pzDttJYT89I~0ffQii%kkK51Qli$veX|bNE<&a8Ky4_G?kVk}_ zjn%y`H^hctKh62974P~()O4kFmtMm3(u8sUgo8@`rg`IExD0Jij;?m8W^1pryBHDV z(VhC_k(OD(bP$sFSIu$>?PzKIaJIZ*{Ec8oDfiTtylRqhNYw0W z(eK3ubIIc4W|BQN0kkxmkx6$-$LwK~UV3Ew`6Vaba?)=~ShyQj7}kw12sZO)SIHM4 z7!FW!07uJ7%ODC&naIu!$sO>?V8ArccKuWQt3i@$r1v;GXv8ips1(j!oqYuGAqM$$ zOp`8|y4F@LENhG@e6r93!cX-cm@8r^_6&1}xUZ>_J`HEEq;XJt57u1r^#?+$s{>Y5ff6dRmM-&hS1)iBmF}MKijDRc2 zf`TnMS(%?B4HDsif*%69o3J6QFDOdv=yL!Jpe!I>u}|>`$ch11OJKmsQGxIiOSJ46 zao@D46(9nk@hqV`c5lRd1Lqy!oH7b7Hf%fnGvxe0~`jP8BiGI2x?NmYZCh- zcp7>GRds-W7J>r8ma?+4BAU@TdQ@dQ8?n718w8B~pq3!>XZ`vP!s^@%kyBFDBn9aTp(`Tcc+H%D~q(LbwkmAx>8Rt(Iw`ydWcpMWs6dIn; z$8<3~+w|r0Aw2`*YX3>|ypd(`)1BvN5B@y8kTRxtuvSxMK*?f)KPvfCuKq)OiAtO5 zm6c%zsE-<=FW5OW5EbbQ<5qY~b#c)(P+vq^s?DWi*wNytGj7D9iBt{IXoSZ`u%Ejgfoc5uRr@+DjP`&4&)_dTeL>;SF8nkbyUSt zLP>B;%x^ZyIpef;6~oBK$k_D&-UPQQ2_*qBhlADW1Y~^$0HHT7BY`>ShSy`LZQ6tCNlS4VV`0x=^qATEM#{UT&3n*MaZ|gDbr@e|75rt^3G{!}+9vJPT9|F&@Nzk*|qz zvp->BReSqp>;~YkJ=a1kj>y*toEm8XMdR;s(`}8O5oi>=|emr9OV*Ex-`6lzOp@B`C z2X0t&OS~SkZD(MAl+)!e?Am_F_TrSo&-I>{_YLIx_l{b*avYZz-}UQ#ZfW*{?5~oQ?f`qa4+EzODxlzusjU0Q;-b_F=8~h9>3BqQUeznT7;lX6MHu4 zXn7p;5!ey37?8+;PID#2gv1;R8jdQ&W5i7Bx8_6AjK%>K3yCd|Eu2M#q40?p*O1H6 zoFOV8+<^C==rN1rD@gpvantz68xb2MA9xxZMqrg2@uEeZL;eQhI503J(AKBj2<~V` zU|e9ScoV!1uCE9!`bdc!vMAVo4LKtTEU&2%L_;VL6`~P;_-n7f>1ztTHE=22{_7X^ zfZU#Y0dbQKB%kowC}+1gF$2W}dLv^x!%w@F=#MM&D#i>tM1ULU7ky>9Gf^BaPw9_o zrk2iDx3v}Py?WI4$~(NROQdG7y~|C0==G+l-Z6vuOUxhZ*JNN2D34bOhCIT*fqSgzA&;vQV2p~y2r_{t|N(+_>RPs2Y>^@5WJa+)Ijw8v)qNOM<02Zh#AH!##Lm|xmt>FMpG zG{I;$(B#p>+t$;zJ=J2A{xOY>-aPpx&u*5XK43;5;iMyjfk+pb6Bk2f2m3DSKf?Wo zPO=c>EYZ4oZIt@FQ^RhKb;hobTMN~VLn3%bBq%tz^_L?HNdgOtjMsBu%rgi@V1Lqj zWKX2EA2MDIj11t^^|iIcc8!I6!4x1XmzXf)?KF_7VcC-q0=}ynND_%6iquDe?L^(<91Z~jxY&pc zx&I?XW5gH^GAl_CVH$&RFala-vIUHQ%hf#Py5CpH3TW&qy z5;|C0m0nqnNgDQ-mYp~!147b~+i^qN)n3_Wgo;Fp0ijBHS=nZ68c>g6D}W!k8RiGR z5%v1bJ(Z#B>lVNnu#^GG4Uh}^rOz)LP8)y3rh`S0gu@?cN>}Y1tgfI^Vi6Duc!0uNe zN<^@6H#K#wOE3SNyqISEH$GY&*hcS;KOd`I(!4$(f5KCvwBO94DGd_f$=ee?)Nux4 z20VZ+6RbTW3A6HOa@TGYHBD7eK48lE2d%O}GHG1Fb>dAUgt*F}DXFCnr)R1C(EM~J z#@OCPfCwK;;^>FVCMC15{YB?SfVKToB*8! z%yBsc%Ux?bBh2cg`xY3E){dM4%mEF@pQsK@;l>)i%bFE+qowA3y2VOB%%b_A_@ZaZ z?G9(kzlHJ@kp%7NOc_tB7UBsgaWz20$;yO~=A_sXepd=2*d}^EOh&-)V>F!WV4%&A zIKq#XsTR(SQ2LP|0Q_*PSGuN^?D-$(OWLMR;GH!xCsJe8zn@(pDD6oAK_VMwMKJ$1 zXSx(zVhj=9jj$)$QWRL|x5D9HJ*0jDu;p@}Z-FBm^@ck(_u*^gkOeDI+{@^(bC;TZ?O(kj zB}b2Y(f?@-;op?!uBDe<)R{xX|Aqg%`6iqHzt4KlD!C6X)IWcbJ~0N~Znq3|Q_HA3 z&izl%$-VKr)8{QMbAtNX=%9v5;T5&FYrUKbLsrW!b6n6}nxwbw!KK@0RvQE{+=%Xo zV*OwFqDB0P8+?3y^^XuGx)!1iT_Hh12D+bM{28DQzW7t7tIYG~&-(%9HNXD^dq$Gq zkv~7O(an19&;2(3zaKd*>i4)i!CC35poZDo@g_B`W$izl_fCu#wZtwR5U4+T_4jjq z_2c-G-`=ch47jDY-|@hu75qty_G>K@xBfI8kVBW_cqEjRt8f}HNB$0nZ&*Z=b4x$`UMWA9%+4hhR%zA;?4?3u-w)2}YuonI@m+}5Su5m;0= za$LWH#ae)gg}&QnE4#~|E0Kxj6E)u7W35`X<@Lm1DRnTj^^4`dKSZ~>s9)vA@Ue}w;7^X7K6+ViyG>#o zPBv80J%);&ay$|-J9?V?UeAX2wK-R{*IFIlSMXx_=3UOVoGaozu6ZeK;m#YId=kX- z#AGPvrN{ZjQF=!ULk@0uq)5BIc7@%&DWAuU9KUZ@x4M|0`k;1pLU)Jp7lnGQhU5du zI{4yUvt=`d{}T1n^qZek!9r^vI5erU8D|VpPe&D1c|B8n;a$ORv0Y}otXz#>Um>XY zfq3c{vvoc%_K(gVS~@D0a%Q4rLu~Y3r6j&Ezcz+9#@luC%dWpXuR^iv34OA)LQt^U zXYGoH!!t#7);ApMHRAP;sB95jsbp5n^C5p~U8T@n{i>?F35Pf;cD^ zZ(Ml8lSgOOPA)w5oMTvOdROfJixh2WtTe<-?&E|j>mikH z%fMIPc6)197?yq9%E&6WK8gO;^TMj!(szjslviW3%4C4@WYzQwZx7Wv+{isv{va(m zy5=*Pp@-bO7}=EKKE^8zPuvd<*QpT_)2Yp5S+Ju1U= zrO{g!zK+h&`|x6Xl1|3WLx&6BPw}tYQTN=VazTBVFyG^Q5p*s+&8};LTTi^Y$?DiJ zahl&@*}_td5=vuhh1vNRx$Di^qtx`n0~oekko4JJc+_s8q^!`Mi@lEZGLAZzIzu=- zG*g~gU*y#)mU`Je?YSny>yoLGqS3X-8E+S)J@NF~oH`!5Z=`H^-$R4vw?ssCsk1(o z5**ZbzL~YFsptHYPtB?=v<jg_c)MJadquFB{zNxhgMF_jr2VnxxL?lf$0* zzD;{}@g`{AkAH8r&Aj_bU7&EqieTv#54(A$%Cp_M z*px!?Y`3|vst6WAMHfef5CrvoezXQbo zV5|FpgBEb9RMTpsim;aKF z>Co!Z>L!TvnBF$i*Cs27?l(<#`El?fYbWUu(1=vy(p9u9bPpz-AW*Q?%|snv2udNA zC?JT*|IFCzOdAfRBtB8Y_Na1ME^20sdUTGpl-9Rf6Z%!9T>T}ivI1ANyJ}AC(X3{k z;n{E}&tu1fz+FqsihFIlYaEx|zap0Dd+XNTSh1=T>zmAvM-|7?J!|X=tGCP4zj*Gk zBk<7ek3nJ^?mQ39_f0mS8O;bY-svk{>29NYj*7Lmo6(@qE71>5=1K}aKiA^l3&uQRmN8ve zS0+ke8Cy9iR-L4uBO3>vr?i z29uu}2pK@SvcYMCj@v1K5r7_K5JpY*sLCNaaI~``4?x=2+IpI%hE#j7y?}9}_$72^ zkmcyP02?wx*!Cm)0|-wHK=AytNRkO?jn-A@?vsUCMBb0<;*T}p7fn$%feUfMWElGO zEoJR09|shZsl$;8a0s43=!>TrtraLc7@Y6`v*?rucb(LWlg_CAvnP|$CZnYUb#^tR zfs_-<`+$xR|D8R5+6n*y0J~v-rC>Ah5di^42=Ec8mL1UvDHTl>R8(xYt2J*nTKR3u zah-y?FAoihm4s8e?2Zjqxnu{ZPF|~ZTNQYO>>KGk)E!N14+pb$zr0#rpab{~p z#&+gY&v5WXqa15`+l-;xrsm z!Uc`;H)q9zgkzOEoP_+Qiljbp4>umu)$IaJ-i1m7^f{`iKC4onyQtr7X;N>(EDMHu z#NuufwR&iwUFc{~{$~3cWe%lh{`WLfcpdL;+<9&b?y49-9U>xcYO3_%@+`xeLPvt0 zk)7Bk&~b+N;hCXY!(;lJff+h;5f~8nR~)oF8g~%7&R}-b0M!7+6#Mph)Y&nrHlPpE zNCQAGDJa9-0oZQ$wz)ZgIOw23g(d-RfdCQ-3!MxiYJtekvSSl6Q{%rH@@e3oiHHU8!)CBhyRR-8!u&dDU{FKB?$wE|C*;TWvQ?z@2w*K@g- zJg$MQ7w+Wd5z)mnsbn-hc6Kv9R z@VF;9a$-VNd+um@S+~cG@$glrvYxf*v?J)gdkz2Itb@-Z%pyd3xMpl690nwoeO z$rZshDOi#K&2hkx3SU#Hjsl+8^foq39H%?k)SNi-cf}~jC+#M?m1c#rgR8TG$%e3O zt-#>BeOzSeIe~j87!E#m)@i~JgY{xXD{rlnC)ua~3dvFexR zHBPYJUn9u5u)g8_I(1{6L(7=X?mE+tAs6M7DcZ-o+P`$j%zMj)GXhdvTRP4B9S5Bx z0>kXA1mYvqhbkt{uHNikaNzWKvC>E=!#KOxfVDupw0~zfQ)tYl&Bi@NVe*mtOyxC< z_wwr6=m|Y|Cw!Xj5jqiS{7{@zmf$v6r-8utSagc zLE)-l<@;WiD#?L=0*=N2gtAL+?C4BG&v~S-9-#{&tJQW5Vjn z>TZv`Q;n`!Ri4ORd{wV zug-}&c83a`FsTl&J;T&Nj)^x*?QHHEYYF5Xol#A*UR*O7Z(?D-RjkflC&1o@VwEu{ zL*6dlXt}bNyj;?1!TNV9bt8{YG?mr)>pXvIA+Tb^pxx`cWsk^dEsGwu>w9obrdwAh z-FtNXz1i1H*6$uYTTctS-6(AKi0J8F=wQ_GG%V$`CNGa81tF(jZC+o4enpISThZq< zyU87EIe%<)Xv*cVxv(jCMj8%lOIC5fU3K3V92BH<43IY&V*JDr_;m6EwNL>G6qW%H zM`@G(QxM?oBNIf=1LGU81Q1Ah+$a;KRF*R2p_+dAnv-^9bntWh#guS9cOMNgf7V}P&z zQ*Ps=b`GUM>4ZAO2VIP;F@9x%L`QAi%Y4-t90<#`vE z5i}%<$FN}lim|+-aS%edL99@>OG|f>K4$PECCd(H09ksMcU=M<1QdNQMhGDXiu{PO z7z{_&TS5dwHo~$KJ3FLVPS^{`t(9#9Awp;k(h3!w-yRR4ztafL9SKAq2rF@1@XN?V zf>|bZhXBrd?Vvn?Um_7`U_Y1$njL3SOaV=`((H3ZxIXDmDx~vdSGQ^i*hr#O8t)3C z(8-p85#2w#zfssCt`Lo!Ty~$O!5$TrUo|(M zAF)TmML*m>GvpjAlaS}*-%Cm3GAsM|$hUdv5++U!qHQ_?&Ir}(Xj<7twjwBJ5avwC zL(C5o7Y2K{(USJb2xIs_eWHFEi(+WP1E(L2w9dmJg=6-aSq&$M2#5FY-xE7RM7QW4 zWRGB+MjCtS-i4GCNfC;-9nhn0FGN;2Z#{JI1^FGiBfW-pWP*fG_tiql)CSwvyc8;( zrHdBeK9S=Z=2=!L9T4M$jNq5gjf$5euvJW8%6iV{zzQr%_LmMnujx8*AXJ}~tPDCo zCO2fp{)WDMoqjw$aN(BAX5`?*CP>l#4%#B$LsJBE(2cNEBq5>)T#U(ykDwY|H^=Q} z`|{BUi*(zhlZsMo4;W42zXJa`R z&mrBbB%Qw>Z>7#&B!6SE%^;VY2?Pl%0n1*ZqkTyn21vOga%h$Vnwlm^dgq8vl29tm zbSdGJEg`;zsPoldk&^q9jfUp04k%MRj^b|~9$g+k?RSTCZ%7%b&d=ypP^~z%_*~y# z-CgM}eq6T2LulA?ds(d-_J!`Sd9-&K+j<`g?ZZ^lt+_L{QPO$2a)}n|Ej$(dv1mJg za9m&tW-mZsN_qoM_mK|VA|ioUEu^0=CYb}G69hq|9T~Z6=**q>^JNNV3AQcRTsYD$ z&0mNe?HCb`TU*oqCC3?M%Tb3HYGiM8VL8w z!Pg6!U~0`pQruKCX{DySY#JI~AoLQaUR)a`q9~xXn5}71`8dii#4eyCM8h^dZ0>5J? zBoQvA42_tgGOWp8iPtetQme zckGe{8fBaHjVj&~@8fGbyCb0(cvKfh%j8ZTnJY-FaFBqEUXHa6-A!;v$d$GMLD1x+ zd+8l06-4yX#o=FxJ$w%wup!2StY`$CErHz(*lR&{fS{dJlaqUdjRHeQL1#<5oS`MK z#=MRF5b3G?9WwE--N2g_m=fBm=50X>aHXjZCejEQV@gsMoB*ULCV46*+8eTvNy^MB~_m(7gx+F0+xypm+?P@TsVDCpP?SdU@7! zj3OZa#bN4o(+`eMH508Kzc@urah_?ozAdtt>^rGq%h!}{Q$!z;fHMGA1c~BEGffm% zgYHR^!)Zk9S)tKIyC+uJ(jYE602m_iDPs{^7A$s|Yj(WUx7jz|^Or>);|=Ltt#gz4 zt261`FJ^{Vu2Hiie)i24eqPi+A&uD4{%+H(*Bna0i}x|9j1a+lm}Q_xGI9c+=8Yk% zCz#PXCTUG@O;TTmmBWHDd6mHe9)f9o`Dw6L?(MFcJJYh*GmDkB`n*F8i); zc2ARC13`>=8g!X)W`)1QCntc&GNug#W4^+)!C|Xlkg7R8FRt(g;hXfSYJ|?JAgDd? zX5JV5CU0!UB*{h+5O<~4>5IY~rk|VQl-7HmK>FSOq1SwUJ@_}-T!Hp?m#HEtM=x(m@K3#5{H|TD% z@$`=W4}RksUm7kc^}qjUVnRxF9f)Q%^)@z@{eSXH=>K3}Crf0w?&co?``^>w4&hU^ z{bqyLddF3@joPCaV?+By-Y{|9p3J2tC4FA`d*4v${>taz<$acB`k{GG$dLv5=6K|i z8|7y{rcL(tU3a{n92?)W>Cfwzg{yTgzfTi63rhKK(tE8<_TPaffGQ~u)%ggM-Y-A! z<-+3--t(XTerA$-=aIjk$@}s%2~qceD1O6~@lVQoe?`E8UzcvYa#T@C_IlmS6Mu@0 zr*`1#@rB=(M;t0h+S0m9b4$24p#gW1i|_Uhe`CT}9$W1T+=FXoIKh|8_H!+HWtAq| z66!!wK-8hv;8+q7KSZWqLND&JA*c9_o2up9+=?xw_x0))vs*4bRGm}&z;{2jBJr7c zf`-AhU%IF7?Buw&mPiYNWA-seN^BdDh{Yx2QXTJ<{}=%x+O$FK)MbM5-Q!op+%%S6eK02C8eeL*E#5Y-_LlT_kYLty#M(AGtSr?POQE5 z+H=i$&Fh+L?>_!Tn3{S5ByXX|dV>Xx5;6nqIbaW23}f%311#{dx)}royL{jJza z@er*c(?qcueImYYRT(GwJE%wKY3us@yd(pbu$O`jT9(=aP<8+ocC1;?w%~{HSK6D= z_Dp`7mldjoV3r_T5?n+sz%+6yino``_-u0%w_tSv$(}EQs&rG2g^IJolym3u?HI4< z-}@&H-EU2QL&-R%-x0w&_L%VYt$k*%ve@Z2l$2O8eCi)TJ^ePDrKEBwl?u?8z7=HF zraZQMe6Wurk?QO7Ky*y$FoIP_k5F2w4BUyWKtC=p3wlm%VDi;h!w=$#rDv98qjCD#3CoqRMpBnCMlIPN=Aah)kOTh z$%z1%O?11*chdtcntXLaFHv6s=wYy7%>^Pgj+I=eU741ZD25oN7!{~Ipg(!o`Z{w# zWX>zx{gA8peb9p4WxpyH(R?DMSf|;L_LrqTQxmnjlY+d=UM6>;6FvJe1B(@_#i2RN z&??WHgYiQg)ST6+%Bn9yyykQ}YNDx5r0LDo0nf2tfPpY?vofHk#LVSk!F|$#QFH%_ zXrJPFrak$?y=1)I8#FF6c4zdt#r$9J5NPytt8MVX9h+F+7qGUv?8Db zL!MSa!mVtq!;$OR+p{{JP930;denTbv|ul`eNDZ^PhgIKN?~dFBKNa;SH!uM&B{`wUxYck>BI8`8poTnc1`uA&` z=WwsSBC!!vWebR5ih`sjBs5CNe~yW9ZPi!ks6isI9GI`4y9#!4<&CN)Wj30T!^1vl zwbvV1aCFfu(xV9q&}BP4QFvU;ul~V{(V~yQb+82R*CZ1)uRev2$%HOh#ifP)=`lLZ z?@8_%mvv=IT?p~!mpzGyKGi&L+Y>I6d&1*anyS1{kspa_p{`$<(D)U}@Wh08!=vWG zE|QIe{*w+~9}hi#R04J?0g;H$afIEd_NE<+7WV+osfs+I#}ns?@7EAt-T1yhqAlJL zA=*dFyZZj=8W{n5)W{c&fre4r!iW`~ub9WKI#1Nw9$!9T*Ikvl$wP^|ae zBQbGLewCR;3%4%+W35cia{57|jjid3>w}2vh8;u)vFQ9WvEmk7hb~y@#puLIKLd&B z!##=@2{-;*t%6rv7gf8GO5_36ncCQr)jX=e<1csYO5VL~lO21PwYxNZ!(8-%T94xS z!m9MN4044aB2;^C2P}~C@ucTm%5!d7i6%Nm=pPzn5W%9}s?p!0^h#h{MWTvT_LU)N zUu?&MaOyJ!-ZQv{eR@muxb0I7<*h-wqrq3TtC^UFIl3 zJ)O%o4d1;@8iLCo+H8mm5Tv59G7HWfC2I_E&Yt|8dLgVBupooMJt^kxvZc@aOw4FKMD@@nJ1xf3koo2*O!EpC+S#*HcqoW zen~{A-Z$G#yR^h+DtWiDkxyc(M0yE{dbTPaWpJu4URsEHPl3Ogl@rPr*IDukwWlut zXVFd;&JVf^ZJ;JJoz^Qs3$SucqL?cZl+s$OTTaNwrzb*xYe=4?bXTt^^Vur5YpzP z>XJV1q};b;d#J7;PQJBa-F@XMht76`<=7Tniq`LT6Q6X@9?FRtg;mE7pmubOlAgqO zJ|-v+1tN%);e1T@Vu?=5sj>yz+@ClFhhWZkC3&pkwH^iR&vRad0Rp!y$nn4&hB5>p zy`wOa{gfGmQx5VC6dkRXq21{7V7XEUoYY=kTKX=!+m5?A^MMdH3@0{nOFV$^Z~`o6 z`tIBrbKB2Tf-D9w2=L})=Zau>0*36s!^KP9CmcYcbZlOfI{Kg7zsHQS_M;+jmC>LN zNXjWHfb;|Gzf*LRro60y(6|wE#46wdV2{1rq;~ut1+1%!m>#?U$pDBq9rueUc^Ci> z+G@@(BaH~KK7mI)kG%d{fc3z!7=v=cVDo-U;7edGde!_nD-fO6tS27=s^%ZKF%cZa z=YO>D>>m}GLEXvCF@EP}QVvq8;upZffycN64vo>Rzy75Wfc|dmuk;ms>4M|BKiJr7 z9&pDCJcHaP#XsLXHGnq-HvdupIx!Bf92Eh)4$PAP6(R@74S)y)*GL3tQ7j7-Ab}bX zSQ!s8tbGV81n&+a;3{dUsc(XF;`7&60kE{82RD}j-^Rj**a9vS6aItZ#FW@r5WDn6 z02BLrAAdUaC;R@7yWh?C-dGu2_mPxI=69Q75mHT?;R27;p)XB;ztzm2Qrigk^AL_y?Fx%2)@uk!Owe;JzEV^;TCbrNlT_NjZK~{pin)8s7S+Wl1*+-I0 z)i2#|_Z55}0*&Jatb1u9vLweYuBuA#@ddSx_Uq}RnD6ZL;t&knUFZtKwl1*Ts^obF zsD=-Zn52Nj0_x}B2k)ax=koE`wR#>pZnz0TsH|q1mW2 z`XGc;ZZ-~w0^JGR=%sI1vt)|oCXJmzb-1R*Yo|)Z%v>iGl8Vyhk|&2WgBk%X*)r$4u-SQ(XF7%$w!x=lu2_=p<^2MO zFn{p~X>p^T?0u`ahqM4TK#x;F5FB8}Ls8S$j|9yqfNR>QFyXzct0RKj52*o;K*F60 zBA^kA#dMCU?$QkHb@vOgJrNF(R$O$urwMg9e6s#7v|E|s?>0ce;wmV^0rzQi0`&~A zcChQ!=$$2d=tePt#xTSPM7J1dDwM}^Z>LpO7q52}d8o7Sc_SKjy%)H@9VqUDt$Qgf zD_cnil6(5~h^l~|!6%WxJE_z7Az7BJJEFob@4caIK+mToK+cNM5aV_&$ojP0M)-Y* z!g9b7RGf{8_GeXXnwzaH+Mxz=vIpJ<$65du6MKZ(z?1!S0$m{d6vU_1aabw_@TRm6@pkxHLWN8q3HBGdt-O3p#%`pAkPsM7A(kXc`zQJ6b5K~9J!#v1YAo3lvn+=PxX@2 z;AkZRj*P$r@?JDUmOI&XV_$a zLx6<_6^)B4>_Y1&jhUVccfmSrIF#|>ql5PgZ2sxcJo5dtOPG8r)UvQ$j{cf0cX^jB49#G)p`O<&@P1Q`%O1VG(w zL;m6Wb8gMr>#v9*3?c?dSBd#*V}ZIvNCIjZUz+g{@o)Khe|YzA>g5YvQHi;;Z{&kO z-!%(Q(?J>yt7YQ#Y~A{u{#FIxG=R_K41_?q0Hx^?4>_o1+8S;pX+F6AkL4PIKWcoL z_9*rf0V9FKn+7`}3y~8kV-8gULY!Xtwiw*(Y%fO6a-D${rt1+NSGq2_2a4l&P@J9* zUH$sqI2nbvFunfzl*ywAu$?-|Jo7x)_ctpb+L>np+bs=@2%%KY;|nO4Ja3yZU(`yyo53yK$2*Vp;gH4j{U6SE|rQfnl%AV`D! ztm~=HFQPt{cjrBwhlm6v^SSgwY%JdX;mdk(gU7BXh^vcK^NN`Vg9gjgP?Zg9i1XbC zd$iET**DQn@r=iMM4!S&m&(k!5PG|*Th!)h*4?Lh z=<+%-S0SxBik`869HOG1!Irokx5c7CAou!9?8Uojmwd!w^58%EOeVBGGmgRd|uO@zxEnkzo^a!!)+O4|$TWSLq z-T0bG)C*GHFAm$8uiiaIweQ+^de$m0sm`uhzL{IUikLvzs;4f+e9`;B@^!9PU(S|X_ON7dgQ?3Txdb8x5I+tc5gIC%**{(P~==EE2kre{l=S&-YD z(017Se%Zh94Uqbtl<`H1l7;VXyFWH2Ssq!bT{980mZ8O_nO2EwaqSWkxT90EIJrt^ zRh7jH5!~|x{UB;I>k4EtzcPK6V-UMEH@?9F=$Jka`I2SqJe1Pb6 zjQ5<>i6BKTU3}o%{b}gI(;&GZA#9iQ+^@-k))QU<2;}|5bPzYSSZyWl(gW90)9`(^ z*hrpGQ51l=kjlp+sQ*59x(dYow0s0@#!rm8XLw3E+ha*0cAEuV-qRsliwr;XOP4Na zO+r|63)n#4mBw*FsZsC$WyepthxLBTq8xfdeL?gk0{OIKX%m;4%fyq7Tp~%4w=IZE ziSIv5bynMreqiniY&Q;lwxouQ@(PqygYgIIJKS+Avd4Snbeg7=zA71ZKgfI^nYlpgd2`%gYTqh)4TaVfIVA$*J zV_x;v{!}NY?U$|>F5tTDL+ohBZsx&vuSP<4pIHA>VSdgfUB1GHAM2{I>iRO1W4G9P z#Ga&y#L6l%;nCosz!R`aGB9To6|>^2oso548yQy$bkB58Ep&46ejSitqd#1LQp<@|EScJ z_vI^d$7fLRnh3mU&M+1A`>WH245)Haw}{5a#tlZ?ej=$It zi)2t_0)Mc5K>O3hNsB)SvXA5M-4Ta&n`OVR$Y||+2LIyHeEi?PRoaeSo+JmeDAf95 zB&GBjT44qC@Zwd^fuB!j|L0G%G<~ag_n%m*kNDV1Cnc6xdAxVI81dO)6n~z~nk;6u z&gr*OT*%#Y805tcEwqNWZ@y+xDQ8Ret(*PVd!BEdQNR~k7H3f2{}5Ol@614R6AVmf z_i&}?hrsDQ?c;BhzCGH7bXwX7#i*H!GGJro-r{?!5*MNbB z5^~;`1s_mIZekD3Qo?hc+K#CC^{+(ggaP^##8mew;J#@6T-n^-8OrlbCi6pB59&j( zPbqV2Q4_k{VaFlFTgD#(g#it+yE;Nc$M?tw5Bsb=*~D5M)*KY_YIt z^};RveiMaMQrcnGQH5#ZtFJndVRHVHU+Es$V~BpON7$)6J$l^E0U5f6BCuVr{Ay*?YHN(6iCI|H&|%85OZXO{7$Km z2Qi$p7xG9H*s^_2S2phb+KGC*Lb12$ms4X$IC|hOF84x(5dXQ)c?Q@k#~sc0UC6WQ z840;(a(D@kVz;w9$n%S!k#0r-0dcp6U%;$^+5Q--yf~B$He_&Dhb6ZZp4iXzJ6KulEyG7-QdKHxQXNrmI$tPT@P^=H?{ z=mvoyuF$|D?W4V@JxNd7aJgS(xn=JH8Xn;FX<;gVIF9a6lM)8Vut7j*1Ub40DJ{G{ ztaM6MUGrw!>e2qN;+eG&rrv#J&xm??U0;ew8SAZiVan5I8kkU+s#*Xtq7&g7%wNdbVA1zR@z}tee zihrT(>08dbJxv5G(@|A4F_k4zBCyEs{oXLr>|E%K0Su+V0 zvicA@mh_#eGzhvy6!#+E>tj7a+aoj54!@FIPi>(C+2hQpyM zU1M%^S6#s*J7t?PRX`|hCqHG9~DC`zB=X5UzZ|4x(J;$HZU76V7PcSACm0Xm) zAbK)~v3PFAK2+!Ly8`<>V+CUc4Le#(ZRx%G-74A`ToC)vcqM11OToN`0h`{rc5}yT zcdsj)+TUi!-X2R4!<_}(I2yMfeQg{?j0uL_NiL6(?L=*Wlom<>j5G zUp>&B3_1pf(kRb&Nw?H7##!5v5b^?^2#eU(k8xqD2xolvwjREF`4&wNBL&4~ZL?(g zNt+L=vT%#CQupFJ5H4(Ays$|7!1p?{^Zi&w)bG8*{lMOLi#|Ww4Pi*>$nl`-j6Fs>a7BO4ynMoivo`N5pY9iuMIK63Nkm)>s}}Kh_TO@t}BN6ouChvZ9Baj5ZnI?PD_F@^6n}8PQSa8;f-K3|T^{_ew!71fFY8 z1%9pH9eIK_^2NdQQUN@Fn~phG46vm(5G|%lM^9eEj7*fP=bm*0f_9sVf}+RpjtM(G zL75q|S1KmyGt=7Sz3@*k^mt)Kt6!e=Ks&+B5QZKnD%A8}gqnT2K>xY5#BlM_^?-h# z$#!q#J(TG6$AsQs%tDrc`7&tLErVUeCH#>`29X~<8PO?|)S5GXFn-3T&(IG3^@#qN z9iBGj!i1w=+j9}!AdV)v0Q!7?z{_oRXS0E@_P+Dds7?>~W0N`_9=K8(3c|vQ^YZYj zx&8FRu@%CUO>`Fl;1Id{(cGa}it_g}G7j}wVYUJJCgL3X;F4QZ({aZapDsk)f~$f& zggL~KK07ca-O;HsT<9*+5T9#K*6VgvvZaDGt~32J!O5O znut!2puIt0!kC8hrVjVp@cYNHvZG&D{Z_ifU)+U`4i=%mt^>1Lq{60+p?^#Qt>=do z9M*IXdoP@jreI=GgU9j1Hy^Zje3DBpS`=k*1?69!0pN48FWkt znu8gQ4~}Hn2n;6*03;d)q8bFeu2;bf4%?9j=ppiAP0%Pmk6Uj`bnRdVpdD1N*2bhp z!r4~4>V0>cv_*`e+4g@kh!Ao}-PfsN?l!iN$LPmDGYlv(=;t}PYdDSs(Cf0G#k0af9R?%7RC z0Jsw&L-H|QTq$FOl`MX=ldoq=`fE&%_atJ$H$&N?82fF#K!AV%&@*0WjRpW140r%= zR~G3r2zv+MAmCy`CvCcR+-*qO!Zite_ZB{&`5nxGk-KIV6dB{C0ipq(_dyvnI&qRe z(`}493l@KaRC#c>WTcV?0bsZy#MsFhX@g;#^2hQeS5+~v$)vXhz@)=60QY8o!hYMeD*IxXxOFYcBlh~KuG-(Yz(ES2sw1y5ka;1jS1**#7_OW{*u04~w| z&f0E*XjdWV+go(5T;gum#znrh(%XFl*o+S!U+_F@=kcePMqIDcu9>4GLk5qh3{wM2 zRixNnf*@+vk7>ifL+U2_m%jVpOgqy; zN24cgR$=zDZk`SR6u@2A-KD7%Ol6Z$sSk12n9Bf7GEIvTHYBa&S(3>#f?Je)U(oUru#vG*>=3 zl(2DwAk)Wx>vkVANx6dzU~`?CiJ3?+hzYj2UBHMzzIT5q={eXJG!~X@cWU|S1mD%% zY_Vd^>t8d~j*5T5c#*PBVjTr`CAhrFG8j0Ib%yC9l`aIKa8bFy(B9?fU1Pi!gaaWx z|MwB9-mY)M;L!-a%3k@W(zi7xjHSrJTnYR>q2roT(RbxyTrLkDVx*HVSmtgX3Vdhj zX=_biVp>)Gx%zV4>d#@eh-%qSgqo~N#GZhBA3Xc5)+MmoNY41Tqy7t=n`06W0(zR;klH#6 zO984>h27!js)(O3lCe#;u=sgA?~CsRHg5`3UQZNV+|$J8@^KL7{8*KhwEuo|B&ar} zBP{C;V;V#Ln@H2gcVG0L1H__?HO^EXq4%(yYj^>_sHWu6>o4hWYsbqz_AfMHshuslEp|`qOz9-h!lE9bHarxL&fPMb(5TgO3SnGlgt52voChfncY+5 z&^*2j{Sz%ZvqqDl_O$RvyB*-JTJEm+z7uq6K;e?+bYX}Nop!t!$+_7V(^s#R%YI!Z zfXsfqcdb>&1&30Qn^E%-EWVV_lh-4wBYF1tNke=vrY&=Y6S-nfpU=d5+z%fUw9hs1 zQf1b}N$0&U5F6g*?Dy_a6tzc3Ev!qDoozXKIx^M*zhkG3o3AqVUGA52UOmEpgAeQF zc``Z|oW8t=CJbkw`{?Keyt2)BBaR{@L=YS@h$Snv{b@gvfeMa@06OmVa4yGt7vgEwtTO*1j0c4aabT3AGu|gEhVE!YP`81*_--6FTC&To9(Zt z|Kbi$WX{_kMyFvwhpJ=ZGy3Iu$S^)nw;p3!o*+|=HA-Bw}PY<>Ys^NJ%=hiN^tP}+r>1fF8>hjiY9WFZJ z%Y%E4O*0DV9cO^BtkZ_A`~uekg&DM$sJRO%pd>-S>~{CA6XkgT_>O8=>m5~1vHJPQ zZGb3rakT5O5RLztQ`9YS&n-<50Md5r7tb-lY8CKcD+Le}AdzIk03!a)OaGDq&iAnZ zz=GE|+Q6HDD12Gv(Ivy$-IqSW_4hOK?AxcudH~#upio${zJ}ST<|1-q&_wN2?Ia8;p`=BBq z0l*$P%?B_Y_yftDuB-U9tK-Pjw|>{)TuN$Ni6Nq@vm$ER1rrR%bT`0THB%>Fpdxj` z#8xyo#(y6uY*1p=w_&I|7>0Qb?zniF1K#VJOx_oORCmD0WUp-o22RA(P(-YH%Eo+Q zXMC<0x)-vG{7`YGyxl+ZaPn59oJ@nI4dggoQ#RRZHN=pxqlKVPHw?h7C;03M$Uz&p^v z>4M*?Tr~)TU@Sq#2mmygZn|>U>c>Plv#S<#d~sXClQrljjs` z^H>8-zS|+kPH}XxR^^Csg5*M6r_7YKo%LFchi0cX3KND)@8U3iPq%sxK-27PVrW_F z!sG)mQAPMBN$G4OUW42TKwgj*TBdHi+1pH;)9kq(CE`eUm`BG*YVljmo2*$+nYD$;n zNST(Qc!a2_!fO(zm6oT+h)om@mdtOPpz+>ikj?Cl89CNk%el!1lA73gZV8zq-Da)J zF7t=p^%CXN zobgPC<~|ztsvY5%DI78Yd}_$Og8naPwYTl?ewJ7`zCaJT$Oeq9?&p62NkO6t|4VTe z2{S|Rf_xyISjm{#We+9d5u8I?%go;ND+~w^CpeAkrp=r9<_~R_S~$0!-JZ|Pm8At$ zO*C7wg5$~UOHRY@0)Z-S(P82QQcpo-rJ3+rSNE@_Sh)LUt5#ZpkVL?g6JbAGpoMst zxnD8>0f{KWD&K9~L6lx7C#0>)8Tynathiam!kL>k`{ICcB!?YCA6x>!Fn)lt$$quV|6s>DimT_(K`DbSBZaf9C# z8L4S>D96DG{*&O`&@>}_wYJ0S|5H_ET~pHL#vVO(4ILhc!Xa=M{fOnuE zy6_#@gA@jq#Q;DLo|eH4|M;#4L%hf}Quzyyi2nmjNG&0MAOCd8M}wISt_Xk%LqU); zY8WQ@^Dj2QME_ek6>d}4*oA@=AWb~}n(Jf1%=!mY^gq!$x?+Hxfr#Q@UNZ%N&iRi?a{Y`* zUhKPEaK65C)-X>F)!e2IA!~Px>GZ4!F)m){Q^n?&9`D zp`A^ux|V-Od-}bed5&9-U{ViC!T=y4HOtX4mTn1PMlG$ZxRqX9TEP@>^^yKn(9_G) z5Co7_z*y_aNnLQV;IJK%oBY3qFd1igQ+|=BI7D_LgI)H7^QkP)o);DPi7WfW#8622 zrod=g{9-ncKr2bz0u-ojH(+wVe8wZD%cD=e*LC(Vp~1xK88R!h1m=7I z;>$<_C+8aef^mfLXH0M+N_}O$JyH9X+k@&Xhg{&0Q&-9f4XQx7qNMg_8p`{Sf-TD3xvYA_gobYjdDG<-=St ztYFLe9KPZRTldMeu;>Ibn-A_@<~IT-Pw$~tBzzs2)E%mg`{D|89w-y-R#oH3pj=J} z^-B5{%@e(V>?)kW8dvg&yK=lUL+HZCKje@j_`NCSUdH@beZJPhZ+MuoOgieTurDL@ z>FN%-Wb-3l#$E*>t;aI-r9{Jl_V5xtCbHb3?w22Np2{vor;ZVtf;4l*!GMCe*^V7# zwG3cF!u@RbaL+Yr1U&Hx@U-xXgG5*wHfdu;4P@f!s8au^g^cRW((?KDet4k536+Ed zDLJ|AY?g7T)gvy&(|CB~!1be>aEk|-kWRPRS%r#ly^ISUu3xeWV_n!?hzJk^2CJKz zcm`(DlvT}iHYQ}QdE)DJ6<#|$UO(E`em-4^ghm=A3VOZL5;MK|Z>sDZs8f;HO4yN3 z>w`0f_k4)LKJ&J}z**MsC{F)wX(&Yz8L4S|J;Nz8(csVtWbjK4u!9F_w&xqrySTtA z^0hbOgIn%VTnZG?MW$u@3J4*7)iDMg)0A!U!+1OW98FeG6Un8^YnduF`k8BaCRb?( zkU|(%%IQ|huLFFN4AMSmlnc}iw9h>GT^zSC$voqJM^zqUZ9W2y%kC18CU$h-ee*X@ ztLk`JY{HnED`I{8J_!f4c8v17zENCbCBr$o2y@LObE)0;wjvs$?FBnl*LQSr1mXII z&!)B#wuPmXA+JPSYNDEg!ro1R#MA-dOob#(W$&Ax{dZyl0%f`u)9lK+6jM?fRN&dU zN-C}hx5t3!N>mn!cAdy8vc`MCVxBIkM{M=UZCJh=RRZDnfa`&fkS>(_9n%BPLjVt{-n#~%bPAw2P$Pvw^=swd)X}xT>gY@X zD+Mzo8Bi4fo&ul}6O{k9aAAvu0U;0wldBtF?*RswF@qwLtK5Pbz>c_It$IM81C>U+ zNBN7t=ULx(ejrW)2p4Js!XS(vMC}1uBX|wNb=@!(O_v0SlCVGq108U!a_W89NeS5G z8~P-JFmIBQkzw&_60Q}5vV8=xJrt1(R86gbnmT}AVLA`bo)E|t;BaEu5r#McltD8x zyb}i~6iDtakXBVM&hPW|+nxyXMYRBR_3O|aEgye75IkY;P`5QEX`Yb67#`4lGZ6Y) zRl&aJV=hJh3h-;@m3II+0(2yx{ZxP&wD>{c6<2qgNTB6j>#qP(?Oy@^?&f{G@e^}L zlO+sRjRevd%VKgMN|(a0z@}=Ku1U=f*u5Fe9`;|2TZ8I00FFUBCC+wcpvW4ew6Lre zK%Q&V1K-1*+~xAnZ=f^p=qK0=;tN5SD!|HN)zS7udD%1i#Kcs@7m?+8om@U0L{|bk zr~nrHITcG7*NB*w1~VU&Mvb4^*hB*L8{`Aa*e}7yFmfxe?XV9iTnX@l2R0W&z^nsNSP}2 zx~78BWM{?tu;Bg2RQdmw_1aE{6^x-A8}eZ1t{yy$26eTNExG; zsCaV2dC#TIYYNlt!P!mUvB4L7WJSg?Lo&{(xZ`Cc>1Qen0;7OP14Ov?|6bc9pr2J8 zpY-k3o|@W&`P!Y%Q@vR|XgpOwCeM3|8=gjF;Vh{-gwk>8>zk@-qUUS=rE^6I75 z!n8{IWf}Cq|4Sj?_xl|` z^%+{h%}i)7`k7ZgUx{`enUivUoKhmg_Nud^=S0T&vfqB9mA;>SS6^>`0_A$WmKPUK z%D=3b0E+Ml;CD@R%;q{5CYj2_q?{k7%|}p|t^Ny`>Sz9UVy1Ms>pMmT;e7u})0Ko_ zx01}#1E;F8fQD@Q$Q8|sA-w_RYdUSlHK8FKW&M^Ko8J9&jpCdFVQ`o&VuukRtfyIltuuMO{rcbM0J43i! zSYC20bT{*O(*(J^-7~&CkN#?x@bS;ND7StjQhmPM zFSl*JIjNQZJXdikomh0ad9agt^vlb%v`a54W?^PbM7(|fJ*pwAeMJR@P^L@jhx=Y1 z@8F_7s_edTgPTcS>Y>IU!rmB^t~kO>&%-%~{OO$J;U4`ahyI|A%}Ffp;pRoL_uxIs z{0t9rQ3W?i>Jvq+ww8-3=?Gn3KU!=S6G;joDIp)KU~Ws2UQ}G9Q?5=Tvql+k?|dC5u78)F+*yPcc!jv(~W&JQI1oBF&X z6{guvsH&K%RtjeOU1!O?k-PC7;WJV9cw`zQuokO4BzE~TU+j5Rw)#-1+zEC5e#m4y zwp2lVE9~S1>wf=BBKXe1rauHR<(X*}`DEM6cgsGd??bx^m+8yix{<1u={+zSLA5It zlF%zjC~9!otH)TQmS_*FML20>?R~3h^e!!Cs*@=9o2SdntD-r%Eyh)TG=V1t?D=~n4p+? z7i*-Uq{7s@fow`-mRDGF6X(J4c4B0;a9s5DzSIY}UxL^ zyViui6f&GDr{YW-)zQc}OPIUXk+E46v)e>#cV#0ybpOLkccU|o4Sy+Z){tMD^X|sz zW*R?p7@iAQ*fzE9+fvP*u;ia<#ZoG)B8-;f8YHX!IJ{`*>QpisAQNqZv@R@f7EHBX zwy9Ny3%nOa6(+?Pj{H63vSPpLhnR7@InML~3R4gGM?d>jM(?_?uJ5{Qlv*}cNz6fa*77X9diQ63~{Ey0K-7J$2Wz>iXhtg@jjI`*GYZlkX0mI@6@7+1%-&#~> zecZfvGKp8J`#^B2`I4wJ#hO!QYvgr72WrLCl5Btyvs*00>;i;Nyz}(Z>hQiYyO9A*}QsbQ$U>e@6qd= zmMH3tdaT)ri=7vEBmVQaep@ayznjTB!1zhf^YBb#nl{3QHT$V9 zyog6Z>Np26C8y;nYTy?F%Vkb8ty!MOJg)LR{T(o~2U8B%5}J(OwZVb8=x|$ec`>Kx zSSlz+&wt|{k-Z7mRKWFF>?GpV)JWXOEz*w)< zD~R$rNOC#1<@@h0pk`1qd=*zJ@Jo4gWnt-NWV*fU+W(`WoeA57O|t`ZGpvY)X4>ZF zpMg$M^)GUvFX~M!U}Y6@|ob|5-#$N=#JhO6zE@1XETsGUy>SPTV zkRvSlT+P+38V%0lVs}2)lnUC_z|RVGV*Ptu#Tbfur8E*NH1Ow6PCUL`=KsR=bK+N@ z&zPP(&sl&@k8(E$A`91_RilF8Q7Z}$b)tuDptt^v6L%JsriG{`{be)T)YXCSAgA2& z;*QF;o$vWqpKYGd;+z zv^d>{x!?S2(Bw2#+QnqWJv}#YC5nUXaC(}bvaF9RZU_=P2x1%@74C7B+pwWl?Z28w@r3< zdA;iP@^jKZMTT-IXkuRv8Y%X7;a8O2L8+6NxM^op%&A_-!42Q!4;ovVIeoj0&tm?v zQlFyU>H-!*G13)AzY{&WVM!%{U1TfQJwW*%8~Mr{4}ftfRs-i@1K&6f%okcS3t})Y z7jw;5AaSW(2AKC-o%|waS4e<^_-lZ{na_qFW`r_ktQ;n{0sXM#`DU2D?@#fpPWrge zJ7SvBQg!&Zlq61jc~;msS_FWnLuFjA^IX9T%f#?`TVLPbZzu;mdw?}|rNXn%e($2e zE+XskYd%iPIb-04jx>N9usxYLa-r=I(pPJA=cLE41}hFpB3zH(Bkm4rkrdUczet}8 zEivD(;R#2D-dT(oA-q3$nem|@#^l<%>rr4`4@e=N~;o zM|>uB>c>x_1oJUJcE25IWL3HhHw{nbw3vxzX~-;i!;d7TP&lQnVj`%rT7iU7dk8Un zpT4XZ;ps9r69oJG+Tn9s#%Ux1n=g0W`gp+B_x;(IedJ%CPx>CZ7@pt*oBFN}&g5(C z?<_FSHwXf!)u#(WI&a~+q|11BeNoqNub3C{LJ^8}Zbx{)KQd@3Xc`E;GU=4V`YEa~ zpzWbXiIBvWUr+$<>14BBZ1Sxy3U8#jNI5Y@HRNbQjH+6Bu{(?3>$};d_Nw9yn#=>DGsY(&qf+m)JvT`^aBpK4Eg!_-DPS zlkb<+Y-%Z6uB~Zb4K~~H=bB&edhVl6PCLNn3-Ogp^rWMK1nkU6feiy|v!*%T{g>sn zg~3v)$cxKbUl%tDo($-Ka|BLTHxmoYY{3DQ(a$y{$Av!$#e3gakT75&Z8z-_dAcS0 z##bb(yenl+XAezJ%N+8<&RErgv{s^oSB0#*R}a0NxmPu$O#9@SePo4c^<1920W~WD z9yE>i>+kSVPoUY6Uv#XIc+|Bmo8k09jj>AnnK)|J88b})a0LZmN=Kn^z1)$E!BQG9 zKb8=lMNYDL@UwIAaXse*u)<>ZyVzH9Uuo-)Nfd| zFzskr$rnoPtGEqG?G2o@@baKH3c9X`mNy9=cD`MK8zA8K&p&f7Gsbvv+d8NAkd{UX zKCHCOh?f1&iRND6x+~>m+wf_-&P$O4Q}6H9>ol%<)f4vUQA27#I${Pos8FMSt)*GH zwJZ~EZ9JN%;7c2ETd4do)SYn)f^O$k8CprcQFyT*m?F{_N3O@z8&H;K!xFQvHZRc& z?uly^>B;(Bk)>d{caLJGHHi=P4*ff_xtNm#aBUV#aE)MnWpGEx#Kc5+$5TjQLyd35 zLsfOvg;Gq{?{K|L=-2lFcxOSzK-3k*NMR-L4?dLX$PSs%o$Oq4 zcXrzt`P%6@&T+(+HMET{ZMQ--nj+E}XK!bidE218(rVnfjLA1ml9OWLo*7!!qI)Nb zy3VYenb0Tf7?`lHZ6|`O&Og%C4TF38R8h@k8;wNhRo_RnnfTT% z2M{nXw=kh8zc39#?|>L66=Zw&x{ts@8RGQRV#;B|8~0>UOqlsS#i!kUS3^=oLn8o z^2EZ?aZ5w-~45Q7wLK`ixxC8a4m&%;1q1v6|gxx!9fI z31TuP1P2)oZzx>zpFVy12HZ*<+`pWKmGwG2kE?3d<7irZt#1`ls?Yk>y3+RkgzLO9 zx$s%pjspnE0Bq?i`rk!!_lS*4?d#us1#_C%AY)n}UEem|+taDMR=uWd*ATJpVz>?YQE3(WZR0V^qe0y6Liz07u?W+owcl3jf2d=>GUZ=SR$)#PY8O} z^NehJ?pZ<_+hqlCl3bIh~=p5kartM!DN;EK0yE{Ar@!NOu1}d zW6l(yAYp{=ZdI?lV%%fL(WyJ~-RU3&fLsz-| zTVhfCCqQ6o0U(_52kZ~u23@Z4Ef5i*+zB#|5nykNvf}pk?e|$4N5;S6{>=}Z$u>D1 zKW>&*sbY(8kVD`{B{Ub%Cff_id$mx`9enz#Dh9B=F4y&hqn_k1M*kuiaNz`GoL(5c zzNr>#c1synAO)+6zcvDR&&SswiElE$^8zmgNMx=*ZbbTz!!%ZRw~5q2BOq2ZaH4uA z@FDKqy#JuH<3B1eV9`0Uv=7@5tGleYFcVfVB6!~aO(vDB3#c5I<E?(Q`WP!;l3I4V27C19K z?UCts{3S)+wGaVtHF@oj#(!Q@B?G?8kY0wk3ELFNNk4x@#ozh&136pdIq_)*6ZD4@ zZcbR3UY^}Zv2O&7qw(J#ua7+_bf2*3S3CfG%0}wiKlW%E2u2GCD}128u~60?{ye$+ z{r6YSy=L5SON+}fKfom>AG_CdIm0dbw zp0{>HBvJ6|0gGh!1K&-ct4K|n2>i?0<1lF(B%w!R_r)gX6(hj!CMH^t3ju;_{*M7q z7}7R4(|Xy5<~5pOBq`Z`!%C#0UE9`7wD(7!3qT*C`|%c2><>D3DHS8n;gjcFd)wG= zE25TNK7P*`fO(c1gp(}C9q$WNd$W}#Juf{vtjF|a0d4vduto$%61l&NhW8@9wRbF*=(ARBG_EG}|!yV8IF4n_+p zK9>PP?-E{dw77}ToA4bHM$bGqwcn!hyqU~T7YyZ5;C(Ie(G|e}Dw!^xvF%;_NjRz@ zHP~ckF`_<^a4`RCEH=LWApA0bWx|=^p4yxavBtF*uHL#_{XyUd>;V!t3a^cX*OmkW z;sErdD=7<5BQPjHl%9>H-T^|Bw3fEl4G@JUzP4HN#V-8RR8?>f4r9qrEf7JZCU2x7jO~PT%_l9%^Ti-KuGPAIx z7Z%2!SRyGXPm!f613zO!NB8*s2W<2Yx?E><@_E*?Kc5H;G?vF&u=@H!1Q6a%N*V|d z7hBE2O|UaRQ?4`Gt*kRoo=iFdlFI=$FQ=nTnc~VvZSLaN1DuQ8d)uBjmy^knl}tWP z9-yVKUgvVG^XBD7mcSCQ3KSqWKz@nd`d>Lvl$J^_L{q^kZkyz>8gb3$yF%Bo&aJJC zM)0=!FA)~M=}fE10^~<;pX%s2Z-r!i`OCn^(I~2{9I9mc8_fOC2+KYY8?QIrn}LjG;98fZ8kCf9QgS4f`0zf+2N-lRNQ+Z zPVi0BT2iJ%a&AX?I7XN0gAM*Iib6G>Nu@fno(3}cO35J8mt|>v#)pe{>Gbk^`=5V$3UHM42 z5?E4(c}d9ZUhLKFmR?qWnyKQ3hkCu%qkX+3<0TO&0C^uUXDBFxu;0P?fpm|u#R)Jp zf|V~X6+n@M(GL7ktLf4SuR%x6=v5An`nzXMjedV$KoKjj3{c!mEh`J5!N;JanF8m1ce7a9F8C&)~ zZ~40JS*|6{bveiNOgCl<&lwE$M>{wCzLjX~&GX3~m*r)!u8j2#GnMa(t5Rvo@fVpe zsM)-1&hb_J9OVnk{iPPbIr0f;`9Pc!hWvbFt$$P%GAFF1OVO+P%LFTsCXwL}N&-EC ziT3G#u=mEbJe#_fQ8N=X3zL^BD$e{r**6L-LH_-ZORxg!f(m~uYsyv|WTyBgjV(#g zhn->XNdbel2DnXgLk6DrXCY*(_!7O-6Nps}5DEI%gQ$jxKSLA<}6rFIkfo{@IhXy1+WB)3!Tg z`^o9;y|mqxmt)Q&1$=yjccaP(&0FAWL=b%``tC#icBhLONX~H)-@^e?y-M`1UN|KeN*BJp92?E#g zt(W{;I9QYgVfP5+#mX4xHC<2!`+$xbW}|O^ER>YLnwp*((=HS4zw@EIoNe|&KL$7K z&h4)|1_9T{NTQYAk(8*fXBJ0r&N}!w>lwc13$7BZy1O47T>~y&)8BNhcJ#QjE&ogF zh)NmR-vIRq$_sb!TkLvvXkwo^PuJB-$(kh=wC+CfR`Q~ccGWu}ji}}pSlSlBU7~=- z{nuDQE}8JZHlP?>PUkA1{57%gF42xaSxwW!!C2}i{>nmglJ_-4lWou5hL*qSl*G-S zl^b%CT(Jv|yJOR0b%mMY6eUprW>to{(Kg&)q5!G$&|^#Cxl&EH*5yuxKYO)bnCj8| z_{5=8oxY0rPnY~n(5 zhK^_%gyD#~-~^hK(Id3fhfS-FR~V-&9}Z&Ui`V}?vm7w1 zIvVB4?C(lGwBPC!V=CK#)@|v(3>{#~gum6nxKXSsmH)&-Ns%nHw#Pt}WsKO*)_VvQ zl~D4ij5TJk022aX=aPWm()2*wEw(4I0cqtB*n$!ofQXQ@{+$-IIS~hQdu|8p zT5T=`A#rufOX>;7rF#>X>oTIJu@BSFk3@O|MS79@_m3q(JZw7vy+ZswhPKctSvIbi z_-bky#DS#J*?^$@YqFut8>`d8ign2yV-}&X{##QaI4tMU7|3o9ob8-M^VwsRKNJQH zAdWw6Og=-GcBt)`)VWm^ITx+B;M0WD5!B&a`{gzeKCKph7Hj~W=*7e6)7YYKdGNyZ z2foh4eYFDKRcz17J){3DC7Co<7w-Ii`#3ddxY703p3o;d?6PMTIu-BlDs3{>?LU=e zS>;@`g!2C8#W{N#(0uTf>XKNKqVDI z)76(dPfMsyi9l6lLRGD0T!DA_=d~Af%%$xwPYJ=D^nPf|7p=rsyJ^Y-ZKXX9AlVR3 zn@()p6A|g9!$ao~5rNJpbasYAYak-h)z*d%R;FPljf5@~e4pkkAui;-jM=gDaSf3uO|x?)#NnNkE>#4>WP0DGPwo3Bcv>!(aR^-z=zz z6>A%YAYCBs%k8OSg15*@r<({MCOLsy1%8w?fLFas(47T&Si2qAX#4$liGcLD=Zv~GQi_W3jDnAO@F0;8AUaUa%3aTq=WuJuTPXHCM|n(yHtv4Aq|P%&#TO#dQa-`+;I`BcK>R zmb%d)!t}8x_JaRE=uoB?(mi_wfh8v`ae|ouGz%gceUywO3exVtEjGQ{E@0E(>YZS= zz32=Yn0GD|I=)9QQ+R7vIH2(Q>i`zlmXfa z)juc%q_sa4fWaaa6j4z?o`5An1_^Pfh!lZ1PjG3&QeqHnp2?b0zOVzR1F~F*gSyWM zzDv*(_d~lX1Ddh~Aj1uyPCGz?p`!x_!AnU=L2&8|OOK%1T`(=Qk6)liz;r(6fC+-? z9#=bnE6{#JLj`+uW!umi;Ngq(0vi;;P5x)cpaq(cz0PRCG1dS$6~w%*h$p~7JJ@fX zfW}*|?+TUVgE^Cf0XP2f_>Uj(s#-nw*TR6x&zwz}NgarrF0nWA<5|!2$Eh}@i5bs} z^Vi~6ADeV1r%2p{kGDQ3tZ5i4dxdnos(V*+vhPWOB<|##*+jZH`Kwxs$;a3-xiFAjiX6^IwQE=c+X7xn?> zh0L;0ph3nB$hyLi{zMIqe7TK=f%fs=LkaSdrQkb%;G1;+;e8-df(S!$`wr4PfjvN| z^Ix$B3QGh)kRUI6GbdHR_#VhTX`q0ycyQS9pb*K)?U?{F+!MjQnj6>wa03_@q>x=j z!mB}o$q6D!EMV?Hpo$J5=Pv>0%@#BPytG(e;<)h=3HUaRp_B!Y-6e{@!48D)J&{Cv zV0cLD`=5XP`mJ^h-VzV{`pe!9(eWD2*JlJj@{6f_}f4*GOi{8y1`oH{y2m$uY3kdjzy3xRQI)h zgMs;ncf@vpHg{AzM#4;icb`)<=WAf~u0v?Sm?VR0Aw=KL?nBkbW)gd|cB6Cq-Vy@~ zA_KQKLVAyW6lCG{|I;VO^aIw_p@(b&=HW07;0PIr9T7fu+g=>IPILS-ctG%#@EkWK}2{ z3Mv%&`mLp(9x7z5{km>RR^7%j`2(DTCGu_V?S=6R@~bV9kG}RILgf!iEzl6aV*N+G z!-xT>Zq_+a$s;%#Dk}d&1!+K!SL$=V*t&s*GT4ciis^h|>$!GOQuNn8U>riquwYInMtlP< zwYx?(OhBeafj>SoyHbL z7Sdaost@n4EHuwgKgcY8BMQkZ0qm0VRa@J*a;50k0}6}=t$r(72j^Of=_;M>yc0@3 ztviu}tnxne~ zZY!ki=sh;;_MGm;-A!t(+sCzPvt01$eZ7R<0$(v<)?E2X{75QTg){W+zDf;GP{w2K z7PwMm&MfFxLJIpN_O75k2PxD-y;o3D;gW@cg+LNY0M-aVP50k5nC>BM0hMQ<@vd|? zh7&Z7+0hbyvdN@o0__nusnpvuVbNBuRS||{8fDp$Q*DM%dUC-`Wn7JKY9+Cz0u{#c z@{Bs_&HS_lADd3c8Sf9dBI8z@j#x(XcQY7{WlO~-T7s{VCZx>lQK`z~%sPXl#emio z&ECiBd8^mc1Y66IXNT!q=$+ph(if4>1vIceafvZWPOUJ8g1qI3X-aTob}61T_gFiz z5D4e#AUK1%j`P%WwzD1~-+|3%5+DXw@XIt|99%{YCQ}*?Yqdh$0cuVH@bva%#V4$~ z($JZ&r+vzxDUt5KKQS5@#Q#G9hB3wZJqk_3N=@#keYuilq4H>*XJa2657gMr+Bd~x z3VqXp@dZ07^vvllPE^JWA6pR@zGh7oC?xrkKJy0+lbAK@(@RS#9dX6VF!KTYV9o($ zT{y>2KTgx?=djsBwv4T*ttL=G|EUabn(%XW-IPeb94Phne0v*zMpiBQ=)2s?>7g)q z_P~FCf&uOSTj9l?ZdV3ZVmR<4+U?nr;cX^hRXfH<8=Z z+`a$j?m`sQmx>N~eHFMKCRq8J(&;@CqfPBC)+3S9sS|vtj5%IY&4EJC1ibtA0xiHi)uzyW2-y>jdqX_EdI4+}8knD_! z)KinCWkS@N6FlQ+k(b+eGYfXS6hOd*L7>Pu6?A5g0#KM}uMKG3yqzUq%Y+SEmT8nc z?n2W-sed&J;U8A zP@KhRORl37Xgj5qq~$c^6lG->7eY|vI|s}i(RzzN_R!HYA#7@aH^Uu5T?{DCZ+6=^o5o zBD%yT8bD{BIKcgBkQ%s_@~rJduMYVbz}{D=e?ayBTj?ZD`l=Z+n_-8y=REe?KK=N}zU0?$f$~VT5=||C}W5pkZ*_ zx647pf0HSd7{4z}NWaip6>VD`u6XPF=-{-7?lT)Xr1eZje(NT7{ zeK4i7nQwbX#0O^b z7l`aDf}eOp9ET_UGja^$)g^ z#}-z%KM!QGZnzei8A4OOLtSX|I5NHP`%69%(O7J^@2HIF1TpbG*(cFYomUasvZ@v| z)>#jh#ZFNho|l>z7JM!%@lG<`op0|-7E4x0;420QSV(01$IUJ{=g0lEky7w?LDNlK zksraN+!}Qrk6w)wEaZMlOzi5H@y(C(OTkJ9{Vj^EteJioL=Clg68(_bbr zNBi=DoIpigc+nv1Nw3F;FsHoCDhC2$g80a%l2Uw`_NQ1D`K&W1ydP1;dg+H%8YXKObl`L(-at-He009ve?;WZtZ&PJMsBv z{k7GXw};i8U3MPfIx$&_aP}w``6!Y6Xw66S6j_~H`E658KtO*KJ8m7kQiyMSJ(&uJ z@2K5#qu=c>oZuwxbfuz(xz}Z-J6~`Ieg}{#1((k4lFVDZV)|Zq_4dhjYs$J=dtEmC zCS@KT+z;P#p2OlNwvWa)tb`WR8mE=(<*FhKLZqkcHYV7>t^X083v`Jpi^$TqVD`*0{?5N z)#C}F^}OA_#g8-J?{cB#{J}0SHGd@>ZFcUkzgNsxa)%dK-K1zffz{pM)!f|yEo*0o zk0ZFJ&a;lfngL{Heo1xr>0>MZ2E-e(wXmb* zuKdOx7OIE3%lD{BhF&bRW~;vxL3^lsQ`I`CUYKeXg z>r_PFxmr#yd5z0+CQ*3<4ey2lf_2u>$)4!{{{HgU<_vi^$!%twsGO_9w{RmRHV?vu+l?z<7L~^YawubpG~#FQ)ZD>2~}zqW!qPJ(Y|~iokRyY z5pRwo*yQK9c!&y9zE^ws2fJv9r>!73!#150*35qu#}9Yh0Y;Xd+dFw_D&KvIwGzth z$wE9(Qx^_G?~S@( znqC$w{TcKO3{V^orF_(Z>#=R>V8eLMjSHD)O)s^pYPzQ@5#sGbiE`d0fOK z6x8D9&koNtABxoM))Eht5^Qu;s>~f+Cwr(17m%K_`c_|punAN=;&@os*z=W!Eb7*) z8joLoE1Qy7=kJ&Y%gDS(Q7dqNYIrt1Gt(6lNEGFx+&6esDrY*i>JcVB|+LfVf0Jk{tSw z1xHJbg3$><;Dm@8o?}4fvq<{$^Ixg69A$`t=}t?K?AwWW;cL;oOLO@ZlZK}U8}QlL zSvZfyor(!Ntf8SHZTWZagmQ9r^)C1IKE=kW>gp=id7QVkwdqe(z7e3n5u#^e;x=x> zV_{)I3Z_23zIVvUgP5tQ-@jcOesgi=($UeuaZl6@zBAVv1&2$6!zK|7OiWQAy92q) z<$QmH(|W2F0nC-dunFDL(sKLVchHVaz3=u=*EzT2ne12D=bt)!60P~AE3bpEto8uJ@Hua~f`g8c~ngK-54b`Ni zSSY?64j_mMKeQLTc_N(az_R+55ob_3KxNdS>zSEE18kk_)9^B|i-DPa30+Z<*S0zB zN^k{RhL+|Wb4)9dS%wFF;CO6so2-4-Bb&lHz$*rYveU23` zz2)fnWncz73%9}s&lsP=Vms^isW*9Pxi8H@z<%*|rl|YLPfcTEddF{w_;@m*VaXgGR#$^%WL*#W;`F+wv3RsaB2x!MU_xW7YZ zhipr2&4I`eH3)M<^keA;8e&5rV_*n8wdc6r;V-IC-#p}~sp$B1okhv)*O5ha^lz%w z8n+)3n)y^RtLqh1&N6}O?PRIN&Yz;G=rskEv-X}>`Bf;bX=ekplDPMA#rA7oZ^v_f z#664c0d@_8hQ}dO9@8cr`XO!9^#@U+HY;hgIyz(k&PLK3RE*<`Z<}c5t9#>VX9M@x zoBoK~pZkJ6$#qjOFfg#Kz1^U}8^fV>>u|4C>>}ds1NEOn02fE3_c*GrOdP+&+EdM& zAkD%jPvsD6mTh?)l5AzYWT!xyhkuveR>1w!(8=gtL>S1oEv-3cIiHkJwWvKK5oa=P z4NHEh1fuG(E^sc5xviBWL9tt_XAU5QA8Ca2WZoY3$GigqZinUh`f*$9vIonY5zGVD zv82X-$}BWv(h@>s8dhY>S+TF$o@~s-D6MbjGP6@Lwqkphn0)iC2jr8SWzGg5p#qS0 zbYc5||LJ{sxt~y=wcn~fKEI_)pIr)EdelLF!B0kAN-8_}-si|+ruVTOkIqghabFnf zh4kc7Ib#%|XX5rr2dHZ%ni_$36H2t)-HYh#4Vl3N2E@$CVy!DMF>SVf4VxppfD&7# z8trVY?&3k@pSORO)53OP_9KGDz&}EQ8&$XFJBy@R4D3b(S1cTKo(=Gv9BwI@0k44f zAcR|eB%eJ?yN|ilgP416`RbL7v@|s*X9PGjR~}p+h{U%(j@xWGueLVn;K0$)&~O=e zg*dwWch^HkdV23it_R9$YThz1SoOf*p!dic0~=c?&h_ipQBYBLc3P?SCSA97Km&VZ z6q6FI4i)W9)c9+$t<#UcC%Yb}60wUM7Wgeq?uS$4Z@-?~04D@+teIi~uc8#Y@6}sn z6y7plPiCg=5wo=)ekaXPMc>k^Wzbt+sL6*pI1DzbnPFtNR#e*I*NY2srR^FTfGFlW z{rUdaK3pHHAaj5X80z;EJ~89A86^3wH+TLHfy2x8G0}R%p;B1I$iXwD2gFNOOnHT$ z@OV6Vze)}$zkz@$;B6OP~EFAZ|y{T4rkeky^vr#lr z5kr-??aIpr5FyXptwdJo+HTa5n3;{?g~UlbJiEBb9yvG!n98K+Z{HQO6?IAyiv_I! zqDhgNM*3?CGm#UbznlmCvUA#d?W5LjZ{%}We3reHOm#4{?Dn9q!M!mbtcP8?%92AV z)ynEXc>1d!X({DsSCa|sSv}> ziK?2t9^r|1Yx%+C{GkB!6uq7j^~Jdt*lcKUcC-V&;bK^<0dm{t^70t>(}O;kf&#X$ z0XX8P-XEXtJ~K1TqeqCmJXSI?GH^OMlmHV&Tq41R3xj$3MV~4diwnfmzahYJApX?j`S?+TXu$xEE&(HVv^^HtS3?5jS-=1kqPfy>D zNMVNelsiK?4OrpuO+Po7I> zoiF&Hf_(^u+Aqh_zxpwIP_1g>OimWXSebkLfA15K9-99>Q zn&cMB>OHMukXitc+f!(Bj`-UIoPzr%MhPZcYv$`)kt8YGhS`2ghwlLW9?x>0;MAb& zVk05Vw*5RAMjxl{IRLS4Kt^`kaQHJT6xWOy$WXLU&m{=se{%>B`W~oXr^@8`_W174 zbv^;*tfpB=Pdz+DMU%q- z=PQ1>A$N6h2LS2-8~sv~ z-pZO8p7|JdezsB>)+IotO2BhrU4uC16^i)aHE$km%5U{(hAux$miE#Z5n zQ&uxA=;Ya)EKi7Prw?y^Pd`wR*+}Cu^Y$^V_`ux6(gxDS&l?u*YU0*j4QZl$_xAdR zwnVqN-h{V21zAicZl_!Mx^63!-UdK%#E>&IXEN%=BxjS?z2o? zKZ7RbCpvs=Ulx`?m+yAUh;{CTYI9HO@I`Ts@@|A;P^?lj3f3;us0vE3zZxLBfE&6L zs%Modw7N}rmL?C9_~7=E6C$=b1=OBYpIlj8;Mzz2DuX|V#okhodId=hv^)%0a?*s8 zi$Xx^8dHbg}{I$2KBZadf*AFXv4e%@=MYS5vNtr|q^nAq=PT9MFE>QQaE zBffdy2;37cpgc!)hew{Of-FyXc`nxV5&WX6@?N2h*{*&F0A$tIVG3yMwMzz5q=;K} z1{pejfM*Lm$Q`n<;wB-?v2{xIDF9Fypz>Dt#)lK`X+CeMoH?G}!T|Z7<9(PGwujE< z0?@M9(wnh59jjgD`N#oy2*6U^KAzG4n0)5+d;LNg5`r?CP%v!Pvib`eYq^CG(L<{| z<)pVUVU@yt4L)Zl@BLD~Z~Va_bO3M~x3CW3(yktvO8DFe?6N@bv8L;fPC)*ED#qFD z$K2${?6BB}9Ygf(jmvcH43Q1h=TuDd9q~8OJ>1`ZOFuWOyZjNPDz%s#)yv;p;jOL>&fsBXh+IvJo zYOA=YOZRTI^r%|2zkBz-#qvxPO!1GMtIeMDjS(EJx z0FU%}9$>*OF_Tk)WV+S|pk17pr)UD7wIN{j(t4i02A|i2D8u~5Mztd7v(17$Ot{o@ z@4{gC;`%_#)fw4w78&fB45ZfyO4W-C9{z@suQ@tEz$BX1b$N|AC z^>Uq<12L{A4TvKWfy(rc`1yh$=%8T9s{4_dl{aXTbPpXo5r|#~16y<1PKG4_HBs4e zr!Z>*C4&=sF%Z@Y%(NW&jM&JfD>YtjUif2P>5~5K9FqymBq^DzoE+!P{UEUld^4fh{JO^3qI(;(Reb&8thEHX8*6W{qqMZ}ScHE7$m5 zi8^3*1w=F`fvI>J#i5GTD6-W}S#g@#u2fK007_4pG zjNF30`todK4-TJi|5CNeehN0@BoKoJ{mW#C?$=M{_}n{wtsnAR`*!Ll4xV-E+Feazq_`vYfIa4Ae?Ps z8;0FR*MI!s}<(s=1juTuadm!AkPuN(9-)jTvP@tHKH*&?v;%kMccd9BY|40@XfLPZ413X2A7Nstz_Q;r7Q~WEUCyWNqrw!*W2oFJi&!YR<};#6pp~dw+=qqrwo? z(z4=ORg?F}+`L4)YL={;mgZmcw!YV)3BLF{L1ks-_w+KcN>^ir0-88Fo7CUG93Fy= zU?%%rbXZ5Kx_2R7J=c}o(af{OP7i8WAdW(V7U`q^UHU#<0~dyKD>=4xLdIpjwkAZL zLOwpBl_}EB#nb?8=9b>VOiiq9#-sWuEVJ#OB{~y_YJ$&uBg@xmxC}p=wzBLV>^`k; zXPqby@o|`CF)~rdA+IbtV#eM1`PD$_TN=N=#K&J_(UpZm)ejNFZEX3x&X^?Ulin?v()>tdkIoiEOE(_YB>8_Ff3)F>+ zHIjm!#S3pReeGYF za*X#bU4mg{(jyptjUSl#`D3wwU^&0Auyc5|q{vM5HnR^KQb~cIZZ<7g)z5?V^8w}z zw^G^B4$QS;&=e$pZyuRB(dp&G?aWo@o0o{KE$e2>!9!`toy^>E$`ly>E{5KY*ck6s z{!DKtl^Of*9c5K*c~0WF+3AxdO;0>@O1XpC+YPTeT*@kmR!(MZ1vnNK7yIKHXQm{>(mT+JU#FRx`wVdV`sHk~3+FzY+)ViZIp!xj4FHK=;^LAJ=%g_1e+qsJR!)dbJ!ze6Bp)`cUxA!zUgpJE6EiV33(@MNu2mdEk zUY00}V=?2`lX8{)Nz*BUMh3Arv&}TN=XvhrQQ~acO~-M3z;H`CT&Ho29@%}NZpbLF zeCr1ldYYO4^br6WqndAmBnXUjA^t zP^2=)v1qp#Hn{tg+%cNd=$8i3rRxooUbBc&hOlSqFI^Z#iemoIT3o!q!!!V>J>X6)Uu4Y+E)BPy3@-k0yJ(^Rj4 O|74yjN*0Lgd;K47MZ6>c literal 0 HcmV?d00001 diff --git a/docs/images/webcontrol/attribute_value_table.png b/docs/images/webcontrol/attribute_value_table.png new file mode 100644 index 0000000000000000000000000000000000000000..1e94358bd565ee3ab4e1cfaa1fe059d7067a8238 GIT binary patch literal 98486 zcmeFZ2|SkT+BRORS%pfG3@JmY$UJ0dLLw4T#xh5l;~`N|NGOsdgbBw@di<_VT6p$?fZYPZlh=v_SdbJ}t_^FU1V{jaLh3^G(zD87Pu& zd#@Z_w5IOZfyujZa`ZQ#3 z@n+n=oa_6tC0yhWb!pp{lRx-+DD3-%IuR z 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

6EC&^yoak?t4s=%E{hrzec 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�ZC9bS^@X_28sBb6{k`kgy> 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 literal 0 HcmV?d00001 diff --git a/docs/images/webcontrol/disconnected_icon.png b/docs/images/webcontrol/disconnected_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..63ce41bef60232ee5421a627ac606b73370c8d9f GIT binary patch literal 8660 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 literal 0 HcmV?d00001 diff --git a/docs/images/webcontrol/information_icon.png b/docs/images/webcontrol/information_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c43f2c2560c003c8931fe84b8c1b912ffccc2956 GIT binary patch literal 7431 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 bUdiNt4=dQCAoEL*w#=e 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 GZ~QMVTA}3t literal 0 HcmV?d00001 diff --git a/docs/images/webcontrol/ui_schematic.png b/docs/images/webcontrol/ui_schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..ee855ff7c8b858925febc55a679516963b54d2e1 GIT binary patch literal 46519 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%0DiW6BhD8CMO#u@ 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 W8wGk`CW8t90000 +
PANDA
PANDA
https://123.456.7.8/gui/PANDA/layout
https://123.456.7.8/gui/PANDA/layout
PANDA
PANDA
https://123.456.7.
https://123.456.7.
PANDA
PANDA
https://123.456.7.
https://123.456.7.
PANDA
PANDA
https://123.456.7.
https://123.456.7.
\ No newline at end of file diff --git a/docs/myst.yml b/docs/myst.yml index d6344dd8..1d521505 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -4,8 +4,8 @@ project: github: https://github.com/PandABlocks/meta-panda # Cross-repository references (mystmd xref + Sphinx intersphinx). # PROTOTYPE for upstreaming into the DLS python-copier-template (Stage A spec §6). - # The three core repos + devcontainer are mystmd projects (resolved via their - # published myst.xref.json); PandABlocks-client and fastcs-PandABlocks are Sphinx + # The three core repos are mystmd projects (resolved via their published + # myst.xref.json); PandABlocks-client and fastcs-PandABlocks are Sphinx # projects (resolved via their objects.inv). URLs for not-yet-published sites will # warn until those repos deploy their docs branches. references: @@ -19,7 +19,6 @@ project: # live fetch is pending. # PandABlocks-FPGA: https://pandablocks.github.io/PandABlocks-FPGA/main # PandABlocks-server: https://pandablocks.github.io/PandABlocks-server - # PandABlocks-devcontainer: https://pandablocks.github.io/PandABlocks-devcontainer # fastcs-PandABlocks: https://diamondlightsource.github.io/fastcs-PandABlocks/main toc: - file: index.md @@ -32,19 +31,22 @@ project: - file: tutorials/tutorial4_snake_scan.md - file: how-to.md children: + # Using a PandA - file: how-to/quickstart.md - - file: how-to/build.md - - file: how-to/manual-build.md - - file: how-to/make-release.md - - file: how-to/packages.md - - file: how-to/upgrade-via-ssh.md - - file: how-to/upgrade-via-web-admin.md - file: how-to/use-web-control-to-set-up-a-panda.md - file: how-to/save-restore-design.md - file: how-to/monitor-attribute-values.md - file: how-to/integrate-with-a-panda.md - - file: how-to/test-firmware-changes.md + # Administering a PandA + - file: how-to/upgrade-via-web-admin.md + - file: how-to/upgrade-via-ssh.md + - file: how-to/packages.md - file: how-to/choose-fpga-bitstream.md + # Developing for a PandA + - file: how-to/build.md + - file: how-to/manual-build.md + - file: how-to/test-firmware-changes.md + - file: how-to/make-release.md - file: how-to/contribute.md - file: explanations.md children: diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md index a416bc4c..894f8750 100644 --- a/docs/reference/glossary.md +++ b/docs/reference/glossary.md @@ -7,8 +7,8 @@ as the canonical reference; all other repos link to this page. ```{glossary} App : An `.ini` file that specifies the type and number of {term}`Block` instances - to build together into an FPGA image (a {term}`Zpkg` or `.ipk` package - loadable on a PandABlocks device). + to build together into an FPGA image (an `.ipk` package — or, pre-5.0, a + legacy {term}`Zpkg` — loadable on a PandABlocks device). Attribute : A property of a {term}`Block`. Attributes are divided into four categories: diff --git a/docs/reference/machine-targets.md b/docs/reference/machine-targets.md index 39ec3ade..9b98a031 100644 --- a/docs/reference/machine-targets.md +++ b/docs/reference/machine-targets.md @@ -7,10 +7,13 @@ manual builds) or via `KAS_MACHINE` (for kas builds). | MACHINE | Hardware | Notes | |---|---|---| | `pandabox` | PandABox (default) | Zynq 7030; joint DLS/SOLEIL hardware; [Open Hardware](https://www.ohwr.org/projects/pandabox/wiki) | -| `xu5-st1` | ZynqMP-based target | — | -| `xu5-s1` | ZynqMP-based target | — | +| `pandabox2` | PandABox 2 | Successor to PandABox | +| `pandabrick` | PandABrick | | +| `xu5-st1` | ZynqMP-based target (XU5 SoM) | Development only | | `zedboard` | Zedboard | Development/testing platform | -| `pandabrick` | PandABrick | | + +The generally supported machines are `pandabox`, `pandabox2` and `pandabrick`; +`xu5-st1` and `zedboard` are development-only targets. :::{note} `pandabox` is the default machine built when `KAS_MACHINE` is not set. diff --git a/docs/tutorials.md b/docs/tutorials.md index eac69798..e5709787 100644 --- a/docs/tutorials.md +++ b/docs/tutorials.md @@ -2,6 +2,9 @@ Tutorials for installation and typical usage. New users start here. +If your PandA is not yet on the network, follow +{doc}`how-to/quickstart` first, then begin with Tutorial 0. + ```{toc} :context: children ``` diff --git a/docs/tutorials/tutorial0_connecting_to_web_control.md b/docs/tutorials/tutorial0_connecting_to_web_control.md index 79e3792f..e46f8b5a 100644 --- a/docs/tutorials/tutorial0_connecting_to_web_control.md +++ b/docs/tutorials/tutorial0_connecting_to_web_control.md @@ -10,6 +10,12 @@ be ready for the hands-on tutorials that follow. - A PandA that is powered on and connected to your network. - Its IP address or hostname (e.g. `192.168.0.100` or `my-panda`). +:::{tip} +If your PandA is not on the network yet — fresh out of the box — start +with {doc}`../how-to/quickstart` to prepare an SD card and find it on the +network, then come back here. +::: + ## Steps ### 1. Open the web control @@ -23,7 +29,7 @@ http:/// where `` is the IP address or hostname of your PandA. You will see the initial screen: -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/starting-ui.png +```{figure} ../images/webcontrol/starting-ui.png :align: center The initial web control screen @@ -34,7 +40,7 @@ The initial web control screen The drop-down at the top of the page lists the root blocks available on your PandA. Click it and choose **PANDA**: -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/block-list.png +```{figure} ../images/webcontrol/block-list.png :align: center Selecting the PANDA root block @@ -45,7 +51,7 @@ Selecting the PANDA root block After selecting PANDA, the left-hand panel loads that block's details — attributes, groups, and methods: -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-block-details.png +```{figure} ../images/webcontrol/PANDA-block-details.png :align: center Details for the PANDA block @@ -56,13 +62,13 @@ Details for the PANDA block Scroll down in the left-hand panel until you see the **Layout** attribute. Click **Edit** to open the block layout in the centre panel: -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/layout-button.png +```{figure} ../images/webcontrol/layout-button.png :align: center Click **Edit** in the Layout attribute row to open the layout panel ``` -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout.png +```{figure} ../images/webcontrol/PANDA-layout.png :align: center The layout panel showing the functional blocks of the PandA @@ -74,7 +80,7 @@ Drag blocks to new positions to suit your preference. A brief spinner indicates that the updated position is being saved to the hardware: -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-layout-spread-out.png +```{figure} ../images/webcontrol/PANDA-layout-spread-out.png :align: center Blocks dragged to new positions; clicking a block loads its details in the right-hand panel @@ -88,7 +94,7 @@ Clicking any block in the layout loads its details in the right-hand panel Click a port on one block and drag to a compatible port on another block to create a signal link: -```{figure} ../_legacy_rst/webcontrol/userguide/screenshots/PANDA-new-link.png +```{figure} ../images/webcontrol/PANDA-new-link.png :align: center Dragging between two ports to create a new link diff --git a/docs/tutorials/tutorial1_blinking_leds.md b/docs/tutorials/tutorial1_blinking_leds.md index d7cd0814..5f4f50c1 100644 --- a/docs/tutorials/tutorial1_blinking_leds.md +++ b/docs/tutorials/tutorial1_blinking_leds.md @@ -32,7 +32,7 @@ output LEDs turn on sequentially, then turn off in reverse order. ## How the design works -The **CLOCKS** block generates a 50% duty-cycle pulse train with a 1 s period. +The **CLOCK1** block generates a 50% duty-cycle pulse train with a 1 s period. **PULSE1–4** each take this as an input trigger and produce a pulse with a different width and delay. The PULSE blocks act as a delay line, queuing pulses until each delay expires. @@ -49,7 +49,7 @@ beyond the period the block drops the pulse instead of merging it, reporting the drop in the **Dropped** field. ::: -You can also click the **CLOCKS** block to adjust the input pulse period. +You can also click the **CLOCK1** block to adjust the input pulse period. To explore further, try wiring pulse outputs to different TTLOUT blocks: click the Palette icon, drag a **TTLOUT** block onto the canvas, then connect a From 697f1987a6821940edfb572fc8bf0d3258cb7b8b Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Fri, 12 Jun 2026 09:08:40 +0000 Subject: [PATCH 19/49] devcontainer: add kas-based devcontainer Per-repo devcontainers replace the planned PandABlocks-devcontainer repo. Modelled on python-copier-template, but kas-based (ghcr.io/siemens/kas/kas:4.8, matching KAS_IMAGE_VERSION in build.sh) since this repo builds with bitbake. Lives entirely under .devcontainer/ as the root Dockerfile is the existing FPGA-tools/CI container. Co-Authored-By: Claude Opus 4.8 --- .devcontainer/Dockerfile | 11 +++++++++++ .devcontainer/devcontainer.json | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..361cad19 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,11 @@ +# Devcontainer for meta-panda Yocto/kas builds. +# Unlike the other PandABlocks repos (which use ubuntu-devcontainer), this is +# based on the kas image, matching KAS_IMAGE_VERSION in build.sh. +FROM ghcr.io/siemens/kas/kas:4.8 AS developer + +USER root + +# Add any system dependencies for the developer environment here +# RUN apt-get update -y && apt-get install -y --no-install-recommends \ +# some-tool \ +# && apt-get clean diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..1aea043f --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,24 @@ +// For format details, see https://containers.dev/implementors/json_reference/ +{ + "name": "meta-panda Developer Container", + "build": { + "dockerfile": "Dockerfile", + "target": "developer" + }, + "customizations": { + "vscode": { + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "redhat.vscode-yaml" + ] + } + }, + "runArgs": [ + "--net=host", + // Make sure SELinux does not disable access to host filesystems like tmp + "--security-opt=label=disable" + ], + // Mount the parent as /workspaces so peer repos are visible alongside + // this one, and bitbake build output can live outside the repo + "workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind" +} From e1c46320ba6cf363252a53447dc859867a610704 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Fri, 12 Jun 2026 09:08:40 +0000 Subject: [PATCH 20/49] knowledge: add Stage B issue script and fresh-eyes review status create-issues.sh files the remaining human-verification issues (run with an authenticated gh; it commits its own marker edits). 09-fresh-eyes-review.md records what was fixed and the user-confirmed answers; runbook annotated where the per-repo devcontainer decision superseded it. Co-Authored-By: Claude Opus 4.8 --- create-issues.sh | 1070 +++++++++++++++++++++++++++++ knowledge/08-runbook.md | 4 +- knowledge/09-fresh-eyes-review.md | 201 ++++++ 3 files changed, 1273 insertions(+), 2 deletions(-) create mode 100755 create-issues.sh create mode 100644 knowledge/09-fresh-eyes-review.md diff --git a/create-issues.sh b/create-issues.sh new file mode 100755 index 00000000..50aeec9c --- /dev/null +++ b/create-issues.sh @@ -0,0 +1,1070 @@ +#!/usr/bin/env bash +# Prompt B — GitHub issue creation for the docs-rewrite backlog. +# Source: meta-panda/knowledge/03-target-doc-map.md §"Issue backlog" +# +# Prerequisites: +# • gh authenticated with a PAT (scopes: repo, issues) +# • All three repos on their `docs` branch at the paths below +# (Prompt A must have been run first) +# +# Run from any directory. Designed to be run once; re-running is safe +# if it failed partway — gh refuses duplicate titles and the sed +# replacements are idempotent (they only match the Stage-B placeholder text). + +set -euo pipefail + +META=/workspaces/meta-panda +FPGA=/workspaces/PandABlocks-FPGA +SERVER=/workspaces/PandABlocks-server + +# Extract the issue number from a gh issue URL +# e.g. "https://github.com/PandABlocks/meta-panda/issues/42" → "42" +num() { echo "$1" | grep -oE '[0-9]+$'; } + +# ─── 0. Ensure labels exist in all three repos ─────────────────────────────── +echo "=== 0. Creating labels ===" +for REPO in PandABlocks/meta-panda PandABlocks/PandABlocks-FPGA PandABlocks/PandABlocks-server; do + gh label create "docs-rewrite" --repo "$REPO" --color "0075ca" --description "Docs rewrite backlog" --force + gh label create "human-capture" --repo "$REPO" --color "fbca04" --description "Needs human-captured screenshots or bullets" --force + gh label create "verify-then-write" --repo "$REPO" --color "d93f0b" --description "Needs maintainer verification before writing" --force + gh label create "author-from-scratch" --repo "$REPO" --color "0e8a16" --description "New content to author from scratch" --force + gh label create "infrastructure" --repo "$REPO" --color "5319e7" --description "Docs build/deploy infrastructure" --force + gh label create "tooling" --repo "$REPO" --color "e99695" --description "Docs tooling / autogeneration" --force +done + +# ───────────────────────────────────────────────────────────────────────────── +# PandABlocks/meta-panda (9 issues) +# ───────────────────────────────────────────────────────────────────────────── +echo "" +echo "=== 1. meta-panda issues ===" + +# ── I1: tutorials 3 + 4 [human-capture] ───────────────────────────────────── +I1_URL=$(gh issue create \ + --repo PandABlocks/meta-panda \ + --title "docs: provide screenshots and content for tutorial 3 (position compare) and tutorial 4 (snake scan)" \ + --label "docs-rewrite,human-capture" \ + --body "$(cat << 'BODY' +## Target pages + +- `tutorials/tutorial3_position_compare` +- `tutorials/tutorial4_snake_scan` + +Both stubs contain fewer than 60 words each and are currently near-empty +placeholders. They need the same depth as tutorials 1 and 2 (~600–1200 words +plus annotated screenshots). + +## Category: human-capture + +These pages can only be completed once a person with hands-on PandA access +supplies annotated screenshots and step-by-step bullets. A doc engineer will +then expand them into finished MyST pages. + +## What a human must do (~4–6 hours total) + +### Tutorial 3 — Position compare (`tutorial3_position_compare`) + +On a PandA connected to Web Control: + +1. Configure a PCOMP block so that a position input is compared against a + threshold and generates trigger pulses on the output. +2. Take labelled screenshots at each step (block palette, attribute panel, link + arrows, waveform output if available). +3. Write numbered steps (goal → prerequisites → procedure → expected output) in + the same voice as tutorials 1 and 2. +4. Record exact block names, field names, and representative parameter values. + +### Tutorial 4 — Snake scan (`tutorial4_snake_scan`) + +1. Build a 2D snake scan using a SEQ block and its table editor. +2. Take labelled screenshots of the SEQ table configuration and the resulting + trigger output. +3. Write numbered steps at the same depth as tutorial 2. + +Deposit screenshots under `docs/images/` in the `docs` branch and post the +bullets as a comment on this issue (or open a PR). + +## Source stubs + +- `docs/_legacy_rst/tutorials/tutorial3_position_compare.rst` — 41 words (stub) +- `docs/_legacy_rst/tutorials/tutorial4_snake_scan.rst` — 52 words (stub) +BODY +)") +I1=$(num "$I1_URL") +echo " meta-panda#$I1: tutorials 3+4" + +# Update tutorial3 stub +sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/meta-panda#$I1]($I1_URL)|" \ + "$META/docs/tutorials/tutorial3_position_compare.md" + +# Update tutorial4 stub +sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/meta-panda#$I1]($I1_URL)|" \ + "$META/docs/tutorials/tutorial4_snake_scan.md" + +# Update PROGRESS.md (two TBD lines → same issue) +sed -i "s|⛔ tutorials/tutorial3_position_compare — issue #TBD — human-capture|⛔ tutorials/tutorial3_position_compare — issue #$I1 — human-capture|" "$META/docs/PROGRESS.md" +sed -i "s|⛔ tutorials/tutorial4_snake_scan — issue #TBD — human-capture|⛔ tutorials/tutorial4_snake_scan — issue #$I1 — human-capture|" "$META/docs/PROGRESS.md" + + +# ── I2: web-control attribute-widget screenshots + trailing sentence [human-capture] +I2_URL=$(gh issue create \ + --repo PandABlocks/meta-panda \ + --title "docs: add screenshots and trailing sentence for the four attribute input widgets in how-to/use-web-control" \ + --label "docs-rewrite,human-capture" \ + --body "$(cat << 'BODY' +## Target page + +`how-to/use-web-control-to-set-up-a-panda` + +The "Specifying Block Attributes" section has been converted but the subsection +covering the four attribute input widgets is blocked pending fresh screenshots +and one missing sentence from the source. + +## Category: human-capture + +## What a human must do (~2 hours) + +1. In PandA Web Control, find or create attributes that exercise each of the + four input widget types: + - **View/Edit button** — a complex / table attribute + - **Dropdown list** — an enum attribute + - **Text input** — a free-text string or numeric attribute + - **Checkbox** — a boolean on/off attribute +2. Take one labelled screenshot per widget type clearly showing the widget in + context inside the Block Information Panel. +3. Provide the concluding sentence for the *Text input* widget description — + the source text (`working_with_a_design.rst`) is truncated mid-sentence at + that point. + +Deposit screenshots under `docs/images/` in the `docs` branch and post the +sentence and image filenames as a comment on this issue. + +## Source + +`docs/_legacy_rst/webcontrol/userguide/working_with_a_design.rst` — the four +widget subsections under "Specifying Block Attributes → Types". +BODY +)") +I2=$(num "$I2_URL") +echo " meta-panda#$I2: widget screenshots" + +# Update inline stub in the converted page (multi-line text — use perl) +perl -i -0pe \ + "s|A GitHub issue covering the widget screenshots and the\ntrailing sentence will be created in Stage B \(Prompt B\) and linked here\.|Tracked in [PandABlocks/meta-panda#$I2]($I2_URL).|" \ + "$META/docs/how-to/use-web-control-to-set-up-a-panda.md" + +# Update PROGRESS.md +sed -i "s|⛔ how-to/use-web-control-to-set-up-a-panda (4 widget screenshots + trailing sentence) — issue #TBD — capture|⛔ how-to/use-web-control-to-set-up-a-panda (widget screenshots + trailing sentence) — issue #$I2 — human-capture|" "$META/docs/PROGRESS.md" + + +# ── I3: 3.0→4.0 breaking changes [verify-then-write] ──────────────────────── +I3_URL=$(gh issue create \ + --repo PandABlocks/meta-panda \ + --title "docs: document 3.0→4.0 breaking changes and migration guide" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`reference/changes` + +## Category: verify-then-write + +The existing source (`github.io reference/migration_guide.rst`) only covers +2.0→3.0. The 3.0→4.0 section is completely absent. + +## What a human must do (~3 hours) + +1. Review the PandABlocks 4.0 release notes, CHANGELOG, and git log for + breaking changes since 3.0. +2. Check the existing `migration_guide.rst` (2.0→3.0) for style reference. +3. Write a 3.0→4.0 section for `reference/changes` covering: + - Config file changes (`boot.txt` → `config.txt`, etc.) + - Wire-protocol breaking changes (if any) + - Removed / renamed blocks or fields + - Build toolchain changes +4. Also add a compatibility matrix row for the 3.0→4.0 transition alongside + the existing `release_compatibility.rst` content. + +Post the draft as a comment or PR against the `docs` branch. + +## Source + +- `docs/_legacy_rst/` (`github.io` copies) — `reference/migration_guide.rst` + (119 words, 2.0→3.0 only) +- `reference/release_compatibility.rst` (32 words) +BODY +)") +I3=$(num "$I3_URL") +echo " meta-panda#$I3: 3.0→4.0 changes" + +sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/meta-panda#$I3]($I3_URL)|" \ + "$META/docs/reference/changes.md" + +sed -i "s|⛔ reference/changes — issue #TBD — verify (3.0->4.0)|⛔ reference/changes — issue #$I3 — verify (3.0->4.0)|" "$META/docs/PROGRESS.md" + + +# ── I4: machine-target support tiers [verify-then-write] ──────────────────── +I4_URL=$(gh issue create \ + --repo PandABlocks/meta-panda \ + --title "docs: fill in hardware details for pandabox2 and pandabrick in reference/machine-targets" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`reference/machine-targets` + +The MACHINE table matches `conf/machine/`, and support tiers are settled +(pandabox/pandabox2/pandabrick generally supported; xu5-st1/zedboard +development-only). Only the details columns remain (see the verify note on +the `pandabrick` row). + +## Category: verify-then-write + +## What a human must do (~30 min) + +Fill in the "Hardware"/"Notes" column entries for `pandabox2` and +`pandabrick` (SoC/module name, link to any hardware description). + +Post findings as a comment or PR. + +## Source + +`docs/reference/machine-targets.md` table; ground truth `conf/machine/*.conf`. +BODY +)") +I4=$(num "$I4_URL") +echo " meta-panda#$I4: machine-target hardware details" + +# Update inline HTML comment in the table cell +sed -i "s|||" \ + "$META/docs/reference/machine-targets.md" + +# Append to Blocked section (not yet listed) +sed -i "s|^## Notes$|- ⛔ reference/machine-targets (hardware details) — issue #$I4 — verify\n\n## Notes|" "$META/docs/PROGRESS.md" + + +# ── I5: KAS_IMAGE_VERSION mapping [verify-then-write] ─────────────────────── +I5_URL=$(gh issue create \ + --repo PandABlocks/meta-panda \ + --title "docs: verify and document the KAS_IMAGE_VERSION values for how-to/build" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`how-to/build` + +The page instructs users to set `KAS_IMAGE_VERSION` but defers to the release +notes for the correct value, with a verify note in the source. + +## Category: verify-then-write + +## What a human must do (~1 hour) + +1. Confirm the current valid `KAS_IMAGE_VERSION` value(s) for PandABlocks 5.x. +2. Document what the variable selects (which build container image / tag). +3. If the value is fixed per major release, add a table mapping release → + `KAS_IMAGE_VERSION`. +4. If it tracks `kas.yml` automatically, update the note to say so clearly. + +Post findings as a comment or PR against `how-to/build.md`. + +## Source + +`docs/how-to/build.md` — the `:::{note}` block under "Build steps → step 3". +BODY +)") +I5=$(num "$I5_URL") +echo " meta-panda#$I5: KAS_IMAGE_VERSION" + +sed -i "s|||" \ + "$META/docs/how-to/build.md" + +sed -i "s|^## Notes$|- ⛔ how-to/build (KAS_IMAGE_VERSION) — issue #$I5 — verify\n\n## Notes|" "$META/docs/PROGRESS.md" + + +# ── I6: legacy zpg filename [verify-then-write] ───────────────────────────── +I6_URL=$(gh issue create \ + --repo PandABlocks/meta-panda \ + --title "docs: confirm legacy-updater zpg filename convention for pre-5.0 upgrade path" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`how-to/upgrade-via-web-admin` + +The pre-5.0 upgrade path instructs users to download the legacy-updater package +from GitHub Releases, but does not state the exact filename/pattern. + +## Category: verify-then-write + +## What a human must do (~1 hour) + +1. Check the GitHub Releases page for meta-panda for the legacy zpg/zpkg + updater packages. +2. Document the exact filename pattern (e.g. `panda-upgrade-.zpg`) + and any machine-type suffix. +3. Confirm whether the file extension is `.zpg`, `.zpkg`, or something else. +4. Update `how-to/upgrade-via-web-admin.md` with a concrete filename example. + +Post findings as a comment or PR. + +## Source + +`docs/how-to/upgrade-via-web-admin.md` — the "Pre-5.0 PandAs" subsection, +step 1. +BODY +)") +I6=$(num "$I6_URL") +echo " meta-panda#$I6: zpg filename" + +sed -i "s|||" \ + "$META/docs/how-to/upgrade-via-web-admin.md" + +sed -i "s|^## Notes$|- ⛔ how-to/upgrade-via-web-admin (zpg filename) — issue #$I6 — verify\n\n## Notes|" "$META/docs/PROGRESS.md" + + +# ── I7: Xilinx branch bump post-5.0 [verify-then-write] ───────────────────── +I7_URL=$(gh issue create \ + --repo PandABlocks/meta-panda \ + --title "docs: confirm the Xilinx yocto-manifests branch for post-5.0 manual builds" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`how-to/manual-build` + +The page currently references branch `rel-v2023.2` of +`github.com/Xilinx/yocto-manifests`. A verify note flags that this may need +updating for post-5.0 releases. + +## Category: verify-then-write + +## What a human must do (~1 hour) + +1. Confirm whether `rel-v2023.2` is still the correct Xilinx manifest branch + for building PandABlocks 5.x. +2. If a newer branch is required for post-5.0, document it and the reason for + the change. +3. If the branch varies by PandABlocks release, add a small table (PandABlocks + version → manifest branch). + +Post findings as a comment or PR against `how-to/manual-build.md`. + +## Source + +`docs/how-to/manual-build.md` — the `repo init` step. +BODY +)") +I7=$(num "$I7_URL") +echo " meta-panda#$I7: Xilinx branch" + +sed -i "s|||" \ + "$META/docs/how-to/manual-build.md" + +sed -i "s|^## Notes$|- ⛔ how-to/manual-build (Xilinx branch post-5.0) — issue #$I7 — verify\n\n## Notes|" "$META/docs/PROGRESS.md" + + +# ── I8: hardware-target descriptions [author-from-scratch] ────────────────── +I8_URL=$(gh issue create \ + --repo PandABlocks/meta-panda \ + --title "docs: author per-target hardware descriptions for explanations/hardware-targets" \ + --label "docs-rewrite,author-from-scratch" \ + --body "$(cat << 'BODY' +## Target page + +`explanations/hardware-targets` + +The page is a full stub — no content has been written yet. It should describe +each supported hardware target so integrators know which platform to choose. + +## Category: author-from-scratch + +## What a human must do (~4 hours) + +For each MACHINE value in `reference/machine-targets` (pandabox, pandabox2, +pandabrick, plus the development-only xu5-st1 and zedboard — the list in +`conf/machine/`), provide: + +1. **SoC / module** — the Xilinx SoC or module part number. +2. **Key I/O** — number and type of I/O connectors, FMC slots, SFP, etc. +3. **Distinguishing features** — what makes this target different from the + others (performance, I/O count, form factor). +4. **Typical use case** — e.g. "general purpose lab PandA", "high-channel-count + detector trigger". +5. **Links** — hardware datasheet or purchase page where publicly available. + +A table-per-target or a definition-list format is fine. Post as a comment or +PR against `explanations/hardware-targets.md`. + +## Source + +Interview6 §A (background); cross-reference `reference/machine-targets.md`. +BODY +)") +I8=$(num "$I8_URL") +echo " meta-panda#$I8: hardware-target descriptions" + +sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/meta-panda#$I8]($I8_URL)|" \ + "$META/docs/explanations/hardware-targets.md" + +sed -i "s|⛔ explanations/hardware-targets — issue #TBD — author|⛔ explanations/hardware-targets — issue #$I8 — author|" "$META/docs/PROGRESS.md" + + +# ── I9: versioned docs / version switcher [infrastructure] ────────────────── +I9_URL=$(gh issue create \ + --repo PandABlocks/meta-panda \ + --title "docs: implement versioned docs and version switcher (R5)" \ + --label "docs-rewrite,infrastructure" \ + --body "$(cat << 'BODY' +## Scope + +All three docs repos: meta-panda, PandABlocks-FPGA, PandABlocks-server. + +This is review item R5 from the target map — deferred from the initial +content-rewrite round. + +## Background + +Each repo's GitHub Pages CI workflow already runs `make_switcher.py` and +produces a `switcher.json`, but the version switcher is not yet wired into the +MyST / sphinx-book-theme theme configuration. The Pages deploy publishes under +a versioned sub-path (`///`). + +## What needs doing (~2–4 hours) + +1. **Wire the switcher into the theme** — add `html_theme_options.switcher` (or + the MyST equivalent) so the version dropdown appears in the built docs. +2. **Test the switcher URL** — confirm `switcher.json` is reachable at the path + the theme expects (typically the repo root or a known static path). +3. **Handle `main` vs tag versions** — ensure the switcher lists released tags + and `main`/`latest` sensibly. +4. **Apply consistently** — the same change needs landing in all four repos (or + factored into the copier template if that's easier). +5. **Document the setup** in `how-to/contribute` under the xref/intersphinx + section (already drafted there). + +## Notes + +- The Pages CI workflow details are in each repo's `docs/PROGRESS.md` → Notes. +- The copier-template upstreaming opportunity is noted in `how-to/contribute`. +BODY +)") +I9=$(num "$I9_URL") +echo " meta-panda#$I9: versioned docs (R5)" + +sed -i "s|^## Notes$|- ⛔ infrastructure: versioned docs / version switcher (R5) — issue #$I9 — infrastructure\n\n## Notes|" "$META/docs/PROGRESS.md" + + +# ── Commit meta-panda changes ───────────────────────────────────────────────── +echo "" +echo " Committing meta-panda Stage B edits..." +git -C "$META" add docs/tutorials/tutorial3_position_compare.md \ + docs/tutorials/tutorial4_snake_scan.md \ + docs/how-to/use-web-control-to-set-up-a-panda.md \ + docs/how-to/build.md \ + docs/how-to/upgrade-via-web-admin.md \ + docs/how-to/manual-build.md \ + docs/reference/changes.md \ + docs/reference/machine-targets.md \ + docs/explanations/hardware-targets.md \ + docs/PROGRESS.md +git -C "$META" commit -m "$(cat << 'MSG' +docs: Stage B — link GitHub issues into stubs and verify notes + +Issues created for all human-capture, verify-then-write, author-from-scratch, +and infrastructure backlog items (see PROGRESS.md Blocked section). +MSG +)" + + +# ───────────────────────────────────────────────────────────────────────────── +# PandABlocks/PandABlocks-FPGA (4 issues) +# ───────────────────────────────────────────────────────────────────────────── +echo "" +echo "=== 2. PandABlocks-FPGA issues ===" + +# ── I10: testing CI [verify-then-write] ───────────────────────────────────── +I10_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-FPGA \ + --title "docs: verify and update how-to/testing for current CI (GitHub Actions + DLS GitLab)" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`how-to/testing` + +The page is a full stub — the source (`reference/testing.rst`) describes a +Travis CI setup that has since moved to GitHub Actions (simulation tests) and +DLS internal GitLab (full FPGA build tests). + +## Category: verify-then-write + +## What a human must do (~3 hours) + +1. Verify the current CI arrangement: + - Which test suite(s) run on **GitHub Actions** (open to contributors)? + Typically the Python / cocotb simulation tests. + - Which test suite(s) run on **DLS internal GitLab** (requires DLS access)? + Typically the full FPGA bitstream build and hardware-in-the-loop tests. +2. For each suite: document the trigger (PR/push/manual), the command to run + locally, and any required setup (Python version, simulator, DLS VPN). +3. Note which tests require access to real hardware vs simulation only. +4. Replace the stub with the verified content. + +Post as a PR against `docs/how-to/testing.md` on the `docs` branch. + +## Source + +`docs/_legacy_rst/reference/testing.rst` — 274 words (Python tests, HDL tests). +BODY +)") +I10=$(num "$I10_URL") +echo " FPGA#$I10: testing CI" + +sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-FPGA#$I10]($I10_URL)|" \ + "$FPGA/docs/how-to/testing.md" + +sed -i "s|⛔ how-to/testing — issue #TBD — verify|⛔ how-to/testing — issue #$I10 — verify|" "$FPGA/docs/PROGRESS.md" + + +# ── I11: cocotb IP assumption [verify-then-write] ─────────────────────────── +I11_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-FPGA \ + --title "docs: verify the cocotb 'modules using IP are unsupported' assumption against the full block set" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`how-to/cocotb` + +The page includes the statement: "Modules that use IP are currently unsupported +by the cocotb runner. All soft blocks (those covered by simulation) are +believed not to use IP and should remain testable — verify this assumption +against the full block set." + +## Category: verify-then-write + +## What a human must do (~1–2 hours) + +1. Check the full list of modules under `modules/` against the cocotb runner. +2. Confirm whether any soft blocks use Xilinx IP (and therefore cannot be + cocotb-tested). +3. If the assumption holds: remove the verify note and state it as fact. +4. If exceptions exist: list the affected modules and explain why they are + excluded. +5. If the limitation has been lifted: update the text accordingly. + +Post findings as a comment or PR against `docs/how-to/cocotb.md`. + +## Source + +`docs/how-to/cocotb.md` — "About cocotb" section, lines 12–14. +BODY +)") +I11=$(num "$I11_URL") +echo " FPGA#$I11: cocotb IP assumption" + +sed -i "s|verify this assumption against the full block set|verify this assumption — tracked in [PandABlocks/PandABlocks-FPGA#$I11]($I11_URL)|" \ + "$FPGA/docs/how-to/cocotb.md" + +sed -i "s|^## Notes$|- ⛔ how-to/cocotb (IP assumption) — issue #$I11 — verify\n\n## Notes|" "$FPGA/docs/PROGRESS.md" + + +# ── I12: VHDL coding standard [author-from-scratch] ───────────────────────── +I12_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-FPGA \ + --title "docs: author the VHDL coding standard for reference/vhdl-standard" \ + --label "docs-rewrite,author-from-scratch" \ + --body "$(cat << 'BODY' +## Target page + +`reference/vhdl-standard` + +No source exists — this is new content identified in Interview1 §4 as needed +for FPGA block contributors. + +## Category: author-from-scratch + +## What a human must do (~4 hours) + +Write the VHDL coding standard for PandABlocks FPGA block authors, covering at +minimum: + +1. **Naming conventions** — entity/architecture/signal/constant/type naming. +2. **Entity and architecture style** — port ordering (clk/rst first, then + inputs, then outputs), generic placement, `architecture rtl of` boilerplate. +3. **Reset style** — synchronous vs asynchronous; active-high vs active-low. +4. **Signal initialisation** — what is and is not allowed in simulation vs + synthesis. +5. **Comment requirements** — what must be commented (port descriptions, + non-obvious logic). +6. **Testbench conventions** — file naming, clock generation, `timing.ini` + relationship. +7. **Project-specific idioms** — any PandABlocks-specific patterns (e.g. use of + `entity_pkg`, `block_sim` wrapper conventions). + +Post as a PR against `docs/reference/vhdl-standard.md` on the `docs` branch. +BODY +)") +I12=$(num "$I12_URL") +echo " FPGA#$I12: VHDL standard" + +sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-FPGA#$I12]($I12_URL)|" \ + "$FPGA/docs/reference/vhdl-standard.md" + +sed -i "s|⛔ reference/vhdl-standard — issue #TBD — author|⛔ reference/vhdl-standard — issue #$I12 — author|" "$FPGA/docs/PROGRESS.md" + + +# ── I13: MyST block-listing generator + block-doc directives [tooling] ─────── +# NOTE: not in the 03 backlog "Issue backlog" section, but both stub pages +# (reference/blocks.md and how-to/block.md) explicitly promise a Stage B +# issue; included here to fulfil that promise. +I13_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-FPGA \ + --title "docs: implement MyST block-listing generator and block-doc authoring directives" \ + --label "docs-rewrite,tooling" \ + --body "$(cat << 'BODY' +## Blocked pages + +- `reference/blocks` — needs a MyST generator to replace the old Sphinx + `.. include:: build/blocks.txt`; will auto-list every block type from the + 42 `modules/*/*_doc.md` pages. +- `how-to/block` § "Writing docs" — instructions for writing per-block docs + deferred until the MyST tooling has landed and the two RST directives + (`block_fields`, `timing_plot`) have MyST equivalents. + +## Category: tooling + +## What needs doing + +### reference/blocks generator + +Currently `docs/reference/blocks.md` is a stub. The old RST approach used a +generated `blocks.txt` injected via `.. include::`. The MyST replacement +needs to either: + +- (a) Generate a `blocks.md` from the 42 `modules/*/*_doc.md` files at build + time (a `myst-nb` or custom Sphinx extension), or +- (b) Use MyST's `{include}` / `{toctree}` pattern to auto-assemble the listing. + +Prototype and document the chosen approach. + +### block-doc directives + +The `block_fields` and `timing_plot` RST directives used in the converted +`modules/*/*_doc.md` files need MyST-compatible implementations (or a mapping +to native MyST/Sphinx equivalents) so that `myst build` renders them correctly. + +Document the authoring workflow in `how-to/block` § "Writing docs" once the +directives are working. + +## Related + +- `modules/*/*_doc.md` (×42) are already converted to MyST; the directives + appear in them as raw RST pass-through blocks pending this work. +BODY +)") +I13=$(num "$I13_URL") +echo " FPGA#$I13: MyST block tooling" + +# reference/blocks.md +sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-FPGA#$I13]($I13_URL)|" \ + "$FPGA/docs/reference/blocks.md" + +# how-to/block.md "Writing docs" admonition +sed -i "s|A GitHub issue tracking the MyST block-listing generator and the block-doc\ndirectives will be created in Stage B (Prompt B) and linked here\.|Tracked in [PandABlocks/PandABlocks-FPGA#$I13]($I13_URL).|" \ + "$FPGA/docs/how-to/block.md" +# If the above single-line sed misses the newline, fall back to perl: +perl -i -0pe \ + "s|A GitHub issue tracking the MyST block-listing generator and the block-doc\ndirectives will be created in Stage B \(Prompt B\) and linked here\.|Tracked in [PandABlocks/PandABlocks-FPGA#$I13]($I13_URL).|" \ + "$FPGA/docs/how-to/block.md" 2>/dev/null || true + +sed -i "s|⛔ reference/blocks — issue #TBD — tooling (MyST block-listing generator)|⛔ reference/blocks — issue #$I13 — tooling (MyST block-listing generator)|" "$FPGA/docs/PROGRESS.md" +sed -i "s|⛔ how-to/block \"Writing docs\" section — issue #TBD — tooling (block-doc directives.*)|⛔ how-to/block \"Writing docs\" section — issue #$I13 — tooling (block-doc directives, deferred until MyST per-block doc tooling lands)|" "$FPGA/docs/PROGRESS.md" + + +# ── Commit FPGA changes ─────────────────────────────────────────────────────── +echo "" +echo " Committing FPGA Stage B edits..." +git -C "$FPGA" add docs/how-to/testing.md \ + docs/how-to/cocotb.md \ + docs/how-to/block.md \ + docs/reference/vhdl-standard.md \ + docs/reference/blocks.md \ + docs/PROGRESS.md +git -C "$FPGA" commit -m "$(cat << 'MSG' +docs: Stage B — link GitHub issues into stubs and verify notes +MSG +)" + + +# ───────────────────────────────────────────────────────────────────────────── +# PandABlocks/PandABlocks-server (7 issues) +# ───────────────────────────────────────────────────────────────────────────── +echo "" +echo "=== 3. PandABlocks-server issues ===" + +# ── I14: capture-options superset [verify-then-write] ─────────────────────── +I14_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-server \ + --title "docs: confirm the documented capture options against a live PandA server" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`reference/capture-options` + +The capture-option tables have been verified against the server source +(`server/pos_out.c`: the `capture_option_info` and `nominal_capture_masks` +tables) and harmonised across `capture-options.md`, `capture.md` and +`fields.md`. What remains is a quick live confirmation. + +## Category: verify-then-write + +## What a human must do (~30 min) + +1. Run `*CAPTURE.OPTIONS?` and `*CAPTURE.ENUMS?` against a live PandA server + (v4.x / v5.x), once on a firmware build with `StdDev` support and once + without if available. +2. Compare the responses against the tables in `reference/capture-options.md` + (expected: Value, Diff, Sum, Mean, Min, Max [, StdDev]; enums add No, + Min Max, Min Max Mean [, Mean StdDev]). +3. Correct the page if anything differs; otherwise just close this issue. + +## Source + +`docs/reference/capture-options.md`; `server/pos_out.c` for the +source-of-truth tables. +BODY +)") +I14=$(num "$I14_URL") +echo " server#$I14: capture-options superset" + +# Link the live-confirmation issue from the note on the page +perl -i -0pe "s|options \(\`StdDev\`, and therefore \`Mean StdDev\`\) depends on the FPGA\nconfiguration\.|options (\`StdDev\`, and therefore \`Mean StdDev\`) depends on the FPGA\nconfiguration. Live confirmation tracked in [PandABlocks/PandABlocks-server#$I14]($I14_URL).|" \ + "$SERVER/docs/reference/capture-options.md" + +sed -i "s|^## Notes$|- ⛔ reference/capture-options (live confirmation) — issue #$I14 — verify\n\n## Notes|" "$SERVER/docs/PROGRESS.md" + + +# ── I15: 60 MB/s figure [verify-then-write] ───────────────────────────────── +I15_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-server \ + --title "docs: verify the 60 MBytes/s high-performance capture throughput figure" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`reference/capture` + +The "High performance mode" section states: "In tests it has been capable of +sustaining 60 MBytes/s when panda-webcontrol is **not** installed." + +## Category: verify-then-write + +## What a human must do (~1–2 hours) + +1. Confirm the 60 MBytes/s figure is still achievable with current firmware. +2. Note the conditions under which it was measured: + - Hardware revision (pandabox / xu5 / etc.) + - FPGA image version + - Network interface (GigE / 10GigE) + - `FRAMED RAW` mode +3. If the figure has changed (higher or lower), update it with the new value + and measurement conditions. +4. If panda-webcontrol is no longer a factor, remove or update that caveat. + +Post findings as a comment or PR against `docs/reference/capture.md`. + +## Source + +`docs/reference/capture.md` — "High performance mode" section. +BODY +)") +I15=$(num "$I15_URL") +echo " server#$I15: 60 MB/s figure" + +# Add a verify comment after the 60 MBytes/s sentence +sed -i "s|been capable of sustaining 60 MBytes/s when panda-webcontrol is \*\*not\*\* installed\.|been capable of sustaining 60 MBytes/s when panda-webcontrol is **not** installed. |" \ + "$SERVER/docs/reference/capture.md" + +sed -i "s|^## Notes$|- ⛔ reference/capture (60 MB/s figure) — issue #$I15 — verify\n\n## Notes|" "$SERVER/docs/PROGRESS.md" + + +# ── I16: extension server vs implementation [verify-then-write] ───────────── +I16_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-server \ + --title "docs: verify extension.rst against the current server implementation and rewrite reference/extension" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`reference/extension` + +The page is a full stub — the source (`extension.rst`) is flagged as outdated +and needs verification against the current implementation before it can be +converted. + +## Category: verify-then-write + +## What a human must do (~3–4 hours) + +1. Read `docs/_legacy_rst/extension.rst` (739 words: Extension Modules, + Injected Values). +2. Compare against the current server source code for the extension server + (socket protocol, injected value names, lifecycle hooks). +3. Identify: + - What has changed since the doc was written. + - What is still accurate and can be kept. + - What is missing (new injected values, new API calls). +4. Write the updated `reference/extension.md` with verified content. + +Post as a PR against the `docs` branch. + +## Source + +`docs/_legacy_rst/extension.rst` — 739 words (Extension Modules, Injected +Values). +BODY +)") +I16=$(num "$I16_URL") +echo " server#$I16: extension server" + +sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-server#$I16]($I16_URL)|" \ + "$SERVER/docs/reference/extension.md" + +sed -i "s|⛔ reference/extension — issue #TBD — verify|⛔ reference/extension — issue #$I16 — verify|" "$SERVER/docs/PROGRESS.md" + + +# ── I17: *IDN? v4.x [verify-then-write] ───────────────────────────────────── +I17_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-server \ + --title "docs: verify *IDN? response format is unchanged in v4.x and update example" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`reference/commands` + +The `*IDN?` example in the "System commands" section shows a response from an +older firmware version. The backlog flags this as needing verification for v4.x. + +## Category: verify-then-write + +## What a human must do (~1 hour) + +1. Run `*IDN?` against a v4.x PandA server. +2. Confirm whether the response format has changed (fields, order, version + string format). +3. Update the code-block example with a representative v4.x response. +4. If the format is strictly unchanged, add a note stating "unchanged since + v3.x" so future maintainers know it was verified. + +Post findings as a comment or PR against `docs/reference/commands.md`. + +## Source + +`docs/reference/commands.md` — "System commands" section, `*IDN?` example. +Current example: `OK =PandA SW: 330bd94-dirty FPGA: 0.1.9 d1275f61 00000000` +BODY +)") +I17=$(num "$I17_URL") +echo " server#$I17: *IDN? v4.x" + +# Add a verify comment after the *IDN? code block +sed -i "s|> OK =PandA SW: 330bd94-dirty FPGA: 0.1.9 d1275f61 00000000|> OK =PandA SW: 330bd94-dirty FPGA: 0.1.9 d1275f61 00000000 |" \ + "$SERVER/docs/reference/commands.md" + +sed -i "s|^## Notes$|- ⛔ reference/commands (*IDN? v4.x) — issue #$I17 — verify\n\n## Notes|" "$SERVER/docs/PROGRESS.md" + + +# ── I18: CONFIG syntax [verify-then-write] ─────────────────────────────────── +I18_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-server \ + --title "docs: verify and document the CONFIG file syntax for how-to/building" \ + --label "docs-rewrite,verify-then-write" \ + --body "$(cat << 'BODY' +## Target page + +`how-to/building` + +The "Setting up the CONFIG file" section defers to `CONFIG.example` and notes +"The exact syntax accepted by the server Makefile for CONFIG values is pending +verification (tracked in the issue backlog)." + +## Category: verify-then-write + +## What a human must do (~1–2 hours) + +1. Review the server `Makefile` for all CONFIG variable names it reads and + their accepted forms (e.g. `BINUTILS_DIR`, `PYTHON`, `COTHREAD`, etc.). +2. Confirm whether the values are paths, flags, or version strings. +3. Document any non-obvious syntax or gotchas (e.g. trailing slash required, + quoted vs unquoted paths). +4. Replace the deferral note in `how-to/building.md` with the verified + information. + +Post findings as a comment or PR. + +## Source + +`docs/how-to/building.md` — "Setting up the CONFIG file" section. +`docs/_legacy_rst/building.rst` — 493 words with the CONFIG table. +BODY +)") +I18=$(num "$I18_URL") +echo " server#$I18: CONFIG syntax" + +# Update the note that says "pending verification (tracked in the issue backlog)" +sed -i "s|pending verification (tracked in the issue backlog)\.|pending verification — tracked in [PandABlocks/PandABlocks-server#$I18]($I18_URL).|" \ + "$SERVER/docs/how-to/building.md" + +sed -i "s|^## Notes$|- ⛔ how-to/building (CONFIG syntax) — issue #$I18 — verify\n\n## Notes|" "$SERVER/docs/PROGRESS.md" + + +# ── I19: C coding standard [author-from-scratch] ──────────────────────────── +I19_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-server \ + --title "docs: author the C coding standard for reference/c-standard" \ + --label "docs-rewrite,author-from-scratch" \ + --body "$(cat << 'BODY' +## Target page + +`reference/c-standard` + +No source exists — this is new content identified in Interview1 §4 as needed +for server contributors. + +## Category: author-from-scratch + +## What a human must do (~4 hours) + +Write the C coding standard for PandABlocks server contributors, covering at +minimum: + +1. **Naming conventions** — functions, variables, macros, types (typedef'd + structs, enums). +2. **File structure** — header guard style, include order, `extern "C"` guards. +3. **Error handling** — return-code conventions, `errno` usage, logging macros. +4. **Memory management** — ownership rules, allocation patterns, common pitfalls + in the server's context. +5. **Comment style** — what warrants a comment; doxygen vs plain C comments. +6. **Formatting** — indentation (tabs/spaces), brace placement, line length. +7. **Project-specific idioms** — any server-specific patterns (e.g. lock/unlock + wrappers, the config vs data thread boundary). + +Post as a PR against `docs/reference/c-standard.md` on the `docs` branch. +BODY +)") +I19=$(num "$I19_URL") +echo " server#$I19: C standard" + +sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-server#$I19]($I19_URL)|" \ + "$SERVER/docs/reference/c-standard.md" + +sed -i "s|⛔ reference/c-standard — issue #TBD — author|⛔ reference/c-standard — issue #$I19 — author|" "$SERVER/docs/PROGRESS.md" + + +# ── I20: server architecture depth [author-from-scratch] ──────────────────── +I20_URL=$(gh issue create \ + --repo PandABlocks/PandABlocks-server \ + --title "docs: author detailed server architecture internals for explanations/architecture" \ + --label "docs-rewrite,author-from-scratch" \ + --body "$(cat << 'BODY' +## Target page + +`explanations/architecture` + +A skeleton has been written covering the two TCP sockets, the config/data thread +split, and the block model at a high level. The depth items are deferred: +locking strategy, DMA pipeline, persistence state machine. + +## Category: author-from-scratch + +## What a human must do (~4–6 hours) + +Expand the skeleton in `explanations/architecture.md` to cover the internals +that matter to contributors and extension developers: + +1. **Thread model** — which threads exist, what each does, how they communicate + (queues, mutexes, condition variables). +2. **Locking strategy** — what lock(s) protect shared state; any lock ordering + rules; known contention points. +3. **DMA pipeline** — how captured data flows from FPGA registers through the + DMA ring buffer to the data socket. +4. **Persistence / state machine** — how the server saves and restores block + configuration; when config is written to hardware vs held in memory. +5. **Extension server integration** — how extension modules register and receive + injected values (link to `reference/extension`). + +A diagram (ASCII or SVG) of the thread/data-flow architecture would be very +helpful. + +Post as a PR against `docs/explanations/architecture.md` on the `docs` branch. + +## Source + +`docs/explanations/architecture.md` — existing skeleton. +Server source code (C) is the primary reference. +BODY +)") +I20=$(num "$I20_URL") +echo " server#$I20: architecture depth" + +# Update the admonition that says "tracked in the issue backlog as **blocked: author**." +sed -i "s|tracked in the issue backlog as \*\*blocked: author\*\*\.|tracked in [PandABlocks/PandABlocks-server#$I20]($I20_URL) (**blocked: author**).|" \ + "$SERVER/docs/explanations/architecture.md" + +sed -i "s|^## Notes$|- ⛔ explanations/architecture (depth) — issue #$I20 — author\n\n## Notes|" "$SERVER/docs/PROGRESS.md" + + +# ── Commit server changes ───────────────────────────────────────────────────── +echo "" +echo " Committing server Stage B edits..." +git -C "$SERVER" add docs/reference/capture-options.md \ + docs/reference/capture.md \ + docs/reference/extension.md \ + docs/reference/commands.md \ + docs/reference/c-standard.md \ + docs/how-to/building.md \ + docs/explanations/architecture.md \ + docs/PROGRESS.md +git -C "$SERVER" commit -m "$(cat << 'MSG' +docs: Stage B — link GitHub issues into stubs and verify notes +MSG +)" + + +# ───────────────────────────────────────────────────────────────────────────── +# Summary +# ───────────────────────────────────────────────────────────────────────────── +echo "" +echo "=== Stage B complete — issues created ===" +echo "" +echo "PandABlocks/meta-panda:" +echo " #$I1 tutorials 3+4 screenshots [human-capture]" +echo " #$I2 widget screenshots + sentence [human-capture]" +echo " #$I3 3.0→4.0 breaking changes [verify-then-write]" +echo " #$I4 machine-target hardware details [verify-then-write]" +echo " #$I5 KAS_IMAGE_VERSION mapping [verify-then-write]" +echo " #$I6 legacy zpg filename [verify-then-write]" +echo " #$I7 Xilinx branch post-5.0 [verify-then-write]" +echo " #$I8 hardware-target descriptions [author-from-scratch]" +echo " #$I9 versioned docs / version switcher [infrastructure]" +echo "" +echo "PandABlocks/PandABlocks-FPGA:" +echo " #$I10 testing CI update [verify-then-write]" +echo " #$I11 cocotb IP assumption [verify-then-write]" +echo " #$I12 VHDL coding standard [author-from-scratch]" +echo " #$I13 MyST block-listing + block-doc [tooling] *" +echo "" +echo "PandABlocks/PandABlocks-server:" +echo " #$I14 capture-options superset [verify-then-write]" +echo " #$I15 60 MB/s figure [verify-then-write]" +echo " #$I16 extension server vs implementation [verify-then-write]" +echo " #$I17 *IDN? v4.x [verify-then-write]" +echo " #$I18 CONFIG syntax [verify-then-write]" +echo " #$I19 C coding standard [author-from-scratch]" +echo " #$I20 server architecture depth [author-from-scratch]" +echo "" +echo "* I13 is from the FPGA PROGRESS.md stub promises, not the 03 backlog." +echo " All others are from the 03-target-doc-map.md Issue backlog section." diff --git a/knowledge/08-runbook.md b/knowledge/08-runbook.md index fd967509..6b6fadec 100644 --- a/knowledge/08-runbook.md +++ b/knowledge/08-runbook.md @@ -15,7 +15,7 @@ it's a sibling checkout (or symlink `knowledge/` into each repo if you prefer). --- ## One-time setup (you) -1. Create the `docs` branch in `meta-panda`, `PandABlocks-FPGA`, `PandABlocks-server`. **Create the new `PandABlocks-devcontainer` repo** and a `docs` branch there too. +1. Create the `docs` branch in `meta-panda`, `PandABlocks-FPGA`, `PandABlocks-server`. *(Superseded 2026-06: no separate PandABlocks-devcontainer repo — each repo carries its own `.devcontainer/` + Dockerfile.)* 2. Put all knowledge files in `meta-panda/knowledge/`; extract `docs.zip` to `meta-panda/knowledge/docs-skeleton/`. 3. Have a GitHub PAT ready (scopes: repo, issues) for Stage B; authenticate `gh` in that terminal. 4. Two decisions are yours (not blockers): confirm whether all **8** attribute-state icons need distinct glyphs or some collapse; and (optional) whether you have a preference on the FPGA module-docs surfacing or the xref keys, else let CC prototype and report. @@ -91,6 +91,6 @@ SPECIFICS: {SPECIFICS} ## PROMPT F — Final cross-repo verification · model: Opus · run from any repo ``` -Final cross-repo verification of the docs `docs` branches. Confirm: every repo's `myst build` is green; xref links resolve across meta-panda / PandABlocks-FPGA / PandABlocks-server / PandABlocks-devcontainer in BUILT output; intersphinx links into PandABlocks-client and fastcs-PandABlocks resolve; GitHub Pages deploys green per repo; PandABlocks-rootfs Pages is disabled; PandABlocks.github.io serves the single catch-all redirect to meta-panda. +Final cross-repo verification of the docs `docs` branches. Confirm: every repo's `myst build` is green; xref links resolve across meta-panda / PandABlocks-FPGA / PandABlocks-server in BUILT output; intersphinx links into PandABlocks-client and fastcs-PandABlocks resolve; GitHub Pages deploys green per repo; PandABlocks-rootfs Pages is disabled; PandABlocks.github.io serves the single catch-all redirect to meta-panda. Fix what you can; file issues for the rest. Capture the working xref/intersphinx config as a diff suitable for upstreaming into the python-copier-template. Summarise final status against /workspaces/meta-panda/knowledge/03-target-doc-map.md. ``` diff --git a/knowledge/09-fresh-eyes-review.md b/knowledge/09-fresh-eyes-review.md new file mode 100644 index 00000000..09e8451c --- /dev/null +++ b/knowledge/09-fresh-eyes-review.md @@ -0,0 +1,201 @@ +# Fresh-eyes review of the docs branches (pre-push) + +Read as: (1) a brand-new PandABox owner starting from the meta-panda index, assuming all +Stage-B issues eventually get done by a human; (2) a user doing typical tasks — updating +firmware, deploying a custom bitstream, writing a new FPGA block and adding it to an image. +Every claim was checked against the repo sources (Makefiles, `conf/machine/`, `server.c`, +legacy RST), not just read for style. + +**Status update (2026-06-12):** everything fixable without user input has now been +**applied** to the working trees of all three repos. All three docs sites rebuild cleanly +(`myst build`: no errors, no new warnings) and `create-issues.sh` passes `bash -n` with all +of its sed/perl targets re-verified against the edited pages. What remains is listed in +[What's left](#whats-left) below. + +## Overall verdict (unchanged) + +The structure is right. Diátaxis split is clean, the meta-panda-as-root model works, the +tutorial sequence 0→1→2 is genuinely good, and the server reference quadrant is strong. +The big problems were concentrated in one factually wrong page (FPGA `build-fpga-image`), +one internally inconsistent page (server `streaming-tables` vs `fields`), and a handful of +accuracy errors — all now fixed. + +--- + +## A. Factual errors — ALL FIXED ✅ + +### A1. FPGA `how-to/build-fpga-image.md` described a nonexistent kas/bitbake flow ✅ FIXED +**Rewritten from scratch** around the real flow verified against the Makefile: +`cp CONFIG.example CONFIG` → set `APP_NAME` (from `apps/*.app.ini`) and `VIVADO`/ +`VIVADO_VER` (default 2023.2) → `make` (≡ `make ipk`; `make all-ipks` for every app) → +`build/panda-fpga-__all.ipk` → `scp` + `opkg install` (or Web Admin). +Links to the dev-container setup and meta-panda deploy pages. *(Q2 confirmed by user: +make-only, no kas path — clarifying sentence added to the page.)* + +### A2. FPGA `how-to/app.md` — wrong output format / variable ✅ FIXED +zpkg → `.ipk` (`panda-fpga-__all.ipk`), `APPS = PandABox-no-fmc` → +`APP_NAME = pandabox-no-fmc`, added `make all-ipks` and a link to `build-fpga-image`. +*(The `*METADATA.APPNAME?` example was later user-confirmed as kebab-case following the +`.ipk` name and corrected to `pandabox-fmc-24vio` — see What's left #6.)* + +### A3. meta-panda `reference/machine-targets.md` machine list ✅ FIXED +Table now matches `conf/machine/`: dropped nonexistent `xu5-s1`, added `pandabox2`. +`pandabrick` row de-flagged (it exists in-tree: `conf/machine/pandabrick.conf`); a verify +comment now sits on `xu5-st1` (support tier unknown). **`create-issues.sh` updated to +match**: I4 repurposed from "verify PandABrick" to "verify support tiers + details" +(its sed retargeted to the new comment), I8's machine list corrected. + +### A4. server `streaming-tables.md` vs `fields.md` ✅ FIXED +- MODE transition table corrected to match `fields.md` and legacy `fields.rst`: + `STREAMING` + `<` = Reject, `STREAMING_LAST` rejects all but `<0`, completed/`[HEALTH]` + row added; prose about the implicit FPGA completed state restored. +- `B` description fixed (just base-64 content); the `left:right` format moved to a new, + correct `FIELDS` entry. +- `LENGTH`/`MAX_LENGTH` now both say 32-bit **words** in both pages (fields.md summary + table rows fixed too). + +### A5. server `how-to/startup.md` ✅ FIXED +Second `-p` → `-P` *pid-file*; added `-r` *rootfs-version* (reported via `*IDN?`). +Verified against `server.c` getopt string and usage text. + +### A6. Capture-option drift across three pages ✅ FIXED (verified against `pos_out.c`) +Ground truth from `server/pos_out.c` (`capture_option_info` + `nominal_capture_masks`): +individual options Value/Diff/Sum/Mean/Min/Max/StdDev (StdDev only listed when the FPGA +supports it); curated enums add No, Min Max, Min Max Mean, **Mean StdDev**. +`capture-options.md` is now the true superset (combinations + full enum list, caution +downgraded to a note); `capture.md` and `fields.md` gained the StdDev / Mean StdDev rows +so all three pages agree. **Bonus fix found en route:** `commands.md` omitted the +`METADATA` change group (`*CHANGES.METADATA` exists in `system_command.c`) — added to all +four places. **I14 in `create-issues.sh` slimmed** to a ~30-min live-server confirmation +(its sed replaced with a working perl substitution, dry-run tested). + +### A7. meta-panda `integrate-with-a-panda.md` wrong link ✅ FIXED +Now points at the server commands reference (absolute Pages URL, Stage F swap comment). + +### A8. `Image` vs `image.ub` ✅ FIXED (Q6 answered by source) +`build.sh:22` and `_make_boot.yml` copy the fitImage to **`image.ub`**; the boot archive +contains `boot.bin, boot.scr, image.ub, rootfs.squashfs, target-defs`. `upgrade-via-ssh.md` +corrected; all three pages now agree. + +### A9. `modules/lut/lut_doc.md` truncated sentence ✅ FIXED +Restored the dropped cross-ref as a link to the server fields reference. + +### A10. fields.md loose ends ✅ FIXED (Q7 answered by source) +- `*CHANGES.PARAM` → `*CHANGES.CONFIG` in both places. Verified: change groups in + `config_server.h`/`system_command.c` are CONFIG/BITS/POSN/READ/ATTR/TABLE/METADATA + (no PARAM); `param`/`time` classes use `CHANGE_IX_CONFIG` (`register.c:288`, + `time.c:374`). +- enum `LABELS` attribute removed from the sub-type summary (no such attribute in the + server source; labels come via `*ENUMS`). + +## B. Web-control content provenance — ✅ RESOLVED (user confirmed against live UI) + +User answers (2026-06-11): port colours are only **Boolean = Blue** and **Int32 = +Orange** (Motor/NDArray rows deleted); Exports/camelCase is correct; the method +execution log is correct but there is only a **single method: *Save*** on the Parent +Block (taking the design name as its input parameter); Auto Layout is accurate; the +save dialog field is labelled **Design Name** — "Filename" appears nowhere in the GUI. +All applied to `use-web-control-to-set-up-a-panda.md` and `save-restore-design.md`. +**I2 restored to screenshot-only scope** (verification checklist removed). + +## C. Cross-link & asset integrity + +### C1. Figures served from `docs/_legacy_rst/` ✅ FIXED +- meta-panda: all 19 referenced images copied to `docs/images/webcontrol/` and every + reference repointed (tutorial0, use-web-control, web-control-ui-overview, + monitor-attribute-values, understanding-attribute-state). Zero `_legacy_rst` image + refs remain. +- FPGA: `build_arch.png` copied to `docs/images/` and `block.md` repointed. +- `_legacy_rst/` deletion is now safe (images-wise) in both repos. + +### C2. Dead `meta-panda:` xrefs ✅ FIXED (Q8 decided: absolute URLs) +The only offenders were in `build-fpga-image.md`, which was rewritten using absolute +Pages URLs with `` comments (the same pattern server +`capture.md` already used). Repo-wide grep confirms no `(meta-panda:` links remain. + +### C3. "Prompt C" runbook jargon in published page ✅ FIXED +`understanding-attribute-state.md` placeholders reworded to *(icon pending)*; the HTML +comments retain the `docs/images/attribute-state/.svg` target paths so Prompt C can +still find them. + +### C4. PandABlocks-devcontainer ✅ RESOLVED — decision changed to per-repo devcontainers +User decision (2026-06-11): **no separate PandABlocks-devcontainer repo.** Each repo +carries its own `.devcontainer/devcontainer.json` + Dockerfile, modelled on +python-copier-template (`ubuntu-devcontainer:noble` base, `developer` target), with +repo-specific tools to be added. meta-panda alone uses the kas base +(`ghcr.io/siemens/kas/kas:4.8`, matching `KAS_IMAGE_VERSION` in build.sh; placed at +`.devcontainer/Dockerfile` because the root `Dockerfile` is the existing rockylinux +FPGA-tools/CI container and must not be touched). Created in all three repos; all +doc pointers updated (FPGA `local-development.md`, server `building.md` tip, +meta-panda `contribute.md` xref table); commented `PandABlocks-devcontainer:` +reference keys removed from all three `myst.yml` files; runbook Stage F prompt and +one-time-setup step annotated as superseded. + +## D. Structure & gaps + +### D1. Root index Yocto-first framing ✅ FIXED +`README.md` (included by the index) now opens with three sentences of PandABlocks-level +framing — what a PandA is, what these docs cover, where component docs live — before the +`meta-panda`-layer paragraph. + +### D2. Unboxing signpost ✅ FIXED +`tutorials.md` landing and tutorial 0 prerequisites now point users whose PandA isn't on +the network yet at `how-to/quickstart`. + +### D3. meta-panda how-to TOC ordering ✅ FIXED +`docs/myst.yml` TOC rebanded: use (quickstart, use-web-control, save-restore, monitor, +integrate) → administer (upgrade ×2, packages, choose-fpga-bitstream) → develop (build, +manual-build, test-firmware-changes, make-release, contribute), with YAML comments +marking the bands. + +### D4. FPGA block→deploy journey ✅ FIXED +`block.md` gained a "Next steps" section chaining block → app → build-fpga-image → +choose-fpga-bitstream; `how-to.md` landing gained a one-line pipeline overview. + +### D5. `CLOCKS` vs `CLOCK1` ✅ FIXED (Q5 answered by source) +The shipped `template_tutorial1_leds.json` design uses `CLOCK1`/`CLOCK2`, and the firmware +module is `modules/clock` (no CLOCKS block). Tutorial 1 corrected to **CLOCK1** in both +places. + +### D6. Minor batch — MOSTLY FIXED +- ✅ meta-panda glossary `App` entry now leads with `.ipk`, demotes zpkg to legacy; FPGA + glossary `App` entry now says `.ipk`, and its `Zpkg` entry gained the legacy/replaced + note. +- ⏳ `web-control-ui-overview.md` **Auto Layout** — folded into the extended I2 (see §B). +- ⏳ FPGA `framework.md` "needs a refresh" note still has no tracking issue (issues don't + exist yet — could be linked after the script runs, or left for Stage F). +- ⏳ `finedelay-test.md` raw `PandABlocks.github.io` script URL — Stage F note unchanged. + +## E. Issue-script changes made ✅ + +All applied to `create-issues.sh` (syntax-checked, every sed/perl target re-verified): +1. **I2** — title + body extended with the §B live-UI verification checklist. +2. **I4** — repurposed: machine list is now ground-truthed; remaining work is support + tiers (xu5-st1/zedboard) and Notes-column details (pandabox2/pandabrick); sed + retargeted to the new HTML comment in machine-targets.md. +3. **I8** — machine list corrected to `conf/machine/` ground truth. +4. **I14** — slimmed to a live-server confirmation of the now source-verified capture + options; broken sed replaced with a tested perl substitution. + +--- + +(whats-left)= +## What's left + +| # | Item | Why it needs you | +|---|---|---| +| 1 | ~~§B web-control content~~ | ✅ Resolved — user confirmed against live UI, all trims applied (see §B). | +| 2 | ~~C4 devcontainer pointers~~ | ✅ Resolved — per-repo devcontainers created in all three repos (see C4). | +| 3 | ~~README machine list~~ | ✅ Resolved — user confirmed (2026-06-12) xu5-st1 and zedboard are dev-only. README stays at three; `machine-targets.md` notes the tier split; I4 slimmed to pandabox2/pandabrick hardware details only (sed retargeted, verified). | +| 4 | **framework.md refresh note** | Untracked "needs a refresh" flag — link to an issue after the script runs, or fold into Stage F. | +| 5 | **finedelay script URL** | Stage F item: if PandABlocks.github.io becomes a redirect, the raw script needs a new home. | +| 6 | ~~app.md `*METADATA.APPNAME?` example~~ | ✅ Resolved — user confirmed (2026-06-12): kebab-case, following the `.ipk` name (e.g. `panda-fpga-pandabox-fmc-acq430_4.2b1.ipk` → `pandabox-fmc-acq430`). Example corrected to `pandabox-fmc-24vio`; stale verify note removed. | + +## Remaining questions + +*All answered.* Q1 web control and Q4 devcontainer — user, see §B and C4. **Q2 (FPGA +build)** — user confirmed (2026-06-12): FPGA is strictly make-driven, producing the +`.ipk` with a custom script; no kas involved; meta-panda only *includes* that `.ipk` +in the system image. A clarifying sentence was added to `build-fpga-image.md`. Former +Q3 machine list, Q5 CLOCKS, Q6 image.ub, Q7 \*CHANGES group and Q8 interim links were +all resolved against repo sources — see A3, D5, A8, A10, C2 above. From 11c64ea2ca2a1176e180ca01524585a35877b49a Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Fri, 12 Jun 2026 09:08:40 +0000 Subject: [PATCH 21/49] ci: publish docs to gh-pages from the docs branch too Trigger Docs CI on pushes to docs as well as main/tags, and allow the gh-pages publish step on the docs branch so the rewritten docs deploy before merging to main. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/docs.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index bf8585df..674a9381 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - docs tags: - '*' pull_request: @@ -71,7 +72,7 @@ jobs: run: python3 .github/pages/make_switcher.py --add $DOCS_VERSION ${{ github.repository }} .github/pages/switcher.json - name: Publish Docs to gh-pages - if: github.ref_type == 'tag' || github.ref_name == 'main' + if: github.ref_type == 'tag' || github.ref_name == 'main' || github.ref_name == 'docs' # We pin to the SHA, not the tag, for security reasons. # https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0 From 2c7944cd184aa341540bee8c31c43c3e304d6a4d Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Fri, 12 Jun 2026 12:11:27 +0000 Subject: [PATCH 22/49] =?UTF-8?q?docs:=20Stage=20B=20=E2=80=94=20link=20Gi?= =?UTF-8?q?tHub=20issues=20into=20stubs=20and=20verify=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issues created for all human-capture, verify-then-write, author-from-scratch, and infrastructure backlog items (see PROGRESS.md Blocked section). --- docs/PROGRESS.md | 20 ++++++++++++++----- docs/explanations/hardware-targets.md | 2 +- docs/how-to/build.md | 2 +- docs/how-to/manual-build.md | 2 +- docs/how-to/upgrade-via-web-admin.md | 2 +- .../use-web-control-to-set-up-a-panda.md | 3 +-- docs/reference/changes.md | 2 +- docs/reference/machine-targets.md | 2 +- docs/tutorials/tutorial3_position_compare.md | 2 +- docs/tutorials/tutorial4_snake_scan.md | 2 +- 10 files changed, 24 insertions(+), 15 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 386aaa45..79d15a7a 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -53,11 +53,21 @@ Page list expanded from `06-source-provenance-map.md`. ## Blocked (issues raised) Issues not yet created — Stage B (Prompt B) will create and link them. Blocked pages: -- ⛔ tutorials/tutorial3_position_compare — issue #TBD — human-capture -- ⛔ tutorials/tutorial4_snake_scan — issue #TBD — human-capture -- ⛔ reference/changes — issue #TBD — verify (3.0->4.0) -- ⛔ explanations/hardware-targets — issue #TBD — author -- ⛔ how-to/use-web-control-to-set-up-a-panda (4 widget screenshots + trailing sentence) — issue #TBD — capture +- ⛔ tutorials/tutorial3_position_compare — issue #12 — human-capture +- ⛔ tutorials/tutorial4_snake_scan — issue #12 — human-capture +- ⛔ reference/changes — issue #14 — verify (3.0->4.0) +- ⛔ explanations/hardware-targets — issue #19 — author +- ⛔ how-to/use-web-control-to-set-up-a-panda (widget screenshots + trailing sentence) — issue #13 — human-capture + +- ⛔ reference/machine-targets (hardware details) — issue #15 — verify + +- ⛔ how-to/build (KAS_IMAGE_VERSION) — issue #16 — verify + +- ⛔ how-to/upgrade-via-web-admin (zpg filename) — issue #17 — verify + +- ⛔ how-to/manual-build (Xilinx branch post-5.0) — issue #18 — verify + +- ⛔ infrastructure: versioned docs / version switcher (R5) — issue #20 — infrastructure ## Notes - **Legacy sources preserved.** The original Sphinx/RST tree was moved to `docs/_legacy_rst/` diff --git a/docs/explanations/hardware-targets.md b/docs/explanations/hardware-targets.md index 5c71f1f9..7c83448e 100644 --- a/docs/explanations/hardware-targets.md +++ b/docs/explanations/hardware-targets.md @@ -9,5 +9,5 @@ This page is a Stage A scaffold stub and has not yet been written. **Source:** NEW (Interview6 §A) — per-target hardware (SoC/module, features) -**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here. +**Blocked:** [PandABlocks/meta-panda#19](https://github.com/PandABlocks/meta-panda/issues/19) ::: diff --git a/docs/how-to/build.md b/docs/how-to/build.md index 27a58ec5..dac6042d 100644 --- a/docs/how-to/build.md +++ b/docs/how-to/build.md @@ -33,7 +33,7 @@ :::{note} `KAS_IMAGE_VERSION` pins the version of the build container. Check the `meta-panda` release notes or the `kas.yml` file for the value appropriate - to the version you are building. + to the version you are building. ::: To target a different machine set `KAS_MACHINE`, e.g.: diff --git a/docs/how-to/manual-build.md b/docs/how-to/manual-build.md index e14829c8..2db258d5 100644 --- a/docs/how-to/manual-build.md +++ b/docs/how-to/manual-build.md @@ -20,7 +20,7 @@ the Yocto host dependencies are not available on your system. :::{note} `rel-v2023.2` is the manifest branch used for current PandA 5.x builds. - + ::: 2. Load the Yocto build environment, passing the build directory as argument: diff --git a/docs/how-to/upgrade-via-web-admin.md b/docs/how-to/upgrade-via-web-admin.md index 8503a1b5..70d69b99 100644 --- a/docs/how-to/upgrade-via-web-admin.md +++ b/docs/how-to/upgrade-via-web-admin.md @@ -37,7 +37,7 @@ Pre-5.0 PandAs use a legacy zpkg-based firmware format. To upgrade to a 1. Download the legacy-updater package for your machine type from [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases). - + 2. Copy the updater package to a USB stick. 3. Insert the USB stick and follow the post-5.0 web-admin flow above, selecting the legacy-updater file instead. diff --git a/docs/how-to/use-web-control-to-set-up-a-panda.md b/docs/how-to/use-web-control-to-set-up-a-panda.md index ddcb756e..2b502945 100644 --- a/docs/how-to/use-web-control-to-set-up-a-panda.md +++ b/docs/how-to/use-web-control-to-set-up-a-panda.md @@ -129,8 +129,7 @@ input widgets — View/Edit button, Dropdown list, Text input, and Checkbox. The four attribute input widgets (**View/Edit button**, **Dropdown list**, **Text input** and **Checkbox**) need fresh screenshots before this subsection can be written, and the source text for *Text input* is truncated mid-sentence -in the original. A GitHub issue covering the widget screenshots and the -trailing sentence will be created in Stage B (Prompt B) and linked here. +in the original. Tracked in [PandABlocks/meta-panda#13](https://github.com/PandABlocks/meta-panda/issues/13). In brief, until then: diff --git a/docs/reference/changes.md b/docs/reference/changes.md index 73d05426..13aeb916 100644 --- a/docs/reference/changes.md +++ b/docs/reference/changes.md @@ -9,5 +9,5 @@ This page is a Stage A scaffold stub and has not yet been written. **Source:** github.io reference/migration_guide.rst (119w, only 2.0->3.0) + release_compatibility.rst (32w) — consolidate per-major; 3.0->4.0 absent -**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here. +**Blocked:** [PandABlocks/meta-panda#14](https://github.com/PandABlocks/meta-panda/issues/14) ::: diff --git a/docs/reference/machine-targets.md b/docs/reference/machine-targets.md index 9b98a031..66841070 100644 --- a/docs/reference/machine-targets.md +++ b/docs/reference/machine-targets.md @@ -8,7 +8,7 @@ manual builds) or via `KAS_MACHINE` (for kas builds). |---|---|---| | `pandabox` | PandABox (default) | Zynq 7030; joint DLS/SOLEIL hardware; [Open Hardware](https://www.ohwr.org/projects/pandabox/wiki) | | `pandabox2` | PandABox 2 | Successor to PandABox | -| `pandabrick` | PandABrick | | +| `pandabrick` | PandABrick | | | `xu5-st1` | ZynqMP-based target (XU5 SoM) | Development only | | `zedboard` | Zedboard | Development/testing platform | diff --git a/docs/tutorials/tutorial3_position_compare.md b/docs/tutorials/tutorial3_position_compare.md index 8f3f78e9..89573446 100644 --- a/docs/tutorials/tutorial3_position_compare.md +++ b/docs/tutorials/tutorial3_position_compare.md @@ -9,5 +9,5 @@ This page is a Stage A scaffold stub and has not yet been written. **Source:** tutorials/tutorial3_position_compare.rst (41w stub) — author from human screenshots+bullets -**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here. +**Blocked:** [PandABlocks/meta-panda#12](https://github.com/PandABlocks/meta-panda/issues/12) ::: diff --git a/docs/tutorials/tutorial4_snake_scan.md b/docs/tutorials/tutorial4_snake_scan.md index fa10c59d..47aea1e6 100644 --- a/docs/tutorials/tutorial4_snake_scan.md +++ b/docs/tutorials/tutorial4_snake_scan.md @@ -9,5 +9,5 @@ This page is a Stage A scaffold stub and has not yet been written. **Source:** tutorials/tutorial4_snake_scan.rst (52w stub) — author from human screenshots+bullets -**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here. +**Blocked:** [PandABlocks/meta-panda#12](https://github.com/PandABlocks/meta-panda/issues/12) ::: From e15e8914e655a3d0b0fa2f9f75bf765e0fab9f26 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Fri, 12 Jun 2026 12:15:08 +0000 Subject: [PATCH 23/49] Created issues --- create-issues.sh | 1070 ---------------------------------------------- 1 file changed, 1070 deletions(-) delete mode 100755 create-issues.sh diff --git a/create-issues.sh b/create-issues.sh deleted file mode 100755 index 50aeec9c..00000000 --- a/create-issues.sh +++ /dev/null @@ -1,1070 +0,0 @@ -#!/usr/bin/env bash -# Prompt B — GitHub issue creation for the docs-rewrite backlog. -# Source: meta-panda/knowledge/03-target-doc-map.md §"Issue backlog" -# -# Prerequisites: -# • gh authenticated with a PAT (scopes: repo, issues) -# • All three repos on their `docs` branch at the paths below -# (Prompt A must have been run first) -# -# Run from any directory. Designed to be run once; re-running is safe -# if it failed partway — gh refuses duplicate titles and the sed -# replacements are idempotent (they only match the Stage-B placeholder text). - -set -euo pipefail - -META=/workspaces/meta-panda -FPGA=/workspaces/PandABlocks-FPGA -SERVER=/workspaces/PandABlocks-server - -# Extract the issue number from a gh issue URL -# e.g. "https://github.com/PandABlocks/meta-panda/issues/42" → "42" -num() { echo "$1" | grep -oE '[0-9]+$'; } - -# ─── 0. Ensure labels exist in all three repos ─────────────────────────────── -echo "=== 0. Creating labels ===" -for REPO in PandABlocks/meta-panda PandABlocks/PandABlocks-FPGA PandABlocks/PandABlocks-server; do - gh label create "docs-rewrite" --repo "$REPO" --color "0075ca" --description "Docs rewrite backlog" --force - gh label create "human-capture" --repo "$REPO" --color "fbca04" --description "Needs human-captured screenshots or bullets" --force - gh label create "verify-then-write" --repo "$REPO" --color "d93f0b" --description "Needs maintainer verification before writing" --force - gh label create "author-from-scratch" --repo "$REPO" --color "0e8a16" --description "New content to author from scratch" --force - gh label create "infrastructure" --repo "$REPO" --color "5319e7" --description "Docs build/deploy infrastructure" --force - gh label create "tooling" --repo "$REPO" --color "e99695" --description "Docs tooling / autogeneration" --force -done - -# ───────────────────────────────────────────────────────────────────────────── -# PandABlocks/meta-panda (9 issues) -# ───────────────────────────────────────────────────────────────────────────── -echo "" -echo "=== 1. meta-panda issues ===" - -# ── I1: tutorials 3 + 4 [human-capture] ───────────────────────────────────── -I1_URL=$(gh issue create \ - --repo PandABlocks/meta-panda \ - --title "docs: provide screenshots and content for tutorial 3 (position compare) and tutorial 4 (snake scan)" \ - --label "docs-rewrite,human-capture" \ - --body "$(cat << 'BODY' -## Target pages - -- `tutorials/tutorial3_position_compare` -- `tutorials/tutorial4_snake_scan` - -Both stubs contain fewer than 60 words each and are currently near-empty -placeholders. They need the same depth as tutorials 1 and 2 (~600–1200 words -plus annotated screenshots). - -## Category: human-capture - -These pages can only be completed once a person with hands-on PandA access -supplies annotated screenshots and step-by-step bullets. A doc engineer will -then expand them into finished MyST pages. - -## What a human must do (~4–6 hours total) - -### Tutorial 3 — Position compare (`tutorial3_position_compare`) - -On a PandA connected to Web Control: - -1. Configure a PCOMP block so that a position input is compared against a - threshold and generates trigger pulses on the output. -2. Take labelled screenshots at each step (block palette, attribute panel, link - arrows, waveform output if available). -3. Write numbered steps (goal → prerequisites → procedure → expected output) in - the same voice as tutorials 1 and 2. -4. Record exact block names, field names, and representative parameter values. - -### Tutorial 4 — Snake scan (`tutorial4_snake_scan`) - -1. Build a 2D snake scan using a SEQ block and its table editor. -2. Take labelled screenshots of the SEQ table configuration and the resulting - trigger output. -3. Write numbered steps at the same depth as tutorial 2. - -Deposit screenshots under `docs/images/` in the `docs` branch and post the -bullets as a comment on this issue (or open a PR). - -## Source stubs - -- `docs/_legacy_rst/tutorials/tutorial3_position_compare.rst` — 41 words (stub) -- `docs/_legacy_rst/tutorials/tutorial4_snake_scan.rst` — 52 words (stub) -BODY -)") -I1=$(num "$I1_URL") -echo " meta-panda#$I1: tutorials 3+4" - -# Update tutorial3 stub -sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/meta-panda#$I1]($I1_URL)|" \ - "$META/docs/tutorials/tutorial3_position_compare.md" - -# Update tutorial4 stub -sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/meta-panda#$I1]($I1_URL)|" \ - "$META/docs/tutorials/tutorial4_snake_scan.md" - -# Update PROGRESS.md (two TBD lines → same issue) -sed -i "s|⛔ tutorials/tutorial3_position_compare — issue #TBD — human-capture|⛔ tutorials/tutorial3_position_compare — issue #$I1 — human-capture|" "$META/docs/PROGRESS.md" -sed -i "s|⛔ tutorials/tutorial4_snake_scan — issue #TBD — human-capture|⛔ tutorials/tutorial4_snake_scan — issue #$I1 — human-capture|" "$META/docs/PROGRESS.md" - - -# ── I2: web-control attribute-widget screenshots + trailing sentence [human-capture] -I2_URL=$(gh issue create \ - --repo PandABlocks/meta-panda \ - --title "docs: add screenshots and trailing sentence for the four attribute input widgets in how-to/use-web-control" \ - --label "docs-rewrite,human-capture" \ - --body "$(cat << 'BODY' -## Target page - -`how-to/use-web-control-to-set-up-a-panda` - -The "Specifying Block Attributes" section has been converted but the subsection -covering the four attribute input widgets is blocked pending fresh screenshots -and one missing sentence from the source. - -## Category: human-capture - -## What a human must do (~2 hours) - -1. In PandA Web Control, find or create attributes that exercise each of the - four input widget types: - - **View/Edit button** — a complex / table attribute - - **Dropdown list** — an enum attribute - - **Text input** — a free-text string or numeric attribute - - **Checkbox** — a boolean on/off attribute -2. Take one labelled screenshot per widget type clearly showing the widget in - context inside the Block Information Panel. -3. Provide the concluding sentence for the *Text input* widget description — - the source text (`working_with_a_design.rst`) is truncated mid-sentence at - that point. - -Deposit screenshots under `docs/images/` in the `docs` branch and post the -sentence and image filenames as a comment on this issue. - -## Source - -`docs/_legacy_rst/webcontrol/userguide/working_with_a_design.rst` — the four -widget subsections under "Specifying Block Attributes → Types". -BODY -)") -I2=$(num "$I2_URL") -echo " meta-panda#$I2: widget screenshots" - -# Update inline stub in the converted page (multi-line text — use perl) -perl -i -0pe \ - "s|A GitHub issue covering the widget screenshots and the\ntrailing sentence will be created in Stage B \(Prompt B\) and linked here\.|Tracked in [PandABlocks/meta-panda#$I2]($I2_URL).|" \ - "$META/docs/how-to/use-web-control-to-set-up-a-panda.md" - -# Update PROGRESS.md -sed -i "s|⛔ how-to/use-web-control-to-set-up-a-panda (4 widget screenshots + trailing sentence) — issue #TBD — capture|⛔ how-to/use-web-control-to-set-up-a-panda (widget screenshots + trailing sentence) — issue #$I2 — human-capture|" "$META/docs/PROGRESS.md" - - -# ── I3: 3.0→4.0 breaking changes [verify-then-write] ──────────────────────── -I3_URL=$(gh issue create \ - --repo PandABlocks/meta-panda \ - --title "docs: document 3.0→4.0 breaking changes and migration guide" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`reference/changes` - -## Category: verify-then-write - -The existing source (`github.io reference/migration_guide.rst`) only covers -2.0→3.0. The 3.0→4.0 section is completely absent. - -## What a human must do (~3 hours) - -1. Review the PandABlocks 4.0 release notes, CHANGELOG, and git log for - breaking changes since 3.0. -2. Check the existing `migration_guide.rst` (2.0→3.0) for style reference. -3. Write a 3.0→4.0 section for `reference/changes` covering: - - Config file changes (`boot.txt` → `config.txt`, etc.) - - Wire-protocol breaking changes (if any) - - Removed / renamed blocks or fields - - Build toolchain changes -4. Also add a compatibility matrix row for the 3.0→4.0 transition alongside - the existing `release_compatibility.rst` content. - -Post the draft as a comment or PR against the `docs` branch. - -## Source - -- `docs/_legacy_rst/` (`github.io` copies) — `reference/migration_guide.rst` - (119 words, 2.0→3.0 only) -- `reference/release_compatibility.rst` (32 words) -BODY -)") -I3=$(num "$I3_URL") -echo " meta-panda#$I3: 3.0→4.0 changes" - -sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/meta-panda#$I3]($I3_URL)|" \ - "$META/docs/reference/changes.md" - -sed -i "s|⛔ reference/changes — issue #TBD — verify (3.0->4.0)|⛔ reference/changes — issue #$I3 — verify (3.0->4.0)|" "$META/docs/PROGRESS.md" - - -# ── I4: machine-target support tiers [verify-then-write] ──────────────────── -I4_URL=$(gh issue create \ - --repo PandABlocks/meta-panda \ - --title "docs: fill in hardware details for pandabox2 and pandabrick in reference/machine-targets" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`reference/machine-targets` - -The MACHINE table matches `conf/machine/`, and support tiers are settled -(pandabox/pandabox2/pandabrick generally supported; xu5-st1/zedboard -development-only). Only the details columns remain (see the verify note on -the `pandabrick` row). - -## Category: verify-then-write - -## What a human must do (~30 min) - -Fill in the "Hardware"/"Notes" column entries for `pandabox2` and -`pandabrick` (SoC/module name, link to any hardware description). - -Post findings as a comment or PR. - -## Source - -`docs/reference/machine-targets.md` table; ground truth `conf/machine/*.conf`. -BODY -)") -I4=$(num "$I4_URL") -echo " meta-panda#$I4: machine-target hardware details" - -# Update inline HTML comment in the table cell -sed -i "s|||" \ - "$META/docs/reference/machine-targets.md" - -# Append to Blocked section (not yet listed) -sed -i "s|^## Notes$|- ⛔ reference/machine-targets (hardware details) — issue #$I4 — verify\n\n## Notes|" "$META/docs/PROGRESS.md" - - -# ── I5: KAS_IMAGE_VERSION mapping [verify-then-write] ─────────────────────── -I5_URL=$(gh issue create \ - --repo PandABlocks/meta-panda \ - --title "docs: verify and document the KAS_IMAGE_VERSION values for how-to/build" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`how-to/build` - -The page instructs users to set `KAS_IMAGE_VERSION` but defers to the release -notes for the correct value, with a verify note in the source. - -## Category: verify-then-write - -## What a human must do (~1 hour) - -1. Confirm the current valid `KAS_IMAGE_VERSION` value(s) for PandABlocks 5.x. -2. Document what the variable selects (which build container image / tag). -3. If the value is fixed per major release, add a table mapping release → - `KAS_IMAGE_VERSION`. -4. If it tracks `kas.yml` automatically, update the note to say so clearly. - -Post findings as a comment or PR against `how-to/build.md`. - -## Source - -`docs/how-to/build.md` — the `:::{note}` block under "Build steps → step 3". -BODY -)") -I5=$(num "$I5_URL") -echo " meta-panda#$I5: KAS_IMAGE_VERSION" - -sed -i "s|||" \ - "$META/docs/how-to/build.md" - -sed -i "s|^## Notes$|- ⛔ how-to/build (KAS_IMAGE_VERSION) — issue #$I5 — verify\n\n## Notes|" "$META/docs/PROGRESS.md" - - -# ── I6: legacy zpg filename [verify-then-write] ───────────────────────────── -I6_URL=$(gh issue create \ - --repo PandABlocks/meta-panda \ - --title "docs: confirm legacy-updater zpg filename convention for pre-5.0 upgrade path" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`how-to/upgrade-via-web-admin` - -The pre-5.0 upgrade path instructs users to download the legacy-updater package -from GitHub Releases, but does not state the exact filename/pattern. - -## Category: verify-then-write - -## What a human must do (~1 hour) - -1. Check the GitHub Releases page for meta-panda for the legacy zpg/zpkg - updater packages. -2. Document the exact filename pattern (e.g. `panda-upgrade-.zpg`) - and any machine-type suffix. -3. Confirm whether the file extension is `.zpg`, `.zpkg`, or something else. -4. Update `how-to/upgrade-via-web-admin.md` with a concrete filename example. - -Post findings as a comment or PR. - -## Source - -`docs/how-to/upgrade-via-web-admin.md` — the "Pre-5.0 PandAs" subsection, -step 1. -BODY -)") -I6=$(num "$I6_URL") -echo " meta-panda#$I6: zpg filename" - -sed -i "s|||" \ - "$META/docs/how-to/upgrade-via-web-admin.md" - -sed -i "s|^## Notes$|- ⛔ how-to/upgrade-via-web-admin (zpg filename) — issue #$I6 — verify\n\n## Notes|" "$META/docs/PROGRESS.md" - - -# ── I7: Xilinx branch bump post-5.0 [verify-then-write] ───────────────────── -I7_URL=$(gh issue create \ - --repo PandABlocks/meta-panda \ - --title "docs: confirm the Xilinx yocto-manifests branch for post-5.0 manual builds" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`how-to/manual-build` - -The page currently references branch `rel-v2023.2` of -`github.com/Xilinx/yocto-manifests`. A verify note flags that this may need -updating for post-5.0 releases. - -## Category: verify-then-write - -## What a human must do (~1 hour) - -1. Confirm whether `rel-v2023.2` is still the correct Xilinx manifest branch - for building PandABlocks 5.x. -2. If a newer branch is required for post-5.0, document it and the reason for - the change. -3. If the branch varies by PandABlocks release, add a small table (PandABlocks - version → manifest branch). - -Post findings as a comment or PR against `how-to/manual-build.md`. - -## Source - -`docs/how-to/manual-build.md` — the `repo init` step. -BODY -)") -I7=$(num "$I7_URL") -echo " meta-panda#$I7: Xilinx branch" - -sed -i "s|||" \ - "$META/docs/how-to/manual-build.md" - -sed -i "s|^## Notes$|- ⛔ how-to/manual-build (Xilinx branch post-5.0) — issue #$I7 — verify\n\n## Notes|" "$META/docs/PROGRESS.md" - - -# ── I8: hardware-target descriptions [author-from-scratch] ────────────────── -I8_URL=$(gh issue create \ - --repo PandABlocks/meta-panda \ - --title "docs: author per-target hardware descriptions for explanations/hardware-targets" \ - --label "docs-rewrite,author-from-scratch" \ - --body "$(cat << 'BODY' -## Target page - -`explanations/hardware-targets` - -The page is a full stub — no content has been written yet. It should describe -each supported hardware target so integrators know which platform to choose. - -## Category: author-from-scratch - -## What a human must do (~4 hours) - -For each MACHINE value in `reference/machine-targets` (pandabox, pandabox2, -pandabrick, plus the development-only xu5-st1 and zedboard — the list in -`conf/machine/`), provide: - -1. **SoC / module** — the Xilinx SoC or module part number. -2. **Key I/O** — number and type of I/O connectors, FMC slots, SFP, etc. -3. **Distinguishing features** — what makes this target different from the - others (performance, I/O count, form factor). -4. **Typical use case** — e.g. "general purpose lab PandA", "high-channel-count - detector trigger". -5. **Links** — hardware datasheet or purchase page where publicly available. - -A table-per-target or a definition-list format is fine. Post as a comment or -PR against `explanations/hardware-targets.md`. - -## Source - -Interview6 §A (background); cross-reference `reference/machine-targets.md`. -BODY -)") -I8=$(num "$I8_URL") -echo " meta-panda#$I8: hardware-target descriptions" - -sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/meta-panda#$I8]($I8_URL)|" \ - "$META/docs/explanations/hardware-targets.md" - -sed -i "s|⛔ explanations/hardware-targets — issue #TBD — author|⛔ explanations/hardware-targets — issue #$I8 — author|" "$META/docs/PROGRESS.md" - - -# ── I9: versioned docs / version switcher [infrastructure] ────────────────── -I9_URL=$(gh issue create \ - --repo PandABlocks/meta-panda \ - --title "docs: implement versioned docs and version switcher (R5)" \ - --label "docs-rewrite,infrastructure" \ - --body "$(cat << 'BODY' -## Scope - -All three docs repos: meta-panda, PandABlocks-FPGA, PandABlocks-server. - -This is review item R5 from the target map — deferred from the initial -content-rewrite round. - -## Background - -Each repo's GitHub Pages CI workflow already runs `make_switcher.py` and -produces a `switcher.json`, but the version switcher is not yet wired into the -MyST / sphinx-book-theme theme configuration. The Pages deploy publishes under -a versioned sub-path (`///`). - -## What needs doing (~2–4 hours) - -1. **Wire the switcher into the theme** — add `html_theme_options.switcher` (or - the MyST equivalent) so the version dropdown appears in the built docs. -2. **Test the switcher URL** — confirm `switcher.json` is reachable at the path - the theme expects (typically the repo root or a known static path). -3. **Handle `main` vs tag versions** — ensure the switcher lists released tags - and `main`/`latest` sensibly. -4. **Apply consistently** — the same change needs landing in all four repos (or - factored into the copier template if that's easier). -5. **Document the setup** in `how-to/contribute` under the xref/intersphinx - section (already drafted there). - -## Notes - -- The Pages CI workflow details are in each repo's `docs/PROGRESS.md` → Notes. -- The copier-template upstreaming opportunity is noted in `how-to/contribute`. -BODY -)") -I9=$(num "$I9_URL") -echo " meta-panda#$I9: versioned docs (R5)" - -sed -i "s|^## Notes$|- ⛔ infrastructure: versioned docs / version switcher (R5) — issue #$I9 — infrastructure\n\n## Notes|" "$META/docs/PROGRESS.md" - - -# ── Commit meta-panda changes ───────────────────────────────────────────────── -echo "" -echo " Committing meta-panda Stage B edits..." -git -C "$META" add docs/tutorials/tutorial3_position_compare.md \ - docs/tutorials/tutorial4_snake_scan.md \ - docs/how-to/use-web-control-to-set-up-a-panda.md \ - docs/how-to/build.md \ - docs/how-to/upgrade-via-web-admin.md \ - docs/how-to/manual-build.md \ - docs/reference/changes.md \ - docs/reference/machine-targets.md \ - docs/explanations/hardware-targets.md \ - docs/PROGRESS.md -git -C "$META" commit -m "$(cat << 'MSG' -docs: Stage B — link GitHub issues into stubs and verify notes - -Issues created for all human-capture, verify-then-write, author-from-scratch, -and infrastructure backlog items (see PROGRESS.md Blocked section). -MSG -)" - - -# ───────────────────────────────────────────────────────────────────────────── -# PandABlocks/PandABlocks-FPGA (4 issues) -# ───────────────────────────────────────────────────────────────────────────── -echo "" -echo "=== 2. PandABlocks-FPGA issues ===" - -# ── I10: testing CI [verify-then-write] ───────────────────────────────────── -I10_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-FPGA \ - --title "docs: verify and update how-to/testing for current CI (GitHub Actions + DLS GitLab)" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`how-to/testing` - -The page is a full stub — the source (`reference/testing.rst`) describes a -Travis CI setup that has since moved to GitHub Actions (simulation tests) and -DLS internal GitLab (full FPGA build tests). - -## Category: verify-then-write - -## What a human must do (~3 hours) - -1. Verify the current CI arrangement: - - Which test suite(s) run on **GitHub Actions** (open to contributors)? - Typically the Python / cocotb simulation tests. - - Which test suite(s) run on **DLS internal GitLab** (requires DLS access)? - Typically the full FPGA bitstream build and hardware-in-the-loop tests. -2. For each suite: document the trigger (PR/push/manual), the command to run - locally, and any required setup (Python version, simulator, DLS VPN). -3. Note which tests require access to real hardware vs simulation only. -4. Replace the stub with the verified content. - -Post as a PR against `docs/how-to/testing.md` on the `docs` branch. - -## Source - -`docs/_legacy_rst/reference/testing.rst` — 274 words (Python tests, HDL tests). -BODY -)") -I10=$(num "$I10_URL") -echo " FPGA#$I10: testing CI" - -sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-FPGA#$I10]($I10_URL)|" \ - "$FPGA/docs/how-to/testing.md" - -sed -i "s|⛔ how-to/testing — issue #TBD — verify|⛔ how-to/testing — issue #$I10 — verify|" "$FPGA/docs/PROGRESS.md" - - -# ── I11: cocotb IP assumption [verify-then-write] ─────────────────────────── -I11_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-FPGA \ - --title "docs: verify the cocotb 'modules using IP are unsupported' assumption against the full block set" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`how-to/cocotb` - -The page includes the statement: "Modules that use IP are currently unsupported -by the cocotb runner. All soft blocks (those covered by simulation) are -believed not to use IP and should remain testable — verify this assumption -against the full block set." - -## Category: verify-then-write - -## What a human must do (~1–2 hours) - -1. Check the full list of modules under `modules/` against the cocotb runner. -2. Confirm whether any soft blocks use Xilinx IP (and therefore cannot be - cocotb-tested). -3. If the assumption holds: remove the verify note and state it as fact. -4. If exceptions exist: list the affected modules and explain why they are - excluded. -5. If the limitation has been lifted: update the text accordingly. - -Post findings as a comment or PR against `docs/how-to/cocotb.md`. - -## Source - -`docs/how-to/cocotb.md` — "About cocotb" section, lines 12–14. -BODY -)") -I11=$(num "$I11_URL") -echo " FPGA#$I11: cocotb IP assumption" - -sed -i "s|verify this assumption against the full block set|verify this assumption — tracked in [PandABlocks/PandABlocks-FPGA#$I11]($I11_URL)|" \ - "$FPGA/docs/how-to/cocotb.md" - -sed -i "s|^## Notes$|- ⛔ how-to/cocotb (IP assumption) — issue #$I11 — verify\n\n## Notes|" "$FPGA/docs/PROGRESS.md" - - -# ── I12: VHDL coding standard [author-from-scratch] ───────────────────────── -I12_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-FPGA \ - --title "docs: author the VHDL coding standard for reference/vhdl-standard" \ - --label "docs-rewrite,author-from-scratch" \ - --body "$(cat << 'BODY' -## Target page - -`reference/vhdl-standard` - -No source exists — this is new content identified in Interview1 §4 as needed -for FPGA block contributors. - -## Category: author-from-scratch - -## What a human must do (~4 hours) - -Write the VHDL coding standard for PandABlocks FPGA block authors, covering at -minimum: - -1. **Naming conventions** — entity/architecture/signal/constant/type naming. -2. **Entity and architecture style** — port ordering (clk/rst first, then - inputs, then outputs), generic placement, `architecture rtl of` boilerplate. -3. **Reset style** — synchronous vs asynchronous; active-high vs active-low. -4. **Signal initialisation** — what is and is not allowed in simulation vs - synthesis. -5. **Comment requirements** — what must be commented (port descriptions, - non-obvious logic). -6. **Testbench conventions** — file naming, clock generation, `timing.ini` - relationship. -7. **Project-specific idioms** — any PandABlocks-specific patterns (e.g. use of - `entity_pkg`, `block_sim` wrapper conventions). - -Post as a PR against `docs/reference/vhdl-standard.md` on the `docs` branch. -BODY -)") -I12=$(num "$I12_URL") -echo " FPGA#$I12: VHDL standard" - -sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-FPGA#$I12]($I12_URL)|" \ - "$FPGA/docs/reference/vhdl-standard.md" - -sed -i "s|⛔ reference/vhdl-standard — issue #TBD — author|⛔ reference/vhdl-standard — issue #$I12 — author|" "$FPGA/docs/PROGRESS.md" - - -# ── I13: MyST block-listing generator + block-doc directives [tooling] ─────── -# NOTE: not in the 03 backlog "Issue backlog" section, but both stub pages -# (reference/blocks.md and how-to/block.md) explicitly promise a Stage B -# issue; included here to fulfil that promise. -I13_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-FPGA \ - --title "docs: implement MyST block-listing generator and block-doc authoring directives" \ - --label "docs-rewrite,tooling" \ - --body "$(cat << 'BODY' -## Blocked pages - -- `reference/blocks` — needs a MyST generator to replace the old Sphinx - `.. include:: build/blocks.txt`; will auto-list every block type from the - 42 `modules/*/*_doc.md` pages. -- `how-to/block` § "Writing docs" — instructions for writing per-block docs - deferred until the MyST tooling has landed and the two RST directives - (`block_fields`, `timing_plot`) have MyST equivalents. - -## Category: tooling - -## What needs doing - -### reference/blocks generator - -Currently `docs/reference/blocks.md` is a stub. The old RST approach used a -generated `blocks.txt` injected via `.. include::`. The MyST replacement -needs to either: - -- (a) Generate a `blocks.md` from the 42 `modules/*/*_doc.md` files at build - time (a `myst-nb` or custom Sphinx extension), or -- (b) Use MyST's `{include}` / `{toctree}` pattern to auto-assemble the listing. - -Prototype and document the chosen approach. - -### block-doc directives - -The `block_fields` and `timing_plot` RST directives used in the converted -`modules/*/*_doc.md` files need MyST-compatible implementations (or a mapping -to native MyST/Sphinx equivalents) so that `myst build` renders them correctly. - -Document the authoring workflow in `how-to/block` § "Writing docs" once the -directives are working. - -## Related - -- `modules/*/*_doc.md` (×42) are already converted to MyST; the directives - appear in them as raw RST pass-through blocks pending this work. -BODY -)") -I13=$(num "$I13_URL") -echo " FPGA#$I13: MyST block tooling" - -# reference/blocks.md -sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-FPGA#$I13]($I13_URL)|" \ - "$FPGA/docs/reference/blocks.md" - -# how-to/block.md "Writing docs" admonition -sed -i "s|A GitHub issue tracking the MyST block-listing generator and the block-doc\ndirectives will be created in Stage B (Prompt B) and linked here\.|Tracked in [PandABlocks/PandABlocks-FPGA#$I13]($I13_URL).|" \ - "$FPGA/docs/how-to/block.md" -# If the above single-line sed misses the newline, fall back to perl: -perl -i -0pe \ - "s|A GitHub issue tracking the MyST block-listing generator and the block-doc\ndirectives will be created in Stage B \(Prompt B\) and linked here\.|Tracked in [PandABlocks/PandABlocks-FPGA#$I13]($I13_URL).|" \ - "$FPGA/docs/how-to/block.md" 2>/dev/null || true - -sed -i "s|⛔ reference/blocks — issue #TBD — tooling (MyST block-listing generator)|⛔ reference/blocks — issue #$I13 — tooling (MyST block-listing generator)|" "$FPGA/docs/PROGRESS.md" -sed -i "s|⛔ how-to/block \"Writing docs\" section — issue #TBD — tooling (block-doc directives.*)|⛔ how-to/block \"Writing docs\" section — issue #$I13 — tooling (block-doc directives, deferred until MyST per-block doc tooling lands)|" "$FPGA/docs/PROGRESS.md" - - -# ── Commit FPGA changes ─────────────────────────────────────────────────────── -echo "" -echo " Committing FPGA Stage B edits..." -git -C "$FPGA" add docs/how-to/testing.md \ - docs/how-to/cocotb.md \ - docs/how-to/block.md \ - docs/reference/vhdl-standard.md \ - docs/reference/blocks.md \ - docs/PROGRESS.md -git -C "$FPGA" commit -m "$(cat << 'MSG' -docs: Stage B — link GitHub issues into stubs and verify notes -MSG -)" - - -# ───────────────────────────────────────────────────────────────────────────── -# PandABlocks/PandABlocks-server (7 issues) -# ───────────────────────────────────────────────────────────────────────────── -echo "" -echo "=== 3. PandABlocks-server issues ===" - -# ── I14: capture-options superset [verify-then-write] ─────────────────────── -I14_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-server \ - --title "docs: confirm the documented capture options against a live PandA server" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`reference/capture-options` - -The capture-option tables have been verified against the server source -(`server/pos_out.c`: the `capture_option_info` and `nominal_capture_masks` -tables) and harmonised across `capture-options.md`, `capture.md` and -`fields.md`. What remains is a quick live confirmation. - -## Category: verify-then-write - -## What a human must do (~30 min) - -1. Run `*CAPTURE.OPTIONS?` and `*CAPTURE.ENUMS?` against a live PandA server - (v4.x / v5.x), once on a firmware build with `StdDev` support and once - without if available. -2. Compare the responses against the tables in `reference/capture-options.md` - (expected: Value, Diff, Sum, Mean, Min, Max [, StdDev]; enums add No, - Min Max, Min Max Mean [, Mean StdDev]). -3. Correct the page if anything differs; otherwise just close this issue. - -## Source - -`docs/reference/capture-options.md`; `server/pos_out.c` for the -source-of-truth tables. -BODY -)") -I14=$(num "$I14_URL") -echo " server#$I14: capture-options superset" - -# Link the live-confirmation issue from the note on the page -perl -i -0pe "s|options \(\`StdDev\`, and therefore \`Mean StdDev\`\) depends on the FPGA\nconfiguration\.|options (\`StdDev\`, and therefore \`Mean StdDev\`) depends on the FPGA\nconfiguration. Live confirmation tracked in [PandABlocks/PandABlocks-server#$I14]($I14_URL).|" \ - "$SERVER/docs/reference/capture-options.md" - -sed -i "s|^## Notes$|- ⛔ reference/capture-options (live confirmation) — issue #$I14 — verify\n\n## Notes|" "$SERVER/docs/PROGRESS.md" - - -# ── I15: 60 MB/s figure [verify-then-write] ───────────────────────────────── -I15_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-server \ - --title "docs: verify the 60 MBytes/s high-performance capture throughput figure" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`reference/capture` - -The "High performance mode" section states: "In tests it has been capable of -sustaining 60 MBytes/s when panda-webcontrol is **not** installed." - -## Category: verify-then-write - -## What a human must do (~1–2 hours) - -1. Confirm the 60 MBytes/s figure is still achievable with current firmware. -2. Note the conditions under which it was measured: - - Hardware revision (pandabox / xu5 / etc.) - - FPGA image version - - Network interface (GigE / 10GigE) - - `FRAMED RAW` mode -3. If the figure has changed (higher or lower), update it with the new value - and measurement conditions. -4. If panda-webcontrol is no longer a factor, remove or update that caveat. - -Post findings as a comment or PR against `docs/reference/capture.md`. - -## Source - -`docs/reference/capture.md` — "High performance mode" section. -BODY -)") -I15=$(num "$I15_URL") -echo " server#$I15: 60 MB/s figure" - -# Add a verify comment after the 60 MBytes/s sentence -sed -i "s|been capable of sustaining 60 MBytes/s when panda-webcontrol is \*\*not\*\* installed\.|been capable of sustaining 60 MBytes/s when panda-webcontrol is **not** installed. |" \ - "$SERVER/docs/reference/capture.md" - -sed -i "s|^## Notes$|- ⛔ reference/capture (60 MB/s figure) — issue #$I15 — verify\n\n## Notes|" "$SERVER/docs/PROGRESS.md" - - -# ── I16: extension server vs implementation [verify-then-write] ───────────── -I16_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-server \ - --title "docs: verify extension.rst against the current server implementation and rewrite reference/extension" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`reference/extension` - -The page is a full stub — the source (`extension.rst`) is flagged as outdated -and needs verification against the current implementation before it can be -converted. - -## Category: verify-then-write - -## What a human must do (~3–4 hours) - -1. Read `docs/_legacy_rst/extension.rst` (739 words: Extension Modules, - Injected Values). -2. Compare against the current server source code for the extension server - (socket protocol, injected value names, lifecycle hooks). -3. Identify: - - What has changed since the doc was written. - - What is still accurate and can be kept. - - What is missing (new injected values, new API calls). -4. Write the updated `reference/extension.md` with verified content. - -Post as a PR against the `docs` branch. - -## Source - -`docs/_legacy_rst/extension.rst` — 739 words (Extension Modules, Injected -Values). -BODY -)") -I16=$(num "$I16_URL") -echo " server#$I16: extension server" - -sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-server#$I16]($I16_URL)|" \ - "$SERVER/docs/reference/extension.md" - -sed -i "s|⛔ reference/extension — issue #TBD — verify|⛔ reference/extension — issue #$I16 — verify|" "$SERVER/docs/PROGRESS.md" - - -# ── I17: *IDN? v4.x [verify-then-write] ───────────────────────────────────── -I17_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-server \ - --title "docs: verify *IDN? response format is unchanged in v4.x and update example" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`reference/commands` - -The `*IDN?` example in the "System commands" section shows a response from an -older firmware version. The backlog flags this as needing verification for v4.x. - -## Category: verify-then-write - -## What a human must do (~1 hour) - -1. Run `*IDN?` against a v4.x PandA server. -2. Confirm whether the response format has changed (fields, order, version - string format). -3. Update the code-block example with a representative v4.x response. -4. If the format is strictly unchanged, add a note stating "unchanged since - v3.x" so future maintainers know it was verified. - -Post findings as a comment or PR against `docs/reference/commands.md`. - -## Source - -`docs/reference/commands.md` — "System commands" section, `*IDN?` example. -Current example: `OK =PandA SW: 330bd94-dirty FPGA: 0.1.9 d1275f61 00000000` -BODY -)") -I17=$(num "$I17_URL") -echo " server#$I17: *IDN? v4.x" - -# Add a verify comment after the *IDN? code block -sed -i "s|> OK =PandA SW: 330bd94-dirty FPGA: 0.1.9 d1275f61 00000000|> OK =PandA SW: 330bd94-dirty FPGA: 0.1.9 d1275f61 00000000 |" \ - "$SERVER/docs/reference/commands.md" - -sed -i "s|^## Notes$|- ⛔ reference/commands (*IDN? v4.x) — issue #$I17 — verify\n\n## Notes|" "$SERVER/docs/PROGRESS.md" - - -# ── I18: CONFIG syntax [verify-then-write] ─────────────────────────────────── -I18_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-server \ - --title "docs: verify and document the CONFIG file syntax for how-to/building" \ - --label "docs-rewrite,verify-then-write" \ - --body "$(cat << 'BODY' -## Target page - -`how-to/building` - -The "Setting up the CONFIG file" section defers to `CONFIG.example` and notes -"The exact syntax accepted by the server Makefile for CONFIG values is pending -verification (tracked in the issue backlog)." - -## Category: verify-then-write - -## What a human must do (~1–2 hours) - -1. Review the server `Makefile` for all CONFIG variable names it reads and - their accepted forms (e.g. `BINUTILS_DIR`, `PYTHON`, `COTHREAD`, etc.). -2. Confirm whether the values are paths, flags, or version strings. -3. Document any non-obvious syntax or gotchas (e.g. trailing slash required, - quoted vs unquoted paths). -4. Replace the deferral note in `how-to/building.md` with the verified - information. - -Post findings as a comment or PR. - -## Source - -`docs/how-to/building.md` — "Setting up the CONFIG file" section. -`docs/_legacy_rst/building.rst` — 493 words with the CONFIG table. -BODY -)") -I18=$(num "$I18_URL") -echo " server#$I18: CONFIG syntax" - -# Update the note that says "pending verification (tracked in the issue backlog)" -sed -i "s|pending verification (tracked in the issue backlog)\.|pending verification — tracked in [PandABlocks/PandABlocks-server#$I18]($I18_URL).|" \ - "$SERVER/docs/how-to/building.md" - -sed -i "s|^## Notes$|- ⛔ how-to/building (CONFIG syntax) — issue #$I18 — verify\n\n## Notes|" "$SERVER/docs/PROGRESS.md" - - -# ── I19: C coding standard [author-from-scratch] ──────────────────────────── -I19_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-server \ - --title "docs: author the C coding standard for reference/c-standard" \ - --label "docs-rewrite,author-from-scratch" \ - --body "$(cat << 'BODY' -## Target page - -`reference/c-standard` - -No source exists — this is new content identified in Interview1 §4 as needed -for server contributors. - -## Category: author-from-scratch - -## What a human must do (~4 hours) - -Write the C coding standard for PandABlocks server contributors, covering at -minimum: - -1. **Naming conventions** — functions, variables, macros, types (typedef'd - structs, enums). -2. **File structure** — header guard style, include order, `extern "C"` guards. -3. **Error handling** — return-code conventions, `errno` usage, logging macros. -4. **Memory management** — ownership rules, allocation patterns, common pitfalls - in the server's context. -5. **Comment style** — what warrants a comment; doxygen vs plain C comments. -6. **Formatting** — indentation (tabs/spaces), brace placement, line length. -7. **Project-specific idioms** — any server-specific patterns (e.g. lock/unlock - wrappers, the config vs data thread boundary). - -Post as a PR against `docs/reference/c-standard.md` on the `docs` branch. -BODY -)") -I19=$(num "$I19_URL") -echo " server#$I19: C standard" - -sed -i "s|**Blocked:** a GitHub issue will be created in Stage B (Prompt B) and linked here\.|**Blocked:** [PandABlocks/PandABlocks-server#$I19]($I19_URL)|" \ - "$SERVER/docs/reference/c-standard.md" - -sed -i "s|⛔ reference/c-standard — issue #TBD — author|⛔ reference/c-standard — issue #$I19 — author|" "$SERVER/docs/PROGRESS.md" - - -# ── I20: server architecture depth [author-from-scratch] ──────────────────── -I20_URL=$(gh issue create \ - --repo PandABlocks/PandABlocks-server \ - --title "docs: author detailed server architecture internals for explanations/architecture" \ - --label "docs-rewrite,author-from-scratch" \ - --body "$(cat << 'BODY' -## Target page - -`explanations/architecture` - -A skeleton has been written covering the two TCP sockets, the config/data thread -split, and the block model at a high level. The depth items are deferred: -locking strategy, DMA pipeline, persistence state machine. - -## Category: author-from-scratch - -## What a human must do (~4–6 hours) - -Expand the skeleton in `explanations/architecture.md` to cover the internals -that matter to contributors and extension developers: - -1. **Thread model** — which threads exist, what each does, how they communicate - (queues, mutexes, condition variables). -2. **Locking strategy** — what lock(s) protect shared state; any lock ordering - rules; known contention points. -3. **DMA pipeline** — how captured data flows from FPGA registers through the - DMA ring buffer to the data socket. -4. **Persistence / state machine** — how the server saves and restores block - configuration; when config is written to hardware vs held in memory. -5. **Extension server integration** — how extension modules register and receive - injected values (link to `reference/extension`). - -A diagram (ASCII or SVG) of the thread/data-flow architecture would be very -helpful. - -Post as a PR against `docs/explanations/architecture.md` on the `docs` branch. - -## Source - -`docs/explanations/architecture.md` — existing skeleton. -Server source code (C) is the primary reference. -BODY -)") -I20=$(num "$I20_URL") -echo " server#$I20: architecture depth" - -# Update the admonition that says "tracked in the issue backlog as **blocked: author**." -sed -i "s|tracked in the issue backlog as \*\*blocked: author\*\*\.|tracked in [PandABlocks/PandABlocks-server#$I20]($I20_URL) (**blocked: author**).|" \ - "$SERVER/docs/explanations/architecture.md" - -sed -i "s|^## Notes$|- ⛔ explanations/architecture (depth) — issue #$I20 — author\n\n## Notes|" "$SERVER/docs/PROGRESS.md" - - -# ── Commit server changes ───────────────────────────────────────────────────── -echo "" -echo " Committing server Stage B edits..." -git -C "$SERVER" add docs/reference/capture-options.md \ - docs/reference/capture.md \ - docs/reference/extension.md \ - docs/reference/commands.md \ - docs/reference/c-standard.md \ - docs/how-to/building.md \ - docs/explanations/architecture.md \ - docs/PROGRESS.md -git -C "$SERVER" commit -m "$(cat << 'MSG' -docs: Stage B — link GitHub issues into stubs and verify notes -MSG -)" - - -# ───────────────────────────────────────────────────────────────────────────── -# Summary -# ───────────────────────────────────────────────────────────────────────────── -echo "" -echo "=== Stage B complete — issues created ===" -echo "" -echo "PandABlocks/meta-panda:" -echo " #$I1 tutorials 3+4 screenshots [human-capture]" -echo " #$I2 widget screenshots + sentence [human-capture]" -echo " #$I3 3.0→4.0 breaking changes [verify-then-write]" -echo " #$I4 machine-target hardware details [verify-then-write]" -echo " #$I5 KAS_IMAGE_VERSION mapping [verify-then-write]" -echo " #$I6 legacy zpg filename [verify-then-write]" -echo " #$I7 Xilinx branch post-5.0 [verify-then-write]" -echo " #$I8 hardware-target descriptions [author-from-scratch]" -echo " #$I9 versioned docs / version switcher [infrastructure]" -echo "" -echo "PandABlocks/PandABlocks-FPGA:" -echo " #$I10 testing CI update [verify-then-write]" -echo " #$I11 cocotb IP assumption [verify-then-write]" -echo " #$I12 VHDL coding standard [author-from-scratch]" -echo " #$I13 MyST block-listing + block-doc [tooling] *" -echo "" -echo "PandABlocks/PandABlocks-server:" -echo " #$I14 capture-options superset [verify-then-write]" -echo " #$I15 60 MB/s figure [verify-then-write]" -echo " #$I16 extension server vs implementation [verify-then-write]" -echo " #$I17 *IDN? v4.x [verify-then-write]" -echo " #$I18 CONFIG syntax [verify-then-write]" -echo " #$I19 C coding standard [author-from-scratch]" -echo " #$I20 server architecture depth [author-from-scratch]" -echo "" -echo "* I13 is from the FPGA PROGRESS.md stub promises, not the 03 backlog." -echo " All others are from the 03-target-doc-map.md Issue backlog section." From d74c4a08cff630e4e607e8809e2afd34e4bd3e01 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Fri, 12 Jun 2026 13:32:56 +0000 Subject: [PATCH 24/49] docs: recreate all 8 attribute-state icons as SVGs (Prompt C) Recreate the eight attribute-state glyphs as standalone material-style SVGs under docs/images/attribute-state/, in the colour spec derived from the web control theme, and wire them into explanations/understanding-attribute-state. Replaces the three pending placeholders and the five PNGs with a consistent SVG set. No external UI toolkit is referenced in the docs. Co-Authored-By: Claude Opus 4.8 --- docs/PROGRESS.md | 2 +- .../understanding-attribute-state.md | 36 ++++++++++--------- docs/images/attribute-state/disconnected.svg | 3 ++ docs/images/attribute-state/error.svg | 3 ++ docs/images/attribute-state/invalid.svg | 3 ++ .../images/attribute-state/locally-edited.svg | 3 ++ docs/images/attribute-state/normal.svg | 4 +++ docs/images/attribute-state/processing.svg | 3 ++ docs/images/attribute-state/update-error.svg | 3 ++ docs/images/attribute-state/warning.svg | 3 ++ 10 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 docs/images/attribute-state/disconnected.svg create mode 100644 docs/images/attribute-state/error.svg create mode 100644 docs/images/attribute-state/invalid.svg create mode 100644 docs/images/attribute-state/locally-edited.svg create mode 100644 docs/images/attribute-state/normal.svg create mode 100644 docs/images/attribute-state/processing.svg create mode 100644 docs/images/attribute-state/update-error.svg create mode 100644 docs/images/attribute-state/warning.svg diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 79d15a7a..ce949770 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -48,7 +48,7 @@ Page list expanded from `06-source-provenance-map.md`. - ✅ explanations/architecture — skeleton authored from Interview1; TCP/client/EPICS/data flow - ⛔ explanations/hardware-targets — blocked: author - ✅ explanations/web-control-ui-overview — converted from user_interface_overview.rst; screenshots reused -- ✅ explanations/understanding-attribute-state — 8 states described; 5 existing PNG icons referenced from _legacy_rst; 3 missing icons (Processing, Update Error, Invalid) pending Prompt C SVGs +- ✅ explanations/understanding-attribute-state — 8 states described; all 8 state icons recreated as standalone SVGs in `images/attribute-state/` (material-style glyphs in the colour spec) and wired in (Prompt C done; no malcolm reference in docs) - ✅ explanations/decisions + decisions/0001,0002,COPYME — kept from scaffold (no change) ## Blocked (issues raised) diff --git a/docs/explanations/understanding-attribute-state.md b/docs/explanations/understanding-attribute-state.md index adddf52d..0b806f32 100644 --- a/docs/explanations/understanding-attribute-state.md +++ b/docs/explanations/understanding-attribute-state.md @@ -10,11 +10,6 @@ At any given time an attribute can be in one of eight states. State depends on: State is shown as an icon to the left of the attribute name in the {term}`Block Information Panel`. -:::{note} -Some state icons are still being recreated for these docs; states whose icon is -not yet shown are marked *icon pending* below. -::: - ## State reference ### Normal @@ -23,7 +18,7 @@ Data is within an acceptable operating threshold or range. For a {term}`Parameter Attribute` this also means the value has been successfully committed to the server. -```{figure} ../images/webcontrol/information_icon.png +```{figure} ../images/attribute-state/normal.svg :align: center :width: 32px @@ -35,9 +30,12 @@ Normal state icon Data has been submitted to the server or a retrieval request has been made. A response is being awaited. - +```{figure} ../images/attribute-state/processing.svg +:align: center +:width: 32px -*(icon pending)* +Processing state icon +``` ### Locally Edited @@ -45,7 +43,7 @@ The value has been changed in the UI but not yet committed to the server. The local edit has no effect on the running system and will not be saved as part of the {term}`Design` until it is submitted. -```{figure} ../images/webcontrol/locally_edited_icon.png +```{figure} ../images/attribute-state/locally-edited.svg :align: center :width: 32px @@ -57,16 +55,19 @@ Locally Edited state icon The value submitted to the server was not accepted — typically because it failed the validation defined in the Block specification. - +```{figure} ../images/attribute-state/update-error.svg +:align: center +:width: 32px -*(icon pending)* +Update Error state icon +``` ### Warning An issue has been detected that requires investigation. Data is outside normal operating parameters but is still considered acceptable. -```{figure} ../images/webcontrol/warning_icon.png +```{figure} ../images/attribute-state/warning.svg :align: center :width: 32px @@ -79,7 +80,7 @@ An issue has been detected and an error has been reported by the server. Data is outside acceptable operating conditions; immediate action is recommended. -```{figure} ../images/webcontrol/error_icon.png +```{figure} ../images/attribute-state/error.svg :align: center :width: 32px @@ -92,16 +93,19 @@ The overall block context has changed since the UI was last accessed. Displayed data may no longer be accurate or consistent with the current {term}`Design`. - +```{figure} ../images/attribute-state/invalid.svg +:align: center +:width: 32px -*(icon pending)* +Invalid state icon +``` ### Disconnected Communication with the block hosting the attribute has been lost by the server. Immediate investigation is recommended. -```{figure} ../images/webcontrol/disconnected_icon.png +```{figure} ../images/attribute-state/disconnected.svg :align: center :width: 32px diff --git a/docs/images/attribute-state/disconnected.svg b/docs/images/attribute-state/disconnected.svg new file mode 100644 index 00000000..911c8ec0 --- /dev/null +++ b/docs/images/attribute-state/disconnected.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/images/attribute-state/error.svg b/docs/images/attribute-state/error.svg new file mode 100644 index 00000000..8719b7a9 --- /dev/null +++ b/docs/images/attribute-state/error.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/images/attribute-state/invalid.svg b/docs/images/attribute-state/invalid.svg new file mode 100644 index 00000000..14753b8f --- /dev/null +++ b/docs/images/attribute-state/invalid.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/images/attribute-state/locally-edited.svg b/docs/images/attribute-state/locally-edited.svg new file mode 100644 index 00000000..658e543d --- /dev/null +++ b/docs/images/attribute-state/locally-edited.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/images/attribute-state/normal.svg b/docs/images/attribute-state/normal.svg new file mode 100644 index 00000000..3f972813 --- /dev/null +++ b/docs/images/attribute-state/normal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/images/attribute-state/processing.svg b/docs/images/attribute-state/processing.svg new file mode 100644 index 00000000..2932aad5 --- /dev/null +++ b/docs/images/attribute-state/processing.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/images/attribute-state/update-error.svg b/docs/images/attribute-state/update-error.svg new file mode 100644 index 00000000..e6b32dd8 --- /dev/null +++ b/docs/images/attribute-state/update-error.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/images/attribute-state/warning.svg b/docs/images/attribute-state/warning.svg new file mode 100644 index 00000000..353079e8 --- /dev/null +++ b/docs/images/attribute-state/warning.svg @@ -0,0 +1,3 @@ + + + From b64b14885dd7c9eba9ec1467dca7141d1fde9416 Mon Sep 17 00:00:00 2001 From: "Sode, Adedamola (DLSLtd,RAL,LSCI)" Date: Tue, 16 Jun 2026 13:25:24 +0100 Subject: [PATCH 25/49] removed requirement for pre 5.0 upgrading of panda in upgrade-via-ssh --- docs/how-to/upgrade-via-ssh.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md index 83ffe3c3..2c79042a 100644 --- a/docs/how-to/upgrade-via-ssh.md +++ b/docs/how-to/upgrade-via-ssh.md @@ -8,7 +8,7 @@ particularly useful for upgrading multiple PandAs in one scripted pass. SSH must be authorised on the PandA. You can either: - Place an `authorized_keys` file on the SD card before first boot, or -- Load SSH keys from a USB stick via the Web Admin interface +- Load SSH keys from `authorized_keys` file on a USB stick via the Web Admin interface (**SSH Keys → Append SSH keys from USB**). :::{warning} @@ -16,7 +16,7 @@ A PandA has only a single `root` user. Remote operations run as root and can break the system if commands are wrong — take care. ::: -## Post-5.0 upgrade (opkg / `.ipk`) +## Upgrading the PandA Download the `boot-{MACHINE}.tar.gz` release archive from [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases) and @@ -38,14 +38,6 @@ The `/boot` directory on the PandA should contain: Power-cycle the PandA; it will install the new rootfs on next boot. - - -## Pre-5.0 to 5.x upgrade (zpkg → opkg) - -If your PandA is running a pre-5.0 release (zpkg-based), follow the -web-admin upgrade path first ({doc}`upgrade-via-web-admin`) to move to a -5.x base image before attempting SSH-based updates. - ## Update the 24V FMC EEPROM (DLS-specific, one-time) :::{note} From 6a3031d39651d10962a2bfe71a863d8c943b439f Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Tue, 16 Jun 2026 13:43:46 +0100 Subject: [PATCH 26/49] removed tutorial names from files/nav links --- docs/tutorials/{tutorial1_blinking_leds.md => blinking_leds.md} | 0 ...{tutorial0_connecting_to_web_control.md => getting_started.md} | 0 .../{tutorial2_position_capture.md => position_capture.md} | 0 .../{tutorial3_position_compare.md => position_compare.md} | 0 docs/tutorials/{tutorial4_snake_scan.md => snake_scan.md} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename docs/tutorials/{tutorial1_blinking_leds.md => blinking_leds.md} (100%) rename docs/tutorials/{tutorial0_connecting_to_web_control.md => getting_started.md} (100%) rename docs/tutorials/{tutorial2_position_capture.md => position_capture.md} (100%) rename docs/tutorials/{tutorial3_position_compare.md => position_compare.md} (100%) rename docs/tutorials/{tutorial4_snake_scan.md => snake_scan.md} (100%) diff --git a/docs/tutorials/tutorial1_blinking_leds.md b/docs/tutorials/blinking_leds.md similarity index 100% rename from docs/tutorials/tutorial1_blinking_leds.md rename to docs/tutorials/blinking_leds.md diff --git a/docs/tutorials/tutorial0_connecting_to_web_control.md b/docs/tutorials/getting_started.md similarity index 100% rename from docs/tutorials/tutorial0_connecting_to_web_control.md rename to docs/tutorials/getting_started.md diff --git a/docs/tutorials/tutorial2_position_capture.md b/docs/tutorials/position_capture.md similarity index 100% rename from docs/tutorials/tutorial2_position_capture.md rename to docs/tutorials/position_capture.md diff --git a/docs/tutorials/tutorial3_position_compare.md b/docs/tutorials/position_compare.md similarity index 100% rename from docs/tutorials/tutorial3_position_compare.md rename to docs/tutorials/position_compare.md diff --git a/docs/tutorials/tutorial4_snake_scan.md b/docs/tutorials/snake_scan.md similarity index 100% rename from docs/tutorials/tutorial4_snake_scan.md rename to docs/tutorials/snake_scan.md From 2fd50323070e47f02bfd7fcdb016a3efece9aa07 Mon Sep 17 00:00:00 2001 From: "Sode, Adedamola (DLSLtd,RAL,LSCI)" Date: Tue, 16 Jun 2026 15:37:24 +0100 Subject: [PATCH 27/49] Added pre 5.0 instructions --- docs/how-to/upgrade-via-ssh.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md index 2c79042a..e2340573 100644 --- a/docs/how-to/upgrade-via-ssh.md +++ b/docs/how-to/upgrade-via-ssh.md @@ -16,7 +16,7 @@ A PandA has only a single `root` user. Remote operations run as root and can break the system if commands are wrong — take care. ::: -## Upgrading the PandA +## Upgrading the PandA post 5.0 (opkg / `.ipk`) Download the `boot-{MACHINE}.tar.gz` release archive from [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases) and @@ -38,6 +38,15 @@ The `/boot` directory on the PandA should contain: Power-cycle the PandA; it will install the new rootfs on next boot. +## Pre-5.0 to 5.x upgrade (zpkg → opkg) + +1. Delete old conflicting files: + ```bash + ssh root@ + rm -f /boot/uImage /boot/uinitramfs /boot/devicetree.db + ``` +2. Follow **Upgrading the PandA post 5.0** + ## Update the 24V FMC EEPROM (DLS-specific, one-time) :::{note} From 296c9b7f30823489f616c2639f36a1fe135293a3 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Tue, 16 Jun 2026 15:55:36 +0100 Subject: [PATCH 28/49] move setup by editing config.txt to its own how-to --- docs/how-to/setup-without-dhcp.md | 77 +++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 docs/how-to/setup-without-dhcp.md diff --git a/docs/how-to/setup-without-dhcp.md b/docs/how-to/setup-without-dhcp.md new file mode 100644 index 00000000..b9ff2d31 --- /dev/null +++ b/docs/how-to/setup-without-dhcp.md @@ -0,0 +1,77 @@ +# How to get a PandA on the network without DHCP + +> **No configuration needed for DHCP** — just plug in and boot. + +The SD card inside a PandA contains a `config.txt` file that controls networking +and other boot-time settings. Below is the default file with all options +commented out: + +```ini +# This file contains configuration settings. In this file network and other +# settings can be adjusted. + +# If ADDRESS and NETMASK are not both specified DHCP will be used instead. +# The ADDRESS field can be set to a four part dotted IP address followed by a +# network mask specification thus: +# +# ADDRESS = 172.23.252.202 +# NETMASK = 255.255.240.0 + +# If the ADDRESS field has been set then the GATEWAY and DNS fields should be +# set: +# +# GATEWAY = 172.23.240.254 +# DNS = 172.23.5.13 172.23.4.1 130.246.8.13 + +# Optionally the DNS search domain can be set: +# +# DNS_SEARCH = diamond.ac.uk + +# The NTP server or servers can be specified here: +# +# NTP = 172.23.240.2 172.23.199.1 + +# The machine hostname can be specified here: +# +# HOSTNAME = panda + +# To skip loading any zpackages at startup, either for testing or as an +# override to recover from a faulty zpkg install: +# +# NO_ZPKG +``` + +During startup the network is configured as follows: + +- If `ADDRESS` and `NETMASK` are both set, a static IP is assigned. + Set `GATEWAY` and `DNS` too; `NTP` is optional. +- Otherwise DHCP is attempted. On success it sets IP, gateway, DNS and may + set hostname. If the DHCP server advertises NTP servers those take priority + over the `NTP` key. +- If DHCP fails, ZeroConf is attempted. If that also fails the PandA will not + be reachable on the network. + +In the default (all-commented) configuration the PandA contacts +`0.pool.ntp.org` and pool peers for time. + +## Override file + +If a static IP needs to be set without opening the SD card, use the USB +override mechanism: + +Place a file named `panda-config.txt` on a USB drive and plug the drive into +the PandA **while it is booting**. The PandA will read `panda-config.txt` from +the USB drive instead of `config.txt` from the SD card. + +The override file uses the same format as `config.txt`, for example: + +```ini +ADDRESS = 192.168.0.2 +NETMASK = 255.255.255.0 +GATEWAY = 192.168.0.254 +HOSTNAME = mypanda +``` + +To make the USB settings permanent, use the **Show Network Configuration** +function in the Web Admin interface (described below), which writes the settings +back to `config.txt` on the SD card. From a39b1a8766349b2dbfd5e9fa5fb12273c3ea25b5 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Tue, 16 Jun 2026 15:57:20 +0100 Subject: [PATCH 29/49] reorganise tutorials for upgrading firmware, give legacy upgrade its own instructions --- docs/how-to/legacy-upgrade.md | 24 ++++++ docs/how-to/quickstart.md | 111 --------------------------- docs/how-to/upgrade-via-ssh.md | 6 +- docs/how-to/upgrade-via-web-admin.md | 16 ++-- 4 files changed, 32 insertions(+), 125 deletions(-) create mode 100644 docs/how-to/legacy-upgrade.md delete mode 100644 docs/how-to/quickstart.md diff --git a/docs/how-to/legacy-upgrade.md b/docs/how-to/legacy-upgrade.md new file mode 100644 index 00000000..652fefda --- /dev/null +++ b/docs/how-to/legacy-upgrade.md @@ -0,0 +1,24 @@ +# Upgrading a PandA - Pre-5.0 to 5.x +The Web Admin interface lets you upgrade a PandA using only a browser and a +USB stick — no SSH or network file transfer required. + +## Prerequisites + +- Physical access to the PandA (to insert a USB stick). +- the legacy-updater package from + [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases). + +## Upgrade procedure (zpkg → opkg) + +Pre-5.0 PandAs use a legacy zpkg-based firmware format. To upgrade to a +5.x release: + +1. Download the legacy-updater package. +2. Copy the updater package (legacyupdater@vesion.zpg) to a USB stick. +3. Insert the USB stick into the USB port on the back of the PandA. +4. Open a browser and navigate to `http:///`. +5. Click **Admin** in the bottom banner. +6. Note the current version shown in the Admin tab landing page. +7. Under **Admin Commands → Packages**, click **Install Packages from USB**. +8. Select the `legacyupgrader@pandabox-{VERSION}.zpg` file from the list and wait for the installaton to finish. +9. Power-cycle the PandA; it will apply the new firmware on next boot. \ No newline at end of file diff --git a/docs/how-to/quickstart.md b/docs/how-to/quickstart.md deleted file mode 100644 index 6494bcc9..00000000 --- a/docs/how-to/quickstart.md +++ /dev/null @@ -1,111 +0,0 @@ -# How to get a PandA on the network - -The SD card inside a PandA contains a `config.txt` file that controls networking -and other boot-time settings. Below is the default file with all options -commented out: - -```ini -# This file contains configuration settings. In this file network and other -# settings can be adjusted. - -# If ADDRESS and NETMASK are not both specified DHCP will be used instead. -# The ADDRESS field can be set to a four part dotted IP address followed by a -# network mask specification thus: -# -# ADDRESS = 172.23.252.202 -# NETMASK = 255.255.240.0 - -# If the ADDRESS field has been set then the GATEWAY and DNS fields should be -# set: -# -# GATEWAY = 172.23.240.254 -# DNS = 172.23.5.13 172.23.4.1 130.246.8.13 - -# Optionally the DNS search domain can be set: -# -# DNS_SEARCH = diamond.ac.uk - -# The NTP server or servers can be specified here: -# -# NTP = 172.23.240.2 172.23.199.1 - -# The machine hostname can be specified here: -# -# HOSTNAME = panda - -# To skip loading any zpackages at startup, either for testing or as an -# override to recover from a faulty zpkg install: -# -# NO_ZPKG -``` - -During startup the network is configured as follows: - -- If `ADDRESS` and `NETMASK` are both set, a static IP is assigned. - Set `GATEWAY` and `DNS` too; `NTP` is optional. -- Otherwise DHCP is attempted. On success it sets IP, gateway, DNS and may - set hostname. If the DHCP server advertises NTP servers those take priority - over the `NTP` key. -- If DHCP fails, ZeroConf is attempted. If that also fails the PandA will not - be reachable on the network. - -In the default (all-commented) configuration the PandA contacts -`0.pool.ntp.org` and pool peers for time. - -## Override file - -If a static IP needs to be set without opening the SD card, use the USB -override mechanism: - -Place a file named `panda-config.txt` on a USB drive and plug the drive into -the PandA **while it is booting**. The PandA will read `panda-config.txt` from -the USB drive instead of `config.txt` from the SD card. - -The override file uses the same format as `config.txt`, for example: - -```ini -ADDRESS = 192.168.0.2 -NETMASK = 255.255.255.0 -GATEWAY = 192.168.0.254 -HOSTNAME = mypanda -``` - -To make the USB settings permanent, use the **Show Network Configuration** -function in the Web Admin interface (described below), which writes the settings -back to `config.txt` on the SD card. - -## Web interface - -Once a PandA is on the network, navigate to its IP address or hostname in a -browser. The home page provides links to: - -- **Home** — summary of the web interface sections -- **Docs** — hardware, firmware and software documentation -- **Control** — the web control; wire functional blocks together, set parameters, - save and load designs (requires the web-control package to be installed) -- **Admin** — install packages from USB, manage SSH keys, and other remote - administration - -## Web Admin - -The Web Admin page provides the following functions: - -- **System** - - Reboot / Restart - - Show `/var/log/messages` - - Show Network Configuration -- **Packages** - - List Installed Packages - - Install Packages from USB - - Install Rootfs from USB -- **SSH Keys** - - Show Authorised SSH Keys - - Append SSH keys from USB - -Visit the relevant Web Admin page for instructions on each operation. - -## Troubleshooting - -See {doc}`../reference/troubleshooting` for answers to common questions such as -configuring a static IP, disabling subnet validation, recovering from a -corrupted SD card, and overriding the FPGA bitstream variant. diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md index 83ffe3c3..42f53093 100644 --- a/docs/how-to/upgrade-via-ssh.md +++ b/docs/how-to/upgrade-via-ssh.md @@ -1,4 +1,4 @@ -# Upgrading a PandA over SSH +# Upgrading a PandA over SSH (5.0 or later to 5.x) SSH access lets you upgrade a PandA without physical access, and is particularly useful for upgrading multiple PandAs in one scripted pass. @@ -16,7 +16,7 @@ A PandA has only a single `root` user. Remote operations run as root and can break the system if commands are wrong — take care. ::: -## Post-5.0 upgrade (opkg / `.ipk`) +## Upgrade procedure (opkg / `.ipk`) Download the `boot-{MACHINE}.tar.gz` release archive from [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases) and @@ -43,7 +43,7 @@ Power-cycle the PandA; it will install the new rootfs on next boot. ## Pre-5.0 to 5.x upgrade (zpkg → opkg) If your PandA is running a pre-5.0 release (zpkg-based), follow the -web-admin upgrade path first ({doc}`upgrade-via-web-admin`) to move to a +legacy upgrade path first ({doc}`legacy-upgrade`) to move to a 5.x base image before attempting SSH-based updates. ## Update the 24V FMC EEPROM (DLS-specific, one-time) diff --git a/docs/how-to/upgrade-via-web-admin.md b/docs/how-to/upgrade-via-web-admin.md index 70d69b99..40e30664 100644 --- a/docs/how-to/upgrade-via-web-admin.md +++ b/docs/how-to/upgrade-via-web-admin.md @@ -1,4 +1,4 @@ -# Upgrading a PandA via the web admin interface +# Upgrading a PandA via the web admin interface (5.0 or later to 5.x) The Web Admin interface lets you upgrade a PandA using only a browser and a USB stick — no SSH or network file transfer required. @@ -9,7 +9,7 @@ USB stick — no SSH or network file transfer required. - The new firmware archive downloaded from [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases). -## Post-5.0 upgrade (opkg / `.ipk`) +## Upgrade procedure (opkg / `.ipk`) 1. Download the `boot-{MACHINE}.tar.gz` archive for your machine type. There is no need to unzip it. @@ -32,15 +32,9 @@ to do this is offered as part of the rootfs install flow. ## Pre-5.0 to 5.x upgrade (zpkg → opkg) -Pre-5.0 PandAs use a legacy zpkg-based firmware format. To upgrade to a -5.x release: - -1. Download the legacy-updater package for your machine type from - [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases). - -2. Copy the updater package to a USB stick. -3. Insert the USB stick and follow the post-5.0 web-admin flow above, - selecting the legacy-updater file instead. +If your PandA is running a pre-5.0 release (zpkg-based), follow the +legacy upgrade path ({doc}`legacy-upgrade`) to move to a +5.x base image. ## Fresh SD card install From 36734f2e0e60282f1633e34ecf18cebed547f276 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Tue, 16 Jun 2026 15:59:16 +0100 Subject: [PATCH 30/49] increment tutorial numbers, and add a new tutorial 0 'getting started', combining some parts of quickstart and old tut 0 --- docs/tutorials/blinking_leds.md | 6 +- docs/tutorials/connecting_to_web_control | 104 ++++++++++++++++++++ docs/tutorials/getting_started.md | 115 +++++++---------------- docs/tutorials/position_capture.md | 4 +- docs/tutorials/position_compare.md | 2 +- docs/tutorials/snake_scan.md | 2 +- 6 files changed, 145 insertions(+), 88 deletions(-) create mode 100644 docs/tutorials/connecting_to_web_control diff --git a/docs/tutorials/blinking_leds.md b/docs/tutorials/blinking_leds.md index 5f4f50c1..2d75c137 100644 --- a/docs/tutorials/blinking_leds.md +++ b/docs/tutorials/blinking_leds.md @@ -1,4 +1,4 @@ -# Tutorial 1: Blinking LEDs +# Tutorial 2: Blinking LEDs This tutorial introduces the basics of PandABlocks: how to wire blocks together so that different LEDs flash at different rates. @@ -6,7 +6,7 @@ so that different LEDs flash at different rates. ## Prerequisites - A PandA powered on and reachable in your browser - (see {doc}`tutorial0_connecting_to_web_control`). + (see {doc}`connecting_to_web_control`). - The `template_tutorial1_leds` design saved on your PandA (pre-loaded on all standard PandA images). @@ -78,5 +78,5 @@ short pulses are visible. Front-panel LEDs behave similarly, capped at 10 Hz. You have loaded a saved design, inspected block parameters, and seen bit outputs connected to hardware TTL outputs via TTLOUT blocks. -Continue with {doc}`tutorial2_position_capture` to learn about position outputs +Continue with {doc}`position_capture` to learn about position outputs and data capture. diff --git a/docs/tutorials/connecting_to_web_control b/docs/tutorials/connecting_to_web_control new file mode 100644 index 00000000..93a2951f --- /dev/null +++ b/docs/tutorials/connecting_to_web_control @@ -0,0 +1,104 @@ +# Tutorial 1: Connecting to the PandA Web Control + +In this tutorial you will navigate to the PandA web control interface, +explore the block list, view block details, and open the layout panel. +By the end you will know how the main areas of the UI fit together and +be ready for the hands-on tutorials that follow. + +## Prerequisites + +- PandA is setup and have completed {doc}`getting_started`. +- Its IP address or hostname (e.g. `192.168.0.100` or `my-panda`). + +### 1. Open the web control + +In a browser navigate to: + +``` +http:/// +``` + +where `` is the IP address or hostname of your PandA. +You will see the initial screen: + +```{figure} ../images/webcontrol/starting-ui.png +:align: center + +The initial web control screen +``` + +### 2. Select the PANDA block + +The drop-down at the top of the page lists the root blocks available on +your PandA. Click it and choose **PANDA**: + +```{figure} ../images/webcontrol/block-list.png +:align: center + +Selecting the PANDA root block +``` + +### 3. View the block details + +After selecting PANDA, the left-hand panel loads that block's details — +attributes, groups, and methods: + +```{figure} ../images/webcontrol/PANDA-block-details.png +:align: center + +Details for the PANDA block +``` + +### 4. Open the layout + +Scroll down in the left-hand panel until you see the **Layout** attribute. +Click **Edit** to open the block layout in the centre panel: + +```{figure} ../images/webcontrol/layout-button.png +:align: center + +Click **Edit** in the Layout attribute row to open the layout panel +``` + +```{figure} ../images/webcontrol/PANDA-layout.png +:align: center + +The layout panel showing the functional blocks of the PandA +``` + +### 5. Rearrange blocks + +Drag blocks to new positions to suit your preference. +A brief spinner indicates that the updated position is being saved to the +hardware: + +```{figure} ../images/webcontrol/PANDA-layout-spread-out.png +:align: center + +Blocks dragged to new positions; clicking a block loads its details in the right-hand panel +``` + +Clicking any block in the layout loads its details in the right-hand panel +(the *child block* view). + +### 6. Wire two blocks together + +Click a port on one block and drag to a compatible port on another block +to create a signal link: + +```{figure} ../images/webcontrol/PANDA-new-link.png +:align: center + +Dragging between two ports to create a new link +``` + +Blocks can be wired in any combination to build up more complex +signal-processing designs. + +## Next steps + +You now know how to reach the web control, inspect block attributes, and +connect blocks together in the layout view. Continue with: + +- {doc}`blinking_leds` — drive some output bits and see real + hardware changes. \ No newline at end of file diff --git a/docs/tutorials/getting_started.md b/docs/tutorials/getting_started.md index e46f8b5a..23407134 100644 --- a/docs/tutorials/getting_started.md +++ b/docs/tutorials/getting_started.md @@ -1,112 +1,65 @@ -# Tutorial 0: Connecting to the PandA Web Control +# Tutorial 0: Getting Started -In this tutorial you will navigate to the PandA web control interface, -explore the block list, view block details, and open the layout panel. -By the end you will know how the main areas of the UI fit together and -be ready for the hands-on tutorials that follow. +In this tutorial you will setup your PandA; configure it so you can find it on the network, understand the web interface, and upgrade to the latest firmware. ## Prerequisites - A PandA that is powered on and connected to your network. -- Its IP address or hostname (e.g. `192.168.0.100` or `my-panda`). -:::{tip} -If your PandA is not on the network yet — fresh out of the box — start -with {doc}`../how-to/quickstart` to prepare an SD card and find it on the -network, then come back here. -::: +## Getting on the network -## Steps +By default the PandA uses DHCP — no configuration needed. Simply connect it +to your network and power it on. -### 1. Open the web control +If you need a static IP instead, see {doc}`setup-without-dhcp`. -In a browser navigate to: +Once it has an address, confirm it's reachable by navigating to: ``` http:/// ``` -where `` is the IP address or hostname of your PandA. -You will see the initial screen: +where `` is the IP address or hostname of your PandA, you should see the PandA web interface home page. -```{figure} ../images/webcontrol/starting-ui.png -:align: center - -The initial web control screen -``` - -### 2. Select the PANDA block - -The drop-down at the top of the page lists the root blocks available on -your PandA. Click it and choose **PANDA**: - -```{figure} ../images/webcontrol/block-list.png -:align: center - -Selecting the PANDA root block -``` - -### 3. View the block details - -After selecting PANDA, the left-hand panel loads that block's details — -attributes, groups, and methods: - -```{figure} ../images/webcontrol/PANDA-block-details.png -:align: center - -Details for the PANDA block -``` - -### 4. Open the layout - -Scroll down in the left-hand panel until you see the **Layout** attribute. -Click **Edit** to open the block layout in the centre panel: - -```{figure} ../images/webcontrol/layout-button.png -:align: center - -Click **Edit** in the Layout attribute row to open the layout panel -``` - -```{figure} ../images/webcontrol/PANDA-layout.png -:align: center - -The layout panel showing the functional blocks of the PandA -``` +## Web interface overview -### 5. Rearrange blocks +The home page has four sections: -Drag blocks to new positions to suit your preference. -A brief spinner indicates that the updated position is being saved to the -hardware: +- **Home** — summary of the web interface sections +- **Docs** — hardware, firmware and software documentation +- **Control** — the web control; wire functional blocks together, set parameters, + save and load designs (requires the web-control package to be installed) +- **Admin** — install packages from USB, manage SSH keys, and other remote + administration -```{figure} ../images/webcontrol/PANDA-layout-spread-out.png +```{figure} ../images/webcontrol/starting-ui.png :align: center -Blocks dragged to new positions; clicking a block loads its details in the right-hand panel +The initial web control screen ``` -Clicking any block in the layout loads its details in the right-hand panel -(the *child block* view). - -### 6. Wire two blocks together +## Upgrading the firmware -Click a port on one block and drag to a compatible port on another block -to create a signal link: +Make sure your PandA has the latest firmware. From the web admin page: -```{figure} ../images/webcontrol/PANDA-new-link.png -:align: center +1. Click **Admin** in the bottom banner. +2. Check your current version under **Version Information**. +3. Follow the relevant guide for your version: + - If your firmware is **pre-5.0** — see {doc}`legacy-upgrade`. + - If your firmware is **5.0 or later** and you want to upgrade via the web + admin interface — see {doc}`upgrade-via-web-admin`. + - If your firmware is **5.0 or later** and you want to upgrade via SSH — + see {doc}`upgrade-via-ssh`. -Dragging between two ports to create a new link -``` +## Troubleshooting -Blocks can be wired in any combination to build up more complex -signal-processing designs. +See {doc}`../reference/troubleshooting` for answers to common questions such as +configuring a static IP, disabling subnet validation, recovering from a +corrupted SD card, and overriding the FPGA bitstream variant. ## Next steps -You now know how to reach the web control, inspect block attributes, and -connect blocks together in the layout view. Continue with: +You have now setup your PandA and upgraded to the latest firmware. Continue with: -- {doc}`tutorial1_blinking_leds` — drive some output bits and see real +- {doc}`connecting_to_web_control` — drive some output bits and see real hardware changes. diff --git a/docs/tutorials/position_capture.md b/docs/tutorials/position_capture.md index 2b5739f7..bad9337b 100644 --- a/docs/tutorials/position_capture.md +++ b/docs/tutorials/position_capture.md @@ -1,4 +1,4 @@ -# Tutorial 2: Position Capture +# Tutorial 3: Position Capture This tutorial introduces the Position Capture (PCAP) interface of PandABlocks: how to provide trigger and gate signals that control when data is captured, and @@ -6,7 +6,7 @@ how to receive and interpret the captured stream. ## Prerequisites -- Completed {doc}`tutorial1_blinking_leds` or comfortable with the web control +- Completed {doc}`tutorial_blinking_leds` or comfortable with the web control layout view. - `nc` (netcat) or any TCP client available on your workstation. diff --git a/docs/tutorials/position_compare.md b/docs/tutorials/position_compare.md index 89573446..c113f01f 100644 --- a/docs/tutorials/position_compare.md +++ b/docs/tutorials/position_compare.md @@ -1,4 +1,4 @@ -# Position Compare +# Tutorial 4: Position Compare :::{admonition} 🚧 TODO — documentation stub :class: warning diff --git a/docs/tutorials/snake_scan.md b/docs/tutorials/snake_scan.md index 47aea1e6..66de2f12 100644 --- a/docs/tutorials/snake_scan.md +++ b/docs/tutorials/snake_scan.md @@ -1,4 +1,4 @@ -# Snake Scan +# Tutorial 5: Snake Scan :::{admonition} 🚧 TODO — documentation stub :class: warning From e523494fc9baea97efad55bc51751cfc8d2b68df Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Tue, 16 Jun 2026 16:15:09 +0100 Subject: [PATCH 31/49] update package name --- docs/how-to/legacy-upgrade.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/how-to/legacy-upgrade.md b/docs/how-to/legacy-upgrade.md index 652fefda..933fb872 100644 --- a/docs/how-to/legacy-upgrade.md +++ b/docs/how-to/legacy-upgrade.md @@ -14,11 +14,11 @@ Pre-5.0 PandAs use a legacy zpkg-based firmware format. To upgrade to a 5.x release: 1. Download the legacy-updater package. -2. Copy the updater package (legacyupdater@vesion.zpg) to a USB stick. +2. Copy the updater package `legacyupgrader@pandabox-{VERSION}.zpg`to a USB stick. 3. Insert the USB stick into the USB port on the back of the PandA. 4. Open a browser and navigate to `http:///`. 5. Click **Admin** in the bottom banner. 6. Note the current version shown in the Admin tab landing page. 7. Under **Admin Commands → Packages**, click **Install Packages from USB**. -8. Select the `legacyupgrader@pandabox-{VERSION}.zpg` file from the list and wait for the installaton to finish. +8. Select the `legacyupgrader@pandabox-{VERSION}.zpg` file from the list, click install, and wait for the installaton to finish. 9. Power-cycle the PandA; it will apply the new firmware on next boot. \ No newline at end of file From 24868aac1f7e52e907ab1447b8c3d40ddcefa229 Mon Sep 17 00:00:00 2001 From: Emilio Perez Juarez Date: Tue, 16 Jun 2026 16:42:07 +0100 Subject: [PATCH 32/49] docs: small corrections on several how-to documents --- docs/how-to/manual-build.md | 2 +- docs/how-to/quickstart.md | 2 +- docs/how-to/test-firmware-changes.md | 26 +++++++++++++++++++------- docs/how-to/upgrade-via-ssh.md | 9 +++------ docs/how-to/upgrade-via-web-admin.md | 6 ++---- docs/reference/machine-targets.md | 4 ++-- 6 files changed, 28 insertions(+), 21 deletions(-) diff --git a/docs/how-to/manual-build.md b/docs/how-to/manual-build.md index 2db258d5..6ab480e3 100644 --- a/docs/how-to/manual-build.md +++ b/docs/how-to/manual-build.md @@ -39,7 +39,7 @@ the Yocto host dependencies are not available on your system. 4. In `conf/local.conf` set: ```makefile - MACHINE = "pandabox" # or e.g. "xu5-st1" + MACHINE = "pandabox" # or e.g. "xu5 DISTRO = "panda-petalinux" ``` diff --git a/docs/how-to/quickstart.md b/docs/how-to/quickstart.md index 6494bcc9..e660a1ef 100644 --- a/docs/how-to/quickstart.md +++ b/docs/how-to/quickstart.md @@ -92,7 +92,7 @@ The Web Admin page provides the following functions: - **System** - Reboot / Restart - - Show `/var/log/messages` + - Show logs - Show Network Configuration - **Packages** - List Installed Packages diff --git a/docs/how-to/test-firmware-changes.md b/docs/how-to/test-firmware-changes.md index 96384fa0..baa3ff89 100644 --- a/docs/how-to/test-firmware-changes.md +++ b/docs/how-to/test-firmware-changes.md @@ -23,7 +23,16 @@ for the full test flow. To test changes against real hardware, use the Yocto `devtool` workflow inside the `kas` build container: -1. Open a shell in the `kas` container (see {doc}`build`). +1. Open a shell in the `kas` container: + + ```bash + KAS_MACHINE= kas-container --ssh-agent shell kas.yml + ``` + +:::{note} +Make sure there is disk space for the build files, an alternative build path +can be specified with the environment variable KAS\_WORK\_DIR. +::: 2. Use `devtool` to build an updated package in the Yocto workspace: @@ -31,20 +40,19 @@ the `kas` build container: devtool modify # make your changes in the workspace source tree devtool build - devtool build-image panda-image ``` 3. Deploy the built `.ipk` to the PandA: ```bash - scp tmp/deploy/ipk//.ipk root@:/tmp/ - ssh root@ opkg install /tmp/.ipk + devtool deploy-target root@ ``` 4. Restart the relevant service on the PandA: ```bash - ssh root@ systemctl restart pandablocks-server + ssh root@ systemctl daemon-reload + ssh root@ systemctl restart ``` 5. Test your changes on the live hardware. @@ -61,9 +69,13 @@ To test a custom FPGA bitstream: ```bash scp panda-fpga_.ipk root@:/tmp/ - ssh root@ opkg install /tmp/panda-fpga_.ipk + ssh root@ opkg install --force-reinstall /tmp/panda-fpga_.ipk ``` 3. Override the active bitstream if needed — see {doc}`choose-fpga-bitstream`. -4. Reboot the PandA to load the new bitstream. +4. Restart the relevant service: + + ```bash + ssh root@ systemctl restart panda-fpga + ``` diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md index 83ffe3c3..a74c5204 100644 --- a/docs/how-to/upgrade-via-ssh.md +++ b/docs/how-to/upgrade-via-ssh.md @@ -23,9 +23,9 @@ Download the `boot-{MACHINE}.tar.gz` release archive from extract it locally. Then copy the files to the PandA and reboot: ```bash -ssh root@ rm /boot/rootfs.squashfs +ssh root@ rm -f /boot/rootfs.squashfs scp boot-{MACHINE}/* root@:/boot -ssh root@ sync +ssh root@ 'sync; reboot' ``` The `/boot` directory on the PandA should contain: @@ -36,9 +36,6 @@ The `/boot` directory on the PandA should contain: - `rootfs.squashfs` - `target-defs` -Power-cycle the PandA; it will install the new rootfs on next boot. - - ## Pre-5.0 to 5.x upgrade (zpkg → opkg) @@ -70,7 +67,7 @@ hardware metadata. This is a permanent, one-time write: 3. Write the EEPROM: ```bash - ssh root@ /opt/bin/write_eeprom /tmp/ipmi_definition.ini + ssh root@ pandai2c-cli write /tmp/ipmi_definition.ini ``` The script reads back the EEPROM after writing to confirm the content diff --git a/docs/how-to/upgrade-via-web-admin.md b/docs/how-to/upgrade-via-web-admin.md index 70d69b99..5b170326 100644 --- a/docs/how-to/upgrade-via-web-admin.md +++ b/docs/how-to/upgrade-via-web-admin.md @@ -24,12 +24,10 @@ USB stick — no SSH or network file transfer required. :::{note} If you are installing a major rootfs upgrade it is recommended to uninstall -all installed zpkgs/ipkgs **before** upgrading. From PandA v4.0 an option -to do this is offered as part of the rootfs install flow. +all installed zpkgs/ipkgs **before** upgrading. An option to do this is offered +as part of the rootfs install flow. ::: -9. Power-cycle the PandA; it will apply the new rootfs on next boot. - ## Pre-5.0 to 5.x upgrade (zpkg → opkg) Pre-5.0 PandAs use a legacy zpkg-based firmware format. To upgrade to a diff --git a/docs/reference/machine-targets.md b/docs/reference/machine-targets.md index 66841070..e201dacf 100644 --- a/docs/reference/machine-targets.md +++ b/docs/reference/machine-targets.md @@ -6,10 +6,10 @@ manual builds) or via `KAS_MACHINE` (for kas builds). | MACHINE | Hardware | Notes | |---|---|---| -| `pandabox` | PandABox (default) | Zynq 7030; joint DLS/SOLEIL hardware; [Open Hardware](https://www.ohwr.org/projects/pandabox/wiki) | +| `pandabox` | PandABox (default) | Zynq 7030; joint DLS/SOLEIL hardware; [Open Hardware](https://gitlab.com/ohwr/project/pandabox/-/wikis/home) | | `pandabox2` | PandABox 2 | Successor to PandABox | | `pandabrick` | PandABrick | | -| `xu5-st1` | ZynqMP-based target (XU5 SoM) | Development only | +| `xu5` | XU5 SoM on the ST1 board | Development only | | `zedboard` | Zedboard | Development/testing platform | The generally supported machines are `pandabox`, `pandabox2` and `pandabrick`; From 92693b514bf58e92c6923c888e5ba36b9c207f79 Mon Sep 17 00:00:00 2001 From: Emilio Perez Juarez Date: Tue, 16 Jun 2026 16:56:26 +0100 Subject: [PATCH 33/49] docs: remove useless details from quickstart This is to fix conflics in a PR --- docs/how-to/quickstart.md | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/docs/how-to/quickstart.md b/docs/how-to/quickstart.md index e660a1ef..afe4295a 100644 --- a/docs/how-to/quickstart.md +++ b/docs/how-to/quickstart.md @@ -73,39 +73,3 @@ HOSTNAME = mypanda To make the USB settings permanent, use the **Show Network Configuration** function in the Web Admin interface (described below), which writes the settings back to `config.txt` on the SD card. - -## Web interface - -Once a PandA is on the network, navigate to its IP address or hostname in a -browser. The home page provides links to: - -- **Home** — summary of the web interface sections -- **Docs** — hardware, firmware and software documentation -- **Control** — the web control; wire functional blocks together, set parameters, - save and load designs (requires the web-control package to be installed) -- **Admin** — install packages from USB, manage SSH keys, and other remote - administration - -## Web Admin - -The Web Admin page provides the following functions: - -- **System** - - Reboot / Restart - - Show logs - - Show Network Configuration -- **Packages** - - List Installed Packages - - Install Packages from USB - - Install Rootfs from USB -- **SSH Keys** - - Show Authorised SSH Keys - - Append SSH keys from USB - -Visit the relevant Web Admin page for instructions on each operation. - -## Troubleshooting - -See {doc}`../reference/troubleshooting` for answers to common questions such as -configuring a static IP, disabling subnet validation, recovering from a -corrupted SD card, and overriding the FPGA bitstream variant. From bd42ca3547d371ab514ef52fa53019d1be9f0bb4 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Wed, 17 Jun 2026 11:22:46 +0100 Subject: [PATCH 34/49] add missing file extension --- .../{connecting_to_web_control => connecting_to_web_control.md} | 0 docs/tutorials/getting_started.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/tutorials/{connecting_to_web_control => connecting_to_web_control.md} (100%) diff --git a/docs/tutorials/connecting_to_web_control b/docs/tutorials/connecting_to_web_control.md similarity index 100% rename from docs/tutorials/connecting_to_web_control rename to docs/tutorials/connecting_to_web_control.md diff --git a/docs/tutorials/getting_started.md b/docs/tutorials/getting_started.md index 23407134..2bd27d1b 100644 --- a/docs/tutorials/getting_started.md +++ b/docs/tutorials/getting_started.md @@ -45,7 +45,7 @@ Make sure your PandA has the latest firmware. From the web admin page: 1. Click **Admin** in the bottom banner. 2. Check your current version under **Version Information**. 3. Follow the relevant guide for your version: - - If your firmware is **pre-5.0** — see {doc}`legacy-upgrade`. + - If your firmware is **pre-5.0** — see {doc}`how-to/legacy-upgrade`. - If your firmware is **5.0 or later** and you want to upgrade via the web admin interface — see {doc}`upgrade-via-web-admin`. - If your firmware is **5.0 or later** and you want to upgrade via SSH — From b34989fd931d8f24af5af2fa0762eedf4d57b980 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Wed, 17 Jun 2026 11:23:09 +0100 Subject: [PATCH 35/49] update tutorial links in myst.yml --- docs/myst.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/myst.yml b/docs/myst.yml index 1d521505..a2aa8842 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -24,11 +24,12 @@ project: - file: index.md - file: tutorials.md children: - - file: tutorials/tutorial0_connecting_to_web_control.md - - file: tutorials/tutorial1_blinking_leds.md - - file: tutorials/tutorial2_position_capture.md - - file: tutorials/tutorial3_position_compare.md - - file: tutorials/tutorial4_snake_scan.md + - file: tutorials/getting_started.md + - file: tutorials/connecting_to_web_control.md + - file: tutorials/blinking_leds.md + - file: tutorials/position_capture.md + - file: tutorials/position_compare.md + - file: tutorials/snake_scan.md - file: how-to.md children: # Using a PandA From b1dfefebdd539ce4f53673c676056eb0d91627f8 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Wed, 17 Jun 2026 11:56:21 +0100 Subject: [PATCH 36/49] updated dead links to markdown doc links --- docs/tutorials/getting_started.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/tutorials/getting_started.md b/docs/tutorials/getting_started.md index 2bd27d1b..e370cf13 100644 --- a/docs/tutorials/getting_started.md +++ b/docs/tutorials/getting_started.md @@ -11,7 +11,7 @@ In this tutorial you will setup your PandA; configure it so you can find it on t By default the PandA uses DHCP — no configuration needed. Simply connect it to your network and power it on. -If you need a static IP instead, see {doc}`setup-without-dhcp`. +If you need a static IP instead, see [](../how-to/setup-without-dhcp.md). Once it has an address, confirm it's reachable by navigating to: @@ -45,15 +45,15 @@ Make sure your PandA has the latest firmware. From the web admin page: 1. Click **Admin** in the bottom banner. 2. Check your current version under **Version Information**. 3. Follow the relevant guide for your version: - - If your firmware is **pre-5.0** — see {doc}`how-to/legacy-upgrade`. + - If your firmware is **pre-5.0** — see [](../how-to/legacy-upgrade.md). - If your firmware is **5.0 or later** and you want to upgrade via the web - admin interface — see {doc}`upgrade-via-web-admin`. + admin interface — see [](../how-to/upgrade-via-web-admin.md). - If your firmware is **5.0 or later** and you want to upgrade via SSH — - see {doc}`upgrade-via-ssh`. + see [](../how-to/upgrade-via-ssh.md). ## Troubleshooting -See {doc}`../reference/troubleshooting` for answers to common questions such as +See [](../reference/troubleshooting.md) for answers to common questions such as configuring a static IP, disabling subnet validation, recovering from a corrupted SD card, and overriding the FPGA bitstream variant. @@ -61,5 +61,5 @@ corrupted SD card, and overriding the FPGA bitstream variant. You have now setup your PandA and upgraded to the latest firmware. Continue with: -- {doc}`connecting_to_web_control` — drive some output bits and see real +- [](../how-to/connecting_to_web_control.md) — drive some output bits and see real hardware changes. From 42934949239832e4320473b6f9703c4259049d02 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Wed, 17 Jun 2026 12:01:34 +0100 Subject: [PATCH 37/49] change power cycle reccomendation to web interface reboot --- docs/how-to/legacy-upgrade.md | 2 +- docs/how-to/upgrade-via-web-admin.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/how-to/legacy-upgrade.md b/docs/how-to/legacy-upgrade.md index 933fb872..b0e7e81d 100644 --- a/docs/how-to/legacy-upgrade.md +++ b/docs/how-to/legacy-upgrade.md @@ -21,4 +21,4 @@ Pre-5.0 PandAs use a legacy zpkg-based firmware format. To upgrade to a 6. Note the current version shown in the Admin tab landing page. 7. Under **Admin Commands → Packages**, click **Install Packages from USB**. 8. Select the `legacyupgrader@pandabox-{VERSION}.zpg` file from the list, click install, and wait for the installaton to finish. -9. Power-cycle the PandA; it will apply the new firmware on next boot. \ No newline at end of file +9. Under **Admin Commands → System → Reboot/Restart**, click **Reboot Now** to restart the PandA; it will apply the new firmware on next boot. \ No newline at end of file diff --git a/docs/how-to/upgrade-via-web-admin.md b/docs/how-to/upgrade-via-web-admin.md index 40e30664..6cd8c60b 100644 --- a/docs/how-to/upgrade-via-web-admin.md +++ b/docs/how-to/upgrade-via-web-admin.md @@ -28,7 +28,7 @@ all installed zpkgs/ipkgs **before** upgrading. From PandA v4.0 an option to do this is offered as part of the rootfs install flow. ::: -9. Power-cycle the PandA; it will apply the new rootfs on next boot. +9. Under **Admin Commands → System → Reboot/Restart**, click **Reboot Now** to restart the PandA; it will apply the new rootfs on next boot. ## Pre-5.0 to 5.x upgrade (zpkg → opkg) From fb92c263c8a290b86e51d985f3ce133f9611fff0 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Wed, 17 Jun 2026 12:05:59 +0100 Subject: [PATCH 38/49] updated upgrade guide links to markdown doc links --- docs/how-to/upgrade-via-ssh.md | 2 +- docs/how-to/upgrade-via-web-admin.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md index 42f53093..54d00088 100644 --- a/docs/how-to/upgrade-via-ssh.md +++ b/docs/how-to/upgrade-via-ssh.md @@ -43,7 +43,7 @@ Power-cycle the PandA; it will install the new rootfs on next boot. ## Pre-5.0 to 5.x upgrade (zpkg → opkg) If your PandA is running a pre-5.0 release (zpkg-based), follow the -legacy upgrade path first ({doc}`legacy-upgrade`) to move to a +legacy upgrade path first ([](legacy-upgrade.md)) to move to a 5.x base image before attempting SSH-based updates. ## Update the 24V FMC EEPROM (DLS-specific, one-time) diff --git a/docs/how-to/upgrade-via-web-admin.md b/docs/how-to/upgrade-via-web-admin.md index 6cd8c60b..161549ad 100644 --- a/docs/how-to/upgrade-via-web-admin.md +++ b/docs/how-to/upgrade-via-web-admin.md @@ -33,7 +33,7 @@ to do this is offered as part of the rootfs install flow. ## Pre-5.0 to 5.x upgrade (zpkg → opkg) If your PandA is running a pre-5.0 release (zpkg-based), follow the -legacy upgrade path ({doc}`legacy-upgrade`) to move to a +legacy upgrade path ([](legacy-upgrade.md)) to move to a 5.x base image. ## Fresh SD card install From dd734c5b937646b3f4e0bef076930d26f93ffdee Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Wed, 17 Jun 2026 12:42:36 +0100 Subject: [PATCH 39/49] change power cycle reccomendation to web interface reboot --- docs/how-to/upgrade-via-ssh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md index 54d00088..60712492 100644 --- a/docs/how-to/upgrade-via-ssh.md +++ b/docs/how-to/upgrade-via-ssh.md @@ -36,7 +36,7 @@ The `/boot` directory on the PandA should contain: - `rootfs.squashfs` - `target-defs` -Power-cycle the PandA; it will install the new rootfs on next boot. +Under **Admin Commands → System → Reboot/Restart**, click **Reboot Now** to restart the PandA; it will apply the new rootfs on next boot. From 81fbf5de04294d1fa90d18231a793d43cce88381 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Wed, 17 Jun 2026 13:07:04 +0100 Subject: [PATCH 40/49] remove legacy upgrade (reintegrated with other upgrade how tos --- docs/how-to/legacy-upgrade.md | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 docs/how-to/legacy-upgrade.md diff --git a/docs/how-to/legacy-upgrade.md b/docs/how-to/legacy-upgrade.md deleted file mode 100644 index b0e7e81d..00000000 --- a/docs/how-to/legacy-upgrade.md +++ /dev/null @@ -1,24 +0,0 @@ -# Upgrading a PandA - Pre-5.0 to 5.x -The Web Admin interface lets you upgrade a PandA using only a browser and a -USB stick — no SSH or network file transfer required. - -## Prerequisites - -- Physical access to the PandA (to insert a USB stick). -- the legacy-updater package from - [GitHub Releases](https://github.com/PandABlocks/meta-panda/releases). - -## Upgrade procedure (zpkg → opkg) - -Pre-5.0 PandAs use a legacy zpkg-based firmware format. To upgrade to a -5.x release: - -1. Download the legacy-updater package. -2. Copy the updater package `legacyupgrader@pandabox-{VERSION}.zpg`to a USB stick. -3. Insert the USB stick into the USB port on the back of the PandA. -4. Open a browser and navigate to `http:///`. -5. Click **Admin** in the bottom banner. -6. Note the current version shown in the Admin tab landing page. -7. Under **Admin Commands → Packages**, click **Install Packages from USB**. -8. Select the `legacyupgrader@pandabox-{VERSION}.zpg` file from the list, click install, and wait for the installaton to finish. -9. Under **Admin Commands → System → Reboot/Restart**, click **Reboot Now** to restart the PandA; it will apply the new firmware on next boot. \ No newline at end of file From a5b280481f451019ebf2c57165295b55d4c199a9 Mon Sep 17 00:00:00 2001 From: Tom Kane Date: Wed, 17 Jun 2026 13:08:15 +0100 Subject: [PATCH 41/49] fixed firmware upgrade guide --- docs/tutorials/getting_started.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/tutorials/getting_started.md b/docs/tutorials/getting_started.md index e370cf13..1130978b 100644 --- a/docs/tutorials/getting_started.md +++ b/docs/tutorials/getting_started.md @@ -44,12 +44,9 @@ Make sure your PandA has the latest firmware. From the web admin page: 1. Click **Admin** in the bottom banner. 2. Check your current version under **Version Information**. -3. Follow the relevant guide for your version: - - If your firmware is **pre-5.0** — see [](../how-to/legacy-upgrade.md). - - If your firmware is **5.0 or later** and you want to upgrade via the web - admin interface — see [](../how-to/upgrade-via-web-admin.md). - - If your firmware is **5.0 or later** and you want to upgrade via SSH — - see [](../how-to/upgrade-via-ssh.md). +3. If your PandA needs upgrading you can do so with one of the following guides. Make sure to check whether you are need to follow instructions under **pre-5.0 to 5.x** or **5.0 or later to 5.x**: + - If you want to upgrade via the web admin interface — see [](../how-to/upgrade-via-web-admin.md). + - If you want to upgrade via SSH — see [](../how-to/upgrade-via-ssh.md). ## Troubleshooting From ece4ac89405c60e3698582a28062e0ff50d78f0b Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 18 Jun 2026 08:36:56 +0000 Subject: [PATCH 42/49] docs: cross-repo xref links and folder-hierarchy URLs - myst.yml: enable folder-qualified page URLs (site.options.folders: true) and turn on the PandABlocks-FPGA / PandABlocks-server xref references (interim /docs targets; -> /stable later). - Convert cross-project http links to xref: the PandABlocks-server commands reference and the PandABlocks-client landing-page links. Cross-repo inventories only resolve once each repo's docs branch is pushed with folders enabled. Co-Authored-By: Claude Opus 4.8 --- docs/explanations/architecture.md | 10 +++++----- docs/how-to/integrate-with-a-panda.md | 7 +++---- docs/myst.yml | 20 ++++++++++++-------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/docs/explanations/architecture.md b/docs/explanations/architecture.md index 823b1bcf..7bb1c350 100644 --- a/docs/explanations/architecture.md +++ b/docs/explanations/architecture.md @@ -28,16 +28,16 @@ Several client layers build on the TCP interface: | Layer | Repo | Use case | |---|---|---| | Direct TCP | — | Low-level scripting, quick checks | -| Python client | [PandABlocks-client](https://pandablocks.github.io/PandABlocks-client/main/) | Python applications; preferred for new integrations | +| Python client | [PandABlocks-client](xref:PandABlocks-client) | Python applications; preferred for new integrations | | EPICS / Tango | [fastcs-PandABlocks](https://github.com/DiamondLightSource/fastcs-PandABlocks) | Control-system integrations | -See {doc}`../how-to/integrate-with-a-panda` for step-by-step instructions. +See [](../how-to/integrate-with-a-panda.md) for step-by-step instructions. ### Firmware build (meta-panda) The Yocto layer in this repository assembles the firmware image: it pulls the rootfs, server, FPGA bitstreams and web-control packages together into a -bootable SD card image (see {doc}`../how-to/build`). +bootable SD card image (see [](../how-to/build.md)). ## Data flow @@ -63,5 +63,5 @@ PandABlocks-client. ## Hardware targets PandABlocks firmware runs on several Zynq-based hardware platforms — see -{doc}`hardware-targets` for per-target descriptions and -{doc}`../reference/machine-targets` for the `MACHINE` build strings. +[](hardware-targets.md) for per-target descriptions and +[](../reference/machine-targets.md) for the `MACHINE` build strings. diff --git a/docs/how-to/integrate-with-a-panda.md b/docs/how-to/integrate-with-a-panda.md index f5c3b14d..09c96250 100644 --- a/docs/how-to/integrate-with-a-panda.md +++ b/docs/how-to/integrate-with-a-panda.md @@ -18,9 +18,8 @@ nc 8888 ``` See the -[PandABlocks-server commands reference](https://pandablocks.github.io/PandABlocks-server/main/reference/commands.html) +[PandABlocks-server commands reference](xref:PandABlocks-server/reference/commands) for the command syntax. -. Connect to port 8889 for the data capture stream: @@ -34,7 +33,7 @@ via port 8888), data streams until you disarm. See ## Python client (`PandABlocks-client`) -[PandABlocks-client](https://pandablocks.github.io/PandABlocks-client/main/) +[PandABlocks-client](xref:PandABlocks-client) provides both a blocking and an asyncio client. Install: @@ -59,7 +58,7 @@ with BlockingClient("my-panda") as client: PandABlocks-client includes helpers to read the binary capture stream and write it to HDF5 or convert it to numpy arrays. See the -[PandABlocks-client documentation](https://pandablocks.github.io/PandABlocks-client/main/) +[PandABlocks-client documentation](xref:PandABlocks-client) for the `PcapHdf5Writer` and related utilities. ## EPICS and Tango via `fastcs-PandABlocks` diff --git a/docs/myst.yml b/docs/myst.yml index 1d521505..ee2186c7 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -12,14 +12,15 @@ project: # PandABlocks-client (Sphinx) is deployed today — used by the Stage A xref probe # in how-to/integrate-with-a-panda. Resolves via its objects.inv. PandABlocks-client: https://pandablocks.github.io/PandABlocks-client/main - # The remaining targets are not deployed yet, so their inventories cannot be - # fetched at build time. They are kept here (commented) as the complete prototype - # wiring to uncomment in Stage F once each repo's `docs` branch publishes, and to - # upstream into the python-copier-template. Keys/format are settled; only the - # live fetch is pending. - # PandABlocks-FPGA: https://pandablocks.github.io/PandABlocks-FPGA/main - # PandABlocks-server: https://pandablocks.github.io/PandABlocks-server - # fastcs-PandABlocks: https://diamondlightsource.github.io/fastcs-PandABlocks/main + # The sibling MyST repos are mid-docs-migration: each base points at the repo's + # `docs`-branch build and the inventory is fetched from `/docs/myst.xref.json` + # (and `/docs/objects.inv`). These only resolve once each repo's `docs` + # branch has been pushed with folder-hierarchy URLs (`site.options.folders: true`). + # Switch the bases to `/stable` once releases + the switcher action land. + PandABlocks-FPGA: https://pandablocks.github.io/PandABlocks-FPGA/docs + PandABlocks-server: https://pandablocks.github.io/PandABlocks-server/docs + # Not deployed yet — kept commented (interim /docs target; -> /stable later). + # fastcs-PandABlocks: https://diamondlightsource.github.io/fastcs-PandABlocks/docs toc: - file: index.md - file: tutorials.md @@ -79,5 +80,8 @@ site: - title: Reference url: /reference options: + # Output page URLs by folder, e.g. /how-to/quickstart rather than the default + # flattened /quickstart. Keeps cross-repo xref target paths folder-qualified. + folders: true logo: images/PandA-logo-for-black-background.svg github_url: https://github.com/PandABlocks/meta-panda From e08ef3e2123fb822ff077a63e2290b5bdb528de2 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 18 Jun 2026 10:33:38 +0000 Subject: [PATCH 43/49] docs: convert internal {doc} roles to markdown links Replace Sphinx `{doc}` cross-references with native MyST markdown links ([](path.md)) for intra-repo page links across tutorials, how-to, explanations and reference pages. Co-Authored-By: Claude Opus 4.8 --- docs/explanations/understanding-attribute-state.md | 4 ++-- docs/explanations/web-control-ui-overview.md | 2 +- docs/how-to/choose-fpga-bitstream.md | 2 +- docs/how-to/manual-build.md | 4 ++-- docs/how-to/quickstart.md | 2 +- docs/how-to/save-restore-design.md | 2 +- docs/how-to/test-firmware-changes.md | 4 ++-- docs/how-to/upgrade-via-ssh.md | 2 +- docs/how-to/upgrade-via-web-admin.md | 2 +- docs/how-to/use-web-control-to-set-up-a-panda.md | 2 +- docs/reference/machine-targets.md | 2 +- docs/reference/opkg.md | 2 +- docs/reference/troubleshooting.md | 4 ++-- docs/tutorials.md | 2 +- docs/tutorials/tutorial0_connecting_to_web_control.md | 4 ++-- docs/tutorials/tutorial1_blinking_leds.md | 4 ++-- docs/tutorials/tutorial2_position_capture.md | 4 ++-- 17 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/explanations/understanding-attribute-state.md b/docs/explanations/understanding-attribute-state.md index 0b806f32..720827fd 100644 --- a/docs/explanations/understanding-attribute-state.md +++ b/docs/explanations/understanding-attribute-state.md @@ -118,11 +118,11 @@ Within Block Information Panels, the state icon appears to the left of each attribute name. When viewing historical data in the -{doc}`attribute value table <../how-to/monitor-attribute-values>`, +[attribute value table](../how-to/monitor-attribute-values.md), the corresponding icon is shown against each row. When viewing historical data in the -{doc}`attribute chart <../how-to/monitor-attribute-values>`, +[attribute chart](../how-to/monitor-attribute-values.md), the line colour reflects the alarm state. :::{note} diff --git a/docs/explanations/web-control-ui-overview.md b/docs/explanations/web-control-ui-overview.md index 6e165dc6..95a488a6 100644 --- a/docs/explanations/web-control-ui-overview.md +++ b/docs/explanations/web-control-ui-overview.md @@ -60,7 +60,7 @@ either panel: The **central panel** shows the attribute's value over time as either: - **Plot** — an interactive line chart (pan, zoom, export). See - {doc}`../how-to/monitor-attribute-values` for chart controls. + [](../how-to/monitor-attribute-values.md) for chart controls. - **Table** — a time-ordered list of value changes. ```{figure} ../images/webcontrol/attribute_view_chart.png diff --git a/docs/how-to/choose-fpga-bitstream.md b/docs/how-to/choose-fpga-bitstream.md index abf0bdc3..097adf81 100644 --- a/docs/how-to/choose-fpga-bitstream.md +++ b/docs/how-to/choose-fpga-bitstream.md @@ -38,7 +38,7 @@ To override without opening the PandA, add `APP=` to APP = pandabox-fmc-acq430 ``` -See {doc}`quickstart` for full details of the USB override mechanism. +See [](quickstart.md) for full details of the USB override mechanism. ## Installing a new bitstream package diff --git a/docs/how-to/manual-build.md b/docs/how-to/manual-build.md index 2db258d5..576c4bfe 100644 --- a/docs/how-to/manual-build.md +++ b/docs/how-to/manual-build.md @@ -2,7 +2,7 @@ :::{note} This page describes a manual Yocto build without `kas-container`. For the -recommended approach see {doc}`build`. +recommended approach see [](build.md). ::: The steps below can be run inside a Docker container (e.g. the `kas` image) if @@ -59,4 +59,4 @@ the Yocto host dependencies are not available on your system. zip boot-pandabox.zip boot/* ``` -See {doc}`build` for a description of each output file. +See [](build.md) for a description of each output file. diff --git a/docs/how-to/quickstart.md b/docs/how-to/quickstart.md index 6494bcc9..e8174968 100644 --- a/docs/how-to/quickstart.md +++ b/docs/how-to/quickstart.md @@ -106,6 +106,6 @@ Visit the relevant Web Admin page for instructions on each operation. ## Troubleshooting -See {doc}`../reference/troubleshooting` for answers to common questions such as +See [](../reference/troubleshooting.md) for answers to common questions such as configuring a static IP, disabling subnet validation, recovering from a corrupted SD card, and overriding the FPGA bitstream variant. diff --git a/docs/how-to/save-restore-design.md b/docs/how-to/save-restore-design.md index 51066bfc..5dc89ac3 100644 --- a/docs/how-to/save-restore-design.md +++ b/docs/how-to/save-restore-design.md @@ -3,7 +3,7 @@ A {term}`Design` can be saved to a {term}`Parent Block` and reopened later. This page covers saving the current design and opening an existing one. To build or edit a design, see -{doc}`use-web-control-to-set-up-a-panda`. +[](use-web-control-to-set-up-a-panda.md). :::{tip} Saving a design saves only attributes already in the **server** state — locally diff --git a/docs/how-to/test-firmware-changes.md b/docs/how-to/test-firmware-changes.md index 96384fa0..769f15f5 100644 --- a/docs/how-to/test-firmware-changes.md +++ b/docs/how-to/test-firmware-changes.md @@ -23,7 +23,7 @@ for the full test flow. To test changes against real hardware, use the Yocto `devtool` workflow inside the `kas` build container: -1. Open a shell in the `kas` container (see {doc}`build`). +1. Open a shell in the `kas` container (see [](build.md)). 2. Use `devtool` to build an updated package in the Yocto workspace: @@ -64,6 +64,6 @@ To test a custom FPGA bitstream: ssh root@ opkg install /tmp/panda-fpga_.ipk ``` -3. Override the active bitstream if needed — see {doc}`choose-fpga-bitstream`. +3. Override the active bitstream if needed — see [](choose-fpga-bitstream.md). 4. Reboot the PandA to load the new bitstream. diff --git a/docs/how-to/upgrade-via-ssh.md b/docs/how-to/upgrade-via-ssh.md index 83ffe3c3..05e1e0df 100644 --- a/docs/how-to/upgrade-via-ssh.md +++ b/docs/how-to/upgrade-via-ssh.md @@ -43,7 +43,7 @@ Power-cycle the PandA; it will install the new rootfs on next boot. ## Pre-5.0 to 5.x upgrade (zpkg → opkg) If your PandA is running a pre-5.0 release (zpkg-based), follow the -web-admin upgrade path first ({doc}`upgrade-via-web-admin`) to move to a +web-admin upgrade path first ([](upgrade-via-web-admin.md)) to move to a 5.x base image before attempting SSH-based updates. ## Update the 24V FMC EEPROM (DLS-specific, one-time) diff --git a/docs/how-to/upgrade-via-web-admin.md b/docs/how-to/upgrade-via-web-admin.md index 70d69b99..79c38037 100644 --- a/docs/how-to/upgrade-via-web-admin.md +++ b/docs/how-to/upgrade-via-web-admin.md @@ -52,5 +52,5 @@ install from a fresh SD card: 2. Extract the archive and copy all files to a freshly formatted SD card (FAT32). 3. Optionally add a `config.txt` with network settings - (see {doc}`quickstart`). + (see [](quickstart.md)). 4. Insert the SD card into the PandA and power on. diff --git a/docs/how-to/use-web-control-to-set-up-a-panda.md b/docs/how-to/use-web-control-to-set-up-a-panda.md index 2b502945..b790a791 100644 --- a/docs/how-to/use-web-control-to-set-up-a-panda.md +++ b/docs/how-to/use-web-control-to-set-up-a-panda.md @@ -108,7 +108,7 @@ right-hand panel. It displays: - The fully qualified path to the attribute, uniquely identifying it within the design. - Basic metadata: its type, a brief description, and whether it is writeable. -- The {doc}`attribute state <../explanations/understanding-attribute-state>`, +- The [attribute state](../explanations/understanding-attribute-state.md), including the severity of any issue and any corresponding message. - Timestamp details showing when the attribute was last updated. diff --git a/docs/reference/machine-targets.md b/docs/reference/machine-targets.md index 66841070..4f0e70af 100644 --- a/docs/reference/machine-targets.md +++ b/docs/reference/machine-targets.md @@ -20,4 +20,4 @@ The generally supported machines are `pandabox`, `pandabox2` and `pandabrick`; ::: Per-target hardware descriptions (SoC, expansion connectors, FMC slots, -notable capabilities) are in {doc}`../explanations/hardware-targets`. +notable capabilities) are in [](../explanations/hardware-targets.md). diff --git a/docs/reference/opkg.md b/docs/reference/opkg.md index 80f89047..f9ce8c8f 100644 --- a/docs/reference/opkg.md +++ b/docs/reference/opkg.md @@ -11,4 +11,4 @@ package manager used on PandA. | `opkg files ...` | Show files belonging to named packages | | `opkg help` | Show all available options | -For a step-by-step guide to installing packages see {doc}`../how-to/packages`. +For a step-by-step guide to installing packages see [](../how-to/packages.md). diff --git a/docs/reference/troubleshooting.md b/docs/reference/troubleshooting.md index b5f3f6c4..a76da618 100644 --- a/docs/reference/troubleshooting.md +++ b/docs/reference/troubleshooting.md @@ -14,7 +14,7 @@ GATEWAY = 192.168.0.254 HOSTNAME = mypanda ``` -See {doc}`../how-to/quickstart` for the full `config.txt` format and the USB +See [](../how-to/quickstart.md) for the full `config.txt` format and the USB override mechanism (no SD card access required). ### How do I disable subnet validation in the web control? @@ -63,5 +63,5 @@ APP = pandabox-fmc-acq430 ``` This takes effect only if the corresponding FPGA variant package is installed. -See {doc}`../how-to/choose-fpga-bitstream` for the full bitstream selection +See [](../how-to/choose-fpga-bitstream.md) for the full bitstream selection mechanism. diff --git a/docs/tutorials.md b/docs/tutorials.md index e5709787..4a213d11 100644 --- a/docs/tutorials.md +++ b/docs/tutorials.md @@ -3,7 +3,7 @@ Tutorials for installation and typical usage. New users start here. If your PandA is not yet on the network, follow -{doc}`how-to/quickstart` first, then begin with Tutorial 0. +[](how-to/quickstart.md) first, then begin with Tutorial 0. ```{toc} :context: children diff --git a/docs/tutorials/tutorial0_connecting_to_web_control.md b/docs/tutorials/tutorial0_connecting_to_web_control.md index e46f8b5a..964c92f2 100644 --- a/docs/tutorials/tutorial0_connecting_to_web_control.md +++ b/docs/tutorials/tutorial0_connecting_to_web_control.md @@ -12,7 +12,7 @@ be ready for the hands-on tutorials that follow. :::{tip} If your PandA is not on the network yet — fresh out of the box — start -with {doc}`../how-to/quickstart` to prepare an SD card and find it on the +with [](../how-to/quickstart.md) to prepare an SD card and find it on the network, then come back here. ::: @@ -108,5 +108,5 @@ signal-processing designs. You now know how to reach the web control, inspect block attributes, and connect blocks together in the layout view. Continue with: -- {doc}`tutorial1_blinking_leds` — drive some output bits and see real +- [](tutorial1_blinking_leds.md) — drive some output bits and see real hardware changes. diff --git a/docs/tutorials/tutorial1_blinking_leds.md b/docs/tutorials/tutorial1_blinking_leds.md index 5f4f50c1..9e2fe6cb 100644 --- a/docs/tutorials/tutorial1_blinking_leds.md +++ b/docs/tutorials/tutorial1_blinking_leds.md @@ -6,7 +6,7 @@ so that different LEDs flash at different rates. ## Prerequisites - A PandA powered on and reachable in your browser - (see {doc}`tutorial0_connecting_to_web_control`). + (see [](tutorial0_connecting_to_web_control.md)). - The `template_tutorial1_leds` design saved on your PandA (pre-loaded on all standard PandA images). @@ -78,5 +78,5 @@ short pulses are visible. Front-panel LEDs behave similarly, capped at 10 Hz. You have loaded a saved design, inspected block parameters, and seen bit outputs connected to hardware TTL outputs via TTLOUT blocks. -Continue with {doc}`tutorial2_position_capture` to learn about position outputs +Continue with [](tutorial2_position_capture.md) to learn about position outputs and data capture. diff --git a/docs/tutorials/tutorial2_position_capture.md b/docs/tutorials/tutorial2_position_capture.md index 2b5739f7..798edced 100644 --- a/docs/tutorials/tutorial2_position_capture.md +++ b/docs/tutorials/tutorial2_position_capture.md @@ -6,7 +6,7 @@ how to receive and interpret the captured stream. ## Prerequisites -- Completed {doc}`tutorial1_blinking_leds` or comfortable with the web control +- Completed [](tutorial1_blinking_leds.md) or comfortable with the web control layout view. - `nc` (netcat) or any TCP client available on your workstation. @@ -220,6 +220,6 @@ position over a detector frame. You have used the PCAP interface to capture position data with different capture modes (Value, Diff, Min/Max/Mean), and received the ASCII stream over TCP. -The next tutorial ({doc}`tutorial3_position_compare`) covers position compare — +The next tutorial ([](tutorial3_position_compare.md)) covers position compare — generating triggers automatically when an encoder reaches a set of target positions. From 77927630c4cb790745e1b299bc75fbce73a96d5b Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 18 Jun 2026 10:46:59 +0000 Subject: [PATCH 44/49] docs: fix references to renamed tutorial/how-to pages The docs restructure renamed several pages but left dangling references: - how-to/quickstart -> how-to/setup-without-dhcp (toc + 4 links) - tutorials/tutorial2_position_capture -> tutorials/position_capture - {doc}`tutorial3_position_compare` -> {doc}`position_compare` - {doc}`tutorial_blinking_leds` -> {doc}`blinking_leds` - getting_started "next steps" link pointed at how-to/ instead of tutorials/ All internal .md and {doc} links in docs now resolve. Co-Authored-By: Claude Opus 4.8 --- docs/how-to/choose-fpga-bitstream.md | 2 +- docs/how-to/integrate-with-a-panda.md | 2 +- docs/how-to/upgrade-via-web-admin.md | 2 +- docs/myst.yml | 2 +- docs/reference/troubleshooting.md | 2 +- docs/tutorials.md | 2 +- docs/tutorials/getting_started.md | 2 +- docs/tutorials/position_capture.md | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/how-to/choose-fpga-bitstream.md b/docs/how-to/choose-fpga-bitstream.md index 097adf81..f6b3ae24 100644 --- a/docs/how-to/choose-fpga-bitstream.md +++ b/docs/how-to/choose-fpga-bitstream.md @@ -38,7 +38,7 @@ To override without opening the PandA, add `APP=` to APP = pandabox-fmc-acq430 ``` -See [](quickstart.md) for full details of the USB override mechanism. +See [](setup-without-dhcp.md) for full details of the USB override mechanism. ## Installing a new bitstream package diff --git a/docs/how-to/integrate-with-a-panda.md b/docs/how-to/integrate-with-a-panda.md index 09c96250..d8edb1e7 100644 --- a/docs/how-to/integrate-with-a-panda.md +++ b/docs/how-to/integrate-with-a-panda.md @@ -29,7 +29,7 @@ nc 8889 Press Return; you will see `OK`. After arming PCAP (in the web control or via port 8888), data streams until you disarm. See -[Tutorial 2](../tutorials/tutorial2_position_capture.md) for a worked example. +[Tutorial 2](../tutorials/position_capture.md) for a worked example. ## Python client (`PandABlocks-client`) diff --git a/docs/how-to/upgrade-via-web-admin.md b/docs/how-to/upgrade-via-web-admin.md index 5c2c2df3..f44aa65c 100644 --- a/docs/how-to/upgrade-via-web-admin.md +++ b/docs/how-to/upgrade-via-web-admin.md @@ -55,5 +55,5 @@ install from a fresh SD card: 2. Extract the archive and copy all files to a freshly formatted SD card (FAT32). 3. Optionally add a `config.txt` with network settings - (see [](quickstart.md)). + (see [](setup-without-dhcp.md)). 4. Insert the SD card into the PandA and power on. diff --git a/docs/myst.yml b/docs/myst.yml index e0bff5a3..c995de7b 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -34,7 +34,7 @@ project: - file: how-to.md children: # Using a PandA - - file: how-to/quickstart.md + - file: how-to/setup-without-dhcp.md - file: how-to/use-web-control-to-set-up-a-panda.md - file: how-to/save-restore-design.md - file: how-to/monitor-attribute-values.md diff --git a/docs/reference/troubleshooting.md b/docs/reference/troubleshooting.md index a76da618..c6f48611 100644 --- a/docs/reference/troubleshooting.md +++ b/docs/reference/troubleshooting.md @@ -14,7 +14,7 @@ GATEWAY = 192.168.0.254 HOSTNAME = mypanda ``` -See [](../how-to/quickstart.md) for the full `config.txt` format and the USB +See [](../how-to/setup-without-dhcp.md) for the full `config.txt` format and the USB override mechanism (no SD card access required). ### How do I disable subnet validation in the web control? diff --git a/docs/tutorials.md b/docs/tutorials.md index 4a213d11..528b288e 100644 --- a/docs/tutorials.md +++ b/docs/tutorials.md @@ -3,7 +3,7 @@ Tutorials for installation and typical usage. New users start here. If your PandA is not yet on the network, follow -[](how-to/quickstart.md) first, then begin with Tutorial 0. +[](how-to/setup-without-dhcp.md) first, then begin with Tutorial 0. ```{toc} :context: children diff --git a/docs/tutorials/getting_started.md b/docs/tutorials/getting_started.md index 1130978b..50f62730 100644 --- a/docs/tutorials/getting_started.md +++ b/docs/tutorials/getting_started.md @@ -58,5 +58,5 @@ corrupted SD card, and overriding the FPGA bitstream variant. You have now setup your PandA and upgraded to the latest firmware. Continue with: -- [](../how-to/connecting_to_web_control.md) — drive some output bits and see real +- [](connecting_to_web_control.md) — drive some output bits and see real hardware changes. diff --git a/docs/tutorials/position_capture.md b/docs/tutorials/position_capture.md index bad9337b..f6f3f026 100644 --- a/docs/tutorials/position_capture.md +++ b/docs/tutorials/position_capture.md @@ -6,7 +6,7 @@ how to receive and interpret the captured stream. ## Prerequisites -- Completed {doc}`tutorial_blinking_leds` or comfortable with the web control +- Completed {doc}`blinking_leds` or comfortable with the web control layout view. - `nc` (netcat) or any TCP client available on your workstation. @@ -220,6 +220,6 @@ position over a detector frame. You have used the PCAP interface to capture position data with different capture modes (Value, Diff, Min/Max/Mean), and received the ASCII stream over TCP. -The next tutorial ({doc}`tutorial3_position_compare`) covers position compare — +The next tutorial ({doc}`position_compare`) covers position compare — generating triggers automatically when an encoder reaches a set of target positions. From 6af40d342c86826e6ff22fe2373823a2c0b1febd Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 18 Jun 2026 15:05:33 +0000 Subject: [PATCH 45/49] docs: drop remaining {doc} roles and make CI build --strict - Convert the 7 remaining {doc} roles to markdown links (the tutorial pages reintroduced them via the merge, plus how-to/test-firmware-changes). - docs.yml: build with `myst build --html --strict` so CI exits non-zero on any error-severity message (e.g. an unresolved cross-repo xref). Verified the docs build clean at exit 0 under --strict. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/docs.yml | 7 +++++-- docs/how-to/test-firmware-changes.md | 2 +- docs/tutorials/blinking_leds.md | 4 ++-- docs/tutorials/connecting_to_web_control.md | 4 ++-- docs/tutorials/position_capture.md | 4 ++-- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 674a9381..8802f111 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -29,7 +29,10 @@ jobs: # meta-panda is a Yocto layer, not a Python/uv project, so we install # mystmd directly with npm rather than via `uv run tox -e docs`. The build - # command itself (`cd docs && myst build --html`) matches the template. + # command itself (`cd docs && myst build --html --strict`) matches the + # template. --strict makes the build exit non-zero on any error-severity + # message (e.g. an unresolved cross-repo xref), failing CI rather than + # publishing broken links. - name: Setup Node uses: actions/setup-node@v4 with: @@ -50,7 +53,7 @@ jobs: BASE_URL: /meta-panda/${{ env.DOCS_VERSION }} run: | cd docs - myst build --html + myst build --html --strict # Drop the ~135 MB templates/ dir (downloaded book-theme node sources, a # build-time cache) before uploading. We keep docs/_build as the artifact diff --git a/docs/how-to/test-firmware-changes.md b/docs/how-to/test-firmware-changes.md index baa3ff89..26324fa1 100644 --- a/docs/how-to/test-firmware-changes.md +++ b/docs/how-to/test-firmware-changes.md @@ -72,7 +72,7 @@ To test a custom FPGA bitstream: ssh root@ opkg install --force-reinstall /tmp/panda-fpga_.ipk ``` -3. Override the active bitstream if needed — see {doc}`choose-fpga-bitstream`. +3. Override the active bitstream if needed — see [](choose-fpga-bitstream.md). 4. Restart the relevant service: diff --git a/docs/tutorials/blinking_leds.md b/docs/tutorials/blinking_leds.md index 2d75c137..3ca78c80 100644 --- a/docs/tutorials/blinking_leds.md +++ b/docs/tutorials/blinking_leds.md @@ -6,7 +6,7 @@ so that different LEDs flash at different rates. ## Prerequisites - A PandA powered on and reachable in your browser - (see {doc}`connecting_to_web_control`). + (see [](connecting_to_web_control.md)). - The `template_tutorial1_leds` design saved on your PandA (pre-loaded on all standard PandA images). @@ -78,5 +78,5 @@ short pulses are visible. Front-panel LEDs behave similarly, capped at 10 Hz. You have loaded a saved design, inspected block parameters, and seen bit outputs connected to hardware TTL outputs via TTLOUT blocks. -Continue with {doc}`position_capture` to learn about position outputs +Continue with [](position_capture.md) to learn about position outputs and data capture. diff --git a/docs/tutorials/connecting_to_web_control.md b/docs/tutorials/connecting_to_web_control.md index 93a2951f..89bf056b 100644 --- a/docs/tutorials/connecting_to_web_control.md +++ b/docs/tutorials/connecting_to_web_control.md @@ -7,7 +7,7 @@ be ready for the hands-on tutorials that follow. ## Prerequisites -- PandA is setup and have completed {doc}`getting_started`. +- PandA is setup and have completed [](getting_started.md). - Its IP address or hostname (e.g. `192.168.0.100` or `my-panda`). ### 1. Open the web control @@ -100,5 +100,5 @@ signal-processing designs. You now know how to reach the web control, inspect block attributes, and connect blocks together in the layout view. Continue with: -- {doc}`blinking_leds` — drive some output bits and see real +- [](blinking_leds.md) — drive some output bits and see real hardware changes. \ No newline at end of file diff --git a/docs/tutorials/position_capture.md b/docs/tutorials/position_capture.md index f6f3f026..5a007295 100644 --- a/docs/tutorials/position_capture.md +++ b/docs/tutorials/position_capture.md @@ -6,7 +6,7 @@ how to receive and interpret the captured stream. ## Prerequisites -- Completed {doc}`blinking_leds` or comfortable with the web control +- Completed [](blinking_leds.md) or comfortable with the web control layout view. - `nc` (netcat) or any TCP client available on your workstation. @@ -220,6 +220,6 @@ position over a detector frame. You have used the PCAP interface to capture position data with different capture modes (Value, Diff, Min/Max/Mean), and received the ASCII stream over TCP. -The next tutorial ({doc}`position_compare`) covers position compare — +The next tutorial ([](position_compare.md)) covers position compare — generating triggers automatically when an encoder reaches a set of target positions. From 2050bca76390a1005e1b80fd4369552269c35d6e Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Thu, 18 Jun 2026 15:36:13 +0000 Subject: [PATCH 46/49] docs: enforce link quality + add documentation-standards reference - myst.yml: escalate link-resolves, reference-target-resolves and link-text-exists to error so (with --strict) broken links, unresolved cross references and empty auto-filled labels fail CI. - Add reference/documentation-standards.md describing the linking conventions these rules enforce (page/section/explicit targets, internal vs xref, path rules, empty-label inheritance), and list it in the toc. Co-Authored-By: Claude Opus 4.8 --- docs/myst.yml | 13 ++++ docs/reference/documentation-standards.md | 87 +++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 docs/reference/documentation-standards.md diff --git a/docs/myst.yml b/docs/myst.yml index c995de7b..62c1c259 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -21,6 +21,18 @@ project: PandABlocks-server: https://pandablocks.github.io/PandABlocks-server/docs # Not deployed yet — kept commented (interim /docs target; -> /stable later). # fastcs-PandABlocks: https://diamondlightsource.github.io/fastcs-PandABlocks/docs + # Escalate link/cross-reference quality rules from warning to error so that, + # combined with `myst build --strict`, a broken link, an unresolved cross + # reference, or an empty auto-filled label fails CI instead of publishing a + # dead link. See reference/documentation-standards for the linking conventions + # these rules enforce. + error_rules: + - rule: link-resolves + severity: error + - rule: reference-target-resolves + severity: error + - rule: link-text-exists + severity: error toc: - file: index.md - file: tutorials.md @@ -67,6 +79,7 @@ project: - file: reference/machine-targets.md - file: reference/glossary.md - file: reference/troubleshooting.md + - file: reference/documentation-standards.md - url: https://github.com/PandABlocks/meta-panda/releases title: Release Notes site: diff --git a/docs/reference/documentation-standards.md b/docs/reference/documentation-standards.md new file mode 100644 index 00000000..84540370 --- /dev/null +++ b/docs/reference/documentation-standards.md @@ -0,0 +1,87 @@ +# Documentation standards + +Conventions for authoring the PandABlocks MyST documentation. These apply to +this repository and to the sibling repos (`PandABlocks-server`, +`PandABlocks-FPGA`); cross-repo wiring is configured in each repo's +`docs/myst.yml`, and adding a new cross-link is covered in +[](/how-to/contribute.md). + +## Linking + +All links use plain Markdown link syntax, `[text](target)`. Leave the text +**empty** wherever the link text should simply be the title of the thing you are +linking to — MyST fills it in from the target and keeps it in sync if the +target's title later changes: + +```markdown +[](/how-to/quickstart.md) → renders as the page title +[](#explicit-target) → renders as the heading text +``` + +Only supply explicit text when the surrounding sentence needs different wording. + +### Choosing a target + +There are three kinds of target, each available both within a repo and across +repos. Pick by *what* you are pointing at, then use the internal or cross-repo +form. + +| Pointing at | Internal form | Cross-repo form | +|---|---|---| +| A whole page | `[](/path/to/page.md)` | `[](xref:repo/path/to/page)` | +| A section (heading) | `[](/path/to/page.md#heading-slug)` | `[](xref:repo/path/to/page#heading-slug)` | +| An explicit label | `[](#my-label)` / `[](/path.md#my-label)` | `[](xref:repo#my-label)` | +| A Sphinx object/label (e.g. `PandABlocks-client`) | — | `` [](xref:repo#py.object) `` or `[](xref:repo)` for the root | + +### Internal links: path rules + +- **Always include the `.md` extension.** An extensionless path such as + `[](how-to/app)` is treated as an opaque URL, not a document reference: it + will not inherit a title and silently becomes a dead link if the path is + wrong. +- **Prefer a leading-slash, root-relative path** (`[](/how-to/app.md)`), where + the root is the `docs/` directory. It resolves identically from any source + file. Directory-relative paths (`[](../how-to/app.md)`) also work but are + resolved relative to the *source file's* directory, which is easy to get + wrong from a nested page — the most common cause of broken links here. + +### Sections vs explicit labels: stability + +A heading automatically gets an *implicit* target — the slugified heading text +(`## Build steps` → `build-steps`). Linking to it is fine for incidental, +nearby links, but the slug **changes whenever the heading is reworded**, and +implicit targets are not addressable across repos without naming the page. + +For any link that is load-bearing, far from its target, or crossing a repo +boundary, define an **explicit label** instead and link to that: + +```markdown +(capture-format)= +## Data capture wire format +``` + +Explicit labels are stable across rewording and file renames, and +`[](xref:repo#capture-format)` resolves **without naming the page** — so it +keeps working if the target page is later moved. Place explicit labels on +headings or captioned blocks (figures, tables); a label on a bare paragraph +inherits no useful text. + +### Cross-repo (`xref:`) notes + +- The `repo` key must match a key under `project.references` in `myst.yml`. +- Page and heading forms require the page path (`xref:repo/page#slug`); the slug + is the *target* repo's heading slug and tracks both the page path and the + heading text. +- `xref:repo#label` (no page) resolves only **explicit** labels — the preferred, + most durable form for cross-repo anchors. +- Sphinx targets (`PandABlocks-client`, `fastcs-PandABlocks`) are addressed by + inventory object/label name, not by page path; `xref:repo` alone links to the + project root. + +## Enforcement + +`docs/myst.yml` escalates the link-quality rules `link-resolves`, +`reference-target-resolves` and `link-text-exists` to *error*, and CI builds +with `myst build --strict`. A broken link, an unresolved cross reference, or an +empty label that cannot be auto-filled therefore **fails the build** rather than +publishing a dead link. From a52a7297e7dd8a0fc08e371932a699c4cda10e46 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Fri, 19 Jun 2026 08:05:22 +0000 Subject: [PATCH 47/49] docs: consolidate cross-linking material into the standards reference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the cross-repo reference-target table and config note out of the contribute how-to into reference/documentation-standards (new "Configured cross-repo targets" section), and reduce the how-to to a pointer that links to the reference. Also corrects the stale "FPGA/server are commented out" note — those references are now enabled; only fastcs-PandABlocks remains commented. Co-Authored-By: Claude Opus 4.8 --- docs/how-to/contribute.md | 35 +++-------------------- docs/reference/documentation-standards.md | 22 ++++++++++++-- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/docs/how-to/contribute.md b/docs/how-to/contribute.md index fe3a7324..415f7582 100644 --- a/docs/how-to/contribute.md +++ b/docs/how-to/contribute.md @@ -3,37 +3,10 @@ ## Cross-repository references -This project uses [MyST](https://mystmd.org/) for documentation. Cross-links -to other PandABlocks repos (and to `PandABlocks-client` / `fastcs-PandABlocks`) -are configured in `docs/myst.yml` under `project.references`. - -### Adding a cross-link - -To link to a page in another PandABlocks repo: - -```markdown -[link text](xref:#) -``` - -For example, to link to the `BlockingClient` API in `PandABlocks-client`: - -```markdown -[`BlockingClient`](xref:PandABlocks-client#pandablocks.blocking.BlockingClient) -``` - -### Available reference targets - -| Key | Repo | Type | -|---|---|---| -| `PandABlocks-client` | `PandABlocks-client` | Sphinx (`objects.inv`) | -| `PandABlocks-FPGA` | `PandABlocks-FPGA` | MyST (`myst.xref.json`) | -| `PandABlocks-server` | `PandABlocks-server` | MyST (`myst.xref.json`) | -| `fastcs-PandABlocks` | `fastcs-PandABlocks` | Sphinx (`objects.inv`) | - -The `PandABlocks-FPGA`, `PandABlocks-server` and `fastcs-PandABlocks` entries -are present in `myst.yml` but commented out until those repos publish their -`docs` branches. Uncomment the relevant line once the target site is live -(Stage F). +PandABlocks docs cross-link to the other repos with MyST `xref:` links, +configured in `docs/myst.yml` under `project.references`. For the link syntax, +when to use each target type, and the list of available reference targets, see +the [documentation standards reference](/reference/documentation-standards.md). ### Upstreaming to the copier template diff --git a/docs/reference/documentation-standards.md b/docs/reference/documentation-standards.md index 84540370..6e75f5b0 100644 --- a/docs/reference/documentation-standards.md +++ b/docs/reference/documentation-standards.md @@ -2,9 +2,10 @@ Conventions for authoring the PandABlocks MyST documentation. These apply to this repository and to the sibling repos (`PandABlocks-server`, -`PandABlocks-FPGA`); cross-repo wiring is configured in each repo's -`docs/myst.yml`, and adding a new cross-link is covered in -[](/how-to/contribute.md). +`PandABlocks-FPGA`). Cross-repo links are configured in each repo's +`docs/myst.yml` under `project.references` (see +[](#configured-cross-repo-targets)); the contributor workflow for that block is +in [](/how-to/contribute.md). ## Linking @@ -78,6 +79,21 @@ inherits no useful text. inventory object/label name, not by page path; `xref:repo` alone links to the project root. +### Configured cross-repo targets + +The `repo` keys available from this repository, as configured in +`docs/myst.yml` under `project.references`: + +| Key | Repo | Inventory | +|---|---|---| +| `PandABlocks-client` | `PandABlocks-client` | Sphinx (`objects.inv`) | +| `PandABlocks-FPGA` | `PandABlocks-FPGA` | MyST (`myst.xref.json`) | +| `PandABlocks-server` | `PandABlocks-server` | MyST (`myst.xref.json`) | +| `fastcs-PandABlocks` | `fastcs-PandABlocks` | Sphinx (`objects.inv`) | + +`fastcs-PandABlocks` is present in `myst.yml` but commented out until that repo +publishes its `docs` branch; uncomment it once the target site is live. + ## Enforcement `docs/myst.yml` escalates the link-quality rules `link-resolves`, From 4c506c66c2629e0d6af7be8aa5812165d43e88cd Mon Sep 17 00:00:00 2001 From: "Sode, Adedamola (DLSLtd,RAL,LSCI)" Date: Tue, 16 Jun 2026 15:26:06 +0100 Subject: [PATCH 48/49] separated working in a container from the build doc --- docs/how-to/build.md | 46 +++------------------------ docs/how-to/working-in-a-container.md | 41 ++++++++++++++++++++++++ docs/myst.yml | 1 + 3 files changed, 46 insertions(+), 42 deletions(-) create mode 100644 docs/how-to/working-in-a-container.md diff --git a/docs/how-to/build.md b/docs/how-to/build.md index dac6042d..fd8d440f 100644 --- a/docs/how-to/build.md +++ b/docs/how-to/build.md @@ -1,4 +1,4 @@ -# How to build the PandA image +# How to build the PandA boot image ## Prerequisites @@ -64,47 +64,6 @@ A `boot-.zip` file is created in the current directory. -## Running in a container manually - -For development work (e.g. FPGA builds requiring Vivado), a -`pandablocks-dev-container` image is published on the GitHub Container -Registry. - -Pull it: - -```bash -docker pull ghcr.io/pandablocks/pandablocks-dev-container:latest -``` - -Use a numbered tag instead of `latest` to pin a specific release. - -Create three host directories: - -- `REPO_DIR` — containing all PandA repositories -- `VIVADO_DIR` — containing a Vivado installation -- `BUILD_DIR` — an empty scratch directory - -Run the container with those directories mounted: - -```bash -docker run --rm --net=host -it \ - -v REPO_DIR:/repos:Z \ - -v BUILD_DIR:/build:Z \ - -v VIVADO_DIR:/scratch/Xilinx \ - ghcr.io/pandablocks/pandablocks-dev-container /bin/bash -``` - -:::{note} -The mount path for Vivado inside the container must match your local path. -For example, if Vivado is at `/FPGA/Xilinx` on the host use -`-v /FPGA/Xilinx:/FPGA/Xilinx` and edit `CONFIG` accordingly. -::: - -In each repository inside the container: - -```bash -cp CONFIG.example CONFIG -``` ## Output files @@ -120,3 +79,6 @@ cp CONFIG.example CONFIG Copy these files to the SD card and insert it in the target; the system will boot normally. On the first boot of a pandabox you will be prompted for a MAC address. + +For FPGA development and advanced workflows, see +[Using the Development Container](working-in-a-container.md). \ No newline at end of file diff --git a/docs/how-to/working-in-a-container.md b/docs/how-to/working-in-a-container.md new file mode 100644 index 00000000..ce0a172b --- /dev/null +++ b/docs/how-to/working-in-a-container.md @@ -0,0 +1,41 @@ +# Working in a container for development + +For development work (e.g. FPGA builds requiring Vivado), a +`pandablocks-dev-container` image is published on the GitHub Container +Registry. + +Pull it: + +```bash +docker pull ghcr.io/pandablocks/pandablocks-dev-container:latest +``` + +Use a numbered tag instead of `latest` to pin a specific release. + +Create three host directories: + +- `REPO_DIR` — containing all PandA repositories +- `VIVADO_DIR` — containing a Vivado installation +- `BUILD_DIR` — an empty scratch directory + +Run the container with those directories mounted: + +```bash +docker run --rm --net=host -it \ + -v REPO_DIR:/repos:Z \ + -v BUILD_DIR:/build:Z \ + -v VIVADO_DIR:/scratch/Xilinx \ + ghcr.io/pandablocks/pandablocks-dev-container /bin/bash +``` + +:::{note} +The mount path for Vivado inside the container must match your local path. +For example, if Vivado is at `/FPGA/Xilinx` on the host use +`-v /FPGA/Xilinx:/FPGA/Xilinx` and edit `CONFIG` accordingly. +::: + +In each repository inside the container: + +```bash +cp CONFIG.example CONFIG +``` \ No newline at end of file diff --git a/docs/myst.yml b/docs/myst.yml index e0bff5a3..a5f4a68e 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -47,6 +47,7 @@ project: # Developing for a PandA - file: how-to/build.md - file: how-to/manual-build.md + - file: how-to/working-in-a-container.md - file: how-to/test-firmware-changes.md - file: how-to/make-release.md - file: how-to/contribute.md From 94d038586ccf6b82a4b8b500da44053a722464d4 Mon Sep 17 00:00:00 2001 From: "Sode, Adedamola (DLSLtd,RAL,LSCI)" Date: Fri, 19 Jun 2026 14:50:21 +0100 Subject: [PATCH 49/49] removed working-in-a-container; added link for FPGA docs --- docs/how-to/build.md | 3 +- docs/how-to/working-in-a-container.md | 41 --------------------------- docs/myst.yml | 1 - 3 files changed, 1 insertion(+), 44 deletions(-) delete mode 100644 docs/how-to/working-in-a-container.md diff --git a/docs/how-to/build.md b/docs/how-to/build.md index fd8d440f..139d4924 100644 --- a/docs/how-to/build.md +++ b/docs/how-to/build.md @@ -80,5 +80,4 @@ Copy these files to the SD card and insert it in the target; the system will boot normally. On the first boot of a pandabox you will be prompted for a MAC address. -For FPGA development and advanced workflows, see -[Using the Development Container](working-in-a-container.md). \ No newline at end of file +To build the FPGA bitstream that can be used to make the firmware, see [PandABlocks-FPGA documentation](https://pandablocks.github.io/PandABlocks-FPGA/docs/) \ No newline at end of file diff --git a/docs/how-to/working-in-a-container.md b/docs/how-to/working-in-a-container.md deleted file mode 100644 index ce0a172b..00000000 --- a/docs/how-to/working-in-a-container.md +++ /dev/null @@ -1,41 +0,0 @@ -# Working in a container for development - -For development work (e.g. FPGA builds requiring Vivado), a -`pandablocks-dev-container` image is published on the GitHub Container -Registry. - -Pull it: - -```bash -docker pull ghcr.io/pandablocks/pandablocks-dev-container:latest -``` - -Use a numbered tag instead of `latest` to pin a specific release. - -Create three host directories: - -- `REPO_DIR` — containing all PandA repositories -- `VIVADO_DIR` — containing a Vivado installation -- `BUILD_DIR` — an empty scratch directory - -Run the container with those directories mounted: - -```bash -docker run --rm --net=host -it \ - -v REPO_DIR:/repos:Z \ - -v BUILD_DIR:/build:Z \ - -v VIVADO_DIR:/scratch/Xilinx \ - ghcr.io/pandablocks/pandablocks-dev-container /bin/bash -``` - -:::{note} -The mount path for Vivado inside the container must match your local path. -For example, if Vivado is at `/FPGA/Xilinx` on the host use -`-v /FPGA/Xilinx:/FPGA/Xilinx` and edit `CONFIG` accordingly. -::: - -In each repository inside the container: - -```bash -cp CONFIG.example CONFIG -``` \ No newline at end of file diff --git a/docs/myst.yml b/docs/myst.yml index a5f4a68e..e0bff5a3 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -47,7 +47,6 @@ project: # Developing for a PandA - file: how-to/build.md - file: how-to/manual-build.md - - file: how-to/working-in-a-container.md - file: how-to/test-firmware-changes.md - file: how-to/make-release.md - file: how-to/contribute.md