diff --git a/src/main/java/de/neemann/digital/core/Model.java b/src/main/java/de/neemann/digital/core/Model.java index 05e8d4047..5b4b174ad 100644 --- a/src/main/java/de/neemann/digital/core/Model.java +++ b/src/main/java/de/neemann/digital/core/Model.java @@ -221,7 +221,7 @@ public class Model implements Iterable, SyncAccess { for (ModelStateObserver ob : observersMicroStep) LOGGER.debug("Observer Micro: " + ob.getClass().getSimpleName()); - fireEvent(ModelEvent.STOPPED); + fireEvent(ModelEvent.CLOSED); } } @@ -429,9 +429,9 @@ public class Model implements Iterable, SyncAccess { * @param event the mandatory event * @param events more optional events */ - public void addObserver(ModelStateObserver observer, ModelEvent event, ModelEvent... events) { + public void addObserver(ModelStateObserver observer, ModelEventType event, ModelEventType... events) { addObserverForEvent(observer, event); - for (ModelEvent ev : events) + for (ModelEventType ev : events) addObserverForEvent(observer, ev); } @@ -441,18 +441,18 @@ public class Model implements Iterable, SyncAccess { * @param observer the observer to add */ public void addObserver(ModelStateObserverTyped observer) { - for (ModelEvent ev : observer.getEvents()) + for (ModelEventType ev : observer.getEvents()) addObserverForEvent(observer, ev); } - private void addObserverForEvent(ModelStateObserver observer, ModelEvent event) { + private void addObserverForEvent(ModelStateObserver observer, ModelEventType event) { ArrayList obs = observers; - if (event == ModelEvent.STEP) { + if (event == ModelEventType.STEP) { if (observersStep == null) observersStep = new ArrayList<>(); obs = observersStep; - } else if (event == ModelEvent.MICROSTEP) { + } else if (event == ModelEventType.MICROSTEP) { if (observersMicroStep == null) observersMicroStep = new ArrayList<>(); obs = observersMicroStep; @@ -498,7 +498,7 @@ public class Model implements Iterable, SyncAccess { } private void fireEvent(ModelEvent event) { - switch (event) { + switch (event.getType()) { case MICROSTEP: if (observersMicroStep != null) for (ModelStateObserver observer : observersMicroStep) diff --git a/src/main/java/de/neemann/digital/core/ModelEvent.java b/src/main/java/de/neemann/digital/core/ModelEvent.java index 4abc341aa..106371d2c 100644 --- a/src/main/java/de/neemann/digital/core/ModelEvent.java +++ b/src/main/java/de/neemann/digital/core/ModelEvent.java @@ -1,51 +1,90 @@ /* - * Copyright (c) 2016 Helmut Neemann + * Copyright (c) 2020 Helmut Neemann. * Use of this source code is governed by the GPL v3 license * that can be found in the LICENSE file. */ package de.neemann.digital.core; +import java.util.Objects; + /** - * A event fired by the model + * a model event */ -public enum ModelEvent { +public class ModelEvent { + /** + * Shorthand for a ModelEventType.STARTED event + */ + public static final ModelEvent STARTED = new ModelEvent(ModelEventType.STARTED); + /** + * Shorthand for a ModelEventType.STOPPED event + */ + public static final ModelEvent CLOSED = new ModelEvent(ModelEventType.CLOSED); + /** + * Shorthand for a ModelEventType.STEP event + */ + public static final ModelEvent STEP = new ModelEvent(ModelEventType.STEP); + /** + * Shorthand for a ModelEventType.MICROSTEP event + */ + public static final ModelEvent MICROSTEP = new ModelEvent(ModelEventType.MICROSTEP); + /** + * Shorthand for a ModelEventType.FASTRUN event + */ + public static final ModelEvent FASTRUN = new ModelEvent(ModelEventType.FASTRUN); + /** + * Shorthand for a ModelEventType.BREAK event + */ + public static final ModelEvent BREAK = new ModelEvent(ModelEventType.BREAK); + /** + * Shorthand for a ModelEventType.EXTERNALCHANGE event + */ + public static final ModelEvent EXTERNALCHANGE = new ModelEvent(ModelEventType.EXTERNALCHANGE); + + private final ModelEventType type; + private String message; + private Exception cause; + + private ModelEvent(ModelEventType type) { + this.type = type; + } + + ModelEvent(String message, Exception cause) { + this(ModelEventType.ERROR_OCCURRED); + this.message = message; + this.cause = cause; + } /** - * Is fired after the model had became stable after first stabilization. + * @return the event type */ - STARTED, + public ModelEventType getType() { + return type; + } /** - * The model has stopped. + * @return the message */ - STOPPED, + public String getMessage() { + return message; + } /** - * Is fired if the model had performed a full step. - * This means a change is propagated through all nodes, and the model has - * become stable again. + * @return the cause in case of an error */ - STEP, + public Exception getCause() { + return cause; + } - /** - * Fast run is started. - */ - FASTRUN, - - /** - * A break is detected. - */ - BREAK, - - /** - * Here was a manual change to the model by the user. - */ - EXTERNALCHANGE, - - /** - * If fired if a micro step is calculated. - * This means the aktual nodes are calculated, but not the effected nodes. - */ - MICROSTEP + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ModelEvent that = (ModelEvent) o; + return type == that.type; + } + @Override + public int hashCode() { + return Objects.hash(type); + } } diff --git a/src/main/java/de/neemann/digital/core/ModelEventType.java b/src/main/java/de/neemann/digital/core/ModelEventType.java new file mode 100644 index 000000000..349145ddb --- /dev/null +++ b/src/main/java/de/neemann/digital/core/ModelEventType.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016 Helmut Neemann + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.digital.core; + +/** + * A event fired by the model + */ +public enum ModelEventType { + + /** + * Is fired after the model had became stable after first stabilization. + */ + STARTED, + + /** + * The model has stopped. + */ + CLOSED, + + /** + * Is fired if the model had performed a full step. + * This means a change is propagated through all nodes, and the model has + * become stable again. + */ + STEP, + + /** + * Fast run is started. + */ + FASTRUN, + + /** + * A break is detected. + */ + BREAK, + + /** + * Here was a manual change to the model by the user. + */ + EXTERNALCHANGE, + + /** + * If fired if a micro step is calculated. + * This means the aktual nodes are calculated, but not the effected nodes. + */ + MICROSTEP, + + /** + * Used to notify an error + */ + ERROR_OCCURRED + +} diff --git a/src/main/java/de/neemann/digital/core/ModelStateObserverTyped.java b/src/main/java/de/neemann/digital/core/ModelStateObserverTyped.java index b01622895..f04a4799e 100644 --- a/src/main/java/de/neemann/digital/core/ModelStateObserverTyped.java +++ b/src/main/java/de/neemann/digital/core/ModelStateObserverTyped.java @@ -13,6 +13,6 @@ public interface ModelStateObserverTyped extends ModelStateObserver { /** * @return the events on which this handler needs to be called */ - ModelEvent[] getEvents(); + ModelEventType[] getEvents(); } diff --git a/src/main/java/de/neemann/digital/core/extern/External.java b/src/main/java/de/neemann/digital/core/extern/External.java index c895f7247..f745eff27 100644 --- a/src/main/java/de/neemann/digital/core/extern/External.java +++ b/src/main/java/de/neemann/digital/core/extern/External.java @@ -112,13 +112,13 @@ public class External extends Node implements Element { } model.addObserver(event -> { - if (event.equals(ModelEvent.STOPPED)) { + if (event.equals(ModelEventType.CLOSED)) { try { processInterface.close(); } catch (IOException e) { SwingUtilities.invokeLater(new ErrorMessage(Lang.get("msg_errorClosingExternalProcess")).addCause(e)); } } - }, ModelEvent.STOPPED); + }, ModelEventType.CLOSED); } } diff --git a/src/main/java/de/neemann/digital/core/io/MIDIHelper.java b/src/main/java/de/neemann/digital/core/io/MIDIHelper.java index 35f7d9fcc..6bd3768f4 100644 --- a/src/main/java/de/neemann/digital/core/io/MIDIHelper.java +++ b/src/main/java/de/neemann/digital/core/io/MIDIHelper.java @@ -6,7 +6,7 @@ package de.neemann.digital.core.io; import de.neemann.digital.core.Model; -import de.neemann.digital.core.ModelEvent; +import de.neemann.digital.core.ModelEventType; import de.neemann.digital.core.NodeException; import de.neemann.digital.lang.Lang; import org.slf4j.Logger; @@ -73,9 +73,9 @@ public final class MIDIHelper { isOpen = true; model.addObserver(event -> { - if (event.equals(ModelEvent.STOPPED)) + if (event.equals(ModelEventType.CLOSED)) close(); - }, ModelEvent.STOPPED); + }, ModelEventType.CLOSED); } } diff --git a/src/main/java/de/neemann/digital/core/memory/EEPROM.java b/src/main/java/de/neemann/digital/core/memory/EEPROM.java index 4e1220dc8..5f0e2649a 100644 --- a/src/main/java/de/neemann/digital/core/memory/EEPROM.java +++ b/src/main/java/de/neemann/digital/core/memory/EEPROM.java @@ -84,7 +84,7 @@ public class EEPROM extends Node implements Element, RAMInterface, ROMInterface super.registerNodes(model); if (memory.isEmpty()) - model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEvent.STOPPED); + model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEventType.CLOSED); } @Override diff --git a/src/main/java/de/neemann/digital/core/memory/EEPROMDualPort.java b/src/main/java/de/neemann/digital/core/memory/EEPROMDualPort.java index 62209caeb..a8b73adac 100644 --- a/src/main/java/de/neemann/digital/core/memory/EEPROMDualPort.java +++ b/src/main/java/de/neemann/digital/core/memory/EEPROMDualPort.java @@ -6,7 +6,7 @@ package de.neemann.digital.core.memory; import de.neemann.digital.core.Model; -import de.neemann.digital.core.ModelEvent; +import de.neemann.digital.core.ModelEventType; import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementTypeDescription; import de.neemann.digital.core.element.Keys; @@ -60,7 +60,7 @@ public class EEPROMDualPort extends RAMDualPort implements ROMInterface { super.registerNodes(model); if (memory.isEmpty()) - model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEvent.STOPPED); + model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEventType.CLOSED); } } diff --git a/src/main/java/de/neemann/digital/core/switching/TransGate.java b/src/main/java/de/neemann/digital/core/switching/TransGate.java index ba07e0da6..ca903ccb0 100644 --- a/src/main/java/de/neemann/digital/core/switching/TransGate.java +++ b/src/main/java/de/neemann/digital/core/switching/TransGate.java @@ -72,11 +72,11 @@ public class TransGate extends Node implements Element { public void init(Model model) throws NodeException { aSwitch.init(model); model.addObserver(event -> { - if (event.equals(ModelEvent.STEP)) { + if (event.equals(ModelEventType.STEP)) { if (!s.isHighZ() && !ns.isHighZ() && (s.getBool() == ns.getBool())) throw new BurnException(Lang.get("err_invalidTransmissionGateState"), new ObservableValues(s, ns)); } - }, ModelEvent.STEP); + }, ModelEventType.STEP); } /** diff --git a/src/main/java/de/neemann/digital/core/wiring/bus/BusModelStateObserver.java b/src/main/java/de/neemann/digital/core/wiring/bus/BusModelStateObserver.java index 4a5981efd..112327b65 100644 --- a/src/main/java/de/neemann/digital/core/wiring/bus/BusModelStateObserver.java +++ b/src/main/java/de/neemann/digital/core/wiring/bus/BusModelStateObserver.java @@ -6,6 +6,7 @@ package de.neemann.digital.core.wiring.bus; import de.neemann.digital.core.ModelEvent; +import de.neemann.digital.core.ModelEventType; import de.neemann.digital.core.ModelStateObserverTyped; import de.neemann.digital.core.switching.PlainSwitch; @@ -40,8 +41,8 @@ public final class BusModelStateObserver implements ModelStateObserverTyped { } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{ModelEvent.STEP}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{ModelEventType.STEP}; } /** diff --git a/src/main/java/de/neemann/digital/draw/gif/GifExporter.java b/src/main/java/de/neemann/digital/draw/gif/GifExporter.java index 4d106ea79..381fe8ac7 100644 --- a/src/main/java/de/neemann/digital/draw/gif/GifExporter.java +++ b/src/main/java/de/neemann/digital/draw/gif/GifExporter.java @@ -111,13 +111,13 @@ public class GifExporter extends JDialog implements ModelStateObserverTyped, Mod @Override public void handleEvent(ModelEvent event) { - if (event.equals(ModelEvent.STEP)) + if (event == ModelEvent.STEP) writeImage(); } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{ModelEvent.STEP}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{ModelEventType.STEP}; } private void writeImage() { diff --git a/src/main/java/de/neemann/digital/draw/model/AsyncSequentialClock.java b/src/main/java/de/neemann/digital/draw/model/AsyncSequentialClock.java index 43557da66..98675e15f 100644 --- a/src/main/java/de/neemann/digital/draw/model/AsyncSequentialClock.java +++ b/src/main/java/de/neemann/digital/draw/model/AsyncSequentialClock.java @@ -5,10 +5,7 @@ */ package de.neemann.digital.draw.model; -import de.neemann.digital.core.Model; -import de.neemann.digital.core.ModelEvent; -import de.neemann.digital.core.ModelStateObserverTyped; -import de.neemann.digital.core.NodeException; +import de.neemann.digital.core.*; import de.neemann.digital.core.wiring.AsyncSeq; import de.neemann.digital.gui.ErrorStopper; import de.neemann.digital.lang.Lang; @@ -46,14 +43,14 @@ public class AsyncSequentialClock implements ModelStateObserverTyped { @Override public void handleEvent(ModelEvent event) { - switch (event) { + switch (event.getType()) { case STARTED: int delayMuS = 1000000 / frequency; if (delayMuS < 100) delayMuS = 100; runner = new RealTimeRunner(delayMuS); break; - case STOPPED: + case CLOSED: if (runner != null) runner.stop(); break; @@ -61,8 +58,8 @@ public class AsyncSequentialClock implements ModelStateObserverTyped { } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{ModelEvent.STARTED, ModelEvent.STOPPED}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{ModelEventType.STARTED, ModelEventType.CLOSED}; } /** diff --git a/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java b/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java index ad8fffdf4..00806b55c 100644 --- a/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java +++ b/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java @@ -55,7 +55,7 @@ public class RealTimeClock implements ModelStateObserverTyped { @Override public void handleEvent(ModelEvent event) { - switch (event) { + switch (event.getType()) { case STARTED: int delayMuS = 500000 / frequency; if (delayMuS < 1) @@ -63,7 +63,7 @@ public class RealTimeClock implements ModelStateObserverTyped { else runner = new RealTimeRunner(delayMuS); break; - case STOPPED: + case CLOSED: if (runner != null) runner.stop(); break; @@ -71,8 +71,8 @@ public class RealTimeClock implements ModelStateObserverTyped { } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{ModelEvent.STARTED, ModelEvent.STOPPED}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{ModelEventType.STARTED, ModelEventType.CLOSED}; } /** diff --git a/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java b/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java index 0645851df..551ec7367 100644 --- a/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java +++ b/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java @@ -459,9 +459,9 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav value.addObserverToValue(() -> setActiveState(value.getValue())); setActiveState(value.getValue()); model.addObserver(event -> { - if (event == ModelEvent.STOPPED) + if (event == ModelEvent.CLOSED) setActiveState(-1); - }, ModelEvent.STOPPED + }, ModelEventType.CLOSED ); } } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 4b13675f0..61676b2b9 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -1060,9 +1060,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS @Override public void actionPerformed(ActionEvent actionEvent) { if (model != null) { - ModelEvent event = ModelEvent.STEP; + ModelEventType event = ModelEventType.STEP; if (stateManager.isActive(runModelMicroState)) - event = ModelEvent.MICROSTEP; + event = ModelEventType.MICROSTEP; showMeasurementDialog(event); } } @@ -1072,9 +1072,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS @Override public void actionPerformed(ActionEvent actionEvent) { if (model != null) { - ModelEvent event = ModelEvent.STEP; + ModelEventType event = ModelEventType.STEP; if (stateManager.isActive(runModelMicroState)) - event = ModelEvent.MICROSTEP; + event = ModelEventType.MICROSTEP; showMeasurementGraph(event); } } @@ -1286,7 +1286,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS showMeasurementGraph.setEnabled(true); stoppedState.getAction().setEnabled(true); runTests.setEnabled(false); - createAndStartModel(false, ModelEvent.MICROSTEP, null); + createAndStartModel(false, ModelEventType.MICROSTEP, null); } }); stateManager.setActualState(stoppedState); @@ -1323,7 +1323,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS showMeasurementDialog.setEnabled(true); showMeasurementGraph.setEnabled(true); runTests.setEnabled(false); - createAndStartModel(runRealTime, ModelEvent.STEP, modelModifier); + createAndStartModel(runRealTime, ModelEventType.STEP, modelModifier); } } @@ -1335,7 +1335,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS model = null; } - private void createAndStartModel(boolean globalRunClock, ModelEvent updateEvent, ModelModifier modelModifier) { + private void createAndStartModel(boolean globalRunClock, ModelEventType updateEvent, ModelModifier modelModifier) { try { circuitComponent.removeHighLighted(); @@ -1376,7 +1376,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS if (threadRunnerCount > 1) throw new RuntimeException(Lang.get("err_moreThanOneFastClock")); } - if (!realTimeClockRunning && updateEvent == ModelEvent.MICROSTEP) { + if (!realTimeClockRunning && updateEvent == ModelEventType.MICROSTEP) { // no real clock AsyncSeq ai = model.getAsyncInfos(); if (ai != null) { @@ -1399,7 +1399,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS doMicroStep.setEnabled(false); if (!realTimeClockRunning && model.isRunToBreakAllowed()) { - if (updateEvent == ModelEvent.MICROSTEP) + if (updateEvent == ModelEventType.MICROSTEP) runToBreakMicroAction.setEnabled(true); else runToBreakAction.setEnabled(true); @@ -1412,7 +1412,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS if (settings.get(Keys.SHOW_DATA_GRAPH) || windowPosManager.isVisible("dataSet")) showMeasurementGraph(updateEvent); if (settings.get(Keys.SHOW_DATA_GRAPH_MICRO)) - showMeasurementGraph(ModelEvent.MICROSTEP); + showMeasurementGraph(ModelEventType.MICROSTEP); if (modelModifier != null) modelModifier.preInit(model); @@ -1421,10 +1421,10 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS new ProgramMemoryLoader(settings.get(Keys.PROGRAM_TO_PRELOAD)).preInit(model); } - if (updateEvent == ModelEvent.MICROSTEP) { + if (updateEvent == ModelEventType.MICROSTEP) { checkMicroStepActions(model); model.addObserver(new MicroStepObserver(model)); - } else if (updateEvent == ModelEvent.STEP) { + } else if (updateEvent == ModelEventType.STEP) { if (maxFrequency <= 50) model.addObserver(new FullStepObserver(model)); else @@ -1432,9 +1432,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS } model.addObserver(event -> { - if (event.equals(ModelEvent.STOPPED)) + if (event.equals(ModelEventType.CLOSED)) SwingUtilities.invokeLater(this::ensureModelIsStopped); - }, ModelEvent.STOPPED); + }, ModelEventType.CLOSED); model.init(); @@ -1458,12 +1458,12 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS windowPosManager.register("keyboard_" + k.getLabel(), new KeyboardDialog(this, k, model)); } - private void showMeasurementGraph(ModelEvent updateEvent) { + private void showMeasurementGraph(ModelEventType updateEvent) { List ordering = circuitComponent.getCircuit().getMeasurementOrdering(); - windowPosManager.register("dataSet", GraphDialog.createLiveDialog(this, model, updateEvent == ModelEvent.MICROSTEP, ordering)).setVisible(true); + windowPosManager.register("dataSet", GraphDialog.createLiveDialog(this, model, updateEvent == ModelEventType.MICROSTEP, ordering)).setVisible(true); } - private void showMeasurementDialog(ModelEvent updateEvent) { + private void showMeasurementDialog(ModelEventType updateEvent) { List ordering = circuitComponent.getCircuit().getMeasurementOrdering(); windowPosManager.register("probe", new ProbeDialog(this, model, updateEvent, ordering)).setVisible(true); } @@ -1649,7 +1649,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS @Override public void handleEvent(ModelEvent event) { try { - switch (event) { + switch (event.getType()) { case EXTERNALCHANGE: model.doStep(); circuitComponent.graphicHasChanged(); @@ -1664,8 +1664,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{ModelEvent.EXTERNALCHANGE, ModelEvent.BREAK}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{ModelEventType.EXTERNALCHANGE, ModelEventType.BREAK}; } } @@ -1681,11 +1681,11 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS @Override public void handleEvent(ModelEvent event) { - switch (event) { + switch (event.getType()) { case STARTED: timer.start(); break; - case STOPPED: + case CLOSED: case BREAK: timer.stop(); circuitComponent.graphicHasChanged(); @@ -1694,8 +1694,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{ModelEvent.STOPPED, ModelEvent.BREAK}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{ModelEventType.CLOSED, ModelEventType.BREAK}; } } @@ -1711,7 +1711,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS @Override public void handleEvent(ModelEvent event) { - switch (event) { + switch (event.getType()) { case EXTERNALCHANGE: case MICROSTEP: case BREAK: @@ -1727,8 +1727,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{ModelEvent.EXTERNALCHANGE, ModelEvent.MICROSTEP, ModelEvent.BREAK}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{ModelEventType.EXTERNALCHANGE, ModelEventType.MICROSTEP, ModelEventType.BREAK}; } } @@ -1839,7 +1839,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS runModelState.enter(false, new ProgramMemoryLoader(romHex)); circuitComponent.graphicHasChanged(); if (model != null) - showMeasurementDialog(ModelEvent.STEP); + showMeasurementDialog(ModelEventType.STEP); }); } diff --git a/src/main/java/de/neemann/digital/gui/components/DataEditor.java b/src/main/java/de/neemann/digital/gui/components/DataEditor.java index b81ed9e32..665f44236 100644 --- a/src/main/java/de/neemann/digital/gui/components/DataEditor.java +++ b/src/main/java/de/neemann/digital/gui/components/DataEditor.java @@ -231,9 +231,9 @@ public class DataEditor extends JDialog { if (model != null) { model.getWindowPosManager().register("RAM_DATA_" + label, this); model.addObserver(event -> { - if (event.equals(ModelEvent.STOPPED)) + if (event.equals(ModelEventType.CLOSED)) detachFromRunningModel(); - }, ModelEvent.STOPPED); + }, ModelEventType.CLOSED); } } diff --git a/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java b/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java index 21cce1a36..dfb969825 100644 --- a/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java @@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class ProbeDialog extends JDialog implements ModelStateObserverTyped { - private final ModelEvent type; + private final ModelEventType type; private final SignalTableModel tableModel; private boolean tableUpdateEnable = true; @@ -39,7 +39,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped { * @param type the event type which fires a dialog repaint * @param ordering the names list used to order the measurement values */ - public ProbeDialog(Frame owner, Model model, ModelEvent type, List ordering) { + public ProbeDialog(Frame owner, Model model, ModelEventType type, List ordering) { super(owner, Lang.get("win_measures"), false); setDefaultCloseOperation(DISPOSE_ON_CLOSE); this.type = type; @@ -109,7 +109,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped { @Override public void handleEvent(ModelEvent event) { - if (event == type || event == ModelEvent.EXTERNALCHANGE) { + if (event.getType() == type || event == ModelEvent.EXTERNALCHANGE) { if (tableUpdateEnable) { if (paintPending.compareAndSet(false, true)) { SwingUtilities.invokeLater(() -> { @@ -119,12 +119,12 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped { } } } - switch (event) { + switch (event.getType()) { case FASTRUN: tableUpdateEnable = false; break; case BREAK: - case STOPPED: + case CLOSED: tableUpdateEnable = true; SwingUtilities.invokeLater(tableModel::fireChanged); break; @@ -132,8 +132,8 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped { } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{type, ModelEvent.EXTERNALCHANGE, ModelEvent.FASTRUN, ModelEvent.BREAK, ModelEvent.STOPPED}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{type, ModelEventType.EXTERNALCHANGE, ModelEventType.FASTRUN, ModelEventType.BREAK, ModelEventType.CLOSED}; } private static class SignalTableModel implements TableModel { diff --git a/src/main/java/de/neemann/digital/gui/components/SingleValueDialog.java b/src/main/java/de/neemann/digital/gui/components/SingleValueDialog.java index 32bc1bc68..3363c41da 100644 --- a/src/main/java/de/neemann/digital/gui/components/SingleValueDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/SingleValueDialog.java @@ -180,13 +180,13 @@ public final class SingleValueDialog extends JDialog implements ModelStateObserv @Override public void handleEvent(ModelEvent event) { - if (event.equals(ModelEvent.STOPPED)) + if (event.equals(ModelEvent.CLOSED)) dispose(); } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{ModelEvent.STOPPED}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{ModelEventType.CLOSED}; } private JPanel createCheckBoxPanel(int bits, long value) { diff --git a/src/main/java/de/neemann/digital/gui/components/data/ValueTableObserver.java b/src/main/java/de/neemann/digital/gui/components/data/ValueTableObserver.java index b83e22389..8cdc556f8 100644 --- a/src/main/java/de/neemann/digital/gui/components/data/ValueTableObserver.java +++ b/src/main/java/de/neemann/digital/gui/components/data/ValueTableObserver.java @@ -6,6 +6,7 @@ package de.neemann.digital.gui.components.data; import de.neemann.digital.core.ModelEvent; +import de.neemann.digital.core.ModelEventType; import de.neemann.digital.core.ModelStateObserverTyped; import de.neemann.digital.core.Signal; import de.neemann.digital.data.Value; @@ -20,7 +21,7 @@ import java.util.ArrayList; public class ValueTableObserver implements ModelStateObserverTyped { private final ValueTable logData; - private final ModelEvent type; + private final ModelEventType type; private final ArrayList signals; private Value[] manualSample; @@ -35,9 +36,9 @@ public class ValueTableObserver implements ModelStateObserverTyped { public ValueTableObserver(boolean microStep, ArrayList signals, int maxSize) { this.signals = signals; if (microStep) - this.type = ModelEvent.MICROSTEP; + this.type = ModelEventType.MICROSTEP; else - this.type = ModelEvent.STEP; + this.type = ModelEventType.STEP; String[] names = new String[signals.size()]; for (int i = 0; i < signals.size(); i++) @@ -50,14 +51,14 @@ public class ValueTableObserver implements ModelStateObserverTyped { if (event == ModelEvent.STARTED) logData.clear(); - if (event == ModelEvent.EXTERNALCHANGE && type == ModelEvent.MICROSTEP) { + if (event == ModelEvent.EXTERNALCHANGE && type == ModelEventType.MICROSTEP) { if (manualSample == null) manualSample = new Value[logData.getColumns()]; for (int i = 0; i < logData.getColumns(); i++) manualSample[i] = new Value(signals.get(i).getValue()); } - if (event == type) { + if (event.getType() == type) { if (manualSample != null) { logData.add(new TestRow(manualSample)); manualSample = null; @@ -70,8 +71,8 @@ public class ValueTableObserver implements ModelStateObserverTyped { } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{type, ModelEvent.STARTED, ModelEvent.EXTERNALCHANGE}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{type, ModelEventType.STARTED, ModelEventType.EXTERNALCHANGE}; } /** diff --git a/src/main/java/de/neemann/digital/gui/tutorial/InitialTutorial.java b/src/main/java/de/neemann/digital/gui/tutorial/InitialTutorial.java index 87aa1aab6..56b736da7 100644 --- a/src/main/java/de/neemann/digital/gui/tutorial/InitialTutorial.java +++ b/src/main/java/de/neemann/digital/gui/tutorial/InitialTutorial.java @@ -227,8 +227,8 @@ public class InitialTutorial extends JDialog implements CircuitComponent.Tutoria } @Override - public ModelEvent[] getEvents() { - return new ModelEvent[]{ModelEvent.EXTERNALCHANGE}; + public ModelEventType[] getEvents() { + return new ModelEventType[]{ModelEventType.EXTERNALCHANGE}; } @Override