Implemented configurable terminal filters
parent
757294d2e2
commit
46500cea7c
|
@ -614,7 +614,8 @@ def getSettings():
|
||||||
"system": {
|
"system": {
|
||||||
"actions": s.get(["system", "actions"]),
|
"actions": s.get(["system", "actions"]),
|
||||||
"events": s.get(["system", "events"])
|
"events": s.get(["system", "events"])
|
||||||
}
|
},
|
||||||
|
"terminalFilters": s.get(["terminalFilters"])
|
||||||
})
|
})
|
||||||
|
|
||||||
@app.route(BASEURL + "settings", methods=["POST"])
|
@app.route(BASEURL + "settings", methods=["POST"])
|
||||||
|
@ -682,6 +683,9 @@ def setSettings():
|
||||||
if "temperature" in data.keys():
|
if "temperature" in data.keys():
|
||||||
if "profiles" in data["temperature"].keys(): s.set(["temperature", "profiles"], data["temperature"]["profiles"])
|
if "profiles" in data["temperature"].keys(): s.set(["temperature", "profiles"], data["temperature"]["profiles"])
|
||||||
|
|
||||||
|
if "terminalFilters" in data.keys():
|
||||||
|
s.set(["terminalFilters"], data["terminalFilters"])
|
||||||
|
|
||||||
if "system" in data.keys():
|
if "system" in data.keys():
|
||||||
if "actions" in data["system"].keys(): s.set(["system", "actions"], data["system"]["actions"])
|
if "actions" in data["system"].keys(): s.set(["system", "actions"], data["system"]["actions"])
|
||||||
if "events" in data["system"].keys(): s.set(["system", "events"], data["system"]["events"])
|
if "events" in data["system"].keys(): s.set(["system", "events"], data["system"]["events"])
|
||||||
|
|
|
@ -104,7 +104,11 @@ default_settings = {
|
||||||
"api": {
|
"api": {
|
||||||
"enabled": False,
|
"enabled": False,
|
||||||
"key": ''.join('%02X' % ord(z) for z in uuid.uuid4().bytes)
|
"key": ''.join('%02X' % ord(z) for z in uuid.uuid4().bytes)
|
||||||
}
|
},
|
||||||
|
"terminalFilters": [
|
||||||
|
{ "name": "Suppress M105 requests/responses", "regex": "(Send: M105)|(Recv: ok T:)" },
|
||||||
|
{ "name": "Suppress M27 requests/responses", "regex": "(Send: M27)|(Recv: SD printing byte)" }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
valid_boolean_trues = ["true", "yes", "y", "1"]
|
valid_boolean_trues = ["true", "yes", "y", "1"]
|
||||||
|
|
|
@ -9,7 +9,7 @@ $(function() {
|
||||||
var appearanceViewModel = new AppearanceViewModel(settingsViewModel);
|
var appearanceViewModel = new AppearanceViewModel(settingsViewModel);
|
||||||
var temperatureViewModel = new TemperatureViewModel(loginStateViewModel, settingsViewModel);
|
var temperatureViewModel = new TemperatureViewModel(loginStateViewModel, settingsViewModel);
|
||||||
var controlViewModel = new ControlViewModel(loginStateViewModel, settingsViewModel);
|
var controlViewModel = new ControlViewModel(loginStateViewModel, settingsViewModel);
|
||||||
var terminalViewModel = new TerminalViewModel(loginStateViewModel);
|
var terminalViewModel = new TerminalViewModel(loginStateViewModel, settingsViewModel);
|
||||||
var gcodeFilesViewModel = new GcodeFilesViewModel(printerStateViewModel, loginStateViewModel);
|
var gcodeFilesViewModel = new GcodeFilesViewModel(printerStateViewModel, loginStateViewModel);
|
||||||
var timelapseViewModel = new TimelapseViewModel(loginStateViewModel);
|
var timelapseViewModel = new TimelapseViewModel(loginStateViewModel);
|
||||||
var gcodeViewModel = new GcodeViewModel(loginStateViewModel);
|
var gcodeViewModel = new GcodeViewModel(loginStateViewModel);
|
||||||
|
|
|
@ -50,6 +50,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) {
|
||||||
|
|
||||||
self.system_actions = ko.observableArray([]);
|
self.system_actions = ko.observableArray([]);
|
||||||
|
|
||||||
|
self.terminalFilters = ko.observableArray([]);
|
||||||
|
|
||||||
self.addTemperatureProfile = function() {
|
self.addTemperatureProfile = function() {
|
||||||
self.temperature_profiles.push({name: "New", extruder:0, bed:0});
|
self.temperature_profiles.push({name: "New", extruder:0, bed:0});
|
||||||
};
|
};
|
||||||
|
@ -58,6 +60,14 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) {
|
||||||
self.temperature_profiles.remove(profile);
|
self.temperature_profiles.remove(profile);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
self.addTerminalFilter = function() {
|
||||||
|
self.terminalFilters.push({name: "New", regex: "(Send: M105)|(Recv: ok T:)"})
|
||||||
|
};
|
||||||
|
|
||||||
|
self.removeTerminalFilter = function(filter) {
|
||||||
|
self.terminalFilters.remove(filter);
|
||||||
|
};
|
||||||
|
|
||||||
self.requestData = function() {
|
self.requestData = function() {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: AJAX_BASEURL + "settings",
|
url: AJAX_BASEURL + "settings",
|
||||||
|
@ -110,6 +120,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) {
|
||||||
self.temperature_profiles(response.temperature.profiles);
|
self.temperature_profiles(response.temperature.profiles);
|
||||||
|
|
||||||
self.system_actions(response.system.actions);
|
self.system_actions(response.system.actions);
|
||||||
|
|
||||||
|
self.terminalFilters(response.terminalFilters);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.saveData = function() {
|
self.saveData = function() {
|
||||||
|
@ -163,7 +175,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) {
|
||||||
},
|
},
|
||||||
"system": {
|
"system": {
|
||||||
"actions": self.system_actions()
|
"actions": self.system_actions()
|
||||||
}
|
},
|
||||||
|
"terminalFilters": self.terminalFilters()
|
||||||
}
|
}
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
function TerminalViewModel(loginStateViewModel) {
|
function TerminalViewModel(loginStateViewModel, settingsViewModel) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
self.loginState = loginStateViewModel;
|
self.loginState = loginStateViewModel;
|
||||||
|
self.settings = settingsViewModel;
|
||||||
|
|
||||||
self.log = [];
|
self.log = [];
|
||||||
|
|
||||||
|
@ -16,23 +17,13 @@ function TerminalViewModel(loginStateViewModel) {
|
||||||
self.isLoading = ko.observable(undefined);
|
self.isLoading = ko.observable(undefined);
|
||||||
|
|
||||||
self.autoscrollEnabled = ko.observable(true);
|
self.autoscrollEnabled = ko.observable(true);
|
||||||
self.filterM105 = ko.observable(false);
|
|
||||||
self.filterM27 = ko.observable(false);
|
|
||||||
|
|
||||||
self.filters = ko.observableArray();
|
self.filters = self.settings.terminalFilters;
|
||||||
|
self.filterRegex = undefined;
|
||||||
|
|
||||||
self.regexM105 = /(Send: M105)|(Recv: ok T:)/;
|
self.activeFilters = ko.observableArray([]);
|
||||||
self.regexM27 = /(Send: M27)|(Recv: SD printing byte)/;
|
self.activeFilters.subscribe(function(e) {
|
||||||
|
self.updateFilterRegex();
|
||||||
self.filterM105.subscribe(function(newValue) {
|
|
||||||
self.updateOutput();
|
|
||||||
});
|
|
||||||
|
|
||||||
self.filterM27.subscribe(function(newValue) {
|
|
||||||
self.updateOutput();
|
|
||||||
});
|
|
||||||
|
|
||||||
self.filters.subscribe(function(newValue) {
|
|
||||||
self.updateOutput();
|
self.updateOutput();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -69,26 +60,23 @@ function TerminalViewModel(loginStateViewModel) {
|
||||||
self.isLoading(data.flags.loading);
|
self.isLoading(data.flags.loading);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.updateFilterRegex = function() {
|
||||||
|
var filterRegexStr = self.activeFilters().join("|").trim();
|
||||||
|
if (filterRegexStr == "") {
|
||||||
|
self.filterRegex = undefined;
|
||||||
|
} else {
|
||||||
|
self.filterRegex = new RegExp(filterRegexStr);
|
||||||
|
}
|
||||||
|
console.log("Terminal filter regex: " + filterRegexStr);
|
||||||
|
}
|
||||||
|
|
||||||
self.updateOutput = function() {
|
self.updateOutput = function() {
|
||||||
if (!self.log)
|
if (!self.log)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var output = "";
|
var output = "";
|
||||||
for (var i = 0; i < self.log.length; i++) {
|
for (var i = 0; i < self.log.length; i++) {
|
||||||
var filters = self.filters();
|
if (self.filterRegex !== undefined && self.log[i].match(self.filterRegex)) continue;
|
||||||
var filtered = false;
|
|
||||||
for (var j = 0; j < filters.length; j++) {
|
|
||||||
var filter = filters[j];
|
|
||||||
if (self.log[i].match(filter.regex)) {
|
|
||||||
filtered = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (filtered) continue;
|
|
||||||
|
|
||||||
if (self.filterM105() && self.log[i].match(self.regexM105)) continue;
|
|
||||||
if (self.filterM27() && self.log[i].match(self.regexM27)) continue;
|
|
||||||
|
|
||||||
output += self.log[i] + "\n";
|
output += self.log[i] + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,4 +115,5 @@ function TerminalViewModel(loginStateViewModel) {
|
||||||
self.sendCommand();
|
self.sendCommand();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -511,12 +511,11 @@
|
||||||
<label class="checkbox">
|
<label class="checkbox">
|
||||||
<input type="checkbox" id="terminal-autoscroll" data-bind="checked: autoscrollEnabled"> Autoscroll
|
<input type="checkbox" id="terminal-autoscroll" data-bind="checked: autoscrollEnabled"> Autoscroll
|
||||||
</label>
|
</label>
|
||||||
<label class="checkbox">
|
<div data-bind="foreach: filters">
|
||||||
<input type="checkbox" id="terminal-filterM105" data-bind="checked: filterM105"> Suppress M105 requests/responses
|
<label class="checkbox">
|
||||||
</label>
|
<input type="checkbox" data-bind="attr: { value: regex }, checked: $parent.activeFilters"> <span data-bind="text: name"></span>
|
||||||
<label class="checkbox">
|
</label>
|
||||||
<input type="checkbox" id="terminal-filterM27" data-bind="checked: filterM27"> Suppress M27 requests/responses
|
</div>
|
||||||
</label>
|
|
||||||
|
|
||||||
<div class="input-append" style="display: none;" data-bind="visible: loginState.isUser">
|
<div class="input-append" style="display: none;" data-bind="visible: loginState.isUser">
|
||||||
<input type="text" id="terminal-command" data-bind="value: command, event: { keyup: function(d,e) { handleEnter(e); } }, enable: isOperational() && loginState.isUser()">
|
<input type="text" id="terminal-command" data-bind="value: command, event: { keyup: function(d,e) { handleEnter(e); } }, enable: isOperational() && loginState.isUser()">
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
<li class="active"><a href="#settings_serialConnection" data-toggle="tab">Serial Connection</a></li>
|
<li class="active"><a href="#settings_serialConnection" data-toggle="tab">Serial Connection</a></li>
|
||||||
<li><a href="#settings_printerParameters" data-toggle="tab">Printer Parameters</a></li>
|
<li><a href="#settings_printerParameters" data-toggle="tab">Printer Parameters</a></li>
|
||||||
<li><a href="#settings_temperature" data-toggle="tab">Temperatures</a></li>
|
<li><a href="#settings_temperature" data-toggle="tab">Temperatures</a></li>
|
||||||
|
<li><a href="#settings_terminalFilters" data-toggle="tab">Terminal filters</a></li>
|
||||||
<li class="nav-header">Features</li>
|
<li class="nav-header">Features</li>
|
||||||
<li><a href="#settings_features" data-toggle="tab">Features</a></li>
|
<li><a href="#settings_features" data-toggle="tab">Features</a></li>
|
||||||
<li><a href="#settings_webcam" data-toggle="tab">Webcam</a></li>
|
<li><a href="#settings_webcam" data-toggle="tab">Webcam</a></li>
|
||||||
|
@ -256,6 +257,32 @@
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="tab-pane" id="settings_terminalFilters">
|
||||||
|
<form class="form-horizontal">
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span4"><h4>Name</h4></div>
|
||||||
|
<div class="span6"><h4>RegExp <small><a href="https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions">?</a></small></h4></div>
|
||||||
|
</div>
|
||||||
|
<div data-bind="foreach: terminalFilters">
|
||||||
|
<div class="row-fluid" style="margin-bottom: 5px">
|
||||||
|
<div class="span4">
|
||||||
|
<input type="text" class="span12" data-bind="value: name">
|
||||||
|
</div>
|
||||||
|
<div class="span6">
|
||||||
|
<input type="text" class="span12" data-bind="value: regex">
|
||||||
|
</div>
|
||||||
|
<div class="span2">
|
||||||
|
<button title="Remove Filter" class="btn btn-danger" data-bind="click: $parent.removeTerminalFilter"><i class="icon-trash"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="offset10 span2">
|
||||||
|
<button title="Add Filter" class="btn btn-primary" data-bind="click: addTerminalFilter"><i class="icon-plus"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
<div class="tab-pane" id="settings_appearance">
|
<div class="tab-pane" id="settings_appearance">
|
||||||
<form class="form-horizontal">
|
<form class="form-horizontal">
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
|
|
Loading…
Reference in New Issue