thermferm/server.c

changeset 174
244de612c572
parent 170
3cb99272b84b
child 175
b73490398368
--- 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");

mercurial