# DSView as an embedded Windows instrument panel Upstream: https://github.com/DreamSourceLab/DSView, revision `2e9e2c8e`. The GPL-3.0-or-later application and its private Qt 5/Python runtime stay in a separate process. `setgui-host.patch` adds the Windows host protocol and fixes the missing Windows CMake inputs. No DSView DLL is loaded into Qt 6. `python/logic_analyzer/dsview_host.py` contains the reusable environment, process/window ownership and close-message helpers. The consuming GUI owns the stylesheet, window surface and lifecycle. ## Build MSYS2 UCRT64 packages (install with `pacman -S --needed`): ```text mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja mingw-w64-ucrt-x86_64-pkgconf mingw-w64-ucrt-x86_64-qt5-base mingw-w64-ucrt-x86_64-qt5-svg mingw-w64-ucrt-x86_64-qt5-winextras mingw-w64-ucrt-x86_64-glib2 mingw-w64-ucrt-x86_64-libusb mingw-w64-ucrt-x86_64-fftw mingw-w64-ucrt-x86_64-boost mingw-w64-ucrt-x86_64-python ``` ```powershell python tools/dsview/build.py --source C:/path/to/DSView --output C:/path/to/runtime --msys-root C:/msys64 ``` The builder checks the revision, applies the patch only after `git apply --check`, and accepts an already applied patch. It never resets the source checkout. Close the built DSView before rebuilding. Successful builds write `host-build.json`, recording the recipe digest (patch, packager, adapters and shared cores) and the native EXE digest. Consumers can call `runtime_is_current(output)` before packaging to detect an old component even if the host-protocol version is unchanged. SETGUI's normal EXE builder automatically rebuilds an installed stale runtime and refuses to package it if the update fails. A runtime built before this stamp was added is rebuilt once. ## Host protocol 1 - Create a native child surface owned by the host process. - Start `DSView.exe --embed-parent ` with its private runtime as working directory and a sanitized environment. - `DSVIEW_HOST_STYLE` points to the UTF-8 Qt stylesheet; `DSVIEW_CAPTURE_DIR` supplies the initial open/save/export directory. - Wait for `DSVIEW_READY ` on stdout, then validate both the window PID and its parent before accepting it. - The child fits the surface, inherits visibility, and exits if the parent window disappears. It uses separate settings under `SET/SETGUI-DSView`. - Write `CLOSE\n` to the child's stdin to close normally. Keep the host alive while DSView's save dialog is open. Forced termination is only a fallback for host shutdown or a failed start. - Write `ADD_DECODER \n` to open the normal decoder configuration dialog. The host must be ready, in digital mode and not capturing. Stacked decoders automatically include the matching UART/CAN base decoder. - New hosts announce `DSVIEW_CAPABILITIES OPEN_FILE` after the ready message. `OPEN_FILE \n` opens a DSL recording without restarting the child. It returns `DSVIEW_FILE_RESULT ok|busy|save|error`. A capture, save operation or modal dialog prevents replacement. Unsaved hardware data retains the normal save prompt. - In embedded mode File в†’ Open accepts CSV and emits `DSVIEW_IMPORT_CSV ` for conversion by SETGUI. The shared `python/logic_analyzer/csv_import.py` streams CSV into temporary DSL v3 blocks in two passes, with progress/cancellation and bounded memory. Times are read as decimal picoseconds; front-to-front intervals are exact. The initial state may extend by less than one sample to align the grid; the final state pads to 64 samples. Original offset metadata is retained. - Embedded mode disables Qt's quit-on-last-window policy: the child is a `Qt::Tool`, so accepting/rejecting a modal dialog must not quit the process. - `--host-version` returns `DSView host protocol 1`. An optional `DSVIEW_HOST_SCREENSHOT` environment variable saves one render artifact after startup for native integration tests. Tested SDK: GCC 16.2, Qt 5.15.19, Python 3.14.7, Windows x64. This runtime requires Windows 10/11; it does not add Windows 7 support. ## SET decoders `decoders/` contains the sigrok front ends for `gate_driver_timing` (1SP0635 / 1SD536F2), `set_uart` (SET v1/v2, ProtoCAN bridge), `set_can` (ProtoCAN, SET v2, Balsam), and `pm35_uart` (TMS320F28335 MODBUS 03/06). Their parsing cores are maintained only in `python/logic_analyzer/decoders`. The builder copies those files verbatim to `decoders/common/setgui_decoders` inside the runtime. No GUI imports or external Python installation are needed. The adapters originate from `DSLogic_Logic_2/dslogic_script/dsview_decoders`. IGBT offers `ORPHAN minimum pulse width (ns, 0 = off)` for all profiles. Only uncorrelated pulses strictly shorter than this duration are omitted from annotations; zero preserves the original behavior. ACK measurements/errors, FAULT and lone edges with unknown pulse duration remain visible. This does not modify the captured signal or debounce Vin1/Vstat. The independent **Transistor pair** decoder measures mintime, OFF time, deadtime in both directions, overlap, frequency and duty. It requires only Vin1/Vin2. **IGBT 1SP/1SD** retains Vin1/Vstat ACK and full-cycle checks. See [pair settings](decoders/transistor_pair/README.md) and [driver settings](decoders/gate_driver_timing/README.md). Run `python -m unittest discover -s tools/dsview/tests` for packet, CRC, segmentation, timing-profile and sigrok API boundary tests. SETGUI's `--check-dsview` sets `DSVIEW_HOST_CHECK` to a report file and exercises native decoder dialogs, single/all removal with Yes/No, stacking and child lifetime. The check saves decoder dialog screenshots alongside the report. ## Annotation search The patch searches every enabled result column of the selected decoder and every annotation label, including short waveform labels such as `ORPHAN`. Matching is case insensitive; warning columns are enabled by default. Explicitly hidden columns remain excluded until enabled in Decoding Results settings. Enter (including the Windows popup editor), the magnifier and the next arrow navigate forward; the previous arrow navigates backward. Matches are counted per annotation, ordered by sample time, and wrap around. Tooltips show all label variants. A nonempty query displays a compact match-only table: one annotation per row, with its row title and matching label. Clearing the query restores the source table; a query with no matches displays an empty list. Click/arrow navigation maps each result back to the original annotation. Numeric `AA-BB-CC` sequences are still supported; other hyphens are literal. Search runs in short GUI-thread timer steps, invalidates indices on model resets, and refreshes when decoding reaches 100 percent. After rebuilding, verify with an IGBT recording containing an uncorrelated Vstat pulse: search `ORPHAN`, `orphan`, and `Unexpected Vstat`; each should select the same warning and show its waveform region. Also check Enter from the popup editor, magnifier/arrow wraparound, a missing query, clearing/changing the query during a long search, changing columns/decoders, and removing the decoder while searching. Confirm numeric sequences and literal `CAN-FD` labels still work. Source syntax checks do not replace this native GUI check. ## Install analyzers into standalone DSView (Windows) The adapters in `tools/dsview/decoders` and portable cores in `python/logic_analyzer/decoders` are shared with the embedded build. No analyzer implementation is maintained in the consuming GUI. ```powershell .\tools\dsview\install_decoders.ps1 -DsViewPath 'C:\Program Files\DSView' ``` Close DSView first. An elevated PowerShell is needed if the installation folder is protected. Add `-CheckOnly` to validate source files and the target layout without writing. Python/MSYS2 and a DSView rebuild are not required. The target must contain DSView.exe and decoders/common. Installs gate_driver_timing, set_uart, set_can and pm35_uart, with unchanged cores under decoders/common/setgui_decoders. Existing unrelated files are preserved. Replaced files are backed up under set-decoder-backups next to DSView.exe; failed copies trigger rollback. Keep backups for manual recovery. To restore, close DSView and copy the backup contents over decoders. Restart DSView, add the UART or CAN base decoder and stack SET/PM35 on top. Gate timing consumes logic channels directly. This installs decoders only; it does not install the SETGUI host patch, menus or CSV import. Installer tests run under Windows PowerShell against temporary targets and check isolated imports, updates, backups, copy-failure rollback and validation: ```powershell python -m unittest discover -s tools/dsview/tests -p test_install_decoders.py -v ``` ## Decoder panel and selector Embedded DSView does not restore standalone toolbar/dock layout. The Decoders panel can extend to the top row of the DSView controls; its upper splitter still allows reducing its height. SETGUI's own folder and tab rows remain outside the native component. The decoder selector starts with **Пользовательские**: IGBT 1SP/1SD, Transistor pair, SET UART, SET CAN and PM35 UART. **Стандартные** contains the remaining decoders. Search matches names and IDs in both sections and hides empty section headings. The changes are packaged in `decoder-panel.patch`.