mirror of
https://github.com/cathery/sys-con.git
synced 2024-11-16 23:11:25 +00:00
Add linux/raspberry_pi client.
This commit is contained in:
parent
787a015d89
commit
68a36ca20e
10
network_clients/linux_or_raspberry/Makefile
Normal file
10
network_clients/linux_or_raspberry/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
SOURCES=sys-con-client.c
|
||||
OUT=sys-con-client
|
||||
|
||||
$(OUT): $(SOURCES)
|
||||
gcc -o $@ $<
|
||||
|
||||
.PHONY: clean
|
||||
|
||||
clean:
|
||||
rm $(OUT)
|
210
network_clients/linux_or_raspberry/sys-con-client.c
Normal file
210
network_clients/linux_or_raspberry/sys-con-client.c
Normal file
@ -0,0 +1,210 @@
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/joystick.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/tcp.h>
|
||||
|
||||
#define BUFFER_SIZE 7
|
||||
|
||||
static unsigned char buffer[BUFFER_SIZE] = {0};
|
||||
|
||||
struct button_map
|
||||
{
|
||||
unsigned char index;
|
||||
unsigned char position;
|
||||
};
|
||||
|
||||
enum hat_state
|
||||
{
|
||||
HAT_UP,
|
||||
HAT_UPRIGHT,
|
||||
HAT_RIGHT,
|
||||
HAT_DOWNRIGHT,
|
||||
HAT_DOWN,
|
||||
HAT_DOWNLEFT,
|
||||
HAT_LEFT,
|
||||
HAT_UPLEFT,
|
||||
HAT_UNPRESSED,
|
||||
};
|
||||
|
||||
static struct button_map buttonMaps[] =
|
||||
{
|
||||
{4, 5},
|
||||
{4, 6},
|
||||
{4, 7},
|
||||
{4, 4},
|
||||
{5, 0},
|
||||
{5, 1},
|
||||
{5, 2},
|
||||
{5, 3},
|
||||
{5, 4},
|
||||
{5, 5},
|
||||
{6, 0},
|
||||
{5, 6},
|
||||
{5, 7},
|
||||
{4, 1},
|
||||
{4, 3},
|
||||
{4, 0},
|
||||
{4, 2},
|
||||
};
|
||||
|
||||
int axisToIndexMap[] =
|
||||
{
|
||||
0,
|
||||
1,
|
||||
-1,
|
||||
2,
|
||||
3,
|
||||
};
|
||||
|
||||
int read_event(int fd, struct js_event *event)
|
||||
{
|
||||
ssize_t bytes;
|
||||
|
||||
bytes = read(fd, event, sizeof(*event));
|
||||
|
||||
if (bytes == sizeof(*event))
|
||||
return 0;
|
||||
|
||||
/* Error, could not read full event. */
|
||||
return -1;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char device[] = "/dev/input/js0";
|
||||
int js, gd, yes = 1;
|
||||
struct js_event event;
|
||||
struct sockaddr_in saddr;
|
||||
|
||||
if(argc != 3)
|
||||
{
|
||||
printf("\n Usage: %s <ip of server> <js number>\n",argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
device[13] = argv[2][0];
|
||||
|
||||
js = open(device, O_RDONLY);
|
||||
|
||||
if (js == -1)
|
||||
perror("Could not open joystick");
|
||||
|
||||
gd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (gd == -1)
|
||||
perror("Could not open socket");
|
||||
|
||||
memset(&saddr, 0, sizeof(saddr));
|
||||
|
||||
saddr.sin_family = AF_INET;
|
||||
saddr.sin_port = htons(8080);
|
||||
|
||||
if (inet_pton(AF_INET, argv[1], &saddr.sin_addr) <= 0)
|
||||
{
|
||||
printf("\n inet_pton error occured\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (connect(gd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
|
||||
{
|
||||
printf("\n Error : Connect Failed \n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (setsockopt(gd, IPPROTO_TCP, TCP_NODELAY, (void *)&yes, sizeof(yes)) < 0)
|
||||
{
|
||||
printf("\n Error : TCP NODELAY Failed \n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
|
||||
// Init axis at rest
|
||||
buffer[0] = 127;
|
||||
buffer[1] = 127;
|
||||
buffer[2] = 127;
|
||||
buffer[3] = 127;
|
||||
|
||||
/* This loop will exit if the controller is unplugged. */
|
||||
while (read_event(js, &event) == 0)
|
||||
{
|
||||
switch (event.type)
|
||||
{
|
||||
case JS_EVENT_BUTTON:
|
||||
printf("Button %u %s\n", event.number, event.value ?
|
||||
"pressed" : "released");
|
||||
|
||||
struct button_map map = buttonMaps[event.number];
|
||||
if (event.value)
|
||||
{
|
||||
buffer[map.index] |= 1 << map.position;
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer[map.index] &= ~(1 << map.position);
|
||||
}
|
||||
|
||||
write(gd, buffer, BUFFER_SIZE);
|
||||
break;
|
||||
case JS_EVENT_AXIS:
|
||||
printf("Axis %zu value %6d\n", event.number, event.value);
|
||||
|
||||
switch (event.number)
|
||||
{
|
||||
case 6:
|
||||
case 7:
|
||||
{
|
||||
int buttonNumber, buttonValue = 1;
|
||||
buttonNumber = (event.number == 6 && event.value < 0) ? 15 :
|
||||
(event.number == 6 && event.value > 0) ? 16 :
|
||||
(event.number == 7 && event.value < 0) ? 13 :
|
||||
(event.number == 7 && event.value > 0) ? 14 : -1;
|
||||
|
||||
if (buttonNumber == -1)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
struct button_map map = buttonMaps[(event.number == 7 ? 13 : 15) + i];
|
||||
buffer[map.index] &= ~(1 << map.position);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
struct button_map map = buttonMaps[buttonNumber];
|
||||
buffer[map.index] |= 1 << map.position;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0:
|
||||
case 1:
|
||||
case 3:
|
||||
case 4:
|
||||
{
|
||||
int index = axisToIndexMap[event.number];
|
||||
buffer[index] = (unsigned char)
|
||||
(((int)event.value + 32767) >> 8);
|
||||
printf("Normalized value %3d\n",
|
||||
(unsigned char)buffer[index]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
write(gd, buffer, BUFFER_SIZE);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Ignore init events. */
|
||||
printf("Weird event: %d\n", event.type);
|
||||
break;
|
||||
}
|
||||
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
close(js);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user