diff --git a/wash/src/wash/control/ControllerSpin.java b/wash/src/wash/control/ControllerSpin.java index 5396334..7ec645b 100644 --- a/wash/src/wash/control/ControllerSpin.java +++ b/wash/src/wash/control/ControllerSpin.java @@ -1,17 +1,13 @@ package wash.control; import actor.ActorThread; -import wash.control.WashingMessage.Order; import wash.io.WashingIO; -import wash.io.WashingIO.Spin; +import wash.control.WashingMessage.Order; 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; @@ -19,50 +15,70 @@ public final class ControllerSpin extends ActorThread { protected void sendAck() { m.sendAck(this); - ackSent = true; } @Override public void run() { - long elapsed; // "Virtual" seconds elapsed, used for modulo ops in spin direction - while (true) { + 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() { try { - 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); + loop(); + } catch (InterruptedException e) { + return; } } } diff --git a/wash/src/wash/control/ControllerTemp.java b/wash/src/wash/control/ControllerTemp.java index 724e570..afd0b8b 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(30000 / Settings.SPEEDUP); + temp = receiveWithTimeout(10000 / 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() <= 38.5) { + if (io.getTemperature() <= 39) { 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() <= 58.5) { + if (io.getTemperature() <= 59) { io.heat(true); } else { io.heat(false); diff --git a/wash/src/wash/control/ControllerWater.java b/wash/src/wash/control/ControllerWater.java index fe3c4e8..6dcf200 100644 --- a/wash/src/wash/control/ControllerWater.java +++ b/wash/src/wash/control/ControllerWater.java @@ -46,14 +46,13 @@ 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() < 10) + if (io.getWaterLevel() < 19) io.fill(true); else { io.fill(false); @@ -65,9 +64,6 @@ public class ControllerWater extends ActorThread { case Order.WATER_IDLE -> { io.drain(false); io.fill(false); - if (!ackSent) { - sendAck(); - } } default -> { continue; diff --git a/wash/src/wash/program/WashingProgram1.java b/wash/src/wash/program/WashingProgram1.java index 34086a2..581ce97 100644 --- a/wash/src/wash/program/WashingProgram1.java +++ b/wash/src/wash/program/WashingProgram1.java @@ -47,23 +47,16 @@ 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(); @@ -77,7 +70,7 @@ public final class WashingProgram1 extends ActorThread { // Centrifuge for five minutes spin.send(new WashingMessage(this, SPIN_FAST)); receive(); - Thread.sleep(10 * 60000 / Settings.SPEEDUP); + Thread.sleep(5 * 60000 / Settings.SPEEDUP); spin.send(new WashingMessage(this, SPIN_OFF)); receive(); @@ -88,9 +81,6 @@ 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 04b52ab..860801d 100644 --- a/wash/src/wash/program/WashingProgram2.java +++ b/wash/src/wash/program/WashingProgram2.java @@ -48,9 +48,6 @@ 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); @@ -75,7 +72,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(); @@ -93,10 +90,10 @@ public final class WashingProgram2 extends ActorThread { spin.send(new WashingMessage(this, SPIN_OFF)); receive(); - water.send(new WashingMessage(this, WATER_DRAIN)); + temp.send(new WashingMessage(this, TEMP_IDLE)); receive(); - water.send(new WashingMessage(this, WATER_IDLE)); + water.send(new WashingMessage(this, WATER_DRAIN)); receive(); // Now that the barrel has stopped, it is safe to open the hatch.