Toggle Connect/Disconnect on the same button once connected
MessageDispatcherSync gains an optional on_connect_changed(bool) callback, fired from the websocket client's background loop once the connection is actually live/lost, so the button only flips state on a real connection change rather than optimistically on click.
This commit is contained in:
+13
-1
@@ -160,7 +160,9 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
loop = asyncio.new_event_loop()
|
loop = asyncio.new_event_loop()
|
||||||
asyncio.set_event_loop(loop)
|
asyncio.set_event_loop(loop)
|
||||||
self.msg_dispatch = MessageDispatcherSync(auto_subscribe=True)
|
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.ws_client = WsClient(listener=self.msg_dispatch, loop=loop)
|
||||||
|
self.connected = False
|
||||||
self.msg_pot = self.msg_dispatch.msgio_get('Pot')
|
self.msg_pot = self.msg_dispatch.msgio_get('Pot')
|
||||||
self.msg_sensor = self.msg_dispatch.msgio_get('Sensor')
|
self.msg_sensor = self.msg_dispatch.msgio_get('Sensor')
|
||||||
self.msg_heater = self.msg_dispatch.msgio_get('Heater')
|
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.msg_sud.set_recv_handler(self.on_sud_changed)
|
||||||
|
|
||||||
self.setupUi(self)
|
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.actionStop.triggered.connect(self.disconnect)
|
||||||
self.actionSudDownload.triggered.connect(self.on_action_sud_download)
|
self.actionSudDownload.triggered.connect(self.on_action_sud_download)
|
||||||
self.actionSudUpload.triggered.connect(self.on_action_sud_upload)
|
self.actionSudUpload.triggered.connect(self.on_action_sud_upload)
|
||||||
@@ -246,6 +248,16 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
self.ws_client.disconnect()
|
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):
|
def on_slider_temp_soll_changed(self, value):
|
||||||
print("on_slider_temp_soll_changed {}".format(value))
|
print("on_slider_temp_soll_changed {}".format(value))
|
||||||
self.msg_tempctrl.send({'Soll': {'Temp': value}})
|
self.msg_tempctrl.send({'Soll': {'Temp': value}})
|
||||||
|
|||||||
+8
-1
@@ -103,6 +103,10 @@ class MessageDispatcherSync(IConnection):
|
|||||||
self.state = None
|
self.state = None
|
||||||
self.state = queue.Queue()
|
self.state = queue.Queue()
|
||||||
self.auto_subscribe = auto_subscribe
|
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):
|
def msgio_get(self, key):
|
||||||
obj = MsgIoSync(key, self.send)
|
obj = MsgIoSync(key, self.send)
|
||||||
@@ -114,6 +118,8 @@ class MessageDispatcherSync(IConnection):
|
|||||||
async def on_connect(self):
|
async def on_connect(self):
|
||||||
if self.auto_subscribe:
|
if self.auto_subscribe:
|
||||||
asyncio.get_event_loop().run_in_executor(None, self.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):
|
def subscribe(self):
|
||||||
for handler in self.msg_handlers:
|
for handler in self.msg_handlers:
|
||||||
@@ -122,7 +128,8 @@ class MessageDispatcherSync(IConnection):
|
|||||||
self.send({'+': key})
|
self.send({'+': key})
|
||||||
|
|
||||||
async def on_disconnect(self):
|
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):
|
async def on_recv(self, data):
|
||||||
d = json.loads(data)
|
d = json.loads(data)
|
||||||
|
|||||||
Reference in New Issue
Block a user