msgba/src/packet/key_down.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;
}