# HG changeset patch # User Michiel Broek # Date 1400759692 -7200 # Node ID d8c64f81b192f0715b4c29c3cc61344d88fa7189 # Parent e2c1f2373be0692b0ba4887cd43271a6997d3f05 Single client server works diff -r e2c1f2373be0 -r d8c64f81b192 thermferm/mosquitto.c --- 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 - * - * 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//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 diff -r e2c1f2373be0 -r d8c64f81b192 thermferm/mosquitto.h --- 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 diff -r e2c1f2373be0 -r d8c64f81b192 thermferm/server.c --- 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"); diff -r e2c1f2373be0 -r d8c64f81b192 thermferm/thermferm.c --- 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); diff -r e2c1f2373be0 -r d8c64f81b192 thermferm/thermferm.h --- 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