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; pthread_t main_thread_id = 0;
bool connection_debug; bool connection_debug;
ConnListenerRumble rumble_handler = NULL; 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) { static void connection_terminated(int errorCode) {
switch (errorCode) { switch (errorCode) {
@ -75,6 +78,21 @@ static void rumble(unsigned short controllerNumber, unsigned short lowFreqMotor,
rumble_handler(controllerNumber, lowFreqMotor, highFreqMotor); 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) { static void connection_status_update(int status) {
switch (status) { switch (status) {
case CONN_STATUS_OKAY: case CONN_STATUS_OKAY:
@ -94,5 +112,9 @@ CONNECTION_LISTENER_CALLBACKS connection_callbacks = {
.connectionTerminated = connection_terminated, .connectionTerminated = connection_terminated,
.logMessage = connection_log_message, .logMessage = connection_log_message,
.rumble = rumble, .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 pthread_t main_thread_id;
extern bool connection_debug; extern bool connection_debug;
extern ConnListenerRumble rumble_handler; 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 sdlinput_handle_event(SDL_Window* window, SDL_Event* event) {
int button = 0; int button = 0;
unsigned char touchEventType;
PGAMEPAD_STATE gamepad; PGAMEPAD_STATE gamepad;
switch (event->type) { switch (event->type) {
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
@ -369,7 +370,47 @@ int sdlinput_handle_event(SDL_Window* window, SDL_Event* event) {
case SDL_CONTROLLERDEVICEREMOVED: case SDL_CONTROLLERDEVICEREMOVED:
remove_gamepad(event->cdevice.which); remove_gamepad(event->cdevice.which);
break; 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; 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); SDL_HapticRunEffect(haptic, state->haptic_effect_id, 1);
#endif #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); void sdlinput_init(char* mappings);
int sdlinput_handle_event(SDL_Window* window, SDL_Event* event); 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(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); sdlinput_init(config.mapping);
rumble_handler = sdlinput_rumble; 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 #endif
} }