tube aligner

This commit is contained in:
2026-04-21 00:19:37 +02:00
parent 42677121e3
commit 04da5da162
24 changed files with 1644 additions and 452 deletions
@@ -32,3 +32,17 @@
align-self: start;
grid-area: move;
}
.well {
padding: 0.2em;
}
.well-btn {
display: grid;
grid-template-columns: repeat(6, 1fr);
justify-items: center;
align-items: center;
}
@@ -9,17 +9,14 @@ class ScannerManager {
this.debug_count = 0
}
toggle_median() { this.axes = !this.axes; return this.axes; }
toggle_crop() { this.croping = !this.croping; return this.croping; }
init_controls() {
this.ts = sId("_ts");
this.cx = sId("_cx");
this.cy = sId("_cy");
this.speed_px_s = sId("_speed_px_s");
this.ts = sId("_ts");
this.cx = sId("_cx");
this.cy = sId("_cy");
this.speed_px_s = sId("_speed_px_s");
this.axial_speed = sId("_axial_speed");
this.axial_pos = sId("_axial_pos");
this.area_px = sId("_area_px");
this.axial_pos = sId("_axial_pos");
this.area_px = sId("_area_px");
this.frame_count = sId("_count");
const goto_0 = sId("_goto-0");
@@ -30,6 +27,7 @@ class ScannerManager {
const down = sId("_down");
const left = sId("_left");
const right = sId("_right");
this.duration = sId("_duration");
this.feed = sId("_feed");
this.step = sId("_step");
this.well = sId("_well");
@@ -40,34 +38,50 @@ class ScannerManager {
this.xbase = sId("_xbase");
this.ybase = sId("_ybase");
this.debug = sId("_debug");
this.well_btn = sId("_well_btn");
const test = sId("_test");
const halt = sId("_halt");
const calib_debug = sId("_calib_debug");
const calib_center = sId("_calib_center");
const previous = sId("_previous");
const next = sId("_next");
const set_well = sId("_set_well");
const median = sId("_median");
const crop = sId("_crop");
const crop_radius = sId("_crop_radius");
up.addEventListener('mousedown', (e) => { this._send({ type: 'calibrate', topic: "up" }); });
down.addEventListener('mousedown', (e) => { this._send({ type: 'calibrate', topic: "down" }); });
left.addEventListener('mousedown', (e) => { this._send({ type: 'calibrate', topic: "left" }); });
right.addEventListener('mousedown', (e) => { this._send({ type: 'calibrate', topic: "right" }); });
goto_0.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "goto_0" }); });
goto_xy.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "goto_xy" }); });
goto_0.addEventListener('click', (e) => { this.clear_buttons(); this._send({ type: 'calibrate', topic: "goto_0" }); });
goto_xy.addEventListener('click', (e) => { this.clear_buttons(); this._send({ type: 'calibrate', topic: "goto_xy" }); });
xy_base.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "xy_base" }); });
xy_step.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "xy_step" }); });
median.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "median", value: this.toggle_median() }); });
crop.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "crop", value: this.toggle_crop() }); });
calib_debug.addEventListener('click',(e) => { this._send({ type: 'calibrate', topic: "calib_debug" }); });
previous.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "previous" }); });
next.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "next" }); });
set_well.addEventListener('click',(e) => { this._send({ type: 'calibrate', topic: "set_well" }); });
median.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "median" }); });
crop.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "crop" }); });
crop_radius.addEventListener('change',(e) => { this._send({ type: 'calibrate', topic: "crop_radius", value: crop_radius.value }); });
this.well.addEventListener("change", (e) => { this._send({ type: 'calibrate', topic: "position", value: e.target.value }); });
this.step.addEventListener("change", (e) => { this._send({ type: 'calibrate', topic: "step", value: e.target.value }); });
this.feed.addEventListener("change", (e) => { this._send({ type: 'calibrate', topic: "feed", value: e.target.value }); });
this.duration.addEventListener("change", (e) => { this._send({ type: 'calibrate', topic: "duration", value: e.target.value }); });
this.dx.addEventListener("change", (e) => { this._send({ type: 'calibrate', topic: "dx", value: e.target.value }); });
this.dy.addEventListener("change", (e) => { this._send({ type: 'calibrate', topic: "dy", value: e.target.value }); });
test.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "test" }); });
calib_center.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "center" }); });
halt.addEventListener('click', (e) => { this._send({ type: 'calibrate', topic: "halt" }); });
}
@@ -85,7 +99,7 @@ class ScannerManager {
if (payload.state) { this.debug.insertAdjacentHTML('afterbegin', `<li>[ ${++this.debug_count} - ${payload.state} ]: ${payload.msg}</li>`); }
if (payload.ts) { this.ts.textContent = timestampToLocalISOString(payload.ts); }
if (payload.detected) {
if (payload.detected && use_tracking) {
this.cx.textContent = payload.cx; this.cy.textContent = payload.cy;
this.speed_px_s.textContent = payload.speed_px_s;
this.axial_speed.textContent = payload.axial_speed;
@@ -93,19 +107,24 @@ class ScannerManager {
this.area_px.textContent = payload.area_px;
this.frame_count.textContent = payload.count;
}
if (payload.buttons) { this.well_btn.innerHTML = payload.buttons; }
} catch(e) { console.log(e); }
}
clear_buttons() { document.querySelectorAll('button.w3-button.well').forEach(btn => {btn.classList.remove('w3-green'); }); }
goto_well(b) { this.clear_buttons(); b.classList.add('w3-green'); this._send({ type: 'calibrate', topic: "goto", value: b.value }); }
init() {
this.axes = 0;
this.cropping = 0;
this.clear_buttons();
this._send({
type: 'calibrate',
topic: "init",
feed: this.feed.value,
step: this.step.value,
position: this.well.value
position: this.well.value,
duration: this.duration.value
});
}
start() { this._send({ type: 'scanner', topic: "start"}); }
@@ -48,7 +48,7 @@ class ScannerManager {
if (payload.xy) { this.x.textContent=payload.x.toFixed(2); this.y.textContent=payload.y.toFixed(2); }
if (payload.state) { this.debug.insertAdjacentHTML('afterbegin', `<li>[ ${++this.debug_count} - ${payload.state} ]: ${payload.msg}</li>`); }
if (payload.ts) { this.ts.textContent = timestampToLocalISOString(payload.ts); }
if (payload.detected) {
if (payload.detected && use_tracking) {
this.cx.textContent = payload.cx; this.cy.textContent = payload.cy;
this.speed_px_s.textContent = payload.speed_px_s;
this.axial_speed.textContent = payload.axial_speed;