mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-06-05 09:52:31 +00:00
[HID] Implement events
This commit is contained in:
parent
5465eb31c1
commit
6419098851
7 changed files with 34 additions and 15 deletions
|
@ -41,12 +41,6 @@ namespace KernelHandles {
|
||||||
|
|
||||||
MinSharedMemHandle = GSPSharedMemHandle,
|
MinSharedMemHandle = GSPSharedMemHandle,
|
||||||
MaxSharedMemHandle = HIDSharedMemHandle,
|
MaxSharedMemHandle = HIDSharedMemHandle,
|
||||||
|
|
||||||
HIDEvent0,
|
|
||||||
HIDEvent1,
|
|
||||||
HIDEvent2,
|
|
||||||
HIDEvent3,
|
|
||||||
HIDEvent4
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Returns whether "handle" belongs to one of the OS services
|
// Returns whether "handle" belongs to one of the OS services
|
||||||
|
|
|
@ -198,4 +198,5 @@ public:
|
||||||
|
|
||||||
void sendGPUInterrupt(GPUInterrupt type) { serviceManager.requestGPUInterrupt(type); }
|
void sendGPUInterrupt(GPUInterrupt type) { serviceManager.requestGPUInterrupt(type); }
|
||||||
void signalDSPEvents() { serviceManager.signalDSPEvents(); }
|
void signalDSPEvents() { serviceManager.signalDSPEvents(); }
|
||||||
|
void updateInputs() { serviceManager.updateInputs(); }
|
||||||
};
|
};
|
|
@ -1,17 +1,26 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <array>
|
||||||
|
#include <optional>
|
||||||
#include "helpers.hpp"
|
#include "helpers.hpp"
|
||||||
#include "kernel_types.hpp"
|
#include "kernel_types.hpp"
|
||||||
#include "logger.hpp"
|
#include "logger.hpp"
|
||||||
#include "memory.hpp"
|
#include "memory.hpp"
|
||||||
|
|
||||||
|
// Circular dependency because we need HID to spawn events
|
||||||
|
class Kernel;
|
||||||
|
|
||||||
class HIDService {
|
class HIDService {
|
||||||
Handle handle = KernelHandles::HID;
|
Handle handle = KernelHandles::HID;
|
||||||
Memory& mem;
|
Memory& mem;
|
||||||
|
Kernel& kernel;
|
||||||
u8* sharedMem = nullptr; // Pointer to HID shared memory
|
u8* sharedMem = nullptr; // Pointer to HID shared memory
|
||||||
|
|
||||||
bool accelerometerEnabled;
|
bool accelerometerEnabled;
|
||||||
|
bool eventsInitialized;
|
||||||
bool gyroEnabled;
|
bool gyroEnabled;
|
||||||
|
|
||||||
|
std::array<std::optional<Handle>, 5> events;
|
||||||
|
|
||||||
MAKE_LOG_FUNCTION(log, hidLogger)
|
MAKE_LOG_FUNCTION(log, hidLogger)
|
||||||
|
|
||||||
// Service commands
|
// Service commands
|
||||||
|
@ -22,9 +31,10 @@ class HIDService {
|
||||||
void getIPCHandles(u32 messagePointer);
|
void getIPCHandles(u32 messagePointer);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HIDService(Memory& mem) : mem(mem) {}
|
HIDService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {}
|
||||||
void reset();
|
void reset();
|
||||||
void handleSyncRequest(u32 messagePointer);
|
void handleSyncRequest(u32 messagePointer);
|
||||||
|
void updateInputs();
|
||||||
|
|
||||||
void setSharedMem(u8* ptr) {
|
void setSharedMem(u8* ptr) {
|
||||||
sharedMem = ptr;
|
sharedMem = ptr;
|
||||||
|
|
|
@ -82,4 +82,5 @@ public:
|
||||||
void setHIDSharedMem(u8* ptr) { hid.setSharedMem(ptr); }
|
void setHIDSharedMem(u8* ptr) { hid.setSharedMem(ptr); }
|
||||||
|
|
||||||
void signalDSPEvents() { dsp.signalEvents(); }
|
void signalDSPEvents() { dsp.signalEvents(); }
|
||||||
|
void updateInputs() { hid.updateInputs(); }
|
||||||
};
|
};
|
|
@ -1,5 +1,6 @@
|
||||||
#include "services/hid.hpp"
|
#include "services/hid.hpp"
|
||||||
#include "ipc.hpp"
|
#include "ipc.hpp"
|
||||||
|
#include "kernel.hpp"
|
||||||
#include <bit>
|
#include <bit>
|
||||||
|
|
||||||
namespace HIDCommands {
|
namespace HIDCommands {
|
||||||
|
@ -80,15 +81,23 @@ void HIDService::getGyroscopeCoefficient(u32 messagePointer) {
|
||||||
|
|
||||||
void HIDService::getIPCHandles(u32 messagePointer) {
|
void HIDService::getIPCHandles(u32 messagePointer) {
|
||||||
log("HID::GetIPCHandles\n");
|
log("HID::GetIPCHandles\n");
|
||||||
|
|
||||||
|
// Initialize HID events
|
||||||
|
if (!eventsInitialized) {
|
||||||
|
eventsInitialized = true;
|
||||||
|
|
||||||
|
for (auto& e : events) {
|
||||||
|
e = kernel.makeEvent(ResetType::OneShot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mem.write32(messagePointer, IPC::responseHeader(0xA, 1, 7));
|
mem.write32(messagePointer, IPC::responseHeader(0xA, 1, 7));
|
||||||
mem.write32(messagePointer + 4, Result::Success); // Result code
|
mem.write32(messagePointer + 4, Result::Success); // Result code
|
||||||
mem.write32(messagePointer + 8, 0x14000000); // Translation descriptor
|
mem.write32(messagePointer + 8, 0x14000000); // Translation descriptor
|
||||||
mem.write32(messagePointer + 12, KernelHandles::HIDSharedMemHandle); // Shared memory handle
|
mem.write32(messagePointer + 12, KernelHandles::HIDSharedMemHandle); // Shared memory handle
|
||||||
|
|
||||||
// HID event handles
|
// Write HID event handles
|
||||||
mem.write32(messagePointer + 16, KernelHandles::HIDEvent0);
|
for (int i = 0; i < events.size(); i++) {
|
||||||
mem.write32(messagePointer + 20, KernelHandles::HIDEvent1);
|
mem.write32(messagePointer + 16 + sizeof(Handle) * i, events[i].value());
|
||||||
mem.write32(messagePointer + 24, KernelHandles::HIDEvent2);
|
}
|
||||||
mem.write32(messagePointer + 28, KernelHandles::HIDEvent3);
|
|
||||||
mem.write32(messagePointer + 32, KernelHandles::HIDEvent4);
|
|
||||||
}
|
}
|
|
@ -5,8 +5,9 @@
|
||||||
|
|
||||||
ServiceManager::ServiceManager(std::array<u32, 16>& regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel)
|
ServiceManager::ServiceManager(std::array<u32, 16>& regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel)
|
||||||
: regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), act(mem), apt(mem, kernel), cam(mem),
|
: regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), act(mem), apt(mem, kernel), cam(mem),
|
||||||
cecd(mem, kernel), cfg(mem), dsp(mem, kernel), hid(mem), frd(mem), fs(mem, kernel), gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem),
|
cecd(mem, kernel), cfg(mem), dsp(mem, kernel), hid(mem, kernel), frd(mem), fs(mem, kernel),
|
||||||
ldr(mem), mic(mem), nfc(mem, kernel), nim(mem), ndm(mem), ptm(mem), y2r(mem, kernel) {}
|
gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem), ldr(mem), mic(mem), nfc(mem, kernel), nim(mem), ndm(mem),
|
||||||
|
ptm(mem), y2r(mem, kernel) {}
|
||||||
|
|
||||||
static constexpr int MAX_NOTIFICATION_COUNT = 16;
|
static constexpr int MAX_NOTIFICATION_COUNT = 16;
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,9 @@ void Emulator::run() {
|
||||||
kernel.sendGPUInterrupt(GPUInterrupt::VBlank0);
|
kernel.sendGPUInterrupt(GPUInterrupt::VBlank0);
|
||||||
kernel.sendGPUInterrupt(GPUInterrupt::VBlank1);
|
kernel.sendGPUInterrupt(GPUInterrupt::VBlank1);
|
||||||
|
|
||||||
|
// Update inputs in the HID module
|
||||||
|
kernel.updateInputs();
|
||||||
|
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
if (event.type == SDL_QUIT) {
|
if (event.type == SDL_QUIT) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue