diff --git a/client/brewpi_gui.py b/client/brewpi_gui.py index c093c28..8805b6b 100755 --- a/client/brewpi_gui.py +++ b/client/brewpi_gui.py @@ -160,7 +160,9 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) self.msg_dispatch = MessageDispatcherSync(auto_subscribe=True) + self.msg_dispatch.on_connect_changed = self.on_ws_connect_changed self.ws_client = WsClient(listener=self.msg_dispatch, loop=loop) + self.connected = False self.msg_pot = self.msg_dispatch.msgio_get('Pot') self.msg_sensor = self.msg_dispatch.msgio_get('Sensor') self.msg_heater = self.msg_dispatch.msgio_get('Heater') @@ -176,7 +178,7 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): self.msg_sud.set_recv_handler(self.on_sud_changed) self.setupUi(self) - self.btn_connect.clicked.connect(self.connect) + self.btn_connect.clicked.connect(self.on_btn_connect_clicked) self.actionStop.triggered.connect(self.disconnect) self.actionSudDownload.triggered.connect(self.on_action_sud_download) self.actionSudUpload.triggered.connect(self.on_action_sud_upload) @@ -246,6 +248,16 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): def disconnect(self): self.ws_client.disconnect() + def on_btn_connect_clicked(self): + if self.connected: + self.disconnect() + else: + self.connect() + + def on_ws_connect_changed(self, connected): + self.connected = connected + self.btn_connect.setText("Disconnect" if connected else "Connect") + def on_slider_temp_soll_changed(self, value): print("on_slider_temp_soll_changed {}".format(value)) self.msg_tempctrl.send({'Soll': {'Temp': value}}) diff --git a/ws/message.py b/ws/message.py index 2299a32..dd978ac 100644 --- a/ws/message.py +++ b/ws/message.py @@ -103,6 +103,10 @@ class MessageDispatcherSync(IConnection): self.state = None self.state = queue.Queue() self.auto_subscribe = auto_subscribe + # Optional callback(connected: bool), invoked from the websocket + # client's background thread/loop - e.g. for a GUI to toggle a + # Connect/Disconnect button once the connection is actually live. + self.on_connect_changed = None def msgio_get(self, key): obj = MsgIoSync(key, self.send) @@ -114,6 +118,8 @@ class MessageDispatcherSync(IConnection): async def on_connect(self): if self.auto_subscribe: asyncio.get_event_loop().run_in_executor(None, self.subscribe) + if self.on_connect_changed is not None: + self.on_connect_changed(True) def subscribe(self): for handler in self.msg_handlers: @@ -122,7 +128,8 @@ class MessageDispatcherSync(IConnection): self.send({'+': key}) async def on_disconnect(self): - pass + if self.on_connect_changed is not None: + self.on_connect_changed(False) async def on_recv(self, data): d = json.loads(data)