diff --git a/src/connection.c b/src/connection.c index 82bf0f1..d495291 100644 --- a/src/connection.c +++ b/src/connection.c @@ -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, }; diff --git a/src/connection.h b/src/connection.h index b203499..826a8f6 100644 --- a/src/connection.h +++ b/src/connection.h @@ -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; diff --git a/src/input/sdl.c b/src/input/sdl.c index 7e468ec..3337d9b 100644 --- a/src/input/sdl.c +++ b/src/input/sdl.c @@ -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 +} \ No newline at end of file diff --git a/src/input/sdl.h b/src/input/sdl.h index 8290d98..6928e35 100644 --- a/src/input/sdl.h +++ b/src/input/sdl.h @@ -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); diff --git a/src/main.c b/src/main.c index d3b1dce..63f8cc1 100644 --- a/src/main.c +++ b/src/main.c @@ -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 }