1#include "controller/seadControllerWrapper.h"
2
3#include "prim/seadMemUtil.h"
4
5namespace sead
6{
7const u8 ControllerWrapper::cPadConfigDefault[Controller::cPadIdx_Max] = {
8 Controller::cPadIdx_A,
9 Controller::cPadIdx_B,
10 Controller::cPadIdx_C,
11 Controller::cPadIdx_X,
12 Controller::cPadIdx_Y,
13 Controller::cPadIdx_Z,
14 Controller::cPadIdx_2,
15 Controller::cPadIdx_1,
16 Controller::cPadIdx_Home,
17 Controller::cPadIdx_Minus,
18 Controller::cPadIdx_Plus,
19 Controller::cPadIdx_Start,
20 Controller::cPadIdx_Select,
21 Controller::cPadIdx_L,
22 Controller::cPadIdx_R,
23 Controller::cPadIdx_Touch,
24 Controller::cPadIdx_Up,
25 Controller::cPadIdx_Down,
26 Controller::cPadIdx_Left,
27 Controller::cPadIdx_Right,
28 Controller::cPadIdx_LeftStickUp,
29 Controller::cPadIdx_LeftStickDown,
30 Controller::cPadIdx_LeftStickLeft,
31 Controller::cPadIdx_LeftStickRight,
32 Controller::cPadIdx_RightStickUp,
33 Controller::cPadIdx_RightStickDown,
34 Controller::cPadIdx_RightStickLeft,
35 Controller::cPadIdx_RightStickRight};
36
37ControllerWrapper::ControllerWrapper()
38{
39 MemUtil::copy(dest: mPadConfig, src: cPadConfigDefault, size: Controller::cPadIdx_Max);
40}
41
42void ControllerWrapper::calc(u32 prev_hold, bool prev_pointer_on)
43{
44 if (mIsEnable && mController && mController->isConnected())
45 {
46 mPadHold = BitFlag32(createPadMaskFromControllerPadMask_(controller_mask: mController->getHoldMask()));
47
48 mLeftStick = mController->getLeftStick();
49 mRightStick = mController->getRightStick();
50 mLeftAnalogTrigger = mController->getLeftAnalogTrigger();
51 mRightAnalogTrigger = mController->getRightAnalogTrigger();
52
53 bool pointer_on = mController->isPointerOn();
54
55 bool touchkey_hold = false;
56 if (mTouchKeyBit >= 0)
57 touchkey_hold = mPadHold.isOnBit(bit: mTouchKeyBit);
58
59 setPointerWithBound_(is_on: pointer_on, touchkey_hold, pos: mController->getPointer());
60 updateDerivativeParams_(prev_hold: createPadMaskFromControllerPadMask_(controller_mask: prev_hold), prev_pointer_on);
61 }
62 else
63 {
64 setIdle();
65 }
66
67 if (isIdle_())
68 mIdleFrame++;
69 else
70 mIdleFrame = 0;
71}
72
73void ControllerWrapper::setPadConfig(s32 padbit_max, const u8* pad_config,
74 bool enable_stickcross_emulation)
75{
76 if (padbit_max > 32)
77 return;
78 mPadBitMax = padbit_max;
79
80 MemUtil::copy(dest: mPadConfig, src: pad_config, size: padbit_max);
81
82 mLeftStickCrossStartBit = -1;
83 mRightStickCrossStartBit = -1;
84
85 if (enable_stickcross_emulation)
86 {
87 for (s32 i = 0; i < padbit_max; i++)
88 {
89 if (pad_config[i] == Controller::cPadIdx_LeftStickUp)
90 mLeftStickCrossStartBit = i;
91
92 else if (pad_config[i] == Controller::cPadIdx_RightStickUp)
93 mRightStickCrossStartBit = i;
94 }
95 }
96
97 mTouchKeyBit = -1;
98
99 for (s32 i = 0; i < padbit_max; i++)
100 {
101 if (pad_config[i] == Controller::cPadIdx_Touch)
102 {
103 mTouchKeyBit = i;
104 break;
105 }
106 }
107}
108
109u32 ControllerWrapper::createPadMaskFromControllerPadMask_(u32 controller_mask) const
110{
111 BitFlag32 controller_pad_mask(controller_mask);
112 BitFlag32 pad_mask;
113
114 for (int i = 0; i < mPadBitMax; i++)
115 {
116 if (controller_pad_mask.isOnBit(bit: mPadConfig[i]))
117 pad_mask.setBit(i);
118 }
119
120 return pad_mask.getDirect();
121}
122
123} // namespace sead
124