[HID] Redo service

This commit is contained in:
wheremyfoodat 2023-06-06 00:57:48 +03:00
parent 629e00251c
commit dea8b9ec2e
4 changed files with 109 additions and 14 deletions

View file

@ -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;

View file

@ -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); }
};