1#include "controller/seadController.h"
2
3#include "controller/seadControllerAddon.h"
4#include "controller/seadControllerDefine.h"
5#include "controller/seadControllerMgr.h"
6#include "controller/seadControllerWrapperBase.h"
7
8namespace sead
9{
10Controller::Controller(ControllerMgr* mgr)
11 : ControllerBase(cPadIdx_Max, cPadIdx_LeftStickUp, cPadIdx_RightStickUp, cPadIdx_Touch),
12 mId(ControllerDefine::cController_Null), mMgr(mgr)
13{
14 mAddons.initOffset(offsetof(ControllerAddon, mListNode));
15 mWrappers.initOffset(offsetof(ControllerWrapperBase, mListNode));
16}
17
18Controller::~Controller() = default;
19
20void Controller::calc()
21{
22 u32 prev_hold = getHoldMask();
23 bool prev_pointer_on = isPointerOn();
24
25 calcImpl_();
26
27 updateDerivativeParams_(prev_hold, prev_pointer_on);
28
29 bool is_idle = true;
30
31 for (auto it = mAddons.begin(); it != mAddons.end(); ++it)
32 {
33 if (it->calc())
34 is_idle = false;
35 }
36
37 if (is_idle && isIdle_())
38 mIdleFrame++;
39 else
40 mIdleFrame = 0;
41
42 for (auto it = mWrappers.begin(); it != mWrappers.end(); ++it)
43 it->calc(prev_hold, prev_pointer_on);
44}
45
46bool Controller::isConnected() const
47{
48 return true;
49}
50
51ControllerAddon* Controller::getAddon(ControllerDefine::AddonId id) const
52{
53 return getAddonByOrder(id, index: 0);
54}
55ControllerAddon* Controller::getAddonByOrder(ControllerDefine::AddonId id, int index) const
56{
57 for (auto& addon : mAddons)
58 {
59 if (addon.mId == id)
60 {
61 if (index == 0)
62 return &addon;
63 index--;
64 }
65 }
66
67 return nullptr;
68}
69
70bool Controller::isIdle_()
71{
72 return isIdleBase_();
73}
74
75void Controller::setIdle_()
76{
77 setIdleBase_();
78
79 for (auto it = mWrappers.begin(); it != mWrappers.end(); ++it)
80 it->setIdle();
81}
82
83} // namespace sead
84