# HG changeset patch # User Michiel Broek # Date 1400514544 -7200 # Node ID f37d739406992602c1093174987853bd0efa22b3 # Parent 24e731bb2e08c8173ca97c8a403f022bfc8184e3 Server communication works diff -r 24e731bb2e08 -r f37d73940699 thermferm/server.c --- a/thermferm/server.c Sun May 18 22:56:43 2014 +0200 +++ b/thermferm/server.c Mon May 19 17:49:04 2014 +0200 @@ -44,75 +44,6 @@ #define SS_TIMEOUT 300 -char *exe_cmd(char *); - - -char *exe_cmd(char *cmd) -{ - static char obuf[1024]; - int i; - - if (strncmp(cmd, "lcd", 3) == 0) { - for (i = 0; i < 20; i++) { - obuf[i] = lcdbuf[lcdHandle][i][0]; - obuf[i+20] = lcdbuf[lcdHandle][i][1]; - obuf[i+40] = lcdbuf[lcdHandle][i][2]; - obuf[i+60] = lcdbuf[lcdHandle][i][3]; - } - obuf[80] = '\0'; - return obuf; - } - - return (char *)"ERROR"; -} - - - -int server_init(void) -{ - int optval = 1; - - memset((char *)&myaddr_in, 0, sizeof(struct sockaddr_in)); - memset((char *)&peeraddr_in, 0, sizeof(struct sockaddr_in)); - myaddr_in.sin_family = AF_INET; - myaddr_in.sin_addr.s_addr = INADDR_ANY; - myaddr_in.sin_port = htons(Config.my_port); - - ls = socket(AF_INET, SOCK_STREAM, 0); - if (ls == -1) { - syslog(LOG_NOTICE, "Can't create listen socket: %s", strerror(errno)); - fprintf(stderr, "Can't create listen socket: %s\n", strerror(errno)); - return 1; - } - - if (setsockopt(ls, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) == -1) { - syslog(LOG_NOTICE, "Can't setsockopt SO_KEEPALIVE socket: %s", strerror(errno)); - close(ls); - return 1; - } - - if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) { - syslog(LOG_NOTICE, "Can't setsockopt SO_REUSEADDR socket: %s", strerror(errno)); - close(ls); - return 1; - } - - if (bind(ls, (struct sockaddr *)&myaddr_in, sizeof(struct sockaddr_in)) == -1) { - syslog(LOG_NOTICE, "Can't bind to listen socket: %s", strerror(errno)); - close(ls); - return 1; - } - - syslog(LOG_NOTICE, "listen socket created %d", ls); - if (debug) - fprintf(stdout, "listen socket created %d\n", ls); - - - return 0; -} - - - /* * Send message to client */ @@ -128,6 +59,8 @@ vsnprintf(out, SS_BUFSIZE-1, format, va_ptr); va_end(va_ptr); + syslog(LOG_NOTICE, "send: \"%s\"", out); + if (send(s, out, strlen(out), 0) != strlen(out)) { syslog(LOG_NOTICE, "srv_send failed"); return -1; @@ -138,7 +71,6 @@ return -1; } - syslog(LOG_NOTICE, "send: \"%s\"", out); return 0; } @@ -155,7 +87,7 @@ void cmd_server(void) { - char *hostname, buf[SS_BUFSIZE]; + char *hostname, buf[SS_BUFSIZE], obuf[SS_BUFSIZE]; int i, rc, rlen, timer; socklen_t fromlen; struct pollfd pfd[1]; @@ -183,6 +115,8 @@ clients++; syslog(LOG_NOTICE, "Start new client connection (%d) from %s port %u", clients, hostname, ntohs(peeraddr_in.sin_port)); + if (debug) + fprintf(stdout, "Start new client connection (%d) from %s port %u\n", clients, hostname, ntohs(peeraddr_in.sin_port)); timer = SS_TIMEOUT * 4; /* @@ -223,9 +157,30 @@ syslog(LOG_NOTICE, "recv: \"%s\"", buf); /* - * Process command from the client + * Process commands from the client */ - srv_send(exe_cmd(buf)); + if (strncmp(buf, "ack", 3) == 0) { + srv_send((char *)"ack"); + } else if (strncmp(buf, "lcd", 3) == 0) { + for (i = 0; i < 20; i++) { + obuf[i] = lcdbuf[lcdHandle][i][0]; + obuf[i+21] = lcdbuf[lcdHandle][i][1]; + obuf[i+42] = lcdbuf[lcdHandle][i][2]; + obuf[i+63] = lcdbuf[lcdHandle][i][3]; + } + obuf[20] = obuf[41] = obuf[62] = ','; + obuf[83] = '\0'; + srv_send(obuf); + } else if (strncmp(buf, "getMode", 7) == 0) { + srv_send("b"); + } else if (strncmp(buf, "getControlSettings", 18) == 0) { + srv_send("mode='b', beerSet=20.0, fridgeSet=20.0, heatEstimator=0.2, coolEstimator=5"); + } else { + if (debug) + fprintf(stdout, "unknown command \"%s\"\n", buf); + srv_send((char *)"ERR"); + } + break; } } } else { @@ -247,6 +202,13 @@ } } } + + if (clients) + clients--; + syslog(LOG_NOTICE, "End connection from %s port %u", hostname, ntohs(peeraddr_in.sin_port)); + if (debug) + fprintf(stdout, "End connection from %s port %u\n", hostname, ntohs(peeraddr_in.sin_port)); + close(s); } @@ -254,11 +216,54 @@ PI_THREAD (my_server_loop) { socklen_t addrlen; + int optval = 1; syslog(LOG_NOTICE, "Thread my_server_loop started"); if (debug) fprintf(stdout, "Thread my_server_loop started\n"); + memset((char *)&myaddr_in, 0, sizeof(struct sockaddr_in)); + memset((char *)&peeraddr_in, 0, sizeof(struct sockaddr_in)); + myaddr_in.sin_family = AF_INET; + myaddr_in.sin_addr.s_addr = INADDR_ANY; + myaddr_in.sin_port = htons(Config.my_port); + + ls = socket(AF_INET, SOCK_STREAM, 0); + if (ls == -1) { + syslog(LOG_NOTICE, "Can't create listen socket: %s", strerror(errno)); + fprintf(stderr, "Can't create listen socket: %s\n", strerror(errno)); + return 0; + } + + if (setsockopt(ls, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) == -1) { + syslog(LOG_NOTICE, "Can't setsockopt SO_KEEPALIVE socket: %s", strerror(errno)); + close(ls); + return 0; + } + + if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) { + syslog(LOG_NOTICE, "Can't setsockopt SO_REUSEADDR socket: %s", strerror(errno)); + close(ls); + return NULL; + } + + if (bind(ls, (struct sockaddr *)&myaddr_in, sizeof(struct sockaddr_in)) == -1) { + syslog(LOG_NOTICE, "Can't bind to listen socket: %s", strerror(errno)); + close(ls); + return NULL; + } + + if (listen(ls, 5) == -1) { + syslog(LOG_NOTICE, "Can't listen on listen socket: %s", strerror(errno)); + close(ls); + return NULL; + } + + syslog(LOG_NOTICE, "listen socket created %d", ls); + if (debug) + fprintf(stdout, "listen socket created %d\n", ls); + + /* * Loop forever until the external shutdown variable is set. */ @@ -276,14 +281,14 @@ syslog(LOG_NOTICE, "my_server_loop accept failed %s", strerror(errno)); if (debug) fprintf(stdout, "my_server_loop accept failed %s\n", strerror(errno)); - return 1; + return 0; } switch (fork()) { case -1: /* * Can't fork, just continue. */ - return 1; + return 0; case 0: /* * Child process, the commandline server. */ diff -r 24e731bb2e08 -r f37d73940699 thermferm/server.h --- a/thermferm/server.h Sun May 18 22:56:43 2014 +0200 +++ b/thermferm/server.h Mon May 19 17:49:04 2014 +0200 @@ -2,7 +2,6 @@ #define MY_SERVER_H -int server_init(void); PI_THREAD (my_server_loop); #endif diff -r 24e731bb2e08 -r f37d73940699 thermferm/thermferm.c --- a/thermferm/thermferm.c Sun May 18 22:56:43 2014 +0200 +++ b/thermferm/thermferm.c Mon May 19 17:49:04 2014 +0200 @@ -156,9 +156,6 @@ if (wiringPiSetup () ) return 1; - if (server_init() ) - return 1; - if ((rc = initLCD (16, 2))) { fprintf(stderr, "Cannot initialize LCD display, rc=%d\n", rc); return 1;