From 20fa65c92667a8b842c2aa69eac69804b4e2948b Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Fri, 15 Nov 2024 10:55:55 +0100 Subject: [PATCH 1/3] Slightly re-tuned temp and water controllers --- wash/src/wash/control/ControllerTemp.java | 6 +++--- wash/src/wash/control/ControllerWater.java | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/wash/src/wash/control/ControllerTemp.java b/wash/src/wash/control/ControllerTemp.java index afd0b8b..724e570 100644 --- a/wash/src/wash/control/ControllerTemp.java +++ b/wash/src/wash/control/ControllerTemp.java @@ -24,7 +24,7 @@ public final class ControllerTemp extends ActorThread { public void run() { while (true) { try { - temp = receiveWithTimeout(10000 / Settings.SPEEDUP); + temp = receiveWithTimeout(30000 / Settings.SPEEDUP); // If there is a new message, swap if (temp != null) { @@ -39,7 +39,7 @@ public final class ControllerTemp extends ActorThread { switch (heaterState) { case Order.TEMP_SET_40 -> { - if (io.getTemperature() <= 39) { + if (io.getTemperature() <= 38.5) { io.heat(true); } else { io.heat(false); @@ -48,7 +48,7 @@ public final class ControllerTemp extends ActorThread { } } case Order.TEMP_SET_60 -> { - if (io.getTemperature() <= 59) { + if (io.getTemperature() <= 58.5) { io.heat(true); } else { io.heat(false); diff --git a/wash/src/wash/control/ControllerWater.java b/wash/src/wash/control/ControllerWater.java index 6dcf200..fe3c4e8 100644 --- a/wash/src/wash/control/ControllerWater.java +++ b/wash/src/wash/control/ControllerWater.java @@ -46,13 +46,14 @@ public class ControllerWater extends ActorThread { case Order.WATER_DRAIN -> { io.drain(true); io.fill(false); + // WARNING: Float comparison if (io.getWaterLevel() == 0 && !ackSent) sendAck(); } case Order.WATER_FILL -> { io.drain(false); - if (io.getWaterLevel() < 19) + if (io.getWaterLevel() < 10) io.fill(true); else { io.fill(false); @@ -64,6 +65,9 @@ public class ControllerWater extends ActorThread { case Order.WATER_IDLE -> { io.drain(false); io.fill(false); + if (!ackSent) { + sendAck(); + } } default -> { continue; From 81ee61c7797ceb2fbd55d836aa8bec6e571ad263 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Fri, 15 Nov 2024 10:56:04 +0100 Subject: [PATCH 2/3] Reworked spin controller --- wash/src/wash/control/ControllerSpin.java | 106 +++++++++------------- 1 file changed, 45 insertions(+), 61 deletions(-) diff --git a/wash/src/wash/control/ControllerSpin.java b/wash/src/wash/control/ControllerSpin.java index 7ec645b..5396334 100644 --- a/wash/src/wash/control/ControllerSpin.java +++ b/wash/src/wash/control/ControllerSpin.java @@ -1,13 +1,17 @@ package wash.control; import actor.ActorThread; -import wash.io.WashingIO; import wash.control.WashingMessage.Order; +import wash.io.WashingIO; +import wash.io.WashingIO.Spin; public final class ControllerSpin extends ActorThread { private WashingIO io; - private Spin spin = new Spin(); private WashingMessage m; + private WashingMessage temp; + private boolean ackSent = true; + private Order spinState = Order.SPIN_OFF; + long start = System.currentTimeMillis(); public ControllerSpin(WashingIO io) { this.io = io; @@ -15,70 +19,50 @@ public final class ControllerSpin extends ActorThread { protected void sendAck() { m.sendAck(this); + ackSent = true; } @Override public void run() { - spin.start(); - listener(); // Drop into a recursive listener method - } - - /** Recursive listener method */ - public void listener() { - if(isInterrupted()) { - spin.interrupt(); - return; - } - - try { - m = take(); - } catch (Exception e) { - System.exit(1); - } - - switch (m.order()) { - case Order.SPIN_OFF -> spin.setMode(WashingIO.Spin.IDLE); - case Order.SPIN_FAST -> spin.setMode(WashingIO.Spin.FAST); - case Order.SPIN_SLOW -> spin.setMode(WashingIO.Spin.LEFT); - default -> { - listener(); - } - } - - listener(); - } - - private final class Spin extends Thread { - private WashingIO.Spin spinMode; - boolean changed = false; - - public Spin() { - spinMode = WashingIO.Spin.IDLE; - } - - public synchronized void setMode(WashingIO.Spin m) { - spinMode = m; - changed = true; - } - - private void loop() throws InterruptedException { - io.setSpinMode(spinMode); - - if (changed) { - sendAck(); - changed = false; - } - - Thread.sleep(60000 / Settings.SPEEDUP); - loop(); - } - - @Override - public void run() { + long elapsed; // "Virtual" seconds elapsed, used for modulo ops in spin direction + while (true) { try { - loop(); - } catch (InterruptedException e) { - return; + temp = receiveWithTimeout(10000 / Settings.SPEEDUP); + elapsed = ((System.currentTimeMillis() - start) * (Settings.SPEEDUP) / 1000 * 60); + + // If there is a new message, swap + if (temp != null) { + m = temp; + ackSent = false; // We have a new order + } + + // If this message is not the same as last time + if (m != null && m.order() != spinState) { + spinState = m.order(); + } + + switch (spinState) { + case Order.SPIN_OFF -> { + io.setSpinMode(Spin.IDLE); + } + case Order.SPIN_FAST -> { + io.setSpinMode(Spin.FAST); + } + case Order.SPIN_SLOW -> { + if (elapsed % 2 == 0) + io.setSpinMode(Spin.RIGHT); + else + io.setSpinMode(Spin.LEFT); + } + default -> { + continue; + } + } + + if (m != null && !ackSent) + sendAck(); + } catch (Exception e) { + System.out.println(e); } } } From 3d5b098595038fb643a41ba287fb8dcf41a976df Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Fri, 15 Nov 2024 10:56:12 +0100 Subject: [PATCH 3/3] Correctly implemented programs --- wash/src/wash/program/WashingProgram1.java | 12 +++++++++++- wash/src/wash/program/WashingProgram2.java | 9 ++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/wash/src/wash/program/WashingProgram1.java b/wash/src/wash/program/WashingProgram1.java index 581ce97..34086a2 100644 --- a/wash/src/wash/program/WashingProgram1.java +++ b/wash/src/wash/program/WashingProgram1.java @@ -47,16 +47,23 @@ public final class WashingProgram1 extends ActorThread { temp.send(new WashingMessage(this, TEMP_SET_40)); receive(); + spin.send(new WashingMessage(this, SPIN_SLOW)); + receive(); + // Keep the temperature for 30 min Thread.sleep(30 * 60000 / Settings.SPEEDUP); // Drain temp.send(new WashingMessage(this, TEMP_IDLE)); receive(); + spin.send(new WashingMessage(this, SPIN_OFF)); + receive(); water.send(new WashingMessage(this, WATER_DRAIN)); receive(); // Rinse 5*2 minutes in cold water + spin.send(new WashingMessage(this, SPIN_SLOW)); + receive(); for(int a = 0; a < 5; a++) { water.send(new WashingMessage(this, WATER_FILL)); receive(); @@ -70,7 +77,7 @@ public final class WashingProgram1 extends ActorThread { // Centrifuge for five minutes spin.send(new WashingMessage(this, SPIN_FAST)); receive(); - Thread.sleep(5 * 60000 / Settings.SPEEDUP); + Thread.sleep(10 * 60000 / Settings.SPEEDUP); spin.send(new WashingMessage(this, SPIN_OFF)); receive(); @@ -81,6 +88,9 @@ public final class WashingProgram1 extends ActorThread { water.send(new WashingMessage(this, WATER_DRAIN)); receive(); + water.send(new WashingMessage(this, WATER_IDLE)); + receive(); + // Now that the barrel has stopped, it is safe to open the hatch. io.lock(false); diff --git a/wash/src/wash/program/WashingProgram2.java b/wash/src/wash/program/WashingProgram2.java index 860801d..04b52ab 100644 --- a/wash/src/wash/program/WashingProgram2.java +++ b/wash/src/wash/program/WashingProgram2.java @@ -48,6 +48,9 @@ public final class WashingProgram2 extends ActorThread { temp.send(new WashingMessage(this, TEMP_SET_40)); receive(); + spin.send(new WashingMessage(this, SPIN_SLOW)); + receive(); + // Keep the temperature for 20 min Thread.sleep(20 * 60000 / Settings.SPEEDUP); @@ -72,7 +75,7 @@ public final class WashingProgram2 extends ActorThread { receive(); // Rinse 5*2 minutes in cold water - for(int a = 0; a < 5; a++) { + for(int a = 0; a <= 5; a++) { water.send(new WashingMessage(this, WATER_FILL)); receive(); @@ -90,10 +93,10 @@ public final class WashingProgram2 extends ActorThread { spin.send(new WashingMessage(this, SPIN_OFF)); receive(); - temp.send(new WashingMessage(this, TEMP_IDLE)); + water.send(new WashingMessage(this, WATER_DRAIN)); receive(); - water.send(new WashingMessage(this, WATER_DRAIN)); + water.send(new WashingMessage(this, WATER_IDLE)); receive(); // Now that the barrel has stopped, it is safe to open the hatch.