Skip to content

Commit

Permalink
Merge pull request #59 from chamoda/ui-ux-improvements
Browse files Browse the repository at this point in the history
UI/UX improvements
  • Loading branch information
vmorrisPolar authored Mar 3, 2021
2 parents 58d96a4 + c8fb0b2 commit 3b085a6
Show file tree
Hide file tree
Showing 3 changed files with 238 additions and 39 deletions.
90 changes: 81 additions & 9 deletions octoprint_polarcloud/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,14 +153,16 @@ def __init__(self):
self._image_transpose = False
self._printer_type = None
self._disconnect_on_register = False
self._disconnect_on_unregister = False
self._hello_sent = False
self._port = 80
self._octoprint_client = None
self._capabilities = None
self._next_pending = False
self._print_preparer = None
self._status = None

self._email = None
self._pin = None
# consider temp reads higher than this as having a target set for more
# frequent reports
self._set_temp_threshold = 50
Expand All @@ -172,13 +174,15 @@ def get_settings_defaults(self, *args, **kwargs):
service="https://printer2.polar3d.com",
service_ui="https://pc2-dev.polar3d.com",
serial=None,
machine_type="Cartesian",
printer_type="Cartesian",
email="",
pin="",
max_image_size = 150000,
verbose=False,
upload_timelapse=True,
enable_system_commands=True,
next_print=True
next_print=False
)

def _update_local_settings(self):
Expand Down Expand Up @@ -282,6 +286,7 @@ def _create_socket(self):
self._socket.on('connectPrinter', self._on_connect_printer)
self._socket.on('customCommand', self._on_custom_command)
self._socket.on('jogPrinter', self._on_jog_printer)
self._socket.on('unregisterResponse', self._on_unregister_response)

def _start_polar_status(self):
if self._polar_status_worker:
Expand All @@ -294,6 +299,10 @@ def _start_polar_status(self):
self._polar_status_worker.daemon = True
self._polar_status_worker.start()

def _stop_polar_status(self):
if self._polar_status_worker:
self._shutdown = True

def _system(self, command_line):
try:
p = sarge.run(command_line, stderr=sarge.Capture())
Expand Down Expand Up @@ -573,7 +582,7 @@ def _wait_and_process(seconds, ignore_status_now=False):
return

self._logger.info("Socket disconnected, clear and restart")
if status_sent < 3 and not self._disconnect_on_register:
if status_sent < 3 and not self._disconnect_on_register and not self._disconnect_on_unregister:
self._logger.warn("Unable to connect to Polar Cloud")
break
self._socket = None
Expand All @@ -586,6 +595,10 @@ def _wait_and_process(seconds, ignore_status_now=False):
def _on_disconnect(self):
self._logger.debug("[Disconnected]")
self._connected = False
# If unregisterd shutdown worker
if self._disconnect_on_unregister:
self._stop_polar_status()
self._disconnect_on_unregister = False

#~~ time-lapse and snapshots to cloud

Expand Down Expand Up @@ -723,6 +736,7 @@ def _hello(self):
self._hello_sent = True
self._status_now = True
self._logger.debug('emit hello')
self._machine_type = self._settings.get(["machine_type"])
self._printer_type = self._settings.get(["printer_type"])
camUrl = self._settings.global_get(["webcam", "stream"])
try:
Expand All @@ -746,6 +760,7 @@ def _hello(self):
'protocol': '2',
'camUrl': camUrl,
'transformImg': transformImg,
'machineType': self._machine_type,
'printerType': self._printer_type
})
self._challenge = None
Expand All @@ -765,7 +780,7 @@ def _send_capabilities(self):
})

def _send_next_print(self):
if self._capabilities and 'sendNextPrint' in self._capabilities and self._settings.get_boolean(['next_print']):
if self._settings.get_boolean(['next_print']):
self._logger.debug("emit sendNextPrint")
self._socket.emit('sendNextPrint', {
'serialNumber': self._serial
Expand All @@ -778,10 +793,15 @@ def _on_register_response(self, response, *args, **kwargs):
if 'serialNumber' in response:
self._serial = response['serialNumber']
self._settings.set(['serial'], self._serial)
self._settings.set(['email'], self._email)
self._settings.set(['pin'], self._pin)
self._settings.save()
self._status_now = True
self._plugin_manager.send_plugin_message(self._identifier, {
'command': 'serial',
'serial': self._serial
'command': 'registration_success',
'serial': self._serial,
'email': self._email,
'pin': self._pin,
})
self._disconnect_on_register = True
self._socket.disconnect()
Expand Down Expand Up @@ -817,7 +837,7 @@ def _register(self, email, pin):

if not self._socket:
self._start_polar_status()
sleep(2) # give the thread a moment to start communicating
sleep(8) # give the thread a moment to start communicating
self._logger.debug("Do we have a socket: {}".format(repr(self._socket)))
if not self._socket:
self._logger.info("Can't register because unable to communicate with Polar Cloud")
Expand All @@ -831,11 +851,50 @@ def _register(self, email, pin):
"publicKey": self._public_key,
"myInfo": {
"MAC": get_mac(),
"protocolVersion": "2"
"protocolVersion": "2",
"machineType": self._settings.get(["machine_type"]),
"printerType": self._settings.get(["printer_type"]),
}
})
return True

#~~ unregister -> polar: unregisterReponse

def _on_unregister_response(self, response, *args, **kwargs):
self._logger.debug('on_unregister_response: {}'.format(repr(response)))
if response['status'] == 'SUCCESS':
self._settings.set(['serial'], '')
self._settings.set(['email'], '')
self._settings.set(['pin'], '')
self._settings.save()
self._status_now = True
self._serial = None
self._plugin_manager.send_plugin_message(self._identifier, {
'command': 'unregistration_success',
})
self._disconnect_on_unregister = True
self._socket.disconnect()
else:
self._plugin_manager.send_plugin_message(self._identifier, {
'command': 'unregistration_failed',
'reason': response['message']
})

def _unregister(self):
if not self._socket:
self._start_polar_status()
sleep(8) # give the thread a moment to start communicating
self._logger.debug("Do we have a socket: {}".format(repr(self._socket)))
if not self._socket:
self._logger.info("Can't unregister because unable to communicate with Polar Cloud")
return False

self._logger.info("emit unregister")
self._socket.emit("unregister", {
"serialNumber": self._serial,
})
return True

#~~ cancel

def _on_cancel(self, data, *args, **kwargs):
Expand Down Expand Up @@ -1231,7 +1290,8 @@ def on_event(self, event, payload):

def get_api_commands(self, *args, **kwargs):
return dict(
register=[]
register=[],
unregister=[],
)

def is_api_adminonly(self, *args, **kwargs):
Expand All @@ -1241,14 +1301,26 @@ def on_api_command(self, command, data):
status='FAIL'
message=''
if command == 'register' and 'email' in data and 'pin' in data:
if 'machine_type' in data:
self._settings.set(['machine_type'], data['machine_type'])
if 'printer_type' in data:
self._printer_type = data['printer_type']
self._settings.set(['printer_type'], self._printer_type)
if 'email' in data:
self._email = data['email']
if 'pin' in data:
self._pin = data['pin']
if self._register(data['email'], data['pin']):
status = 'WAIT'
message = "Waiting for response from Polar Cloud"
else:
message = "Unable to communicate with Polar Cloud"
elif command == 'unregister':
if self._unregister():
status = 'WAIT'
message = "Waiting for response from Polar Cloud"
else:
message = "Unable to communicate with Polar Cloud"
else:
message = "Unable to understand command"
return flask.jsonify({'status': status, 'message': message})
Expand Down
122 changes: 100 additions & 22 deletions octoprint_polarcloud/static/js/polarcloud.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,45 +30,85 @@ $(function() {
self.registering = ko.observable(false);
self.registrationFailed = ko.observable(false);
self.registrationFailedReason = ko.observable("");
self.unregistering = ko.observable(false);
self.unregistrationFailed = ko.observable(false);
self.unregistrationFailedReason = ko.observable("");
self.machineTypes = ko.observableArray();
self.printerTypes = ko.observableArray();
self.nextPrintAvailable = ko.observable(false);
self.isPrinterTypesLoading = ko.observable(false);
self.machineType = ko.observable("");
self.printerType = ko.observable("");

self._ensureCurrentPrinterType = function() {
if (self.printerTypes().indexOf(self.settings.printer_type()) < 0)
self.printerTypes.push(self.settings.printer_type());
};
self.machineType.subscribe(function (value) {
if (value) {
self.settings.machine_type(value);
}
});

self.printerType.subscribe(function (value) {
if (value) {
self.settings.printer_type(value);
}
});

self.onBeforeBinding = function() {
self.settings = self.settingsViewModel.settings.plugins.polarcloud;
self._ensureCurrentPrinterType();
};

self.onSettingsShown = function() {
$.ajax(self.settings.service_ui() + "/api/v1/printer_makes", { headers: "" })
self.printerTypeOptionsValue = function(item) {
return item == "Other/Custom" ? self.settings.machine_type() : item;
}

self.printerTypeOptionsText = function(item) {
return item;
}

self.loadPrinterTypes = function(machine_type, printer_type) {
self.isPrinterTypesLoading(true);
$.ajax(self.settings.service_ui() + "/api/v1/printer_makes?filter=" + machine_type.toLocaleLowerCase(), { headers: "" })
.done(function(response) {
if ("printerMakes" in response) {
self.printerTypes(response["printerMakes"]);
self._ensureCurrentPrinterType();
self.isPrinterTypesLoading(false);
var options = response["printerMakes"];
options.push("Other/Custom");
self.printerTypes(options);
if (printer_type) {
self.printerType(printer_type);
}
}
});
self.nextPrintAvailable(false);
OctoPrint.simpleApiGet("polarcloud")
}

self.onSettingsShown = function() {
var initialMachineType = self.settings.machine_type();
var initialPrinterType = self.settings.printer_type();
$.ajax(self.settings.service_ui() + "/api/v1/printer_makes?filter=octoprint-build", { headers: "" })
.done(function(response) {
if ("capabilities" in response && response["capabilities"].indexOf("sendNextPrint") >= 0) {
self.nextPrintAvailable(true);
if ("printerMakes" in response) {
self.machineTypes(response["printerMakes"]);
self.machineType(initialMachineType);
self.loadPrinterTypes(initialMachineType, initialPrinterType);
}
});
};

self.showRegistration = function() {
self.emailAddress(self.settings.email());
$("#plugin_polarcloud_registration").modal("show");
self.onChangeMachineType = function(obj, event) {
if (event.originalEvent) {
self.loadPrinterTypes(self.machineType(), null);
}
}

self.changeRegistrationStatus = function() {
if(self.settings.serial()){
$("#plugin_polarcloud_unregistration").modal("show");
} else {
$("#plugin_polarcloud_registration").modal("show");
}
};

self.registerPrinter = function() {
if (self.registering())
return;
self.settings.email(self.emailAddress())
self.registering(true);
self.registrationFailed(false);
setTimeout(function() {
Expand All @@ -81,12 +121,32 @@ $(function() {
OctoPrint.simpleApiCommand("polarcloud", "register", {
"email": self.emailAddress(),
"pin": self.pin(),
"printer_type": self.settings.printer_type()
"printer_type": self.settings.printer_type(),
"machine_type": self.settings.machine_type()
}).done(function(response) {
console.log("polarcloud register response" + JSON.stringify(response));
});
};

self.unregisterPrinter = function() {
if (self.unregistering())
return;
self.unregistering(true);
self.unregistrationFailed(false);
setTimeout(function() {
if (self.unregistering()) {
self.unregistering(false);
self.unregistrationFailed(true);
self.unregistrationFailedReason("Couldn't connect to the Polar Cloud.");
}
}, 10000);
OctoPrint.simpleApiCommand("polarcloud", "unregister", {
"serialNumber": "test",
}).done(function(response) {
console.log("polarcloud unregister response" + JSON.stringify(response));
});
}

self.onDataUpdaterPluginMessage = function(plugin, data) {
if (plugin != "polarcloud")
return;
Expand All @@ -98,11 +158,29 @@ $(function() {
return;
}

if (data.command == "serial" && data.serial) {
if (data.command == "registration_success") {
self.settings.serial(data.serial);
self.settings.email(data.email);
self.settings.pin(data.pin);
self.registering(false);
$("#plugin_polarcloud_registration").modal("hide");
return
}

if (data.command == "unregistration_failed") {
self.unregistering(false);
self.unregistrationFailed(true);
self.unregistrationFailedReason(data.reason);
return;
}

if (data.command == "unregistration_success") {
self.unregistering(false);
self.settings.serial('');
self.settings.email('');
self.settings.pin('');
$("#plugin_polarcloud_unregistration").modal("hide");
}
self.registering(false);
$("#plugin_polarcloud_registration").modal("hide");
};
}

Expand Down
Loading

0 comments on commit 3b085a6

Please sign in to comment.