65 lines
1.9 KiB
C
65 lines
1.9 KiB
C
|
#include <pthread.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
#include <mgba/core/input.h>
|
||
|
|
||
|
#include <msgba/packet.h>
|
||
|
#include <msgba/core_controller.h>
|
||
|
#include <msgba/packet/key_down.h>
|
||
|
|
||
|
bool
|
||
|
msPacketKeyDownGet(const struct msPacket *packet, int clientFd, struct msClientConnectionData *const data) {
|
||
|
bool result = false;
|
||
|
struct msPacketKeyDown *keyDown = NULL;
|
||
|
int key = 0;
|
||
|
char isPressed = 0;
|
||
|
FILE *fp = fmemopen(packet->raw_data, packet->size, "r");
|
||
|
if (1 != fread(&isPressed, sizeof isPressed, 1, fp)) {
|
||
|
goto return_ms_packet_key_down_get;
|
||
|
}
|
||
|
if (1 != fread(&key, sizeof key, 1, fp)) {
|
||
|
goto return_ms_packet_key_down_get;
|
||
|
}
|
||
|
key = be32toh(key);
|
||
|
keyDown = malloc(sizeof *keyDown);
|
||
|
keyDown->isPressed = isPressed;
|
||
|
keyDown->key = key;
|
||
|
result = true;
|
||
|
return_ms_packet_key_down_get:
|
||
|
fclose(fp);
|
||
|
if (!result) {
|
||
|
return false;
|
||
|
}
|
||
|
return msPacketKeyDownHandle(packet, keyDown, data);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
msPacketKeyDownHandle(const struct msPacket *packet, struct msPacketKeyDown *keyDown,
|
||
|
struct msClientConnectionData *const data) {
|
||
|
bool result = false;
|
||
|
struct msCoreController *coreController = data->coreController;
|
||
|
if (!coreController || !coreController->threadContext.core) {
|
||
|
goto return_ms_packet_key_down_handle;
|
||
|
}
|
||
|
struct mCore *core = coreController->threadContext.core;
|
||
|
int gbaKey = 1 << mInputMapKey(&core->inputMap, 80, keyDown->key);
|
||
|
printf("Keys received %d %x\n", keyDown->key, gbaKey);
|
||
|
pthread_mutex_lock(data->mutexPressKey);
|
||
|
if (keyDown->isPressed) {
|
||
|
core->addKeys(core, gbaKey);
|
||
|
} else {
|
||
|
core->clearKeys(core, gbaKey);
|
||
|
}
|
||
|
pthread_mutex_unlock(data->mutexPressKey);
|
||
|
result = true;
|
||
|
return_ms_packet_key_down_handle:
|
||
|
msPacketKeyDownDestroy(&keyDown);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
msPacketKeyDownDestroy(struct msPacketKeyDown **keyDownPtr) {
|
||
|
free(*keyDownPtr);
|
||
|
*keyDownPtr = NULL;
|
||
|
}
|