맞춤 컨트롤러 기기 매핑 추가

게임 컨트롤러 라이브러리는 버튼, 모션 축 레이아웃, 인식된 컨트롤러에 대한 매핑, 인식되지 않은 컨트롤러에 대한 기본 매핑을 구성하는 데 사용되는 컨트롤러 기기의 내부 데이터베이스를 유지합니다. 데이터베이스에는 널리 사용되는 컨트롤러가 많이 포함되어 있지만 특정 게임과 관련된 모든 기기가 포함되어 있는 것은 아닙니다. 게임 컨트롤러 라이브러리는 다음과 같은 기능을 갖춘 맞춤설정을 지원합니다.

  • 현재 매핑 데이터베이스를 검색합니다.
  • 기존 데이터베이스에 항목을 추가합니다.
  • 기존 데이터베이스 항목을 바꿉니다.
  • 현재 전체 데이터베이스를 새 데이터베이스로 교체합니다.

기기 식별

컨트롤러 기기는 productIdvendorId 값으로 식별됩니다. 인식된 각 컨트롤러 기기에는 productIdvendorId가 일치하는 항목이 데이터베이스에 하나 이상 있습니다. 컨트롤러 매핑 구조에는 항목의 적합한 최소 및 최대 Android API 범위를 지정하는 필드가 포함되어 있습니다. productIdvendorId가 동일한 여러 항목은 고유한 최소 및 최대 API 범위가 있는 한 데이터베이스에 존재할 수 있습니다.

현재 리매핑 데이터 읽기

Paddleboat_getControllerRemapTableData 함수를 사용하여 현재 리매핑 데이터를 검색합니다.

int32_t Paddleboat_getControllerRemapTableData(
   const int32_t destRemapTableEntryCount,
   Paddleboat_Controller_Mapping_Data* mappingData)

Paddleboat_getControllerRemapTableData는 내부 데이터베이스에 있는 리매핑 항목의 총 개수를 반환합니다.

매개변수 설명
destRemapTableEntryCount mappingData 매개변수에 전달된 Paddleboat_Controller_Mapping_Data 요소의 배열 크기입니다.
mappingData Paddleboat_Controller_Mapping_Data 요소 배열에 대한 포인터입니다.

destRemapTableEntryCount가 총 리매핑 항목 수보다 작으면 destRemapTableEntryCount로 지정된 항목 수만 mappingData에 복사됩니다.

리매핑 데이터 추가 또는 교체

Paddleboat_addControllerRemapData 함수를 사용하여 리매핑 항목을 추가하거나 현재 리매핑 데이터베이스를 교체합니다.

void Paddleboat_addControllerRemapData(
   const Paddleboat_Remap_Addition_Mode addMode,
   const int32_t remapTableEntryCount,
   const Paddleboat_Controller_Mapping_Data* mappingData)
매개변수 설명
addMode 작업에 사용되는 추가 규칙으로, 유효한 값은 PADDLEBOAT_REMAP_ADD_MODE_DEFAULT 또는 PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL입니다.
remapTableEntryCount mappingData 매개변수에 전달된 Paddleboat_Controller_Mapping_Data 요소의 배열 크기입니다.
mappingData Paddleboat_Controller_Mapping_Data 요소 배열에 대한 포인터입니다.

추가 모드

addModePADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL이 지정된 경우 기존 데이터베이스가 삭제되고 새 배열의 콘텐츠로 교체됩니다.

addModePADDLEBOAT_REMAP_ADD_MODE_DEFAULT가 지정된 경우 mappingData에 전달된 배열의 각 요소에 다음 기준이 적용됩니다.

  • Paddleboat_getControllerRemapTableData가 고유한 경우(vendorIdproductId가 아직 없거나 존재하지만 중복되지 않는 minApi 또는 maxApi 범위가 있음) 항목이 내부 데이터베이스에 추가됩니다.
  • Paddleboat_getControllerRemapTableData가 고유하지 않은 경우(vendorIdproductId가 존재하고 minApi 또는 maxApi 중복이 있음) 내부 데이터베이스의 기존 항목을 교체합니다.

Paddleboat_Controller_Mapping_Data 구조는 다음과 같습니다.

typedef struct Paddleboat_Controller_Mapping_Data {
    int16_t minimumEffectiveApiLevel; /** Min. API level for this entry */
    int16_t maximumEffectiveApiLevel; /** Max. API level, 0 = no max */
    int32_t vendorId; /** VendorID of the controller device for this entry */
    int32_t productId; /** ProductID of the controller device for this entry */
    int32_t flags; /** Flag bits, will be ORed with
                     * Paddleboat_Controller_Info.controllerFlags */

    /** AMOTION_EVENT_AXIS value for the corresponding Paddleboat control axis,
     *  or PADDLEBOAT_AXIS_IGNORED if unsupported. */
    uint16_t axisMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];
    /** Button to set on positive or negative axis value,
     *  PADDLEBOAT_AXIS_BUTTON_IGNORED if none. */
    uint8_t axisPositiveButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];
    uint8_t axisNegativeButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];
    /** AKEYCODE_ value corresponding with the corresponding Paddleboat button.
     *  PADDLEBOAT_BUTTON_IGNORED if unsupported. */
    uint16_t buttonMapping[PADDLEBOAT_BUTTON_COUNT];
} Paddleboat_Controller_Mapping_Data;

매핑 예

다음은 Google Stadia 컨트롤러를 설명하기 위해 채워진 Paddleboat_Controller_Mapping_Data를 보여줍니다.

#define PADDLEBOAT_AXIS_BUTTON_DPAD_UP 0
#define PADDLEBOAT_AXIS_BUTTON_DPAD_LEFT 1
#define PADDLEBOAT_AXIS_BUTTON_DPAD_DOWN 2
#define PADDLEBOAT_AXIS_BUTTON_DPAD_RIGHT 3
#define PADDLEBOAT_AXIS_BUTTON_L2 9
#define PADDLEBOAT_AXIS_BUTTON_R2 12

static const Paddleboat_Controller_Mapping_Data stadia_controller_map[] = {
    16, 0, 0x18d1, 0x9400, PADDLEBOAT_CONTROLLER_LAYOUT_STANDARD,
    {
        /* LX */ AMOTION_EVENT_AXIS_X,
        /* LY */ AMOTION_EVENT_AXIS_Y,
        /* RX */ AMOTION_EVENT_AXIS_Z,
        /* RY */ AMOTION_EVENT_AXIS_RZ,
        /* L1 */ PADDLEBOAT_AXIS_IGNORED,
        /* L2 */ AMOTION_EVENT_AXIS_BRAKE,
        /* R1 */ PADDLEBOAT_AXIS_IGNORED,
        /* R2 */ AMOTION_EVENT_AXIS_GAS,
        /* HX */ AMOTION_EVENT_AXIS_HAT_X,
        /* HY */ AMOTION_EVENT_AXIS_HAT_Y,
    },
    {
        /* LX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* LY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* RX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* RY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* L1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* L2 */ PADDLEBOAT_AXIS_BUTTON_L2,
        /* R1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* R2 */ PADDLEBOAT_AXIS_BUTTON_R2,
        /* HX */ PADDLEBOAT_AXIS_BUTTON_DPAD_RIGHT,
        /* HY */ PADDLEBOAT_AXIS_BUTTON_DPAD_DOWN,
    },
    {
        /* LX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* LY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* RX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* RY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* L1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* L2 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* R1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* R2 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
        /* HX */ PADDLEBOAT_AXIS_BUTTON_DPAD_LEFT,
        /* HY */ PADDLEBOAT_AXIS_BUTTON_DPAD_UP,
    },
    {
        /* UP     */ AKEYCODE_DPAD_UP,
        /* LEFT   */ AKEYCODE_DPAD_LEFT,
        /* DOWN   */ AKEYCODE_DPAD_DOWN,
        /* RIGHT  */ AKEYCODE_DPAD_RIGHT,
        /* A      */ AKEYCODE_BUTTON_A,
        /* B      */ AKEYCODE_BUTTON_B,
        /* X      */ AKEYCODE_BUTTON_X,
        /* Y      */ AKEYCODE_BUTTON_Y,
        /* L1     */ AKEYCODE_BUTTON_L1,
        /* L2     */ AKEYCODE_BUTTON_L2,
        /* L3     */ AKEYCODE_BUTTON_THUMBL,
        /* R1     */ AKEYCODE_BUTTON_R1,
        /* R2     */ AKEYCODE_BUTTON_R2,
        /* R3     */ AKEYCODE_BUTTON_THUMBR,
        /* SELECT */ AKEYCODE_BUTTON_SELECT,
        /* START  */ AKEYCODE_BUTTON_START,
        /* SYSTEM */ AKEYCODE_BUTTON_MODE,
        /* TOUCHP */ PADDLEBOAT_BUTTON_IGNORED,
        /* AUX1   */ PADDLEBOAT_BUTTON_IGNORED,
        /* AUX2   */ PADDLEBOAT_BUTTON_IGNORED,
        /* AUX3   */ PADDLEBOAT_BUTTON_IGNORED,
        /* AUX4   */ PADDLEBOAT_BUTTON_IGNORED
    }
};