"use strict"; module.exports = { template: "#motor-view-template", props: [ "index", "config", "template", "state" ], computed: { metric: function() { return this.$root.display_units === "METRIC"; }, is_slave: function() { for (let i = 0; i < this.index; i++) { if (this.motor.axis == this.config.motors[i].axis) { return true; } } return false; }, motor: function() { return this.config.motors[this.index]; }, invalidMaxVelocity: function() { return this.maxMaxVelocity < this.motor["max-velocity"]; }, maxMaxVelocity: function() { return 1 * (15 * this.umPerStep / this.motor["microsteps"]).toFixed(3); }, ustepPerSec: function() { return this.rpm * this.stepsPerRev * this.motor["microsteps"] / 60; }, rpm: function() { return 1000 * this.motor["max-velocity"] / this.motor["travel-per-rev"]; }, gForce: function() { return this.motor["max-accel"] * 0.0283254504; }, gForcePerMin: function() { return this.motor["max-jerk"] * 0.0283254504; }, stepsPerRev: function() { return 360 / this.motor["step-angle"]; }, umPerStep: function() { return this.motor["travel-per-rev"] * this.motor["step-angle"] / 0.36; }, milPerStep: function() { return this.umPerStep / 25.4; }, invalidStallVelocity: function() { if (!this.motor["homing-mode"].startsWith("stall-")) { return false; } return this.maxStallVelocity < this.motor["search-velocity"]; }, stallRPM: function() { const v = this.motor["search-velocity"]; return 1000 * v / this.motor["travel-per-rev"]; }, maxStallVelocity: function() { const maxRate = 900000 / this.motor["stall-sample-time"]; const ustep = this.motor["stall-microstep"]; const angle = this.motor["step-angle"]; const travel = this.motor["travel-per-rev"]; const maxStall = maxRate * 60 / 360 / 1000 * angle / ustep * travel; return 1 * maxStall.toFixed(3); }, stallUStepPerSec: function() { const ustep = this.motor["stall-microstep"]; return this.stallRPM * this.stepsPerRev * ustep / 60; }, current_axis: function() { return this.state[this.index + 'an']; }, current_max_velocity: function() { return this.state[this.index + 'vm']; }, current_max_soft_limit: function() { return this.state[this.index + 'tm']; }, current_min_soft_limit: function() { return this.state[this.index + 'tn']; }, current_max_accel: function() { return this.state[this.index + 'am']; }, current_max_jerk: function() { return this.state[this.index + 'jm']; }, current_step_angle: function() { return this.state[this.index + 'sa']; }, current_travel_per_rev: function() { return this.state[this.index + 'tr']; }, current_microsteps: function() { return this.state[this.index + 'mi']; } }, attached: function() { // Sync all state values with motor config when component is ready // This ensures UI shows correct values when component is first loaded console.log("Syncing state to motor config for motor index ",this.index); this.syncStateToConfig(); }, watch: { current_axis(new_value) { const motor_axes = ["X", "Y", "Z", "A", "B", "C"] if(motor_axes[new_value] != this.motor['axis']){ this.motor['axis'] = motor_axes[new_value]; } }, current_max_velocity(new_value) { if(new_value != this.motor['max-velocity']) { this.motor['max-velocity'] = new_value; } }, current_max_soft_limit(new_value) { if(new_value != this.motor['max-soft-limit']) { this.motor['max-soft-limit'] = new_value; } }, current_min_soft_limit(new_value) { if(new_value != this.motor['min-soft-limit']) { this.motor['min-soft-limit'] = new_value; } }, current_max_accel(new_value) { if(new_value != this.motor['max-accel']) { this.motor['max-accel'] = new_value; } }, current_max_jerk(new_value) { if(new_value != this.motor['max-jerk']) { this.motor['max-jerk'] = new_value; } }, current_step_angle(new_value) { if(new_value != this.motor['step-angle']) { this.motor['step-angle'] = new_value; } }, current_travel_per_rev(new_value) { if(new_value != this.motor['travel-per-rev']) { this.motor['travel-per-rev'] = new_value; } }, current_microsteps(new_value) { if(new_value != this.motor['microsteps']) { this.motor['microsteps'] = new_value; } } }, events: { "input-changed": function() { Vue.nextTick(function() { // Limit max-velocity if (this.invalidMaxVelocity) { this.$set('motor["max-velocity"]', this.maxMaxVelocity); } //Limit stall-velocity if (this.invalidStallVelocity) { this.$set('motor["search-velocity"]', this.maxStallVelocity); } this.$dispatch("config-changed"); }.bind(this)); return false; } }, methods: { show: function(name, templ) { if (templ.hmodes == undefined) { return true; } return templ.hmodes.indexOf(this.motor["homing-mode"]) != -1; }, syncStateToConfig: function() { // Force sync all state values to motor config // This ensures the UI reflects the current state even if changes happened while component was unmounted if(this.state == undefined) { console.log("State is undefined"); return; } if (this.state[this.index + 'an'] != this.motor['axis']) { const motor_axes = ["X", "Y", "Z", "A", "B", "C"]; this.$set('motor["axis"]', motor_axes[this.state[this.index + 'an']]); } if (this.state[this.index + 'vm'] != this.motor['max-velocity']) { this.$set('motor["max-velocity"]', this.state[this.index + 'vm']); } if (this.state[this.index + 'tm'] != this.motor['max-soft-limit']) { this.$set('motor["max-soft-limit"]', this.state[this.index + 'tm']); } if (this.state[this.index + 'tn'] != this.motor['min-soft-limit']) { this.$set('motor["min-soft-limit"]', this.state[this.index + 'tn']); } if (this.state[this.index + 'am'] != this.motor['max-accel']) { this.$set('motor["max-accel"]', this.state[this.index + 'am']); } if (this.state[this.index + 'jm'] != this.motor['max-jerk']) { this.$set('motor["max-jerk"]', this.state[this.index + 'jm']); } if (this.state[this.index + 'sa'] != this.motor['step-angle']) { this.$set('motor["step-angle"]', this.state[this.index + 'sa']); } if (this.state[this.index + 'tr'] != this.motor['travel-per-rev']) { this.$set('motor["travel-per-rev"]', this.state[this.index + 'tr']); } if (this.state[this.index + 'mi'] != this.motor['microsteps']) { this.$set('motor["microsteps"]', this.state[this.index + 'mi']); } } } };