1#pragma once
2
3#include <nn/hid.h>
4
5#include "container/seadSafeArray.h"
6#include "controller/seadControlDevice.h"
7#include "controller/seadController.h"
8#include "heap/seadHeap.h"
9#include "thread/seadCriticalSection.h"
10#include "thread/seadThread.h"
11
12namespace sead
13{
14class NinJoyNpadDevice : public ControlDevice
15{
16 SEAD_RTTI_OVERRIDE(NinJoyNpadDevice, ControlDevice);
17
18public:
19 class VibrationThread : public Thread
20 {
21 public:
22 VibrationThread(Heap* heap);
23 ~VibrationThread() override;
24
25 void calc_(s64) override;
26 void requestVibration(const nn::hid::VibrationDeviceHandle& handle,
27 const nn::hid::VibrationValue& value);
28
29 private:
30 u8 _fc[0x158];
31 CriticalSection mCS;
32 };
33
34 static_assert(sizeof(VibrationThread) == 0x298);
35
36 struct NpadState
37 {
38 nn::hid::NpadBaseState mState;
39 u8 _28[0x258];
40 s32 mSixAxisDeviceNum;
41 s32 mVibrationDeviceNum;
42 SafeArray<nn::hid::SixAxisSensorHandle, 2> mSixAxisSensorHandles;
43 SafeArray<nn::hid::SixAxisSensorState, 2> mSixAxisSensorStates;
44 u8 _288[0xb40];
45 SafeArray<nn::hid::VibrationDeviceHandle, 2> mVibrationDeviceHandles;
46 };
47
48 static_assert(sizeof(NpadState) == 0xe98);
49
50 NinJoyNpadDevice(ControllerMgr* mgr, Heap* heap);
51 ~NinJoyNpadDevice() override;
52
53 void calc() override;
54 void setNpadIdUpdateNum(u32);
55 void setSupportedNpadStyleSet(nn::hid::NpadStyleSet);
56 void setNpadJoyHoldType(nn::hid::NpadJoyHoldType);
57 nn::hid::NpadJoyAssignmentMode getNpadJoyAssignment(s32);
58 void setNpadJoyAssignmentModeSingle(s32);
59 void setNpadJoyAssignmentModeSingle(s32, nn::hid::NpadJoyDeviceType);
60 void setNpadJoyAssignmentModeDual(s32);
61 void mergeSingleJoyAsDualJoy(s32, s32);
62 void swapNpadAssignment(s32, s32);
63 void disconnectNpad(s32);
64 void sendVibrationValue(s32, s32, const nn::hid::VibrationValue&);
65
66 const NpadState& getNpadState(s32 idx) { return mNpadStates[idx]; }
67
68private:
69 u32 mNpadIdUpdateNum;
70 nn::hid::NpadJoyHoldType mNpadJoyHoldType;
71 SafeArray<nn::hid::NpadStyleTag, 9> mNpadStyleTags;
72 SafeArray<NpadState, 9> mNpadStates;
73 VibrationThread mVibrationThread;
74};
75
76} // namespace sead
77