mirror of https://github.com/yuzu-mirror/yuzu
applet: mii: Simple implementation of mii applet
parent
96d90be59f
commit
03d671fabc
@ -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
|
Loading…
Reference in New Issue