Files
Thomas Ales 844fcd0297 SAW quality check: one middle row per angle, and a viewer that overlays them
A full multi-angle scan takes hours, and a rig whose angles disagree produces
all of them before anyone finds out. This adds a test mode that acquires one
row per angle — the row-wise middle of the ROI — and a viewer that puts every
angle's SAW frequency on one graph. The default 80×50 mm ROI at 5 angles goes
from 1461 rows to 5.

Why the middle row answers an alignment question at all: build_plan centres
every angle's rotated bounding box on the same nominal ROI centre, so each
angle's middle row crosses that one point on the sample. All the angles
measure the same material, so a spread in their frequencies belongs to the rig
rather than to where each row happened to land. test_every_angles_middle_row_
crosses_the_roi_centre pins that premise, since the whole comparison rests on
it and nothing else in the geometry code would notice it breaking.

core/saw_check.py — both halves of the mode, kept together because neither is
much use alone. middle_row_plan() reduces a ScanPlan to one row per angle
(n_rows // 2, the upper of two centre rows when even); frequency_traces() and
alignment_summary() turn the resulting file back into per-angle frequency
traces and the scalars an operator is actually asking about — the spread of
the per-angle medians, the worst drift along a row, the sparsest row. The
verdict thresholds are labelled as rules of thumb, not physics: an anisotropic
sample genuinely varies with angle, so a wide spread is a prompt to look at
the curves rather than a verdict.

Format v10: byte-identical to v6, one row per angle. The version byte earns
its keep because the two are otherwise indistinguishable — a v6 scan aborted
after its first row is not a check, and a reader guessing from the row count
would read a failed scan as a deliberate measurement. create_scan_file()
enforces the one-row rule at write time, since nothing downstream can recover
from a v10 file that breaks it. ScanEngine gains file_version and is otherwise
untouched: the acquisition, the abort/pause path and the background capture
are the scan's, unchanged.

sras_scan_manager.py now carries the source file's version through an export
instead of stamping v6 on everything, which the wider reader would otherwise
have made a lie.

saw_check_viewer.py — frequency along the row, one curve per angle, over a
common offset axis so the curves lie on the same piece of sample; a summary of
each angle's median ±1σ against angle; and the per-angle numbers in a table.
Analysis parameters (DC threshold, background, time gate) recompute on a
worker thread; display ones (smoothing, axis, MHz↔m/s) only redraw. A full v6
scan opens too — the same middle row is pulled out of it — so a finished scan
can be re-examined with the check's own read-out.

In the app, a check finishes by handing the operator the file and an "Open
Viewer" button rather than shutting the rig down the way a completed scan
does. Burst mode is not offered: one row per angle means every burst would be
a single row, so it buys nothing and still pays for the gate preflight.

137 tests passing, ruff clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 08:13:54 -05:00

1105 lines
34 KiB
XML
Executable File

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1016</width>
<height>1184</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<family>Noto Sans Condensed Medium</family>
<pointsize>36</pointsize>
</font>
</property>
<property name="text">
<string>Scanengine3 - AUI</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_8">
<property name="font">
<font>
<family>Noto Sans Condensed SemiBold</family>
<pointsize>16</pointsize>
</font>
</property>
<property name="text">
<string>Geometry Data</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="3">
<widget class="QLabel" name="label_26">
<property name="text">
<string>Scan Save Directory:</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLineEdit" name="y_start_edit">
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLineEdit" name="x_start_edit">
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_3">
<property name="text">
<string>YS:</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QLineEdit" name="y_delta_edit">
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="label_5">
<property name="text">
<string>YD:</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="label_4">
<property name="text">
<string>XD:</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLineEdit" name="num_angles_edit">
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_25">
<property name="text">
<string>Scan File Prefix:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_6">
<property name="text">
<string>NumAngles:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_2">
<property name="text">
<string>XS:</string>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QLineEdit" name="scan_prefix_edit">
<property name="maximumSize">
<size>
<width>350</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="2" column="4">
<widget class="QLineEdit" name="row_spacing_edit">
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QLabel" name="label_7">
<property name="text">
<string>RowSpacing:</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLineEdit" name="x_delta_edit">
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="4" colspan="2">
<widget class="QLineEdit" name="scan_save_dir_edit">
<property name="maximumSize">
<size>
<width>350</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="3" column="6">
<widget class="QPushButton" name="save_dir_browse_btn">
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="1" column="5">
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_16">
<property name="font">
<font>
<family>Noto Sans Condensed SemiBold</family>
<pointsize>16</pointsize>
</font>
</property>
<property name="text">
<string>Communication Settings:</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="2">
<widget class="QPushButton" name="bbd202_connect_toggle">
<property name="text">
<string>Connect</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="t3r_comport_edit"/>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="bbd202_comport_edit"/>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="oscope_connect_toggle">
<property name="text">
<string>Connect</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>T3R Port:</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="t3r_connect_toggle">
<property name="text">
<string>Connect</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>BBD202 Port:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Oscilloscope IP Address:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="oscope_ip_edit"/>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_17">
<property name="font">
<font>
<family>Noto Sans Condensed SemiBold</family>
<pointsize>16</pointsize>
</font>
</property>
<property name="text">
<string>T3RSL Manual Controls:</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="t3r_enable_t1_btn">
<property name="text">
<string>Enable T1</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="2" alignment="Qt::AlignmentFlag::AlignHCenter">
<widget class="QPushButton" name="t3r_enable_t2_btn">
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Enable T2</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="t3r_enable_t3_btn">
<property name="text">
<string>Enable T3</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="4">
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_12">
<property name="text">
<string>T1 Axis</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_13">
<property name="text">
<string>T2 Axis</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="label_14">
<property name="text">
<string>T3 Axis</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="jog_t1_up_btn">
<property name="text">
<string>Up</string>
</property>
</widget>
</item>
<item row="2" column="2" alignment="Qt::AlignmentFlag::AlignHCenter">
<widget class="QPushButton" name="jog_t2_up_btn">
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Up</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="jog_t3_up_btn">
<property name="text">
<string>Up</string>
</property>
</widget>
</item>
<item row="3" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QLabel" name="label_20">
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Jog Speed:</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="t3r_jog_speed_edit">
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="jog_t1_down_btn">
<property name="text">
<string>Down</string>
</property>
</widget>
</item>
<item row="4" column="2" alignment="Qt::AlignmentFlag::AlignHCenter">
<widget class="QPushButton" name="jog_t2_down_btn">
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Down</string>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QPushButton" name="jog_t3_down_btn">
<property name="text">
<string>Down</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="jog_gr_ccw_btn">
<property name="text">
<string>CCW</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_15">
<property name="text">
<string>GR Axis</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QPushButton" name="jog_gr_cw_btn">
<property name="text">
<string>CW</string>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QPushButton" name="t3r_enable_gr_btn">
<property name="text">
<string>Enable GR</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_t3r_current">
<item row="0" column="0">
<widget class="QLabel" name="label_t3r_cur_header">
<property name="text">
<string>Motor Current (mA):</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_t3r_cur_t1">
<property name="text">
<string>T1</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QSpinBox" name="t3r_current_t1_spin">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>600</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QPushButton" name="t3r_set_current_t1_btn">
<property name="text">
<string>Set T1</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_t3r_cur_t2">
<property name="text">
<string>T2</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="t3r_current_t2_spin">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>600</number>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="t3r_set_current_t2_btn">
<property name="text">
<string>Set T2</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_t3r_cur_t3">
<property name="text">
<string>T3</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QSpinBox" name="t3r_current_t3_spin">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>600</number>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="t3r_set_current_t3_btn">
<property name="text">
<string>Set T3</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="label_t3r_cur_gr">
<property name="text">
<string>GR</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QSpinBox" name="t3r_current_gr_spin">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>600</number>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QPushButton" name="t3r_set_current_gr_btn">
<property name="text">
<string>Set GR</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_18">
<property name="font">
<font>
<family>Noto Sans Condensed SemiBold</family>
<pointsize>16</pointsize>
</font>
</property>
<property name="text">
<string>MLS203-1 Manual Controls:</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="4">
<widget class="QPushButton" name="bbd_enable_all_btn">
<property name="minimumSize">
<size>
<width>0</width>
<height>36</height>
</size>
</property>
<property name="text">
<string>Toggle Axes Enable</string>
</property>
</widget>
</item>
<item row="2" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_19">
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Jog Speed:</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_10">
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="4" alignment="Qt::AlignmentFlag::AlignLeft">
<widget class="QLabel" name="bbd_current_y_position_indicator">
<property name="minimumSize">
<size>
<width>170</width>
<height>44</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>220</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<family>Noto Sans Condensed SemiBold</family>
<pointsize>24</pointsize>
</font>
</property>
<property name="text">
<string>000.00</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1" colspan="3">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="bbd_home_all_btn">
<property name="minimumSize">
<size>
<width>0</width>
<height>36</height>
</size>
</property>
<property name="text">
<string>Home All Axes</string>
</property>
</widget>
</item>
<item row="1" column="2" alignment="Qt::AlignmentFlag::AlignHCenter">
<widget class="QPushButton" name="bbd_jog_y_pos_btn">
<property name="minimumSize">
<size>
<width>0</width>
<height>44</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>190</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="text">
<string>Y+</string>
</property>
</widget>
</item>
<item row="4" column="0" alignment="Qt::AlignmentFlag::AlignRight">
<widget class="QLabel" name="label_21">
<property name="maximumSize">
<size>
<width>130</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>X Position:</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1" alignment="Qt::AlignmentFlag::AlignLeft">
<widget class="QLabel" name="bbd_current_x_position_indicator">
<property name="minimumSize">
<size>
<width>170</width>
<height>44</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>220</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<family>Noto Sans Condensed SemiBold</family>
<pointsize>24</pointsize>
</font>
</property>
<property name="text">
<string>000.00</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="bbd_jog_x_neg_btn">
<property name="minimumSize">
<size>
<width>0</width>
<height>44</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>190</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="text">
<string>X-</string>
</property>
</widget>
</item>
<item row="2" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="2" alignment="Qt::AlignmentFlag::AlignHCenter">
<widget class="QPushButton" name="bbd_jog_y_neg_btn">
<property name="minimumSize">
<size>
<width>0</width>
<height>44</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>190</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="text">
<string>Y-</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="bbd_jog_x_pos_btn">
<property name="minimumSize">
<size>
<width>0</width>
<height>44</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>190</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="text">
<string>X+</string>
</property>
</widget>
</item>
<item row="2" column="4">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="3" alignment="Qt::AlignmentFlag::AlignRight">
<widget class="QLabel" name="label_23">
<property name="maximumSize">
<size>
<width>130</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Y Position:</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QPushButton" name="bbd_set_current_start_btn">
<property name="minimumSize">
<size>
<width>0</width>
<height>36</height>
</size>
</property>
<property name="text">
<string>Set Current Coords as Start Coords</string>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QPushButton" name="bbd_set_delta_current_btn">
<property name="minimumSize">
<size>
<width>0</width>
<height>36</height>
</size>
</property>
<property name="text">
<string>Calculate Delta (Current - Start)</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="show_camera_toggle">
<property name="text">
<string>Show Camera Window</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="show_helios_toggle">
<property name="text">
<string>Show Helios Panel</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="burst_mode_check">
<property name="toolTip">
<string>Acquire as many whole rows per FastFrame acquisition as the scope can hold, and transfer each burst in one CURVe? transaction. The stage trigger output is gated off for the flyback between rows.</string>
</property>
<property name="text">
<string>Burst acquisition (multi-row FastFrame)</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="strict_rows_check">
<property name="toolTip">
<string>Stop the scan if a row does not acquire the expected number of frames, instead of zero-padding a short row or truncating a long one. Use for data runs where a silently squared-up row would be worse than a failed scan.</string>
</property>
<property name="text">
<string>Strict row packing (abort on frame-count mismatch)</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="saw_check_btn">
<property name="toolTip">
<string>Acquire one row per angle — the row-wise middle of the ROI — and save it as a v10 .sras SAW check. Costs one row-time per angle instead of a full scan, and every angle's row crosses the same ROI centre, so the per-angle frequencies can be compared in the SAW Check Viewer to judge the alignment.</string>
</property>
<property name="text">
<string>SAW Quality Check…</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="inspect_angles_btn">
<property name="toolTip">
<string>Rotate through the angles of the scan currently entered, parking at a random point in each so the SAW response can be checked on the oscilloscope before committing to the run.</string>
</property>
<property name="text">
<string>Inspect Angles…</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="start_scan_btn">
<property name="text">
<string>Start Scanning</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<tabstops>
<tabstop>x_start_edit</tabstop>
<tabstop>y_start_edit</tabstop>
<tabstop>x_delta_edit</tabstop>
<tabstop>y_delta_edit</tabstop>
<tabstop>num_angles_edit</tabstop>
<tabstop>row_spacing_edit</tabstop>
<tabstop>scan_prefix_edit</tabstop>
<tabstop>scan_save_dir_edit</tabstop>
<tabstop>save_dir_browse_btn</tabstop>
<tabstop>t3r_comport_edit</tabstop>
<tabstop>t3r_connect_toggle</tabstop>
<tabstop>bbd202_comport_edit</tabstop>
<tabstop>bbd202_connect_toggle</tabstop>
<tabstop>oscope_ip_edit</tabstop>
<tabstop>oscope_connect_toggle</tabstop>
<tabstop>t3r_enable_t1_btn</tabstop>
<tabstop>t3r_enable_t2_btn</tabstop>
<tabstop>t3r_enable_t3_btn</tabstop>
<tabstop>jog_t1_up_btn</tabstop>
<tabstop>jog_t2_up_btn</tabstop>
<tabstop>jog_t3_up_btn</tabstop>
<tabstop>t3r_jog_speed_edit</tabstop>
<tabstop>jog_t1_down_btn</tabstop>
<tabstop>jog_t2_down_btn</tabstop>
<tabstop>jog_t3_down_btn</tabstop>
<tabstop>jog_gr_ccw_btn</tabstop>
<tabstop>jog_gr_cw_btn</tabstop>
<tabstop>t3r_enable_gr_btn</tabstop>
<tabstop>t3r_current_t1_spin</tabstop>
<tabstop>t3r_set_current_t1_btn</tabstop>
<tabstop>t3r_current_t2_spin</tabstop>
<tabstop>t3r_set_current_t2_btn</tabstop>
<tabstop>t3r_current_t3_spin</tabstop>
<tabstop>t3r_set_current_t3_btn</tabstop>
<tabstop>t3r_current_gr_spin</tabstop>
<tabstop>t3r_set_current_gr_btn</tabstop>
<tabstop>bbd_enable_all_btn</tabstop>
<tabstop>lineEdit_10</tabstop>
<tabstop>bbd_home_all_btn</tabstop>
<tabstop>bbd_jog_y_pos_btn</tabstop>
<tabstop>bbd_jog_x_neg_btn</tabstop>
<tabstop>bbd_jog_y_neg_btn</tabstop>
<tabstop>bbd_jog_x_pos_btn</tabstop>
<tabstop>bbd_set_current_start_btn</tabstop>
<tabstop>bbd_set_delta_current_btn</tabstop>
<tabstop>show_camera_toggle</tabstop>
<tabstop>saw_check_btn</tabstop>
<tabstop>start_scan_btn</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>