mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-07-04 22:32:57 +12:00
Some checks are pending
Android Build / x64 (release) (push) Waiting to run
Android Build / arm64 (release) (push) Waiting to run
HTTP Server Build / build (push) Waiting to run
Hydra Core Build / Windows (push) Waiting to run
Hydra Core Build / MacOS (push) Waiting to run
Hydra Core Build / Linux (push) Waiting to run
Hydra Core Build / Android-x64 (push) Waiting to run
Hydra Core Build / ARM-Libretro (push) Waiting to run
Linux AppImage Build / build (push) Waiting to run
Linux Build / build (push) Waiting to run
MacOS Build / MacOS-arm64 (push) Waiting to run
MacOS Build / MacOS-x86_64 (push) Waiting to run
MacOS Build / MacOS-Universal (push) Blocked by required conditions
Qt Build / Windows (push) Waiting to run
Qt Build / MacOS-arm64 (push) Waiting to run
Qt Build / MacOS-x86_64 (push) Waiting to run
Qt Build / MacOS-Universal (push) Blocked by required conditions
Qt Build / Linux (push) Waiting to run
Windows Build / build (push) Waiting to run
iOS Simulator Build / build (push) Waiting to run
53 lines
No EOL
1.4 KiB
C++
53 lines
No EOL
1.4 KiB
C++
#pragma once
|
|
#include "bitfield.hpp"
|
|
#include "services/ir/ir_device.hpp"
|
|
#include "services/ir/ir_types.hpp"
|
|
|
|
namespace IR {
|
|
class CirclePadPro : public IR::Device {
|
|
public:
|
|
struct ButtonState {
|
|
static constexpr int C_STICK_CENTER = 0x800;
|
|
|
|
union {
|
|
BitField<0, 8, u32> header;
|
|
BitField<8, 12, u32> x;
|
|
BitField<20, 12, u32> y;
|
|
} cStick;
|
|
|
|
union {
|
|
BitField<0, 5, u8> batteryLevel;
|
|
BitField<5, 1, u8> zlNotPressed;
|
|
BitField<6, 1, u8> zrNotPressed;
|
|
BitField<7, 1, u8> rNotPressed;
|
|
} buttons;
|
|
|
|
u8 unknown;
|
|
|
|
ButtonState() {
|
|
// Response header for button state reads
|
|
cStick.header = u8(CPPResponseID::PollButtons);
|
|
cStick.x = u32(CirclePadPro::ButtonState::C_STICK_CENTER);
|
|
cStick.y = u32(CirclePadPro::ButtonState::C_STICK_CENTER);
|
|
|
|
// Fully charged
|
|
buttons.batteryLevel = 0x1F;
|
|
buttons.zrNotPressed = 1;
|
|
buttons.zlNotPressed = 1;
|
|
buttons.rNotPressed = 1;
|
|
unknown = 0;
|
|
}
|
|
};
|
|
static_assert(sizeof(ButtonState) == 6, "Circlepad Pro button state has wrong size");
|
|
|
|
virtual void connect() override;
|
|
virtual void disconnect() override;
|
|
virtual void receivePayload(Payload payload) override;
|
|
|
|
CirclePadPro(SendCallback sendCallback, Scheduler& scheduler) : IR::Device(sendCallback, scheduler) {}
|
|
|
|
ButtonState state;
|
|
// The current polling period in cycles, configured via the ConfigurePolling command
|
|
s64 period = Scheduler::nsToCycles(16000);
|
|
};
|
|
} // namespace IR
|