41 #define SLCD_KEYS 0x0800 |
41 #define SLCD_KEYS 0x0800 |
42 #define SLCD_MKEYS 0x1800 |
42 #define SLCD_MKEYS 0x1800 |
43 #define SLCD_MDEV 0xe000 |
43 #define SLCD_MDEV 0xe000 |
44 |
44 |
45 |
45 |
46 int sock = -1; /* Unix datagram socket */ |
46 int sock = -1; /* Unix datagram socket */ |
47 struct sockaddr_in servaddr; /* Server socket address */ |
47 struct sockaddr_in servaddr; /* Server socket address */ |
48 |
48 uint16_t keys = SLCD_KEYS; /* Pressed keys bits */ |
49 |
49 |
50 |
50 |
51 void socket_recv(void) |
51 void socket_recv(void) |
52 { |
52 { |
53 uint16_t data; |
53 uint16_t data; |
54 struct sockaddr_in clntaddr; |
54 struct sockaddr_in clntaddr; |
55 socklen_t clntlen = sizeof(clntaddr); |
55 socklen_t clntlen = sizeof(clntaddr); |
56 ssize_t recv_len; |
56 ssize_t recv_len; |
57 int fd, my_error; |
57 int fd = 0, my_error; |
58 |
58 |
59 recv_len = recvfrom(sock, &data, sizeof(uint16_t), MSG_DONTWAIT, (struct sockaddr *)&clntaddr, &clntlen); |
59 recv_len = recvfrom(sock, &data, sizeof(uint16_t), MSG_DONTWAIT, (struct sockaddr *)&clntaddr, &clntlen); |
60 if (recv_len == sizeof(uint16_t)) { |
60 if (recv_len == sizeof(uint16_t)) { |
61 /* |
61 /* |
62 * Get device from data |
62 * Get device from data |
63 */ |
63 */ |
64 fd = data & SLCD_MDEV >> 13; |
64 fd = (data & SLCD_MDEV) >> 13; |
65 if (fd) |
65 if (fd) |
66 fprintf(stdout, "Device %d ", fd); |
66 fprintf(stdout, "Device %d ", fd); |
67 if ((data & SLCD_MCLEAR) == SLCD_CLEAR) { |
67 if ((data & SLCD_MCLEAR) == SLCD_CLEAR) { |
68 slcdClear(fd); |
68 slcdClear(fd); |
69 } else if ((data & SLCD_MHOME) == SLCD_HOME) { |
69 } else if ((data & SLCD_MHOME) == SLCD_HOME) { |
71 } else if ((data & SLCD_MDGRAM) == SLCD_DGRAM) { |
71 } else if ((data & SLCD_MDGRAM) == SLCD_DGRAM) { |
72 fprintf(stdout, "slcdPosition(%d, %d, %d)\n", fd, data & 0x001f, (data & 0x0060) >> 5); |
72 fprintf(stdout, "slcdPosition(%d, %d, %d)\n", fd, data & 0x001f, (data & 0x0060) >> 5); |
73 slcdPosition(fd, data & 0x001f, (data & 0x0060) >> 5); |
73 slcdPosition(fd, data & 0x001f, (data & 0x0060) >> 5); |
74 } else if ((data & 0xfe00) == SLCD_DATA) { |
74 } else if ((data & 0xfe00) == SLCD_DATA) { |
75 slcdPutchar(fd, data & 0x00ff); |
75 slcdPutchar(fd, data & 0x00ff); |
76 } else { |
76 } else if (data != 0x0000) { |
77 fprintf(stdout, "socket_recv got %04x\n", data); |
77 fprintf(stdout, "socket_recv got %04x\n", data); |
|
78 } |
|
79 |
|
80 /* |
|
81 * Reply with the current keys state |
|
82 */ |
|
83 if (sendto(sock, &keys, sizeof(uint16_t), MSG_DONTWAIT, (struct sockaddr *) &clntaddr, clntlen) == -1) { |
|
84 fprintf(stdout, "sendto error: %s\n", strerror(errno)); |
78 } |
85 } |
79 } else if (recv_len < 0) { |
86 } else if (recv_len < 0) { |
80 my_error = errno; |
87 my_error = errno; |
81 if (my_error != EAGAIN) { |
88 if (my_error != EAGAIN) { |
82 fprintf(stdout, "socket_recv error: %s", strerror(my_error)); |
89 fprintf(stdout, "socket_recv error: %s", strerror(my_error)); |