mirror of
https://github.com/encounter/Petari.git
synced 2026-03-30 11:34:15 -07:00
147 lines
3.2 KiB
C++
147 lines
3.2 KiB
C++
#include "Game/System/GameSystem.hpp"
|
|
#include "Game/System/GameSystemObjHolder.hpp"
|
|
#include "Game/System/WPadHolder.hpp"
|
|
#include "Game/System/WPad.hpp"
|
|
#include "Game/System/WPadPointer.hpp"
|
|
#include <revolution/wpad.h>
|
|
#include "Game/Util/MemoryUtil.hpp"
|
|
|
|
namespace {
|
|
WPadHolder* getWPadHolder() NO_INLINE {
|
|
return SingletonHolder<GameSystem>::sInstance->mObjHolder->mWPadHolder;
|
|
}
|
|
};
|
|
|
|
WPadReadDataInfo::WPadReadDataInfo() {
|
|
mStatusArray = nullptr;
|
|
mValidStatusCount = 0;
|
|
mStatusArray = new KPADStatus[0x78];
|
|
MR::zeroMemory(mStatusArray, sizeof(KPADStatus) * 0x78);
|
|
}
|
|
|
|
KPADStatus* WPadReadDataInfo::getKPadStatus(u32 idx) const {
|
|
if (idx >= mValidStatusCount) {
|
|
return nullptr;
|
|
}
|
|
|
|
return &mStatusArray[idx];
|
|
}
|
|
|
|
u32 WPadReadDataInfo::getValidStatusCount() const {
|
|
return mValidStatusCount;
|
|
}
|
|
|
|
WPadHolder::WPadHolder() {
|
|
mDataInfoArray = nullptr;
|
|
mHolderMode = 1;
|
|
WPADRegisterAllocator(MR::allocFromWPadHeap, MR::freeFromWPadHeap);
|
|
KPADInit();
|
|
mDataInfoArray = new WPadReadDataInfo[4];
|
|
|
|
for (u32 i = 0; i < 2; i++) {
|
|
WPad* pad = new WPad(i);
|
|
mPads[i] = pad;
|
|
pad->setReadInfo(&mDataInfoArray[i]);
|
|
}
|
|
|
|
setConnectCallback();
|
|
initSensorBarPosition();
|
|
}
|
|
|
|
void WPadHolder::updateReadDataOnly() {
|
|
WPadReadDataInfo* info;
|
|
for (s32 i = 0; i < 4; i++) {
|
|
info = &mDataInfoArray[i];
|
|
info->mValidStatusCount = KPADRead(i, info->mStatusArray, 0x78);
|
|
}
|
|
}
|
|
|
|
void WPadHolder::updateProjectPadData() {
|
|
for (s32 i = 0; i < 2u; i++) {
|
|
mPads[i]->update();
|
|
}
|
|
}
|
|
|
|
void WPadHolder::updateInGame() {
|
|
for (s32 i = 2; i < 4; i++) {
|
|
KPADStatus* status = (&mDataInfoArray[i])->getKPadStatus(0);
|
|
|
|
if (status != nullptr && !status->wpad_err) {
|
|
WPADDisconnect(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
void WPadHolder::update() {
|
|
updateReadDataOnly();
|
|
updateProjectPadData();
|
|
|
|
switch (mHolderMode) {
|
|
case 1:
|
|
updateInGame();
|
|
break;
|
|
case 0:
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void WPadHolder::initSensorBarPosition() {
|
|
u8 barPos = WPADGetSensorBarPosition();
|
|
f32 lvl = 0.0f;
|
|
|
|
switch (barPos) {
|
|
case 1:
|
|
lvl = 0.34999999;
|
|
break;
|
|
case 0:
|
|
lvl = -0.15000001;
|
|
break;
|
|
}
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
mPads[i]->mPointer->setSensorBarLevel(lvl);
|
|
}
|
|
}
|
|
|
|
void WPadHolder::resetPad() {
|
|
KPADReset();
|
|
|
|
for (s32 i = 0; i < 2u; i++) {
|
|
mPads[i]->resetPad();
|
|
}
|
|
}
|
|
|
|
WPad* WPadHolder::getWPad(s32 idx) {
|
|
if (idx < 2u) {
|
|
return mPads[idx];
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
namespace MR {
|
|
WPad* getWPad(s32 idx) {
|
|
return ::getWPadHolder()->getWPad(idx);
|
|
}
|
|
|
|
void resetWPad() {
|
|
::getWPadHolder()->resetPad();
|
|
}
|
|
|
|
void setWPadHolderModeHomeButton() {
|
|
WPadHolder* holder = ::getWPadHolder();
|
|
holder->mHolderMode = 0;
|
|
}
|
|
|
|
void setWPadHolderModeGame() {
|
|
WPadHolder* holder = ::getWPadHolder();
|
|
holder->mHolderMode = 1;
|
|
}
|
|
|
|
// getHBMKPadData
|
|
|
|
void setAutoSleepTimeWiiRemote(bool a1) {
|
|
WPADSetAutoSleepTime(a1 != false ? 15 : 5);
|
|
}
|
|
}; |