OpenRetroPad/src/util.cpp

80 lines
1.8 KiB
C++
Raw Normal View History

uint8_t calculateDpadDirection(const bool up, const bool down, const bool left, const bool right) {
if (down) {
if (right) {
return DPAD_DOWN_RIGHT;
} else if (left) {
return DPAD_DOWN_LEFT;
} else {
return DPAD_DOWN;
}
} else if (up) {
if (right) {
return DPAD_UP_RIGHT;
} else if (left) {
return DPAD_UP_LEFT;
} else {
return DPAD_UP;
}
} else if (right) {
return DPAD_RIGHT;
} else if (left) {
return DPAD_LEFT;
} else {
return DPAD_CENTERED;
}
}
struct Axis {
int16_t x;
int16_t y;
};
struct Axis axis(int16_t x, int16_t y) {
Axis axis;
axis.x = x;
axis.y = y;
return axis;
}
struct Axis dpadToAxis(uint8_t dpad) {
switch (dpad) {
case DPAD_CENTER:
return axis(AXIS_CENTER, AXIS_CENTER);
case DPAD_UP:
return axis(AXIS_CENTER, AXIS_MIN);
case DPAD_UP_RIGHT:
return axis(AXIS_MAX, AXIS_MAX);
case DPAD_RIGHT:
return axis(AXIS_MAX, AXIS_CENTER);
case DPAD_DOWN_RIGHT:
return axis(AXIS_MAX, AXIS_MAX);
case DPAD_DOWN:
return axis(AXIS_CENTER, AXIS_MAX);
case DPAD_DOWN_LEFT:
return axis(AXIS_MIN, AXIS_MAX);
case DPAD_LEFT:
return axis(AXIS_MIN, AXIS_CENTER);
case DPAD_UP_LEFT:
return axis(AXIS_MIN, AXIS_MIN);
}
// todo: panic here?
return axis(AXIS_CENTER, AXIS_CENTER);
}
/*
long map(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
*/
inline int16_t translateAxis(int16_t v) {
// don't map at all if translation isn't required...
#if AXIS_CENTER_IN == AXIS_CENTER && AXIS_MIN_IN == AXIS_MIN && AXIS_MAX_IN == AXIS_MAX
return v; // noop
#else
//return v == AXIS_CENTER_IN ? AXIS_CENTER : map(v, AXIS_MIN_IN, AXIS_MAX_IN, AXIS_MIN, AXIS_MAX);
return v == AXIS_CENTER_IN ? AXIS_CENTER : (v - AXIS_MIN_IN) * (AXIS_MAX - AXIS_MIN) / (AXIS_MAX_IN - AXIS_MIN_IN) + AXIS_MIN;
#endif
}