<feed xmlns='http://www.w3.org/2005/Atom'>
<title>labUI.git/ui/control_panel.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-08-03T18:42:12Z</updated>
<entry>
<title>Re-designed control widgets to be fully contrained.</title>
<updated>2026-08-03T18:42:12Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-08-03T18:25:36Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=68a0c5ba06f471d1d63aedfb61d708faa4b76565'/>
<id>urn:sha1:68a0c5ba06f471d1d63aedfb61d708faa4b76565</id>
<content type='text'>
- Moved edit and X button to top with header of widget.
- Replaced up/down button with drag-and-drop style headers.
</content>
</entry>
<entry>
<title>Merge origin/main: reconcile ConfigWindow consolidation with Debug window + protocol updates</title>
<updated>2026-08-02T07:34:43Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-08-02T07:34:43Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=a3aa1df99df8f413cac2ba6020b7cd0dec6d2390'/>
<id>urn:sha1:a3aa1df99df8f413cac2ba6020b7cd0dec6d2390</id>
<content type='text'>
origin/main (23 commits) added a Debug window/log system on top of the old
separate Devices/Channels/Plot windows, plus protocol fixes (cml, mark10,
modbus_rtu, scpi) and device/profile changes. Local main (3 commits)
replaced the separate windows with a unified ConfigWindow + dock panel.

Kept local's ConfigWindow/dock architecture and ported the Debug window
onto it: new toolbar button + _open_debug(), gated by developer_mode same
as origin's version. Deduped the two independent "developer mode" toggles
that had collided in SettingsWindow (origin's General-tab checkbox gating
Debug window + device sim-mode visibility, local's Advanced-tab checkbox
setting verbose logging) into one General-tab checkbox that does both.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Major control panel improvements.</title>
<updated>2026-08-02T05:02:14Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-08-02T04:55:49Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=e1b951db7714a9496ebf7f861a6741598d4c7e67'/>
<id>urn:sha1:e1b951db7714a9496ebf7f861a6741598d4c7e67</id>
<content type='text'>
    - Added dedicated firmware file for arduino
    - Added View button to consolidate windows
    - Control Panel changes:
        - Changed name fron "Controls" to "Control Panel"
        - Blue side bar when Panel is hidden.
        - Supports "popping" out contorl panel
    - Settings &gt; Advanced tab added with developer settings
</content>
</entry>
<entry>
<title>Merge branch 'fix/control-channel-direction-filter'</title>
<updated>2026-07-29T21:44:24Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-07-29T21:44:24Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=767f1b013dffb8124a389997a2dbf2f06937a1d4'/>
<id>urn:sha1:767f1b013dffb8124a389997a2dbf2f06937a1d4</id>
<content type='text'>
# Conflicts:
#	ui/control_editor.py
</content>
</entry>
<entry>
<title>Make Run the master stop switch; add Log button disabled/recording styling</title>
<updated>2026-07-29T19:17:00Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-07-29T19:17:00Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=ad7f1c39ef473a327ca3b467b579be0099377f55'/>
<id>urn:sha1:ad7f1c39ef473a327ca3b467b579be0099377f55</id>
<content type='text'>
Run/Stop previously only paused acquisition — control outputs (motor
speed, switches, PWM duty) kept whatever value was last written, so
stopping the run loop didn't stop a running motor. Adds
ControlWidget.safe_stop() (per-widget override, default zeros the
output) and ControlPanel.safe_stop_all(), called from _toggle_run's
Stop branch before engine.stop().

Per-widget behavior is deliberately not uniform:
- OnOffSwitch/MotorControl/PwmControl have a latched running/enabled
  state, so safe_stop() drives their own toggle handler (consistent UI
  + write in one path) and, for Motor/PWM, zeroes the slider too.
- SetpointControl/AnalogOutputControl only write on an explicit user
  action and have no universally safe forced value (e.g. 0 isn't
  necessarily "off" for an arbitrary process setpoint or analog
  output) — Stop leaves them untouched rather than guessing.

Log button: added a :disabled QSS rule so "can't log yet" reads as
clearly inert rather than a duller version of the enabled look, and a
600ms blink (toggling a "recording" dynamic property the QSS keys off)
while a recording is active, so it reads as live/recording rather than
a static pressed button. Master Stop now calls _toggle_log(False)
explicitly when forcing the button off, since QPushButton.setChecked()
doesn't emit clicked — without this the blink would keep running after
a master Stop even though logging itself already halted via
engine.stop()'s internal stop_logging() call.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Hide non-writable channels from Controls picker, gate writes on enabled+writable</title>
<updated>2026-07-29T18:59:10Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-07-29T18:59:10Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=9360dea6e6327004b905eb6d7c782cc7c0d3ba13'/>
<id>urn:sha1:9360dea6e6327004b905eb6d7c782cc7c0d3ba13</id>
<content type='text'>
Adds ChannelConfig.writable so the Controls editor can only bind to
channels with a real write mapping (VS/MA/ME/MD/ST for CML, do*/DO for
digital I/O, write_cmd-configured SCPI channels, holding-register Modbus
channels) instead of read-only telemetry — this is exactly the class of
mistake hit earlier (binding a motor-speed control to M1_TV instead of
M1_VS). Also carries forward the enabled-channel gating for controls
(hide disabled channels from the picker, block writes to them at
_write() time) done alongside this investigation.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix .gitignore: remove duplicate entry for plugins/enabled.json</title>
<updated>2026-07-27T23:13:41Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-07-27T23:13:41Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=c3f07a7ffa320aecb3fca5dd40e7644424bddfb5'/>
<id>urn:sha1:c3f07a7ffa320aecb3fca5dd40e7644424bddfb5</id>
<content type='text'>
</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>Fixed saving profile to include devices and their configuration</title>
<updated>2026-04-22T18:21:28Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-04-22T18:21:28Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=91101126e9d044adb8afa635cca1ab5d5a4c51a6'/>
<id>urn:sha1:91101126e9d044adb8afa635cca1ab5d5a4c51a6</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Added feature/create-controls</title>
<updated>2026-04-22T06:52:33Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-04-22T06:52:33Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=a00ed2a932fdb0f3103777ac3eac106701484ca2'/>
<id>urn:sha1:a00ed2a932fdb0f3103777ac3eac106701484ca2</id>
<content type='text'>
</content>
</entry>
</feed>
