mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-06-03 12:27:21 +12:00
[HID] Redo service
This commit is contained in:
parent
629e00251c
commit
dea8b9ec2e
4 changed files with 109 additions and 14 deletions
|
@ -27,7 +27,7 @@ namespace HID::Keys {
|
|||
CirclePadRight = 1 << 28, // X >= 41
|
||||
CirclePadLeft = 1 << 29, // X <= -41
|
||||
CirclePadUp = 1 << 30, // Y >= 41
|
||||
CirclePadDown = 1 << 31 // Y <= -41
|
||||
CirclePadDown = 1u << 31 // Y <= -41
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -40,6 +40,16 @@ class HIDService {
|
|||
Kernel& kernel;
|
||||
u8* sharedMem = nullptr; // Pointer to HID shared memory
|
||||
|
||||
uint nextPadIndex;
|
||||
uint nextTouchscreenIndex;
|
||||
uint nextAccelerometerIndex;
|
||||
uint nextGyroIndex;
|
||||
|
||||
u32 newButtons; // The button state currently being edited
|
||||
u32 oldButtons; // The previous pad state
|
||||
|
||||
s16 circlePadX, circlePadY; // Circlepad state
|
||||
|
||||
bool accelerometerEnabled;
|
||||
bool eventsInitialized;
|
||||
bool gyroEnabled;
|
||||
|
@ -55,16 +65,50 @@ class HIDService {
|
|||
void getGyroscopeCoefficient(u32 messagePointer);
|
||||
void getIPCHandles(u32 messagePointer);
|
||||
|
||||
// Don't call these prior to initializing shared mem pls
|
||||
template <typename T>
|
||||
T readSharedMem(size_t offset) {
|
||||
return *(T*)&sharedMem[offset];
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void writeSharedMem(size_t offset, T value) {
|
||||
*(T*)&sharedMem[offset] = value;
|
||||
}
|
||||
|
||||
public:
|
||||
HIDService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {}
|
||||
void reset();
|
||||
void handleSyncRequest(u32 messagePointer);
|
||||
|
||||
void pressKey(u32 key);
|
||||
void releaseKey(u32 key);
|
||||
void setCirclepadX(u16 x);
|
||||
void setCirclepadY(u16 y);
|
||||
void updateInputs();
|
||||
void pressKey(u32 mask) { newButtons |= mask; }
|
||||
void releaseKey(u32 mask) { newButtons &= ~mask; }
|
||||
|
||||
void setCirclepadX(s16 x) {
|
||||
circlePadX = x;
|
||||
|
||||
// Turn bits 28 and 29 off in the new button state, which indicate whether the circlepad is steering left or right
|
||||
// Then, set them according to the new value of x
|
||||
newButtons &= ~0x3000'0000;
|
||||
if (x >= 41) // Pressing right
|
||||
newButtons |= 1 << 28;
|
||||
else if (x <= -41) // Pressing left
|
||||
newButtons |= 1 << 29;
|
||||
}
|
||||
|
||||
void setCirclepadY(s16 y) {
|
||||
circlePadY = y;
|
||||
|
||||
// Turn bits 30 and 31 off in the new button state, which indicate whether the circlepad is steering up or down
|
||||
// Then, set them according to the new value of y
|
||||
newButtons &= ~0xC000'0000;
|
||||
if (y >= 41) // Pressing up
|
||||
newButtons |= 1 << 30;
|
||||
else if (y <= -41) // Pressing down
|
||||
newButtons |= 1 << 31;
|
||||
}
|
||||
|
||||
void updateInputs(u64 currentTimestamp);
|
||||
|
||||
void setSharedMem(u8* ptr) {
|
||||
sharedMem = ptr;
|
||||
|
|
|
@ -89,5 +89,5 @@ public:
|
|||
void releaseKey(u32 key) { hid.releaseKey(key); }
|
||||
void setCirclepadX(u16 x) { hid.setCirclepadX(x); }
|
||||
void setCirclepadY(u16 y) { hid.setCirclepadY(y); }
|
||||
void updateInputs() { hid.updateInputs(); }
|
||||
void updateInputs(u64 currentTimestamp) { hid.updateInputs(currentTimestamp); }
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue