Library/Controller: Implement JoyPadAccelerometerAddon (#933)

This commit is contained in:
Narr the Reg 2026-03-01 21:00:01 -06:00 committed by GitHub
parent ee3a42d98c
commit 032ed048d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 119 additions and 6 deletions

View file

@ -158818,7 +158818,7 @@ Util/StageInputFunction.o:
- offset: 0x57770c
size: 140
label: _ZNK4sead15RuntimeTypeInfo6DeriveINS_13ControlDeviceEE9isDerivedEPKNS0_9InterfaceE
status: NotDecompiled
status: Matching
lazy: true
Util/StageLayoutFunction.o:
'.text':
@ -291414,25 +291414,25 @@ Project/Controller/JoyPadAccelerometerAddon.o:
label:
- _ZN2al24JoyPadAccelerometerAddonC1EPN4sead10ControllerEi
- _ZN2al24JoyPadAccelerometerAddonC2EPN4sead10ControllerEi
status: NotDecompiled
status: Matching
- offset: 0xa4d6d0
size: 420
label: _ZN2al24JoyPadAccelerometerAddon4calcEv
status: NotDecompiled
status: Matching
- offset: 0xa4d874
size: 204
label: _ZNK4sead18AccelerometerAddon27checkDerivedRuntimeTypeInfoEPKNS_15RuntimeTypeInfo9InterfaceE
status: NotDecompiled
status: Matching
lazy: true
- offset: 0xa4d940
size: 92
label: _ZNK4sead18AccelerometerAddon18getRuntimeTypeInfoEv
status: NotDecompiled
status: Matching
lazy: true
- offset: 0xa4d99c
size: 4
label: _ZN2al24JoyPadAccelerometerAddonD0Ev
status: NotDecompiled
status: Matching
lazy: true
Project/Controller/PadDataArcReader.o:
'.text':

View file

@ -0,0 +1,54 @@
#include "Library/Controller/JoyPadAccelerometerAddon.h"
#include <controller/nin/seadNinJoyNpadDevice.h>
#include <controller/seadControllerMgr.h>
#include "Library/Controller/NpadController.h"
namespace al {
JoyPadAccelerometerAddon::JoyPadAccelerometerAddon(sead::Controller* controller, s32 index)
: sead::AccelerometerAddon(controller), mIndex(index) {}
bool JoyPadAccelerometerAddon::calc() {
sead::ControllerMgr* mgr = sead::ControllerMgr::instance();
sead::NinJoyNpadDevice* npadDevice = mgr->getControlDeviceAs<sead::NinJoyNpadDevice*>();
NpadController* npad = static_cast<NpadController*>(mController);
mIsEnable = false;
mAcceleration = {0.0f, 0.0, 0.0f};
if (!npad->isConnected())
return false;
s64 index = mIndex;
if (index >= npad->getSixAxisSensorCount())
return false;
const sead::NinJoyNpadDevice::NpadState& npadState =
npadDevice->getNpadState(npad->getNpadId());
const nn::hid::SixAxisSensorState& sixAxisState =
npadState.mSixAxisSensorStates[index].state[0];
mAcceleration.set(-sixAxisState.mAcceleration[0], sixAxisState.mAcceleration[2],
sixAxisState.mAcceleration[1]);
if (npadDevice->getNpadJoyHoldType() == nn::hid::NpadJoyHoldType::Horizontal) {
nn::hid::NpadStyleTag style = npad->getStyleIndex();
if (style == nn::hid::NpadStyleTag::NpadStyleJoyLeft ||
style == nn::hid::NpadStyleTag::NpadStyleJoyRight) {
f32 temp = -mAcceleration.x;
if (style == nn::hid::NpadStyleTag::NpadStyleJoyRight) {
mAcceleration.x = -mAcceleration.z;
mAcceleration.z = -temp;
} else {
mAcceleration.x = mAcceleration.z;
mAcceleration.z = temp;
}
}
}
mIsEnable = true;
return false;
}
} // namespace al

View file

@ -0,0 +1,18 @@
#pragma once
#include <basis/seadTypes.h>
#include <controller/seadAccelerometerAddon.h>
namespace al {
class JoyPadAccelerometerAddon : public sead::AccelerometerAddon {
public:
JoyPadAccelerometerAddon(sead::Controller* controller, s32 index);
bool calc() override;
private:
s32 mIndex;
};
static_assert(sizeof(JoyPadAccelerometerAddon) == 0x40);
} // namespace al

View file

@ -0,0 +1,41 @@
#pragma once
#include <basis/seadTypes.h>
#include <controller/seadController.h>
#include <nn/hid.h>
namespace nn::hid {
struct VibrationDeviceHandle;
}
namespace al {
class NpadController : public sead::Controller {
SEAD_RTTI_OVERRIDE(NpadController, Controller)
public:
NpadController(sead::ControllerMgr* mgr);
bool isConnected() const override;
bool isValidNpadId() const;
s32 getNpadId() const;
void setAnyControllerMode();
void setIndexControllerMode(s32 modeIndex);
const nn::hid::VibrationDeviceHandle& getVibrationDeviceHandle(s32 index) const;
nn::hid::NpadStyleTag getStyleIndex() const { return mNpadStyleIndex; }
s64 getSixAxisSensorCount() const { return mSixAxisSensorCount; }
private:
void calcImpl_() override;
s32 mControllerModeIndex = -1;
s32 mNpadId = -1;
nn::hid::NpadStyleTag mNpadStyleIndex = nn::hid::NpadStyleTag::NpadStyleInvalid;
s32 mSixAxisSensorCount = 0;
s32 _188 = 0;
bool mIsConnected = false;
s64 mSamplingNumber = 0;
};
static_assert(sizeof(NpadController) == 0x198);
} // namespace al