refactor: drop firmware-version display, move Enable toggle to Controller

Firmware version is already printed to the log at connect() time
(HendiCtrl/Pololu1376) - remove the live GUI/websocket firmware
reporting entirely (Connectable, HeaterHendi/StirrerPololu1376,
Heater/StirrerTask, web GUI) as redundant.

Also move the Heater panel's Closed-loop checkbox into the Controller
panel and rename it "Enable" - the Controller panel now shows a
live Enabled (green) / Disabled (gray) status badge next to its
heading, matching the Connected/Disconnected badges on the Heater/
Stirrer panels.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YaPLuRPpyjWcwhMvCvpHCL
This commit is contained in:
2026-07-03 20:23:55 +02:00
co-authored by Claude Sonnet 5
parent 7377fe3b6b
commit 7b162cf1f5
8 changed files with 30 additions and 43 deletions
-5
View File
@@ -21,7 +21,6 @@ class HeaterTask(ATask):
self._on_connected_changed = None
device.set_on_changed('power_eff', ChangedInteger(self.on_changed_power).set)
device.set_on_changed('connected', self.on_connected_changed)
device.set_on_changed('firmware_version', self.on_firmware_version_changed)
self.power_set_changed = ChangedInteger(self.on_changed_power_set).set
def set_on_closed_loop_changed(self, callback):
@@ -38,9 +37,6 @@ class HeaterTask(ATask):
if self._on_connected_changed:
self._on_connected_changed(value)
def on_firmware_version_changed(self, value):
fire_and_forget(self.send({'FirmwareVersion': value}))
def shutdown(self):
"""Called when the brew ends (DONE/IDLE). Switches to open-loop at
power 0 and disables TC, mirroring what a Stop press should do."""
@@ -125,7 +121,6 @@ class HeaterTask(ATask):
# fire and a freshly-subscribed client would never learn it's
# connected.
await self.send({'Connected': self.device.connected})
await self.send({'FirmwareVersion': self.device.firmware_version})
with self.device.open():
while True:
-5
View File
@@ -16,7 +16,6 @@ class StirrerTask(ATask):
stirrer_device.set_on_changed("dutyCycle", self.on_dutycycle_changed)
stirrer_device.set_on_changed("cycleTime", self.on_cycletime_changed)
stirrer_device.set_on_changed("connected", self.on_connected_changed)
stirrer_device.set_on_changed("firmware_version", self.on_firmware_version_changed)
def on_speed_changed(self, value):
asyncio.create_task(self.send({'Speed': value}))
@@ -38,9 +37,6 @@ class StirrerTask(ATask):
if self._on_connected_changed:
self._on_connected_changed(value)
def on_firmware_version_changed(self, value):
fire_and_forget(self.send({'FirmwareVersion': value}))
async def recv(self, data):
for pair in data.items():
if pair[0] == 'Connect':
@@ -69,7 +65,6 @@ class StirrerTask(ATask):
# for why a simulated device's connect() alone doesn't fire the
# observer.
await self.send({'Connected': self.device.connected})
await self.send({'FirmwareVersion': self.device.firmware_version})
with self.device.open():
while True: