server is mostly done
This commit is contained in:
parent
afe99fc054
commit
fd719fc1b1
7
hid.c
7
hid.c
|
@ -57,6 +57,13 @@ void setup_device(PhysicalDevice *dev) {
|
|||
dev->device_info.rel_count = 0;
|
||||
dev->device_info.key_count = 0;
|
||||
|
||||
for(int i = 0; i < ABS_CNT; i++)
|
||||
dev->mapping.abs_indices[i] = -1;
|
||||
for(int i = 0; i < REL_CNT; i++)
|
||||
dev->mapping.key_indices[i] = -1;
|
||||
for(int i = 0; i < KEY_CNT; i++)
|
||||
dev->mapping.key_indices[i] = -1;
|
||||
|
||||
uint8_t bits[EV_MAX] = {};
|
||||
uint8_t feat_bits[KEY_MAX] = {};
|
||||
ioctl(dev->event, EVIOCGBIT(0, EV_MAX), bits);
|
||||
|
|
80
net.c
80
net.c
|
@ -1,4 +1,5 @@
|
|||
#include "net.h"
|
||||
#include <stdio.h>
|
||||
|
||||
Message msg_device_info() {
|
||||
MessageDeviceInfo m;
|
||||
|
@ -17,18 +18,20 @@ int msg_deserialize(const uint8_t *buf, size_t len, Message *dst) {
|
|||
uint8_t code_byte = buf[0];
|
||||
MessageCode code = (MessageCode)code_byte;
|
||||
|
||||
uint8_t abs, rel, key;
|
||||
|
||||
switch (code) {
|
||||
case DeviceInfo:
|
||||
if (len < 3)
|
||||
return -1;
|
||||
uint8_t abs = buf[1];
|
||||
uint8_t rel = buf[2];
|
||||
uint8_t key = buf[3];
|
||||
abs = buf[1];
|
||||
rel = buf[2];
|
||||
key = buf[3];
|
||||
buf += 4;
|
||||
if (MSS_DEVICE_INFO(abs, rel, key) > len)
|
||||
return -1;
|
||||
|
||||
dst->code = code;
|
||||
dst->device_info.code = code;
|
||||
dst->device_info.abs_count = abs;
|
||||
dst->device_info.rel_count = rel;
|
||||
dst->device_info.key_count = key;
|
||||
|
@ -55,9 +58,34 @@ int msg_deserialize(const uint8_t *buf, size_t len, Message *dst) {
|
|||
|
||||
return 0;
|
||||
case DeviceReport:
|
||||
if (len < MSS_DEVICE_REPORT)
|
||||
if (len < 3)
|
||||
return -1;
|
||||
dst->code = code;
|
||||
|
||||
abs = buf[1];
|
||||
rel = buf[2];
|
||||
key = buf[3];
|
||||
buf += 4;
|
||||
if (len < MSS_DEVICE_REPORT(abs, rel, key))
|
||||
return -1;
|
||||
|
||||
dst->device_report.code = code;
|
||||
dst->device_report.abs_count = abs;
|
||||
dst->device_report.rel_count = rel;
|
||||
dst->device_report.key_count = key;
|
||||
|
||||
for (int i = 0; i < abs; i++) {
|
||||
dst->device_report.abs[i] = *(uint32_t *)buf;
|
||||
buf += 4;
|
||||
}
|
||||
|
||||
for (int i = 0; i < rel; i++) {
|
||||
dst->device_report.rel[i] = *(uint32_t *)buf;
|
||||
buf += 4;
|
||||
}
|
||||
|
||||
for (int i = 0; i < key; i++)
|
||||
dst->device_report.key[i] = *(buf++);
|
||||
|
||||
return 0;
|
||||
case DeviceDestroy:
|
||||
if (len < MSS_DEVICE_DESTROY)
|
||||
|
@ -82,18 +110,19 @@ int msg_deserialize(const uint8_t *buf, size_t len, Message *dst) {
|
|||
}
|
||||
}
|
||||
|
||||
// The indices have to match with msg_deserialize
|
||||
int msg_serialize(uint8_t *buf, size_t len, Message *msg) {
|
||||
// If len is 0 we can't serialize any message
|
||||
if (len-- == 0)
|
||||
return -1;
|
||||
|
||||
uint8_t abs, rel, key;
|
||||
|
||||
switch (msg->code) {
|
||||
case DeviceInfo:; // semicolon needed here
|
||||
uint8_t abs = msg->device_info.abs_count;
|
||||
uint8_t rel = msg->device_info.rel_count;
|
||||
uint8_t key = msg->device_info.key_count;
|
||||
if (len < MSS_DEVICE_INFO(abs, rel, len))
|
||||
case DeviceInfo:
|
||||
abs = msg->device_info.abs_count;
|
||||
rel = msg->device_info.rel_count;
|
||||
key = msg->device_info.key_count;
|
||||
if (len < MSS_DEVICE_INFO(abs, rel, key))
|
||||
return -1;
|
||||
|
||||
buf[0] = (uint8_t)msg->code;
|
||||
|
@ -123,11 +152,31 @@ int msg_serialize(uint8_t *buf, size_t len, Message *msg) {
|
|||
|
||||
return MSS_DEVICE_INFO(abs, rel, key) + 1;
|
||||
case DeviceReport:
|
||||
if (len < MSS_DEVICE_REPORT)
|
||||
abs = msg->device_report.abs_count;
|
||||
rel = msg->device_report.rel_count;
|
||||
key = msg->device_report.key_count;
|
||||
if (len < MSS_DEVICE_REPORT(abs, rel, key))
|
||||
return -1;
|
||||
|
||||
buf[0] = (uint8_t)msg->code;
|
||||
return MSS_DEVICE_REPORT + 1;
|
||||
buf[1] = abs;
|
||||
buf[2] = rel;
|
||||
buf[3] = key;
|
||||
buf += 4;
|
||||
|
||||
for (int i = 0; i < abs; i++) {
|
||||
*(uint32_t *)buf = msg->device_report.abs[i];
|
||||
buf += 4;
|
||||
}
|
||||
|
||||
for (int i = 0; i < rel; i++) {
|
||||
*(uint32_t *)buf = msg->device_report.rel[i];
|
||||
buf += 4;
|
||||
}
|
||||
|
||||
for (int i = 0; i < key; i++)
|
||||
*(buf++) = msg->device_report.key[i];
|
||||
|
||||
return MSS_DEVICE_REPORT(abs, rel, key) + 1;
|
||||
case DeviceDestroy:
|
||||
if (len < MSS_DEVICE_DESTROY)
|
||||
return -1;
|
||||
|
@ -148,6 +197,7 @@ int msg_serialize(uint8_t *buf, size_t len, Message *msg) {
|
|||
buf[7] = msg->controller_state.flash_off;
|
||||
return MSS_CONTROLLER_STATE + 1;
|
||||
default:
|
||||
printf("ERR(msg_serialize): Trying to serialize unknown message of code %d\n", msg->code);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
|
11
net.h
11
net.h
|
@ -12,6 +12,7 @@ typedef enum {
|
|||
ControllerState = 4,
|
||||
} MessageCode;
|
||||
|
||||
// TODO: replace counts by uint16_t
|
||||
typedef struct {
|
||||
MessageCode code;
|
||||
|
||||
|
@ -36,8 +37,16 @@ typedef struct {
|
|||
|
||||
typedef struct {
|
||||
MessageCode code;
|
||||
|
||||
uint8_t abs_count;
|
||||
uint8_t rel_count;
|
||||
uint8_t key_count;
|
||||
|
||||
uint32_t abs[ABS_CNT];
|
||||
uint32_t rel[REL_CNT];
|
||||
uint8_t key[KEY_CNT];
|
||||
} MessageDeviceReport;
|
||||
#define MSS_DEVICE_REPORT 0
|
||||
#define MSS_DEVICE_REPORT(abs, rel, key) (3 + abs * 4 + rel * 4 + key * 1)
|
||||
|
||||
typedef struct {
|
||||
MessageCode code;
|
||||
|
|
75
server.c
75
server.c
|
@ -47,18 +47,28 @@ void *server_handle_conn(void *args_) {
|
|||
int len = msg_serialize(buf, 2048, (Message *)&dev.device_info);
|
||||
write(args->socket, buf, len);
|
||||
|
||||
struct pollfd pfd[2] = {};
|
||||
pfd[0].fd = args->socket;
|
||||
pfd[0].events = POLLIN;
|
||||
pfd[1].fd = dev.event;
|
||||
pfd[1].events = POLLIN;
|
||||
struct pollfd pfds[2] = {};
|
||||
struct pollfd *socket_poll = &pfds[0];
|
||||
struct pollfd *event_poll = &pfds[1];
|
||||
|
||||
socket_poll->fd = args->socket;
|
||||
socket_poll->events = POLLIN;
|
||||
event_poll->fd = dev.event;
|
||||
event_poll->events = POLLIN;
|
||||
|
||||
MessageDeviceReport report = {};
|
||||
|
||||
report.code = DeviceReport;
|
||||
report.abs_count = dev.device_info.abs_count;
|
||||
report.rel_count = dev.device_info.rel_count;
|
||||
report.key_count = dev.device_info.key_count;
|
||||
|
||||
while (1) {
|
||||
int rc = poll(pfd, 1, -1);
|
||||
int rc = poll(pfds, 2, -1);
|
||||
if (rc < 0) // error (connection closed)
|
||||
goto conn_end;
|
||||
|
||||
if (pfd[0].revents & POLLIN) {
|
||||
if (socket_poll->revents & POLLIN) {
|
||||
int len = recv(args->socket, buf, 2048, 0);
|
||||
if (len <= 0)
|
||||
goto conn_end;
|
||||
|
@ -66,8 +76,8 @@ void *server_handle_conn(void *args_) {
|
|||
Message msg;
|
||||
if (msg_deserialize(buf, len, &msg) == 0) {
|
||||
|
||||
if(msg.code == ControllerState) {
|
||||
apply_controller_state(&dev, (MessageControllerState*)&msg);
|
||||
if (msg.code == ControllerState) {
|
||||
apply_controller_state(&dev, (MessageControllerState *)&msg);
|
||||
} else {
|
||||
printf("CONN(%d): Illegal message\n", args->id);
|
||||
}
|
||||
|
@ -76,8 +86,53 @@ void *server_handle_conn(void *args_) {
|
|||
printf("CONN(%d): Couldn't parse message.\n", args->id);
|
||||
}
|
||||
}
|
||||
if (pfd[1].revents & POLLIN) {
|
||||
if (event_poll->revents & POLLIN) {
|
||||
struct input_event event;
|
||||
int len = read(dev.event, &event, sizeof(struct input_event));
|
||||
if (len <= 0)
|
||||
goto conn_end;
|
||||
if (len < sizeof(struct input_event)) {
|
||||
printf("CONN(%d): error reading event\n", args->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (event.type == EV_SYN) {
|
||||
int len = msg_serialize(buf, 2048, (Message *)&report);
|
||||
|
||||
if (len < 0) {
|
||||
printf("CONN(%d): Couldn't serialize report %d\n", args->id, len);
|
||||
continue;
|
||||
};
|
||||
|
||||
write(args->socket, buf, len);
|
||||
} else if (event.type == EV_ABS) {
|
||||
int index = dev.mapping.abs_indices[event.code];
|
||||
|
||||
if (index < 0) {
|
||||
printf("CONN(%d): Invalid abs\n", args->id);
|
||||
continue;
|
||||
};
|
||||
|
||||
report.abs[index] = event.value;
|
||||
} else if (event.type == EV_REL) {
|
||||
int index = dev.mapping.rel_indices[event.code];
|
||||
|
||||
if (index < 0) {
|
||||
printf("CONN(%d): Invalid rel\n", args->id);
|
||||
continue;
|
||||
};
|
||||
|
||||
report.rel[index] = event.value;
|
||||
} else if (event.type == EV_KEY) {
|
||||
int index = dev.mapping.key_indices[event.code];
|
||||
|
||||
if (index < 0) {
|
||||
printf("CONN(%d): Invalid key\n", args->id);
|
||||
continue;
|
||||
};
|
||||
|
||||
report.key[index] = !!event.value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue