MrDraw/src/octoprint/static/js/app/viewmodels/connection.js

160 lines
6 KiB
JavaScript

$(function() {
function ConnectionViewModel(parameters) {
var self = this;
self.loginState = parameters[0];
self.settings = parameters[1];
self.printerProfiles = parameters[2];
self.printerProfiles.profiles.items.subscribe(function() {
var allProfiles = self.printerProfiles.profiles.items();
var printerOptions = [];
_.each(allProfiles, function(profile) {
printerOptions.push({id: profile.id, name: profile.name});
});
self.printerOptions(printerOptions);
});
self.printerProfiles.currentProfile.subscribe(function() {
self.selectedPrinter(self.printerProfiles.currentProfile());
});
self.portOptions = ko.observableArray(undefined);
self.baudrateOptions = ko.observableArray(undefined);
self.printerOptions = ko.observableArray(undefined);
self.selectedPort = ko.observable(undefined);
self.selectedBaudrate = ko.observable(undefined);
self.selectedPrinter = ko.observable(undefined);
self.saveSettings = ko.observable(undefined);
self.autoconnect = ko.observable(undefined);
self.isErrorOrClosed = ko.observable(undefined);
self.isOperational = ko.observable(undefined);
self.isPrinting = ko.observable(undefined);
self.isPaused = ko.observable(undefined);
self.isError = ko.observable(undefined);
self.isReady = ko.observable(undefined);
self.isLoading = ko.observable(undefined);
self.isFlashing = ko.observable(false);
self.buttonText = ko.computed(function() {
if (self.isErrorOrClosed())
return gettext("Connect");
else
return gettext("Disconnect");
});
self.previousIsOperational = undefined;
self.requestData = function() {
$.ajax({
url: API_BASEURL + "connection",
method: "GET",
dataType: "json",
success: function(response) {
self.fromResponse(response);
}
})
};
self.fromResponse = function(response) {
var ports = response.options.ports;
var baudrates = response.options.baudrates;
var portPreference = response.options.portPreference;
var baudratePreference = response.options.baudratePreference;
var printerPreference = response.options.printerProfilePreference;
var printerProfiles = response.options.printerProfiles;
self.portOptions(ports);
self.baudrateOptions(baudrates);
if (!self.selectedPort() && ports && ports.indexOf(portPreference) >= 0)
self.selectedPort(portPreference);
if (!self.selectedBaudrate() && baudrates && baudrates.indexOf(baudratePreference) >= 0)
self.selectedBaudrate(baudratePreference);
if (!self.selectedPrinter() && printerProfiles && printerProfiles.indexOf(printerPreference) >= 0)
self.selectedPrinter(printerPreference);
self.saveSettings(false);
};
self.fromHistoryData = function(data) {
self._processStateData(data.state);
};
self.fromCurrentData = function(data) {
self._processStateData(data.state);
};
self._processStateData = function(data) {
self.previousIsOperational = self.isOperational();
self.isErrorOrClosed(data.flags.closedOrError);
self.isOperational(data.flags.operational);
self.isPaused(data.flags.paused);
self.isPrinting(data.flags.printing);
self.isError(data.flags.error);
self.isReady(data.flags.ready);
self.isLoading(data.flags.loading);
self.isFlashing(data.flags.flashing);
var connectionTab = $("#connection_wrapper");
if (self.previousIsOperational != self.isOperational()) {
if (self.isOperational() && connectionTab.hasClass("in")) {
// connection just got established, close connection tab for now
// connectionTab.collapse("hide");
} else if (!connectionTab.hasClass("in")) {
// connection just dropped, make sure connection tab is open
// connectionTab.collapse("show");
}
}
};
self.connect = function() {
if (self.isErrorOrClosed()) {
var data = {
"command": "connect",
"port": self.selectedPort() || "AUTO",
"baudrate": self.selectedBaudrate() || 0,
"printerProfile": self.selectedPrinter(),
"autoconnect": self.settings.serial_autoconnect()
};
if (self.saveSettings())
data["save"] = true;
$.ajax({
url: API_BASEURL + "connection",
type: "POST",
dataType: "json",
contentType: "application/json; charset=UTF-8",
data: JSON.stringify(data),
success: function(response) {
self.settings.requestData();
self.settings.printerProfiles.requestData();
}
});
} else {
self.requestData();
$.ajax({
url: API_BASEURL + "connection",
type: "POST",
dataType: "json",
contentType: "application/json; charset=UTF-8",
data: JSON.stringify({"command": "disconnect"})
})
}
};
self.onStartup = function() {
self.requestData();
};
}
OCTOPRINT_VIEWMODELS.push([
ConnectionViewModel,
["loginStateViewModel", "settingsViewModel", "printerProfilesViewModel"],
"#connection_wrapper"
]);
});