feat: use any source for expo/weight/offset (#5220)

Co-authored-by: philmoz <phil.a.mitchell@gmail.com>
Co-authored-by: 3djc <3djc@gh.com>
Co-authored-by: elecpower <elecpower@users.noreply.github.com>
This commit is contained in:
philmoz
2024-07-26 20:51:21 +10:00
committed by GitHub
co-authored by philmoz 3djc elecpower
parent 326c58a7fd
commit 4b917b762c
87 changed files with 2751 additions and 1671 deletions
+17 -9
View File
@@ -25,6 +25,8 @@
#include "libopenui.h"
#endif
extern int32_t getSourceNumFieldValue(int16_t val, int16_t min, int16_t max);
constexpr int DEFAULT_POINTS = 5;
constexpr int STD_CURVE_POINTS(int p) { return p + DEFAULT_POINTS; }
constexpr int CUSTOM_CURVE_POINTS(int p) { return 2 * p + (2 * DEFAULT_POINTS - 2); }
@@ -318,10 +320,13 @@ int intpol(int x, uint8_t idx) // -100, -75, -50, -25, 0 ,25 ,50, 75, 100
int applyCurve(int x, CurveRef & curve)
{
SourceNumVal v;
v.rawValue = curve.value;
switch (curve.type) {
case CURVE_REF_DIFF:
{
int curveParam = GET_GVAR_PREC1(curve.value, -100, 100, mixerCurrentFlightMode);
int curveParam = getSourceNumFieldValue(curve.value, -100, 100);
if (curveParam > 0 && x < 0)
x = (x * (1000 - curveParam)) / 1000;
else if (curveParam < 0 && x > 0)
@@ -331,12 +336,12 @@ int applyCurve(int x, CurveRef & curve)
case CURVE_REF_EXPO:
{
int curveParam = GET_GVAR_PREC1(curve.value, -100, 100, mixerCurrentFlightMode) / 10;
int curveParam = getSourceNumFieldValue(curve.value, -100, 100) / 10;
return expo(x, curveParam);
}
case CURVE_REF_FUNC:
switch (curve.value) {
switch (v.value) {
case CURVE_X_GT0:
if (x < 0) x = 0; //x|x>0
return x;
@@ -356,7 +361,7 @@ int applyCurve(int x, CurveRef & curve)
case CURVE_REF_CUSTOM:
{
int curveParam = curve.value;
int curveParam = v.value;
if (curveParam < 0) {
x = -x;
curveParam = -curveParam;
@@ -423,24 +428,27 @@ char *getCurveRefString(char *dest, size_t len, const CurveRef& curve)
if (!len) return dest;
char *s = dest;
if (curve.value != 0) {
SourceNumVal v;
v.rawValue = curve.value;
if (v.value != 0) {
switch (curve.type) {
case CURVE_REF_DIFF:
*(s++) = 'D'; if (--len == 0) return dest;
getValueOrGVarString(s, len, curve.value, -100, 100, 0, "%");
getValueOrSrcVarString(s, len, curve.value, -100, 100, 0, "%");
return dest;
case CURVE_REF_EXPO:
*(s++) = 'E'; if (--len == 0) return dest;
getValueOrGVarString(s, len, curve.value, -100, 100, 0, "%");
getValueOrSrcVarString(s, len, curve.value, -100, 100, 0, "%");
return dest;
case CURVE_REF_FUNC:
strAppend(dest, STR_VCURVEFUNC[curve.value], len);
strAppend(dest, STR_VCURVEFUNC[v.value], len);
return dest;
case CURVE_REF_CUSTOM:
return getCurveString(dest, curve.value);
return getCurveString(dest, v.value);
}
}