<feed xmlns='http://www.w3.org/2005/Atom'>
<title>labUI.git/api_layers, 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-09-21T05:45:18Z</updated>
<entry>
<title>Persist dock layout to profiles; dedupe port names; Channels-tab Create button</title>
<updated>2026-09-21T05:45:18Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-09-21T05:45:18Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=a0473245f1f453bfc87ea1bc9bd479311e8a944b'/>
<id>urn:sha1:a0473245f1f453bfc87ea1bc9bd479311e8a944b</id>
<content type='text'>
- Fix duplicated device names ("FT231X USB UART - FT231X USB UART (...)")
  — pyserial on Linux often reports the same udev model string twice for
  cheap FTDI/CH340-style adapters. Collapse it at the list_ports() source
  so every consumer (device auto-name, port picker) benefits.

- Save Control Panel / Namespace dock area, floating geometry, visibility,
  size and order to .labui profiles via QMainWindow.saveState()/
  restoreState(), round-tripped through the existing Profile.settings
  passthrough (self._settings) — no profile schema change needed.

- Channels tab: replace the per-row Signal ⊕ button (and its pinned/
  frozen-column overlay) with a single "Create Channel" button below the
  Namespace panel. Select one or more Signal/Channel rows (multi-select
  now supported) and click it — selected rows become the new Channel's
  sources, or an empty Channel is created if nothing's selected. Fixes a
  bug in the process: the multi/zero-source path defaulted to
  kind="expression" with no expression text, which fails to compile and
  silently dropped the channel; use kind="none" instead, which the user
  then edits in the Channels pane.

  NamespacePanel itself (ui/namespace_panel.py) goes back to a plain
  read-only reference widget — the create-channel button and its logic
  live entirely in ConfigWindow (config_window.py), so the shared
  dockable Namespace panel on the main window is unaffected.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Redesign Signal/Channel naming and fix pin-remap breaking references</title>
<updated>2026-09-19T23:38:07Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-09-19T23:38:07Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=f3327d56d48d63b21ffc03a55fa5e7db753d1707'/>
<id>urn:sha1:f3327d56d48d63b21ffc03a55fa5e7db753d1707</id>
<content type='text'>
Arduino analog Signal ids used to be the pin name itself, so fixing a
wrong pin silently changed the id and orphaned any plot trace, control,
or filter pipeline pointing at it. Analog Signal ids are now positional
(ai0, ai1, ...) and decoupled from the underlying pin, matching how
digital I/O already worked.

More broadly, formalizes a Device -&gt; Signal -&gt; Channel -&gt; Plot naming
model (SignalConfig for physical device channels, Channel for derived/
computed ones) and adds core/reference_registry.py to propagate any
Signal or Channel id rename through plot traces, controls, and filter
pipelines instead of leaving them dangling. Signal ids are now editable
in the Signals tab with the same propagation.

.labui profile schema bumped to v2.0 with a transparent migration for
old files, including remapping old pin-name Signal ids to the new
positional ones. Removed six confirmed-dead files (two legacy device
classes, four superseded top-level ui/ duplicates).
</content>
</entry>
<entry>
<title>Commented out unfiltered stream. Now works with Adams python code.</title>
<updated>2026-08-26T16:02:01Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-08-26T16:02:01Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=00671a90bb51bfe485d98a928a456d55adbe1faf'/>
<id>urn:sha1:00671a90bb51bfe485d98a928a456d55adbe1faf</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Fix control panel freeze and CM1 motor not moving</title>
<updated>2026-08-17T16:02:28Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-08-17T16:02:28Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=2014b045fc62567aeb06ea610a98aa03a43b7142'/>
<id>urn:sha1:2014b045fc62567aeb06ea610a98aa03a43b7142</id>
<content type='text'>
ControlWidget._write() called dev.write_channel() directly on the GUI
thread from Qt signal handlers — for CML (CoolMuscle), write() does 2-3
blocking serial round-trips, and a slider fires valueChanged on every drag
tick, so each tick froze the whole app until the device responded or timed
out. Replaced with a coalescing background dispatch: writes are keyed by
(device, channel) in a dict instead of a plain FIFO queue, so re-writing
the same channel while a write is still pending updates its value in place
rather than piling up — a strict FIFO was observed backing up 30+ deep
during a single drag, meaning the motor kept "moving" to seconds-old
positions long after the slider stopped, which looked like a freeze even
once off the GUI thread.

Separately, the motor never actually moved because it was never enabled:
per docs/CM1-C_ASCII_Command_Cheatsheet.md, a CM1-C motor stays disabled
("shaft free") until sent "(", and nothing in CMLLayer.write()'s VS/MA
handling ever sent it — enable only existed as a separate M1_ME channel
the generic MotorControl widget has no concept of. VS/MA now send enable
unconditionally before the move sequence (a no-op if already enabled).

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Re-detect serial device ports by identity when a profile loads on another machine</title>
<updated>2026-08-13T17:09:03Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-08-13T17:09:03Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=4d08be2656d5599caf60ab5163a9d2305b397daf'/>
<id>urn:sha1:4d08be2656d5599caf60ab5163a9d2305b397daf</id>
<content type='text'>
COM/tty numbers aren't stable across machines or replugs. Devices now save
their USB serial number and OS description alongside the port; on profile
load, if the saved port isn't present, ArduinoLayer.find_port_by_identity()
looks for a match and remaps it. Falls back to the saved port (device shows
ERROR) if nothing matches.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Added DSCUSB Protocol.</title>
<updated>2026-08-13T16:28:25Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-08-13T16:28:25Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=b7b3a84f37cc94494e17ea2098f72d6317090c53'/>
<id>urn:sha1:b7b3a84f37cc94494e17ea2098f72d6317090c53</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Removed tracking of temp files and updated esp32_stringPot.ino</title>
<updated>2026-08-13T16:25:14Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-08-13T16:24:11Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=b388701a7c4bfae12a5f7530c925b3ad77e04c61'/>
<id>urn:sha1:b388701a7c4bfae12a5f7530c925b3ad77e04c61</id>
<content type='text'>
- Removed log file and plugin enabled states.
- Updated esp32_stringPot.ino: added time delay for config screen
  and group declaration together.
</content>
</entry>
<entry>
<title>Unify Signals/Channels around auto-naming, plot-by-channel, and shared vars</title>
<updated>2026-08-10T22:12:05Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-08-10T22:12:05Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=5d5bcaed8639a162fda85c8cd0d340c296a054b8'/>
<id>urn:sha1:5d5bcaed8639a162fda85c8cd0d340c296a054b8</id>
<content type='text'>
Devices: auto-name from OS-reported port description (Device Manager /
udev string) instead of a generic label; default Serial #Channels 1;
consistent simulate-mode checkbox across backends; inline device rename.

Channels: calibration/filters move out of Signals into a Channel
"Operation" (adds Scale/Offset alongside the existing math kinds);
single-physical-source Channels get an embedded Filters block; new
Channels auto-name/auto-ID from their source and reject duplicate
names/IDs on apply; "Create Channel" button on each Signal row; renamed
"Sources" -&gt; "Signals" in the Channels UI; Signals' READ/WRITE dir badge
(was silently-broken IN/OUT) now reflects the real writable flag.

Plot: default layout is one pane per Channel (not per device, not raw
Signals) titled by channel name; "+ Add Channel" is a checkbox dialog
instead of an inline dropdown; traces get up/down reorder; live unit
changes (e.g. a Mark-10 gauge switching lb/kgF/N/ozF) propagate to an
open pane's axis label without clobbering a manually-typed one.

Control Panel: hardware assignment now picks from the same writable-
Signals list instead of a separate device/channel combo with a
hardcoded Arduino pin list; stale visual indicator when a control's
target device/channel disconnects or disappears; documented the `vars`
bridge (Control Panel On Action Script &lt;-&gt; Channel scripts) in both
directions' help text and script templates.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>esp32_stringPot firmware supports calibration from aruidno IDE</title>
<updated>2026-08-10T16:29:12Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-08-10T16:25:59Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=46231c00994cd681d598961f2056dbda31c3e483'/>
<id>urn:sha1:46231c00994cd681d598961f2056dbda31c3e483</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Removed serial commands feature.</title>
<updated>2026-08-07T22:23:20Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-08-07T22:12:36Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=03e301ac1d8d0785017b6428f4c3bed33b81efcd'/>
<id>urn:sha1:03e301ac1d8d0785017b6428f4c3bed33b81efcd</id>
<content type='text'>
</content>
</entry>
</feed>
