diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp index f57f2f157..0ba878799 100644 --- a/src/core/hle/service/pctl/parental_control_service.cpp +++ b/src/core/hle/service/pctl/parental_control_service.cpp @@ -13,7 +13,8 @@ namespace Service::PCTL { IParentalControlService::IParentalControlService(Core::System& system_, Capability capability_) : ServiceFramework{system_, "IParentalControlService"}, capability{capability_}, service_context{system_, "IParentalControlService"}, synchronization_event{service_context}, - unlinked_event{service_context}, request_suspension_event{service_context} { + unlinked_event{service_context}, request_suspension_event{service_context}, + extended_play_timer_event{service_context} { // clang-format off static const FunctionInfo functions[] = { {1, D<&IParentalControlService::Initialize>, "Initialize"}, @@ -77,11 +78,12 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"}, {1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"}, {1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"}, - {1454, nullptr, "GetPlayTimerRemainingTime"}, + {1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"}, {1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"}, {1456, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, {1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"}, {1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"}, + {1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"}, // [20.0.0+] {1471, nullptr, "NotifyWrongPinCodeInputManyTimes"}, {1472, nullptr, "CancelNetworkRequest"}, {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"}, @@ -117,6 +119,14 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {2014, nullptr, "FinishSynchronizeParentalControlSettings"}, {2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"}, {2016, nullptr, "RequestUpdateExemptionListAsync"}, + // [18.0.0+] + {1475, D<&IParentalControlService::GetExtendedPlayTimerEvent>, "GetExtendedPlayTimerEvent"}, + {1954, nullptr, "IsBedtimeAlarmEnabled"}, + {1955, nullptr, "GetBedtimeAlarmTime"}, + {1956, nullptr, "GetBedtimeAlarmTimeHour"}, + {1957, nullptr, "GetBedtimeAlarmTimeMinute"}, + {145601, D<&IParentalControlService::GetPlayTimerSettingsVer2>, "GetPlayTimerSettingsVer2"}, + {195101, nullptr, "SetPlayTimerSettingsForDebugVer2"}, }; // clang-format on RegisterHandlers(functions); @@ -377,6 +387,28 @@ Result IParentalControlService::GetPlayTimerSettings( R_SUCCEED(); } +Result IParentalControlService::GetPlayTimerRemainingTime(Out out_remaining_time) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + // Return 0 indicating no time restriction (unlimited playtime remaining) + *out_remaining_time = 0; + R_SUCCEED(); +} + +Result IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo( + Out out_display_info) { + LOG_WARNING(Service_PCTL, "(STUBBED) called [20.0.0+]"); + // Return default values indicating no time restriction + *out_display_info = {}; + R_SUCCEED(); +} + +Result IParentalControlService::GetPlayTimerSettingsVer2( + Out out_play_timer_settings) { + LOG_WARNING(Service_PCTL, "(STUBBED) called [18.0.0+]"); + *out_play_timer_settings = {}; + R_SUCCEED(); +} + Result IParentalControlService::GetPlayTimerEventToRequestSuspension( OutCopyHandle out_event) { LOG_INFO(Service_PCTL, "called"); @@ -384,6 +416,13 @@ Result IParentalControlService::GetPlayTimerEventToRequestSuspension( R_SUCCEED(); } +Result IParentalControlService::GetExtendedPlayTimerEvent( + OutCopyHandle out_event) { + LOG_INFO(Service_PCTL, "called [18.0.0+]"); + *out_event = extended_play_timer_event.GetHandle(); + R_SUCCEED(); +} + Result IParentalControlService::IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled) { *out_play_timer_alarm_disabled = false; LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}", diff --git a/src/core/hle/service/pctl/parental_control_service.h b/src/core/hle/service/pctl/parental_control_service.h index 03dbaa2e5..b034bc4a5 100644 --- a/src/core/hle/service/pctl/parental_control_service.h +++ b/src/core/hle/service/pctl/parental_control_service.h @@ -47,8 +47,13 @@ private: Result IsPlayTimerEnabled(Out out_is_play_timer_enabled); Result IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer); Result GetPlayTimerSettings(Out out_play_timer_settings); + Result GetPlayTimerRemainingTime(Out out_remaining_time); + Result GetPlayTimerRemainingTimeDisplayInfo( + Out out_display_info); + Result GetPlayTimerSettingsVer2(Out out_play_timer_settings); Result GetPlayTimerEventToRequestSuspension(OutCopyHandle out_event); Result IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled); + Result GetExtendedPlayTimerEvent(OutCopyHandle out_event); Result GetUnlinkedEvent(OutCopyHandle out_event); Result GetStereoVisionRestriction(Out out_stereo_vision_restriction); Result SetStereoVisionRestriction(bool stereo_vision_restriction); @@ -81,6 +86,7 @@ private: Event synchronization_event; Event unlinked_event; Event request_suspension_event; + Event extended_play_timer_event; }; } // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/pctl_types.h b/src/core/hle/service/pctl/pctl_types.h index daaecdf48..e632d3479 100644 --- a/src/core/hle/service/pctl/pctl_types.h +++ b/src/core/hle/service/pctl/pctl_types.h @@ -40,4 +40,28 @@ struct PlayTimerSettings { }; static_assert(sizeof(PlayTimerSettings) == 0x34, "PlayTimerSettings has incorrect size."); +// This is nn::pctl::PlayTimerSettingsVer2 [18.0.0+] +// Extended version with bedtime alarm settings +struct PlayTimerSettingsVer2 { + PlayTimerSettings base_settings; + bool bedtime_alarm_enabled; + INSERT_PADDING_BYTES(3); + u32 bedtime_alarm_hour; + u32 bedtime_alarm_minute; + INSERT_PADDING_BYTES(4); +}; +static_assert(sizeof(PlayTimerSettingsVer2) == 0x44, "PlayTimerSettingsVer2 has incorrect size."); + +// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo [20.0.0+] +struct PlayTimerRemainingTimeDisplayInfo { + s64 remaining_time_ns; // Remaining time in nanoseconds + u32 display_hours; // Hours to display + u32 display_minutes; // Minutes to display + bool is_restricted; // Whether play time is restricted + bool alarm_active; // Whether the alarm is active + INSERT_PADDING_BYTES(6); +}; +static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18, + "PlayTimerRemainingTimeDisplayInfo has incorrect size."); + } // namespace Service::PCTL