diff --git a/src/frontend/qt_sdl/IPC.cpp b/src/frontend/qt_sdl/IPC.cpp index 02db7194..05c7f82e 100644 --- a/src/frontend/qt_sdl/IPC.cpp +++ b/src/frontend/qt_sdl/IPC.cpp @@ -22,6 +22,14 @@ #include #include "IPC.h" +#include "Config.h" +//#include "Input.h" + + +namespace Input +{ +void ExtHotkeyPress(int id); +} namespace IPC @@ -79,6 +87,15 @@ void Init() Buffer->lock(); u8* data = (u8*)Buffer->data(); BufferHeader* header = (BufferHeader*)&data[0]; + + if (header->NumInstances == 0) + { + // initialize the FIFO + header->CommandWriteOffset = kCommandStart; + } + + CommandReadOffset = header->CommandWriteOffset; + u16 mask = header->InstanceBitmask; for (int i = 0; i < 16; i++) { @@ -166,4 +183,85 @@ void FIFOWrite(void* buf, int len) header->CommandWriteOffset = offset; } +void Process() +{ + Buffer->lock(); + u8* data = (u8*)Buffer->data(); + BufferHeader* header = (BufferHeader*)&data[0]; + + // check if we got new commands + while (CommandReadOffset != header->CommandWriteOffset) + { + CommandHeader cmdheader; + u8 cmddata[kMaxCommandSize]; + + FIFORead(&cmdheader, sizeof(cmdheader)); + + if ((cmdheader.Magic != 0x4D434C4D) || (cmdheader.Length > kMaxCommandSize)) + { + printf("IPC: !!! COMMAND BUFFER IS FUCKED. RESETTING\n"); + CommandReadOffset = header->CommandWriteOffset; + Buffer->unlock(); + return; + } + + if (cmdheader.Length) + FIFORead(cmddata, cmdheader.Length); + + if (!(cmdheader.Recipients & (1<unlock(); +} + +bool SendCommand(u16 recipients, u16 command, u16 len, void* cmddata) +{ + Buffer->lock(); + u8* data = (u8*)Buffer->data(); + BufferHeader* header = (BufferHeader*)&data[0]; + + recipients &= header->InstanceBitmask; + recipients &= ~(1<unlock(); + return false; + } + + if (len && cmddata==nullptr) + { + printf("IPC: ????? sending command with NULL buffer\n"); + Buffer->unlock(); + return false; + } + if (len > kMaxCommandSize) + { + printf("IPC: command too long\n"); + Buffer->unlock(); + return false; + } + + CommandHeader cmdheader; + cmdheader.Magic = 0x4D434C4D; + cmdheader.SenderID = InstanceID; + cmdheader.Recipients = recipients; + cmdheader.Command = command; + cmdheader.Length = len; + FIFOWrite(&cmdheader, sizeof(cmdheader)); + if (len) + FIFOWrite(cmddata, len); + + Buffer->unlock(); + return true; +} + } diff --git a/src/frontend/qt_sdl/IPC.h b/src/frontend/qt_sdl/IPC.h index bd71fd70..80546ec1 100644 --- a/src/frontend/qt_sdl/IPC.h +++ b/src/frontend/qt_sdl/IPC.h @@ -24,11 +24,20 @@ namespace IPC { +enum +{ + Cmd_Pause = 1, +}; + extern int InstanceID; void Init(); void DeInit(); +void Process(); + +bool SendCommand(u16 recipients, u16 command, u16 len, void* data); + } #endif // IPC_H diff --git a/src/frontend/qt_sdl/Input.cpp b/src/frontend/qt_sdl/Input.cpp index c1ef87c9..e0701087 100644 --- a/src/frontend/qt_sdl/Input.cpp +++ b/src/frontend/qt_sdl/Input.cpp @@ -30,7 +30,7 @@ int JoystickID; SDL_Joystick* Joystick = nullptr; u32 KeyInputMask, JoyInputMask; -u32 KeyHotkeyMask, JoyHotkeyMask; +u32 KeyHotkeyMask, JoyHotkeyMask, ExtHotkeyMask; u32 HotkeyMask, LastHotkeyMask; u32 HotkeyPress, HotkeyRelease; @@ -45,6 +45,7 @@ void Init() KeyHotkeyMask = 0; JoyHotkeyMask = 0; + ExtHotkeyMask = 0; HotkeyMask = 0; LastHotkeyMask = 0; } @@ -184,6 +185,11 @@ bool JoystickButtonDown(int val) return false; } +void ExtHotkeyPress(int id) +{ + ExtHotkeyMask |= (1<