committed by
Narr the Reg
8 changed files with 272 additions and 5 deletions
-
4src/core/CMakeLists.txt
-
19src/core/frontend/applets/mii.cpp
-
35src/core/frontend/applets/mii.h
-
101src/core/hle/service/am/applets/applet_mii.cpp
-
90src/core/hle/service/am/applets/applet_mii.h
-
17src/core/hle/service/am/applets/applets.cpp
-
9src/core/hle/service/am/applets/applets.h
-
2src/yuzu/main.cpp
@ -0,0 +1,19 @@ |
|||
// Copyright 2022 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/logging/log.h"
|
|||
#include "core/frontend/applets/mii.h"
|
|||
|
|||
namespace Core::Frontend { |
|||
|
|||
MiiApplet::~MiiApplet() = default; |
|||
|
|||
void DefaultMiiApplet::ShowMii( |
|||
const MiiParameters& parameters, |
|||
const std::function<void(const Core::Frontend::MiiParameters& parameters)> callback) const { |
|||
LOG_INFO(Service_HID, "(STUBBED) called"); |
|||
callback(parameters); |
|||
} |
|||
|
|||
} // namespace Core::Frontend
|
|||
@ -0,0 +1,35 @@ |
|||
// Copyright 2022 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <functional> |
|||
|
|||
#include "core/hle/result.h" |
|||
#include "core/hle/service/mii/mii_manager.h" |
|||
|
|||
namespace Core::Frontend { |
|||
|
|||
struct MiiParameters { |
|||
bool is_editable; |
|||
Service::Mii::MiiInfo mii_data{}; |
|||
}; |
|||
|
|||
class MiiApplet { |
|||
public: |
|||
virtual ~MiiApplet(); |
|||
|
|||
virtual void ShowMii(const MiiParameters& parameters, |
|||
const std::function<void(const Core::Frontend::MiiParameters& parameters)> |
|||
callback) const = 0; |
|||
}; |
|||
|
|||
class DefaultMiiApplet final : public MiiApplet { |
|||
public: |
|||
void ShowMii(const MiiParameters& parameters, |
|||
const std::function<void(const Core::Frontend::MiiParameters& parameters)> |
|||
callback) const override; |
|||
}; |
|||
|
|||
} // namespace Core::Frontend |
|||
@ -0,0 +1,101 @@ |
|||
// Copyright 2022 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/assert.h"
|
|||
#include "common/logging/log.h"
|
|||
#include "core/core.h"
|
|||
#include "core/frontend/applets/mii.h"
|
|||
#include "core/hle/service/am/am.h"
|
|||
#include "core/hle/service/am/applets/applet_mii.h"
|
|||
#include "core/reporter.h"
|
|||
|
|||
namespace Service::AM::Applets { |
|||
|
|||
Mii::Mii(Core::System& system_, LibraryAppletMode applet_mode_, |
|||
const Core::Frontend::MiiApplet& frontend_) |
|||
: Applet{system_, applet_mode_}, frontend{frontend_}, system{system_} {} |
|||
|
|||
Mii::~Mii() = default; |
|||
|
|||
void Mii::Initialize() { |
|||
is_complete = false; |
|||
|
|||
const auto storage = broker.PopNormalDataToApplet(); |
|||
ASSERT(storage != nullptr); |
|||
|
|||
const auto data = storage->GetData(); |
|||
ASSERT(data.size() == sizeof(MiiAppletInput)); |
|||
|
|||
std::memcpy(&input_data, data.data(), sizeof(MiiAppletInput)); |
|||
} |
|||
|
|||
bool Mii::TransactionComplete() const { |
|||
return is_complete; |
|||
} |
|||
|
|||
ResultCode Mii::GetStatus() const { |
|||
return ResultSuccess; |
|||
} |
|||
|
|||
void Mii::ExecuteInteractive() { |
|||
UNREACHABLE_MSG("Unexpected interactive applet data!"); |
|||
} |
|||
|
|||
void Mii::Execute() { |
|||
if (is_complete) { |
|||
return; |
|||
} |
|||
|
|||
const auto callback = [this](const Core::Frontend::MiiParameters& parameters) { |
|||
DisplayCompleted(parameters); |
|||
}; |
|||
|
|||
switch (input_data.applet_mode) { |
|||
case MiiAppletMode::ShowMiiEdit: { |
|||
Service::Mii::MiiManager manager; |
|||
Core::Frontend::MiiParameters params{ |
|||
.is_editable = false, |
|||
.mii_data = input_data.mii_char_info.mii_data, |
|||
}; |
|||
frontend.ShowMii(params, callback); |
|||
break; |
|||
} |
|||
case MiiAppletMode::EditMii: { |
|||
Service::Mii::MiiManager manager; |
|||
Core::Frontend::MiiParameters params{ |
|||
.is_editable = true, |
|||
.mii_data = input_data.mii_char_info.mii_data, |
|||
}; |
|||
frontend.ShowMii(params, callback); |
|||
break; |
|||
} |
|||
case MiiAppletMode::CreateMii: { |
|||
Service::Mii::MiiManager manager; |
|||
Core::Frontend::MiiParameters params{ |
|||
.is_editable = true, |
|||
.mii_data = manager.BuildDefault(0), |
|||
}; |
|||
frontend.ShowMii(params, callback); |
|||
break; |
|||
} |
|||
default: |
|||
UNIMPLEMENTED_MSG("Unimplemented LibAppletMiiEdit mode={:02X}!", input_data.applet_mode); |
|||
} |
|||
} |
|||
|
|||
void Mii::DisplayCompleted(const Core::Frontend::MiiParameters& parameters) { |
|||
is_complete = true; |
|||
|
|||
std::vector<u8> reply(sizeof(AppletOutputForCharInfoEditing)); |
|||
output_data = { |
|||
.result = ResultSuccess, |
|||
.mii_data = parameters.mii_data, |
|||
}; |
|||
|
|||
std::memcpy(reply.data(), &output_data, sizeof(AppletOutputForCharInfoEditing)); |
|||
broker.PushNormalDataFromApplet(std::make_shared<IStorage>(system, std::move(reply))); |
|||
broker.SignalStateChanged(); |
|||
} |
|||
|
|||
} // namespace Service::AM::Applets
|
|||
@ -0,0 +1,90 @@ |
|||
// Copyright 2022 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <array> |
|||
|
|||
#include "core/hle/result.h" |
|||
#include "core/hle/service/am/applets/applets.h" |
|||
#include "core/hle/service/mii/mii_manager.h" |
|||
|
|||
namespace Core { |
|||
class System; |
|||
} |
|||
|
|||
namespace Service::AM::Applets { |
|||
|
|||
// This is nn::mii::AppletMode |
|||
enum class MiiAppletMode : u32 { |
|||
ShowMiiEdit = 0, |
|||
AppendMii = 1, |
|||
AppendMiiImage = 2, |
|||
UpdateMiiImage = 3, |
|||
CreateMii = 4, |
|||
EditMii = 5, |
|||
}; |
|||
|
|||
struct MiiCharInfo { |
|||
Service::Mii::MiiInfo mii_data{}; |
|||
INSERT_PADDING_BYTES(0x28); |
|||
}; |
|||
static_assert(sizeof(MiiCharInfo) == 0x80, "MiiCharInfo has incorrect size."); |
|||
|
|||
// This is nn::mii::AppletInput |
|||
struct MiiAppletInput { |
|||
s32 version{}; |
|||
MiiAppletMode applet_mode{}; |
|||
u32 special_mii_key_code{}; |
|||
union { |
|||
std::array<Common::UUID, 8> valid_uuid; |
|||
MiiCharInfo mii_char_info; |
|||
}; |
|||
Common::UUID used_uuid; |
|||
INSERT_PADDING_BYTES(0x64); |
|||
}; |
|||
static_assert(sizeof(MiiAppletInput) == 0x100, "MiiAppletInput has incorrect size."); |
|||
|
|||
// This is nn::mii::AppletOutput |
|||
struct MiiAppletOutput { |
|||
ResultCode result{ResultSuccess}; |
|||
s32 index{}; |
|||
INSERT_PADDING_BYTES(0x18); |
|||
}; |
|||
static_assert(sizeof(MiiAppletOutput) == 0x20, "MiiAppletOutput has incorrect size."); |
|||
|
|||
// This is nn::mii::AppletOutputForCharInfoEditing |
|||
struct AppletOutputForCharInfoEditing { |
|||
ResultCode result{ResultSuccess}; |
|||
Service::Mii::MiiInfo mii_data{}; |
|||
INSERT_PADDING_BYTES(0x24); |
|||
}; |
|||
static_assert(sizeof(AppletOutputForCharInfoEditing) == 0x80, |
|||
"AppletOutputForCharInfoEditing has incorrect size."); |
|||
|
|||
class Mii final : public Applet { |
|||
public: |
|||
explicit Mii(Core::System& system_, LibraryAppletMode applet_mode_, |
|||
const Core::Frontend::MiiApplet& frontend_); |
|||
~Mii() override; |
|||
|
|||
void Initialize() override; |
|||
|
|||
bool TransactionComplete() const override; |
|||
ResultCode GetStatus() const override; |
|||
void ExecuteInteractive() override; |
|||
void Execute() override; |
|||
|
|||
void DisplayCompleted(const Core::Frontend::MiiParameters& parameters); |
|||
|
|||
private: |
|||
const Core::Frontend::MiiApplet& frontend; |
|||
MiiAppletInput input_data{}; |
|||
AppletOutputForCharInfoEditing output_data{}; |
|||
|
|||
bool is_complete = false; |
|||
Core::System& system; |
|||
}; |
|||
|
|||
} // namespace Service::AM::Applets |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue