time: Implement GetStandardUserSystemClock, GetCurrentTime.
This commit is contained in:
		| @@ -55,6 +55,8 @@ set(SRCS | ||||
|             hle/service/service.cpp | ||||
|             hle/service/sm/controller.cpp | ||||
|             hle/service/sm/sm.cpp | ||||
|             hle/service/time/time.cpp | ||||
|             hle/service/time/time_s.cpp | ||||
|             hle/service/vi/vi.cpp | ||||
|             hle/service/vi/vi_m.cpp | ||||
|             hle/shared_page.cpp | ||||
| @@ -141,6 +143,8 @@ set(HEADERS | ||||
|             hle/service/service.h | ||||
|             hle/service/sm/controller.h | ||||
|             hle/service/sm/sm.h | ||||
|             hle/service/time/time.h | ||||
|             hle/service/time/time_s.h | ||||
|             hle/service/vi/vi.h | ||||
|             hle/service/vi/vi_m.h | ||||
|             hle/shared_page.h | ||||
|   | ||||
| @@ -25,6 +25,7 @@ | ||||
| #include "core/hle/service/service.h" | ||||
| #include "core/hle/service/sm/controller.h" | ||||
| #include "core/hle/service/sm/sm.h" | ||||
| #include "core/hle/service/time/time.h" | ||||
| #include "core/hle/service/vi/vi.h" | ||||
|  | ||||
| using Kernel::ClientPort; | ||||
| @@ -79,7 +80,8 @@ Kernel::SharedPtr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort() { | ||||
|     ASSERT(port == nullptr); | ||||
|     Kernel::SharedPtr<Kernel::ServerPort> server_port; | ||||
|     Kernel::SharedPtr<Kernel::ClientPort> client_port; | ||||
|     std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, service_name); | ||||
|     std::tie(server_port, client_port) = | ||||
|         Kernel::ServerPort::CreatePortPair(max_sessions, service_name); | ||||
|     port = MakeResult<Kernel::SharedPtr<Kernel::ServerPort>>(std::move(server_port)).Unwrap(); | ||||
|     port->SetHleHandler(shared_from_this()); | ||||
|     return client_port; | ||||
| @@ -170,6 +172,7 @@ void Init() { | ||||
|     LM::InstallInterfaces(*SM::g_service_manager); | ||||
|     NVDRV::InstallInterfaces(*SM::g_service_manager); | ||||
|     PCTL::InstallInterfaces(*SM::g_service_manager); | ||||
|     Time::InstallInterfaces(*SM::g_service_manager); | ||||
|     VI::InstallInterfaces(*SM::g_service_manager); | ||||
|  | ||||
|     LOG_DEBUG(Service, "initialized OK"); | ||||
|   | ||||
							
								
								
									
										16
									
								
								src/core/hle/service/time/time.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/core/hle/service/time/time.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| // Copyright 2018 yuzu emulator team | ||||
| // Licensed under GPLv2 or any later version | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #include "core/hle/service/time/time.h" | ||||
| #include "core/hle/service/time/time_s.h" | ||||
|  | ||||
| namespace Service { | ||||
| namespace Time { | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||
|     std::make_shared<TimeS>()->InstallAsService(service_manager); | ||||
| } | ||||
|  | ||||
| } // namespace Time | ||||
| } // namespace Service | ||||
							
								
								
									
										16
									
								
								src/core/hle/service/time/time.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/core/hle/service/time/time.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| // Copyright 2018 yuzu emulator team | ||||
| // Licensed under GPLv2 or any later version | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Service { | ||||
| namespace Time { | ||||
|  | ||||
| /// Registers all Time services with the specified service manager. | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager); | ||||
|  | ||||
| } // namespace Time | ||||
| } // namespace Service | ||||
							
								
								
									
										58
									
								
								src/core/hle/service/time/time_s.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/core/hle/service/time/time_s.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| // Copyright 2018 yuzu emulator team | ||||
| // Licensed under GPLv2 or any later version | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #include <chrono> | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/client_port.h" | ||||
| #include "core/hle/kernel/client_session.h" | ||||
| #include "core/hle/service/time/time_s.h" | ||||
|  | ||||
| namespace Service { | ||||
| namespace Time { | ||||
|  | ||||
| class ISystemClock final : public ServiceFramework<ISystemClock> { | ||||
| public: | ||||
|     ISystemClock() : ServiceFramework("ISystemClock") { | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &ISystemClock::GetCurrentTime, "GetCurrentTime"}, | ||||
|         }; | ||||
|         RegisterHandlers(functions); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void GetCurrentTime(Kernel::HLERequestContext& ctx) { | ||||
|         const s64 time_since_epoch{std::chrono::duration_cast<std::chrono::milliseconds>( | ||||
|                                        std::chrono::system_clock::now().time_since_epoch()) | ||||
|                                        .count()}; | ||||
|         IPC::RequestBuilder rb{ctx, 4}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.Push<u64>(time_since_epoch); | ||||
|         LOG_DEBUG(Service, "called"); | ||||
|     } | ||||
| }; | ||||
|  | ||||
| void TimeS::GetStandardUserSystemClock(Kernel::HLERequestContext& ctx) { | ||||
|     auto client_port = std::make_shared<ISystemClock>()->CreatePort(); | ||||
|     auto session = client_port->Connect(); | ||||
|     if (session.Succeeded()) { | ||||
|         LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", | ||||
|                   (*session)->GetObjectId()); | ||||
|         IPC::RequestBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushMoveObjects(std::move(session).Unwrap()); | ||||
|     } else { | ||||
|         UNIMPLEMENTED(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| TimeS::TimeS() : ServiceFramework("time:s") { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0x00000000, &TimeS::GetStandardUserSystemClock, "GetStandardUserSystemClock"}, | ||||
|     }; | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
|  | ||||
| } // namespace Time | ||||
| } // namespace Service | ||||
							
								
								
									
										23
									
								
								src/core/hle/service/time/time_s.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/core/hle/service/time/time_s.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| // Copyright 2018 yuzu emulator team | ||||
| // Licensed under GPLv2 or any later version | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/kernel/hle_ipc.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Service { | ||||
| namespace Time { | ||||
|  | ||||
| class TimeS final : public ServiceFramework<TimeS> { | ||||
| public: | ||||
|     TimeS(); | ||||
|     ~TimeS() = default; | ||||
|  | ||||
| private: | ||||
|     void GetStandardUserSystemClock(Kernel::HLERequestContext& ctx); | ||||
| }; | ||||
|  | ||||
| } // namespace Time | ||||
| } // namespace Service | ||||
		Reference in New Issue
	
	Block a user