thermferm/devices.c

changeset 716
5c30c8ef83a8
parent 715
f5d85af156ab
child 724
01e3936f62d4
--- a/thermferm/devices.c	Wed May 01 14:38:37 2024 +0200
+++ b/thermferm/devices.c	Thu May 02 15:49:16 2024 +0200
@@ -40,6 +40,9 @@
 extern const char	DEVPRESENT[4][6];
 extern const char	DEVDIR[7][11];
 
+#ifdef USE_SIMULATOR
+extern int		my_simulator_state;
+#endif
 
 
 /*
@@ -306,6 +309,7 @@
 
 #ifdef USE_SIMULATOR
 		if ((device->type == DEVTYPE_SIM) && (device->direction == DEVDIR_OUT_BIN)) {
+		    while (my_simulator_state == THREAD_PAUSE) { mDelay(20); };
 		    for (simulator = Config.simulators; simulator; simulator = simulator->next) {
 			if ((strcmp(device->address, simulator->cooler_address) == 0) ||
 			    (strcmp(device->address, simulator->heater_address) == 0) ||
@@ -715,20 +719,22 @@
 #ifdef USE_SIMULATOR
 
     for (simulator = Config.simulators; simulator; simulator = simulator->next) {
-	for (i = 0; i < 10; i++) {
+	for (i = 0; i < 12; i++) {
 
 	    found = FALSE;
             for (device = Config.devices; device; device = device->next) {
-            	if ((i == 0 && strcmp(device->address, simulator->room_tempaddress) == 0) ||
-		    (i == 1 && strcmp(device->address, simulator->air_address) == 0) ||
-		    (i == 2 && strcmp(device->address, simulator->beer_address) == 0) ||
-		    (i == 3 && strcmp(device->address, simulator->heater_address) == 0) ||
-		    (i == 4 && strcmp(device->address, simulator->cooler_address) == 0) ||
-		    (i == 5 && strcmp(device->address, simulator->room_humaddress) == 0) ||
-		    (i == 6 && strcmp(device->address, simulator->chiller_address) == 0) ||
-		    (i == 7 && strcmp(device->address, simulator->fan_address) == 0) ||
-		    (i == 8 && strcmp(device->address, simulator->light_address) == 0) ||
-		    (i == 9 && strcmp(device->address, simulator->beer_address2) == 0)) {
+            	if ((i == 0  && strcmp(device->address, simulator->room_tempaddress) == 0) ||
+		    (i == 1  && strcmp(device->address, simulator->air_address) == 0) ||
+		    (i == 2  && strcmp(device->address, simulator->beer_address) == 0) ||
+		    (i == 3  && strcmp(device->address, simulator->heater_address) == 0) ||
+		    (i == 4  && strcmp(device->address, simulator->cooler_address) == 0) ||
+		    (i == 5  && strcmp(device->address, simulator->room_humaddress) == 0) ||
+		    (i == 6  && strcmp(device->address, simulator->chiller_address) == 0) ||
+		    (i == 7  && strcmp(device->address, simulator->fan_address) == 0) ||
+		    (i == 8  && strcmp(device->address, simulator->light_address) == 0) ||
+		    (i == 9  && strcmp(device->address, simulator->beer_address2) == 0) ||
+		    (i == 10 && strcmp(device->address, simulator->door_address) == 0) ||
+		    (i == 11 && strcmp(device->address, simulator->psu_address) == 0)) {
                     found = TRUE;
                     break;
             	}
@@ -800,6 +806,16 @@
 				ndev->description = xstrcpy((char *)"Simulated beer temperature (alt)");
 				ndev->present = simulator->beer_present2;
 				break;
+		    case 10:	ndev->direction = DEVDIR_IN_BIN;
+				ndev->address = xstrcpy(simulator->door_address);
+				ndev->description = xstrcpy((char *)"Simulated fridge door");
+				ndev->present = simulator->door_present;
+				break;
+		    case 11:	ndev->direction = DEVDIR_IN_BIN;
+				ndev->address = xstrcpy(simulator->psu_address);
+				ndev->description = xstrcpy((char *)"Simulated PSU status");
+				ndev->present = simulator->psu_present;
+				break;
 		}
 
 		syslog(LOG_NOTICE, "New Simulator device %s, subdevice %d", ndev->address, ndev->subdevice);
@@ -960,46 +976,60 @@
 #endif
 #ifdef USE_SIMULATOR
 		case DEVTYPE_SIM:
+			while (my_simulator_state == THREAD_PAUSE) { mDelay(20); };
 //			pthread_mutex_lock(&mutexes[LOCK_DEVICES]);
-			if (Config.simulators) {
+			for (simulator = Config.simulators; simulator; simulator = simulator->next) {
 			    int		val;
 
-			    simulator = Config.simulators;
-			    if (device->subdevice == 0) {
+			    if (strcmp(simulator->room_tempaddress, device->address) == 0) {
 				val = (int)((int)(simulator->room_temperature * 1000) / 500) * 500;
 				if (device->value != val) {
 			    	    device->value = val;
 			    	    device->timestamp = time(NULL);
 				    changed = true;
 				}
-			    } else if (device->subdevice == 1) {
-				val = (int)((int)(simulator->air_temperature * 1000) / 62.5) * 62.5;
+			    } else if (strcmp(simulator->air_address, device->address) == 0) {
+				val = (int)((int)((simulator->air_temperature * 1000) + 31.25) / 62.5) * 62.5;
 				if (device->value != val) {
 			    	    device->value = val;
 			    	    device->timestamp = time(NULL);
 				    changed = true;
 				}
-			    } else if (device->subdevice == 2) {
-				val = (int)((int)(simulator->beer_temperature * 1000) / 62.5) * 62.5;
+			    } else if (strcmp(simulator->beer_address, device->address) == 0) {
+				val = (int)((int)((simulator->beer_temperature * 1000) + 31.25) / 62.5) * 62.5;
 				if (device->value != val) {
 			    	    device->value = val;
 			    	    device->timestamp = time(NULL);
 				    changed = true;
 				}
-			    } else if (device->subdevice == 5) {
+			    } else if (strcmp(simulator->room_humaddress, device->address) == 0) {
 				val = (int)((int)(simulator->room_humidity * 1000) / 500) * 500;
 				if (device->value != val) {
 				    device->value = val;
 				    device->timestamp = time(NULL);
 				    changed = true;
 				}
-			    } else if (device->subdevice == 6) {
+			    } else if (strcmp(simulator->chiller_address, device->address) == 0) {
 				val = (int)((int)(simulator->chiller_temperature * 1000) / 62.5) * 62.5;
 				if (device->value != val) {
 				    device->value = val;
 				    device->timestamp = time(NULL);
 				    changed = true;
 				}
+			    } else if (strcmp(simulator->door_address, device->address) == 0) {
+				val = simulator->door_value;
+				if (device->value != val) {
+				    device->value = val;
+				    device->timestamp = time(NULL);
+				    changed = true;
+				}
+			    } else if (strcmp(simulator->psu_address, device->address) == 0) {
+				val = simulator->psu_value;
+				if (device->value != val) {
+                                    device->value = val;
+                                    device->timestamp = time(NULL);
+                                    changed = true;
+                                }
 			    }
 			}
 //			pthread_mutex_unlock(&mutexes[LOCK_DEVICES]);

mercurial