Server communication works

Mon, 19 May 2014 17:49:04 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 19 May 2014 17:49:04 +0200
changeset 44
f37d73940699
parent 43
24e731bb2e08
child 45
053c4657105f

Server communication works

thermferm/server.c file | annotate | diff | comparison | revisions
thermferm/server.h file | annotate | diff | comparison | revisions
thermferm/thermferm.c file | annotate | diff | comparison | revisions
--- 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.
 			     */
--- 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
--- 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;

mercurial