# HG changeset patch # User John Tsiombikas # Date 1409540371 -10800 # Node ID a1784a4290c2e3a93132523c58349ce832ec00c5 # Parent be91b72ce3f9d82fe45d6c9d76395b25ef04e31c client-side networking diff -r be91b72ce3f9 -r a1784a4290c2 src/inpclient.cc --- a/src/inpclient.cc Sat Aug 30 21:46:37 2014 +0300 +++ b/src/inpclient.cc Mon Sep 01 05:59:31 2014 +0300 @@ -12,6 +12,7 @@ #include "proto.h" static int discover(struct sockaddr_in *srv_sa); +static int send_request(int s, struct message *msg, long timeout); static int opt_dport = DEF_PORT; /* discover broadcast port */ static long opt_timeout = 5000; /* 10 sec discovery timeout */ @@ -38,16 +39,46 @@ memset(&msg, 0, sizeof msg); msg.magic = MAGIC; - msg.type = START; - - if(send(sock, &msg, sizeof msg, 0) == -1) { - perror("failed to send start command"); - } - return 0; + msg.type = REQ_START; + return send_request(sock, &msg, opt_timeout); } int netinp_stop() { + struct message msg; + + if(sock == -1) { + return -1; + } + + memset(&msg, 0, sizeof msg); + msg.magic = MAGIC; + msg.type = REQ_STOP; + return send_request(sock, &msg, opt_timeout); +} + +int netinp_read(float *pos) +{ + struct message msg; + + if(sock == -1) { + return -1; + } + + if(recv(sock, &msg, sizeof msg, 0) == -1) { + perror("netinp_read failed"); + return -1; + } + + pos[0] = ((float*)msg.data)[0]; + pos[1] = ((float*)msg.data)[1]; + pos[2] = ((float*)msg.data)[3]; + return 0; +} + +int netinp_reset() +{ + return -1; // TODO } static int discover(struct sockaddr_in *srv_sa) @@ -123,12 +154,43 @@ return -1; } -static int send_request(int s, struct message *msg, unsigned int timeout) +static int send_request(int s, struct message *msg, long timeout) { - if(send(s, msg, sizeof *msg, 0) == -1) { - perror("failed to send message"); - return -1; - } + fd_set rdset; + struct timeval tv, tv0, tv_timeout; + struct message resp; - // TODO cont. + do { + if(send(s, msg, sizeof *msg, 0) == -1) { + perror("failed to send message"); + return -1; + } + + tv_timeout.tv_sec = timeout / 1000; + tv_timeout.tv_usec = (timeout % 1000) * 1000; + + FD_ZERO(&rdset); + FD_SET(s, &rdset); + + gettimeofday(&tv0, 0); + while(select(s + 1, &rdset, 0, 0, &tv_timeout) == -1 && errno == EINTR); + gettimeofday(&tv, 0); + + if(FD_ISSET(s, &rdset)) { + if(recv(s, &resp, sizeof resp, 0) == -1) { + perror("failed to recieve message"); + return -1; + } + if(resp.magic != MAGIC) { + fprintf(stderr, "got invalid response\n"); + return -1; + } + memcpy(msg, &resp, sizeof resp); + return 0; + } + + timeout -= (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000; + } while(timeout > 0); + + return -1; }