coolers/coolers.c

changeset 40
dafbbd5e9922
parent 34
38e3e3a49320
equal deleted inserted replaced
39:442357970a34 40:dafbbd5e9922
31 int tempA = 80; 31 int tempA = 80;
32 int tempB = 80; 32 int tempB = 80;
33 int coolerA = 0; 33 int coolerA = 0;
34 int coolerB = 0; 34 int coolerB = 0;
35 35
36 bool shutdown = false; 36 bool my_shutdown = false;
37 static pid_t pgrp, mypid; 37 static pid_t pgrp, mypid;
38 38
39 extern bool debug; 39 extern bool debug;
40 extern sys_config Config; 40 extern sys_config Config;
41 extern int lcdHandle; 41 extern int lcdHandle;
42 int lcdupdate; 42 int lcdupdate;
43
44 int sock = -1; /* Datagram socket */
45 struct sockaddr_un servaddr; /* Server address */
46 struct sockaddr_un from; /* From address */
47 static char spath[PATH_MAX]; /* Socket path */
48 socklen_t fromlen;
49
43 50
44 int server(void); 51 int server(void);
45 void help(void); 52 void help(void);
46 void die(int); 53 void die(int);
47 54
66 case SIGTERM: syslog(LOG_NOTICE, "Got SIGTERM, shutting down"); 73 case SIGTERM: syslog(LOG_NOTICE, "Got SIGTERM, shutting down");
67 break; 74 break;
68 default: syslog(LOG_NOTICE, "die() on signal %d", onsig); 75 default: syslog(LOG_NOTICE, "die() on signal %d", onsig);
69 } 76 }
70 77
71 shutdown = true; 78 my_shutdown = true;
72 } 79 }
73 80
74 81
75 82
76 void stopLCD(void) 83 void stopLCD(void)
77 { 84 {
78 lcdClear(lcdHandle); 85 mb_lcdClear(lcdHandle);
79 setBacklight(0); 86 setBacklight(0);
80 } 87 }
81 88
82 89
83 90
156 fprintf(stderr, "Cannot initialize LCD display, rc=%d\n", rc); 163 fprintf(stderr, "Cannot initialize LCD display, rc=%d\n", rc);
157 return 1; 164 return 1;
158 } 165 }
159 166
160 lcdPosition(lcdHandle, 0, 0); 167 lcdPosition(lcdHandle, 0, 0);
161 lcdPuts(lcdHandle, "Coolers"); 168 sprintf(buf, "Coolers");
169 mb_lcdPuts(lcdHandle, buf);
162 lcdPosition(lcdHandle, 0, 1); 170 lcdPosition(lcdHandle, 0, 1);
163 sprintf(buf, "Version %s", VERSION); 171 sprintf(buf, "Version %s", VERSION);
164 lcdPuts(lcdHandle, buf); 172 mb_lcdPuts(lcdHandle, buf);
165 173
166 if (Config.tx433 != -1) { 174 if (Config.tx433 != -1) {
167 if (debug) 175 if (debug)
168 fprintf(stdout, "Using 433 MHz transmitter on pin %d\n", Config.tx433); 176 fprintf(stdout, "Using 433 MHz transmitter on pin %d\n", Config.tx433);
169 syslog(LOG_NOTICE, "Using 433 MHz transmitter on pin %d", Config.tx433); 177 syslog(LOG_NOTICE, "Using 433 MHz transmitter on pin %d", Config.tx433);
237 int server(void) 245 int server(void)
238 { 246 {
239 char buf[1024]; 247 char buf[1024];
240 w1_therm *tmp1, *old1; 248 w1_therm *tmp1, *old1;
241 rc_switch *tmp2, *old2; 249 rc_switch *tmp2, *old2;
242 int rc, run = 0, temp; 250 int rc, run = 0, temp, rlen;
251 struct pollfd pfd[1];
252
243 253
244 if (lockprog((char *)"coolers")) { 254 if (lockprog((char *)"coolers")) {
245 syslog(LOG_NOTICE, "Can't lock"); 255 syslog(LOG_NOTICE, "Can't lock");
246 return 1; 256 return 1;
247 } 257 }
252 if (rc) { 262 if (rc) {
253 fprintf(stderr, "my_sensors_loop thread didn't start rc=%d\n", rc); 263 fprintf(stderr, "my_sensors_loop thread didn't start rc=%d\n", rc);
254 syslog(LOG_NOTICE, "my_sensors_loop thread didn't start rc=%d", rc); 264 syslog(LOG_NOTICE, "my_sensors_loop thread didn't start rc=%d", rc);
255 } 265 }
256 266
267 /*
268 * Setup socket so that clients can communicate with this server.
269 */
270 if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) {
271 fprintf(stderr, "Can't create socket\n");
272 return 1;
273 }
274
275 snprintf(spath, PATH_MAX, "/var/run/coolers.sock");
276 memset(&servaddr, 0, sizeof(servaddr));
277 servaddr.sun_family = AF_UNIX;
278 strcpy(servaddr.sun_path, spath);
279
280 if (bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
281 close(sock);
282 sock = -1;
283 fprintf(stderr, "Can't bind socket %s\n", spath);
284 return 1;
285 }
286 if (chmod(spath, 0666)) {
287 fprintf(stderr, "Can't chmod 0666 %s\n", spath);
288 close(sock);
289 sock = -1;
290 unlink(spath);
291 return 1;
292 }
293 if (debug)
294 fprintf(stdout, "Unix socket created\n");
295
257 snprintf(buf, 1023, "tempA,coolerA,tempB,coolerB"); 296 snprintf(buf, 1023, "tempA,coolerA,tempB,coolerB");
258 logger((char *)"coolers.log", (char *)"coolers", buf); 297 logger((char *)"coolers.log", (char *)"coolers", buf);
259 298
260 do { 299 do {
300 /*
301 * Poll UNIX Datagram socket the defined timeout of one second.
302 * This means we listen if a client program has something to tell us.
303 * Timeout is one second, after the timeout the rest of the mainloop is executed.
304 */
305 pfd[0].fd = sock;
306 pfd[0].events = POLLIN;
307 pfd[0].revents = 0;
308 rc = poll(pfd, 1, 1000);
309
310 if (rc == -1) {
311 /*
312 * Poll can be interrupted by a finished child so that's not a real error.
313 */
314 if (errno != EINTR) {
315 syslog(LOG_NOTICE, "poll() rc=%d sock=%d, events=%04x", rc, sock, pfd[0].revents);
316 }
317 } else if (rc) {
318 if (pfd[0].revents & POLLIN) {
319 /*
320 * Process the clients request for mbtask commands.
321 */
322 memset(&buf, 0, sizeof(buf));
323 fromlen = sizeof(from);
324 rlen = recvfrom(sock, buf, sizeof(buf) -1, 0, (struct sockaddr *)&from, &fromlen);
325 if (rlen == -1) {
326 syslog(LOG_NOTICE, "recvfrom() for socket receiver");
327 } else {
328 // do_cmd(buf);
329 }
330 }
331 }
332
261 lcdupdate = FALSE; 333 lcdupdate = FALSE;
262 334
263 run = my_mosquitto_loop(); 335 run = my_mosquitto_loop();
264 336
265 tmp1 = Config.w1therms; 337 tmp1 = Config.w1therms;
295 367
296 if (run && lcdupdate) { 368 if (run && lcdupdate) {
297 lcdPosition(lcdHandle, 0, 0); 369 lcdPosition(lcdHandle, 0, 0);
298 tmp1 = Config.w1therms; 370 tmp1 = Config.w1therms;
299 snprintf(buf, 16, "%4.1f %cC %c %s ", tmp1->lastval / 1000.0, 0xdf, coolerA ? '+' : ' ', tmp1->alias); 371 snprintf(buf, 16, "%4.1f %cC %c %s ", tmp1->lastval / 1000.0, 0xdf, coolerA ? '+' : ' ', tmp1->alias);
300 lcdPuts(lcdHandle, buf); 372 mb_lcdPuts(lcdHandle, buf);
301 temp = tmp1->lastval; 373 temp = tmp1->lastval;
302 old1 = tmp1->next; 374 old1 = tmp1->next;
303 tmp1 = old1; 375 tmp1 = old1;
304 lcdPosition(lcdHandle, 0, 1); 376 lcdPosition(lcdHandle, 0, 1);
305 snprintf(buf, 16, "%4.1f %cC %c %s ", tmp1->lastval / 1000.0, 0xdf, coolerB ? '+' : ' ', tmp1->alias); 377 snprintf(buf, 16, "%4.1f %cC %c %s ", tmp1->lastval / 1000.0, 0xdf, coolerB ? '+' : ' ', tmp1->alias);
306 lcdPuts(lcdHandle, buf); 378 mb_lcdPuts(lcdHandle, buf);
307 snprintf(buf, 1023, "%.1f,%s,%.1f,%s", temp / 1000.0, coolerA ? (char *)"on" : (char *)"off", 379 snprintf(buf, 1023, "%.1f,%s,%.1f,%s", temp / 1000.0, coolerA ? (char *)"on" : (char *)"off",
308 tmp1->lastval / 1000.0, coolerB ? (char *)"on" : (char *)"off"); 380 tmp1->lastval / 1000.0, coolerB ? (char *)"on" : (char *)"off");
309 logger((char *)"coolers.log", (char *)"coolers", buf); 381 logger((char *)"coolers.log", (char *)"coolers", buf);
310 } 382 }
311 usleep(100000); 383 usleep(100000);
327 my_mosquitto_exit(); 399 my_mosquitto_exit();
328 stopLCD(); 400 stopLCD();
329 disableTransmit(); 401 disableTransmit();
330 402
331 ulockprog((char *)"coolers"); 403 ulockprog((char *)"coolers");
404 unlink(spath);
332 405
333 if (debug) 406 if (debug)
334 fprintf(stdout, "Goodbye\n"); 407 fprintf(stdout, "Goodbye\n");
335 408
336 return 0; 409 return 0;

mercurial