This commit is contained in:
atse 2024-08-21 18:10:19 +08:00
parent 022e6b9bda
commit 1f90a2e9fe

View File

@ -65,6 +65,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.thermostat = Thermostat( self.thermostat = Thermostat(
self, self.report_refresh_spin.value() self, self.report_refresh_spin.value()
) )
self._connecting_task = None
def handle_connection_error(): def handle_connection_error():
self.info_box.display_info_box( self.info_box.display_info_box(
@ -245,34 +246,31 @@ class MainWindow(QtWidgets.QMainWindow):
self.conn_menu.port_set_spin.value(), self.conn_menu.port_set_spin.value(),
) )
self._connecting_task = None if (self._connecting_task is None) and (not self.thermostat.connected()):
try:
if (self._connecting_task is None) or (not self.thermostat.connected()):
self.status_lbl.setText("Connecting...") self.status_lbl.setText("Connecting...")
self.connect_btn.setText("Stop") self.connect_btn.setText("Stop")
self.conn_menu.host_set_line.setEnabled(False) self.conn_menu.host_set_line.setEnabled(False)
self.conn_menu.port_set_spin.setEnabled(False) self.conn_menu.port_set_spin.setEnabled(False)
try: try:
self._connecting_task = asyncio.wait_for( self._connecting_task = asyncio.create_task(
self.thermostat.start_session(host=host, port=port), timeout=5 asyncio.wait_for(self.thermostat.start_session(host=host, port=port), timeout=5)
) )
await self._connecting_task await self._connecting_task
except asyncio.TimeoutError: except (OSError, asyncio.TimeoutError):
await self.bail()
return return
except asyncio.CancelledError:
return
finally:
self._connecting_task = None
await self._on_connection_changed(True) await self._on_connection_changed(True)
else: else:
if self._connecting_task is not None: if self._connecting_task is not None:
self._connecting_task.cancel() self._connecting_task.cancel()
await self.bail() await self.bail()
# TODO: Remove asyncio.TimeoutError in Python 3.11
except (OSError, asyncio.TimeoutError):
try:
await self.bail()
except ConnectionResetError:
pass
@asyncSlot() @asyncSlot()
async def bail(self): async def bail(self):
await self._on_connection_changed(False) await self._on_connection_changed(False)