Support new controller features for SDL backend

This commit is contained in:
Cameron Gutman 2023-08-29 21:19:36 -05:00
parent 0deeb94655
commit 859965a5a6
5 changed files with 113 additions and 1 deletions

View File

@ -30,6 +30,9 @@
pthread_t main_thread_id = 0;
bool connection_debug;
ConnListenerRumble rumble_handler = NULL;
ConnListenerRumbleTriggers rumble_triggers_handler = NULL;
ConnListenerSetMotionEventState set_motion_event_state_handler = NULL;
ConnListenerSetControllerLED set_controller_led_handler = NULL;
static void connection_terminated(int errorCode) {
switch (errorCode) {
@ -75,6 +78,21 @@ static void rumble(unsigned short controllerNumber, unsigned short lowFreqMotor,
rumble_handler(controllerNumber, lowFreqMotor, highFreqMotor);
}
static void rumble_triggers(unsigned short controllerNumber, unsigned short leftTrigger, unsigned short rightTrigger) {
if (rumble_handler)
rumble_triggers_handler(controllerNumber, leftTrigger, rightTrigger);
}
static void set_motion_event_state(unsigned short controllerNumber, unsigned char motionType, unsigned short reportRateHz) {
if (set_motion_event_state_handler)
set_motion_event_state_handler(controllerNumber, motionType, reportRateHz);
}
static void set_controller_led(unsigned short controllerNumber, unsigned char r, unsigned char g, unsigned char b) {
if (set_controller_led_handler)
set_controller_led_handler(controllerNumber, r, g, b);
}
static void connection_status_update(int status) {
switch (status) {
case CONN_STATUS_OKAY:
@ -94,5 +112,9 @@ CONNECTION_LISTENER_CALLBACKS connection_callbacks = {
.connectionTerminated = connection_terminated,
.logMessage = connection_log_message,
.rumble = rumble,
.connectionStatusUpdate = connection_status_update
.connectionStatusUpdate = connection_status_update,
.setHdrMode = NULL,
.rumbleTriggers = rumble_triggers,
.setMotionEventState = set_motion_event_state,
.setControllerLED = set_controller_led,
};

View File

@ -26,3 +26,6 @@ extern CONNECTION_LISTENER_CALLBACKS connection_callbacks;
extern pthread_t main_thread_id;
extern bool connection_debug;
extern ConnListenerRumble rumble_handler;
extern ConnListenerRumbleTriggers rumble_triggers_handler;
extern ConnListenerSetMotionEventState set_motion_event_state_handler;
extern ConnListenerSetControllerLED set_controller_led_handler;

View File

@ -154,6 +154,7 @@ void sdlinput_init(char* mappings) {
int sdlinput_handle_event(SDL_Window* window, SDL_Event* event) {
int button = 0;
unsigned char touchEventType;
PGAMEPAD_STATE gamepad;
switch (event->type) {
case SDL_MOUSEMOTION:
@ -369,7 +370,47 @@ int sdlinput_handle_event(SDL_Window* window, SDL_Event* event) {
case SDL_CONTROLLERDEVICEREMOVED:
remove_gamepad(event->cdevice.which);
break;
case SDL_CONTROLLERSENSORUPDATE:
gamepad = get_gamepad(event->csensor.which, false);
if (!gamepad)
return SDL_NOTHING;
switch (event->csensor.sensor) {
case SDL_SENSOR_ACCEL:
LiSendControllerMotionEvent(gamepad->id, LI_MOTION_TYPE_ACCEL, event->csensor.data[0], event->csensor.data[1], event->csensor.data[2]);
break;
case SDL_SENSOR_GYRO:
// Convert rad/s to deg/s
LiSendControllerMotionEvent(gamepad->id, LI_MOTION_TYPE_GYRO,
event->csensor.data[0] * 57.2957795f,
event->csensor.data[1] * 57.2957795f,
event->csensor.data[2] * 57.2957795f);
break;
}
break;
case SDL_CONTROLLERTOUCHPADDOWN:
case SDL_CONTROLLERTOUCHPADUP:
case SDL_CONTROLLERTOUCHPADMOTION:
gamepad = get_gamepad(event->ctouchpad.which, false);
if (!gamepad)
return SDL_NOTHING;
switch (event->type) {
case SDL_CONTROLLERTOUCHPADDOWN:
touchEventType = LI_TOUCH_EVENT_DOWN;
break;
case SDL_CONTROLLERTOUCHPADUP:
touchEventType = LI_TOUCH_EVENT_UP;
break;
case SDL_CONTROLLERTOUCHPADMOTION:
touchEventType = LI_TOUCH_EVENT_MOVE;
break;
default:
return SDL_NOTHING;
}
LiSendControllerTouchEvent(gamepad->id, touchEventType, event->ctouchpad.finger,
event->ctouchpad.x, event->ctouchpad.y, event->ctouchpad.pressure);
break;
}
return SDL_NOTHING;
}
@ -409,3 +450,43 @@ void sdlinput_rumble(unsigned short controller_id, unsigned short low_freq_motor
SDL_HapticRunEffect(haptic, state->haptic_effect_id, 1);
#endif
}
void sdlinput_rumble_triggers(unsigned short controller_id, unsigned short left_trigger, unsigned short right_trigger) {
PGAMEPAD_STATE state = &gamepads[controller_id];
if (!state->initialized)
return;
#if SDL_VERSION_ATLEAST(2, 0, 14)
SDL_GameControllerRumbleTriggers(state->controller, left_trigger, right_trigger, 30000);
#endif
}
void sdlinput_set_motion_event_state(unsigned short controller_id, unsigned char motion_type, unsigned short report_rate_hz) {
PGAMEPAD_STATE state = &gamepads[controller_id];
if (!state->initialized)
return;
#if SDL_VERSION_ATLEAST(2, 0, 14)
switch (motion_type) {
case LI_MOTION_TYPE_ACCEL:
SDL_GameControllerSetSensorEnabled(state->controller, SDL_SENSOR_ACCEL, report_rate_hz ? SDL_TRUE : SDL_FALSE);
break;
case LI_MOTION_TYPE_GYRO:
SDL_GameControllerSetSensorEnabled(state->controller, SDL_SENSOR_GYRO, report_rate_hz ? SDL_TRUE : SDL_FALSE);
break;
}
#endif
}
void sdlinput_set_controller_led(unsigned short controller_id, unsigned char r, unsigned char g, unsigned char b) {
PGAMEPAD_STATE state = &gamepads[controller_id];
if (!state->initialized)
return;
#if SDL_VERSION_ATLEAST(2, 0, 14)
SDL_GameControllerSetLED(state->controller, r, g, b);
#endif
}

View File

@ -102,3 +102,6 @@ static const short keyCodes5[] = {
void sdlinput_init(char* mappings);
int sdlinput_handle_event(SDL_Window* window, SDL_Event* event);
void sdlinput_rumble(unsigned short controller_id, unsigned short low_freq_motor, unsigned short high_freq_motor);
void sdlinput_rumble_triggers(unsigned short controller_id, unsigned short left_trigger, unsigned short right_trigger);
void sdlinput_set_motion_event_state(unsigned short controller_id, unsigned char motion_type, unsigned short report_rate_hz);
void sdlinput_set_controller_led(unsigned short controller_id, unsigned char r, unsigned char g, unsigned char b);

View File

@ -383,6 +383,9 @@ int main(int argc, char* argv[]) {
sdlinput_init(config.mapping);
rumble_handler = sdlinput_rumble;
rumble_triggers_handler = sdlinput_rumble_triggers;
set_motion_event_state_handler = sdlinput_set_motion_event_state;
set_controller_led_handler = sdlinput_set_controller_led;
}
#endif
}