-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathNFCDumper.cpp
91 lines (79 loc) · 3.32 KB
/
NFCDumper.cpp
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
#include <NFCDumper.h>
#include <utils.h>
#include <arriba.h>
#include <arribaPrimitives.h>
// Goldleaf code used as implementation reference
// https://github.com/XorTroll/Goldleaf/blob/master/Goldleaf/source/nfp/nfp_Amiibo.cpp
namespace Amiigo::NFC::Dumper {
void init() {
nfpInitialize(NfpServiceType_Debug);
nfpListDevices(&readerCount, &readerHandle, 1);
nfpStartDetection(&readerHandle);
}
void exit() {
nfpExit();
nfpStopDetection(&readerHandle);
}
bool dumpNFC() {
AmiiboCreatorData amiiboInfo;
amiiboInfo.name = "Default";
amiiboInfo.gameName = "Dump";
amiiboInfo.amiiboSeries = "Dump";
// Mount the tag
Result res = nfpMount(&readerHandle, NfpDeviceType_Amiibo, NfpMountTarget_All);
// If device failed to mount
if (!R_SUCCEEDED(res)) {
nfpUnmount(&readerHandle);
nfpStartDetection(&readerHandle);
return false;
}
// Get the tag info
NfpTagInfo amiiboTagInfo;
nfpGetTagInfo(&readerHandle, &amiiboTagInfo);
// TODO: Dump UUID
// Get register info
NfpRegisterInfo amiiboRegInfo;
nfpGetRegisterInfo(&readerHandle, &amiiboRegInfo);
// TODO: Dump mii data and get first write
// Get common area
NfpCommonInfo amiiboCommonArea;
// TODO: Get last write / version
// Get model info
NfpModelInfo _amiiboModelInfo = {};
nfpGetModelInfo(&readerHandle, &_amiiboModelInfo);
// Convert from offcial NFP format to Emuiibo format
_amiiboModelInfo.amiibo_id[5] = _amiiboModelInfo.amiibo_id[4];
_amiiboModelInfo.amiibo_id[4] = 0;
_amiiboModelInfo.amiibo_id[7] = 2;
// Store model info in creator struct
ModelFormat* amiiboModelInfo = reinterpret_cast<ModelFormat*>(_amiiboModelInfo.amiibo_id);
amiiboInfo.game_character_id = amiiboModelInfo->gameCharacterID;
amiiboInfo.character_variant = amiiboModelInfo->characterVariant;
amiiboInfo.figure_type = amiiboModelInfo->figureType;
amiiboInfo.model_number = __builtin_bswap16(amiiboModelInfo->modelNumber);
amiiboInfo.series = amiiboModelInfo->series;
// Get Amiibo name from user
SwkbdConfig kbinput;
swkbdCreate(&kbinput, 0);
swkbdConfigMakePresetDefault(&kbinput);
swkbdConfigSetGuideText(&kbinput, "Enter Amiibo name");
swkbdConfigSetInitialText(&kbinput, amiiboRegInfo.amiibo_name);
char *amiiboName = reinterpret_cast<char*>(malloc(256));
swkbdShow(&kbinput, amiiboName, 255);
swkbdClose(&kbinput);
amiiboInfo.name = amiiboName;
free(amiiboName);
if (amiiboInfo.name == "") {
nfpUnmount(&readerHandle);
nfpStartDetection(&readerHandle);
static_cast<Arriba::Primitives::Text*>(Arriba::findObjectByName("StatusBarText"))->setText("Dump failed (No name provided)");
return false;
}
// Create the virtual amiibo
createVirtualAmiibo(amiiboInfo);
static_cast<Arriba::Primitives::Text*>(Arriba::findObjectByName("StatusBarText"))->setText("Amiibo dumped to SD");
nfpUnmount(&readerHandle);
nfpStartDetection(&readerHandle);
return true;
}
} // namespace Amiigo::NFC::Dumper