motionx-simulator-package-v2
Version:
all lib of simulator control
1,000 lines (941 loc) • 27 kB
JavaScript
let CMDCounter = 0;
const CLIENT_COMMAND_SIM = {
START_CALIBRATE: 0,
RESTART_CALIBRATE: 1,
MOVEMENT_POSITION: 2,
MOTION_RUNNING: 3,
MOTION_RESTING: 4,
PAUSE: 5,
RESUME: 6,
EMERGENCY_STOP: 7,
EMERGENCY_RESUME: 8,
READ_STATE_DEFAULT: 9,
READ_STATE_PAYMENT: 10,
READ_STATE_BELT: 11,
READ_STATE_SEAT: 12,
READ_SERIAL_NUMBER: 13,
READ_LOGGER_UPLOAD: 14,
READ_STATE_MOTION: 19,
START_GAME: 15,
END_GAME: 16,
MOTION_PARKING: 17,
MOTION_PICKUP: 18,
MOTOR_CALIBRATE: 20,
READ_MACHINE_STATE: 21,
READ_YAW_ABS: 22,
};
const CLIENT_ODRIVE_COMMAND = {
MOTOR_OFF: 0,
MOTOR_ON: 1,
MOTOR_CALIBRATE: 3,
ENCODER_CALIBRATE: 4,
ENCODER_INDEX: 5,
GET_ENDSTOP: 6,
GET_GEAR_POS: 7,
GET_RAW_ENCODER: 8,
REBOOT: 9,
STATUS_READ: 11,
MOTOR_GET_PRE_CALIBATE: 12,
MOTOR_GET_IS_CALIBRATE: 13,
MOTOR_GET_TYPE: 14,
MOTOR_GET_PHASH_INDUCTANCE: 15,
MOTOR_GET_PHASE_RESISTANCE: 16,
MOTOR_GET_PM_FLUK_LINKAGE: 17,
MOTOR_GET_POPLE: 18,
MOTOR_SET_PRE_CALIBATE: 19,
MOTOR_SET_IS_CALIBRATE: 20,
MOTOR_SET_TYPE: 21,
MOTOR_SET_PHASH_INDUCTANCE: 22,
MOTOR_SET_PHASE_RESISTANCE: 23,
MOTOR_SET_PM_FLUK_LINKAGE: 24,
MOTOR_SET_POPLE: 25,
ENCODER_SET_PRE_CALIBRATE: 26,
ENCODE_SET_IS_READY: 27,
ENCODER_SET_CPR: 28,
ENCODER_SET_MODE: 29,
ENCODER_SET_OFFSET: 30,
ENCODER_SET_OFFSET_FLOAT: 31,
ENCODER_SET_USE_INDEX: 32,
CONFIG_1_GET_CALIBRATION_CURRENT: 33,
CONFIG_1_GET_CURRENT_LIMIT: 34,
CONFIG_1_GET_VELOCITY_LIMIT: 35,
CONFIG_1_GET_TRAJECTORY_VEL_LIMIT: 36,
CONFIG_1_GET_TRAJECTORY_ACCEL_LIMIT: 37,
CONFIG_1_GET_TRAJECTORY_DECEL_LIMIT: 38,
CONFIG_1_GET_POS_GAIN: 39,
CONFIG_1_GET_VEL_GAIN: 40,
CONFIG_1_GET_CONTROL_MODE: 41,
CONFIG_1_GET_CALIBRATION_MAX_VOLTAGE: 42,
CONFIG_1_GET_CARLIBRATION_VEL: 43,
CONFIG_1_GET_CALIRATION_ACCEL: 44,
CONFIG_1_GET_CALIBRATION_RAMP: 45,
CONFIG_1_GET_REQUEST_CURRENT_RANGE: 46,
CONFIG_1_GET_CURRENT_CONTROL_BANDWIDTH: 47,
CONFIG_1_GET_CURRENT_LIMIT_TOLERANCE: 48,
CONFIG_1_GET_VELOCITY_LIMIT_TOLERANCE: 49,
C_CMD: 51,
ERR_CLEAR: 52,
CONFIG_2_GET_GPIO_MODE: 53,
CONFIG_2_GET_BRAKE_RESISTANCE: 54,
CONFIG_2_GET_ENABLE_UART: 55,
CONFIG_2_GET_ENABLE_ASCII_ON_USB: 56,
CONFIG_2_GET_UNDER_VOLTAGE_TRIP_LEVEL: 57,
CONFIG_2_GET_OVER_VOLTTAGE_TRIP_LEVEL: 58,
CONFIG_2_GET_CARIBRATE_SCAN_DISTANT: 59,
CONFIG_2_GET_INDEX_SEARCH_CURRENT: 60,
CONFIG_2_GET_ENABLE_BRAKE_RESISTOR: 61,
CONFIG_2_GET_ENABLE_BRAKE_RESISROT: 62,
CONFIG_2_GET_DC_MAX_NEGATIVE_CURRENT: 63,
CONFIG_2_GET_ENABLE_DC_BUS_OVER_VOLTAGE_RAMP: 64,
CONFIG_2_GET_DC_BUS_OVER_VOLTAGE_RAMP_START: 65,
CONFIG_2_GET_END_STOP_GPIO: 66,
CONFIG_2_GET_END_STOP_ACTIVE_HIGHT: 67,
CONFIG_2_GET_END_STOP_DEBOUNCE: 68,
CONFIG_2_GET_END_STOP_OFFSET: 69,
CONFIG_2_GET_END_STOP_ENABLE: 70,
CONFIG_3_GET_END_STOP_STATE: 71,
CONFIG_1_SET_CALIBRATION_CURRENT: 72,
CONFIG_1_SET_CURRENT_LIMIT: 73,
CONFIG_1_SET_VELOCITY_LIMIT: 74,
CONFIG_1_SET_TRAJECTORY_VEL_LIMIT: 75,
CONFIG_1_SET_TRAJECTORY_ACCEL_LIMIT: 76,
CONFIG_1_SET_TRAJECTORY_DECEL_LIMIT: 77,
CONFIG_1_SET_POS_GAIN: 78,
CONFIG_1_SET_VEL_GAIN: 79,
CONFIG_1_SET_CONTROL_MODE: 80,
CONFIG_1_SET_CALIBRATION_MAX_VOLTAGE: 81,
CONFIG_1_SET_CARLIBRATION_VEL: 82,
CONFIG_1_SET_CALIRATION_ACCEL: 83,
CONFIG_1_SET_CALIBRATION_RAMP: 84,
CONFIG_1_SET_REQUEST_CURRENT_RANGE: 85,
CONFIG_1_SET_CURRENT_CONTROL_BANDWIDTH: 86,
CONFIG_1_SET_CURRENT_LIMIT_TOLERANCE: 87,
CONFIG_1_SET_VELOCITY_LIMIT_TOLERANCE: 88,
CONFIG_2_SET_GPIO_MODE: 89,
CONFIG_2_SET_BRAKE_RESISTANCE: 90,
CONFIG_2_SET_ENABLE_UART: 91,
CONFIG_2_SET_ENABLE_ASCII_ON_USB: 92,
CONFIG_2_SET_UNDER_VOLTAGE_TRIP_LEVEL: 93,
CONFIG_2_SET_OVER_VOLTTAGE_TRIP_LEVEL: 94,
CONFIG_2_SET_CARIBRATE_SCAN_DISTANT: 95,
CONFIG_2_SET_INDEX_SEARCH_CURRENT: 96,
CONFIG_2_SET_ENABLE_BRAKE_RESISTOR: 97,
CONFIG_2_SET_ENABLE_BRAKE_RESISROT: 98,
CONFIG_2_SET_DC_MAX_NEGATIVE_CURRENT: 99,
CONFIG_2_SET_ENABLE_DC_BUS_OVER_VOLTAGE_RAMP: 100,
CONFIG_2_SET_DC_BUS_OVER_VOLTAGE_RAMP_START: 101,
CONFIG_2_SET_END_STOP_GPIO: 102,
CONFIG_2_SET_END_STOP_ACTIVE_HIGHT: 103,
CONFIG_2_SET_END_STOP_DEBOUNCE: 104,
CONFIG_2_SET_END_STOP_OFFSET: 105,
CONFIG_2_SET_END_STOP_ENABLE: 106,
CONFIG_2_SET_HOMING_SPEED: 107,
CONFIG_3_SET_END_STOP_STATE: 108,
CONFIG_1_GET_CURRENT_LIMIT_MARGIN: 109,
CONFIG_1_SET_CURRENT_LIMIT_MARGIN: 110,
CONFIG_1_GET_VEL_INTEGRATOR_GAIN: 111,
CONFIG_1_SET_VEL_INTEGRATOR_GAIN: 111,
FACTORY_RESET: 112,
ENCODER_GET_PRE_CALIBRATE: 113,
ENCODE_GET_IS_READY: 114,
ENCODER_GET_CPR: 115,
ENCODER_GET_MODE: 116,
ENCODER_GET_OFFSET: 117,
ENCODER_GET_OFFSET_FLOAT: 118,
ENCODER_GET_USE_INDEX: 119,
GET_GENERAL_ERROR: 120,
GET_MOTOR_ERROR: 121,
GET_ENCODER_ERROR: 122,
GET_CONTROLLER_ERROR: 123,
GET_DRV_ERROR: 124,
GET_CURRENT_STATE: 125,
GET_VBUS_VOLTAGE: 126,
GET_MEASURED_CURRENT: 127,
GET_FET_TEMPERATURE: 128,
CONFIG_2_GET_HOMING_SPEED: 129,
SAVE: 130,
};
const ODRIVE_TAG = {
BRAKE_RESISTANCE: 100,
ENABLE_BRAKE_RESISTOR: 109,
DC_MAX_NEGATIVE_CURRENT: 108,
MAX_REGEN_CURRENT: 905,
ENABLE_UART: 900,
ENABLE_ASCII_ON_USB: 901,
DC_BUS_UNDERVOLTAGE_TRIP: 902,
DC_BUS_OVERVOLTAGE_TRIP: 903,
POLE_PAIRS: 102,
CALIBRATION_CURRENT: 103,
CALIBRATION_SCAN_DISTANT: 906,
ENCODER_CPR: 104,
ENCODER_MODE: 105,
ENCODER_USE_INDEX: 106,
PM_FLUX_LINKAGE: 107,
ENABLE_DC_BUS_OVERVOLTAGE_RAMP: 907,
DC_BUS_OVERVOLTAGE_RAMP_START: 908,
ENCODER_OFFSET: 110,
ENCODER_OFFSET_FLOAT: 904,
CONTROL_MODE: 111,
GPIO1_MODE: 161,
GPIO2_MODE: 162,
GPIO3_MODE: 163,
GPIO4_MODE: 164,
GPIO5_MODE: 165,
GPIO6_MODE: 166,
GPIO7_MODE: 167,
GPIO8_MODE: 168,
MOTOR_PRE_CALIBRATED: 120,
ENCODER_PRE_CALIBRATED: 121,
CURRENT_LIM: 122,
VEL_LIMIT: 123,
POS_GAIN: 124,
VEL_GAIN: 125,
VEL_INTEGRATOR_GAIN: 126,
TRAJ_VEL_LIMIT: 127,
TRAJ_ACCEL_LIMIT: 128,
TRAJ_DECEL_LIMIT: 129,
VEL_LIMIT_TOLERANCE: 130,
VEL_RAMP_RATE: 131,
MOTOR_TYPE: 101,
RESISTANCE_CALIB_MAX_VOLTAGE: 140,
REQUESTED_CURRENT_RANGE: 141,
CURRENT_CONTROL_BANDWIDTH: 142,
CURRENT_LIMIT_TOLERANCE: 143,
PHASE_INDUCTANCE: 144,
PHASE_RESISTANCE: 145,
CALIBRATION_VELOCITY: 146,
CALIBRATION_ACCEL: 147,
CALIBRATION_RAMP: 148,
CALIBRATION_INDEX_CURRENT: 149,
HOMING_SPEED: 150,
MIN_ENDSTOP_GPIO_NUM: 151,
MIN_ENDSTOP_IS_ACTIVE_HIGH: 152,
MIN_ENDSTOP_DEBOUNCE: 153,
MIN_ENDSTOP_OFFSET: 154,
MIN_ENDSTOP_ENABLED: 155,
MIN_ENDSTOP_STATE: 156,
GENERAL_ERROR: 200,
MOTOR_ERROR: 201,
ENCODER_ERROR: 202,
DRV_ERROR: 203,
CONTROLLER_ERROR: 204,
DRV_ERROR_FLAG: 205,
MOTOR_IS_CALIBRATED: 210,
ENCODER_IS_READY: 211,
ENCODER_POS_ESTIMATE: 212,
CURRENT_STATE: 301,
REQUEST_STATE: 302,
VBUS_VOLTAGE: 303,
MEASURED_CURRENT: 304,
COMMAND_CURRENT: 305,
FET_TEMPERATURE: 306,
CONTROL_FACTORY_RESET: 'se',
SAVE_CONFIG: 'ss',
ERROR_CLEAR: 'sc',
ODRIVE_REBOOT: 'sr',
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,
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,
CTRL_MODE_VOLTAGE_CONTROL: 0,
CTRL_MODE_CURRENT_CONTROL: 1,
CTRL_MODE_VELOCITY_CONTROL: 2,
CTRL_MODE_POSITION_CONTROL: 3,
CTRL_MODE_TRAJECTORY_CONTROL: 4,
CTRL_MODE_UNDEFINED_NAME: '- NONE -',
CTRL_MODE_VOLTAGE_NAME: 'VOLTAGE',
CTRL_MODE_CURRENT_NAME: 'CURRENT',
CTRL_MODE_VELOCITY_NAME: 'VELOCITY',
CTRL_MODE_POSITION_NAME: 'POSITION',
CTRL_MODE_TRAJECTORY_NAME: 'TRAJECTORY',
ENCODER_MODE_INCREMENTAL: 0,
ENCODER_MODE_HALL: 1,
ENCODER_MODE_ABSOLUTE_CUI: 256,
ENCODER_MODE_ABSOLUTE_AMS_AS5047P: 257,
ENCODER_MODE_ABSOLUTE_AMS_AS5050P: 258,
ENCODER_MODE_ABSOLUTE_AEAT_6012: 259,
ENCODER_MODE_UNDEFINED_NAME: '- NONE -',
ENCODER_MODE_INCREMENTAL_NAME: 'INCREMENTAL',
ENCODER_MODE_HALL_NAME: 'HALL',
ENCODER_MODE_ABSOLUTE_NAME_CUI: 'ABS CUI',
ENCODER_MODE_ABSOLUTE_NAME_AMS_AS5047P: 'ABS AS5047P',
ENCODER_MODE_ABSOLUTE_NAME_AMS_AS5050P: 'ABS AS5050P',
ENCODER_MODE_ABSOLUTE_NAME_AEAT_6012: 'ABS AEAT',
C_CMD: 112,
};
const CounterCMD = () => {
CMDCounter += 1;
if (CMDCounter > 99) CMDCounter = 1;
};
const GetCheckSum = (xStr) => {
let res = '';
let zXor = 0;
for (let i = 0; i < xStr.length; i++) {
zXor = zXor ^ xStr.charCodeAt(i);
}
res = xStr + '*' + zXor.toString();
return res;
};
const COMMAND_TO_SIMULATOR = {
START_CALIBRATE: () => {
CounterCMD();
return `[${CMDCounter}]sys.write(1109,1)`;
},
RESTART_CALIBRATE: () => {
CounterCMD();
return `[${CMDCounter}]sys.write(1109,2)`;
},
INIT_CONNECTION: (safeIp, safePort) => {
CounterCMD();
return `[${CMDCounter}]sys.use(${safeIp},${safePort})`;
},
MOVEMENT_POSITION: (roll, pitch, yaw, heave, surge, sway) => {
CounterCMD();
return `[${CMDCounter}]sys.pos(${roll},${pitch},${yaw},${heave},${surge},${sway})`;
},
MOTION_RUNNING: () => {
return '[0]sys.write(100,2)';
},
MOTION_RESTING: () => {
return '[0]sys.write(100,1)';
},
MOTION_PICKUP: () => {
return '[0]sys.write(100,3)';
},
MOTION_PARKING: () => {
return '[0]sys.write(100,0)';
},
PAUSE: () => `[${CMDCounter}]sys.write(111,1)`,
RESUME: () => `[${CMDCounter}]sys.write(111,2)`,
EMERGENCY_STOP: () => `[${CMDCounter}]sys.write(112,1)`,
EMERGENCY_RESUME: () => `[${CMDCounter}]sys.write(112,2)`,
GET_REG: (RegID) => {
CounterCMD();
return `[${CMDCounter}]sys.read(${RegID})`;
},
START_MOTOR_CALIBRATE: () => {
CounterCMD();
return `[${CMDCounter}]sys.write(1109,3)`;
},
};
const STATE_MOTOR_STATUS = {
OFFLINE: 0,
ONLINE: 2,
IDLE: 1,
BUSY: 4,
ERROR: 5,
};
const STATE_DRIVE_STATUS = {
OFFLINE: 0,
ONLINE: 1,
ERROR: 2,
};
const CommandDriveString = (CMDSID, AxisID) => {
let CMDS = '';
switch (CMDSID) {
case ODRIVE_TAG.MAX_REGEN_CURRENT:
CMDS = 'config.max_regen_curren';
break;
case ODRIVE_TAG.BRAKE_RESISTANCE:
CMDS = 'config.brake_resistance';
break;
case ODRIVE_TAG.DC_BUS_OVERVOLTAGE_TRIP:
CMDS = 'config.dc_bus_overvoltage_trip_level';
break;
case ODRIVE_TAG.DC_BUS_UNDERVOLTAGE_TRIP:
CMDS = 'config.dc_bus_undervoltage_trip_level';
break;
case ODRIVE_TAG.MOTOR_TYPE:
CMDS = `axis${AxisID}.motor.config.motor_type`;
break;
case ODRIVE_TAG.MOTOR_PRE_CALIBRATED:
CMDS = `axis${AxisID}.motor.config.pre_calibrated`;
break;
case ODRIVE_TAG.POLE_PAIRS:
CMDS = `axis${AxisID}.motor.config.pole_pairs`;
break;
case ODRIVE_TAG.CALIBRATION_CURRENT:
CMDS = `axis${AxisID}.motor.config.calibration_current`;
break;
case ODRIVE_TAG.CALIBRATION_SCAN_DISTANT:
CMDS = `axis${AxisID}.encoder.config.calib_scan_distance`;
break;
case ODRIVE_TAG.ENCODER_CPR:
CMDS = `axis${AxisID}.encoder.config.cpr`;
break;
case ODRIVE_TAG.ENCODER_MODE:
CMDS = `axis${AxisID}.encoder.config.mode`;
break;
case ODRIVE_TAG.ENCODER_USE_INDEX:
CMDS = `axis${AxisID}.encoder.config.use_index`;
break;
case ODRIVE_TAG.PM_FLUX_LINKAGE:
CMDS = `axis${AxisID}.sensorless_estimator.config.pm_flux_linkage`;
break;
case ODRIVE_TAG.ENCODER_OFFSET:
CMDS = `axis${AxisID}.encoder.config.phase_offset`;
break;
case ODRIVE_TAG.ENCODER_OFFSET_FLOAT:
CMDS = `axis${AxisID}.encoder.config.phase_offset_float`;
break;
case ODRIVE_TAG.ENCODER_PRE_CALIBRATED:
CMDS = `axis${AxisID}.encoder.config.pre_calibrated`;
break;
case ODRIVE_TAG.CURRENT_LIM:
CMDS = `axis${AxisID}.motor.config.current_lim`;
break;
case ODRIVE_TAG.VEL_LIMIT:
CMDS = `axis${AxisID}.controller.config.vel_limit`;
break;
case ODRIVE_TAG.VEL_LIMIT_TOLERANCE:
CMDS = `axis${AxisID}.controller.config.vel_limit_tolerance`;
break;
case ODRIVE_TAG.POS_GAIN:
CMDS = `axis${AxisID}.controller.config.pos_gain`;
break;
case ODRIVE_TAG.VEL_GAIN:
CMDS = `axis${AxisID}.controller.config.vel_gain`;
break;
case ODRIVE_TAG.VEL_INTEGRATOR_GAIN:
CMDS = `axis${AxisID}.controller.config.vel_integrator_gain`;
break;
case ODRIVE_TAG.CONTROL_MODE:
CMDS = `axis${AxisID}.controller.config.control_mode`;
break;
case ODRIVE_TAG.MEASURED_CURRENT:
CMDS = `axis${AxisID}.motor.current_control.Iq_measured`;
break;
case ODRIVE_TAG.COMMAND_CURRENT:
CMDS = `axis${AxisID}.motor.current_control.Iq_setpoint`;
break;
case ODRIVE_TAG.FET_TEMPERATURE:
CMDS = `axis${AxisID}.motor.fet_thermistor.temperature`;
break;
case ODRIVE_TAG.ENABLE_DC_BUS_OVERVOLTAGE_RAMP:
CMDS = 'config.enable_dc_bus_overvoltage_ramp';
break;
case ODRIVE_TAG.DC_BUS_OVERVOLTAGE_RAMP_START:
CMDS = 'config.dc_bus_overvoltage_ramp_start';
break;
case ODRIVE_TAG.GPIO1_MODE:
CMDS = 'config.gpio1_mode';
break;
case ODRIVE_TAG.GPIO2_MODE:
CMDS = 'config.gpio2_mode';
break;
case ODRIVE_TAG.GPIO3_MODE:
CMDS = 'config.gpio3_mode';
break;
case ODRIVE_TAG.GPIO4_MODE:
CMDS = 'config.gpio4_mode';
break;
case ODRIVE_TAG.GPIO5_MODE:
CMDS = 'config.gpio5_mode';
break;
case ODRIVE_TAG.GPIO6_MODE:
CMDS = 'config.gpio6_mode';
break;
case ODRIVE_TAG.GPIO7_MODE:
CMDS = 'config.gpio7_mode';
break;
case ODRIVE_TAG.GPIO8_MODE:
CMDS = 'config.gpio8_mode';
break;
case ODRIVE_TAG.HOMING_SPEED:
CMDS = `axis${AxisID}.controller.config.homing_speed`;
break;
case ODRIVE_TAG.MIN_ENDSTOP_GPIO_NUM:
CMDS = `axis${AxisID}.min_endstop.config.gpio_num`;
break;
case ODRIVE_TAG.MIN_ENDSTOP_IS_ACTIVE_HIGH:
CMDS = `axis${AxisID}.min_endstop.config.is_active_high`;
break;
case ODRIVE_TAG.MIN_ENDSTOP_DEBOUNCE:
CMDS = `axis${AxisID}.min_endstop.config.debounce_ms`;
break;
case ODRIVE_TAG.MIN_ENDSTOP_OFFSET:
CMDS = `axis${AxisID}.min_endstop.config.offset`;
break;
case ODRIVE_TAG.MIN_ENDSTOP_ENABLED:
CMDS = `axis${AxisID}.min_endstop.config.enabled`;
break;
case ODRIVE_TAG.MIN_ENDSTOP_STATE:
CMDS = `axis${AxisID}.min_endstop.endstop_state`;
break;
case ODRIVE_TAG.TRAJ_VEL_LIMIT:
CMDS = `axis${AxisID}.trap_traj.config.vel_limit`;
break;
case ODRIVE_TAG.TRAJ_ACCEL_LIMIT:
CMDS = `axis${AxisID}.trap_traj.config.accel_limit`;
break;
case ODRIVE_TAG.TRAJ_DECEL_LIMIT:
CMDS = `axis${AxisID}.trap_traj.config.decel_limit`;
break;
case ODRIVE_TAG.RESISTANCE_CALIB_MAX_VOLTAGE:
CMDS = `axis${AxisID}.motor.config.resistance_calib_max_voltage`;
break;
case ODRIVE_TAG.REQUESTED_CURRENT_RANGE:
CMDS = `axis${AxisID}.motor.config.requested_current_range`;
break;
case ODRIVE_TAG.CURRENT_CONTROL_BANDWIDTH:
CMDS = `axis${AxisID}.motor.config.current_control_bandwidth`;
break;
case ODRIVE_TAG.CURRENT_LIMIT_TOLERANCE:
CMDS = `axis${AxisID}.motor.config.current_lim_tolerance`;
break;
case ODRIVE_TAG.DC_MAX_NEGATIVE_CURRENT:
CMDS = 'config.dc_max_negative_current';
break;
case ODRIVE_TAG.ENABLE_BRAKE_RESISTOR:
CMDS = 'config.enable_brake_resistor';
break;
case ODRIVE_TAG.PHASE_INDUCTANCE:
CMDS = `axis${AxisID}.motor.config.phase_inductance`;
break;
case ODRIVE_TAG.PHASE_RESISTANCE:
CMDS = `axis${AxisID}.motor.config.phase_resistance`;
break;
case ODRIVE_TAG.CALIBRATION_VELOCITY:
CMDS = `axis${AxisID}.config.calibration_lockin.vel`;
break;
case ODRIVE_TAG.CALIBRATION_ACCEL:
CMDS = `axis${AxisID}.config.calibration_lockin.accel`;
break;
case ODRIVE_TAG.CALIBRATION_RAMP:
CMDS = `axis${AxisID}.config.calibration_lockin.ramp_distance`;
break;
case ODRIVE_TAG.CALIBRATION_INDEX_CURRENT:
CMDS = `axis${AxisID}.config.calibration_lockin.current`;
break;
case ODRIVE_TAG.GENERAL_ERROR:
CMDS = `axis${AxisID}.error`;
break;
case ODRIVE_TAG.MOTOR_ERROR:
CMDS = `axis${AxisID}.motor.error`;
break;
case ODRIVE_TAG.ENCODER_ERROR:
CMDS = `axis${AxisID}.encoder.error`;
break;
case ODRIVE_TAG.DRV_ERROR:
CMDS = `axis${AxisID}.motor.gate_driver.drv_fault`;
break;
case ODRIVE_TAG.CONTROLLER_ERROR:
CMDS = `axis${AxisID}.controller.error`;
break;
case ODRIVE_TAG.DRV_ERROR_FLAG:
CMDS = `axis${AxisID}.last_drv_fault`;
break;
case ODRIVE_TAG.MOTOR_IS_CALIBRATED:
CMDS = `axis${AxisID}.motor.is_calibrated`;
break;
case ODRIVE_TAG.ENCODER_IS_READY:
CMDS = `axis${AxisID}.encoder.is_ready`;
break;
case ODRIVE_TAG.ENCODER_POS_ESTIMATE:
CMDS = `axis${AxisID}.encoder.pos_estimate`;
break;
case ODRIVE_TAG.CURRENT_STATE:
CMDS = `axis${AxisID}.current_state`;
break;
case ODRIVE_TAG.REQUEST_STATE:
CMDS = `axis${AxisID}.requested_state`;
break;
case ODRIVE_TAG.VBUS_VOLTAGE:
CMDS = 'vbus_voltage';
break;
case ODRIVE_TAG.C_CMD:
CMDS = `axis${AxisID}.set.conf`;
break;
}
return CMDS;
};
const GenerateWriteDriveSimCommand = (
TargetDrive = 0,
TargetAxis = 0,
ODRIVE_TAG,
Value = ''
) => {
CounterCMD();
const commandStr = CommandDriveString(ODRIVE_TAG, TargetAxis);
const checkSum = GetCheckSum(`w ${commandStr} ${Value}`);
return `[${CMDCounter}]drive(${TargetDrive}).write(${checkSum})`;
};
const GenerateReadDriveSimCommand = (
TargetDrive = 0,
TargetAxis = 0,
ODRIVE_TAG,
Value = ''
) => {
CounterCMD();
const commandStr = CommandDriveString(ODRIVE_TAG, TargetAxis);
const checkSum = GetCheckSum(`r ${commandStr} ${Value}`);
return `[${CMDCounter}]drive(${TargetDrive}).write(${checkSum})`;
};
const GenerateWriteT = (TargetDrive = 0, TargetAxis = 0, Taxt) => {
CounterCMD();
return `[${CMDCounter}]drive(${TargetDrive}).write(t ${TargetAxis} ${Taxt})`;
};
const GenerateDriveOtherCommand = (TargetDrive, ODRIVE_TAG) => {
CounterCMD();
return `[${CMDCounter}]drive(${TargetDrive}).write(${ODRIVE_TAG})`;
};
const GetCurrentCMDID = () => CMDCounter;
const GeneralError = (ErrID) => {
const ErrList = {
0: 'NONE',
1: 'INVALID_STATE',
2: 'DC_BUS_UNDER_VOLTAGE',
4: 'DC_BUS_OVER_VOLTAGE',
8: 'CURRENT_MEASUREMENT_TIMEOUT',
16: 'BRAKE_RESISTOR_DISARMED',
32: 'MOTOR_DISARMED',
64: 'MOTOR_FAILED',
128: 'SENSORLESS_ESTIMATOR_FAILED',
256: 'ENCODER_FAILED',
512: 'CONTROLLER_FAILED',
1024: 'POS_CTRL_DURING_SENSORLESS',
2048: 'WATCHDOG_TIMER_EXPIRED',
};
return ErrList[ErrID] ? ErrList[ErrID] : 'UNKNOW';
};
const CHANEL_FONTEND_RECIEVED = {
KEY_EMIT_TERMINAL_T_CLIENT: 'KEY_EMIT_TERMINAL_T_CLIENT',
KEY_EMIT_DRIVE_STATE_T_CLIENT: 'KEY_EMIT_DRIVE_STATE_T_CLIENT',
KEY_EMIT_MOTOR_STATE_T_CLENT: 'KEY_EMIT_MOTOR_STATE_T_CLENT',
KEY_EMIT_LAST_AXIS_POSITION_T_CLENT: 'KEY_EMIT_LAST_AXIS_POSITION_T_CLENT',
KEY_EMIT_ODRIVE_T_TBL_T_CLENT: 'KEY_EMIT_ODRIVE_T_TBL_T_CLENT',
KEY_EMIT_GET_RAW_ENCODER_T_TBL_T_CLENT:
'KEY_EMIT_GET_RAW_ENCODER_T_TBL_T_CLENT',
SYS_CONTOLL_ERROR_LIST: 'SYS_CONTOLL_ERROR_LIST',
SYS_CONTOLL_STATUS_LIST: 'SYS_CONTOLL_STATUS_LIST',
KEY_EMIT_TOOLBAR: 'KEY_EMIT_TOOLBAR',
KEY_EMIT_MOTION_STATE_T_CLENT: 'KEY_EMIT_MOTION_STATE_T_CLENT',
};
const CHANEL_BACKEND_RECIEVED = {
KEY_RECIEVE_AXIS_MOVE_COMMAND_F_CLIENT:
'KEY_RECIEVE_AXIS_MOVE_COMMAND_F_CLIENT',
KEY_RECIEVE_ODRIVE_COMMAND_F_CLIENT: 'KEY_RECIEVE_ODRIVE_COMMAND_F_CLIENT',
KEY_RECIEVE_SIM_COMMAND_F_CLIENT: 'KEY_RECIEVE_SIM_COMMAND_F_CLIENT',
KEY_RECIEVE_ODRIVE_COMMAND_READ_ALL_F_CLIENT:
'KEY_RECIEVE_ODRIVE_COMMAND_READ_ALL_F_CLIENT',
KEY_RECIEVED_RATIO: 'KEY_RECIEVED_RATIO',
NEED_CONTROL: 'NEED_CONTROL',
};
class PayloadOdriveWriteRatio {
constructor(
TargetDrive = 0,
TargetAxis = 0,
xPOS = 0.0,
xCPR = 1,
xRaito = 0.0,
MoveScale = 0,
isExtar = false
) {
this.TargetDrive = TargetDrive;
this.TargetAxis = TargetAxis;
this.xPOS = xPOS;
this.xRaito = xRaito;
this.xCPR = xCPR;
this.MoveScale = MoveScale;
this.isExtar = isExtar;
this.EmitKey = CHANEL_BACKEND_RECIEVED.KEY_RECIEVED_RATIO;
this.ValidDateConstructor();
}
ValidDateConstructor() {
if (
this.TargetDrive === null ||
this.TargetDrive === undefined ||
this.TargetDrive === ''
) {
throw Error('TargetDrive is require!');
}
if (
this.TargetAxis === null ||
this.TargetAxis === undefined ||
this.TargetAxis === ''
) {
throw Error('TargetAxis is require!');
}
if (
this.xCPR === null ||
this.xCPR === undefined ||
typeof this.xCPR !== 'number'
) {
throw Error('xCPR is require and Number!');
}
if (
this.xPOS === null ||
this.xPOS === undefined ||
typeof this.xPOS !== 'number'
) {
throw Error('xPOS is require and Number!');
}
if (
this.xRaito === null ||
this.xRaito === undefined ||
typeof this.xRaito !== 'number'
) {
throw Error('xRaito is require and Number!');
}
if (
this.MoveScale === null ||
this.MoveScale === undefined ||
typeof this.MoveScale !== 'number'
) {
throw Error('MoveScale is require and Number!');
}
}
CalculateXValue() {
let value = 0.0;
if (this.xRaito > 0.0 && this.MoveScale > 0) {
value = ((this.xCPR * this.xRaito) / 360) * this.MoveScale;
}
return this.isExtar ? this.xPOS + value : this.xPOS - value;
}
GetPayloadObj() {
return {
key: this.EmitKey,
value: {
DriveNo: this.TargetDrive,
AxisNo: this.TargetAxis,
Value: this.CalculateXValue(),
},
};
}
}
class PayloadReadWriteOdriveSingle {
constructor(
ClientOdriveCommand,
DriveNo,
AxisNo,
KeyMaster,
KeySub,
Value = ''
) {
this.ClientOdriveCommand = ClientOdriveCommand;
this.DriveNo = DriveNo;
this.AxisNo = AxisNo;
this.KeyMaster = KeyMaster;
this.KeySub = KeySub;
this.Value = Value;
this.IsError = false;
this.ErrorMessage = '';
this.KeyEmit = CHANEL_BACKEND_RECIEVED.KEY_RECIEVE_ODRIVE_COMMAND_F_CLIENT;
this.ValidDateConstructor();
}
ValidDateConstructor() {
if (
this.ClientOdriveCommand === null ||
this.ClientOdriveCommand === undefined ||
this.ClientOdriveCommand === ''
) {
this.IsError = true;
this.ErrorMessage = 'ClientOdriveCommand is require!';
return;
}
if (
this.DriveNo === null ||
this.DriveNo === undefined ||
this.DriveNo === ''
) {
this.IsError = true;
this.ErrorMessage = 'DriveNo is require!';
return;
}
if (
this.AxisNo === null ||
this.AxisNo === undefined ||
this.AxisNo === ''
) {
this.IsError = true;
this.ErrorMessage = 'AxisNo is require!';
return;
}
}
GeneratePayloadObj() {
if (this.IsError) throw Error(this.ErrorMessage);
return {
key: this.KeyEmit,
value: {
CommandNumber: this.ClientOdriveCommand,
Payload: {
KeyMaster: this.KeyMaster,
KeySub: this.KeySub,
DriveNo: this.DriveNo,
AxisNo: this.AxisNo,
Value: this.Value,
},
},
};
}
GetKeyMitToServer() {
return this.KeyEmit;
}
}
class PayloadReadWriteOdriveMulti {
constructor() {
this.arrayOfPayload = [];
this.KeyEmit =
CHANEL_BACKEND_RECIEVED.KEY_RECIEVE_ODRIVE_COMMAND_READ_ALL_F_CLIENT;
}
AddPayloadObj(
ClientOdriveCommand,
DriveNo,
AxisNo,
KeyMaster,
KeySub,
Value = ''
) {
const instance = new PayloadReadWriteOdriveSingle(
ClientOdriveCommand,
DriveNo,
AxisNo,
KeyMaster,
KeySub,
Value
);
const data = instance.GeneratePayloadObj();
if (data) this.arrayOfPayload.push(data.value);
}
GeneratePayloadObj() {
if (this.arrayOfPayload.length === 0)
throw Error(
'This function need resouce before generate, Please call AddPayloadObj!'
);
return {
key: this.KeyEmit,
value: this.arrayOfPayload,
};
}
}
class PayloadMotionControl {
constructor(ClientOdriveCommand) {
this.ClientOdriveCommand = ClientOdriveCommand;
this.IsError = false;
this.ErrorMessage = '';
this.KeyEmit = CHANEL_BACKEND_RECIEVED.KEY_RECIEVE_SIM_COMMAND_F_CLIENT;
this.ValidDateConstructor();
}
ValidDateConstructor() {
if (
this.ClientOdriveCommand === null ||
this.ClientOdriveCommand === undefined ||
this.ClientOdriveCommand === ''
) {
this.IsError = true;
this.ErrorMessage = 'ClientOdriveCommand is require!';
return;
}
}
GeneratePayloadObj() {
if (this.IsError) throw Error(this.ErrorMessage);
return {
key: this.KeyEmit,
value: this.ClientOdriveCommand,
};
}
GetKeyMitToServer() {
return this.KeyEmit;
}
}
const GenratePayloadOdriveSingle = (
_Code,
_DriveNo,
_AxisNo,
_Value,
_MasterKey,
_SubKey
) => {
const instance = new PayloadReadWriteOdriveSingle(
_Code,
_DriveNo,
_AxisNo,
_MasterKey,
_SubKey,
_Value
);
return instance.GeneratePayloadObj();
};
const GenratePayloadOdriveArrayCodeAll = (_Code = [], _DriveNo, _AxisNo) => {
const instance = new PayloadReadWriteOdriveMulti();
_Code.forEach((el) => {
instance.AddPayloadObj(el, _DriveNo, _AxisNo);
});
return instance.GeneratePayloadObj();
};
const GenratePayloadMotionControl = (_Code) => {
const instance = new PayloadMotionControl(_Code);
return instance.GeneratePayloadObj();
};
const GenratePaylaodMoveAxis = (_Roll, _Pitch, _Yaw, _Heave, _Surge, _Sway) => {
return {
key: CHANEL_BACKEND_RECIEVED.KEY_RECIEVE_AXIS_MOVE_COMMAND_F_CLIENT,
value: { _Roll, _Pitch, _Yaw, _Heave, _Surge, _Sway },
};
};
const GenratePaylaodSetRatio = (
TargetDrive = 0,
TargetAxis = 0,
xPOS = 0.0,
xRaito = 0.0,
MoveScale = 0,
isExtar = false
) => {
const xCPR = 1;
const instance = new PayloadOdriveWriteRatio(
TargetDrive,
TargetAxis,
xPOS,
xCPR,
xRaito,
MoveScale,
isExtar
);
return instance.GetPayloadObj();
};
module.exports = {
CLIENT_COMMAND_SIM,
CLIENT_ODRIVE_COMMAND,
GenerateWriteDriveSimCommand,
GenerateReadDriveSimCommand,
COMMAND_TO_SIMULATOR,
GenerateDriveOtherCommand,
ODRIVE_TAG,
GetCurrentCMDID,
GeneralError,
CHANEL_FONTEND_RECIEVED,
CHANEL_BACKEND_RECIEVED,
GenratePayloadOdriveSingle,
GenratePayloadOdriveArrayCodeAll,
GenratePayloadMotionControl,
GenratePaylaodMoveAxis,
GenerateWriteT,
GenratePaylaodSetRatio,
STATE_MOTOR_STATUS,
STATE_DRIVE_STATUS,
};