Whisker IDE Changelog
=====================

1.2.1 - 2026-05-20
------------------

New features

  - Tag Monitor — new bottom-panel tab that lists every addressed
    symbol with its live arena value, refreshed every poll cycle.
    Filter by name / address / description; toggle system-generated
    tags in or out of view; copy the visible table to clipboard as
    TSV. Replaces the "open the journal and watch print() output"
    workflow that walkthrough chapters previously suggested.

  - Per-IO-point enable/disable. Each row in the IO Configuration
    point tables has a checkbox at its leading edge; unchecked
    points keep their symbol in the tag database but the compiler
    skips emitting a Modbus mapping for them. Cuts wire traffic on
    multi-channel modules where only a few channels are wired
    (e.g. 3 of 6 DIs in use, no pulse counters, no AI filter
    windows). Disabled rows dim out and stay in the project.

Python editor

  - Tab / Shift-Tab now block-indent / block-outdent a multi-line
    selection (every selected line gets 4 spaces added or stripped).
    Single-line Tab still inserts 4 spaces; single-line Shift-Tab
    outdents the current line.

  - Ctrl-V normalizes tab characters to 4 spaces on paste, so
    snippets copied from chat, web docs, or other editors land with
    consistent space indentation that Python accepts. No more
    "reformat in VS Code first."

Python Log

  - Log entries are now selectable text — drag-select any
    timestamp, level, or message line and Ctrl-C to clipboard.

  - New Copy All toolbar button serializes the entire log to the
    clipboard as plain text ("HH:MM:SS  LEVEL    message" per
    line). Useful for pasting log slices into chat or bug reports.

WhiskerHMI

  - Alarm panel reliability. Fixed a TCP socket race in the IO
    Scanner service that caused alert-history queries from the
    Flutter HMI runtime to silently drop their responses (the
    poll thread and the alert-history request thread shared one
    NetworkStream with no mutex). Adds diagnostic logging to
    surface future relay issues.

  - Alerts without an explicit output_tag now compile cleanly.
    The compiler auto-binds them to bit slots within a synthetic
    __alerts_state register, so the on-PLC alert tracker can watch
    transitions. Previously these alerts silently produced no
    history entries.

PLC compiler

  - Digital inputs/outputs now always emit as BIT type regardless
    of the IODF's source-register width. IODFs commonly declare
    each DI as a "uint16" holding register whose value is 0 or 1;
    the compiler now correctly treats the value as a boolean
    instead of silently dropping the read.

  - BitOffset default for DI/DQ is now 0 (was the arena-position
    modulo 8 — a leftover that broke whole-register-boolean
    modules). Bit-packed modules still work via the IODF's
    explicit `bit: N` field.

  - Consecutive same-(device, table, datatype) input reads are now
    coalesced into single multi-register Modbus transactions. Cuts
    wire traffic ~5-6x for typical modules (e.g. six DIs at
    consecutive addresses become one read of six registers).

  - RTU device validation no longer fails with "RTU device requires
    uart setting" — the IDE now carries the UART index from the
    hardware definition into saved ModbusPort entries, and
    auto-heals legacy projects on load.

  - The IO Scanner service binary tries /dev/ttyAMA{N} first, then
    falls back to /dev/ttyS{N}, so a single io_scanner build runs
    on both CM5 (BCM2712, ttyAMA naming) and RK3568 (ttyS naming)
    targets. Same uart_index semantics on both platforms.

IODF library

  - mSmart-Universal-IO: removed the Baud Rate, Slave ID, and
    Sample Rate config registers — they're configuration-only,
    not runtime values, and polling them wasted bus cycles.
    Fixed the Solar Voltage register address (1224 -> 1225).

Documentation

  - User manual (PDF and HTML) renders with a branded layout:
    D6 Labs logo top-left header, copyright bottom-left footer,
    Acrobat-sidebar PDF bookmarks generated from the heading
    hierarchy, and a fixed split-pane TOC on the left in the HTML
    output. Custom Pandoc HTML5 template drops Pandoc's default
    reset stylesheet so the sidebar layout isn't fighting a
    max-width: 36em constraint.

  - Walkthrough chapters updated to introduce the Tag Monitor in
    the overview, instruct readers to disable unused IO points in
    Step 2 of W1 and W2, and use the Tag Monitor as the primary
    verification surface in each Step 9.

Internal

  - WhiskerHMI runtime alert_history_service now exposes an
    optional onLog callback that surfaces first-tick byte counts,
    per-tick record counts, and any malformed-line decode errors.
    Stops silent parse failures from producing a blank table.


1.2.0 - 2026-05-17
------------------

Initial public release of the Whisker IDE Standalone edition.

Includes:

  - Application + Project workspace with dockable panels
  - Tag Database (BOOL, INT, DINT, REAL types with INT/DINT split)
  - Ladder Logic editor (Nexus.io AC target)
  - Function Blocks and Tasks
  - HMI Designer (Nexus.io AC and WhiskerHMI targets) with full
    widget palette (gauges, pumps, valves, tanks, trends, alerts)
  - I/O Configuration (built-in I/O plus Modbus TCP/RTU expansion)
  - Alerts editor with HMI runtime overlay and alert history
  - Modbus Server (TCP slave) with Map Viewer and CSV export
  - Python editor with REPL and live print() log
    (SmartControllerClassic targets)
  - Device discovery via mDNS
  - Build, Upload, Download, Run/Stop/Debug Mode controls
  - WhiskerHMI "Generate Installer" packaging
  - Inno Setup-based Windows installer
  - User manual covering all features (PDF + HTML)

Standalone edition does not include cloud features. For cloud-based
fleet management, role-based access control, and signed deployments,
see the Whisker IDE Cloud edition.
