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

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

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

기기 식별

컨트롤러 기기는 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
    }
};