From 576e1a52fad6a510d2f250772828bbfce51e85cc Mon Sep 17 00:00:00 2001 From: artem30801 <38689676+artem30801@users.noreply.github.com> Date: Sat, 2 Nov 2019 00:29:06 +0300 Subject: [PATCH] Feature branch - fix for removing clients from qt table (#54) Fixed removing clients from table. --- Server/server_config.ini | 2 +- Server/server_gui.py | 1 + Server/server_gui.ui | 1 + Server/server_qt.py | 17 +++++++--- builder/assets/clever-show.service | 4 ++- messaging_lib.py | 54 ++++++++++++++++++++---------- 6 files changed, 56 insertions(+), 23 deletions(-) diff --git a/Server/server_config.ini b/Server/server_config.ini index 8fdfddc..96a835e 100644 --- a/Server/server_config.ini +++ b/Server/server_config.ini @@ -1,7 +1,7 @@ [SERVER] port = 25000 buffer_size = 1024 -remove_disconnected = False +remove_disconnected = True [BROADCAST] use_broadcast = True diff --git a/Server/server_gui.py b/Server/server_gui.py index e577ef7..09f2a17 100644 --- a/Server/server_gui.py +++ b/Server/server_gui.py @@ -270,6 +270,7 @@ class Ui_MainWindow(object): self.menuDrone.addAction(self.action_remove_row) self.menuDrone.addSeparator() self.menuDrone.addAction(self.menuDeveloper_mode_2.menuAction()) + self.menuDrone.addAction(self.action_remove_row) self.menuMusic.addAction(self.action_select_music_file) self.menuMusic.addAction(self.action_play_music) self.menuMusic.addAction(self.action_stop_music) diff --git a/Server/server_gui.ui b/Server/server_gui.ui index e391a1b..e1b5831 100644 --- a/Server/server_gui.ui +++ b/Server/server_gui.ui @@ -428,6 +428,7 @@ + diff --git a/Server/server_qt.py b/Server/server_qt.py index cbae2b5..298bce8 100644 --- a/Server/server_qt.py +++ b/Server/server_qt.py @@ -113,14 +113,17 @@ class MainWindow(QtWidgets.QMainWindow): self.signals.add_client_signal.emit(StatedCopterData(copter_id=client.copter_id, client=client)) def client_connection_changed(self, client: Client): + print("removeee") row_data = self.model.get_row_by_attr("client", client) row_num = self.model.get_row_index(row_data) + print("removing") if row_num is not None: if Server().remove_disconnected and (not client.connected): client.remove() self.signals.remove_client_signal.emit(row_num) else: self.signals.update_data_signal.emit(row_num, 0, client.connected, ModelStateRole) + print("removed") def init_ui(self): # Connecting @@ -229,10 +232,16 @@ class MainWindow(QtWidgets.QMainWindow): @pyqtSlot() def remove_selected(self): for copter in self.model.user_selected(): - row_num = self.model.data_contents.index(copter) - copter.client.remove() - self.signals.remove_client_signal.emit(row_num) - logging.info("Client removed from table!") + row_num = self.model.get_row_index(copter) + if row_num is not None: + copter.client.remove() + + if not Server().remove_disconnected: + self.signals.remove_client_signal.emit(row_num) + + logging.info("Client removed from table!") + else: + logging.error("Client is not in table!") @pyqtSlot() @confirmation_required("This operation will takeoff selected copters with delay and start animation. Proceed?") diff --git a/builder/assets/clever-show.service b/builder/assets/clever-show.service index 33d65a1..e6b96aa 100644 --- a/builder/assets/clever-show.service +++ b/builder/assets/clever-show.service @@ -1,6 +1,8 @@ [Unit] Description=Clever Show Client Service -After=clever.service +Requires=clever.service +Requires=network.target +After=network.target [Service] WorkingDirectory=/home/pi/clever-show/Drone diff --git a/messaging_lib.py b/messaging_lib.py index 878c76f..d8d02fc 100644 --- a/messaging_lib.py +++ b/messaging_lib.py @@ -20,6 +20,7 @@ except ImportError: PendingRequest = collections.namedtuple("PendingRequest", ["value", "requested_value", # "expires_on", "callback", "callback_args", "callback_kwargs", + "request_args", "resend", ]) logger = logging.getLogger(__name__) @@ -213,6 +214,7 @@ class ConnectionManager(object): self.BUFFER_SIZE = 1024 self.resume_queue = False + self.resend_requests = True def _set_selector_events_mask(self, mode): """Set selector to listen for events: mode is 'r', 'w', 'rw'.""" @@ -235,6 +237,8 @@ class ConnectionManager(object): self.addr = client_addr self._set_selector_events_mask('r') + if self.resend_requests: + self._resend_requests() def close(self): with self._close_lock: @@ -245,6 +249,12 @@ class ConnectionManager(object): def _close(self): logger.info("Closing connection to {}".format(self.addr)) + + if not self.resume_queue: + self._recv_buffer = b'' + self._send_buffer = b'' + self._received_queue.clear() # + try: logger.info("Unregistering selector of {}".format(self.addr)) self.selector.unregister(self.socket) @@ -298,7 +308,7 @@ class ConnectionManager(object): self._received_queue[0].income_raw = b'' if self._received_queue: - if self._received_queue[-1].content: + if self._received_queue[0].content: self.process_received(self._received_queue.popleft()) def _read(self): @@ -313,8 +323,6 @@ class ConnectionManager(object): logger.debug("Received {} from {}".format(data, self.addr)) else: logger.warning("Connection to {} lost!".format(self.addr)) - if not self.resume_queue: - self._recv_buffer = b'' raise RuntimeError("Peer closed.") @@ -357,21 +365,20 @@ class ConnectionManager(object): def _process_response(self, message): request_id, requested_value = message.content["request_id"], message.content["requested_value"] + with self._request_lock: - for key, value in self._request_queue.items(): # TODO as try [] - if (key == request_id) and (value.requested_value == requested_value): - request = self._request_queue.pop(key) - value = message.content["value"] - logger.debug( - "Request {} successfully closed with value {}".format(request, message.content["value"]) - ) + request = self._request_queue.pop(request_id, None) - f = request.callback - f(value, *request.callback_args, **request.callback_kwargs) + if (request is not None) and (request.requested_value == requested_value): + value = message.content["value"] + logger.debug( + "Request {} successfully closed with value {}".format(request, message.content["value"]) + ) - break - else: - logger.warning("Unexpected response!") + f = request.callback + f(value, *request.callback_args, **request.callback_kwargs) + else: + logger.warning("Unexpected response!") def _process_filetransfer(self, message): # TODO path? if message.jsonheader["content-type"] == "binary": @@ -418,7 +425,7 @@ class ConnectionManager(object): self._send_queue.append(data) if self.selector.get_key(self.socket).events != selectors.EVENT_WRITE: - self._set_selector_events_mask('w') + self._set_selector_events_mask('rw') NotifierSock().notify() def get_response(self, requested_value, callback, request_args=None, # timeout=30, @@ -437,9 +444,22 @@ class ConnectionManager(object): callback=callback, callback_args=callback_args, callback_kwargs=callback_kwargs, + request_args=request_args, + resend=True, ) self._send(MessageManager.create_request(requested_value, request_id, request_args)) + def _resend_requests(self): + with self._request_lock: + for request_id, request in self._request_queue.items(): + if request.resend: + self._send(MessageManager.create_request( + request.requested_value, request_id, request.request_args.update(resend=request.resend)) + ) + #request.resend = False + + # self._request_queue.clear() + def send_message(self, command, args=None): self._send(MessageManager.create_simple_message(command, args)) @@ -459,7 +479,7 @@ class ConnectionManager(object): )) -class NotifierSock(Singleton): +class NotifierSock(Singleton): #TODO remake as connecting ONLY to self socket and selector def __init__(self): self.receive_socket = None self.addr = None