This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
#ifndef __ACCEL_LINEAR_H_
|
||||
#define __ACCEL_LINEAR_H_
|
||||
|
||||
#include "../dbg.h"
|
||||
#include "../fixedptc.h"
|
||||
#include "../math.h"
|
||||
|
||||
struct linear_curve_args {
|
||||
fpt accel;
|
||||
fpt offset;
|
||||
fpt output_cap;
|
||||
};
|
||||
|
||||
static inline fpt linear_base_fn(fpt x, fpt accel,
|
||||
fpt input_offset) {
|
||||
fpt _x = x - input_offset;
|
||||
fpt _x_square = fpt_mul(
|
||||
_x, _x); // because linear in rawaccel is classic with exponent = 2
|
||||
return fpt_mul(accel, fpt_div(_x_square, x));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sensitivity Function for Linear Acceleration
|
||||
*/
|
||||
static inline fpt __linear_sens_fun(fpt input_speed,
|
||||
struct linear_curve_args args) {
|
||||
dbg("linear: accel %s", fptoa(args.accel));
|
||||
dbg("linear: offset %s", fptoa(args.offset));
|
||||
dbg("linear: output_cap %s", fptoa(args.output_cap));
|
||||
|
||||
if (input_speed <= args.offset) {
|
||||
return FIXEDPT_ONE;
|
||||
}
|
||||
|
||||
fpt sens = linear_base_fn(input_speed, args.accel, args.offset);
|
||||
dbg("linear: base_fn sens %s", fptoa(args.accel));
|
||||
|
||||
fpt sign = FIXEDPT_ONE;
|
||||
if (args.output_cap > 0) {
|
||||
fpt cap = fpt_sub(args.output_cap, FIXEDPT_ONE);
|
||||
if (cap < 0) {
|
||||
cap = -cap;
|
||||
sign = -sign;
|
||||
}
|
||||
sens = minsd(sens, cap);
|
||||
}
|
||||
|
||||
return fpt_add(FIXEDPT_ONE, fpt_mul(sign, sens));
|
||||
}
|
||||
#endif // !__ACCEL_LINEAR_H_
|
||||
Reference in New Issue
Block a user