diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/hid/hid_debug_server.cpp | 173 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid_debug_server.h | 24 |
2 files changed, 78 insertions, 119 deletions
diff --git a/src/core/hle/service/hid/hid_debug_server.cpp b/src/core/hle/service/hid/hid_debug_server.cpp index 610af34dd..4e2663672 100644 --- a/src/core/hle/service/hid/hid_debug_server.cpp +++ b/src/core/hle/service/hid/hid_debug_server.cpp | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <algorithm> | 4 | #include <algorithm> |
| 5 | 5 | ||
| 6 | #include "core/hle/service/cmif_serialization.h" | ||
| 6 | #include "core/hle/service/hid/hid_debug_server.h" | 7 | #include "core/hle/service/hid/hid_debug_server.h" |
| 7 | #include "core/hle/service/ipc_helpers.h" | 8 | #include "core/hle/service/ipc_helpers.h" |
| 8 | #include "hid_core/hid_types.h" | 9 | #include "hid_core/hid_types.h" |
| @@ -11,7 +12,6 @@ | |||
| 11 | 12 | ||
| 12 | #include "hid_core/resources/touch_screen/gesture.h" | 13 | #include "hid_core/resources/touch_screen/gesture.h" |
| 13 | #include "hid_core/resources/touch_screen/touch_screen.h" | 14 | #include "hid_core/resources/touch_screen/touch_screen.h" |
| 14 | #include "hid_core/resources/touch_screen/touch_types.h" | ||
| 15 | 15 | ||
| 16 | namespace Service::HID { | 16 | namespace Service::HID { |
| 17 | 17 | ||
| @@ -24,14 +24,14 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource | |||
| 24 | {0, nullptr, "DeactivateDebugPad"}, | 24 | {0, nullptr, "DeactivateDebugPad"}, |
| 25 | {1, nullptr, "SetDebugPadAutoPilotState"}, | 25 | {1, nullptr, "SetDebugPadAutoPilotState"}, |
| 26 | {2, nullptr, "UnsetDebugPadAutoPilotState"}, | 26 | {2, nullptr, "UnsetDebugPadAutoPilotState"}, |
| 27 | {10, &IHidDebugServer::DeactivateTouchScreen, "DeactivateTouchScreen"}, | 27 | {10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"}, |
| 28 | {11, &IHidDebugServer::SetTouchScreenAutoPilotState, "SetTouchScreenAutoPilotState"}, | 28 | {11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"}, |
| 29 | {12, &IHidDebugServer::UnsetTouchScreenAutoPilotState, "UnsetTouchScreenAutoPilotState"}, | 29 | {12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"}, |
| 30 | {13, &IHidDebugServer::GetTouchScreenConfiguration, "GetTouchScreenConfiguration"}, | 30 | {13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"}, |
| 31 | {14, &IHidDebugServer::ProcessTouchScreenAutoTune, "ProcessTouchScreenAutoTune"}, | 31 | {14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"}, |
| 32 | {15, &IHidDebugServer::ForceStopTouchScreenManagement, "ForceStopTouchScreenManagement"}, | 32 | {15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"}, |
| 33 | {16, &IHidDebugServer::ForceRestartTouchScreenManagement, "ForceRestartTouchScreenManagement"}, | 33 | {16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"}, |
| 34 | {17, &IHidDebugServer::IsTouchScreenManaged, "IsTouchScreenManaged"}, | 34 | {17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"}, |
| 35 | {20, nullptr, "DeactivateMouse"}, | 35 | {20, nullptr, "DeactivateMouse"}, |
| 36 | {21, nullptr, "SetMouseAutoPilotState"}, | 36 | {21, nullptr, "SetMouseAutoPilotState"}, |
| 37 | {22, nullptr, "UnsetMouseAutoPilotState"}, | 37 | {22, nullptr, "UnsetMouseAutoPilotState"}, |
| @@ -47,7 +47,7 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource | |||
| 47 | {60, nullptr, "ClearNpadSystemCommonPolicy"}, | 47 | {60, nullptr, "ClearNpadSystemCommonPolicy"}, |
| 48 | {61, nullptr, "DeactivateNpad"}, | 48 | {61, nullptr, "DeactivateNpad"}, |
| 49 | {62, nullptr, "ForceDisconnectNpad"}, | 49 | {62, nullptr, "ForceDisconnectNpad"}, |
| 50 | {91, &IHidDebugServer::DeactivateGesture, "DeactivateGesture"}, | 50 | {91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"}, |
| 51 | {110, nullptr, "DeactivateHomeButton"}, | 51 | {110, nullptr, "DeactivateHomeButton"}, |
| 52 | {111, nullptr, "SetHomeButtonAutoPilotState"}, | 52 | {111, nullptr, "SetHomeButtonAutoPilotState"}, |
| 53 | {112, nullptr, "UnsetHomeButtonAutoPilotState"}, | 53 | {112, nullptr, "UnsetHomeButtonAutoPilotState"}, |
| @@ -160,169 +160,122 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource | |||
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | IHidDebugServer::~IHidDebugServer() = default; | 162 | IHidDebugServer::~IHidDebugServer() = default; |
| 163 | void IHidDebugServer::DeactivateTouchScreen(HLERequestContext& ctx) { | ||
| 164 | LOG_INFO(Service_HID, "called"); | ||
| 165 | 163 | ||
| 166 | Result result = ResultSuccess; | 164 | Result IHidDebugServer::DeactivateTouchScreen() { |
| 165 | LOG_INFO(Service_HID, "called"); | ||
| 167 | 166 | ||
| 168 | if (!firmware_settings->IsDeviceManaged()) { | 167 | if (!firmware_settings->IsDeviceManaged()) { |
| 169 | result = GetResourceManager()->GetTouchScreen()->Deactivate(); | 168 | R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate()); |
| 170 | } | 169 | } |
| 171 | 170 | ||
| 172 | IPC::ResponseBuilder rb{ctx, 2}; | 171 | R_SUCCEED(); |
| 173 | rb.Push(result); | ||
| 174 | } | 172 | } |
| 175 | 173 | ||
| 176 | void IHidDebugServer::SetTouchScreenAutoPilotState(HLERequestContext& ctx) { | 174 | Result IHidDebugServer::SetTouchScreenAutoPilotState( |
| 175 | InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer) { | ||
| 177 | AutoPilotState auto_pilot{}; | 176 | AutoPilotState auto_pilot{}; |
| 178 | auto_pilot.count = ctx.GetReadBufferNumElements<TouchState>(); | ||
| 179 | const auto buffer = ctx.ReadBuffer(); | ||
| 180 | 177 | ||
| 181 | auto_pilot.count = std::min(auto_pilot.count, static_cast<u64>(auto_pilot.state.size())); | 178 | auto_pilot.count = |
| 182 | memcpy(auto_pilot.state.data(), buffer.data(), auto_pilot.count * sizeof(TouchState)); | 179 | static_cast<u64>(std::min(auto_pilot_buffer.size(), auto_pilot.state.size())); |
| 180 | memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(), | ||
| 181 | auto_pilot.count * sizeof(TouchState)); | ||
| 183 | 182 | ||
| 184 | LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count); | 183 | LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count); |
| 185 | 184 | ||
| 186 | const Result result = | 185 | R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot)); |
| 187 | GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot); | ||
| 188 | |||
| 189 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 190 | rb.Push(result); | ||
| 191 | } | 186 | } |
| 192 | 187 | ||
| 193 | void IHidDebugServer::UnsetTouchScreenAutoPilotState(HLERequestContext& ctx) { | 188 | Result IHidDebugServer::UnsetTouchScreenAutoPilotState() { |
| 194 | LOG_INFO(Service_HID, "called"); | 189 | LOG_INFO(Service_HID, "called"); |
| 195 | 190 | R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState()); | |
| 196 | const Result result = GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState(); | ||
| 197 | |||
| 198 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 199 | rb.Push(result); | ||
| 200 | } | 191 | } |
| 201 | 192 | ||
| 202 | void IHidDebugServer::GetTouchScreenConfiguration(HLERequestContext& ctx) { | 193 | Result IHidDebugServer::GetTouchScreenConfiguration( |
| 203 | IPC::RequestParser rp{ctx}; | 194 | Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config, |
| 204 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 195 | ClientAppletResourceUserId aruid) { |
| 205 | 196 | LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid); | |
| 206 | LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | ||
| 207 | 197 | ||
| 208 | Core::HID::TouchScreenConfigurationForNx touchscreen_config{}; | 198 | R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( |
| 209 | const Result result = GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( | 199 | *out_touchscreen_config, aruid.pid)); |
| 210 | touchscreen_config, applet_resource_user_id); | ||
| 211 | 200 | ||
| 212 | if (touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Heat2 && | 201 | if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 && |
| 213 | touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Finger) { | 202 | out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) { |
| 214 | touchscreen_config.mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; | 203 | out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; |
| 215 | } | 204 | } |
| 216 | 205 | ||
| 217 | IPC::ResponseBuilder rb{ctx, 6}; | 206 | R_SUCCEED(); |
| 218 | rb.Push(result); | ||
| 219 | rb.PushRaw(touchscreen_config); | ||
| 220 | } | 207 | } |
| 221 | 208 | ||
| 222 | void IHidDebugServer::ProcessTouchScreenAutoTune(HLERequestContext& ctx) { | 209 | Result IHidDebugServer::ProcessTouchScreenAutoTune() { |
| 223 | LOG_INFO(Service_HID, "called"); | 210 | LOG_INFO(Service_HID, "called"); |
| 224 | 211 | R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune()); | |
| 225 | Result result = GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune(); | ||
| 226 | |||
| 227 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 228 | rb.Push(result); | ||
| 229 | } | 212 | } |
| 230 | 213 | ||
| 231 | void IHidDebugServer::ForceStopTouchScreenManagement(HLERequestContext& ctx) { | 214 | Result IHidDebugServer::ForceStopTouchScreenManagement() { |
| 232 | LOG_INFO(Service_HID, "called"); | 215 | LOG_INFO(Service_HID, "called"); |
| 233 | 216 | ||
| 234 | if (!firmware_settings->IsDeviceManaged()) { | 217 | if (!firmware_settings->IsDeviceManaged()) { |
| 235 | IPC::ResponseBuilder rb{ctx, 2}; | 218 | R_SUCCEED(); |
| 236 | rb.Push(ResultSuccess); | ||
| 237 | return; | ||
| 238 | } | 219 | } |
| 239 | 220 | ||
| 240 | Result result = ResultSuccess; | ||
| 241 | bool is_touch_active{}; | ||
| 242 | bool is_gesture_active{}; | ||
| 243 | auto touch_screen = GetResourceManager()->GetTouchScreen(); | 221 | auto touch_screen = GetResourceManager()->GetTouchScreen(); |
| 244 | auto gesture = GetResourceManager()->GetGesture(); | 222 | auto gesture = GetResourceManager()->GetGesture(); |
| 245 | 223 | ||
| 246 | if (firmware_settings->IsTouchI2cManaged()) { | 224 | if (firmware_settings->IsTouchI2cManaged()) { |
| 247 | result = touch_screen->IsActive(is_touch_active); | 225 | bool is_touch_active{}; |
| 248 | if (result.IsSuccess()) { | 226 | bool is_gesture_active{}; |
| 249 | result = gesture->IsActive(is_gesture_active); | 227 | R_TRY(touch_screen->IsActive(is_touch_active)); |
| 250 | } | 228 | R_TRY(gesture->IsActive(is_gesture_active)); |
| 251 | if (result.IsSuccess() && is_touch_active) { | 229 | |
| 252 | result = touch_screen->Deactivate(); | 230 | if (is_touch_active) { |
| 231 | R_TRY(touch_screen->Deactivate()); | ||
| 253 | } | 232 | } |
| 254 | if (result.IsSuccess() && is_gesture_active) { | 233 | if (is_gesture_active) { |
| 255 | result = gesture->Deactivate(); | 234 | R_TRY(gesture->Deactivate()); |
| 256 | } | 235 | } |
| 257 | } | 236 | } |
| 258 | 237 | ||
| 259 | IPC::ResponseBuilder rb{ctx, 2}; | 238 | R_SUCCEED(); |
| 260 | rb.Push(result); | ||
| 261 | } | 239 | } |
| 262 | 240 | ||
| 263 | void IHidDebugServer::ForceRestartTouchScreenManagement(HLERequestContext& ctx) { | 241 | Result IHidDebugServer::ForceRestartTouchScreenManagement(u32 basic_gesture_id, |
| 264 | IPC::RequestParser rp{ctx}; | 242 | ClientAppletResourceUserId aruid) { |
| 265 | struct Parameters { | ||
| 266 | u32 basic_gesture_id; | ||
| 267 | INSERT_PADDING_WORDS_NOINIT(1); | ||
| 268 | u64 applet_resource_user_id; | ||
| 269 | }; | ||
| 270 | static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); | ||
| 271 | |||
| 272 | const auto parameters{rp.PopRaw<Parameters>()}; | ||
| 273 | |||
| 274 | LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}", | 243 | LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}", |
| 275 | parameters.basic_gesture_id, parameters.applet_resource_user_id); | 244 | basic_gesture_id, aruid.pid); |
| 276 | 245 | ||
| 277 | Result result = ResultSuccess; | ||
| 278 | auto touch_screen = GetResourceManager()->GetTouchScreen(); | 246 | auto touch_screen = GetResourceManager()->GetTouchScreen(); |
| 279 | auto gesture = GetResourceManager()->GetGesture(); | 247 | auto gesture = GetResourceManager()->GetGesture(); |
| 280 | 248 | ||
| 281 | if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) { | 249 | if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) { |
| 282 | result = gesture->Activate(); | 250 | R_TRY(gesture->Activate()); |
| 283 | if (result.IsSuccess()) { | 251 | R_TRY(gesture->Activate(aruid.pid, basic_gesture_id)); |
| 284 | result = | 252 | R_TRY(touch_screen->Activate()); |
| 285 | gesture->Activate(parameters.applet_resource_user_id, parameters.basic_gesture_id); | 253 | R_TRY(touch_screen->Activate(aruid.pid)); |
| 286 | } | ||
| 287 | if (result.IsSuccess()) { | ||
| 288 | result = touch_screen->Activate(); | ||
| 289 | } | ||
| 290 | if (result.IsSuccess()) { | ||
| 291 | result = touch_screen->Activate(parameters.applet_resource_user_id); | ||
| 292 | } | ||
| 293 | } | 254 | } |
| 294 | 255 | ||
| 295 | IPC::ResponseBuilder rb{ctx, 2}; | 256 | R_SUCCEED(); |
| 296 | rb.Push(result); | ||
| 297 | } | 257 | } |
| 298 | 258 | ||
| 299 | void IHidDebugServer::IsTouchScreenManaged(HLERequestContext& ctx) { | 259 | Result IHidDebugServer::IsTouchScreenManaged(Out<bool> out_is_managed) { |
| 300 | LOG_INFO(Service_HID, "called"); | 260 | LOG_INFO(Service_HID, "called"); |
| 301 | 261 | ||
| 302 | bool is_touch_active{}; | 262 | bool is_touch_active{}; |
| 303 | bool is_gesture_active{}; | 263 | bool is_gesture_active{}; |
| 264 | R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active)); | ||
| 265 | R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active)); | ||
| 304 | 266 | ||
| 305 | Result result = GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active); | 267 | *out_is_managed = is_touch_active || is_gesture_active; |
| 306 | if (result.IsSuccess()) { | 268 | R_SUCCEED(); |
| 307 | result = GetResourceManager()->GetGesture()->IsActive(is_gesture_active); | ||
| 308 | } | ||
| 309 | |||
| 310 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 311 | rb.Push(result); | ||
| 312 | rb.Push(is_touch_active | is_gesture_active); | ||
| 313 | } | 269 | } |
| 314 | 270 | ||
| 315 | void IHidDebugServer::DeactivateGesture(HLERequestContext& ctx) { | 271 | Result IHidDebugServer::DeactivateGesture() { |
| 316 | LOG_INFO(Service_HID, "called"); | 272 | LOG_INFO(Service_HID, "called"); |
| 317 | 273 | ||
| 318 | Result result = ResultSuccess; | ||
| 319 | |||
| 320 | if (!firmware_settings->IsDeviceManaged()) { | 274 | if (!firmware_settings->IsDeviceManaged()) { |
| 321 | result = GetResourceManager()->GetGesture()->Deactivate(); | 275 | R_RETURN(GetResourceManager()->GetGesture()->Deactivate()); |
| 322 | } | 276 | } |
| 323 | 277 | ||
| 324 | IPC::ResponseBuilder rb{ctx, 2}; | 278 | R_SUCCEED(); |
| 325 | rb.Push(result); | ||
| 326 | } | 279 | } |
| 327 | 280 | ||
| 328 | std::shared_ptr<ResourceManager> IHidDebugServer::GetResourceManager() { | 281 | std::shared_ptr<ResourceManager> IHidDebugServer::GetResourceManager() { |
diff --git a/src/core/hle/service/hid/hid_debug_server.h b/src/core/hle/service/hid/hid_debug_server.h index 7d5b082b3..3a483f07e 100644 --- a/src/core/hle/service/hid/hid_debug_server.h +++ b/src/core/hle/service/hid/hid_debug_server.h | |||
| @@ -3,7 +3,9 @@ | |||
| 3 | 3 | ||
| 4 | #pragma once | 4 | #pragma once |
| 5 | 5 | ||
| 6 | #include "core/hle/service/cmif_types.h" | ||
| 6 | #include "core/hle/service/service.h" | 7 | #include "core/hle/service/service.h" |
| 8 | #include "hid_core/resources/touch_screen/touch_types.h" | ||
| 7 | 9 | ||
| 8 | namespace Core { | 10 | namespace Core { |
| 9 | class System; | 11 | class System; |
| @@ -20,15 +22,19 @@ public: | |||
| 20 | ~IHidDebugServer() override; | 22 | ~IHidDebugServer() override; |
| 21 | 23 | ||
| 22 | private: | 24 | private: |
| 23 | void DeactivateTouchScreen(HLERequestContext& ctx); | 25 | Result DeactivateTouchScreen(); |
| 24 | void SetTouchScreenAutoPilotState(HLERequestContext& ctx); | 26 | Result SetTouchScreenAutoPilotState( |
| 25 | void UnsetTouchScreenAutoPilotState(HLERequestContext& ctx); | 27 | InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer); |
| 26 | void GetTouchScreenConfiguration(HLERequestContext& ctx); | 28 | Result UnsetTouchScreenAutoPilotState(); |
| 27 | void ProcessTouchScreenAutoTune(HLERequestContext& ctx); | 29 | Result GetTouchScreenConfiguration( |
| 28 | void ForceStopTouchScreenManagement(HLERequestContext& ctx); | 30 | Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config, |
| 29 | void ForceRestartTouchScreenManagement(HLERequestContext& ctx); | 31 | ClientAppletResourceUserId aruid); |
| 30 | void IsTouchScreenManaged(HLERequestContext& ctx); | 32 | Result ProcessTouchScreenAutoTune(); |
| 31 | void DeactivateGesture(HLERequestContext& ctx); | 33 | Result ForceStopTouchScreenManagement(); |
| 34 | Result ForceRestartTouchScreenManagement(u32 basic_gesture_id, | ||
| 35 | ClientAppletResourceUserId aruid); | ||
| 36 | Result IsTouchScreenManaged(Out<bool> out_is_managed); | ||
| 37 | Result DeactivateGesture(); | ||
| 32 | 38 | ||
| 33 | std::shared_ptr<ResourceManager> GetResourceManager(); | 39 | std::shared_ptr<ResourceManager> GetResourceManager(); |
| 34 | 40 | ||