Repository navigation
Conversation
…ing, stacked full-height voltage/current
…ring and stable checkbox hover
…ring and stable checkbox hover
…ring and stable checkbox hover
…ring and stable checkbox hover
…FF canceling auto restart
…d UX and high-contrast hover
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5d7e3dace9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const sent = phaseLink && row < 3 ? sendLinkedGroup(group) : sendSignal(group, row) | ||
| if (!sent) { | ||
| pendingApply = true | ||
| showMessage("Setpoint not queued. STOP and START to apply all displayed 4I+4V values.", true) |
There was a problem hiding this comment.
Propagate asynchronous queue rejection to the draft
When the worker queue is full during a live edit, requestSetSignal() still returns true because DeviceController::sendCommandBatch() only confirms that the queued invokeMethod was scheduled; the actual rejection occurs later in DeviceIoWorker::enqueueCommandsInternal(). Since WorkflowBar.onLastErrorChanged() ignores errors unless startQueued is true, this new sent check never marks the draft pending for the queue-exhaustion case it is intended to handle, leaving the GUI and board setpoints inconsistent. Handle the asynchronous commandRejected result for live edits rather than treating dispatcher acceptance as queue admission.
AGENTS.md reference: AGENTS.md:L116-L116
Useful? React with 👍 / 👎.
| const accepted = smartSession.requestStartWithScenario( | ||
| controller.startScenarioSnapshot()) |
There was a problem hiding this comment.
Commit pending editor values before taking the START snapshot
If an operator edits a magnitude or angle and immediately presses F5, SignalMatrix has only stored the visible value in pendingMagnitude/pendingPhase; its 90 ms timer has not yet copied it into the ListModel. This snapshot therefore contains the old value, and the delayed timer runs after START was queued, so the supposedly atomic START can use a different value from the one displayed. Flush or synchronously commit active debounced editors before calling startScenarioSnapshot().
Useful? React with 👍 / 👎.
| root.ptpDefaultStartPending = false | ||
| if (!root.startPtpRole("SOURCE")) | ||
| root.showMessage("PTP auto-start was not accepted. Use PTP On to retry.", true) |
There was a problem hiding this comment.
Preserve an explicitly selected PTP role across reconnects
After an operator starts RECEIVER or MONITOR, a serial disconnect/reconnect re-arms ptpDefaultStartPending because ptpExplicitOff is false, but this handler always starts SOURCE instead of using the existing ptpDesiredForSession/ptpDesiredRole intent. The reconnect consequently turns a receiving or monitoring station into a PTP publisher without another operator action; only use SOURCE when no explicit role has been selected, otherwise restore ptpDesiredRole.
Useful? React with 👍 / 👎.
| contentItem: Item { | ||
| Row { |
There was a problem hiding this comment.
Preserve CalmButton's content-based implicit width
The replacement Item has an implicit width of zero and does not inherit the inner Row's implicit size, while the button still computes its width from contentItem.implicitWidth. Consequently every CalmButton without an explicit width now resolves to the 64 px minimum, causing captions such as “Start PTP Receiver” and “Copy diagnostics” to overflow or overlap adjacent controls. Give the content item the Row's implicit dimensions or retain a content item that propagates child sizing.
Useful? React with 👍 / 👎.
| Layout.maximumHeight: root.compactLayout ? 214 : 224 | ||
| spacing: 9 | ||
| Layout.fillHeight: true | ||
| Layout.minimumHeight: 408 |
There was a problem hiding this comment.
Keep the stacked matrices within the supported minimum height
At the declared 620 px window minimum, the footer, outer margins, workflow bar, and panel margins leave about 474 px inside the injection surface. This 408 px matrix minimum plus the 57 px timing tray and spacing already consumes essentially all of that space before the title, 48 px frequency row, separator, and quality row are laid out, so the editor must overflow or clip at a supported window size. Either raise the window minimum, make this section scrollable, or allow the matrices to shrink further.
Useful? React with 👍 / 👎.
| require("property bool phasorDockVisible: true" in main_qml | ||
| and "property bool waveformDockVisible: true" in main_qml | ||
| and "tray.session.requestSmpSynch(" in tray, |
There was a problem hiding this comment.
Test the persisted dock defaults that actually win at startup
This new assertion does not establish that the docks are visible by default: on a fresh settings profile, WorkflowBar.operatorSettings.phasorVisible and waveformVisible both default to false, and Component.onCompleted immediately assigns those false values over the true Main properties checked here. Thus the test passes while both docks start hidden; update the Settings defaults or initialization behavior and test the effective startup state.
Useful? React with 👍 / 👎.
…ate during injection
… Windows 100–175% DPI
…g stacked 4I/4V controls
…ertical matrix geometry
…t viewport scrolls
|
Release cleanup · 2026-10-23 — CLOSED AS SUPERSEDED UI DESIGN (NOT MERGED). Original branch head: At canonical #286 head The multiple competing 2026-10-17 UI implementations cannot be merged into current Studio without overwriting the latest operator layout and the other active worker's automatic Live-edit/Enter/focus-out fix. Preserve the unique historical design and regression rationale here; #286 owns the current premium UI and exact-build release gate. Desktop 100/150/175% DPI visual acceptance and physical GUI→SV angles/phase verification remain pending, not marked PASS. In particular #239 stays OPEN because its RUNNING three-phase toggle changes actual channel values contract differs from the current preference-only switch and must be independently dispositioned. No changes to |
Capture-proven baseline is frozen
Do NOT modify M3C.6 PTP, SV codec, servo, local AUTO or capture policy. See
docs/SMV_PTP_OPERATOR_BASELINE_NO_REGRESSION.md: canonical 480,294 frames in 120s, 0 smpCnt gaps, local AUTO=1, PTP 120 Sync/FUP/Announce, ~49us host-relative epoch indication (not hardware calibration).Functional P0 defect: GUI -30° vs on-wire 0°
WorkflowBar.requestStart()chose bare START whenevercontroller.pendingApplywas false, so after STOP the ESP32-P4 could retain earlier 0/-120/+120 setpoints even while the GUI showed -30/-150/+90. Fixed: every START submits current visible eight-channel snapshot (FREQ, 8xSET, 8xENABLE, CT shape,START) through the pre-existing exclusive all-or-none serial queue. Any failed live SET now marks draft pending and presents error. Added native C++ deterministic encoder regression that requires exactSET IA 1000 -30000 0,SET IB 1000 -150000 0,SET IC 1000 90000 0and Python structural guard forbidding the bare START shortcut.Operator desktop UX
smpSynch=AUTOretained. Explicit PTP OFF suppresses auto-rearm within the current Studio process; Advanced and Main share the same intent. Never issue offline commands. Phasor/Wave remain visible by default.Acceptance required before merge
Studio Qt / operator contract / Windows Lifecycle / Native Preview exact-head installer and core firmware CI. Test Windows 100%,150%,175% DPI screenshots and on-wire phasors; CI cannot substitute hardware confirmation.