brewpanel/sockio.c

changeset 422
13502d0dda65
parent 420
644a6106d712
child 425
c51265b518ce
equal deleted inserted replaced
421:0258107a9e72 422:13502d0dda65
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));

mercurial