summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/am/applets/applet_cabinet.h
blob: edd295a27346796001522986831036103f9dbf0a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include <array>

#include "core/hle/result.h"
#include "core/hle/service/am/applets/applets.h"
#include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/nfp/nfp_types.h"

namespace Kernel {
class KEvent;
class KReadableEvent;
} // namespace Kernel

namespace Core {
class System;
} // namespace Core

namespace Service::NFP {
class NfpDevice;
}

namespace Service::AM::Applets {

enum class CabinetAppletVersion : u32 {
    Version1 = 0x1,
};

enum class CabinetResult : u8 {
    Cancel = 0,
    TagInfo = 1 << 1,
    RegisterInfo = 1 << 2,
    All = TagInfo | RegisterInfo,
};
DECLARE_ENUM_FLAG_OPERATORS(CabinetResult)

// This is nn::nfp::AmiiboSettingsStartParam
struct AmiiboSettingsStartParam {
    u64 device_handle;
    std::array<u8, 0x20> param_1;
    u8 param_2;
};
static_assert(sizeof(AmiiboSettingsStartParam) == 0x30,
              "AmiiboSettingsStartParam is an invalid size");

#pragma pack(push, 1)
// This is nn::nfp::StartParamForAmiiboSettings
struct StartParamForAmiiboSettings {
    u8 param_1;
    Service::NFP::CabinetMode applet_mode;
    u8 flags;
    u8 amiibo_settings_1;
    u64 device_handle;
    Service::NFP::TagInfo tag_info;
    Service::NFP::RegisterInfo register_info;
    std::array<u8, 0x20> amiibo_settings_3;
    INSERT_PADDING_BYTES(0x24);
};
static_assert(sizeof(StartParamForAmiiboSettings) == 0x1A8,
              "StartParamForAmiiboSettings is an invalid size");

// This is nn::nfp::ReturnValueForAmiiboSettings
struct ReturnValueForAmiiboSettings {
    CabinetResult result;
    INSERT_PADDING_BYTES(0x3);
    u64 device_handle;
    Service::NFP::TagInfo tag_info;
    Service::NFP::RegisterInfo register_info;
    INSERT_PADDING_BYTES(0x24);
};
static_assert(sizeof(ReturnValueForAmiiboSettings) == 0x188,
              "ReturnValueForAmiiboSettings is an invalid size");
#pragma pack(pop)

class Cabinet final : public Applet {
public:
    explicit Cabinet(Core::System& system_, LibraryAppletMode applet_mode_,
                     const Core::Frontend::CabinetApplet& frontend_);
    ~Cabinet() override;

    void Initialize() override;

    bool TransactionComplete() const override;
    Result GetStatus() const override;
    void ExecuteInteractive() override;
    void Execute() override;
    void DisplayCompleted(bool apply_changes, std::string_view amiibo_name);
    void Cancel();
    Result RequestExit() override;

private:
    const Core::Frontend::CabinetApplet& frontend;
    Core::System& system;

    bool is_complete{false};
    std::shared_ptr<Service::NFP::NfpDevice> nfp_device;
    Kernel::KEvent* availability_change_event;
    KernelHelpers::ServiceContext service_context;
    StartParamForAmiiboSettings applet_input_common{};
};

} // namespace Service::AM::Applets