diff -r 308f6a436779 -r c92651a54969 thermferm/server.c --- a/thermferm/server.c Thu May 14 22:03:35 2015 +0200 +++ b/thermferm/server.c Sat May 16 17:39:30 2015 +0200 @@ -112,6 +112,50 @@ /* + * Argument is a buffer of size SS_BUFSIZE. + * Return -1 if error, else the number of received + * character. \n is line end, ignore \r. + */ +int srv_recv(char *buffer) +{ + int bytesloaded = 0; + ssize_t ret; + unsigned char buf; + socklen_t fromlen; + + memset(buffer, 0, SS_BUFSIZE); + + while(1) { + /* + * read a single byte + */ + fromlen = sizeof(peeraddr_in); + ret = recvfrom(s, &buf, 1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); + if (ret < 1) { + syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); + srv_send((char *)"518 recfrom(): %s", strerror(errno)); + return -1; /* error */ + } + + if (buf == '\n') + break; + + if (buf != '\r') { + buffer[bytesloaded] = buf; + bytesloaded++; + } + } + + if (debug) { + syslog(LOG_NOTICE, "recv: %d `%s'", bytesloaded, buffer); + fprintf(stdout, "recv: %d `%s'\n", bytesloaded, buffer); + } + return bytesloaded; +} + + + +/* * Update the device inuse counter. */ void device_count(int plus, char *uuid) @@ -578,7 +622,6 @@ { char *opt, *param, *kwd, *val, ibuf[SS_BUFSIZE]; devices_list *device, *tmpd; - socklen_t fromlen; int i, rc, rlen, ival; uuid_t uu; @@ -711,31 +754,11 @@ for (device = Config.devices; device; device = device->next) { if (strcmp(device->uuid, param) == 0) { while (1) { - memset((char *)&ibuf, 0, SS_BUFSIZE); - fromlen = sizeof(peeraddr_in); - rlen = recvfrom(s, ibuf, sizeof(ibuf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); - if (rlen == -1) { - syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); - srv_send((char *)"518 recfrom(): %s", strerror(errno)); + rlen = srv_recv(ibuf); + if (rlen == -1) { return 1; } - for (i = 0; i < strlen(ibuf); i++) { - if (ibuf[i] == '\n') - ibuf[i] = '\0'; - if (ibuf[i] == '\r') - ibuf[i] = '\0'; - } - for (i = strlen(ibuf) -1; i > 0; i--) { - if (ibuf[i] == ' ') - ibuf[i] = '\0'; - else - break; - } if (strlen(ibuf)) { - if (debug) { - syslog(LOG_NOTICE, "recv: \"%s\"", ibuf); - fprintf(stdout, "recv: \"%s\"\n", ibuf); - } if (strcmp(ibuf, (char *)".") == 0) { srv_send((char *)"219 Accepted Device record"); return 0; @@ -908,8 +931,7 @@ int cmd_global(char *buf) { char *opt, *kwd, *val, ibuf[SS_BUFSIZE]; - int ival, i, rlen; - socklen_t fromlen; + int ival, rlen; opt = strtok(buf, " \0"); opt = strtok(NULL, "\0"); @@ -941,31 +963,11 @@ if (strcmp(opt, (char *)"PUT") == 0) { while (1) { - memset((char *)&ibuf, 0, SS_BUFSIZE); - fromlen = sizeof(peeraddr_in); - rlen = recvfrom(s, ibuf, sizeof(ibuf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); + rlen = srv_recv(ibuf); if (rlen == -1) { - syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); - srv_send((char *)"518 recfrom(): %s", strerror(errno)); return 1; } - for (i = 0; i < strlen(ibuf); i++) { - if (ibuf[i] == '\n') - ibuf[i] = '\0'; - if (ibuf[i] == '\r') - ibuf[i] = '\0'; - } - for (i = strlen(ibuf) -1; i > 0; i--) { - if (ibuf[i] == ' ') - ibuf[i] = '\0'; - else - break; - } if (strlen(ibuf)) { - if (debug) { - syslog(LOG_NOTICE, "recv: \"%s\"", ibuf); - fprintf(stdout, "recv: \"%s\"\n", ibuf); - } if (strcmp(ibuf, (char *)".") == 0) { srv_send((char *)"219 Accepted Global record"); return 0; @@ -1206,9 +1208,8 @@ int cmd_profile(char *buf) { char ibuf[SS_BUFSIZE], *sstep, *rest, *targ, *param, *kwd, *val; - int i, j, rlen, istep, irest; + int j, rlen, istep, irest; float ftarg, fval; - socklen_t fromlen; char *opt; profiles_list *profile, *tmpp; prof_step *step, *olds; @@ -1298,31 +1299,11 @@ for (profile = Config.profiles; profile; profile = profile->next) { if (strcmp(profile->uuid, param) == 0) { while (1) { - memset((char *)&ibuf, 0, SS_BUFSIZE); - fromlen = sizeof(peeraddr_in); - rlen = recvfrom(s, ibuf, sizeof(ibuf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); + rlen = srv_recv(ibuf); if (rlen == -1) { - syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); - srv_send((char *)"518 recfrom(): %s", strerror(errno)); return 1; } - for (i = 0; i < strlen(ibuf); i++) { - if (ibuf[i] == '\n') - ibuf[i] = '\0'; - if (ibuf[i] == '\r') - ibuf[i] = '\0'; - } - for (i = strlen(ibuf) -1; i > 0; i--) { - if (ibuf[i] == ' ') - ibuf[i] = '\0'; - else - break; - } if (strlen(ibuf)) { - if (debug) { - syslog(LOG_NOTICE, "recv: \"%s\"", ibuf); - fprintf(stdout, "recv: \"%s\"\n", ibuf); - } if (strcmp(ibuf, (char *)".") == 0) { srv_send((char *)"219 Accepted Profile record"); return 0; @@ -1384,31 +1365,11 @@ j = 0; while (1) { - memset((char *)&ibuf, 0, SS_BUFSIZE); - fromlen = sizeof(peeraddr_in); - rlen = recvfrom(s, ibuf, sizeof(ibuf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); + rlen = srv_recv(ibuf); if (rlen == -1) { - syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); - srv_send((char *)"518 recfrom(): %s", strerror(errno)); return 1; } else { - for (i = 0; i < strlen(ibuf); i++) { - if (ibuf[i] == '\n') - ibuf[i] = '\0'; - if (ibuf[i] == '\r') - ibuf[i] = '\0'; - } - for (i = strlen(ibuf) -1; i > 0; i--) { - if (ibuf[i] == ' ') - ibuf[i] = '\0'; - else - break; - } if (strlen(ibuf)) { - if (debug) { - syslog(LOG_NOTICE, "recv: \"%s\"", ibuf); - fprintf(stdout, "recv: \"%s\"\n", ibuf); - } if (strcmp(ibuf, (char *)".") == 0) { srv_send((char *)"219 Accepted Profile steps"); @@ -1506,8 +1467,7 @@ { char *opt, *param, *kwd, *val, ibuf[SS_BUFSIZE]; simulator_list *simulator, *tmps; - socklen_t fromlen; - int i, rc, rlen, ival; + int rc, rlen, ival; float fval; uuid_t uu; @@ -1624,31 +1584,11 @@ for (simulator = Config.simulators; simulator; simulator = simulator->next) { if (strcmp(simulator->uuid, param) == 0) { while (1) { - memset((char *)&ibuf, 0, SS_BUFSIZE); - fromlen = sizeof(peeraddr_in); - rlen = recvfrom(s, ibuf, sizeof(ibuf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); + rlen = srv_recv(ibuf); if (rlen == -1) { - syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); - srv_send((char *)"518 recfrom(): %s", strerror(errno)); return 1; } - for (i = 0; i < strlen(ibuf); i++) { - if (ibuf[i] == '\n') - ibuf[i] = '\0'; - if (ibuf[i] == '\r') - ibuf[i] = '\0'; - } - for (i = strlen(ibuf) -1; i > 0; i--) { - if (ibuf[i] == ' ') - ibuf[i] = '\0'; - else - break; - } if (strlen(ibuf)) { - if (debug) { - syslog(LOG_NOTICE, "recv: \"%s\"", ibuf); - fprintf(stdout, "recv: \"%s\"\n", ibuf); - } if (strcmp(ibuf, (char *)".") == 0) { srv_send((char *)"219 Accepted Simulator record"); return 0; @@ -1820,6 +1760,12 @@ if (current->profile) free(current->profile); current->profile = NULL; + if (current->PID_cool) + free(current->PID_cool); + current->PID_cool = NULL; + if (current->PID_heat) + free(current->PID_heat); + current->PID_heat = NULL; free(current); return 1; } else { @@ -1854,6 +1800,12 @@ if (current->profile) free(current->profile); current->profile = NULL; + if (current->PID_cool) + free(current->PID_cool); + current->PID_cool = NULL; + if (current->PID_heat) + free(current->PID_heat); + current->PID_heat = NULL; previous->next = current->next; free(current); current = previous->next; @@ -1881,7 +1833,6 @@ char *opt, *param = NULL, *kwd, *val, ibuf[SS_BUFSIZE]; units_list *unit, *tmpu; uuid_t uu; - socklen_t fromlen; int ival, i, rc, rlen; float fval; @@ -1931,11 +1882,12 @@ unit->heater_usage = unit->cooler_usage = unit->fan_usage = unit->light_usage = 0; unit->temp_set_min = 1.0; unit->temp_set_max = 30.0; - unit->idle_rangeH = 1.0; - unit->idle_rangeL = -1.0; unit->prof_started = unit->prof_paused = unit->prof_primary_done = (time_t)0; unit->prof_percent = 0; - unit->PID_dState = unit->PID_iState = unit->PID_Kp = unit->PID_Kd = unit->PID_Ki = 0.0; + unit->PID_cool = (pid_var *)malloc(sizeof(pid_var)); + unit->PID_heat = (pid_var *)malloc(sizeof(pid_var)); + InitPID(unit->PID_cool, PID_TYPE_COOL); + InitPID(unit->PID_heat, PID_TYPE_HEAT); /* * Block main process @@ -2011,10 +1963,24 @@ srv_send((char *)"HEATER_STATE,%d", unit->heater_state); srv_send((char *)"HEATER_DELAY,%d", unit->heater_delay); srv_send((char *)"HEATER_USAGE,%d", unit->heater_usage); + if (unit->PID_heat) { + srv_send((char *)"PIDH_IMAX,%.1f", unit->PID_heat->iMax); + srv_send((char *)"PIDH_PGAIN,%.2f", unit->PID_heat->pGain); + srv_send((char *)"PIDH_IGAIN,%.2f", unit->PID_heat->iGain); + srv_send((char *)"PIDH_DGAIN,%.2f", unit->PID_heat->dGain); + srv_send((char *)"PIDH_IDLERANGE,%.2f", unit->PID_heat->idleRange); + } srv_send((char *)"COOLER_ADDRESS,%s", unit->cooler_address); srv_send((char *)"COOLER_STATE,%d", unit->cooler_state); srv_send((char *)"COOLER_DELAY,%d", unit->cooler_delay); srv_send((char *)"COOLER_USAGE,%d", unit->cooler_usage); + if (unit->PID_cool) { + srv_send((char *)"PIDC_IMAX,%.1f", unit->PID_cool->iMax); + srv_send((char *)"PIDC_PGAIN,%.2f", unit->PID_cool->pGain); + srv_send((char *)"PIDC_IGAIN,%.2f", unit->PID_cool->iGain); + srv_send((char *)"PIDC_DGAIN,%.2f", unit->PID_cool->dGain); + srv_send((char *)"PIDC_IDLERANGE,%.2f", unit->PID_cool->idleRange); + } srv_send((char *)"FAN_ADDRESS,%s", unit->fan_address); srv_send((char *)"FAN_STATE,%d", unit->fan_state); srv_send((char *)"FAN_DELAY,%d", unit->fan_delay); @@ -2043,11 +2009,6 @@ srv_send((char *)"PROF_PRIMARY_DONE,%d", (int)unit->prof_primary_done); srv_send((char *)"TEMP_SET_MIN,%.1f", unit->temp_set_min); srv_send((char *)"TEMP_SET_MAX,%.1f", unit->temp_set_max); - srv_send((char *)"IDLE_RANGE_L,%.2f", unit->idle_rangeL); - srv_send((char *)"IDLE_RANGE_H,%.2f", unit->idle_rangeH); - srv_send((char *)"PID_KP,%.2f", unit->PID_Kp); - srv_send((char *)"PID_KI,%.2f", unit->PID_Ki); - srv_send((char *)"PID_KD,%.2f", unit->PID_Kd); srv_send((char *)"."); return 1; } @@ -2057,36 +2018,28 @@ } if (strcmp(opt, (char *)"PUT") == 0) { + /* + * Block main process + */ + run_pause = TRUE; + for (;;) { + usleep(100000); + if (run_hold) + break; + } + for (unit = Config.units ; unit; unit = unit->next) { if (strcmp(unit->uuid, param) == 0) { while (1) { - memset((char *)&ibuf, 0, SS_BUFSIZE); - fromlen = sizeof(peeraddr_in); - rlen = recvfrom(s, ibuf, sizeof(ibuf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); + rlen = srv_recv(ibuf); if (rlen == -1) { - syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); - srv_send((char *)"518 recfrom(): %s", strerror(errno)); + run_pause = FALSE; return 1; } - for (i = 0; i < strlen(ibuf); i++) { - if (ibuf[i] == '\n') - ibuf[i] = '\0'; - if (ibuf[i] == '\r') - ibuf[i] = '\0'; - } - for (i = strlen(ibuf) -1; i > 0; i--) { - if (ibuf[i] == ' ') - ibuf[i] = '\0'; - else - break; - } if (strlen(ibuf)) { - if (debug) { - syslog(LOG_NOTICE, "recv: \"%s\"", ibuf); - fprintf(stdout, "recv: \"%s\"\n", ibuf); - } if (strcmp(ibuf, (char *)".") == 0) { srv_send((char *)"219 Accepted Unit record"); + run_pause = FALSE; return 0; } kwd = strtok(ibuf, ",\0"); @@ -2281,7 +2234,8 @@ syslog(LOG_NOTICE, "Fermenter unit %s mode %s to %s", unit->uuid, UNITMODE[unit->mode], UNITMODE[i]); unit->mode = i; /* Allways turn everything off after a mode change */ - unit->PID_iState = unit->PID_dState = 0.0; + unit->PID_cool->OutP = unit->PID_heat->OutP = 0.0; + unit->PID_cool->Mode = unit->PID_heat->Mode = PID_MODE_NONE; unit->heater_state = unit->cooler_state = unit->fan_state = unit->light_state = 0; unit->heater_wait = unit->cooler_wait = unit->fan_wait = unit->light_wait = 0; device_out(unit->heater_address, unit->heater_state); @@ -2313,25 +2267,74 @@ unit->beer_set = fval; } - } else if (val && (strcmp(kwd, (char *)"PID_KP") == 0)) { + } else if (val && (strcmp(kwd, (char *)"PIDC_IMAX") == 0)) { + if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { + if (unit->PID_cool->iMax != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PID_cool iGain %.1f to %.1f", unit->uuid, unit->PID_cool->iMax, fval); + unit->PID_cool->iMax = fval; + } + + } else if (val && (strcmp(kwd, (char *)"PIDC_PGAIN") == 0)) { if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { - if (unit->PID_Kp != fval) - syslog(LOG_NOTICE, "Fermenter unit %s PID Kp %.2f to %.2f", unit->uuid, unit->PID_Kp, fval); - unit->PID_Kp = fval; + if (unit->PID_cool->pGain != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PID_cool pGain %.2f to %.2f", unit->uuid, unit->PID_cool->pGain, fval); + unit->PID_cool->pGain = fval; + } + + } else if (val && (strcmp(kwd, (char *)"PIDC_DGAIN") == 0)) { + if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { + if (unit->PID_cool->dGain != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PID_cool dGain %.2f to %.2f", unit->uuid, unit->PID_cool->dGain, fval); + unit->PID_cool->dGain = fval; + } + + } else if (val && (strcmp(kwd, (char *)"PIDC_IGAIN") == 0)) { + if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { + if (unit->PID_cool->iGain != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PID_cool iGain %.2f to %.2f", unit->uuid, unit->PID_cool->iGain, fval); + unit->PID_cool->iGain = fval; } - } else if (val && (strcmp(kwd, (char *)"PID_KD") == 0)) { + } else if (val && (strcmp(kwd, (char *)"PIDC_IDLERANGE") == 0)) { + if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { + if (unit->PID_cool->idleRange != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PID_cool idleRange %.2f to %.2f", unit->uuid, unit->PID_cool->idleRange, fval); + unit->PID_cool->idleRange = fval; + } + + } else if (val && (strcmp(kwd, (char *)"PIDH_IMAX") == 0)) { if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { - if (unit->PID_Kd != fval) - syslog(LOG_NOTICE, "Fermenter unit %s PID Kd %.2f to %.2f", unit->uuid, unit->PID_Kd, fval); - unit->PID_Kd = fval; + if (unit->PID_heat->iMax != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PID_heat iGain %.1f to %.1f", unit->uuid, unit->PID_heat->iMax, fval); + unit->PID_heat->iMax = fval; + } + + } else if (val && (strcmp(kwd, (char *)"PIDH_PGAIN") == 0)) { + if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { + if (unit->PID_heat->pGain != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PID_heat pGain %.2f to %.2f", unit->uuid, unit->PID_heat->pGain, fval); + unit->PID_heat->pGain = fval; } - - } else if (val && (strcmp(kwd, (char *)"PID_KI") == 0)) { + + } else if (val && (strcmp(kwd, (char *)"PIDH_DGAIN") == 0)) { + if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { + if (unit->PID_heat->dGain != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PID_heat dGain %.2f to %.2f", unit->uuid, unit->PID_heat->dGain, fval); + unit->PID_heat->dGain = fval; + } + + } else if (val && (strcmp(kwd, (char *)"PIDH_IGAIN") == 0)) { if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { - if (unit->PID_Ki != fval) - syslog(LOG_NOTICE, "Fermenter unit %s PID Ki %.2f to %.2f", unit->uuid, unit->PID_Ki, fval); - unit->PID_Ki = fval; + if (unit->PID_heat->iGain != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PIH_heat iGain %.2f to %.2f", unit->uuid, unit->PID_heat->iGain, fval); + unit->PID_heat->iGain = fval; + } + + } else if (val && (strcmp(kwd, (char *)"PIDH_IDLERANGE") == 0)) { + if ((sscanf(val, "%f", &fval) == 1) && (fval >= 0.0)) { + if (unit->PID_heat->idleRange != fval) + syslog(LOG_NOTICE, "Fermenter unit %s PID_heat idleRange %.2f to %.2f", unit->uuid, unit->PID_heat->idleRange, fval); + unit->PID_heat->idleRange = fval; } } else if (strcmp(kwd, (char *)"PROFILE") == 0) { @@ -2351,7 +2354,8 @@ /* * Reset all output devices */ - unit->PID_iState = unit->PID_dState = 0.0; + unit->PID_cool->OutP = unit->PID_heat->OutP = 0.0; + unit->PID_cool->Mode = unit->PID_heat->Mode = PID_MODE_NONE; unit->heater_state = unit->cooler_state = unit->fan_state = unit->light_state = 0; unit->heater_wait = unit->cooler_wait = unit->fan_wait = unit->light_wait = 0; device_out(unit->heater_address, unit->heater_state); @@ -2411,20 +2415,6 @@ unit->temp_set_max = fval; } - } else if (val && (strcmp(kwd, (char *)"IDLE_RANGE_L") == 0)) { - if (sscanf(val, "%f", &fval) == 1) { - if (unit->idle_rangeL != fval) - syslog(LOG_NOTICE, "Fermenter unit %s idle range low %.2f to %.2f", unit->uuid, unit->idle_rangeL, fval); - unit->idle_rangeL = fval; - } - - } else if (val && (strcmp(kwd, (char *)"IDLE_RANGE_H") == 0)) { - if (sscanf(val, "%f", &fval) == 1) { - if (unit->idle_rangeH != fval) - syslog(LOG_NOTICE, "Fermenter unit %s idle range high %.2f to %.2f", unit->uuid, unit->idle_rangeH, fval); - unit->idle_rangeH = fval; - } - } } } @@ -2432,6 +2422,7 @@ } } srv_send((char *)"440 No such unit"); + run_pause = FALSE; return 1; } @@ -2444,33 +2435,11 @@ void cmd_server(void) { char buf[SS_BUFSIZE]; - int i, rlen; - socklen_t fromlen; + int rlen; - memset((char *)&buf, 0, SS_BUFSIZE); - fromlen = sizeof(peeraddr_in); - rlen = recvfrom(s, buf, sizeof(buf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); - if (rlen == -1) { - syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); - } else { - for (i = 0; i < strlen(buf); i++) { - if (buf[i] == '\n') - buf[i] = '\0'; - if (buf[i] == '\r') - buf[i] = '\0'; - } - for (i = strlen(buf) -1; i > 0; i--) { - if (buf[i] == ' ') - buf[i] = '\0'; - else - break; - } + rlen = srv_recv(buf); + if (rlen != -1) { if (strlen(buf)) { - if (debug) { - syslog(LOG_NOTICE, "recv: \"%s\"", buf); - fprintf(stdout, "recv: \"%s\"\n", buf); - } - /* * Process commands from the client */