mirror of
https://github.com/raphnet/gc_n64_usb-v3
synced 2024-12-21 23:08:53 -05:00
Button mapping framework
This commit is contained in:
parent
7c991aa1a4
commit
c07beb0734
80
mappings.c
Normal file
80
mappings.c
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
#include "mappings.h"
|
||||||
|
#include "gamepads.h"
|
||||||
|
#include "usbpad.h"
|
||||||
|
|
||||||
|
/* Default N64 and Gamecube mappings meant to work together
|
||||||
|
* i.e. Controllers should be mostly interchangeable
|
||||||
|
*
|
||||||
|
* - Main buttons first
|
||||||
|
* - Common buttons at the same place
|
||||||
|
* - Similar layout for GC Y/X and N64 C-Left and C-Down
|
||||||
|
*/
|
||||||
|
|
||||||
|
static struct mapping map_gc_default[] = {
|
||||||
|
{ GC_BTN_A, USB_BTN(0) },
|
||||||
|
{ GC_BTN_B, USB_BTN(1) },
|
||||||
|
{ GC_BTN_Z, USB_BTN(2) },
|
||||||
|
{ GC_BTN_START, USB_BTN(3) },
|
||||||
|
|
||||||
|
{ GC_BTN_L, USB_BTN(4) },
|
||||||
|
{ GC_BTN_R, USB_BTN(5) },
|
||||||
|
|
||||||
|
{ GC_BTN_Y, USB_BTN(8) }, // N64 C-Left
|
||||||
|
{ GC_BTN_X, USB_BTN(7) }, // N64 C-Down
|
||||||
|
|
||||||
|
{ GC_BTN_DPAD_UP, USB_BTN(10) },
|
||||||
|
{ GC_BTN_DPAD_DOWN, USB_BTN(11) },
|
||||||
|
{ GC_BTN_DPAD_LEFT, USB_BTN(12) },
|
||||||
|
{ GC_BTN_DPAD_RIGHT, USB_BTN(13) },
|
||||||
|
|
||||||
|
{ } /* terminator */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct mapping map_n64_default[] = {
|
||||||
|
{ N64_BTN_A, USB_BTN(0) },
|
||||||
|
{ N64_BTN_B, USB_BTN(1) },
|
||||||
|
{ N64_BTN_Z, USB_BTN(2) },
|
||||||
|
{ N64_BTN_START, USB_BTN(3) },
|
||||||
|
|
||||||
|
{ N64_BTN_L, USB_BTN(4) },
|
||||||
|
{ N64_BTN_R, USB_BTN(5) },
|
||||||
|
{ N64_BTN_C_UP, USB_BTN(6) },
|
||||||
|
{ N64_BTN_C_DOWN, USB_BTN(7) }, // GC X
|
||||||
|
|
||||||
|
{ N64_BTN_C_LEFT, USB_BTN(8) }, // GC_Y
|
||||||
|
{ N64_BTN_C_RIGHT, USB_BTN(9) },
|
||||||
|
|
||||||
|
{ N64_BTN_DPAD_UP, USB_BTN(10) },
|
||||||
|
{ N64_BTN_DPAD_DOWN, USB_BTN(11) },
|
||||||
|
{ N64_BTN_DPAD_LEFT, USB_BTN(12) },
|
||||||
|
{ N64_BTN_DPAD_RIGHT, USB_BTN(13) },
|
||||||
|
|
||||||
|
{ } /* terminator */
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t domap(const struct mapping *map, uint16_t input)
|
||||||
|
{
|
||||||
|
const struct mapping *cur = map;
|
||||||
|
uint16_t out = 0;
|
||||||
|
|
||||||
|
while (cur->ctl_btn && cur->usb_btn) {
|
||||||
|
if (input & cur->ctl_btn) {
|
||||||
|
out |= cur->usb_btn;
|
||||||
|
}
|
||||||
|
cur++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t mappings_do(uint8_t mapping_id, uint16_t input)
|
||||||
|
{
|
||||||
|
switch(mapping_id) {
|
||||||
|
case MAPPING_GAMECUBE_DEFAULT:
|
||||||
|
return domap(map_gc_default, input);
|
||||||
|
case MAPPING_N64_DEFAULT:
|
||||||
|
return domap(map_n64_default, input);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
16
mappings.h
Normal file
16
mappings.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef _mappings_h__
|
||||||
|
#define _mappings_h__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct mapping {
|
||||||
|
uint16_t ctl_btn;
|
||||||
|
uint16_t usb_btn;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MAPPING_GAMECUBE_DEFAULT 0x00
|
||||||
|
#define MAPPING_N64_DEFAULT 0x10
|
||||||
|
|
||||||
|
uint16_t mappings_do(uint8_t mapping_id, uint16_t input);
|
||||||
|
|
||||||
|
#endif // _mappings_h__
|
3
usbpad.h
3
usbpad.h
@ -5,4 +5,7 @@ void usbpad_init(void);
|
|||||||
int usbpad_getReportSize(void);
|
int usbpad_getReportSize(void);
|
||||||
void usbpad_buildReport(const gamepad_data *pad_data, unsigned char *dstbuf);
|
void usbpad_buildReport(const gamepad_data *pad_data, unsigned char *dstbuf);
|
||||||
|
|
||||||
|
// For mappings. ID starts at 0.
|
||||||
|
#define USB_BTN(id) (0x0001 << (id))
|
||||||
|
|
||||||
#endif // USBPAD_H__
|
#endif // USBPAD_H__
|
||||||
|
Loading…
Reference in New Issue
Block a user