Adapt various input devices to various output devices.
https://github.com/OpenRetroPad/OpenRetroPad
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.2 KiB
97 lines
2.2 KiB
|
|
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); |
|
} |
|
|
|
inline long translate(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(long v) { |
|
// pin to max/min |
|
if (v <= AXIS_MIN_IN) { |
|
return AXIS_MIN; |
|
} else if (v >= AXIS_MAX_IN) { |
|
return AXIS_MAX; |
|
} |
|
// 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 : translate(v, AXIS_MIN_IN, AXIS_MAX_IN, AXIS_MIN, AXIS_MAX); |
|
#endif |
|
} |
|
|
|
inline uint8_t translateTrigger(long v) { |
|
// pin to max/min |
|
if (v <= TRIGGER_MIN_IN) { |
|
return TRIGGER_MIN; |
|
} else if (v >= TRIGGER_MAX_IN) { |
|
return TRIGGER_MAX; |
|
} |
|
// don't map at all if translation isn't required... |
|
#if TRIGGER_MIN_IN == TRIGGER_MIN && TRIGGER_MAX_IN == TRIGGER_MAX |
|
return v; // noop |
|
#else |
|
return translate(v, TRIGGER_MIN_IN, TRIGGER_MAX_IN, TRIGGER_MIN, TRIGGER_MAX); |
|
#endif |
|
}
|
|
|