<feed xmlns='http://www.w3.org/2005/Atom'>
<title>labUI.git/ui/windows/channels_window.py, branch main</title>
<subtitle>Data acquisition program written in Python for use with serial communication devices.
</subtitle>
<id>https://git.kolset.xyz/labUI.git/atom?h=main</id>
<link rel='self' href='https://git.kolset.xyz/labUI.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/'/>
<updated>2026-07-29T19:10:35Z</updated>
<entry>
<title>Rework channel labeling and add source picker to virtual-channel creation</title>
<updated>2026-07-29T19:10:35Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-07-29T19:10:35Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=2c6b4b751ffdd1156254b31745597654b5f2e286'/>
<id>urn:sha1:2c6b4b751ffdd1156254b31745597654b5f2e286</id>
<content type='text'>
Relabel every channel picker/header to "NAME (DEVICE/SIGNAL)" instead of
the previous "DEVICE/SIGNAL (NAME)" ordering, consistently across
channels_window.py (_channel_combo, ChannelPickerDialog,
ChannelPipelineBlock header), plot_builder.py, plot_config.py,
control_editor.py, and plot_window.py.

While touching each of those pickers, added the missing `.enabled`
filter that _make_picker()/_x_cb/_build_channel_picker lacked (the
default-layout builders already filtered disabled channels; these
manual "add channel to pane" pickers didn't).

Devices window Signals tab: removed the separate "Signal ID" column
(folded into the existing non-editable Device column instead of the
editable Name column, to avoid corrupting the in-place channel rename
feature that column already supports).

Channels window Virtual Channels pane: added a "Source" dropdown next
to "+ Add Channel" — picking a source pre-seeds the new derived
channel with it via DerivedBlock._add_src(); leaving it on the default
"none" entry keeps today's behavior of creating an empty channel.

Note: docs/ToDo.md's "Channels window UI" items referred to the *live*
UI (this window's PipelineTab + the Devices window's Signals tab), not
SignalsListTab in this same file, which its own module docstring flags
as dead/unused code kept only for old-profile compatibility — verified
by grepping for any instantiation of it (none exist).

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Derived channels: signal display names as vars, auto-update template code, None op</title>
<updated>2026-06-10T05:18:43Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-06-10T05:18:43Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=91b0b613f0b58498315ef91f6a541dd1089b88de'/>
<id>urn:sha1:91b0b613f0b58498315ef91f6a541dd1089b88de</id>
<content type='text'>
- Variable names derived from signal display name (e.g. "Acceleration X" → acceleration_x)
  instead of raw channel ID; all auto-names lowercase with underscores
- Template code auto-updates x[0]/x[1] refs to named vars as sources are added/changed;
  stops updating once user edits the code manually
- Derivative wrt-channel mode uses separate template with x[1] substituted to channel var
- Added "None" passthrough operation (result = x[0])
- source_names persisted in .labdaq profiles

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix custom_script execution + add templates for expression/function kinds</title>
<updated>2026-06-10T04:35:40Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-06-10T04:35:40Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=d396692de571445537e617ac31627d7bd7ab84aa'/>
<id>urn:sha1:d396692de571445537e617ac31627d7bd7ab84aa</id>
<content type='text'>
- custom_script now uses exec-style (assign to `result`) matching the
  built-in templates — previously auto-wrapped in def compute() which
  had no return statement, causing state and channel vars to silently fail
- function kind unchanged: auto-wraps body as def compute(x,t); use return
- Add SCRIPT_TEMPLATES for expression, function, custom_script kinds;
  shown automatically when user switches to a script kind (replacing stale
  code from previous kind)
- New channels default to template when no saved code exists

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Channels: inject variable names as comment in code editor, fix derivative wrt</title>
<updated>2026-06-10T04:27:44Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-06-10T04:27:44Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=f8b5e47ffe9a52bd28ad5d953a551ccb92cbbb09'/>
<id>urn:sha1:f8b5e47ffe9a52bd28ad5d953a551ccb92cbbb09</id>
<content type='text'>
- Variable names now appear as a live '# Variables: A0 = x[0]  ·  ...'
  comment at the top of the code editor (function, custom_script, and
  built-in read-only templates); updates on every source add/remove/change
- Derivative 'With Respect To' channel combo now included in variable list
  as x[1] when channel mode is selected
- _apply() strips the auto-generated comment before saving the script so
  it doesn't pollute the stored expression

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Channels: live variable-name hint in code editor updates with sources</title>
<updated>2026-06-10T04:21:01Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-06-10T04:21:01Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=4d62e4c03227500984a2770ef9615c603a5b71aa'/>
<id>urn:sha1:4d62e4c03227500984a2770ef9615c603a5b71aa</id>
<content type='text'>
When sources are added, removed, or changed in the derived channel editor,
the code group now shows a live "Variables: A0 = x[0]  ·  encoder = x[1]"
hint above the code editor so users know the exact names to use in scripts.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Scripting: named signal vars, shared vars dict, control scripts, code templates</title>
<updated>2026-06-10T04:14:20Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-06-10T04:14:20Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=7aec470acd69e9c1810b40aa5eea9b96b9eb73ad'/>
<id>urn:sha1:7aec470acd69e9c1810b40aa5eea9b96b9eb73ad</id>
<content type='text'>
- Named variables in expressions: source channel IDs injected as Python
  identifiers alongside x[] (e.g. write `A0 * 2` instead of `x[0] * 2`)
- Shared `vars` dict on SignalProcessor accessible from all expressions,
  functions, and control scripts; persisted in .labdaq profiles
- Per-derived-channel `state` dict for persistent computation state in
  custom scripts
- Control widgets gain optional on_action_script (Python snippet with
  value, vars, channels, math in scope); syntax-checked in editor dialog
- Built-in derived kinds (derivative, rms, power, etc.) now show their
  Python implementation as read-only code previews; "Edit as Custom Script"
  converts to custom_script kind with template pre-filled

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Channels/Signals UX: rename labels, calibration section, splitter, sig# IDs</title>
<updated>2026-06-10T03:02:53Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-06-10T03:02:53Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=b138e72d6f81cf58f27c6c1e4ce65cfebbb58624'/>
<id>urn:sha1:b138e72d6f81cf58f27c6c1e4ce65cfebbb58624</id>
<content type='text'>
Naming conventions:
- Devices window: "Channel ID" column → "Signal ID"
- Serial device auto-gen IDs: CH# → sig# (generic, SCPI, Modbus fallbacks)
- Channels window physical section: "Physical Channels" → "Signals"
- Channels window virtual section: "Virtual Channels" → "Channels"
- "Add Virtual" button → "Add Channel"
- New derived channel default name: "Virtual Channel #" → "Channel #"

Signals panel (ChannelPipelineBlock):
- Remove Calibrate header button; add inline Calibration section in body
- Remove Math section (Derivative/Integral) entirely
- scale_offset excluded from filter dropdown; routed to Calibration section
- Existing pipelines: scale_offset loads into Calibration, math filters dropped
- _FILTER_KEYS excludes derivative, integral, scale_offset

Splitter default position:
- Left (Signals) pane initialised to minimum content width via QTimer.singleShot
- setStretchFactor(0,0) / (1,1): left stays narrow, right grows on resize

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Changed dialog text window from channels to signals for clarity</title>
<updated>2026-06-03T22:46:47Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-06-03T22:46:47Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=ac755b7f2809a554c99ff9d72e9c643bba11029c'/>
<id>urn:sha1:ac755b7f2809a554c99ff9d72e9c643bba11029c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Make Devices, Channels, Plot windows maximizable</title>
<updated>2026-06-03T20:50:32Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-06-03T20:50:32Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=93e7d0ecdc090fd4f0231b13933fc0fa095a1f22'/>
<id>urn:sha1:93e7d0ecdc090fd4f0231b13933fc0fa095a1f22</id>
<content type='text'>
Remove Qt.WindowType.Tool flag — it suppresses the maximize button.
Window now has standard chrome with minimize/maximize/close.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Redesign Channels window: side-by-side layout, picker dialog, collapsible virtual blocks</title>
<updated>2026-06-03T20:33:36Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-06-03T20:33:36Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=00be36b73e68aa851328b43391afd060818d7f4b'/>
<id>urn:sha1:00be36b73e68aa851328b43391afd060818d7f4b</id>
<content type='text'>
Physical channels panel: horizontal splitter (left/right), channel picker
dialog replaces dropdown, Filters and Math sections per block, Calibrate
button, pipeline-enabled checkbox removed. Virtual channels: collapsible
blocks, enable checkbox removed, kind dropdown removed (defaults to
expression). Window resized to 1400×820.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
