Skip to content

Commit eeb7e1a

Browse files
Williangalvanipatrickelectric
authored andcommitted
core: frontend: allow reversing motors in the frontend
1 parent aeeb1e7 commit eeb7e1a

File tree

1 file changed

+59
-1
lines changed

1 file changed

+59
-1
lines changed

core/frontend/src/components/vehiclesetup/PwmSetup.vue

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<th class="text-left subtitle-1 font-weight-bold">
2424
Motor Test
2525
</th>
26+
<th />
2627
<th>
2728
<v-switch
2829
v-model="desired_armed_state"
@@ -52,6 +53,15 @@
5253
<td width="20%">
5354
{{ motor.name }}
5455
</td>
56+
<td width="10%">
57+
<parameterSwitch
58+
v-if="motor.reverse_parameter"
59+
:parameter="motor.reverse_parameter"
60+
:on-value="reverse_on_value"
61+
:off-value="reverse_off_value"
62+
label="Reversed"
63+
/>
64+
</td>
5565
<td width="80%">
5666
<v-slider
5767
v-model="motor_targets[motor.target]"
@@ -154,10 +164,14 @@ import { SERVO_FUNCTION } from '@/types/autopilot/parameter-sub-enums'
154164
import { Dictionary } from '@/types/common'
155165
import mavlink_store_get from '@/utils/mavlink'
156166
167+
import ParameterSwitch from '../common/ParameterSwitch.vue'
168+
157169
interface MotorTestTarget {
158170
name: string
159171
servo: number // target and servo differ in rover
160172
target: number
173+
direction: number
174+
reverse_parameter?: Parameter
161175
}
162176
163177
const rover_function_map = {
@@ -180,6 +194,7 @@ export default Vue.extend({
180194
name: 'PwmSetup',
181195
components: {
182196
ParameterEditorDialog,
197+
ParameterSwitch,
183198
VehicleViewer,
184199
},
185200
data() {
@@ -195,6 +210,9 @@ export default Vue.extend({
195210
arming_timeout: undefined as number | undefined,
196211
has_focus: true,
197212
motors_zeroed: false,
213+
// These two change from firmware to firmware...
214+
reverse_on_value: 1.0,
215+
reverse_off_value: 0.0,
198216
}
199217
},
200218
computed: {
@@ -221,11 +239,14 @@ export default Vue.extend({
221239
).map((parameter) => {
222240
const number = parseInt(/\d+/g.exec(parameter.name)?.[0] ?? '0', 10)
223241
const name = param_value_map.Submarine[parameter.name] ?? `Motor ${number}`
242+
const direction_parameter = autopilot_data.parameterRegex(`MOT_${number}_DIRECTION`)?.[0]
224243
const target = number - 1
225244
return {
226245
name,
227246
servo: number,
228247
target,
248+
direction: direction_parameter.value,
249+
reverse_parameter: direction_parameter,
229250
}
230251
})
231252
},
@@ -235,6 +256,14 @@ export default Vue.extend({
235256
}
236257
return this.available_sub_motors
237258
},
259+
motor_direction(): {[key: number]: number} {
260+
const motorDict = {} as {[key: number]: number}
261+
const availableMotors = this.available_motors
262+
for (const motor of availableMotors) {
263+
motorDict[motor.target] = motor.direction
264+
}
265+
return motorDict
266+
},
238267
available_rover_motors(): MotorTestTarget[] {
239268
return this.servo_function_parameters.filter(
240269
(parameter) => [
@@ -248,13 +277,25 @@ export default Vue.extend({
248277
const name = printParam(parameter)
249278
const servo = parseInt(/\d+/g.exec(parameter.name)?.[0] ?? '0', 10)
250279
const target = rover_function_map[parameter.value] ?? 0
280+
const reverse_parameter = autopilot_data.parameterRegex(`SERVO${servo}_REVERSED`)?.[0]
251281
return {
252282
name,
253283
servo,
254284
target,
285+
direction: reverse_parameter.value ? -1.0 : 1.0,
286+
reverse_parameter,
255287
}
256288
})
257289
},
290+
motor_target_with_reversion(): {[key: number]: number} {
291+
const targets = { ...this.motor_targets }
292+
for (const motor_string of Object.keys(targets)) {
293+
const motor = parseInt(motor_string, 10)
294+
const raw_value = targets[motor] - 1500
295+
targets[motor] = 1500 + this.motor_direction[motor] * raw_value
296+
}
297+
return targets
298+
},
258299
vehicle_id(): number {
259300
return autopilot_data.system_id
260301
},
@@ -327,13 +368,20 @@ export default Vue.extend({
327368
// To reflect changed made from other sources like from GCSs
328369
this.desired_armed_state = this.is_armed
329370
},
371+
is_rover() {
372+
this.updateReversionValues()
373+
},
374+
is_sub() {
375+
this.updateReversionValues()
376+
},
330377
},
331378
mounted() {
332379
this.motor_zeroer_interval = setInterval(this.zero_motors, 300)
333380
this.motor_writer_interval = setInterval(this.write_motors, 100)
334381
mavlink.setMessageRefreshRate({ messageName: 'SERVO_OUTPUT_RAW', refreshRate: 10 })
335382
this.desired_armed_state = this.is_armed
336383
this.installListeners()
384+
this.updateReversionValues()
337385
},
338386
beforeDestroy() {
339387
clearInterval(this.motor_zeroer_interval)
@@ -342,6 +390,16 @@ export default Vue.extend({
342390
this.uninstallListeners()
343391
},
344392
methods: {
393+
updateReversionValues() {
394+
if (this.is_rover) {
395+
this.reverse_on_value = 1.0
396+
this.reverse_off_value = 0
397+
return
398+
}
399+
// sub
400+
this.reverse_on_value = -1.0
401+
this.reverse_off_value = 1.0
402+
},
345403
focusListener() {
346404
this.has_focus = true
347405
},
@@ -386,7 +444,7 @@ export default Vue.extend({
386444
return
387445
}
388446
if (this.is_armed && this.desired_armed_state) {
389-
for (const [motor, value] of Object.entries(this.motor_targets)) {
447+
for (const [motor, value] of Object.entries(this.motor_target_with_reversion)) {
390448
this.doMotorTest(parseInt(motor, 10), value)
391449
}
392450
}

0 commit comments

Comments
 (0)