SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
WPadHolder.cpp
1#include "Game/System/GameSystem.hpp"
2#include "Game/System/GameSystemObjHolder.hpp"
3#include "Game/System/WPadHolder.hpp"
4#include "Game/System/WPad.hpp"
5#include "Game/System/WPadPointer.hpp"
6#include <revolution/wpad.h>
7#include "Game/Util/MemoryUtil.hpp"
8
9namespace {
10 WPadHolder* getWPadHolder() NO_INLINE {
11 return SingletonHolder<GameSystem>::sInstance->mObjHolder->mWPadHolder;
12 }
13};
14
15WPadReadDataInfo::WPadReadDataInfo() {
16 mStatusArray = nullptr;
17 mValidStatusCount = 0;
18 mStatusArray = new KPADStatus[0x78];
19 MR::zeroMemory(mStatusArray, sizeof(KPADStatus) * 0x78);
20}
21
22KPADStatus* WPadReadDataInfo::getKPadStatus(u32 idx) const {
23 if (idx >= mValidStatusCount) {
24 return nullptr;
25 }
26
27 return &mStatusArray[idx];
28}
29
30u32 WPadReadDataInfo::getValidStatusCount() const {
31 return mValidStatusCount;
32}
33
34WPadHolder::WPadHolder() {
35 mDataInfoArray = nullptr;
36 mHolderMode = 1;
37 WPADRegisterAllocator(MR::allocFromWPadHeap, MR::freeFromWPadHeap);
38 KPADInit();
39 mDataInfoArray = new WPadReadDataInfo[4];
40
41 for (u32 i = 0; i < 2; i++) {
42 WPad* pad = new WPad(i);
43 mPads[i] = pad;
44 pad->setReadInfo(&mDataInfoArray[i]);
45 }
46
47 setConnectCallback();
48 initSensorBarPosition();
49}
50
51void WPadHolder::updateReadDataOnly() {
52 WPadReadDataInfo* info;
53 for (s32 i = 0; i < 4; i++) {
54 info = &mDataInfoArray[i];
55 info->mValidStatusCount = KPADRead(i, info->mStatusArray, 0x78);
56 }
57}
58
59void WPadHolder::updateProjectPadData() {
60 for (s32 i = 0; i < 2u; i++) {
61 mPads[i]->update();
62 }
63}
64
65void WPadHolder::updateInGame() {
66 for (s32 i = 2; i < 4; i++) {
67 KPADStatus* status = (&mDataInfoArray[i])->getKPadStatus(0);
68
69 if (status != nullptr && !status->wpad_err) {
70 WPADDisconnect(i);
71 }
72 }
73}
74
75void WPadHolder::update() {
76 updateReadDataOnly();
77 updateProjectPadData();
78
79 switch (mHolderMode) {
80 case 1:
81 updateInGame();
82 break;
83 case 0:
84 default:
85 break;
86 }
87}
88
89void WPadHolder::initSensorBarPosition() {
90 u8 barPos = WPADGetSensorBarPosition();
91 f32 lvl = 0.0f;
92
93 switch (barPos) {
94 case 1:
95 lvl = 0.34999999;
96 break;
97 case 0:
98 lvl = -0.15000001;
99 break;
100 }
101
102 for (int i = 0; i < 2; i++) {
103 mPads[i]->mPointer->setSensorBarLevel(lvl);
104 }
105}
106
107void WPadHolder::resetPad() {
108 KPADReset();
109
110 for (s32 i = 0; i < 2u; i++) {
111 mPads[i]->resetPad();
112 }
113}
114
115WPad* WPadHolder::getWPad(s32 idx) {
116 if (idx < 2u) {
117 return mPads[idx];
118 }
119
120 return nullptr;
121}
122
123namespace MR {
124 WPad* getWPad(s32 idx) {
125 return ::getWPadHolder()->getWPad(idx);
126 }
127
128 void resetWPad() {
129 ::getWPadHolder()->resetPad();
130 }
131
132 void setWPadHolderModeHomeButton() {
133 WPadHolder* holder = ::getWPadHolder();
134 holder->mHolderMode = 0;
135 }
136
137 void setWPadHolderModeGame() {
138 WPadHolder* holder = ::getWPadHolder();
139 holder->mHolderMode = 1;
140 }
141
142 // getHBMKPadData
143
144 void setAutoSleepTimeWiiRemote(bool a1) {
145 WPADSetAutoSleepTime(a1 != false ? 15 : 5);
146 }
147};
Definition WPad.hpp:15