From fd1b2206d050e4c6bfb6935c26b78e1156fea191 Mon Sep 17 00:00:00 2001
From: Martin Killenberg <martin.killenberg@desy.de>
Date: Fri, 3 Nov 2023 23:08:53 +0100
Subject: [PATCH] fix: simlated state is not shared between processes

---
 Python_script/VNA_dummy.py              | 18 +++++-----
 Python_script/climate_chamber_dummy.py  | 44 ++++++++++++-------------
 Python_script/shared_simulated_state.py |  8 +++--
 Python_script/virtual_time.py           |  5 +--
 4 files changed, 39 insertions(+), 36 deletions(-)

diff --git a/Python_script/VNA_dummy.py b/Python_script/VNA_dummy.py
index 1429a03..2153e5f 100644
--- a/Python_script/VNA_dummy.py
+++ b/Python_script/VNA_dummy.py
@@ -29,7 +29,7 @@ class VnaDummy:
         self.simulated_magnitude_difference_hum = 0.0
         self.simulated_phase_difference_hum = 0.0
         self.simulated_state = shared_simulated_state.get_simulated_state()
-        self.last_simulated_time = self.simulated_state.simulated_time
+        self.last_simulated_time = self.simulated_state.simulated_time.value
         self.tau_mag_temp = 25  # change rate of magnitude in dependence on temperature
         self.tau_phase_temp = 35  # change rate of phase in dependence on temperature
         self.tau_mag_hum = 250  # change rate of magnitude in dependence on humidity
@@ -47,19 +47,19 @@ class VnaDummy:
     def run_simulation(self):
         self.simulate_magnitude()
         self.simulate_phase()
-        self.last_simulated_time = self.simulated_state.simulated_time
+        self.last_simulated_time = self.simulated_state.simulated_time.value
 
     def simulate_magnitude(self):
 
         target_magnitude_difference_temp = self.magnitude_slope_temp * \
-                                           (self.simulated_state.simulated_temperature - self.reference_temp)
+                                           (self.simulated_state.simulated_temperature.value - self.reference_temp)
         delta_magnitude_temp = target_magnitude_difference_temp - self.simulated_magnitude_difference_temp
 
         target_magnitude_difference_hum = self.magnitude_slope_hum * \
-                                          (self.simulated_state.simulated_humidity - self.reference_hum)
+                                          (self.simulated_state.simulated_humidity.value - self.reference_hum)
         delta_magnitude_hum = target_magnitude_difference_hum - self.simulated_magnitude_difference_hum
 
-        delta_time = self.simulated_state.simulated_time - self.last_simulated_time
+        delta_time = self.simulated_state.simulated_time.value - self.last_simulated_time
 
         self.simulated_magnitude_difference_temp = self.simulated_magnitude_difference_temp + \
                                                    delta_magnitude_temp * \
@@ -71,13 +71,13 @@ class VnaDummy:
     def simulate_phase(self):
 
         target_phase_difference_temp = self.phase_slope_temp * \
-                                       (self.simulated_state.simulated_temperature - self.reference_temp)
+                                       (self.simulated_state.simulated_temperature.value - self.reference_temp)
         delta_phase_temp = target_phase_difference_temp - self.simulated_phase_difference_temp
         target_phase_difference_hum = self.phase_slope_hum * \
-                                      (self.simulated_state.simulated_humidity - self.reference_hum)
+                                      (self.simulated_state.simulated_humidity.value - self.reference_hum)
         delta_phase_hum = target_phase_difference_hum - self.simulated_phase_difference_hum
 
-        delta_time = self.simulated_state.simulated_time - self.last_simulated_time
+        delta_time = self.simulated_state.simulated_time.value - self.last_simulated_time
 
         self.simulated_phase_difference_temp = self.simulated_phase_difference_temp + \
                                                delta_phase_temp * \
@@ -138,7 +138,7 @@ class VnaDummy:
         for i in range(50):
             measurment_string += str(real_val) + ',' + str(imaginary_val) + ','
         # doing the measurement and reading out some time
-        self.simulated_state.simulated_time += self.communication_delay
+        self.simulated_state.simulated_time.value += self.communication_delay
         # removed last comma by adding slicing([:-1])
         return measurment_string[:-1]
 
diff --git a/Python_script/climate_chamber_dummy.py b/Python_script/climate_chamber_dummy.py
index e98f919..6182e38 100644
--- a/Python_script/climate_chamber_dummy.py
+++ b/Python_script/climate_chamber_dummy.py
@@ -22,10 +22,10 @@ class ClimateChamberDummy:
         # store the credentials so that methods can access them
         self.target_accuracy = target_accuracy
         self.simulated_state = shared_simulated_state.get_simulated_state()
-        self.last_simulation_time = self.simulated_state.simulated_time
+        self.last_simulation_time = self.simulated_state.simulated_time.value
         self.simulated_mode = 'OFF'
-        self.target_temperature = self.simulated_state.simulated_temperature
-        self.target_humidity = self.simulated_state.simulated_humidity
+        self.target_temperature = self.simulated_state.simulated_temperature.value
+        self.target_humidity = self.simulated_state.simulated_humidity.value
         self.temperature_slope = 0.1  # 0.1 degrees/second
         self.humidity_slope = 0.5  # degrees/second
         self.communication_delay = 0.3
@@ -33,55 +33,55 @@ class ClimateChamberDummy:
     def run_simulation(self):
         self.simulate_temp()
         self.simulate_hum()
-        self.last_simulation_time = self.simulated_state.simulated_time
+        self.last_simulation_time = self.simulated_state.simulated_time.value
 
     def simulate_temp(self):
-        max_delta_temp = self.target_temperature - self.simulated_state.simulated_temperature
+        max_delta_temp = self.target_temperature - self.simulated_state.simulated_temperature.value
         if max_delta_temp < 0:
             direction = -1
         else:
             direction = 1
-        new_time = self.simulated_state.simulated_time
+        new_time = self.simulated_state.simulated_time.value
         delta_time = new_time - self.last_simulation_time
 
         max_temp_change_in_delta_time = self.temperature_slope * delta_time
 
         if abs(max_delta_temp) < max_temp_change_in_delta_time:
-            self.simulated_state.simulated_temperature = self.target_temperature
+            self.simulated_state.simulated_temperature.value = self.target_temperature
         else:
-            self.simulated_state.simulated_temperature = self.simulated_state.simulated_temperature + direction * \
+            self.simulated_state.simulated_temperature.value = self.simulated_state.simulated_temperature.value + direction * \
                                                          self.temperature_slope * delta_time
 
     def simulate_hum(self):
-        max_delta_hum = self.target_humidity - self.simulated_state.simulated_humidity
+        max_delta_hum = self.target_humidity - self.simulated_state.simulated_humidity.value
         if max_delta_hum < 0:
             direction = -1
         else:
             direction = 1
-        new_time = self.simulated_state.simulated_time
+        new_time = self.simulated_state.simulated_time.value
         delta_time = new_time - self.last_simulation_time
 
         max_hum_change_in_delta_time = self.humidity_slope * delta_time
 
         if abs(max_delta_hum) < max_hum_change_in_delta_time:
-            self.simulated_state.simulated_humidity = self.target_humidity
+            self.simulated_state.simulated_humidity.value = self.target_humidity
         else:
-            self.simulated_state.simulated_humidity = self.simulated_state.simulated_humidity + direction * \
+            self.simulated_state.simulated_humidity.value = self.simulated_state.simulated_humidity.value + direction * \
                                                       self.humidity_slope * delta_time
 
     # the communication section
 
     def read_temperature(self):
 
-        self.simulated_state.simulated_time += self.communication_delay
+        self.simulated_state.simulated_time.value += self.communication_delay
         # data format: [current temp, set temp, upper limit, lower limit]
-        return [self.simulated_state.simulated_temperature, self.target_temperature, 0., 100.]
+        return [self.simulated_state.simulated_temperature.value, self.target_temperature, 0., 100.]
 
     def read_humidity(self):
 
-        self.simulated_state.simulated_time += self.communication_delay
+        self.simulated_state.simulated_time.value += self.communication_delay
         # data format: [current temp, set temp, upper limit, lower limit]
-        return [self.simulated_state.simulated_humidity, self.target_humidity, 0., 100.]
+        return [self.simulated_state.simulated_humidity.value, self.target_humidity, 0., 100.]
 
     def set_temperature(self, temperature):
         # simulate everything that has happened until now, before we store the new setpoint
@@ -89,7 +89,7 @@ class ClimateChamberDummy:
         self.target_temperature = temperature
         print('ChamberDummy: target temperature now is ' + str(self.target_temperature))
         response = 'OK: TEMP, S30\r\n'
-        self.simulated_state.simulated_time += self.communication_delay
+        self.simulated_state.simulated_time.value += self.communication_delay
         return response
 
     def set_humidity(self, humidity):
@@ -99,7 +99,7 @@ class ClimateChamberDummy:
         self.target_humidity = humidity
         print('ChamberDummy: target humidity now is ' + str(self.target_humidity))
         response = 'OK: HUMI, S30\r\n'
-        self.simulated_state.simulated_time += self.communication_delay
+        self.simulated_state.simulated_time.value += self.communication_delay
         return response
 
     def close(self):
@@ -110,7 +110,7 @@ class ClimateChamberDummy:
     def set_mode(self, mode):
         self.simulated_mode = mode
         response = 'FIXME!!!'
-        self.simulated_state.simulated_time += self.communication_delay
+        self.simulated_state.simulated_time.value += self.communication_delay
         return response
 
     def get_const(self):
@@ -139,7 +139,7 @@ class ClimateChamberDummy:
         self.set_humidity(setPoint[1])
 
     def read_mode(self):
-        self.simulated_state.simulated_time += self.communication_delay
+        self.simulated_state.simulated_time.value += self.communication_delay
         return self.simulated_mode
 
     # deprecated. Use read_humidity etc. instead
@@ -148,13 +148,13 @@ class ClimateChamberDummy:
         return str(self.read_temperature()[0]) + ', ' + str(self.read_humidity()[0]) + ', ' + self.simulated_mode + ',0'
 
     def is_temperature_reached(self):
-        if abs(self.simulated_state.simulated_temperature - self.target_temperature) < self.target_accuracy[0]:
+        if abs(self.simulated_state.simulated_temperature.value - self.target_temperature) < self.target_accuracy[0]:
             return True
         else:
             return False
 
     def is_humidity_reached(self):
-        if abs(self.simulated_state.simulated_humidity - self.target_humidity) < self.target_accuracy[1]:
+        if abs(self.simulated_state.simulated_humidity.value - self.target_humidity) < self.target_accuracy[1]:
             return True
         else:
             return False
diff --git a/Python_script/shared_simulated_state.py b/Python_script/shared_simulated_state.py
index bae9bc5..980ff70 100644
--- a/Python_script/shared_simulated_state.py
+++ b/Python_script/shared_simulated_state.py
@@ -1,3 +1,5 @@
+import multiprocessing as mp
+
 simulated_state_instance = None
 
 
@@ -11,6 +13,6 @@ def get_simulated_state():
 class SimulatedState:
     def __init__(self):
 
-        self.simulated_time = 0
-        self.simulated_temperature = 25
-        self.simulated_humidity = 35
+        self.simulated_time = mp.Value('d', 0.0)
+        self.simulated_temperature = mp.Value('d', 25.)
+        self.simulated_humidity =  mp.Value('d', 35.)
diff --git a/Python_script/virtual_time.py b/Python_script/virtual_time.py
index b1b4a3c..69c938b 100644
--- a/Python_script/virtual_time.py
+++ b/Python_script/virtual_time.py
@@ -29,10 +29,11 @@ class VirtualClock:
         self.VNA_dummy = VNA_dummy.get_vna_dummy(target_accuracy)
 
     def time(self):
-        return self.simulated_state.simulated_time
+        return self.simulated_state.simulated_time.value
 
     def sleep(self, sleep_time):
-        self.simulated_state.simulated_time += sleep_time
+        time.sleep(1)
+        self.simulated_state.simulated_time.value += sleep_time
         self.climate_chamber_dummy.run_simulation()
         self.VNA_dummy.run_simulation()
 
-- 
GitLab