mirror of
https://github.com/moonlight-stream/moonlight-embedded.git
synced 2025-07-01 23:35:47 +00:00
Support new controller features for SDL backend
This commit is contained in:
parent
0deeb94655
commit
859965a5a6
@ -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,
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
}
|
@ -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);
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user