/ octoprint_GPX / static / js / gpx.js
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  });