[GUI] added enum generator npm script, cleaned up use of enums in Axis.vue, fixed various setTimeout bugs

This commit is contained in:
PAJohnson
2020-12-10 20:46:10 -05:00
parent adadef86aa
commit e41c65cd6a
8 changed files with 222 additions and 309 deletions
+1 -1
View File
@@ -16,7 +16,7 @@ else
endif
ifneq (,$(findstring v3.,$(CONFIG_BOARD_VERSION)))
OPENOCD := openocd -f interface/stlink.cfg $(PROGRAMMER_CMD) -f target/stm32f4x.cfg -c init
OPENOCD := openocd -f interface/stlink-v2.cfg $(PROGRAMMER_CMD) -f target/stm32f4x.cfg -c init
GDB := arm-none-eabi-gdb --ex 'target extended-remote | openocd -f "interface/stlink-v2.cfg" -f "target/stm32f4x.cfg" -c "gdb_port pipe; log_output openocd.log"' --ex 'monitor reset halt'
else ifneq (,$(findstring v4.,$(CONFIG_BOARD_VERSION)))
OPENOCD := openocd -f interface/stlink.cfg $(PROGRAMMER_CMD) -f target/stm32f7x.cfg -c 'reset_config none separate' -c init
+4 -1
View File
@@ -6,7 +6,10 @@
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"electron:build": "electron-icon-builder --input=./public/icon.png --output=build --flatten && vue-cli-service electron:build",
"enumGenerate": "node scripts/enumGenerate.js",
"preelectron:build": "electron-icon-builder --input=./public/icon.png --output=build --flatten && npm run enumGenerate",
"electron:build": "vue-cli-service electron:build",
"preelectron:serve": "npm run enumGenerate",
"electron:serve": "vue-cli-service electron:serve",
"postinstall": "electron-builder install-app-deps",
"postuninstall": "electron-builder install-app-deps",
+25
View File
@@ -0,0 +1,25 @@
const fs = require('fs');
const path = require('path');
fs.readFile(path.resolve(__dirname,'../../tools/odrive/enums.py'), 'utf8', function(err, data) {
if (err) throw err;
let enumsString = data;
let lines = enumsString.split('\n');
let enums = {};
for (const line of lines) {
if (line != '' && line[0] != '#') {
// get word
// get = value
let name;
let value;
name = line.split('=')[0];
value = line.split('=')[1];
enums[name.trim()] = parseInt(value.trim());
}
}
fs.writeFile(path.resolve(__dirname, '../src/assets/odriveEnums.json'), JSON.stringify(enums, null, 4), function(err) {
if (err) throw err;
});
console.log('Wrote ODrive enums to GUI/src/assets/odriveEnums.json');
});
-10
View File
@@ -142,16 +142,6 @@ export default {
console.log(dashName);
this.$store.commit("setDash", dashName);
},
//updateOdrives() {
// if (this.$store.state.serverConnected == true) {
//} && this.sampling == false) {
// this.$store.dispatch("getOdrives");
// }
//setTimeout(() => {
// this.updateOdrives();
//}, 1000);
//console.log("updating data...");
//},
addDash() {
let dashname = "Dashboard " + (this.dashboards.length - 2);
this.dashboards.push({
+121 -129
View File
@@ -1,131 +1,123 @@
{
"GPIO_MODE_DIGITAL" : 0,
"GPIO_MODE_DIGITAL_PULL_UP" : 1,
"GPIO_MODE_DIGITAL_PULL_DOWN" : 2,
"GPIO_MODE_ANALOG_IN" : 3,
"GPIO_MODE_UART0" : 4,
"GPIO_MODE_UART1" : 5,
"GPIO_MODE_UART2" : 6,
"GPIO_MODE_CAN0" : 7,
"GPIO_MODE_I2C0" : 8,
"GPIO_MODE_SPI0" : 9,
"GPIO_MODE_PWM0" : 10,
"GPIO_MODE_ENC0" : 11,
"GPIO_MODE_ENC1" : 12,
"GPIO_MODE_ENC2" : 13,
"PROTOCOL_SIMPLE" : 0,
"AXIS_STATE_UNDEFINED" : 0,
"AXIS_STATE_IDLE" : 1,
"AXIS_STATE_STARTUP_SEQUENCE" : 2,
"AXIS_STATE_FULL_CALIBRATION_SEQUENCE" : 3,
"AXIS_STATE_MOTOR_CALIBRATION" : 4,
"AXIS_STATE_SENSORLESS_CONTROL" : 5,
"AXIS_STATE_ENCODER_INDEX_SEARCH" : 6,
"AXIS_STATE_ENCODER_OFFSET_CALIBRATION" : 7,
"AXIS_STATE_CLOSED_LOOP_CONTROL" : 8,
"AXIS_STATE_LOCKIN_SPIN" : 9,
"AXIS_STATE_ENCODER_DIR_FIND" : 10,
"AXIS_STATE_HOMING" : 11,
"ENCODER_MODE_INCREMENTAL" : 0,
"ENCODER_MODE_HALL" : 1,
"ENCODER_MODE_SINCOS" : 2,
"ENCODER_MODE_SPI_ABS_CUI" : 256,
"ENCODER_MODE_SPI_ABS_AMS" : 257,
"ENCODER_MODE_SPI_ABS_AEAT" : 258,
"ENCODER_MODE_SPI_ABS_RLS" : 259,
"CONTROL_MODE_VOLTAGE_CONTROL" : 0,
"CONTROL_MODE_TORQUE_CONTROL" : 1,
"CONTROL_MODE_VELOCITY_CONTROL" : 2,
"CONTROL_MODE_POSITION_CONTROL" : 3,
"INPUT_MODE_INACTIVE" : 0,
"INPUT_MODE_PASSTHROUGH" : 1,
"INPUT_MODE_VEL_RAMP" : 2,
"INPUT_MODE_POS_FILTER" : 3,
"INPUT_MODE_MIX_CHANNELS" : 4,
"INPUT_MODE_TRAP_TRAJ" : 5,
"INPUT_MODE_TORQUE_RAMP" : 6,
"INPUT_MODE_MIRROR" : 7,
"MOTOR_TYPE_HIGH_CURRENT" : 0,
"MOTOR_TYPE_GIMBAL" : 2,
"MOTOR_TYPE_ACIM" : 3,
"CAN_ERROR_NONE" : 0,
"CAN_ERROR_DUPLICATE_CAN_IDS" : 1,
"AXIS_ERROR_NONE" : 0,
"AXIS_ERROR_INVALID_STATE" : 1,
"AXIS_ERROR_DC_BUS_UNDER_VOLTAGE" : 2,
"AXIS_ERROR_DC_BUS_OVER_VOLTAGE" : 4,
"AXIS_ERROR_CURRENT_MEASUREMENT_TIMEOUT" : 8,
"AXIS_ERROR_BRAKE_RESISTOR_DISARMED" : 16,
"AXIS_ERROR_MOTOR_DISARMED" : 32,
"AXIS_ERROR_MOTOR_FAILED" : 64,
"AXIS_ERROR_SENSORLESS_ESTIMATOR_FAILED" : 128,
"AXIS_ERROR_ENCODER_FAILED" : 256,
"AXIS_ERROR_CONTROLLER_FAILED" : 512,
"AXIS_ERROR_POS_CTRL_DURING_SENSORLESS" : 1024,
"AXIS_ERROR_WATCHDOG_TIMER_EXPIRED" : 2048,
"AXIS_ERROR_MIN_ENDSTOP_PRESSED" : 4096,
"AXIS_ERROR_MAX_ENDSTOP_PRESSED" : 8192,
"AXIS_ERROR_ESTOP_REQUESTED" : 16384,
"AXIS_ERROR_HOMING_WITHOUT_ENDSTOP" : 131072,
"AXIS_ERROR_OVER_TEMP" : 262144,
"LOCKIN_STATE_INACTIVE" : 0,
"LOCKIN_STATE_RAMP" : 1,
"LOCKIN_STATE_ACCELERATE" : 2,
"LOCKIN_STATE_CONST_VEL" : 3,
"MOTOR_ERROR_NONE" : 0,
"MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE" : 1,
"MOTOR_ERROR_PHASE_INDUCTANCE_OUT_OF_RANGE" : 2,
"MOTOR_ERROR_ADC_FAILED" : 4,
"MOTOR_ERROR_DRV_FAULT" : 8,
"MOTOR_ERROR_CONTROL_DEADLINE_MISSED" : 16,
"MOTOR_ERROR_NOT_IMPLEMENTED_MOTOR_TYPE" : 32,
"MOTOR_ERROR_BRAKE_CURRENT_OUT_OF_RANGE" : 64,
"MOTOR_ERROR_MODULATION_MAGNITUDE" : 128,
"MOTOR_ERROR_BRAKE_DEADTIME_VIOLATION" : 256,
"MOTOR_ERROR_UNEXPECTED_TIMER_CALLBACK" : 512,
"MOTOR_ERROR_CURRENT_SENSE_SATURATION" : 1024,
"MOTOR_ERROR_CURRENT_LIMIT_VIOLATION" : 4096,
"MOTOR_ERROR_BRAKE_DUTY_CYCLE_NAN" : 8192,
"MOTOR_ERROR_DC_BUS_OVER_REGEN_CURRENT" : 16384,
"MOTOR_ERROR_DC_BUS_OVER_CURRENT" : 32768,
"MOTOR_ERROR_MODULATION_IS_NAN" : 65536,
"MOTOR_ERROR_MOTOR_THERMISTOR_OVER_TEMP" : 131072,
"MOTOR_ERROR_FET_THERMISTOR_OVER_TEMP" : 262144,
"ARMED_STATE_DISARMED" : 0,
"ARMED_STATE_WAITING_FOR_TIMINGS" : 1,
"ARMED_STATE_WAITING_FOR_UPDATE" : 2,
"ARMED_STATE_ARMED" : 3,
"CONTROLLER_ERROR_NONE" : 0,
"CONTROLLER_ERROR_OVERSPEED" : 1,
"CONTROLLER_ERROR_INVALID_INPUT_MODE" : 2,
"CONTROLLER_ERROR_UNSTABLE_GAIN" : 4,
"CONTROLLER_ERROR_INVALID_MIRROR_AXIS" : 8,
"CONTROLLER_ERROR_INVALID_LOAD_ENCODER" : 16,
"CONTROLLER_ERROR_INVALID_ESTIMATE" : 32,
"ENCODER_ERROR_NONE" : 0,
"ENCODER_ERROR_UNSTABLE_GAIN" : 1,
"ENCODER_ERROR_CPR_POLEPAIRS_MISMATCH" : 2,
"ENCODER_ERROR_NO_RESPONSE" : 4,
"ENCODER_ERROR_UNSUPPORTED_ENCODER_MODE" : 8,
"ENCODER_ERROR_ILLEGAL_HALL_STATE" : 16,
"ENCODER_ERROR_INDEX_NOT_FOUND_YET" : 32,
"ENCODER_ERROR_ABS_SPI_TIMEOUT" : 64,
"ENCODER_ERROR_ABS_SPI_COM_FAIL" : 128,
"ENCODER_ERROR_ABS_SPI_NOT_READY" : 256,
"SENSORLESS_ESTIMATOR_ERROR_NONE" : 0,
"SENSORLESS_ESTIMATOR_ERROR_UNSTABLE_GAIN" : 1
"GPIO_MODE_DIGITAL": 0,
"GPIO_MODE_DIGITAL_PULL_UP": 1,
"GPIO_MODE_DIGITAL_PULL_DOWN": 2,
"GPIO_MODE_ANALOG_IN": 3,
"GPIO_MODE_UART_A": 4,
"GPIO_MODE_UART_B": 5,
"GPIO_MODE_UART_C": 6,
"GPIO_MODE_CAN_A": 7,
"GPIO_MODE_I2C_A": 8,
"GPIO_MODE_SPI_A": 9,
"GPIO_MODE_PWM": 10,
"GPIO_MODE_ENC0": 11,
"GPIO_MODE_ENC1": 12,
"GPIO_MODE_ENC2": 13,
"GPIO_MODE_MECH_BRAKE": 14,
"GPIO_MODE_STATUS": 15,
"PROTOCOL_SIMPLE": 1,
"AXIS_STATE_UNDEFINED": 0,
"AXIS_STATE_IDLE": 1,
"AXIS_STATE_STARTUP_SEQUENCE": 2,
"AXIS_STATE_FULL_CALIBRATION_SEQUENCE": 3,
"AXIS_STATE_MOTOR_CALIBRATION": 4,
"AXIS_STATE_ENCODER_INDEX_SEARCH": 6,
"AXIS_STATE_ENCODER_OFFSET_CALIBRATION": 7,
"AXIS_STATE_CLOSED_LOOP_CONTROL": 8,
"AXIS_STATE_LOCKIN_SPIN": 9,
"AXIS_STATE_ENCODER_DIR_FIND": 10,
"AXIS_STATE_HOMING": 11,
"AXIS_STATE_ENCODER_HALL_POLARITY_CALIBRATION": 12,
"AXIS_STATE_ENCODER_HALL_PHASE_CALIBRATION": 13,
"ENCODER_MODE_INCREMENTAL": 0,
"ENCODER_MODE_HALL": 1,
"ENCODER_MODE_SINCOS": 2,
"ENCODER_MODE_SPI_ABS_CUI": 256,
"ENCODER_MODE_SPI_ABS_AMS": 257,
"ENCODER_MODE_SPI_ABS_AEAT": 258,
"ENCODER_MODE_SPI_ABS_RLS": 259,
"ENCODER_MODE_SPI_ABS_MA732": 260,
"CONTROL_MODE_VOLTAGE_CONTROL": 0,
"CONTROL_MODE_TORQUE_CONTROL": 1,
"CONTROL_MODE_VELOCITY_CONTROL": 2,
"CONTROL_MODE_POSITION_CONTROL": 3,
"INPUT_MODE_INACTIVE": 0,
"INPUT_MODE_PASSTHROUGH": 1,
"INPUT_MODE_VEL_RAMP": 2,
"INPUT_MODE_POS_FILTER": 3,
"INPUT_MODE_MIX_CHANNELS": 4,
"INPUT_MODE_TRAP_TRAJ": 5,
"INPUT_MODE_TORQUE_RAMP": 6,
"INPUT_MODE_MIRROR": 7,
"MOTOR_TYPE_HIGH_CURRENT": 0,
"MOTOR_TYPE_GIMBAL": 2,
"MOTOR_TYPE_ACIM": 3,
"ODRIVE_ERROR_NONE": 0,
"ODRIVE_ERROR_CONTROL_ITERATION_MISSED": 1,
"ODRIVE_ERROR_DC_BUS_UNDER_VOLTAGE": 2,
"ODRIVE_ERROR_DC_BUS_OVER_VOLTAGE": 4,
"ODRIVE_ERROR_DC_BUS_OVER_REGEN_CURRENT": 8,
"ODRIVE_ERROR_DC_BUS_OVER_CURRENT": 16,
"ODRIVE_ERROR_BRAKE_DEADTIME_VIOLATION": 32,
"ODRIVE_ERROR_BRAKE_DUTY_CYCLE_NAN": 64,
"ODRIVE_ERROR_INVALID_BRAKE_RESISTANCE": 128,
"CAN_ERROR_NONE": 0,
"CAN_ERROR_DUPLICATE_CAN_IDS": 1,
"AXIS_ERROR_NONE": 0,
"AXIS_ERROR_INVALID_STATE": 1,
"AXIS_ERROR_WATCHDOG_TIMER_EXPIRED": 2048,
"AXIS_ERROR_MIN_ENDSTOP_PRESSED": 4096,
"AXIS_ERROR_MAX_ENDSTOP_PRESSED": 8192,
"AXIS_ERROR_ESTOP_REQUESTED": 16384,
"AXIS_ERROR_HOMING_WITHOUT_ENDSTOP": 131072,
"AXIS_ERROR_OVER_TEMP": 262144,
"MOTOR_ERROR_NONE": 0,
"MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE": 1,
"MOTOR_ERROR_PHASE_INDUCTANCE_OUT_OF_RANGE": 2,
"MOTOR_ERROR_DRV_FAULT": 8,
"MOTOR_ERROR_CONTROL_DEADLINE_MISSED": 16,
"MOTOR_ERROR_MODULATION_MAGNITUDE": 128,
"MOTOR_ERROR_CURRENT_SENSE_SATURATION": 1024,
"MOTOR_ERROR_CURRENT_LIMIT_VIOLATION": 4096,
"MOTOR_ERROR_MODULATION_IS_NAN": 65536,
"MOTOR_ERROR_MOTOR_THERMISTOR_OVER_TEMP": 131072,
"MOTOR_ERROR_FET_THERMISTOR_OVER_TEMP": 262144,
"MOTOR_ERROR_TIMER_UPDATE_MISSED": 524288,
"MOTOR_ERROR_CURRENT_MEASUREMENT_UNAVAILABLE": 1048576,
"MOTOR_ERROR_CONTROLLER_FAILED": 2097152,
"MOTOR_ERROR_I_BUS_OUT_OF_RANGE": 4194304,
"MOTOR_ERROR_BRAKE_RESISTOR_DISARMED": 8388608,
"MOTOR_ERROR_SYSTEM_LEVEL": 16777216,
"MOTOR_ERROR_BAD_TIMING": 33554432,
"MOTOR_ERROR_UNKNOWN_PHASE_ESTIMATE": 67108864,
"MOTOR_ERROR_UNKNOWN_PHASE_VEL": 134217728,
"MOTOR_ERROR_UNKNOWN_TORQUE": 268435456,
"MOTOR_ERROR_UNKNOWN_CURRENT_COMMAND": 536870912,
"MOTOR_ERROR_UNKNOWN_CURRENT_MEASUREMENT": 1073741824,
"MOTOR_ERROR_UNKNOWN_VBUS_VOLTAGE": 2147483648,
"MOTOR_ERROR_UNKNOWN_VOLTAGE_COMMAND": 4294967296,
"MOTOR_ERROR_UNKNOWN_GAINS": 8589934592,
"MOTOR_ERROR_CONTROLLER_INITIALIZING": 17179869184,
"MOTOR_ERROR_UNBALANCED_PHASES": 34359738368,
"CONTROLLER_ERROR_NONE": 0,
"CONTROLLER_ERROR_OVERSPEED": 1,
"CONTROLLER_ERROR_INVALID_INPUT_MODE": 2,
"CONTROLLER_ERROR_UNSTABLE_GAIN": 4,
"CONTROLLER_ERROR_INVALID_MIRROR_AXIS": 8,
"CONTROLLER_ERROR_INVALID_LOAD_ENCODER": 16,
"CONTROLLER_ERROR_INVALID_ESTIMATE": 32,
"ENCODER_ERROR_NONE": 0,
"ENCODER_ERROR_UNSTABLE_GAIN": 1,
"ENCODER_ERROR_CPR_POLEPAIRS_MISMATCH": 2,
"ENCODER_ERROR_NO_RESPONSE": 4,
"ENCODER_ERROR_UNSUPPORTED_ENCODER_MODE": 8,
"ENCODER_ERROR_ILLEGAL_HALL_STATE": 16,
"ENCODER_ERROR_INDEX_NOT_FOUND_YET": 32,
"ENCODER_ERROR_ABS_SPI_TIMEOUT": 64,
"ENCODER_ERROR_ABS_SPI_COM_FAIL": 128,
"ENCODER_ERROR_ABS_SPI_NOT_READY": 256,
"ENCODER_ERROR_HALL_NOT_CALIBRATED_YET": 512,
"SENSORLESS_ESTIMATOR_ERROR_NONE": 0,
"SENSORLESS_ESTIMATOR_ERROR_UNSTABLE_GAIN": 1,
"SENSORLESS_ESTIMATOR_ERROR_UNKNOWN_CURRENT_MEASUREMENT": 2
}
+63 -145
View File
@@ -1,24 +1,32 @@
<template>
<div
class="axis"
@click.self="showError = !showError;"
:class="{inactive: !connected, noError: !error, error: error}"
@click.self="showError = !showError"
:class="{ inactive: !connected, noError: !error, error: error }"
>
{{ axis }}
<div v-show="showError" class="error-popup card" @click.self="showError = !showError">
<clear-errors :data="{axis: axis}"/>
<div
v-show="showError"
class="error-popup card"
@click.self="showError = !showError"
>
<clear-errors :data="{ axis: axis }" />
axis:
<span :class="{ noError: !axisError, error: axisError}">{{axisErrorMsg}}</span>
<span :class="{ noError: !axisError, error: axisError }">{{
axisErrorMsg
}}</span>
<br />motor:
<span :class="{ noError: !motorError, error: motorError}">{{motorErrorMsg}}</span>
<span :class="{ noError: !motorError, error: motorError }">{{
motorErrorMsg
}}</span>
<br />encoder:
<span
:class="{ noError: !encoderError, error: encoderError}"
>{{encoderErrorMsg}}</span>
<span :class="{ noError: !encoderError, error: encoderError }">{{
encoderErrorMsg
}}</span>
<br />controller:
<span
:class="{ noError: !controllerError, error: controllerError}"
>{{controllerErrorMsg}}</span>
<span :class="{ noError: !controllerError, error: controllerError }">{{
controllerErrorMsg
}}</span>
</div>
</div>
</template>
@@ -28,72 +36,6 @@ import odriveEnums from "../assets/odriveEnums.json";
import clearErrors from "./clearErrors.vue";
import { getVal, fetchParam } from "../lib/odrive_utils";
const axisErrors = {
0x00000000: "AXIS_ERROR_NONE",
0x00000001: "AXIS_ERROR_INVALID_STATE",
0x00000002: "AXIS_ERROR_DC_BUS_UNDER_VOLTAGE",
0x00000004: "AXIS_ERROR_DC_BUS_OVER_VOLTAGE",
0x00000008: "AXIS_ERROR_CURRENT_MEASUREMENT_TIMEOUT",
0x00000010: "AXIS_ERROR_BRAKE_RESISTOR_DISARMED",
0x00000020: "AXIS_ERROR_MOTOR_DISARMED",
0x00000040: "AXIS_ERROR_MOTOR_FAILED",
0x00000080: "AXIS_ERROR_SENSORLESS_ESTIMATOR_FAILED",
0x00000100: "AXIS_ERROR_ENCODER_FAILED",
0x00000200: "AXIS_ERROR_CONTROLLER_FAILED",
0x00000400: "AXIS_ERROR_POS_CTRL_DURING_SENSORLESS",
0x00000800: "AXIS_ERROR_WATCHDOG_TIMER_EXPIRED",
0x00001000: "AXIS_ERROR_MIN_ENDSTOP_PRESSED",
0x00002000: "AXIS_ERROR_MAX_ENDSTOP_PRESSED",
0x00004000: "AXIS_ERROR_ESTOP_REQUESTED",
0x00020000: "AXIS_ERROR_HOMING_WITHOUT_ENDSTOP",
0x00040000: "AXIS_ERROR_OVER_TEMP",
};
const motorErrors = {
0x00000000: "MOTOR_ERROR_NONE",
0x00000001: "MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE",
0x00000002: "MOTOR_ERROR_PHASE_INDUCTANCE_OUT_OF_RANGE",
0x00000004: "MOTOR_ERROR_ADC_FAILED",
0x00000008: "MOTOR_ERROR_DRV_FAULT",
0x00000010: "MOTOR_ERROR_CONTROL_DEADLINE_MISSED",
0x00000020: "MOTOR_ERROR_NOT_IMPLEMENTED_MOTOR_TYPE",
0x00000040: "MOTOR_ERROR_BRAKE_CURRENT_OUT_OF_RANGE",
0x00000080: "MOTOR_ERROR_MODULATION_MAGNITUDE",
0x00000100: "MOTOR_ERROR_BRAKE_DEADTIME_VIOLATION",
0x00000200: "MOTOR_ERROR_UNEXPECTED_TIMER_CALLBACK",
0x00000400: "MOTOR_ERROR_CURRENT_SENSE_SATURATION",
0x00001000: "MOTOR_ERROR_CURRENT_LIMIT_VIOLATION",
0x00002000: "MOTOR_ERROR_BRAKE_DUTY_CYCLE_NAN",
0x00004000: "MOTOR_ERROR_DC_BUS_OVER_REGEN_CURRENT",
0x00008000: "MOTOR_ERROR_DC_BUS_OVER_CURRENT",
0x00010000: "MOTOR_ERROR_MODULATION_IS_NAN",
0x00020000: "MOTOR_ERROR_MOTOR_THERMISTOR_OVER_TEMP",
0x00040000: "MOTOR_ERROR_FET_THERMISTOR_OVER_TEMP",
};
let encoderErrors = {
0x00000000: "ENCODER_ERROR_NONE",
0x00000001: "ENCODER_ERROR_UNSTABLE_GAIN",
0x00000002: "ENCODER_ERROR_CPR_POLEPAIRS_MISMATCH",
0x00000004: "ENCODER_ERROR_NO_RESPONSE",
0x00000008: "ENCODER_ERROR_UNSUPPORTED_ENCODER_MODE",
0x00000010: "ENCODER_ERROR_ILLEGAL_HALL_STATE",
0x00000020: "ENCODER_ERROR_INDEX_NOT_FOUND_YET",
0x00000040: "ENCODER_ERROR_ABS_SPI_TIMEOUT",
0x00000080: "ENCODER_ERROR_ABS_SPI_COM_FAIL",
0x00000100: "ENCODER_ERROR_ABS_SPI_NOT_READY",
};
let controllerErrors = {
0x00000000: "CONTROLLER_ERROR_NONE",
0x00000001: "CONTROLLER_ERROR_OVERSPEED",
0x00000002: "CONTROLLER_ERROR_INVALID_INPUT_MODE",
0x00000004: "CONTROLLER_ERROR_UNSTABLE_GAIN",
0x00000008: "CONTROLLER_ERROR_INVALID_MIRROR_AXIS",
0x00000010: "CONTROLLER_ERROR_INVALID_LOAD_ENCODER",
0x00000020: "CONTROLLER_ERROR_INVALID_ESTIMATE",
};
export default {
name: "Axis",
components: {
@@ -109,12 +51,30 @@ export default {
encoderErr: undefined,
};
},
methods: {
getErrorString(errCode, errType) {
let retMsg = "none";
if (errCode != 0) {
// we got an error!
// mask errors depending on which page is active
let errs = [];
for (const [name, value] of Object.entries(odriveEnums)) {
if (name.includes(errType) && errCode & value) {
errs.push(name);
}
}
retMsg = errs.join(", ");
}
return retMsg;
},
},
computed: {
connected() {
return this.$store.state.ODrivesConnected[this.axis.split('.')[0]];
return this.$store.state.ODrivesConnected[this.axis.split(".")[0]];
},
axisErrorMsg() {
let retMsg = "none";
let errCode = this.axisErr;
if (this.$store.state.currentDash == "Wizard") {
@@ -122,22 +82,9 @@ export default {
errCode &= ~odriveEnums.AXIS_ERROR_ENCODER_FAILED;
}
if (errCode != 0) {
// we got an error!
// mask errors depending on which page is active
let errs = [];
for (const errKey of Object.keys(axisErrors)) {
if (errCode & errKey) {
errs.push(axisErrors[errKey]);
}
}
retMsg = errs.join(', ');
}
return retMsg;
return this.getErrorString(errCode, 'AXIS_ERROR');
},
motorErrorMsg() {
let retMsg = "none";
let errCode = this.motorErr;
if (this.$store.state.currentDash == "Wizard") {
@@ -145,21 +92,9 @@ export default {
errCode &= ~odriveEnums.MOTOR_ERROR_PHASE_INDUCTANCE_OUT_OF_RANGE;
}
if (errCode != 0) {
// we got an error!
let errs = [];
for (const errKey of Object.keys(motorErrors)) {
if (errCode & errKey) {
errs.push(motorErrors[errKey]);
}
}
retMsg = errs.join(', ');
}
return retMsg;
return this.getErrorString(errCode, 'MOTOR_ERROR');
},
encoderErrorMsg() {
let retMsg = "none";
let errCode = this.encoderErr;
if (this.$store.state.currentDash == "Wizard") {
@@ -167,35 +102,12 @@ export default {
errCode &= ~odriveEnums.ENCODER_ERROR_NO_RESPONSE;
}
if (errCode != 0) {
// we got an error!
let errs = [];
for (const errKey of Object.keys(encoderErrors)) {
if (errCode & errKey) {
errs.push(encoderErrors[errKey]);
}
}
retMsg = errs.join(', ');
}
return retMsg;
return this.getErrorString(errCode, 'ENCODER_ERROR');
},
controllerErrorMsg() {
let retMsg = "none";
let errCode = this.controllerErr;
if (errCode != 0) {
// we got an error!
let errs = [];
for (const errKey of Object.keys(controllerErrors)) {
if (errCode & errKey) {
errs.push(controllerErrors[errKey]);
}
}
retMsg = errs.join(', ');
}
return retMsg;
return this.getErrorString(errCode, 'CONTROLLER_ERROR');
},
axisError() {
let errCode = this.axisErr;
@@ -226,27 +138,33 @@ export default {
return errCode != 0;
},
error() {
return this.axisError || this.motorError || this.encoderError || this.controllerError;
return (
this.axisError ||
this.motorError ||
this.encoderError ||
this.controllerError
);
},
},
created() {
// set up timeout loop for grabbing axis error values
let update = () => {
// Do we have an active connection to the ODrive that contains this axis?
if (this.$store.state.ODrivesConnected[this.axis.split('.')[0]]) {
if (this.$store.state.ODrivesConnected[this.axis.split(".")[0]]) {
fetchParam(this.axis + ".error");
fetchParam(this.axis + '.motor.error');
fetchParam(this.axis + '.controller.error');
fetchParam(this.axis + '.encoder.error');
this.axisErr = getVal(this.axis + '.error');
this.motorErr = getVal(this.axis + '.motor.error');
this.controllerErr = getVal(this.axis + '.controller.error');
this.encoderErr = getVal(this.axis + '.encoder.error');
fetchParam(this.axis + ".motor.error");
fetchParam(this.axis + ".controller.error");
fetchParam(this.axis + ".encoder.error");
this.axisErr = getVal(this.axis + ".error");
this.motorErr = getVal(this.axis + ".motor.error");
this.controllerErr = getVal(this.axis + ".controller.error");
this.encoderErr = getVal(this.axis + ".encoder.error");
}
// ODrive not connected
setTimeout(update, 1000);
}
update();
};
this.cyclicUpdate = setInterval(update, 1000);
},
beforeDestroy() {
clearInterval(this.cyclicUpdate);
}
};
</script>
+4 -11
View File
@@ -51,8 +51,10 @@ export default {
mounted() {
this.timeStart = Date.now();
//this.initData(); //set label for dataset and color
this.fillData();
this.liveData();
this.cyclicUpdate = setInterval(() => this.fillData(), 50);
},
beforeDestroy() {
clearInterval(this.cyclicUpdate);
},
methods: {
fillData() {
@@ -85,15 +87,6 @@ export default {
],
};
},
liveData() {
setTimeout(() => {
this.liveData();
}, 50);
//if (this.$store.state.sampling == true) {
// this.fillData();
//}
this.fillData();
},
deletePlot: function () {
// commit a mutation in the store with the relevant information
this.$store.commit("removePlotFromDash", {
+4 -12
View File
@@ -120,9 +120,6 @@ export async function motorCalibration(odrive, axis) {
state = getVal(odrive + axis + ".current_state");
motorError = getVal(odrive + axis + ".motor.error");
if (run) {
setTimeout(updateVals, 100);
}
}
// set up our state watch function
@@ -137,8 +134,7 @@ export async function motorCalibration(odrive, axis) {
}
// start getting live updates
let run = true;
updateVals();
let cylicUpdate = setInterval(updateVals, 100);
// send motor calibration command to correct odrive and axis
putVal(odrive + axis + ".requested_state", odriveEnums.AXIS_STATE_MOTOR_CALIBRATION);
@@ -150,7 +146,7 @@ export async function motorCalibration(odrive, axis) {
const result = await waitFor(end);
// stop our parameter updates
run = false;
clearInterval(cylicUpdate);
return result;
}
@@ -167,9 +163,6 @@ export async function encoderCalibration(odrive,axis) {
state = getVal(odrive + axis + ".current_state");
encoderError = getVal(odrive + axis + ".encoder.error");
if (run) {
setTimeout(updateVals, 100);
}
}
// set up our state watch function
@@ -184,8 +177,7 @@ export async function encoderCalibration(odrive,axis) {
}
// start getting live updates
let run = true;
updateVals();
let cylicUpdate = setInterval(updateVals, 100);
// start encoder offset cal
putVal(odrive + axis + ".requested_state", odriveEnums.AXIS_STATE_ENCODER_OFFSET_CALIBRATION);
@@ -197,7 +189,7 @@ export async function encoderCalibration(odrive,axis) {
const result = await waitFor(end);
// stop our parameter updates
run = false;
clearInterval(cylicUpdate);
return result;
}