Single client server works

Thu, 22 May 2014 13:54:52 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Thu, 22 May 2014 13:54:52 +0200
changeset 48
d8c64f81b192
parent 47
e2c1f2373be0
child 49
92a9ca143677

Single client server works

thermferm/mosquitto.c file | annotate | diff | comparison | revisions
thermferm/mosquitto.h file | annotate | diff | comparison | revisions
thermferm/server.c file | annotate | diff | comparison | revisions
thermferm/thermferm.c file | annotate | diff | comparison | revisions
thermferm/thermferm.h file | annotate | diff | comparison | revisions
--- a/thermferm/mosquitto.c	Tue May 20 22:42:26 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,369 +0,0 @@
-/*****************************************************************************
- * Copyright (C) 2014
- *   
- * Michiel Broek <mbroek at mbse dot eu>
- *
- * This file is part of the mbsePi-apps
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * mbsePi-apps is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with EC-65K; see the file COPYING.  If not, write to the Free
- * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- *****************************************************************************/
-
-#include "../lib/mbselib.h"
-#include "mosquitto.h"
-
-#ifdef HAVE_WIRINGPI_H
-
-
-#define STATUS_CONNECTING 0
-#define STATUS_CONNACK_RECVD 1
-#define STATUS_WAITING 2
-
-/* Global variables for use in callbacks. */
-struct mosquitto    	*mymosq = NULL;
-char			*myhostname;
-static int		qos = 0;
-static int		status = STATUS_CONNECTING;
-static int		mid_sent = 0;
-static int		last_mid = -1;
-static int		last_mid_sent = -1;
-static bool		connected = true;
-static bool		disconnect_sent = false;
-static bool		connect_lost = false;
-
-extern bool		my_shutdown;
-extern bool		debug;
-extern sys_config	Config;
-extern int		lcdHandle;
-extern int		lcdupdate;
-
-
-void my_connect_callback(struct mosquitto *mosq, void *obj, int result)
-{
-    if (connect_lost) {
-	connect_lost = false;
-	syslog(LOG_NOTICE, "Reconnect: %s", mosquitto_connack_string(result));
-    }
-
-    if (!result) {
-	status = STATUS_CONNACK_RECVD;
-    } else {
-	syslog(LOG_NOTICE, "my_connect_callback: %s\n", mosquitto_connack_string(result));
-    }
-}
-
-
-
-void my_disconnect_callback(struct mosquitto *mosq, void *obj, int rc)
-{
-    if (my_shutdown) {
-	syslog(LOG_NOTICE, "Acknowledged DISCONNECT from %s", Config.mosq_host);
-	connected = false;
-    } else {
-	/*
-	 * The remove server was brought down. We must keep running
-	 */
-	syslog(LOG_NOTICE, "Received DISCONNECT from %s, connection lost", Config.mosq_host);
-	connect_lost = true;
-    }
-}
-
-
-
-void my_publish_callback(struct mosquitto *mosq, void *obj, int mid)
-{
-    last_mid_sent = mid;
-}
-
-
-
-void my_log_callback(struct mosquitto *mosq, void *obj, int level, const char *str)
-{
-    syslog(LOG_NOTICE, "MQTT: %s", str);
-    printf("MQTT: %s\n", str);
-}
-
-
-
-int my_mosquitto_init(void)
-{
-    char                *id = NULL, *state = NULL;
-    char                buf[1024];
-    int                 try, rc, keepalive = 60;
-    unsigned int        max_inflight = 20;
-    char                err[1024];
-    w1_therm		*tmp1, *old1;
-    rc_switch		*tmp2, *old2;
-    char		*alias;
-
-    /*
-     * Initialize mosquitto communication
-     */
-    mosquitto_lib_init();
-
-    gethostname(buf, 255);
-    myhostname = xstrcpy(buf);
-
-    /*
-     * Build MQTT id
-     */
-    id = xstrcpy((char *)"thermferm/");
-    id = xstrcat(id, myhostname);
-    if(strlen(id) > MOSQ_MQTT_ID_MAX_LENGTH) {
-	/*
-	 * Enforce maximum client id length of 23 characters
-	 */
-	id[MOSQ_MQTT_ID_MAX_LENGTH] = '\0';
-    }
-
-    mymosq = mosquitto_new(id, true, NULL);
-    if (!mymosq) {
-	switch(errno) {
-	    case ENOMEM:
-		syslog(LOG_NOTICE, "mosquitto_new: Out of memory");
-		break;
-	    case EINVAL:
-		syslog(LOG_NOTICE, "mosquitto_new: Invalid id");
-		break;
-	}
-	mosquitto_lib_cleanup();
-	return 1;
-    }
-
-    if (debug) {
-	mosquitto_log_callback_set(mymosq, my_log_callback);
-    }
-
-    /*
-     * Set our will
-     */
-    state = xstrcpy((char *)"clients/");
-    state = xstrcat(state, myhostname);
-    state = xstrcat(state, (char *)"/thermferm/state");
-    sprintf(buf, "0");
-    if ((rc = mosquitto_will_set(mymosq, state, strlen(buf), buf, qos, true))) {
-        if (rc == MOSQ_ERR_INVAL) {
-            syslog(LOG_NOTICE, "mosquitto_will_set: input parameters invalid");
-        } else if (rc == MOSQ_ERR_NOMEM) {
-            syslog(LOG_NOTICE, "mosquitto_will_set: Out of Memory");
-	} else if (rc == MOSQ_ERR_PAYLOAD_SIZE) {
-	    syslog(LOG_NOTICE, "mosquitto_will_set: invalid payload size");
-        }
-        mosquitto_lib_cleanup();
-        return rc;
-    }
-
-    mosquitto_max_inflight_messages_set(mymosq, max_inflight);
-    mosquitto_connect_callback_set(mymosq, my_connect_callback);
-    mosquitto_disconnect_callback_set(mymosq, my_disconnect_callback);
-    mosquitto_publish_callback_set(mymosq, my_publish_callback);
-
-    try = 10; rc = -1;
-    while (try && rc) {
-    	if ((rc = mosquitto_connect(mymosq, Config.mosq_host, Config.mosq_port, keepalive))) {
-	    if (rc == MOSQ_ERR_ERRNO) {
-	    	strerror_r(errno, err, 1024);
-	    	syslog(LOG_NOTICE, "mosquitto_connect: error: %s, try=%d", err, 11-try);
-	    } else {
-	    	syslog(LOG_NOTICE, "mosquitto_connect: unable to connect (%d)", rc);
-	    }
-	    sleep(2);
-	    try--;
-    	}
-    }
-    if (rc) {
-	syslog(LOG_NOTICE, "mosquitto_connect: too many tries, giving up");
-	mosquitto_lib_cleanup();
-	return rc;
-    }
-    syslog(LOG_NOTICE, "Connected with %s:%d", Config.mosq_host, Config.mosq_port);
-
-    /*
-     * Initialise is complete, report our presence state
-     */
-    mosquitto_loop_start(mymosq);
-    sprintf(buf, "1");
-    rc = mosquitto_publish(mymosq, &mid_sent, state, strlen(buf), buf, qos, 1);
-
-    /*
-     * Report alias names
-     */
-    for (tmp1 = Config.w1therms; tmp1; tmp1 = old1) {
-	old1 = tmp1->next;
-
-	alias = xstrcpy((char *)"/raw/");
-	alias = xstrcat(alias, myhostname);
-	alias = xstrcat(alias, (char *)"/thermferm/w1/");
-	alias = xstrcat(alias, tmp1->master);
-	alias = xstrcat(alias, (char *)"/");
-	alias = xstrcat(alias, tmp1->name);
-	alias = xstrcat(alias, (char *)"/alias");
-
-	sprintf(buf, "%s", tmp1->alias);
-	if ((rc = mosquitto_publish(mymosq, &mid_sent, alias, strlen(buf), buf, qos, 1))) {
-	    if (rc == MOSQ_ERR_NO_CONN)
-		mosquitto_reconnect(mymosq);
-	    else
-		syslog(LOG_NOTICE, "mainloop: error %d from mosquitto_publish", rc);
-	}
-
-	free(alias);
-	alias = NULL;
-    }
-
-    for (tmp2 = Config.rcswitch; tmp2; tmp2 = old2) {
-	old2 = tmp2->next;
-
-	alias = xstrcpy((char *)"/raw/");
-	alias = xstrcat(alias, myhostname);
-	alias = xstrcat(alias, (char *)"/thermferm/rcswitch/");
-	alias = xstrcat(alias, tmp2->address);
-	alias = xstrcat(alias, (char *)"/alias");
-
-	sprintf(buf, "%s", tmp2->alias);
-	if ((rc = mosquitto_publish(mymosq, &mid_sent, alias, strlen(buf), buf, qos, 1))) {
-	    if (rc == MOSQ_ERR_NO_CONN)
-		mosquitto_reconnect(mymosq);
-	    else
-		syslog(LOG_NOTICE, "my_mosquitto_init: error %d from mosquitto_publish", rc);
-	}
-
-	free(alias);
-	alias = NULL;
-	my_mosquitto_switch(tmp2->address, 0);
-    }
-
-    return 0;
-}
-
-
-
-int my_mosquitto_switch(char *address, int state)
-{
-    char    *cmd = NULL, buf[10];
-    int	    rc;
-
-    cmd = xstrcpy(address);
-    if (state)
-	cmd = xstrcat(cmd, (char *)",1");
-    else
-        cmd = xstrcat(cmd, (char *)",0");
-    rc = toggleSwitch(cmd);
-    if (debug)
-	fprintf(stdout, "Switch %s rc=%d\n", cmd, rc);
-    syslog(LOG_NOTICE, "Switch %s rc=%d", cmd, rc);
-    free(cmd);
-
-    cmd = xstrcpy((char *)"/raw/");
-    cmd = xstrcat(cmd, myhostname);
-    cmd = xstrcat(cmd, (char *)"/thermferm/rcswitch/");
-    cmd = xstrcat(cmd, address);
-    cmd = xstrcat(cmd, (char *)"/state");
-    sprintf(buf, "%d", state);
-
-    if ((rc = mosquitto_publish(mymosq, &mid_sent, cmd, strlen(buf), buf, qos, 1))) {
-	if (rc == MOSQ_ERR_NO_CONN)
-	    mosquitto_reconnect(mymosq);
-	else
-	    syslog(LOG_NOTICE, "my_mosquitto_switch: error %d from mosquitto_publish", rc);
-    }
-
-    free(cmd);
-    cmd = NULL;
-
-    return rc;
-}
-
-
-
-int my_mosquitto_loop(void)
-{
-    w1_therm		*tmp1, *old1;
-    char		buf[1024], *alias, *state = NULL;
-    int			rc;
-
-	if (status == STATUS_CONNACK_RECVD) {
-	    /*
-	     * Here send our 1-wire sensors values
-	     */
-	    for (tmp1 = Config.w1therms; tmp1; tmp1 = old1) {
-		old1 = tmp1->next;
-
-		if (tmp1->update) {
-		    /*
-		     * Build path and alias topic
-		     */
-		    alias = xstrcpy((char *)"/raw/");
-		    alias = xstrcat(alias, myhostname);
-		    alias = xstrcat(alias, (char *)"/thermferm/w1/");
-		    alias = xstrcat(alias, tmp1->master);
-		    alias = xstrcat(alias, (char *)"/");
-		    alias = xstrcat(alias, tmp1->name);
-		    alias = xstrcat(alias, (char *)"/temperature");
-
-		    /*
-		     * Publish the temperature.
-		     */
-		    sprintf(buf, "%.1f", tmp1->lastval / 1000.0);
-		    if ((rc = mosquitto_publish(mymosq, &mid_sent, alias, strlen(buf), buf, qos, 1))) {
-			if (rc == MOSQ_ERR_NO_CONN)
-			    mosquitto_reconnect(mymosq);
-			else
-			    syslog(LOG_NOTICE, "mainloop: error %d from mosquitto_publish", rc);
-		    }
-		    tmp1->update = FALSE;
-		    lcdupdate = TRUE;
-
-		    free(alias);
-		    alias = NULL;
-		}
-	    }
-
-	    if (my_shutdown) {
-		/*
-		 * Final publish 0 to clients/<hostname>/thermferm/state
-		 */
-		sprintf(buf, "0");
-		mosquitto_publish(mymosq, &mid_sent, state, strlen(buf), buf, qos, true);
-		last_mid = mid_sent;
-		status = STATUS_WAITING;
-		mb_lcdClear(lcdHandle);
-//		lcdPosition(lcdHandle, 0, 0);
-		mb_lcdPuts(lcdHandle, "Shuting down ...");
-	    }
-
-	} else if (status == STATUS_WAITING) {
-	    if (debug)
-	    	fprintf(stdout, (char *)"Waiting\n");
-	    if (last_mid_sent == last_mid && disconnect_sent == false) {
-		mosquitto_disconnect(mymosq);
-		disconnect_sent = true;
-	    }
-	}
-	rc = MOSQ_ERR_SUCCESS;
-
-    return (rc == MOSQ_ERR_SUCCESS && connected);
-}
-
-
-
-void my_mosquitto_exit(void)
-{
-    mosquitto_loop_stop(mymosq, false);
-    mosquitto_destroy(mymosq);
-    mosquitto_lib_cleanup();
-}
-
-
-#endif
--- a/thermferm/mosquitto.h	Tue May 20 22:42:26 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-#ifndef	MY_MOSQUITTO_H
-#define MY_MOSQUITTO_H
-
-#ifdef HAVE_WIRINGPI_H
-
-int  my_mosquitto_switch(char *, int);
-int  my_mosquitto_init(void);
-int  my_mosquitto_loop(void);
-void my_mosquitto_exit(void);
-
-#endif
-
-#endif
--- a/thermferm/server.c	Tue May 20 22:42:26 2014 +0200
+++ b/thermferm/server.c	Thu May 22 13:54:52 2014 +0200
@@ -30,7 +30,6 @@
 extern int		lcdHandle;
 extern unsigned char	lcdbuf[MAX_LCDS][20][4];
 extern sys_config       Config;
-extern int		clients;
 
 int			s;		/* connected socket			*/
 int			ls;		/* listen socket			*/
@@ -43,33 +42,47 @@
 #define SS_BUFSIZE      1024
 #define SS_TIMEOUT      300
 
+unsigned char		cs_mode = 'o';	/* o = Off, f = fridge, b = beer, p = profile-run */
+float			cs_beerSet = 20.0;
+float			cs_fridgeSet = 20.0;
+float			cs_heatEstimator = 0.2;
+float			cs_coolEstimator = 5;
+
+unsigned char		cc_tempFormat = 'C';
+float			cc_tempSetMin = 1.0;
+float			cc_tempSetMax = 30.0;
+float			cc_idleRangeH = 1.000;
+float			cc_idleRangeL = -1.000;
+
+float			cv_beerDiff = 0.0;
+
 
 
 void defaultControlsettings(void)
 {
-	beer->cs_mode = 'o';		/* o = Off, f = fridge, b = beer, p = profile-run */
-	beer->cs_beerSet = 20.0;
-	beer->cs_fridgeSet = 20.0;
-	beer->cs_heatEstimator = 0.2;
-	beer->cs_coolEstimator = 5;
+	cs_mode = 'o';		/* o = Off, f = fridge, b = beer, p = profile-run */
+	cs_beerSet = 20.0;
+	cs_fridgeSet = 20.0;
+	cs_heatEstimator = 0.2;
+	cs_coolEstimator = 5;
 }
 
 
 
 void defaultControlConstants(void)
 {
-	beer->cc_tempFormat = 'C';
-	beer->cc_tempSetMin = 1.0;
-	beer->cc_tempSetMax = 30.0;
-	beer->cc_idleRangeH = 1.000;
-	beer->cc_idleRangeL = -1.000;
+	cc_tempFormat = 'C';
+	cc_tempSetMin = 1.0;
+	cc_tempSetMax = 30.0;
+	cc_idleRangeH = 1.000;
+	cc_idleRangeL = -1.000;
 }
 
 
 
 void defaultControlVariables(void)
 {
-	beer->cv_beerDiff = 0.0;
+    cv_beerDiff = 0.0;
 }
 
 
@@ -89,9 +102,10 @@
     vsnprintf(out, SS_BUFSIZE-1, format, va_ptr);
     va_end(va_ptr);
 
-    syslog(LOG_NOTICE, "send: \"%s\"", out);
-    if (debug)
+    if (debug) {
+    	syslog(LOG_NOTICE, "send: \"%s\"", out);
 	fprintf(stdout, "send: \"%s\"\n", out);
+    }
 
     if (send(s, out, strlen(out), 0) != strlen(out)) {
 	syslog(LOG_NOTICE, "srv_send failed");
@@ -120,25 +134,10 @@
 void cmd_server(void)
 {
     char                *inp, *hostname, buf[SS_BUFSIZE], obuf[SS_BUFSIZE];
-    int                 i, rc, rlen, timer;
+    int                 i, rc, rlen;
     socklen_t           fromlen;
-    struct pollfd       pfd[1];
     float		newtemp;
 
-    /*
-     * Close listen socket
-     */
-    close(ls);
-    /*
-     * Install private signal handler.
-     */
-    for (i = 0; i < NSIG; i++) {
-	if ((i == SIGHUP) || (i == SIGPIPE) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV))
-	    signal(i, (void (*))cmd_die);
-	else
-	    signal(i, SIG_IGN);
-    }
-
     hp = gethostbyaddr ((char *) &peeraddr_in.sin_addr, sizeof(struct in_addr), peeraddr_in.sin_family);
     if (hp == NULL) {
 	hostname = inet_ntoa(peeraddr_in.sin_addr);
@@ -146,136 +145,96 @@
 	hostname = hp->h_name;
     }
 
-    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;
-
-    /*
-     * Receive loop
-     */
-    for (;;) {
-	/*
-	 * Poll socket until a define timeout of 0,25 second.
-	 */
-	pfd[0].fd = s;
-	pfd[0].events = POLLIN;
-	pfd[0].revents = 0;
-	rc = poll(pfd, 1, 250);
-
-	if (rc == -1) {
-	    /*
-	     * Poll can be interrupted by a finished child so that's not a real error.
-	     */
-	    if (errno != EINTR) {
-	    	syslog(LOG_NOTICE, "poll() rc=%d sock=%d events=%04x", rc, s, pfd[0].revents);
-	    }
-	} else if (rc) {
-	    if (pfd[0].revents & POLLIN) {
-                memset((char *)&buf, 0, SS_BUFSIZE);
-                fromlen = sizeof(peeraddr_in);
-                rlen = recvfrom(s, buf, sizeof(buf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen);
-                if (rlen == -1) {
-	            syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno));
-	        } else {		    
-		    for (i = 0; i < strlen(buf); i++) {
-			if (buf[i] == '\n')
-			    buf[i] = '\0';
-			if (buf[i] == '\r')
-			    buf[i] = '\0';
-		    }
-		    timer = SS_TIMEOUT * 4;
-		    if (strlen(buf)) {
-			syslog(LOG_NOTICE, "recv: \"%s\"", buf);
-			if (debug)
-			    fprintf(stdout, "recv: \"%s\"\n", buf);
+    if (debug) {
+    	syslog(LOG_NOTICE, "Start new client connection from %s port %u", hostname, ntohs(peeraddr_in.sin_port));
+	fprintf(stdout, "Start new client connection from %s port %u\n", hostname, ntohs(peeraddr_in.sin_port));
+    }
 
-			/*
-			 * Process commands from the client
-			 */
-			if (strncmp(buf, "ack", 3) == 0) {
-			    srv_send((char *)"ack");
-			} else if (strncmp(buf, "lcd", 3) == 0) {
-			    sprintf(obuf, "[\"                    \", \"                    \", \"                    \", \"                    \"]");
-			    for (i = 0; i < 20; i++) {
-				obuf[i+2]  = lcdbuf[lcdHandle][i][0];
-				obuf[i+26] = lcdbuf[lcdHandle][i][1];
-				obuf[i+50] = lcdbuf[lcdHandle][i][2];
-				obuf[i+74] = lcdbuf[lcdHandle][i][3];
-			    }
-			    srv_send(obuf);
-			} else if (strncmp(buf, "getMode", 7) == 0) {
-			    srv_send("%c", beer->cs_mode);
-			} else if (strncmp(buf, "getFridge", 9) == 0) {
-			    srv_send("%.1f", beer->cs_fridgeSet);
-			} else if (strncmp(buf, "getBeer", 7) == 0) {
-			    srv_send("%.1f", beer->cs_beerSet);
-			} else if (strncmp(buf, "getControlConstants", 19) == 0) {
-			    srv_send("{ \"tempFormat\":\"%c\", \"tempSetMin\":%.1f, \"tempSetMax\":%.1f, \"idleRangeH\":%.3f, \"idleRangeL\":%.3f }", 
-				     beer->cc_tempFormat, beer->cc_tempSetMin, beer->cc_tempSetMax, beer->cc_idleRangeH, beer->cc_idleRangeL );
-			} else if (strncmp(buf, "getControlSettings", 18) == 0) {
-			    srv_send("{ \"mode\":\"%c\", \"beerSet\":%.1f, \"fridgeSet\":%.1f, \"heatEstimator\":%.1f, \"coolEstimator\":%.1f }", 
-				     beer->cs_mode, beer->cs_beerSet, beer->cs_fridgeSet, beer->cs_heatEstimator, beer->cs_coolEstimator);
-			} else if (strncmp(buf, "getControlVariables", 19) == 0) {
-			    srv_send("{ \"beerDiff\":%.2f }", beer->cv_beerDiff);
-			} else if (strncmp(buf, "setBeer=", 8) == 0) {
-			    inp = xstrcpy(buf+8);
-			    rc = sscanf(inp, "%f", &newtemp);
-			    if (debug)
-				fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc);
-			    if (rc == 1) {
-			        srv_send("ack");
-				beer->cs_mode = 'b';
-				beer->cs_beerSet = newtemp;
-			    } else {
-				srv_send("err");
-			    }
-			} else if (strncmp(buf, "setFridge=", 10) == 0) {
-			    inp = xstrcpy(buf+10);
-			    rc = sscanf(inp, "%f", &newtemp);
-			    if (debug)
-				fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc);
-			    if (rc == 1) {
-			    	srv_send("ack");
-				beer->cs_mode = 'f';
-				beer->cs_fridgeSet = newtemp;
-			    } else {
-				srv_send("err");
-			    }
-			} else {
-			    if (debug)
-				fprintf(stdout, "unknown command \"%s\"\n", buf);
-			    srv_send((char *)"ERR");
-			}
-			break;
-		    }
-		}
-	    } else {
-		syslog(LOG_NOTICE, "poll other event");
+    memset((char *)&buf, 0, SS_BUFSIZE);
+    fromlen = sizeof(peeraddr_in);
+    rlen = recvfrom(s, buf, sizeof(buf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen);
+    if (rlen == -1) {
+	syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno));
+    } else {		    
+	for (i = 0; i < strlen(buf); i++) {
+	    if (buf[i] == '\n')
+		buf[i] = '\0';
+	    if (buf[i] == '\r')
+	    	buf[i] = '\0';
+	}
+	if (strlen(buf)) {
+	    if (debug) {
+		syslog(LOG_NOTICE, "recv: \"%s\"", buf);
+		fprintf(stdout, "recv: \"%s\"\n", buf);
 	    }
 
-	} else {
 	    /*
-	     * Poll timeout, do some housekeeping
+	     * Process commands from the client
 	     */
-	    if (timer) {
-	    	timer--;
+	    if (strncmp(buf, "ack", 3) == 0) {
+		srv_send((char *)"ack");
+	    } else if (strncmp(buf, "lcd", 3) == 0) {
+		sprintf(obuf, "[\"                    \", \"                    \", \"                    \", \"                    \"]");
+		for (i = 0; i < 20; i++) {
+		    obuf[i+2]  = lcdbuf[lcdHandle][i][0];
+		    obuf[i+26] = lcdbuf[lcdHandle][i][1];
+		    obuf[i+50] = lcdbuf[lcdHandle][i][2];
+		    obuf[i+74] = lcdbuf[lcdHandle][i][3];
+		}
+		srv_send(obuf);
+	    } else if (strncmp(buf, "getMode", 7) == 0) {
+		srv_send("%c", cs_mode);
+	    } else if (strncmp(buf, "getFridge", 9) == 0) {
+		srv_send("%.1f", cs_fridgeSet);
+	    } else if (strncmp(buf, "getBeer", 7) == 0) {
+		srv_send("%.1f", cs_beerSet);
+	    } else if (strncmp(buf, "getControlConstants", 19) == 0) {
+		srv_send("{ \"tempFormat\":\"%c\", \"tempSetMin\":%.1f, \"tempSetMax\":%.1f, \"idleRangeH\":%.3f, \"idleRangeL\":%.3f }", 
+			cc_tempFormat, cc_tempSetMin, cc_tempSetMax, cc_idleRangeH, cc_idleRangeL );
+	    } else if (strncmp(buf, "getControlSettings", 18) == 0) {
+		srv_send("{ \"mode\":\"%c\", \"beerSet\":%.1f, \"fridgeSet\":%.1f, \"heatEstimator\":%.1f, \"coolEstimator\":%.1f }", 
+			cs_mode, cs_beerSet, cs_fridgeSet, cs_heatEstimator, cs_coolEstimator);
+	    } else if (strncmp(buf, "getControlVariables", 19) == 0) {
+		srv_send("{ \"beerDiff\":%.2f }", cv_beerDiff);
+	    } else if (strncmp(buf, "setBeer=", 8) == 0) {
+		inp = xstrcpy(buf+8);
+		rc = sscanf(inp, "%f", &newtemp);
+		if (debug)
+		    fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc);
+		if (rc == 1) {
+		    srv_send("ack");
+		    cs_mode = 'b';
+		    cs_beerSet = newtemp;
+		} else {
+		    srv_send("err");
+		}
+		free(inp);
+	    } else if (strncmp(buf, "setFridge=", 10) == 0) {
+		inp = xstrcpy(buf+10);
+		rc = sscanf(inp, "%f", &newtemp);
+		if (debug)
+		    fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc);
+		if (rc == 1) {
+		    srv_send("ack");
+		    cs_mode = 'f';
+		    cs_fridgeSet = newtemp;
+		} else {
+		    srv_send("err");
+		}
+		free(inp);
 	    } else {
-		/* Inactivity timeout */
-		break;
-	    }
-	    if (my_shutdown) {
-		break;
+		if (debug)
+		    fprintf(stdout, "unknown command \"%s\"\n", buf);
+		srv_send((char *)"ERR");
 	    }
 	}
     }
 
-    if (clients)
-	clients--;
-    syslog(LOG_NOTICE, "End connection from %s port %u", hostname, ntohs(peeraddr_in.sin_port));
-    if (debug)
+    if (debug) {
+    	syslog(LOG_NOTICE, "End connection from %s port %u", hostname, ntohs(peeraddr_in.sin_port));
 	fprintf(stdout, "End connection from %s port %u\n", hostname, ntohs(peeraddr_in.sin_port));
+    }
+
     close(s);
 }
 
@@ -290,10 +249,6 @@
     if (debug)
 	fprintf(stdout, "Thread my_server_loop started\n");
 
-    defaultControlsettings();
-    defaultControlConstants();
-    defaultControlVariables();
-
     memset((char *)&myaddr_in, 0, sizeof(struct sockaddr_in));
     memset((char *)&peeraddr_in, 0, sizeof(struct sockaddr_in));
     myaddr_in.sin_family = AF_INET;
@@ -356,23 +311,7 @@
 	    return 0;
 	}
 
-	switch (fork()) {
-	    case -1:        /*
-			     * Can't fork, just continue.
-			     */
-			    return 0;
-	    case 0:         /*
-			     * Child process, the commandline server.
-			     */
-			    cmd_server();
-			    return 0;
-	    default:        /*
-			     * Daemon process comes here. The daemon
-			     * needs to remember to close the new
-			     * accept socket after forking the child.
-			     */
-			    close(s);
-	}
+	cmd_server();
 
 	if (my_shutdown) {
 	    syslog(LOG_NOTICE, "Thread my_server_loop stopped");
--- a/thermferm/thermferm.c	Tue May 20 22:42:26 2014 +0200
+++ b/thermferm/thermferm.c	Thu May 22 13:54:52 2014 +0200
@@ -33,9 +33,11 @@
 int			coolerA = 0;
 int			coolerB = 0;
 
+key_t			key = 5680;		/* key to be passed to shmget()		*/
+int			shmid;
+
 bool			my_shutdown = false;
 static pid_t		pgrp, mypid;
-int			clients = 0;
 
 extern bool		debug;
 extern sys_config	Config;
@@ -183,6 +185,10 @@
 	return 1;
     }
 
+//    defaultControlsettings();
+//        defaultControlConstants();
+//	    defaultControlVariables();
+
     lcdPosition(lcdHandle, 0, 0);
     sprintf(buf, "    Thermferm");
     mb_lcdPuts(lcdHandle, buf);
@@ -224,6 +230,19 @@
 			stopLCD();
 			exit(1);
 	    case 0:	/*
+			 * Setup shared memory for the parent process
+			 */
+//			syslog(LOG_NOTICE, "size %d", sizeof(struct _beer));
+//			if ((shmid = shmget(key, sizeof(struct _beer) + 16, IPC_CREAT | 0666)) < 0) {
+//			    syslog(LOG_NOTICE, "shmget: %s", strerror(errno));
+//			    exit(1);
+//			}
+//			beer = shmat(shmid, (void *)0, 0);
+//			if (beer == (void *)(-1)) {
+//			    syslog(LOG_NOTICE, "shmat: %s", strerror(errno));
+//			}
+
+			/*
 			 * Run the daemon
 			 */
 			fclose(stdin);
--- a/thermferm/thermferm.h	Tue May 20 22:42:26 2014 +0200
+++ b/thermferm/thermferm.h	Thu May 22 13:54:52 2014 +0200
@@ -6,26 +6,5 @@
 #define FALSE 0
 
 
-/*
- * IPC shared memory
- */
-struct _beer {
-	float                   cs_beerSet;
-	float                   cs_fridgeSet;
-	unsigned char           cs_mode;  /* o = Off, f = fridge, b = beer, p = profile-run */
-	float                   cs_heatEstimator;
-	float                   cs_coolEstimator;
-
-	unsigned char           cc_tempFormat;
-	float                   cc_tempSetMin;
-	float                   cc_tempSetMax;
-	float                   cc_idleRangeH;
-	float                   cc_idleRangeL;
-
-	float                   cv_beerDiff;
-};
-
-struct _beer *beer;
-
 
 #endif

mercurial