diff --git a/lab3/src/main/java/ru/spbstu/telematics/java/App.java b/lab3/src/main/java/ru/spbstu/telematics/java/App.java index 47f0751..399ec4e 100644 --- a/lab3/src/main/java/ru/spbstu/telematics/java/App.java +++ b/lab3/src/main/java/ru/spbstu/telematics/java/App.java @@ -1,7 +1,11 @@ package ru.spbstu.telematics.java; +import java.util.Locale; + public class App { public static void main(String[] args) { + Locale.setDefault(Locale.ENGLISH); + Room room = new Room(); Settings settings = new Settings(28, 0.4); Controller controller = new Controller(room, settings); diff --git a/lab3/src/main/java/ru/spbstu/telematics/java/Controller.java b/lab3/src/main/java/ru/spbstu/telematics/java/Controller.java index 3eaab87..da9e727 100644 --- a/lab3/src/main/java/ru/spbstu/telematics/java/Controller.java +++ b/lab3/src/main/java/ru/spbstu/telematics/java/Controller.java @@ -7,6 +7,7 @@ package ru.spbstu.telematics.java; * комнаты напрямую. */ public class Controller implements Runnable { + private Room room; private Settings settings; private Sensor sensor; private Thread sensorThread; @@ -16,6 +17,7 @@ public class Controller implements Runnable { private Thread fanThread; public Controller(Room room, Settings settings) { + this.room = room; this.settings = settings; sensor = new Sensor(room); @@ -31,23 +33,57 @@ public class Controller implements Runnable { private long updateIntervalMs = 500; private double tolerance = 0.01; + private void log(String string) { + System.out.printf("[Controller in room %s] %s\n", room.name, string); + } + @Override public void run() { sensorThread.start(); heaterThread.start(); fanThread.start(); + log("Started sensor, heater and fan threads"); while (!Thread.interrupted()) { - if (sensor.getTemperature() < settings.getTemperature() * (1 - tolerance)) { - heater.turnOn(); + double currentTemperature = sensor.getTemperature(); + double desiredTemperature = settings.getTemperature(); + + if (currentTemperature < desiredTemperature * (1 - tolerance)) { + if (!heater.isOn()) { + log(String.format( + "Turning heater ON (current - %.2fC°, desired %.2fC°)", + currentTemperature, + desiredTemperature)); + heater.turnOn(); + } } else { - heater.turnOff(); + if (heater.isOn()) { + log(String.format( + "Turning heater OFF (current - %.2fC°, desired %.2fC°)", + currentTemperature, + desiredTemperature)); + heater.turnOff(); + } } - if (sensor.getHumidity() > settings.getHumidity() * (1 + tolerance)) { - fan.turnOn(); + double currentHumidity = sensor.getHumidity(); + double desiredHumidity = settings.getHumidity(); + if (currentHumidity > desiredHumidity * (1 + tolerance)) { + if (!fan.isOn()) { + log(String.format( + "Turning fan ON (current - %.2f%%, desired %.2f%%)", + currentHumidity * 100, + desiredHumidity * 100)); + fan.turnOn(); + } } else { - fan.turnOff(); + if (fan.isOn()) { + log(String.format( + "Turning fan OFF (current - %.2f%%, desired %.2f%%)", + currentHumidity * 100, + desiredHumidity * 100)); + fan.turnOff(); + } } Utils.sleep(updateIntervalMs); diff --git a/lab3/src/main/java/ru/spbstu/telematics/java/Fan.java b/lab3/src/main/java/ru/spbstu/telematics/java/Fan.java index a2ac3f7..f71d2d7 100644 --- a/lab3/src/main/java/ru/spbstu/telematics/java/Fan.java +++ b/lab3/src/main/java/ru/spbstu/telematics/java/Fan.java @@ -15,6 +15,10 @@ public class Fan implements Runnable { private volatile boolean isOn; + public boolean isOn() { + return isOn; + } + public void turnOn() { this.isOn = true; } diff --git a/lab3/src/main/java/ru/spbstu/telematics/java/Heater.java b/lab3/src/main/java/ru/spbstu/telematics/java/Heater.java index 9701389..e60e5ec 100644 --- a/lab3/src/main/java/ru/spbstu/telematics/java/Heater.java +++ b/lab3/src/main/java/ru/spbstu/telematics/java/Heater.java @@ -15,6 +15,10 @@ public class Heater implements Runnable { private volatile boolean isOn; + public boolean isOn() { + return isOn; + } + public void turnOn() { this.isOn = true; } diff --git a/lab3/src/main/java/ru/spbstu/telematics/java/Room.java b/lab3/src/main/java/ru/spbstu/telematics/java/Room.java index 59f334d..cee6eea 100644 --- a/lab3/src/main/java/ru/spbstu/telematics/java/Room.java +++ b/lab3/src/main/java/ru/spbstu/telematics/java/Room.java @@ -6,6 +6,15 @@ import java.util.Random; * Симулирует физические процессы, протекающие в команте. */ public class Room implements Runnable { + static private int roomCounter; + + public final String name; + + public Room() { + roomCounter++; + this.name = "#" + roomCounter; + } + // Температура измеряется в градусах цельсия private volatile double temperature = 24.0;