coolers/coolers.c

changeset 40
dafbbd5e9922
parent 34
38e3e3a49320
--- a/coolers/coolers.c	Sat May 17 10:50:16 2014 +0200
+++ b/coolers/coolers.c	Sat May 17 23:06:39 2014 +0200
@@ -33,7 +33,7 @@
 int			coolerA = 0;
 int			coolerB = 0;
 
-bool			shutdown = false;
+bool			my_shutdown = false;
 static pid_t		pgrp, mypid;
 
 extern bool		debug;
@@ -41,6 +41,13 @@
 extern int		lcdHandle;
 int			lcdupdate;
 
+int			sock = -1;		/* Datagram socket	*/
+struct sockaddr_un	servaddr;		/* Server address	*/
+struct sockaddr_un	from;			/* From address		*/
+static char		spath[PATH_MAX];	/* Socket path		*/
+socklen_t		fromlen;
+
+
 int server(void);
 void help(void);
 void die(int);
@@ -68,14 +75,14 @@
 	default:	syslog(LOG_NOTICE, "die() on signal %d", onsig);
     }
 
-    shutdown = true;
+    my_shutdown = true;
 }
 
 
 
 void stopLCD(void)
 {
-    lcdClear(lcdHandle);
+    mb_lcdClear(lcdHandle);
     setBacklight(0);
 }
 
@@ -158,10 +165,11 @@
     }
 
     lcdPosition(lcdHandle, 0, 0);
-    lcdPuts(lcdHandle, "Coolers");
+    sprintf(buf, "Coolers");
+    mb_lcdPuts(lcdHandle, buf);
     lcdPosition(lcdHandle, 0, 1);
     sprintf(buf, "Version %s", VERSION);
-    lcdPuts(lcdHandle, buf);
+    mb_lcdPuts(lcdHandle, buf);
 
     if (Config.tx433 != -1) {
 	if (debug)
@@ -239,7 +247,9 @@
     char                buf[1024];
     w1_therm		*tmp1, *old1;
     rc_switch		*tmp2, *old2;
-    int			rc, run = 0, temp;
+    int			rc, run = 0, temp, rlen;
+    struct pollfd	pfd[1];
+
 
     if (lockprog((char *)"coolers")) {
 	syslog(LOG_NOTICE, "Can't lock");
@@ -254,10 +264,72 @@
 	syslog(LOG_NOTICE, "my_sensors_loop thread didn't start rc=%d", rc);
     }
 
+    /*
+     * Setup socket so that clients can communicate with this server.
+     */
+    if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) {
+	fprintf(stderr, "Can't create socket\n");
+	return 1;
+    }
+
+    snprintf(spath, PATH_MAX, "/var/run/coolers.sock");
+    memset(&servaddr, 0, sizeof(servaddr));
+    servaddr.sun_family = AF_UNIX;
+    strcpy(servaddr.sun_path, spath);
+
+    if (bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
+	close(sock);
+	sock = -1;
+	fprintf(stderr, "Can't bind socket %s\n", spath);
+	return 1;
+    }
+    if (chmod(spath, 0666)) {
+	fprintf(stderr, "Can't chmod 0666 %s\n", spath);
+	close(sock);
+	sock = -1;
+	unlink(spath);
+	return 1;
+    }
+    if (debug)
+	fprintf(stdout, "Unix socket created\n");
+
     snprintf(buf, 1023, "tempA,coolerA,tempB,coolerB");
     logger((char *)"coolers.log", (char *)"coolers", buf);
 
     do {
+	/*
+	 * Poll UNIX Datagram socket the defined timeout of one second.
+	 * This means we listen if a client program has something to tell us.
+	 * Timeout is one second, after the timeout the rest of the mainloop is executed.
+	 */
+	pfd[0].fd = sock;
+	pfd[0].events = POLLIN;
+	pfd[0].revents = 0;
+	rc = poll(pfd, 1, 1000);
+
+	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, sock, pfd[0].revents);
+	    }
+	} else if (rc) {
+	    if (pfd[0].revents & POLLIN) {
+		/*
+		 * Process the clients request for mbtask commands.
+		 */
+		memset(&buf, 0, sizeof(buf));
+		fromlen = sizeof(from);
+		rlen = recvfrom(sock, buf, sizeof(buf) -1, 0, (struct sockaddr *)&from, &fromlen);
+		if (rlen == -1) {
+		    syslog(LOG_NOTICE, "recvfrom() for socket receiver");
+		} else {
+//		    do_cmd(buf);
+		}
+	    }
+	}
+
 	lcdupdate = FALSE;
 
 	run = my_mosquitto_loop();
@@ -297,13 +369,13 @@
 	    lcdPosition(lcdHandle, 0, 0);
 	    tmp1 = Config.w1therms;
 	    snprintf(buf, 16, "%4.1f %cC %c %s            ", tmp1->lastval / 1000.0, 0xdf, coolerA ? '+' : ' ', tmp1->alias);
-	    lcdPuts(lcdHandle, buf);
+	    mb_lcdPuts(lcdHandle, buf);
 	    temp = tmp1->lastval;
 	    old1 = tmp1->next;
 	    tmp1 = old1;
 	    lcdPosition(lcdHandle, 0, 1);
 	    snprintf(buf, 16, "%4.1f %cC %c %s            ", tmp1->lastval / 1000.0, 0xdf, coolerB ? '+' : ' ', tmp1->alias);
-	    lcdPuts(lcdHandle, buf);
+	    mb_lcdPuts(lcdHandle, buf);
 	    snprintf(buf, 1023, "%.1f,%s,%.1f,%s", temp / 1000.0, coolerA ? (char *)"on" : (char *)"off",
 			    			 tmp1->lastval / 1000.0, coolerB ? (char *)"on" : (char *)"off");
 	    logger((char *)"coolers.log", (char *)"coolers", buf);
@@ -329,6 +401,7 @@
     disableTransmit();
 
     ulockprog((char *)"coolers");
+    unlink(spath);
 
     if (debug)
 	fprintf(stdout, "Goodbye\n");

mercurial