Commit c72fe983 authored by vertighel's avatar vertighel
Browse files

fix binning/windowing halving bug in snapshot templates



Don't fall back to cam.xystart/xyend when params lack explicit windowing:
those getters return binned coords, but set_window expects unbinned, causing
progressive pixel-count halving on each successive exposure.

Co-Authored-By: default avatarClaude Sonnet 4.6 <noreply@anthropic.com>
parent 3f2a78d2
Loading
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -49,8 +49,8 @@ class Template(BaseTemplate):
            binning = params.get("binning") or cam.binning
            filt = params.get("filter") or (
                filter_name.get(cam.filter) if hasattr(cam, 'filter') else None)
            xystart = params.get("xystart") or cam.xystart
            xyend = params.get("xyend") or cam.xyend
            xystart = params.get("xystart")
            xyend = params.get("xyend")
            exptime = params["exptime"]
            self.domeslewing = params.get("domeslewing") or False
            self.recenter = params.get("recenter") or False
@@ -131,8 +131,8 @@ class Template(BaseTemplate):
                        log.warning(f"Filter {filter_state[status]}")
                        sleep(0.75)

        # Changing windowing
        if xystart and xyend:
        # Changing windowing (only when explicitly provided in params)
        if xystart is not None and xyend is not None:
            log.info(
                f"Changing windowing to xystart:{xystart}, xyend:{xyend}")
            cam.set_window(xystart[0],
@@ -140,11 +140,6 @@ class Template(BaseTemplate):
                           xyend[0]-xystart[0],
                           xyend[1]-xystart[1])

        else:
            msg = f"No windowing: full frame in bininng {binning}"
            log.warning(msg)
            cam.full_frame()

        #########################
        ##### Exposure loop #####
        #########################
+4 −9
Original line number Diff line number Diff line
@@ -43,8 +43,8 @@ class Template(BaseTemplate):
            binning = params.get("binning") or cam.binning
            filt = params.get("filter") or (
                filter_name.get(cam.filter) if hasattr(cam, 'filter') else None)
            xystart = params.get("xystart") or cam.xystart
            xyend = params.get("xyend") or cam.xyend
            xystart = params.get("xystart")
            xyend = params.get("xyend")
            exptime = params["exptime"]
            self.domeslewing = params.get("domeslewing") or False
            self.recenter = params.get("recenter") or False
@@ -125,8 +125,8 @@ class Template(BaseTemplate):
                        log.warning(f"Filter {filter_state[status]}")
                        sleep(0.75)

        # Changing windowing
        if xystart and xyend:
        # Changing windowing (only when explicitly provided in params)
        if xystart is not None and xyend is not None:
            log.info(
                f"Changing windowing to xystart:{xystart}, xyend:{xyend}")
            cam.set_window(xystart[0],
@@ -134,11 +134,6 @@ class Template(BaseTemplate):
                           xyend[0]-xystart[0],
                           xyend[1]-xystart[1])

        else:
            msg = f"No windowing: full frame in bininng {binning}"
            log.warning(msg)
            cam.full_frame()

        #########################
        ##### Exposure loop #####
        #########################
+18 −10
Original line number Diff line number Diff line
@@ -58,6 +58,14 @@

            <h4 class="p-2">Telescope Offsets</h4>

            {{ w.widget_input({
                "label": "Tel Focus",
                "info" : "telescope-focuser-position",
                "inputs": [{"value": 0}],
                "unit": "µm",
                "buttons": [{"label": "Set", "endpoint": "/telescope/focuser/movement", "method": "PUT"}],
            }) }}

            {{ w.widget_input({
                "label": "Offsets",
                "inputs": [
@@ -68,8 +76,8 @@
                "buttons": [{"label": "Set", "endpoint": "/telescope/coordinates/offset", "method": "PUT"}],
                "info_list": [
                    {"label": null},
                    {"label": "zd", "status": "telescope-coordinates-offset-0"},
                    {"label": "az",  "status": "telescope-coordinates-offset-1"}
                    {"label": "zd", "status": "telescope-coordinates-offset-0", "transform":"round_1"},
                    {"label": "az",  "status": "telescope-coordinates-offset-1", "transform":"round_1"}
                ]
            }) }}

@@ -155,7 +163,7 @@
                "info_list": [
                    {"label": null},
                    {"label": "moving", "status": "stage-movement"},
                    {"label": "pos",  "status": "stage-position"}
                    {"label": "pos",  "status": "stage-position", "transform":"round_1"}
                ],
            }) }}
        </section>
@@ -164,7 +172,7 @@
            <h4 class="p-2">Camera - Imaging</h4>

            {{ w.widget_toggle({
                "label": "Is Cam On?",
                "label": "Is Cam1 On?",
                "info": "camera-power",
                "buttons": [
                    {"label": "On",  "endpoint": "/camera/power", "val": true,  "method": "PUT"},
@@ -182,14 +190,14 @@
            }) }}

            {{ w.widget_input({
                "label": "Temp cam1",
                "label": "Temp Cam1",
                "inputs": [{"value": -10}],
                "unit": "°C",
                "buttons": [{"label": "Set", "endpoint": "/camera/cooler/temperature/setpoint", "method": "PUT"}],
                "info_list": [
                    {"label": "fan", "status": "camera-settings-fan"},
                    {"label": "set", "status": "camera-settings-setpoint"},
                    {"label": "T",   "status": "camera-settings-temperature"}
                    {"label": "set", "status": "camera-settings-setpoint", "transform":"round_1"},
                    {"label": "T",   "status": "camera-settings-temperature", "transform":"round_1"}
                ]
            }) }}
        </section>
@@ -216,14 +224,14 @@
            }) }}

            {{ w.widget_input({
                "label": "Temp cam2",
                "label": "Temp Cam2",
                "inputs": [{"value": -10}],
                "unit": "°C",
                "buttons": [{"label": "Set", "endpoint": "/camera2/cooler/temperature/setpoint", "method": "PUT"}],
                "info_list": [
                    {"label": null},
                    {"label": "set", "status": "camera2-settings-setpoint"},
                    {"label": "T",   "status": "camera2-settings-temperature"}
                    {"label": "set", "status": "camera2-settings-setpoint", "transform":"round_1"},
                    {"label": "T",   "status": "camera2-settings-temperature", "transform":"round_1"}
                ]
            }) }}
        </section>
+113 −110
Original line number Diff line number Diff line
{#
<!--
    mode_panels.html
    ----------------
    Per-mode framing + observation panels for the control page.
    Each macro is a self-contained form. control.js shows/hides the active panel.
    Expose buttons collect form values and POST to /api/sequencer/run via control.js.
#}
-->

{% macro imaging_panel() %}
<div id="mode-panel-imaging" class="mode-panel" data-subsystem="camera">

    <div class="card mb-3">
        <div class="card-body">
            <h6 class="card-title text-info mb-3">Imaging — Framing</h6>
            <div class="btn-group btn-group-sm w-100 mb-3">
  <h4 class="p-2">Imaging — Framing</h6>

<fieldset class="btn-group btn-group-sm w-100 mb-3">
  <button class="btn btn-outline-primary btn-universal"
          data-method="PUT" data-url="/camera/frame/full">Full</button>
  <button class="btn btn-outline-primary btn-universal"
          data-method="PUT" data-url="/camera/frame/half">Half</button>
  <button class="btn btn-outline-primary btn-universal"
          data-method="PUT" data-url="/camera/frame/small">Small</button>
            </div>
            <div class="row g-1 small font-monospace text-success">
                <div class="col-6">X: <var data-status="camera-settings-xystart-0"></var><var data-status="camera-settings-xyend-0"></var></div>
                <div class="col-6">Y: <var data-status="camera-settings-xystart-1"></var><var data-status="camera-settings-xyend-1"></var></div>
            </div>
        </div>
    </div>
</fieldset>

<aside class="row g-1 small font-monospace text-success">
  <small class="col-6">X:
    <var data-status="camera-settings-xystart-0">N/A</var>

    <var data-status="camera-settings-xyend-0">N/A</var>
  </small>
  <small class="col-6">Y:
    <var data-status="camera-settings-xystart-1">N/A</var>

    <var data-status="camera-settings-xyend-1">N/A</var>
  </small>
</aside>

    <div class="card mb-3">
        <div class="card-body">
<h6 class="card-title text-info mb-3">Imaging — Observe</h6>

<form id="form-imaging" autocomplete="off">

  <div class="row g-2 mb-2">
@@ -113,13 +118,11 @@

</form>

            <div class="row g-1 mt-2 small font-monospace">
                <div class="col-4 text-success">state: <var data-status="camera-snapshot-state"></var></div>
                <div class="col-4 text-success">filter: <var data-status="camera-filter"></var></div>
                <div class="col-4 text-success">T: <var data-status="camera-settings-temperature"></var>°C</div>
            </div>
        </div>
    </div>
<aside class="row g-1 mt-2 small font-monospace">
  <small class="col-4 text-success">state: <var data-status="camera-snapshot-state">N/A</var></small>
  <small class="col-4 text-success">filter: <var data-status="camera-filter">N/A</var></small>
  <small class="col-4 text-success">T: <var data-status="camera-settings-temperature">N/A</var>°C</small>
</aside>

</div>
{% endmacro %}