Skip to content

Commit 0b145ab

Browse files
authored
Merge pull request #11072 from iNavFlight/MrD_Add-scaling-to-pan-servo-offset
Add scaling to pan servo offset
2 parents c1f650b + 09aa7ab commit 0b145ab

File tree

5 files changed

+15
-13
lines changed

5 files changed

+15
-13
lines changed

docs/Settings.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5192,9 +5192,9 @@ Degrees either side of the pan servo centre; where it is assumed camera is wante
51925192

51935193
---
51945194

5195-
### osd_pan_servo_pwm2centideg
5195+
### osd_pan_servo_range_decadegrees
51965196

5197-
Centidegrees of pan servo rotation us PWM signal. A servo with 180 degrees of rotation from 1000 to 2000 us PWM typically needs `18` for this setting. Change sign to inverse direction.
5197+
Decadegrees of pan servo rotation. A servo with 180 degrees of rotation typically needs `18` for this setting. Using a negative value will reverse the direction.
51985198

51995199
| Default | Min | Max |
52005200
| --- | --- | --- |

src/main/fc/settings.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3774,9 +3774,9 @@ groups:
37743774
min: 0
37753775
max: 16
37763776
default_value: 0
3777-
- name: osd_pan_servo_pwm2centideg
3778-
description: Centidegrees of pan servo rotation us PWM signal. A servo with 180 degrees of rotation from 1000 to 2000 us PWM typically needs `18` for this setting. Change sign to inverse direction.
3779-
field: pan_servo_pwm2centideg
3777+
- name: osd_pan_servo_range_decadegrees
3778+
description: Decadegrees of pan servo rotation. A servo with 180 degrees of rotation typically needs `18` for this setting. Using a negative value will reverse the direction.
3779+
field: osd_pan_servo_range_decadegrees
37803780
default_value: 0
37813781
min: -36
37823782
max: 36

src/main/io/osd.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,7 +1310,9 @@ int16_t osdGetPanServoOffset(void)
13101310
servoMiddle = PWM_RANGE_MIDDLE + gimbalConfig()->panTrim;
13111311
}
13121312

1313-
return (int16_t)CENTIDEGREES_TO_DEGREES((servoPosition - servoMiddle) * osdConfig()->pan_servo_pwm2centideg);
1313+
float servoDegreesScaleFactor = 1000.0f / (servoParams(servoIndex)->max - servoParams(servoIndex)->min);
1314+
1315+
return (int16_t)CENTIDEGREES_TO_DEGREES((servoPosition - servoMiddle) * (int16_t)(osdConfig()->osd_pan_servo_range_decadegrees) * servoDegreesScaleFactor);
13141316
}
13151317

13161318
// Returns a heading angle in degrees normalized to [0, 360).
@@ -2066,7 +2068,7 @@ static bool osdDrawSingleElement(uint8_t item)
20662068
else
20672069
{
20682070
int16_t panHomeDirOffset = 0;
2069-
if (!(osdConfig()->pan_servo_pwm2centideg == 0)){
2071+
if (!(osdConfig()->osd_pan_servo_range_decadegrees == 0)){
20702072
panHomeDirOffset = osdGetPanServoOffset();
20712073
}
20722074
int homeDirection = GPS_directionToHome - osdGetFlightDirection() + panHomeDirOffset;
@@ -2309,7 +2311,7 @@ static bool osdDrawSingleElement(uint8_t item)
23092311
//////////////////////////////////////////////////////
23102312
// ALT diff to ADSB vehicle draw
23112313
int16_t panServoDirOffset = 0;
2312-
if (osdConfig()->pan_servo_pwm2centideg != 0) {
2314+
if (osdConfig()->osd_pan_servo_range_decadegrees != 0){
23132315
panServoDirOffset = osdGetPanServoOffset();
23142316
}
23152317

@@ -2824,7 +2826,7 @@ static bool osdDrawSingleElement(uint8_t item)
28242826
currentPeer->direction = (int16_t )(calculateBearingToDestination(&poi) / 100); // In °
28252827

28262828
int16_t panServoDirOffset = 0;
2827-
if (osdConfig()->pan_servo_pwm2centideg != 0){
2829+
if (osdConfig()->osd_pan_servo_range_decadegrees != 0){
28282830
panServoDirOffset = osdGetPanServoOffset();
28292831
}
28302832

@@ -4087,7 +4089,7 @@ static bool osdDrawSingleElement(uint8_t item)
40874089
{
40884090
if (navigationPositionEstimateIsHealthy() && isGeozoneActive()) {
40894091
int16_t panHomeDirOffset = 0;
4090-
if (!(osdConfig()->pan_servo_pwm2centideg == 0)){
4092+
if (!(osdConfig()->osd_pan_servo_range_decadegrees == 0)){
40914093
panHomeDirOffset = osdGetPanServoOffset();
40924094
}
40934095
int direction = CENTIDEGREES_TO_DEGREES(geozone.directionToNearestZone) - osdGetFlightDirection() + panHomeDirOffset;
@@ -4334,7 +4336,7 @@ PG_RESET_TEMPLATE(osdConfig_t, osdConfig,
43344336
.ahi_pitch_interval = SETTING_OSD_AHI_PITCH_INTERVAL_DEFAULT,
43354337
.osd_home_position_arm_screen = SETTING_OSD_HOME_POSITION_ARM_SCREEN_DEFAULT,
43364338
.pan_servo_index = SETTING_OSD_PAN_SERVO_INDEX_DEFAULT,
4337-
.pan_servo_pwm2centideg = SETTING_OSD_PAN_SERVO_PWM2CENTIDEG_DEFAULT,
4339+
.osd_pan_servo_range_decadegrees = SETTING_OSD_PAN_SERVO_RANGE_DECADEGREES_DEFAULT,
43384340
.pan_servo_offcentre_warning = SETTING_OSD_PAN_SERVO_OFFCENTRE_WARNING_DEFAULT,
43394341
.pan_servo_indicator_show_degrees = SETTING_OSD_PAN_SERVO_INDICATOR_SHOW_DEGREES_DEFAULT,
43404342
.esc_rpm_precision = SETTING_OSD_ESC_RPM_PRECISION_DEFAULT,

src/main/io/osd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ typedef struct osdConfig_s {
503503
uint8_t right_sidebar_scroll_step; // Same as left_sidebar_scroll_step, but for the right sidebar.
504504
bool osd_home_position_arm_screen;
505505
uint8_t pan_servo_index; // Index of the pan servo used for home direction offset
506-
int8_t pan_servo_pwm2centideg; // Centidegrees of servo rotation per us pwm
506+
int8_t osd_pan_servo_range_decadegrees; // Decadegrees of servo rotation
507507
uint8_t pan_servo_offcentre_warning; // Degrees around the centre, that is assumed camera is wanted to be facing forwards, but isn't centred
508508
bool pan_servo_indicator_show_degrees; // Show the degrees of offset for the pan servo
509509
uint8_t crsf_lq_format;

src/main/io/osd_hud.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ void osdHudDrawPoi(uint32_t poiDistance, int16_t poiDirection, int32_t poiAltitu
137137

138138
osdCrosshairPosition(&center_x, &center_y);
139139

140-
if (!(osdConfig()->pan_servo_pwm2centideg == 0)){
140+
if (!(osdConfig()->osd_pan_servo_range_decadegrees == 0)){
141141
poiDirection = poiDirection + osdGetPanServoOffset();
142142
}
143143

0 commit comments

Comments
 (0)