gpx.js
1 $(function() { 2 3 function Axis() { 4 this.max_feedrate = undefined; 5 this.home_feedrate = undefined; 6 this.steps_per_mm = undefined; 7 this.endstop = undefined; 8 }; 9 10 function Extruder() { 11 this.max_feedrate = undefined; 12 this.steps_per_mm = undefined; 13 this.motor_steps = undefined; 14 }; 15 16 function ExtruderOverride() { 17 this.active_temperature = undefined; 18 this.standby_temperature = undefined; 19 this.build_platform_temperature = undefined; 20 this.actual_filament_diameter = undefined; 21 this.packing_density = undefined; 22 }; 23 24 function GpxSettingsViewModel(parameters) { 25 var self = this; 26 27 self.settingsViewModel = parameters[0]; 28 self.isOperational = parameters[1].isOperational; 29 self.haveData = false; 30 31 var iniInitial = { 32 printer: { 33 machine_type: "r1d", 34 gcode_flavor: "reprap", 35 ditto_printing: 0, 36 build_progress: 1, 37 packing_density: undefined, 38 recalculate_5d: 0, 39 slicer_filament_diameter: undefined, 40 build_platform_temperature: undefined, 41 sd_card_path: undefined 42 }, 43 x: new Axis(), 44 y: new Axis(), 45 z: new Axis(), 46 a: new Extruder(), 47 b: new Extruder(), 48 left: new ExtruderOverride(), 49 right: new ExtruderOverride(), 50 machine: { 51 nozzle_diameter: undefined, 52 extruder_count: undefined, 53 has_heated_build_platform: undefined, // bool 54 timeout: undefined 55 } 56 }; 57 58 self.ini = ko.mapping.fromJS(iniInitial); 59 60 self.showMachineDialog = function() { 61 $("#gpx_machine_settings").modal("show"); 62 }; 63 64 self.showEepromDialog = function() { 65 $("#gpx_eeprom_settings").modal({ 66 minHeight: function() { return Math.min($.fn.modal.defaults.maxHeight(), 645) } 67 }); 68 }; 69 70 self.requestData = function() { 71 OctoPrint.get("plugin/GPX/ini", { 72 dataType: "json", 73 contentType: "application/json; charset=UTF-8", 74 }) 75 .done(function(data) { 76 ko.mapping.fromJS(data, self.ini); 77 self.haveData = true; 78 }); 79 }; 80 81 self.onBeforeBinding = function () { 82 self.settings = self.settingsViewModel.settings; 83 }; 84 85 self.onAfterBinding = function() { 86 $('#gpx_settings').find('[data-toggle=tooltip]').tooltip({placement: 'left'}); 87 $('#gpx_machine_settings').find('[data-toggle=tooltip]').tooltip(); 88 }; 89 90 self.onSettingsShown = self.requestData; 91 92 self.onSettingsBeforeSave = function() { 93 if (self.haveData) { 94 var ini = ko.mapping.toJS(self.ini); 95 OctoPrint.postJson("plugin/GPX/ini", ini, {dataType: "text"}) 96 .fail(function() { 97 var text = gettext("There was unexpected error while saving the GPX settings, please consult the logs."); 98 new PNotify({title: gettext("GPX settings failed"), text: text, type: "error", hide: false}); 99 }); 100 } 101 }; 102 }; 103 104 function GpxMachineViewModel(parameters) { 105 var self = this; 106 107 self.gpx = parameters[0]; 108 109 var machineInitial = { 110 x: new Axis(), 111 y: new Axis(), 112 z: new Axis(), 113 a: new Extruder(), 114 b: new Extruder(), 115 machine: { 116 slicer_filament_diameter: undefined, 117 packing_density: undefined, 118 nozzle_diameter: undefined, 119 extruder_count: undefined, 120 has_heated_build_platform: undefined, // bool 121 timeout: undefined 122 } 123 }; 124 125 self.machine = ko.mapping.fromJS(machineInitial); 126 127 $("#gpx_machine_settings").on("show", function(event) { 128 if (event.target.id == "gpx_machine_settings") 129 self.requestMachine(); 130 }); 131 132 self.requestMachine = function() { 133 OctoPrint.get("plugin/GPX/machine/" + self.gpx.ini.printer.machine_type(), {dataType: "json"}) 134 .done(function(data) { 135 ko.mapping.fromJS(data, self.machine); 136 }); 137 }; 138 139 self.requestMachineDefaults = function() { 140 OctoPrint.get("plugin/GPX/defaultmachine/" + self.gpx.ini.printer.machine_type(), {dataType: "json"}) 141 .done(function(data) { 142 ko.mapping.fromJS(data, self.machine); 143 }); 144 }; 145 146 self.saveMachineSettings = function() { 147 var machine = ko.mapping.toJS(self.machine); 148 OctoPrint.postJson("plugin/GPX/machine/" + self.gpx.ini.printer.machine_type(), machine, {dataType: "text"}) 149 .fail(function() { 150 var text = gettext("There was unexpected error while saving the GPX machine definition, please consult the logs."); 151 new PNotify({title: gettext("GPX machine settings failed"), text: text, type: "error", hide: false}); 152 }); 153 $("#gpx_machine_settings").modal("hide"); 154 }; 155 }; 156 157 function GpxEepromViewModel(parameters) { 158 var self = this; 159 160 self.gpx = parameters[0]; 161 162 self.axes = { X: 0, Y: 1, Z: 2, A: 3, B: 4 }; 163 164 var eeprom = { 165 TOOL_COUNT: undefined, 166 HBP_PRESENT: undefined, 167 PSTOP_ENABLE: undefined, 168 CLEAR_FOR_ESTOP: undefined, 169 AXIS_INVERSION: undefined, 170 ENDSTOP_INVERSION: undefined, 171 TOOLHEAD_OFFSET_SETTINGS_X: undefined, 172 TOOLHEAD_OFFSET_SETTINGS_Y: undefined, 173 DIGI_POT_SETTINGS_0: undefined, 174 DIGI_POT_SETTINGS_1: undefined, 175 DIGI_POT_SETTINGS_2: undefined, 176 DIGI_POT_SETTINGS_3: undefined, 177 DIGI_POT_SETTINGS_4: undefined, 178 ACCELERATION_ACTIVE: undefined, 179 SLOWDOWN_FLAG: undefined, 180 OVERRIDE_GCODE_TEMP: undefined, 181 HEAT_DURING_PAUSE: undefined, 182 SD_USE_CRC: undefined, 183 EXTRUDER_HOLD: undefined, 184 EXTRUDER_DEPRIME_ON_TRAVEL: undefined, 185 EXTRUDER_DEPRIME_STEPS_A: undefined, 186 EXTRUDER_DEPRIME_STEPS_B: undefined, 187 ALEVEL_MAX_ZPROBE_HITS: undefined, 188 ALEVEL_MAX_ZDELTA: undefined, 189 T0_EXTRUDER_P_TERM: undefined, 190 T0_EXTRUDER_I_TERM: undefined, 191 T0_EXTRUDER_D_TERM: undefined, 192 HBP_P_TERM: undefined, 193 HBP_I_TERM: undefined, 194 HBP_D_TERM: undefined, 195 T1_EXTRUDER_P_TERM: undefined, 196 T1_EXTRUDER_I_TERM: undefined, 197 T1_EXTRUDER_D_TERM: undefined, 198 JKN_ADVANCE_K: undefined, 199 JKN_ADVANCE_K2: undefined, 200 TOOLHEAD_OFFSET_SETTINGS_X: undefined, 201 TOOLHEAD_OFFSET_SETTINGS_Y: undefined, 202 COOLING_FAN_DUTY_CYCLE: undefined, 203 T0_COOLING_ENABLE: undefined, 204 T0_COOLING_SETPOINT_C: undefined, 205 T1_COOLING_ENABLE: undefined, 206 T1_COOLING_SETPOINT_C: undefined, 207 }; 208 for (axis in self.axes) { 209 eeprom["AXIS_HOME_POSITIONS_STEPS_" + axis] = undefined; 210 eeprom["AXIS_STEPS_PER_MM_" + axis] = undefined; 211 eeprom["MAX_ACCELERATION_AXIS_" + axis] = undefined; 212 eeprom["MAX_SPEED_CHANGE_" + axis] = undefined; 213 } 214 215 self.eeprom = ko.mapping.fromJS(eeprom); 216 self.eepromids = Object.keys(eeprom); 217 218 self.is_saving = ko.observable(false); 219 self.show_fan_pwm = ko.computed(function() { return self.eeprom.COOLING_FAN_DUTY_CYCLE() != undefined && self.eeprom.COOLING_FAN_DUTY_CYCLE() != 255; }, this) 220 self.z_hold = ko.observable(undefined); 221 self.jkn_k = ko.observable(undefined); 222 self.jkn_k2 = ko.observable(undefined); 223 self.max_zdelta = ko.observable(undefined); 224 self.toolhead_offset = { 225 X: ko.observable(undefined), 226 Y: ko.observable(undefined) 227 }; 228 229 self.invert_axis = {}; 230 self.invert_endstop = {}; 231 self.home = {}; 232 self.steps_per_mm = {}; 233 for (axis in self.axes) { 234 self.invert_axis[axis] = ko.observable(undefined); 235 self.invert_endstop[axis] = ko.observable(undefined); 236 self.home[axis] = ko.observable(undefined); 237 self.steps_per_mm[axis] = ko.observable(1.0); 238 } 239 240 $("#gpx_eeprom_settings").on("show", function(event) { 241 if (event.target.id == "gpx_eeprom_settings") { 242 self.requestEepromSettings(); 243 } 244 }); 245 246 self.requestEepromSettings = function() { 247 OctoPrint.postJson("plugin/GPX/eeprombatch", self.eepromids, {dataType: "json"}) 248 .done(function(response) { 249 self.eeprom_raw = response; 250 ko.mapping.fromJS(response, self.eeprom); 251 bit = 0x1; 252 for (axis in self.axes) { 253 self.steps_per_mm[axis](self.eeprom["AXIS_STEPS_PER_MM_" + axis]() / 1000000.0); 254 self.home[axis](self.eeprom["AXIS_HOME_POSITIONS_STEPS_" + axis]() / self.steps_per_mm[axis]()); 255 self.invert_axis[axis](!!(self.eeprom.AXIS_INVERSION() & bit)); 256 self.invert_endstop[axis](!!(self.eeprom.ENDSTOP_INVERSION() & bit)); 257 bit <<= 1; 258 } 259 self.z_hold(!(self.eeprom.AXIS_INVERSION() & 0x80)); 260 self.jkn_k(self.eeprom.JKN_ADVANCE_K() / 100000.0); 261 self.jkn_k2(self.eeprom.JKN_ADVANCE_K2() / 100000.0); 262 self.toolhead_offset.X(self.eeprom.TOOLHEAD_OFFSET_SETTINGS_X() /self.steps_per_mm.X()); 263 self.toolhead_offset.Y(self.eeprom.TOOLHEAD_OFFSET_SETTINGS_Y() /self.steps_per_mm.Y()); 264 self.max_zdelta(self.eeprom.ALEVEL_MAX_ZDELTA() / self.steps_per_mm.Z()); 265 }).fail(function(response) { 266 console.log(response); 267 new PNotify({ 268 title: gettext("Unable to read EEPROM"), 269 text: gettext("Unable to read EEPROM settings. Perhaps because I don't have a matching EEPROM map for your firmware type or version."), 270 type: "error" 271 }); 272 $("#gpx_eeprom_settings").modal("hide"); 273 }); 274 }; 275 276 self.saveEepromSettings = function() { 277 self.is_saving(true); 278 var bit = 0x1; 279 var axis_inversion = self.eeprom.AXIS_INVERSION() & 0x60; 280 var endstop_inversion = self.eeprom.ENDSTOP_INVERSION() & 0xe0; 281 for (axis in self.axes) { 282 self.eeprom["AXIS_HOME_POSITIONS_STEPS_" + axis]((self.home[axis]() * self.steps_per_mm[axis]()) | 0); 283 if (self.invert_axis[axis]()) axis_inversion |= bit; 284 if (self.invert_endstop[axis]()) endstop_inversion |= bit; 285 bit <<= 1; 286 } 287 if (!self.z_hold()) axis_inversion |= 0x80; 288 self.eeprom.AXIS_INVERSION(axis_inversion); 289 self.eeprom.ENDSTOP_INVERSION(endstop_inversion); 290 self.eeprom.JKN_ADVANCE_K((self.jkn_k() * 100000) | 0); 291 self.eeprom.JKN_ADVANCE_K2((self.jkn_k2() * 100000) | 0); 292 self.eeprom.TOOLHEAD_OFFSET_SETTINGS_X((self.toolhead_offset.X() * self.steps_per_mm.X()) | 0); 293 self.eeprom.TOOLHEAD_OFFSET_SETTINGS_Y((self.toolhead_offset.Y() * self.steps_per_mm.Y()) | 0); 294 self.eeprom.ALEVEL_MAX_ZDELTA((self.max_zdelta() * self.steps_per_mm.Z()) | 0); 295 296 var eeprom = {}; 297 var update = false; 298 for (var id in self.eeprom_raw) { 299 if (self.eeprom[id]() != self.eeprom_raw[id]) { 300 console.log("id: " + id + " value: " + self.eeprom[id]() + " orig: " + self.eeprom_raw[id]); 301 eeprom[id] = self.eeprom[id](); 302 update = true; 303 } 304 } 305 if (!update) { 306 $("#gpx_eeprom_settings").modal("hide"); 307 self.is_saving(false); 308 } 309 else { 310 OctoPrint.postJson("plugin/GPX/puteeprombatch", eeprom, {dataType: "text"}) 311 .done(function(response) { 312 console.log(response); 313 self.is_saving(false); 314 $("#gpx_eeprom_settings").modal("hide"); 315 }).fail(function(response) { 316 console.log(response); 317 new PNotify({ 318 title: gettext("EEPROM not updated!"), 319 text: gettext("Unable to save some or all of your changes. Please consult the log for details."), 320 type: "error" 321 }); 322 }).always(function() { 323 self.is_saving(false); 324 }); 325 } 326 }; 327 }; 328 329 OCTOPRINT_VIEWMODELS.push([ 330 GpxSettingsViewModel, 331 ["settingsViewModel", "printerStateViewModel"], 332 ["#gpx_settings"] 333 ]); 334 OCTOPRINT_VIEWMODELS.push([ 335 GpxMachineViewModel, 336 ["gpxSettingsViewModel"], 337 ["#gpx_machine_settings"] 338 ]); 339 OCTOPRINT_VIEWMODELS.push([ 340 GpxEepromViewModel, 341 ["gpxSettingsViewModel"], 342 ["#gpx_eeprom_settings"] 343 ]); 344 });