275 if (unit->fan_available) { |
278 if (unit->fan_available) { |
276 srv_send((char *)"Fan available %s", unit->fan_available); |
279 srv_send((char *)"Fan available %s", unit->fan_available); |
277 } |
280 } |
278 srv_send((char *)"Unit mode %s", UNITMODE[unit->mode]); |
281 srv_send((char *)"Unit mode %s", UNITMODE[unit->mode]); |
279 srv_send((char *)"Fridge temperature set to %.1f", unit->fridge_set); |
282 srv_send((char *)"Fridge temperature set to %.1f", unit->fridge_set); |
280 srv_send((char *)"Beer temperature set to %.1f", unit->fridge_set); |
283 srv_send((char *)"Beer temperature set to %.1f", unit->beer_set); |
281 if (unit->profile) { |
284 if (unit->profile) { |
282 srv_send((char *)"Profile name %s", unit->profile); |
285 srv_send((char *)"Profile name %s", unit->profile); |
283 } |
286 } |
284 srv_send((char *)"Temperature range %.1f .. %.1f", unit->temp_set_min, unit->temp_set_max); |
287 srv_send((char *)"Temperature range %.1f .. %.1f", unit->temp_set_min, unit->temp_set_max); |
285 srv_send((char *)"Idle temperature range %.1f .. %.1f", unit->idle_rangeL, unit->idle_rangeH); |
288 srv_send((char *)"Idle temperature range %.1f .. %.1f", unit->idle_rangeL, unit->idle_rangeH); |
290 } else { |
293 } else { |
291 srv_send((char *)"502 Unknown command option"); |
294 srv_send((char *)"502 Unknown command option"); |
292 } |
295 } |
293 |
296 |
294 return 0; |
297 return 0; |
|
298 } |
|
299 |
|
300 |
|
301 |
|
302 /* |
|
303 * Set new operating mode |
|
304 * MODE OFF|NONE|BEER|FRIDGE|PROFILE |
|
305 */ |
|
306 int cmd_mode(char *buf) |
|
307 { |
|
308 return 1; |
|
309 } |
|
310 |
|
311 |
|
312 |
|
313 /* |
|
314 * SET commands |
|
315 */ |
|
316 int cmd_set(char *buf) |
|
317 { |
|
318 char *opt, *param; |
|
319 units_list *unit; |
|
320 int i, rc; |
|
321 float fval; |
|
322 |
|
323 opt = strtok(buf, " \0"); |
|
324 opt = strtok(NULL, " \0"); |
|
325 if (opt == NULL) { |
|
326 srv_send((char *)"501 Subcommand missing"); |
|
327 return 1; |
|
328 } |
|
329 |
|
330 param = strtok(NULL, "\0"); |
|
331 if (param == NULL) { |
|
332 srv_send((char *)"501 Parameter missing"); |
|
333 return 1; |
|
334 } |
|
335 |
|
336 rc = sscanf(param, "%f", &fval); |
|
337 |
|
338 if (debug) |
|
339 fprintf(stdout, "opt='%s' param='%s' rc=%d fval=%.1f\n", opt, param, rc, fval); |
|
340 |
|
341 /* |
|
342 * Commands below need a selected unit |
|
343 */ |
|
344 if (current_unit == -1) { |
|
345 srv_send((char *)"401 No fermenter unit selected"); |
|
346 return 1; |
|
347 } |
|
348 |
|
349 i = 0; |
|
350 for (unit = Config.units; unit; unit = unit->next) { |
|
351 i++; |
|
352 if (i == current_unit) |
|
353 break; |
|
354 } |
|
355 |
|
356 /* |
|
357 * If a valid parameter float value |
|
358 */ |
|
359 if (rc == 1) { |
|
360 if (strcmp(opt, (char *)"BEER") == 0) { |
|
361 if ((fval >= unit->temp_set_min) && (fval <= unit->temp_set_max)) { |
|
362 unit->beer_set = fval; |
|
363 srv_send((char *)"214 Unit %d BEER set to %.1f", current_unit, fval); |
|
364 return 0; |
|
365 } else { |
|
366 srv_send((char *)"510 New temperature not between %.1f and %.1f", unit->temp_set_min, unit->temp_set_max); |
|
367 return 1; |
|
368 } |
|
369 } else if (strcmp(opt, (char *)"FRIDGE") == 0) { |
|
370 if ((fval >= unit->temp_set_min) && (fval <= unit->temp_set_max)) { |
|
371 unit->fridge_set = fval; |
|
372 srv_send((char *)"214 Unit %d BEER set to %.1f", current_unit, fval); |
|
373 return 0; |
|
374 } else { |
|
375 srv_send((char *)"510 New temperature not between %.1f and %.1f", unit->temp_set_min, unit->temp_set_max); |
|
376 return 1; |
|
377 } |
|
378 } else if (strcmp(opt, (char *)"VOLUME") == 0) { |
|
379 /* |
|
380 * Must fit in a 2 TEU container |
|
381 */ |
|
382 if ((fval >= 0.0) && (fval <= 77020.0)) { |
|
383 unit->volume = fval; |
|
384 srv_send((char *)"214 Unit %d VOLUME set to %.1f", current_unit, fval); |
|
385 return 0; |
|
386 } else { |
|
387 srv_send((char *)"510 New volume not between 0 and 77020"); |
|
388 return 1; |
|
389 } |
|
390 } else if (strcmp(opt, (char *)"IDLE_LOW") == 0) { |
|
391 if ((fval >= -5.0) && (fval <= -0.1)) { |
|
392 unit->idle_rangeL = fval; |
|
393 srv_send((char *)"214 Unit %d IDLE_LOW set to %.1f", current_unit, fval); |
|
394 return 0; |
|
395 } else { |
|
396 srv_send((char *)"510 New value not between -5.0 and -0.1"); |
|
397 return 1; |
|
398 } |
|
399 } else if (strcmp(opt, (char *)"IDLE_HIGH") == 0) { |
|
400 if ((fval >= 0.1) && (fval <= 5.0)) { |
|
401 unit->idle_rangeH = fval; |
|
402 srv_send((char *)"214 Unit %d IDLE_HIGH set to %.1f", current_unit, fval); |
|
403 return 0; |
|
404 } else { |
|
405 srv_send((char *)"510 New value not between -5.0 and -0.1"); |
|
406 return 1; |
|
407 } |
|
408 } else if (strcmp(opt, (char *)"TEMP_MIN") == 0) { |
|
409 if ((fval >= -2.0) && (fval <= 35.0) && (fval < unit->temp_set_max)) { |
|
410 unit->temp_set_min = fval; |
|
411 srv_send((char *)"214 Unit %d TEMP_MIN set to %.1f", current_unit, fval); |
|
412 return 0; |
|
413 } else { |
|
414 srv_send((char *)"510 New value not between -2.0 and 35.0 and lower then TEMP_MAX"); |
|
415 return 1; |
|
416 } |
|
417 } else if (strcmp(opt, (char *)"TEMP_MAX") == 0) { |
|
418 if ((fval >= -2.0) && (fval <= 35.0) && (fval > unit->temp_set_min)) { |
|
419 unit->temp_set_max = fval; |
|
420 srv_send((char *)"214 Unit %d TEMP_MAX set to %.1f", current_unit, fval); |
|
421 return 0; |
|
422 } else { |
|
423 srv_send((char *)"510 New value not between -2.0 and 35.0 and higher then TEMP_MIN"); |
|
424 return 1; |
|
425 } |
|
426 } |
|
427 } |
|
428 |
|
429 /* |
|
430 * Set new unit or beer name |
|
431 */ |
|
432 if (strcmp(opt, (char *)"NAME") == 0) { |
|
433 if (unit->name) |
|
434 free(unit->name); |
|
435 unit->name = xstrcpy(param); |
|
436 srv_send((char *)"214 Unit %d NAME set to '%s'", current_unit, param); |
|
437 // TODO: change logfile name |
|
438 return 0; |
|
439 } else if (strcmp(opt, (char *)"PROFILE") == 0) { |
|
440 // check profile file, excists, type, at least one profile item |
|
441 } |
|
442 |
|
443 srv_send((char *)"502 Unknown command option"); |
|
444 return 1; |
295 } |
445 } |
296 |
446 |
297 |
447 |
298 |
448 |
299 /* |
449 /* |
406 srv_send((char *)"LCD Get LCD screen (allways 4 rows of 20 characters)"); |
556 srv_send((char *)"LCD Get LCD screen (allways 4 rows of 20 characters)"); |
407 srv_send((char *)"LIST List all fermenter units"); |
557 srv_send((char *)"LIST List all fermenter units"); |
408 srv_send((char *)"LIST BUS List 1-wire bus"); |
558 srv_send((char *)"LIST BUS List 1-wire bus"); |
409 srv_send((char *)"LIST PROFILES List available profiles"); |
559 srv_send((char *)"LIST PROFILES List available profiles"); |
410 srv_send((char *)"LIST UNIT List fermenter unit"); |
560 srv_send((char *)"LIST UNIT List fermenter unit"); |
411 // srv_send((char *)"MODE off|none|beer|fridge|profile"); |
561 srv_send((char *)"MODE OFF|NONE|BEER|FRIDGE|PROFILE"); |
412 // srv_send((char *)"PROFILE Profile status"); |
562 // srv_send((char *)"PROFILE Profile status"); |
413 // srv_send((char *)"PROFILE start|stop|pause Profile start, stop or pause"); |
563 // srv_send((char *)"PROFILE start|stop|pause Profile start, stop or pause"); |
414 // srv_send((char *)"SET BEER Set beer temperature"); |
564 srv_send((char *)"SET BEER val Set beer temperature"); |
415 // srv_send((char *)"SET FRIDGE Set fridge temperature"); |
565 srv_send((char *)"SET FRIDGE val Set fridge temperature"); |
416 // srv_send((char *)"SET IDLE LOW val Set idle temperature low"); |
566 srv_send((char *)"SET IDLE_LOW val Set idle temperature low (-5.0 .. -0.1)"); |
417 // srv_send((char *)"SET IDLE HIGH val Set idle temperature high"); |
567 srv_send((char *)"SET IDLE_HIGH val Set idle temperature high (0.1 .. 5.0)"); |
418 // srv_send((char *)"SET NAME name Set name or beername for the unit"); |
568 srv_send((char *)"SET NAME name Set name or beername for the unit"); |
419 // srv_send((char *)"SET NONE Set unit to none, but still logs"); |
|
420 // srv_send((char *)"SET OFF Set unit off"); |
|
421 // srv_send((char *)"SET PROFILE name Set named profile"); |
569 // srv_send((char *)"SET PROFILE name Set named profile"); |
422 // srv_send((char *)"SET TEMP MIN val Set unit minimum temperature"); |
570 srv_send((char *)"SET TEMP_MIN val Set unit minimum temperature"); |
423 // srv_send((char *)"SET TEMP MAX val Set unit maximum temperature"); |
571 srv_send((char *)"SET TEMP_MAX val Set unit maximum temperature"); |
424 // srv_send((char *)"SET VOLUME Set unit volume"); |
572 srv_send((char *)"SET VOLUME val Set unit volume"); |
425 srv_send((char *)"UNIT n|uuid Select unit by number or uuid"); |
573 srv_send((char *)"UNIT n|uuid Select unit by number or uuid"); |
426 srv_send((char *)"."); |
574 srv_send((char *)"."); |
427 } else if (strncmp(buf, "LCD", 3) == 0) { |
575 } else if (strncmp(buf, "LCD", 3) == 0) { |
428 #ifdef HAVE_WIRINGPI_H |
576 #ifdef HAVE_WIRINGPI_H |
429 srv_send((char *)"201 information follows"); |
577 srv_send((char *)"201 information follows"); |
438 #else |
586 #else |
439 srv_send((char *)"403 LCD not available"); |
587 srv_send((char *)"403 LCD not available"); |
440 #endif |
588 #endif |
441 } else if (strncmp(buf, "LIST", 4) == 0) { |
589 } else if (strncmp(buf, "LIST", 4) == 0) { |
442 cmd_list(buf); |
590 cmd_list(buf); |
|
591 } else if (strncmp(buf, "MODE", 4) == 0) { |
|
592 cmd_mode(buf); |
|
593 } else if (strncmp(buf, "SET", 3) == 0) { |
|
594 cmd_set(buf); |
443 } else if (strncmp(buf, "UNIT", 4) == 0) { |
595 } else if (strncmp(buf, "UNIT", 4) == 0) { |
444 cmd_unit(buf); |
596 cmd_unit(buf); |
445 } else if (strncmp(buf, "ack", 3) == 0) { |
597 } else if (strncmp(buf, "ack", 3) == 0) { |
446 srv_send((char *)"ack"); |
598 srv_send((char *)"ack"); |
447 } else if (strncmp(buf, "lcd", 3) == 0) { |
599 } else if (strncmp(buf, "lcd", 3) == 0) { |