mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 19:20:35 +00:00
Merge pull request #3276 from sronsse/fixes_for_team
Net RetroPad core updates
This commit is contained in:
commit
0d7571a43d
@ -38,6 +38,35 @@
|
||||
|
||||
#include "remotepad.h"
|
||||
|
||||
#define DESC_NUM_PORTS(desc) ((desc)->port_max - (desc)->port_min + 1)
|
||||
#define DESC_NUM_INDICES(desc) ((desc)->index_max - (desc)->index_min + 1)
|
||||
#define DESC_NUM_IDS(desc) ((desc)->id_max - (desc)->id_min + 1)
|
||||
|
||||
#define DESC_OFFSET(desc, port, index, id) ( \
|
||||
port * ((desc)->index_max - (desc)->index_min + 1) * ((desc)->id_max - (desc)->id_min + 1) + \
|
||||
index * ((desc)->id_max - (desc)->id_min + 1) + \
|
||||
id \
|
||||
)
|
||||
|
||||
struct descriptor {
|
||||
int device;
|
||||
int port_min;
|
||||
int port_max;
|
||||
int index_min;
|
||||
int index_max;
|
||||
int id_min;
|
||||
int id_max;
|
||||
uint16_t *value;
|
||||
};
|
||||
|
||||
struct message {
|
||||
int port;
|
||||
int device;
|
||||
int index;
|
||||
int id;
|
||||
uint16_t state;
|
||||
};
|
||||
|
||||
static int s;
|
||||
static int port;
|
||||
static char server[64];
|
||||
@ -55,8 +84,26 @@ static retro_input_state_t NETRETROPAD_CORE_PREFIX(input_state_cb);
|
||||
|
||||
static uint16_t *frame_buf;
|
||||
|
||||
static struct descriptor joypad = {
|
||||
.device = RETRO_DEVICE_JOYPAD,
|
||||
.port_min = 0,
|
||||
.port_max = 0,
|
||||
.index_min = 0,
|
||||
.index_max = 0,
|
||||
.id_min = RETRO_DEVICE_ID_JOYPAD_B,
|
||||
.id_max = RETRO_DEVICE_ID_JOYPAD_R3
|
||||
};
|
||||
|
||||
static struct descriptor *descriptors[] = {
|
||||
&joypad
|
||||
};
|
||||
|
||||
void NETRETROPAD_CORE_PREFIX(retro_init)(void)
|
||||
{
|
||||
struct descriptor *desc;
|
||||
int size;
|
||||
int i;
|
||||
|
||||
frame_buf = (uint16_t*)calloc(320 * 240, sizeof(uint16_t));
|
||||
|
||||
if (frame_buf)
|
||||
@ -81,15 +128,30 @@ void NETRETROPAD_CORE_PREFIX(retro_init)(void)
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate descriptor values */
|
||||
for (i = 0; i < ARRAY_SIZE(descriptors); i++) {
|
||||
desc = descriptors[i];
|
||||
size = DESC_NUM_PORTS(desc) * DESC_NUM_INDICES(desc) * DESC_NUM_IDS(desc);
|
||||
descriptors[i]->value = calloc(size, sizeof(uint16_t));
|
||||
}
|
||||
|
||||
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "Initialising sockets...\n");
|
||||
network_init();
|
||||
}
|
||||
|
||||
void NETRETROPAD_CORE_PREFIX(retro_deinit)(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (frame_buf)
|
||||
free(frame_buf);
|
||||
frame_buf = NULL;
|
||||
|
||||
/* Free descriptor values */
|
||||
for (i = 0; i < ARRAY_SIZE(descriptors); i++) {
|
||||
free(descriptors[i]->value);
|
||||
descriptors[i]->value = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned NETRETROPAD_CORE_PREFIX(retro_api_version)(void)
|
||||
@ -127,46 +189,60 @@ void NETRETROPAD_CORE_PREFIX(retro_get_system_av_info)(
|
||||
info->geometry.aspect_ratio = 4.0 / 3.0;
|
||||
}
|
||||
|
||||
|
||||
static unsigned retropad_update_input(void)
|
||||
static void retropad_update_input(void)
|
||||
{
|
||||
unsigned value = 0;
|
||||
struct descriptor *desc;
|
||||
struct message msg;
|
||||
uint16_t state;
|
||||
uint16_t old;
|
||||
int offset;
|
||||
int port;
|
||||
int index;
|
||||
int id;
|
||||
int i;
|
||||
|
||||
/* Poll input */
|
||||
NETRETROPAD_CORE_PREFIX(input_poll_cb)();
|
||||
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B))
|
||||
value += 1;
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y))
|
||||
value += 2;
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT))
|
||||
value += pow(2, 2);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START))
|
||||
value += pow(2, 3);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP))
|
||||
value += pow(2, 4);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN))
|
||||
value += pow(2, 5);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT))
|
||||
value += pow(2, 6);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT))
|
||||
value += pow(2, 7);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A))
|
||||
value += pow(2, 8);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X))
|
||||
value += pow(2, 9);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L))
|
||||
value += pow(2, 10);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R))
|
||||
value += pow(2, 11);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2))
|
||||
value += pow(2, 12);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2))
|
||||
value += pow(2, 13);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3))
|
||||
value += pow(2, 14);
|
||||
if (NETRETROPAD_CORE_PREFIX(input_state_cb)(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R3))
|
||||
value += pow(2, 15);
|
||||
/* Parse descriptors */
|
||||
for (i = 0; i < ARRAY_SIZE(descriptors); i++) {
|
||||
/* Get current descriptor */
|
||||
desc = descriptors[i];
|
||||
|
||||
return value;
|
||||
/* Go through range of ports/indices/IDs */
|
||||
for (port = desc->port_min; port <= desc->port_max; port++)
|
||||
for (index = desc->index_min; index <= desc->index_max; index++)
|
||||
for (id = desc->id_min; id <= desc->id_max; id++) {
|
||||
/* Compute offset into array */
|
||||
offset = DESC_OFFSET(desc, port, index, id);
|
||||
|
||||
/* Get old state */
|
||||
old = desc->value[offset];
|
||||
|
||||
/* Get new state */
|
||||
state = NETRETROPAD_CORE_PREFIX(input_state_cb)(
|
||||
port,
|
||||
desc->device,
|
||||
index,
|
||||
id);
|
||||
|
||||
/* Continue if state is unchanged */
|
||||
if (state == old)
|
||||
continue;
|
||||
|
||||
/* Update state */
|
||||
desc->value[offset] = state;
|
||||
|
||||
/* Attempt to send updated state */
|
||||
msg.port = port;
|
||||
msg.device = desc->device;
|
||||
msg.index = index;
|
||||
msg.id = id;
|
||||
msg.state = state;
|
||||
if (sendto(s, &msg, sizeof(msg), 0, (struct sockaddr *)&si_other, sizeof(si_other)) == -1)
|
||||
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "Error sending data!\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void NETRETROPAD_CORE_PREFIX(retro_set_environment)(retro_environment_t cb)
|
||||
@ -246,16 +322,18 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void)
|
||||
{
|
||||
unsigned rle, runs;
|
||||
uint16_t *pixel = NULL;
|
||||
char message[64] = {0};
|
||||
unsigned input_state = retropad_update_input();
|
||||
unsigned input_state = 0;
|
||||
int offset;
|
||||
int i;
|
||||
|
||||
if (input_state > 0)
|
||||
{
|
||||
snprintf(message, sizeof(message), "%d", input_state);
|
||||
/* Update input states and send them if needed */
|
||||
retropad_update_input();
|
||||
|
||||
/* send the message */
|
||||
if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, sizeof(si_other))==-1)
|
||||
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "Error sending data\n");
|
||||
/* Combine RetroPad input states into one value */
|
||||
for (i = joypad.id_min; i < joypad.id_max; i++) {
|
||||
offset = DESC_OFFSET(&joypad, 0, 0, i);
|
||||
if (joypad.value[offset])
|
||||
input_state |= 1 << i;
|
||||
}
|
||||
|
||||
pixel = frame_buf + 49 * 320 + 32;
|
||||
|
@ -38,6 +38,14 @@
|
||||
#define DEFAULT_NETWORK_GAMEPAD_PORT 55400
|
||||
#define UDP_FRAME_PACKETS 16
|
||||
|
||||
struct message {
|
||||
int port;
|
||||
int device;
|
||||
int index;
|
||||
int id;
|
||||
uint16_t state;
|
||||
};
|
||||
|
||||
struct input_remote
|
||||
{
|
||||
|
||||
@ -151,11 +159,19 @@ void input_remote_free(input_remote_t *handle)
|
||||
}
|
||||
|
||||
#if defined(HAVE_NETWORKGAMEPAD) && defined(HAVE_NETPLAY)
|
||||
static void input_remote_parse_packet(char *buffer, unsigned size, unsigned user)
|
||||
static void input_remote_parse_packet(struct message *msg, unsigned user)
|
||||
{
|
||||
input_remote_state_t *ol_state = input_remote_get_state_ptr();
|
||||
/* todo implement parsing of input_state from the packet */
|
||||
ol_state->buttons[user] = atoi(buffer);
|
||||
|
||||
/* Parse message */
|
||||
switch (msg->device)
|
||||
{
|
||||
case RETRO_DEVICE_JOYPAD:
|
||||
ol_state->buttons[user] &= ~(1 << msg->id);
|
||||
if (msg->state)
|
||||
ol_state->buttons[user] |= 1 << msg->id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -213,7 +229,7 @@ void input_remote_poll(input_remote_t *handle)
|
||||
if (settings->network_remote_enable_user[user])
|
||||
{
|
||||
#if defined(HAVE_NETWORKGAMEPAD) && defined(HAVE_NETPLAY)
|
||||
char buf[8];
|
||||
struct message msg;
|
||||
ssize_t ret;
|
||||
fd_set fds;
|
||||
|
||||
@ -223,12 +239,12 @@ void input_remote_poll(input_remote_t *handle)
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(handle->net_fd[user], &fds);
|
||||
|
||||
ret = recvfrom(handle->net_fd[user], buf,
|
||||
sizeof(buf) - 1, 0, NULL, NULL);
|
||||
ret = recvfrom(handle->net_fd[user], &msg,
|
||||
sizeof(msg), 0, NULL, NULL);
|
||||
|
||||
if (ret > 0)
|
||||
input_remote_parse_packet(buf, sizeof(buf), user);
|
||||
else
|
||||
if (ret == sizeof(msg))
|
||||
input_remote_parse_packet(&msg, user);
|
||||
else if ((ret != -1) || (errno != EAGAIN))
|
||||
#endif
|
||||
ol_state->buttons[user] = 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user