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); |