diff --git a/Drone/client.py b/Drone/client.py index a38570a..aed8dc4 100644 --- a/Drone/client.py +++ b/Drone/client.py @@ -47,6 +47,8 @@ class Client(object): global active_client active_client = self + # self._last_ping_time = 0 + def load_config(self): self.config.read(self.config_path) @@ -119,6 +121,8 @@ class Client(object): try: self.client_socket = socket.socket() self.client_socket.settimeout(timeout) + self.client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + self.client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) self.client_socket.connect((self.server_host, self.server_port)) except socket.error as error: if isinstance(error, OSError): @@ -186,6 +190,9 @@ class Client(object): def _process_connections(self): while True: events = self.selector.select(timeout=1) + # if time.time() - self._last_ping_time > 5: + # self.server_connection.send_message("ping") + # self._last_ping_time = time.time() # logging.debug("tick") for key, mask in events: # TODO add notifier to client! connection = key.data diff --git a/Drone/copter_client.py b/Drone/copter_client.py index a20d8ee..62d4a73 100644 --- a/Drone/copter_client.py +++ b/Drone/copter_client.py @@ -210,6 +210,11 @@ def configure_bashrc(hostname): return True +@messaging.message_callback("execute") +def _execute(*args, **kwargs): + command = kwargs.get("command", None) + if command: + execute_command(command) @messaging.message_callback("id") def _response_id(*args, **kwargs): @@ -226,13 +231,13 @@ def _response_id(*args, **kwargs): configure_hosts(hostname) configure_bashrc(hostname) configure_motd(hostname) - execute_command("hostname {}".format(hostname)) - restart_service("dhcpcd") - time.sleep(0.5) - restart_service("avahi-daemon") - time.sleep(0.5) - restart_service("clever") - restart_service("smbd") + execute_command("reboot") + #execute_command("hostname {}".format(hostname)) + #restart_service("dhcpcd") + #restart_service("avahi-daemon") + #restart_service("smbd") + #restart_service("roscore") + #restart_service("clever") restart_service("clever-show") diff --git a/Server/copter_table_models.py b/Server/copter_table_models.py index 1f5c142..9b85d6b 100644 --- a/Server/copter_table_models.py +++ b/Server/copter_table_models.py @@ -202,11 +202,12 @@ class CopterDataModel(QtCore.QAbstractTableModel): if role == Qt.CheckStateRole: self.data_contents[row].states.checked = value elif role == Qt.EditRole: # For user actions with data - if col == 0 and self.on_id_changed: - self.data_contents[row][col] = "Awaiting for response" - self.data_contents[row].states.copter_id = None + if col == 0: # and self.on_id_changed: + #self.data_contents[row][col] = "Awaiting for response" + #self.data_contents[row].states.copter_id = None self.data_contents[row].client.send_message("id", {"new_id": value}) + self.data_contents[row].client.remove() else: self.data_contents[row][col] = value diff --git a/Server/server.py b/Server/server.py index 819f86f..311b924 100644 --- a/Server/server.py +++ b/Server/server.py @@ -39,6 +39,7 @@ class Server(messaging.Singleton): self.sel = selectors.DefaultSelector() self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) self.server_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) self.host = socket.gethostname() @@ -141,7 +142,7 @@ class Server(messaging.Singleton): while self.client_processor_thread_running.is_set(): events = self.sel.select() - logging.error('tick') + #logging.error('tick') for key, mask in events: # logging.error(mask) # logging.error(str(key.data)) diff --git a/Server/server_qt.py b/Server/server_qt.py index 77d4e90..76343a7 100644 --- a/Server/server_qt.py +++ b/Server/server_qt.py @@ -74,7 +74,7 @@ class MainWindow(QtWidgets.QMainWindow): self.show() def init_model(self): - self.model.on_id_changed = self.set_copter_id + # self.model.on_id_changed = self.set_copter_id self.proxy_model.setDynamicSortFilter(True) self.proxy_model.setSourceModel(self.model) @@ -210,16 +210,18 @@ class MainWindow(QtWidgets.QMainWindow): self.signals.update_data_signal.emit(row, col, data, ModelDataRole) - def set_copter_id(self, value, copter_data_row): - col = 0 - row = self.model.get_row_index(copter_data_row) - if row is None: - logging.error("No such client!") - return - copter_data_row.client.copter_id = value - self.signals.update_data_signal.emit(row, col, value, ModelDataRole) - self.signals.update_data_signal.emit(row, col, True, ModelStateRole) + #def set_copter_id(self, value, copter_data_row): + # col = 0 + # row = self.model.get_row_index(copter_data_row) + # if row is None: + # logging.error("No such client!") + # return + # logging.info("SET COPTER ID TO {}".format(value)) + # + # copter_data_row.client.copter_id = value + # self.signals.update_data_signal.emit(row, col, value, ModelDataRole) + # self.signals.update_data_signal.emit(row, col, True, ModelStateRole) @pyqtSlot(QtCore.QModelIndex) def selfcheck_info_dialog(self, index): diff --git a/builder/assets/clever-show.service b/builder/assets/clever-show.service index e1885e5..3c8466b 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