Fix re-connecting after network comes back

This commit is contained in:
ChrisTerBeke 2019-08-12 21:47:15 +02:00
parent 945e5f08a3
commit 27905a02a9
No known key found for this signature in database
GPG Key ID: A49F1AB9D7E0C263
3 changed files with 27 additions and 7 deletions

View File

@ -40,8 +40,9 @@ I18N_CATALOG = i18nCatalog("cura")
# Note that this device represents a single remote cluster, not a list of multiple clusters. # Note that this device represents a single remote cluster, not a list of multiple clusters.
class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice): class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
# The interval with which the remote clusters are checked # The interval with which the remote cluster is checked.
CHECK_CLUSTER_INTERVAL = 10.0 # seconds # We can do this relatively often as this API call is quite fast.
CHECK_CLUSTER_INTERVAL = 8.0 # seconds
# The minimum version of firmware that support print job actions over cloud. # The minimum version of firmware that support print job actions over cloud.
PRINT_JOB_ACTIONS_MIN_VERSION = Version("5.3.0") PRINT_JOB_ACTIONS_MIN_VERSION = Version("5.3.0")

View File

@ -43,6 +43,7 @@ class CloudOutputDeviceManager:
self._update_timer = QTimer() self._update_timer = QTimer()
self._update_timer.setInterval(int(self.CHECK_CLUSTER_INTERVAL * 1000)) self._update_timer.setInterval(int(self.CHECK_CLUSTER_INTERVAL * 1000))
self._update_timer.setSingleShot(False) self._update_timer.setSingleShot(False)
self._update_timer.timeout.connect(self._getRemoteClusters)
# Ensure we don't start twice. # Ensure we don't start twice.
self._running = False self._running = False
@ -57,7 +58,6 @@ class CloudOutputDeviceManager:
if not self._update_timer.isActive(): if not self._update_timer.isActive():
self._update_timer.start() self._update_timer.start()
self._getRemoteClusters() self._getRemoteClusters()
self._update_timer.timeout.connect(self._getRemoteClusters)
## Stops running the cloud output device manager. ## Stops running the cloud output device manager.
def stop(self): def stop(self):
@ -67,7 +67,6 @@ class CloudOutputDeviceManager:
if self._update_timer.isActive(): if self._update_timer.isActive():
self._update_timer.stop() self._update_timer.stop()
self._onGetRemoteClustersFinished([]) # Make sure we remove all cloud output devices. self._onGetRemoteClustersFinished([]) # Make sure we remove all cloud output devices.
self._update_timer.timeout.disconnect(self._getRemoteClusters)
## Force refreshing connections. ## Force refreshing connections.
def refreshConnections(self) -> None: def refreshConnections(self) -> None:

View File

@ -27,6 +27,9 @@ from .Models.Http.ClusterPrintJobStatus import ClusterPrintJobStatus
# This base class primarily contains all the Qt properties and slots needed for the monitor page to work. # This base class primarily contains all the Qt properties and slots needed for the monitor page to work.
class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice): class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice):
META_NETWORK_KEY = "um_network_key"
META_CLUSTER_ID = "um_cloud_cluster_id"
# Signal emitted when the status of the print jobs for this cluster were changed over the network. # Signal emitted when the status of the print jobs for this cluster were changed over the network.
printJobsChanged = pyqtSignal() printJobsChanged = pyqtSignal()
@ -195,6 +198,8 @@ class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice):
## Check if we're still connected by comparing the last timestamps for network response and the current time. ## Check if we're still connected by comparing the last timestamps for network response and the current time.
# This implementation is similar to the base NetworkedPrinterOutputDevice, but is tweaked slightly. # This implementation is similar to the base NetworkedPrinterOutputDevice, but is tweaked slightly.
# Re-connecting is handled automatically by the output device managers in this plugin.
# TODO: it would be nice to have this logic in the managers, but connecting those with signals causes crashes.
def _checkStillConnected(self) -> None: def _checkStillConnected(self) -> None:
time_since_last_response = time() - self._time_of_last_response time_since_last_response = time() - self._time_of_last_response
if time_since_last_response > self.NETWORK_RESPONSE_CONSIDER_OFFLINE: if time_since_last_response > self.NETWORK_RESPONSE_CONSIDER_OFFLINE:
@ -202,8 +207,23 @@ class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice):
if self.key in CuraApplication.getInstance().getOutputDeviceManager().getOutputDeviceIds(): if self.key in CuraApplication.getInstance().getOutputDeviceManager().getOutputDeviceIds():
CuraApplication.getInstance().getOutputDeviceManager().removeOutputDevice(self.key) CuraApplication.getInstance().getOutputDeviceManager().removeOutputDevice(self.key)
elif self.connectionState == ConnectionState.Closed: elif self.connectionState == ConnectionState.Closed:
self.setConnectionState(ConnectionState.Connected) self._reconnectForActiveMachine()
if self.key not in CuraApplication.getInstance().getOutputDeviceManager().getOutputDeviceIds():
## Reconnect for the active output device.
# Does nothing if the device is not meant for the active machine.
def _reconnectForActiveMachine(self) -> None:
active_machine = CuraApplication.getInstance().getGlobalContainerStack()
if not active_machine:
return
# Try for local network device.
stored_device_id = active_machine.getMetaDataEntry(self.META_NETWORK_KEY)
if self.key == stored_device_id:
CuraApplication.getInstance().getOutputDeviceManager().addOutputDevice(self)
# Try for cloud device.
stored_cluster_id = active_machine.getMetaDataEntry(self.META_CLUSTER_ID)
if self.key == stored_cluster_id:
CuraApplication.getInstance().getOutputDeviceManager().addOutputDevice(self) CuraApplication.getInstance().getOutputDeviceManager().addOutputDevice(self)
def _responseReceived(self) -> None: def _responseReceived(self) -> None: