Files
gotta-scroll-fast/driver/accel_k.h
T
thomas 5f1254d11a
Tests / test_core_function (push) Failing after 12s
import upstream maccel baseline
2026-03-25 09:32:22 +00:00

88 lines
2.3 KiB
C

#ifndef _ACCELK_H_
#define _ACCELK_H_
#include "accel.h"
#include "accel/linear.h"
#include "accel/mode.h"
#include "fixedptc.h"
#include "linux/ktime.h"
#include "params.h"
#include "speed.h"
static struct accel_args collect_args(void) {
struct accel_args accel = {0};
enum accel_mode mode = PARAM_MODE;
accel.tag = mode;
accel.sens_mult = atofp(PARAM_SENS_MULT);
accel.yx_ratio = atofp(PARAM_YX_RATIO);
accel.input_dpi = atofp(PARAM_INPUT_DPI);
accel.angle_rotation_deg = atofp(PARAM_ANGLE_ROTATION);
switch (mode) {
case synchronous: {
accel.args.synchronous.gamma = atofp(PARAM_GAMMA);
accel.args.synchronous.smooth = atofp(PARAM_SMOOTH);
accel.args.synchronous.motivity = atofp(PARAM_MOTIVITY);
accel.args.synchronous.sync_speed = atofp(PARAM_SYNC_SPEED);
break;
}
case natural: {
accel.args.natural.decay_rate = atofp(PARAM_DECAY_RATE);
accel.args.natural.offset = atofp(PARAM_OFFSET);
accel.args.natural.limit = atofp(PARAM_LIMIT);
break;
}
case linear: {
accel.args.linear.accel = atofp(PARAM_ACCEL);
accel.args.linear.offset = atofp(PARAM_OFFSET);
accel.args.linear.output_cap = atofp(PARAM_OUTPUT_CAP);
break;
}
case no_accel:
default: {
}
};
return accel;
}
#if FIXEDPT_BITS == 64
const fpt UNIT_PER_MS = fpt_rconst(1000000); // 1 million nanoseconds
#else
const fpt UNIT_PER_MS = fpt_rconst(1000); // 1 thousand microsends
#endif
static inline void accelerate(int *x, int *y) {
dbg("FIXEDPT_BITS = %d", FIXEDPT_BITS);
static ktime_t last_time;
ktime_t now = ktime_get();
#if FIXEDPT_BITS == 64
s64 unit_time = ktime_to_ns(now - last_time);
dbg("ktime interval -> now (%llu) vs last_ktime (%llu), diff = %llins", now,
last_time, unit_time);
#else
s64 unit_time = ktime_to_us(now - last_time);
dbg("ktime interval -> now (%llu) vs last_ktime (%llu), diff = %llius", now,
last_time, unit_time);
#endif
last_time = now;
fpt _unit_time = fpt_fromint(unit_time);
fpt millisecond = fpt_div(_unit_time, UNIT_PER_MS);
#if FIXEDPT_BITS == 64
dbg("ktime interval -> converting to ns: %lluns -> %sms", unit_time,
fptoa(millisecond));
#else
dbg("ktime interval, converting to us: %lluus -> %sms", unit_time,
fptoa(millisecond));
#endif
return f_accelerate(x, y, millisecond, collect_args());
}
#endif // !_ACCELK_H_