--- a/thermferm/server.c Fri Aug 01 22:53:58 2014 +0200 +++ b/thermferm/server.c Sat Aug 02 22:33:15 2014 +0200 @@ -38,6 +38,10 @@ extern const char UNITMODE[5][8]; extern const char UNITmode[5]; extern const char TEMPSTATE[3][8]; +extern const char DEVTYPE[7][6]; +extern const char DEVPRESENT[4][6]; +extern const char DEVDIR[7][11]; + int s; /* connected socket */ int ls; /* listen socket */ @@ -277,81 +281,263 @@ +int delete_Device(char *uuid) +{ + devices_list *current = Config.devices; + devices_list *previous = NULL; + + while (current) { + if (strcmp(current->uuid, uuid) == 0) { + if (previous == NULL) { + Config.devices = current->next; + free(current->uuid); + current->uuid = NULL; + free(current->address); + current->address = NULL; + free(current->description); + current->description = NULL; + free(current->comment); + current->comment = NULL; + free(current); + return 1; + } else { + free(current->uuid); + current->uuid = NULL; + free(current->address); + current->address = NULL; + free(current->description); + current->description = NULL; + free(current->comment); + current->comment = NULL; + previous->next = current->next; + free(current); + current = previous->next; + return 1; + } + } else { + previous = current; + current = current->next; + } + } + return 0; +} + + + /* - * GET AIR uuid - * GET BEER uuid - * GET LED1 uuid - * GET LED2 uuid - * GET LED3 uuid - * GET MODE uuid - * GET TARGET uuid + * DEVICE ADD type + * DEVICE DEL uuid + * DEVICE LIST + * DEVICE GET uuid + * DEVICE PUT uuid */ -int cmd_get(char *buf) +int cmd_device(char *buf) { - char *opt, *uuid; - units_list *unit; + char *opt, *param, *kwd, *val, ibuf[SS_BUFSIZE]; + devices_list *device, *tmpd; + socklen_t fromlen; + int i, rlen, ival; + uuid_t uu; opt = strtok(buf, " \0"); opt = strtok(NULL, " \0"); - uuid = strtok(NULL, "\0"); + + if (opt == NULL) { + srv_send((char *)"502 Missing command option"); + return 1; + } + param = strtok(NULL, "\0"); - if (uuid == NULL) { - srv_send((char *)"502 Missing command option"); + if (strcmp(opt, (char *)"LIST") == 0) { + srv_send((char *)"212 bus devices:"); + for (device = Config.devices; device; device = device->next) { + srv_send((char *)"%s,%s,%d,%d,%s", device->uuid, device->address, device->subdevice, device->inuse, device->comment); + } + srv_send((char *)"."); + return 0; + } + + if (param == NULL) { + srv_send((char *)"502 Missing command parameter"); return 1; } - for (unit = Config.units; unit; unit = unit->next) { - if (strcmp(uuid, unit->uuid) == 0) { - - if (strcmp(opt, (char *)"AIR") == 0) { - if (unit->air_state == 0) - srv_send((char *)"215 AIR,%.3f", unit->air_temperature / 1000.0); - else - srv_send((char *)"215 AIR,NA"); - return 0; - - } else if (strcmp(opt, (char *)"BEER") == 0) { - if (unit->beer_state == 0) - srv_send((char *)"215 BEER,%.3f", unit->beer_temperature / 1000.0); - else - srv_send((char *)"215 BEER,NA"); - return 0; - - } else if (strcmp(opt, (char *)"LED1") == 0) { - srv_send((char *)"215 HEATER,%d", (unit->heater_available && unit->heater_state) ? 1:0); - return 0; + if (strcmp(opt, (char *)"ADD") == 0) { + if ((strcmp(param, (char *)"RC433") == 0) || (strcmp(param, (char *)"DHT") == 0) || + (strcmp(param, (char *)"I2C") == 0) || (strcmp(param, (char *)"SPI") == 0)) { - } else if (strcmp(opt, (char *)"LED2") == 0) { - srv_send((char *)"215 COOLER,%d", (unit->cooler_available && unit->cooler_state) ? 1:0); - return 0; - - } else if (strcmp(opt, (char *)"LED3") == 0) { - srv_send((char *)"215 FAN,%d", (unit->fan_available && unit->fan_state) ? 1:0); - return 0; - - } else if (strcmp(opt, (char *)"MODE") == 0) { - srv_send((char *)"215 MODE,%s", UNITMODE[unit->mode]); - return 0; + device = (devices_list *)malloc(sizeof(devices_list)); + device->next = NULL; + device->version = 1; + device->uuid = malloc(37); + uuid_generate(uu); + uuid_unparse(uu, device->uuid); + for (i = 0; i < 7; i++) { + if (strcmp(param, DEVTYPE[i]) == 0) { + device->type = i; + break; + } + } + device->direction = DEVDIR_UNDEF; + device->value = device->subdevice = device->inuse = 0; + device->present = DEVPRESENT_UNDEF; + device->address = xstrcpy((char *)"Enter address here"); + device->gpiopin = -1; + device->description = xstrcpy((char *)"Describe me here"); + device->comment = xstrcpy((char *)"Comment here"); - } else if (strcmp(opt, (char *)"TARGET") == 0) { - if (unit->mode == UNITMODE_BEER) { - srv_send((char *)"215 TARGET,%.3f", unit->beer_set); - } else if (unit->mode == UNITMODE_FRIDGE) { - srv_send((char *)"215 TARGET,%.3f", unit->fridge_set); - } else if (unit->mode == UNITMODE_PROFILE) { - srv_send((char *)"215 TARGET,%.3f", unit->prof_target); - } else { - srv_send((char *)"215 TARGET,NA"); + if (Config.devices == NULL) { + Config.devices = device; + } else { + for (tmpd = Config.devices; tmpd; tmpd = tmpd->next) { + if (tmpd->next == NULL) { + tmpd->next = device; + break; + } } - return 0; } + syslog(LOG_NOTICE, "Device with uuid %s added", device->uuid); + srv_send((char *)"211 Device with uuid %s added", device->uuid); + return 0; - srv_send((char *)"502 Unknown command option"); + } else { + srv_send((char *)"506 Wrong device parameter"); return 1; } } - srv_send((char *)"440 No such profile"); + if (strcmp(opt, (char *)"DEL") == 0) { + + if (delete_Device(param)) { + syslog(LOG_NOTICE, "Deleted device with %s", param); + srv_send((char *)"211 Device %s deleted", param); + return 0; + } else { + srv_send((char *)"440 Delete Device: No such device %s", param); + return 1; + } + } + + if (strcmp(opt, (char *)"GET") == 0) { + for (device = Config.devices; device; device = device->next) { + if (strcmp(device->uuid, param) == 0) { + srv_send((char *)"213 Device %s record follows:", device->uuid); + srv_send((char *)"TYPE,%s", DEVTYPE[device->type]); + srv_send((char *)"DIRECTION,%s", DEVDIR[device->direction]); + srv_send((char *)"VALUE,%d", device->value); + srv_send((char *)"PRESENT,%s", DEVPRESENT[device->present]); + srv_send((char *)"ADDRESS,%s", device->address); + srv_send((char *)"SUBDEVICE,%d", device->subdevice); + srv_send((char *)"GPIOPIN,%d", device->gpiopin); + srv_send((char *)"DESCRIPTION,%s", device->description); + srv_send((char *)"INUSE,%d", device->inuse); + srv_send((char *)"COMMENT,%s", device->comment); + srv_send((char *)"TIMESTAMP,%d", (int)device->timestamp); + srv_send((char *)"."); + return 1; + } + } + srv_send((char *)"440 No such device"); + return 1; + } + + if (strcmp(opt, (char *)"PUT") == 0) { + 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)); + 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; + } + kwd = strtok(ibuf, ",\0"); + val = strtok(NULL, "\0"); + if (kwd && val) { + if (strcmp(kwd, (char *)"TYPE") == 0) { + for (i = 0; i < 7; i++) { + if (strcmp(val, DEVTYPE[i]) == 0) { + device->type = i; + break; + } + } + + } else if (strcmp(kwd, (char *)"DIRECTION") == 0) { + for (i = 0; i < 7; i++) { + if (strcmp(val, DEVDIR[i]) == 0) { + device->direction = i; + break; + } + } + + } else if (strcmp(kwd, (char *)"VALUE") == 0) { + if (sscanf(val, "%d", &ival) == 1) + device->value = ival; + + } else if (strcmp(kwd, (char *)"PRESENT") == 0) { + for (i = 0; i < 4; i++) { + if (strcmp(val, DEVPRESENT[i]) == 0) + device->present = i; + break; + } + + } else if (strcmp(kwd, (char *)"ADDRESS") == 0) { + if (device->address) + free(device->address); + device->address = xstrcpy(val); + + } else if (strcmp(kwd, (char *)"SUBDEVICE") == 0) { + if (sscanf(val, "%d", &ival) == 1) + device->subdevice = ival; + + } else if (strcmp(kwd, (char *)"GPIOPIN") == 0) { + if (sscanf(val, "%d", &ival) == 1) + device->gpiopin = ival; + + } else if (strcmp(kwd, (char *)"DESCRIPTION") == 0) { + if (device->description) + free(device->description); + device->description = xstrcpy(val); + + } else if (strcmp(kwd, (char *)"COMMENT") == 0) { + if (device->comment) + free(device->comment); + device->comment = xstrcpy(val); + + } + } + } + } + } + } + srv_send((char *)"440 No such device"); + return 1; + } + + srv_send((char *)"502 Unknown command option"); return 1; } @@ -359,7 +545,6 @@ /* * LIST - * LIST BUS * LIST LOG * LIST PROFILES * LIST UNIT @@ -370,7 +555,6 @@ units_list *unit; profiles_list *profile; prof_step *step; - devices_list *device; int j; FILE *fp; @@ -388,17 +572,6 @@ srv_send((char *)"."); return 0; - } else if (strcmp(opt, (char *)"BUS") == 0) { - /* - * Bus devices - */ - srv_send((char *)"212 bus devices:"); - for (device = Config.devices; device; device = device->next) { - srv_send((char *)"%s,%s,%d,%d,%s", device->uuid, device->address, device->subdevice, device->inuse, device->comment); - } - srv_send((char *)"."); - return 0; - } else if (strcmp(opt, (char *)"LOG") == 0) { /* * Get the logfile data and emit only one line per hour. @@ -1007,8 +1180,9 @@ } else if (strncmp(buf, "DEL", 3) == 0) { if (cmd_del(buf) == 0) wrconfig(); - } else if (strncmp(buf, "GET", 3) == 0) { - cmd_get(buf); + } else if (strncmp(buf, "DEVICE", 6) == 0) { + if (cmd_device(buf) == 0) + wrconfig(); } else if (strncmp(buf, "HELP", 4) == 0) { srv_send((char *)"100 Help text follows"); srv_send((char *)"Recognized commands:"); @@ -1018,19 +1192,13 @@ srv_send((char *)"ADD UNIT name Add a new unit with \"name\""); srv_send((char *)"DEL PROFILE uuid Delete profile with uuid"); // srv_send((char *)"DEL UNIT uuid Delete unit with uuid"); - srv_send((char *)"GET AIR uuid Get Air temperature with uuid"); - srv_send((char *)"GET BEER uuid Get Beer temperature with uuid"); - srv_send((char *)"GET LED1 uuid Get LED 1 (cooler) state"); - srv_send((char *)"GET LED2 uuid Get LED 2 (heater) state"); - srv_send((char *)"GET LED3 uuid Get LED 3 (fan) state"); - srv_send((char *)"GET MODE uuid Get Unit Mode"); -// srv_send((char *)"GET SW1 uuid Get Switch 1 (cooler) state"); -// srv_send((char *)"GET SW2 uuid Get Switch 2 (heater) state"); -// srv_send((char *)"GET SW3 uuid Get Switch 3 (fan) state"); - srv_send((char *)"GET TARGET uuid Get Target temperature with uuid"); + srv_send((char *)"DEVICE ADD type Add new Device type"); +// srv_send((char *)"DEVICE DEL uuid Delete Device by uuid"); + srv_send((char *)"DEVICE LIST List Devices"); + srv_send((char *)"DEVICE GET uuid Get Device record by uuid"); + srv_send((char *)"DEVICE PUT uuid Put Device record by uuid"); srv_send((char *)"LCD Get LCD screen (allways 4 rows of 20 characters)"); srv_send((char *)"LIST List all fermenter units"); - srv_send((char *)"LIST BUS List 1-wire bus"); srv_send((char *)"LIST LOG List logfile data in 1 hour lines"); srv_send((char *)"LIST PROFILES List available profiles"); srv_send((char *)"LIST UNIT List fermenter unit");