basic refactoring of ModelEvent's

This commit is contained in:
hneemann 2020-07-21 19:34:09 +02:00
parent a08496b5b1
commit b3ba581911
20 changed files with 212 additions and 118 deletions

View File

@ -221,7 +221,7 @@ public class Model implements Iterable<Node>, SyncAccess {
for (ModelStateObserver ob : observersMicroStep) for (ModelStateObserver ob : observersMicroStep)
LOGGER.debug("Observer Micro: " + ob.getClass().getSimpleName()); LOGGER.debug("Observer Micro: " + ob.getClass().getSimpleName());
fireEvent(ModelEvent.STOPPED); fireEvent(ModelEvent.CLOSED);
} }
} }
@ -429,9 +429,9 @@ public class Model implements Iterable<Node>, SyncAccess {
* @param event the mandatory event * @param event the mandatory event
* @param events more optional events * @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); addObserverForEvent(observer, event);
for (ModelEvent ev : events) for (ModelEventType ev : events)
addObserverForEvent(observer, ev); addObserverForEvent(observer, ev);
} }
@ -441,18 +441,18 @@ public class Model implements Iterable<Node>, SyncAccess {
* @param observer the observer to add * @param observer the observer to add
*/ */
public void addObserver(ModelStateObserverTyped observer) { public void addObserver(ModelStateObserverTyped observer) {
for (ModelEvent ev : observer.getEvents()) for (ModelEventType ev : observer.getEvents())
addObserverForEvent(observer, ev); addObserverForEvent(observer, ev);
} }
private void addObserverForEvent(ModelStateObserver observer, ModelEvent event) { private void addObserverForEvent(ModelStateObserver observer, ModelEventType event) {
ArrayList<ModelStateObserver> obs = observers; ArrayList<ModelStateObserver> obs = observers;
if (event == ModelEvent.STEP) { if (event == ModelEventType.STEP) {
if (observersStep == null) if (observersStep == null)
observersStep = new ArrayList<>(); observersStep = new ArrayList<>();
obs = observersStep; obs = observersStep;
} else if (event == ModelEvent.MICROSTEP) { } else if (event == ModelEventType.MICROSTEP) {
if (observersMicroStep == null) if (observersMicroStep == null)
observersMicroStep = new ArrayList<>(); observersMicroStep = new ArrayList<>();
obs = observersMicroStep; obs = observersMicroStep;
@ -498,7 +498,7 @@ public class Model implements Iterable<Node>, SyncAccess {
} }
private void fireEvent(ModelEvent event) { private void fireEvent(ModelEvent event) {
switch (event) { switch (event.getType()) {
case MICROSTEP: case MICROSTEP:
if (observersMicroStep != null) if (observersMicroStep != null)
for (ModelStateObserver observer : observersMicroStep) for (ModelStateObserver observer : observersMicroStep)

View File

@ -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 * Use of this source code is governed by the GPL v3 license
* that can be found in the LICENSE file. * that can be found in the LICENSE file.
*/ */
package de.neemann.digital.core; 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. * @return the cause in case of an error
* This means a change is propagated through all nodes, and the model has
* become stable again.
*/ */
STEP, public Exception getCause() {
return cause;
}
/** @Override
* Fast run is started. public boolean equals(Object o) {
*/ if (this == o) return true;
FASTRUN, if (o == null || getClass() != o.getClass()) return false;
ModelEvent that = (ModelEvent) o;
/** return type == that.type;
* 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 int hashCode() {
return Objects.hash(type);
}
} }

View File

@ -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
}

View File

@ -13,6 +13,6 @@ public interface ModelStateObserverTyped extends ModelStateObserver {
/** /**
* @return the events on which this handler needs to be called * @return the events on which this handler needs to be called
*/ */
ModelEvent[] getEvents(); ModelEventType[] getEvents();
} }

View File

@ -112,13 +112,13 @@ public class External extends Node implements Element {
} }
model.addObserver(event -> { model.addObserver(event -> {
if (event.equals(ModelEvent.STOPPED)) { if (event.equals(ModelEventType.CLOSED)) {
try { try {
processInterface.close(); processInterface.close();
} catch (IOException e) { } catch (IOException e) {
SwingUtilities.invokeLater(new ErrorMessage(Lang.get("msg_errorClosingExternalProcess")).addCause(e)); SwingUtilities.invokeLater(new ErrorMessage(Lang.get("msg_errorClosingExternalProcess")).addCause(e));
} }
} }
}, ModelEvent.STOPPED); }, ModelEventType.CLOSED);
} }
} }

View File

@ -6,7 +6,7 @@
package de.neemann.digital.core.io; package de.neemann.digital.core.io;
import de.neemann.digital.core.Model; 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.core.NodeException;
import de.neemann.digital.lang.Lang; import de.neemann.digital.lang.Lang;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -73,9 +73,9 @@ public final class MIDIHelper {
isOpen = true; isOpen = true;
model.addObserver(event -> { model.addObserver(event -> {
if (event.equals(ModelEvent.STOPPED)) if (event.equals(ModelEventType.CLOSED))
close(); close();
}, ModelEvent.STOPPED); }, ModelEventType.CLOSED);
} }
} }

View File

@ -84,7 +84,7 @@ public class EEPROM extends Node implements Element, RAMInterface, ROMInterface
super.registerNodes(model); super.registerNodes(model);
if (memory.isEmpty()) if (memory.isEmpty())
model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEvent.STOPPED); model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEventType.CLOSED);
} }
@Override @Override

View File

@ -6,7 +6,7 @@
package de.neemann.digital.core.memory; package de.neemann.digital.core.memory;
import de.neemann.digital.core.Model; 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.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription; import de.neemann.digital.core.element.ElementTypeDescription;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
@ -60,7 +60,7 @@ public class EEPROMDualPort extends RAMDualPort implements ROMInterface {
super.registerNodes(model); super.registerNodes(model);
if (memory.isEmpty()) if (memory.isEmpty())
model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEvent.STOPPED); model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEventType.CLOSED);
} }
} }

View File

@ -72,11 +72,11 @@ public class TransGate extends Node implements Element {
public void init(Model model) throws NodeException { public void init(Model model) throws NodeException {
aSwitch.init(model); aSwitch.init(model);
model.addObserver(event -> { model.addObserver(event -> {
if (event.equals(ModelEvent.STEP)) { if (event.equals(ModelEventType.STEP)) {
if (!s.isHighZ() && !ns.isHighZ() && (s.getBool() == ns.getBool())) if (!s.isHighZ() && !ns.isHighZ() && (s.getBool() == ns.getBool()))
throw new BurnException(Lang.get("err_invalidTransmissionGateState"), new ObservableValues(s, ns)); throw new BurnException(Lang.get("err_invalidTransmissionGateState"), new ObservableValues(s, ns));
} }
}, ModelEvent.STEP); }, ModelEventType.STEP);
} }
/** /**

View File

@ -6,6 +6,7 @@
package de.neemann.digital.core.wiring.bus; package de.neemann.digital.core.wiring.bus;
import de.neemann.digital.core.ModelEvent; import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelEventType;
import de.neemann.digital.core.ModelStateObserverTyped; import de.neemann.digital.core.ModelStateObserverTyped;
import de.neemann.digital.core.switching.PlainSwitch; import de.neemann.digital.core.switching.PlainSwitch;
@ -40,8 +41,8 @@ public final class BusModelStateObserver implements ModelStateObserverTyped {
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{ModelEvent.STEP}; return new ModelEventType[]{ModelEventType.STEP};
} }
/** /**

View File

@ -111,13 +111,13 @@ public class GifExporter extends JDialog implements ModelStateObserverTyped, Mod
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
if (event.equals(ModelEvent.STEP)) if (event == ModelEvent.STEP)
writeImage(); writeImage();
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{ModelEvent.STEP}; return new ModelEventType[]{ModelEventType.STEP};
} }
private void writeImage() { private void writeImage() {

View File

@ -5,10 +5,7 @@
*/ */
package de.neemann.digital.draw.model; package de.neemann.digital.draw.model;
import de.neemann.digital.core.Model; import de.neemann.digital.core.*;
import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelStateObserverTyped;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.wiring.AsyncSeq; import de.neemann.digital.core.wiring.AsyncSeq;
import de.neemann.digital.gui.ErrorStopper; import de.neemann.digital.gui.ErrorStopper;
import de.neemann.digital.lang.Lang; import de.neemann.digital.lang.Lang;
@ -46,14 +43,14 @@ public class AsyncSequentialClock implements ModelStateObserverTyped {
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
switch (event) { switch (event.getType()) {
case STARTED: case STARTED:
int delayMuS = 1000000 / frequency; int delayMuS = 1000000 / frequency;
if (delayMuS < 100) if (delayMuS < 100)
delayMuS = 100; delayMuS = 100;
runner = new RealTimeRunner(delayMuS); runner = new RealTimeRunner(delayMuS);
break; break;
case STOPPED: case CLOSED:
if (runner != null) if (runner != null)
runner.stop(); runner.stop();
break; break;
@ -61,8 +58,8 @@ public class AsyncSequentialClock implements ModelStateObserverTyped {
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{ModelEvent.STARTED, ModelEvent.STOPPED}; return new ModelEventType[]{ModelEventType.STARTED, ModelEventType.CLOSED};
} }
/** /**

View File

@ -55,7 +55,7 @@ public class RealTimeClock implements ModelStateObserverTyped {
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
switch (event) { switch (event.getType()) {
case STARTED: case STARTED:
int delayMuS = 500000 / frequency; int delayMuS = 500000 / frequency;
if (delayMuS < 1) if (delayMuS < 1)
@ -63,7 +63,7 @@ public class RealTimeClock implements ModelStateObserverTyped {
else else
runner = new RealTimeRunner(delayMuS); runner = new RealTimeRunner(delayMuS);
break; break;
case STOPPED: case CLOSED:
if (runner != null) if (runner != null)
runner.stop(); runner.stop();
break; break;
@ -71,8 +71,8 @@ public class RealTimeClock implements ModelStateObserverTyped {
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{ModelEvent.STARTED, ModelEvent.STOPPED}; return new ModelEventType[]{ModelEventType.STARTED, ModelEventType.CLOSED};
} }
/** /**

View File

@ -459,9 +459,9 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav
value.addObserverToValue(() -> setActiveState(value.getValue())); value.addObserverToValue(() -> setActiveState(value.getValue()));
setActiveState(value.getValue()); setActiveState(value.getValue());
model.addObserver(event -> { model.addObserver(event -> {
if (event == ModelEvent.STOPPED) if (event == ModelEvent.CLOSED)
setActiveState(-1); setActiveState(-1);
}, ModelEvent.STOPPED }, ModelEventType.CLOSED
); );
} }
} }

View File

@ -1060,9 +1060,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
@Override @Override
public void actionPerformed(ActionEvent actionEvent) { public void actionPerformed(ActionEvent actionEvent) {
if (model != null) { if (model != null) {
ModelEvent event = ModelEvent.STEP; ModelEventType event = ModelEventType.STEP;
if (stateManager.isActive(runModelMicroState)) if (stateManager.isActive(runModelMicroState))
event = ModelEvent.MICROSTEP; event = ModelEventType.MICROSTEP;
showMeasurementDialog(event); showMeasurementDialog(event);
} }
} }
@ -1072,9 +1072,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
@Override @Override
public void actionPerformed(ActionEvent actionEvent) { public void actionPerformed(ActionEvent actionEvent) {
if (model != null) { if (model != null) {
ModelEvent event = ModelEvent.STEP; ModelEventType event = ModelEventType.STEP;
if (stateManager.isActive(runModelMicroState)) if (stateManager.isActive(runModelMicroState))
event = ModelEvent.MICROSTEP; event = ModelEventType.MICROSTEP;
showMeasurementGraph(event); showMeasurementGraph(event);
} }
} }
@ -1286,7 +1286,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
showMeasurementGraph.setEnabled(true); showMeasurementGraph.setEnabled(true);
stoppedState.getAction().setEnabled(true); stoppedState.getAction().setEnabled(true);
runTests.setEnabled(false); runTests.setEnabled(false);
createAndStartModel(false, ModelEvent.MICROSTEP, null); createAndStartModel(false, ModelEventType.MICROSTEP, null);
} }
}); });
stateManager.setActualState(stoppedState); stateManager.setActualState(stoppedState);
@ -1323,7 +1323,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
showMeasurementDialog.setEnabled(true); showMeasurementDialog.setEnabled(true);
showMeasurementGraph.setEnabled(true); showMeasurementGraph.setEnabled(true);
runTests.setEnabled(false); 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; model = null;
} }
private void createAndStartModel(boolean globalRunClock, ModelEvent updateEvent, ModelModifier modelModifier) { private void createAndStartModel(boolean globalRunClock, ModelEventType updateEvent, ModelModifier modelModifier) {
try { try {
circuitComponent.removeHighLighted(); circuitComponent.removeHighLighted();
@ -1376,7 +1376,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
if (threadRunnerCount > 1) if (threadRunnerCount > 1)
throw new RuntimeException(Lang.get("err_moreThanOneFastClock")); throw new RuntimeException(Lang.get("err_moreThanOneFastClock"));
} }
if (!realTimeClockRunning && updateEvent == ModelEvent.MICROSTEP) { if (!realTimeClockRunning && updateEvent == ModelEventType.MICROSTEP) {
// no real clock // no real clock
AsyncSeq ai = model.getAsyncInfos(); AsyncSeq ai = model.getAsyncInfos();
if (ai != null) { if (ai != null) {
@ -1399,7 +1399,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
doMicroStep.setEnabled(false); doMicroStep.setEnabled(false);
if (!realTimeClockRunning && model.isRunToBreakAllowed()) { if (!realTimeClockRunning && model.isRunToBreakAllowed()) {
if (updateEvent == ModelEvent.MICROSTEP) if (updateEvent == ModelEventType.MICROSTEP)
runToBreakMicroAction.setEnabled(true); runToBreakMicroAction.setEnabled(true);
else else
runToBreakAction.setEnabled(true); 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")) if (settings.get(Keys.SHOW_DATA_GRAPH) || windowPosManager.isVisible("dataSet"))
showMeasurementGraph(updateEvent); showMeasurementGraph(updateEvent);
if (settings.get(Keys.SHOW_DATA_GRAPH_MICRO)) if (settings.get(Keys.SHOW_DATA_GRAPH_MICRO))
showMeasurementGraph(ModelEvent.MICROSTEP); showMeasurementGraph(ModelEventType.MICROSTEP);
if (modelModifier != null) if (modelModifier != null)
modelModifier.preInit(model); 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); new ProgramMemoryLoader(settings.get(Keys.PROGRAM_TO_PRELOAD)).preInit(model);
} }
if (updateEvent == ModelEvent.MICROSTEP) { if (updateEvent == ModelEventType.MICROSTEP) {
checkMicroStepActions(model); checkMicroStepActions(model);
model.addObserver(new MicroStepObserver(model)); model.addObserver(new MicroStepObserver(model));
} else if (updateEvent == ModelEvent.STEP) { } else if (updateEvent == ModelEventType.STEP) {
if (maxFrequency <= 50) if (maxFrequency <= 50)
model.addObserver(new FullStepObserver(model)); model.addObserver(new FullStepObserver(model));
else else
@ -1432,9 +1432,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
} }
model.addObserver(event -> { model.addObserver(event -> {
if (event.equals(ModelEvent.STOPPED)) if (event.equals(ModelEventType.CLOSED))
SwingUtilities.invokeLater(this::ensureModelIsStopped); SwingUtilities.invokeLater(this::ensureModelIsStopped);
}, ModelEvent.STOPPED); }, ModelEventType.CLOSED);
model.init(); 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)); windowPosManager.register("keyboard_" + k.getLabel(), new KeyboardDialog(this, k, model));
} }
private void showMeasurementGraph(ModelEvent updateEvent) { private void showMeasurementGraph(ModelEventType updateEvent) {
List<String> ordering = circuitComponent.getCircuit().getMeasurementOrdering(); List<String> 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<String> ordering = circuitComponent.getCircuit().getMeasurementOrdering(); List<String> ordering = circuitComponent.getCircuit().getMeasurementOrdering();
windowPosManager.register("probe", new ProbeDialog(this, model, updateEvent, ordering)).setVisible(true); 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 @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
try { try {
switch (event) { switch (event.getType()) {
case EXTERNALCHANGE: case EXTERNALCHANGE:
model.doStep(); model.doStep();
circuitComponent.graphicHasChanged(); circuitComponent.graphicHasChanged();
@ -1664,8 +1664,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{ModelEvent.EXTERNALCHANGE, ModelEvent.BREAK}; return new ModelEventType[]{ModelEventType.EXTERNALCHANGE, ModelEventType.BREAK};
} }
} }
@ -1681,11 +1681,11 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
switch (event) { switch (event.getType()) {
case STARTED: case STARTED:
timer.start(); timer.start();
break; break;
case STOPPED: case CLOSED:
case BREAK: case BREAK:
timer.stop(); timer.stop();
circuitComponent.graphicHasChanged(); circuitComponent.graphicHasChanged();
@ -1694,8 +1694,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{ModelEvent.STOPPED, ModelEvent.BREAK}; return new ModelEventType[]{ModelEventType.CLOSED, ModelEventType.BREAK};
} }
} }
@ -1711,7 +1711,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
switch (event) { switch (event.getType()) {
case EXTERNALCHANGE: case EXTERNALCHANGE:
case MICROSTEP: case MICROSTEP:
case BREAK: case BREAK:
@ -1727,8 +1727,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{ModelEvent.EXTERNALCHANGE, ModelEvent.MICROSTEP, ModelEvent.BREAK}; 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)); runModelState.enter(false, new ProgramMemoryLoader(romHex));
circuitComponent.graphicHasChanged(); circuitComponent.graphicHasChanged();
if (model != null) if (model != null)
showMeasurementDialog(ModelEvent.STEP); showMeasurementDialog(ModelEventType.STEP);
}); });
} }

View File

@ -231,9 +231,9 @@ public class DataEditor extends JDialog {
if (model != null) { if (model != null) {
model.getWindowPosManager().register("RAM_DATA_" + label, this); model.getWindowPosManager().register("RAM_DATA_" + label, this);
model.addObserver(event -> { model.addObserver(event -> {
if (event.equals(ModelEvent.STOPPED)) if (event.equals(ModelEventType.CLOSED))
detachFromRunningModel(); detachFromRunningModel();
}, ModelEvent.STOPPED); }, ModelEventType.CLOSED);
} }
} }

View File

@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
*/ */
public class ProbeDialog extends JDialog implements ModelStateObserverTyped { public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
private final ModelEvent type; private final ModelEventType type;
private final SignalTableModel tableModel; private final SignalTableModel tableModel;
private boolean tableUpdateEnable = true; 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 type the event type which fires a dialog repaint
* @param ordering the names list used to order the measurement values * @param ordering the names list used to order the measurement values
*/ */
public ProbeDialog(Frame owner, Model model, ModelEvent type, List<String> ordering) { public ProbeDialog(Frame owner, Model model, ModelEventType type, List<String> ordering) {
super(owner, Lang.get("win_measures"), false); super(owner, Lang.get("win_measures"), false);
setDefaultCloseOperation(DISPOSE_ON_CLOSE); setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.type = type; this.type = type;
@ -109,7 +109,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
if (event == type || event == ModelEvent.EXTERNALCHANGE) { if (event.getType() == type || event == ModelEvent.EXTERNALCHANGE) {
if (tableUpdateEnable) { if (tableUpdateEnable) {
if (paintPending.compareAndSet(false, true)) { if (paintPending.compareAndSet(false, true)) {
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
@ -119,12 +119,12 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
} }
} }
} }
switch (event) { switch (event.getType()) {
case FASTRUN: case FASTRUN:
tableUpdateEnable = false; tableUpdateEnable = false;
break; break;
case BREAK: case BREAK:
case STOPPED: case CLOSED:
tableUpdateEnable = true; tableUpdateEnable = true;
SwingUtilities.invokeLater(tableModel::fireChanged); SwingUtilities.invokeLater(tableModel::fireChanged);
break; break;
@ -132,8 +132,8 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{type, ModelEvent.EXTERNALCHANGE, ModelEvent.FASTRUN, ModelEvent.BREAK, ModelEvent.STOPPED}; return new ModelEventType[]{type, ModelEventType.EXTERNALCHANGE, ModelEventType.FASTRUN, ModelEventType.BREAK, ModelEventType.CLOSED};
} }
private static class SignalTableModel implements TableModel { private static class SignalTableModel implements TableModel {

View File

@ -180,13 +180,13 @@ public final class SingleValueDialog extends JDialog implements ModelStateObserv
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
if (event.equals(ModelEvent.STOPPED)) if (event.equals(ModelEvent.CLOSED))
dispose(); dispose();
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{ModelEvent.STOPPED}; return new ModelEventType[]{ModelEventType.CLOSED};
} }
private JPanel createCheckBoxPanel(int bits, long value) { private JPanel createCheckBoxPanel(int bits, long value) {

View File

@ -6,6 +6,7 @@
package de.neemann.digital.gui.components.data; package de.neemann.digital.gui.components.data;
import de.neemann.digital.core.ModelEvent; import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelEventType;
import de.neemann.digital.core.ModelStateObserverTyped; import de.neemann.digital.core.ModelStateObserverTyped;
import de.neemann.digital.core.Signal; import de.neemann.digital.core.Signal;
import de.neemann.digital.data.Value; import de.neemann.digital.data.Value;
@ -20,7 +21,7 @@ import java.util.ArrayList;
public class ValueTableObserver implements ModelStateObserverTyped { public class ValueTableObserver implements ModelStateObserverTyped {
private final ValueTable logData; private final ValueTable logData;
private final ModelEvent type; private final ModelEventType type;
private final ArrayList<Signal> signals; private final ArrayList<Signal> signals;
private Value[] manualSample; private Value[] manualSample;
@ -35,9 +36,9 @@ public class ValueTableObserver implements ModelStateObserverTyped {
public ValueTableObserver(boolean microStep, ArrayList<Signal> signals, int maxSize) { public ValueTableObserver(boolean microStep, ArrayList<Signal> signals, int maxSize) {
this.signals = signals; this.signals = signals;
if (microStep) if (microStep)
this.type = ModelEvent.MICROSTEP; this.type = ModelEventType.MICROSTEP;
else else
this.type = ModelEvent.STEP; this.type = ModelEventType.STEP;
String[] names = new String[signals.size()]; String[] names = new String[signals.size()];
for (int i = 0; i < signals.size(); i++) for (int i = 0; i < signals.size(); i++)
@ -50,14 +51,14 @@ public class ValueTableObserver implements ModelStateObserverTyped {
if (event == ModelEvent.STARTED) if (event == ModelEvent.STARTED)
logData.clear(); logData.clear();
if (event == ModelEvent.EXTERNALCHANGE && type == ModelEvent.MICROSTEP) { if (event == ModelEvent.EXTERNALCHANGE && type == ModelEventType.MICROSTEP) {
if (manualSample == null) if (manualSample == null)
manualSample = new Value[logData.getColumns()]; manualSample = new Value[logData.getColumns()];
for (int i = 0; i < logData.getColumns(); i++) for (int i = 0; i < logData.getColumns(); i++)
manualSample[i] = new Value(signals.get(i).getValue()); manualSample[i] = new Value(signals.get(i).getValue());
} }
if (event == type) { if (event.getType() == type) {
if (manualSample != null) { if (manualSample != null) {
logData.add(new TestRow(manualSample)); logData.add(new TestRow(manualSample));
manualSample = null; manualSample = null;
@ -70,8 +71,8 @@ public class ValueTableObserver implements ModelStateObserverTyped {
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{type, ModelEvent.STARTED, ModelEvent.EXTERNALCHANGE}; return new ModelEventType[]{type, ModelEventType.STARTED, ModelEventType.EXTERNALCHANGE};
} }
/** /**

View File

@ -227,8 +227,8 @@ public class InitialTutorial extends JDialog implements CircuitComponent.Tutoria
} }
@Override @Override
public ModelEvent[] getEvents() { public ModelEventType[] getEvents() {
return new ModelEvent[]{ModelEvent.EXTERNALCHANGE}; return new ModelEventType[]{ModelEventType.EXTERNALCHANGE};
} }
@Override @Override