mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-07 15:07:28 -06:00
NetworkManager is now created on demand and re-created after a certain timeout.
CL-541
This commit is contained in:
parent
b1649f2d38
commit
a8e71cf50c
4 changed files with 57 additions and 9 deletions
|
@ -14,9 +14,13 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
||||||
def __init__(self, device_id, address: str, properties, parent = None):
|
def __init__(self, device_id, address: str, properties, parent = None):
|
||||||
super().__init__(device_id = device_id, parent = parent)
|
super().__init__(device_id = device_id, parent = parent)
|
||||||
self._manager = None
|
self._manager = None
|
||||||
self._createNetworkManager()
|
self._last_manager_create_time = None
|
||||||
self._last_response_time = time()
|
self._recreate_network_manager_time = 30
|
||||||
|
self._timeout_time = 10 # After how many seconds of no response should a timeout occur?
|
||||||
|
|
||||||
|
self._last_response_time = None
|
||||||
self._last_request_time = None
|
self._last_request_time = None
|
||||||
|
|
||||||
self._api_prefix = ""
|
self._api_prefix = ""
|
||||||
self._address = address
|
self._address = address
|
||||||
self._properties = properties
|
self._properties = properties
|
||||||
|
@ -25,10 +29,28 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
||||||
self._onFinishedCallbacks = {}
|
self._onFinishedCallbacks = {}
|
||||||
|
|
||||||
def _update(self):
|
def _update(self):
|
||||||
if not self._manager.networkAccessible():
|
if self._last_response_time:
|
||||||
pass # TODO: no internet connection.
|
time_since_last_response = time() - self._last_response_time
|
||||||
|
else:
|
||||||
|
time_since_last_response = 0
|
||||||
|
|
||||||
pass
|
if self._last_request_time:
|
||||||
|
time_since_last_request = time() - self._last_request_time
|
||||||
|
else:
|
||||||
|
time_since_last_request = float("inf") # An irrelevantly large number of seconds
|
||||||
|
|
||||||
|
if time_since_last_response > self._timeout_time >= time_since_last_request:
|
||||||
|
# Go (or stay) into timeout.
|
||||||
|
self.setConnectionState(ConnectionState.closed)
|
||||||
|
# We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to
|
||||||
|
# sleep.
|
||||||
|
if time_since_last_response > self._recreate_network_manager_time:
|
||||||
|
if self._last_manager_create_time is None:
|
||||||
|
self._createNetworkManager()
|
||||||
|
if time() - self._last_manager_create_time > self._recreate_network_manager_time:
|
||||||
|
self._createNetworkManager()
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def _createEmptyRequest(self, target):
|
def _createEmptyRequest(self, target):
|
||||||
url = QUrl("http://" + self._address + self._api_prefix + target)
|
url = QUrl("http://" + self._address + self._api_prefix + target)
|
||||||
|
@ -39,22 +61,35 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
||||||
return request
|
return request
|
||||||
|
|
||||||
def _put(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None]):
|
def _put(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None]):
|
||||||
|
if self._manager is None:
|
||||||
|
self._createNetworkManager()
|
||||||
request = self._createEmptyRequest(target)
|
request = self._createEmptyRequest(target)
|
||||||
|
self._last_request_time = time()
|
||||||
reply = self._manager.put(request, data.encode())
|
reply = self._manager.put(request, data.encode())
|
||||||
self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished
|
self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished
|
||||||
|
|
||||||
def _get(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]):
|
def _get(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]):
|
||||||
|
if self._manager is None:
|
||||||
|
self._createNetworkManager()
|
||||||
request = self._createEmptyRequest(target)
|
request = self._createEmptyRequest(target)
|
||||||
|
self._last_request_time = time()
|
||||||
reply = self._manager.get(request)
|
reply = self._manager.get(request)
|
||||||
self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished
|
self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished
|
||||||
|
|
||||||
def _delete(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]):
|
def _delete(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]):
|
||||||
|
if self._manager is None:
|
||||||
|
self._createNetworkManager()
|
||||||
|
self._last_request_time = time()
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable):
|
def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable):
|
||||||
|
if self._manager is None:
|
||||||
|
self._createNetworkManager()
|
||||||
|
self._last_request_time = time()
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _createNetworkManager(self):
|
def _createNetworkManager(self):
|
||||||
|
Logger.log("d", "Creating network manager")
|
||||||
if self._manager:
|
if self._manager:
|
||||||
self._manager.finished.disconnect(self.__handleOnFinished)
|
self._manager.finished.disconnect(self.__handleOnFinished)
|
||||||
#self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged)
|
#self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged)
|
||||||
|
@ -62,12 +97,17 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
||||||
|
|
||||||
self._manager = QNetworkAccessManager()
|
self._manager = QNetworkAccessManager()
|
||||||
self._manager.finished.connect(self.__handleOnFinished)
|
self._manager.finished.connect(self.__handleOnFinished)
|
||||||
|
self._last_manager_create_time = time()
|
||||||
#self._manager.authenticationRequired.connect(self._onAuthenticationRequired)
|
#self._manager.authenticationRequired.connect(self._onAuthenticationRequired)
|
||||||
#self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes
|
#self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes
|
||||||
|
|
||||||
def __handleOnFinished(self, reply: QNetworkReply):
|
def __handleOnFinished(self, reply: QNetworkReply):
|
||||||
|
if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) is None:
|
||||||
|
# No status code means it never even reached remote.
|
||||||
|
return
|
||||||
|
|
||||||
self._last_response_time = time()
|
self._last_response_time = time()
|
||||||
# TODO: Check if the message is actually correct
|
|
||||||
self.setConnectionState(ConnectionState.connected)
|
self.setConnectionState(ConnectionState.connected)
|
||||||
try:
|
try:
|
||||||
self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply)
|
self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply)
|
||||||
|
|
|
@ -19,7 +19,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
||||||
self._print_jobs = []
|
self._print_jobs = []
|
||||||
|
|
||||||
def _update(self):
|
def _update(self):
|
||||||
super()._update()
|
if not super()._update():
|
||||||
|
return
|
||||||
self._get("printers/", onFinished=self._onGetPrintersDataFinished)
|
self._get("printers/", onFinished=self._onGetPrintersDataFinished)
|
||||||
self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished)
|
self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished)
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice):
|
||||||
self._number_of_extruders = 2
|
self._number_of_extruders = 2
|
||||||
|
|
||||||
def _update(self):
|
def _update(self):
|
||||||
super()._update()
|
if not super()._update():
|
||||||
|
return
|
||||||
self._get("printer", onFinished=self._onGetPrinterDataFinished)
|
self._get("printer", onFinished=self._onGetPrinterDataFinished)
|
||||||
self._get("print_job", onFinished=self._onGetPrintJobFinished)
|
self._get("print_job", onFinished=self._onGetPrintJobFinished)
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,13 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
|
||||||
self._discovered_devices[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged)
|
self._discovered_devices[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged)
|
||||||
|
|
||||||
def _onDeviceConnectionStateChanged(self, key):
|
def _onDeviceConnectionStateChanged(self, key):
|
||||||
pass # TODO
|
if key not in self._discovered_devices:
|
||||||
|
return
|
||||||
|
|
||||||
|
if self._discovered_devices[key].isConnected():
|
||||||
|
self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key])
|
||||||
|
else:
|
||||||
|
self.getOutputDeviceManager().removeOutputDevice(key)
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
if self._zero_conf is not None:
|
if self._zero_conf is not None:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue