thermferm/server.c

changeset 88
12259362595b
parent 87
55f1315c94f1
child 92
116226a8c70a
equal deleted inserted replaced
87:55f1315c94f1 88:12259362595b
104 return 0; 104 return 0;
105 } 105 }
106 106
107 107
108 108
109 /*
110 * ADD name
111 */
109 int unit_add(char *buf) 112 int unit_add(char *buf)
110 { 113 {
111 units_list *unit, *tmp; 114 units_list *unit, *tmp;
112 uuid_t uu; 115 uuid_t uu;
113 char *cmd, *opt; 116 char *cmd, *opt;
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) {

mercurial