mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-13 23:06:22 -04:00
made the model events a simple enum.
This commit is contained in:
parent
831c5068fe
commit
198fecea32
@ -1,27 +1,43 @@
|
|||||||
package de.neemann.digital.core;
|
package de.neemann.digital.core;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* A event fired by the model
|
||||||
|
*
|
||||||
* @author hneemann
|
* @author hneemann
|
||||||
*/
|
*/
|
||||||
public class ModelEvent {
|
public enum ModelEvent {
|
||||||
|
|
||||||
public static final ModelEvent STEP = new ModelEvent(Event.STEP);
|
/**
|
||||||
public static final ModelEvent MICROSTEP = new ModelEvent(Event.MICROSTEP);
|
* Is fired after the model had became stable after first stabilization.
|
||||||
public static final ModelEvent STARTED = new ModelEvent(Event.STARTED);
|
*/
|
||||||
public static final ModelEvent BREAK = new ModelEvent(Event.BREAK);
|
STARTED,
|
||||||
public static final ModelEvent STOPPED = new ModelEvent(Event.STOPPED);
|
|
||||||
public static final ModelEvent MANUALCHANGE = new ModelEvent(Event.MANUALCHANGE);
|
|
||||||
|
|
||||||
public enum Event {STARTED, STOPPED, STEP, BREAK, MANUALCHANGE, MICROSTEP}
|
/**
|
||||||
|
* The model had stopped.
|
||||||
|
*/
|
||||||
|
STOPPED,
|
||||||
|
|
||||||
private final Event event;
|
/**
|
||||||
|
* 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,
|
||||||
|
|
||||||
private ModelEvent(Event event) {
|
/**
|
||||||
this.event = event;
|
* A break is detected.
|
||||||
}
|
*/
|
||||||
|
BREAK,
|
||||||
|
|
||||||
public Event getType() {
|
/**
|
||||||
return event;
|
* Here was a manual change to the model by the user.
|
||||||
}
|
*/
|
||||||
|
MANUALCHANGE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If fired if a micro step is calculated.
|
||||||
|
* This means the aktual nodes are calculated, but not the effected nodes.
|
||||||
|
*/
|
||||||
|
MICROSTEP;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,17 @@
|
|||||||
package de.neemann.digital.core;
|
package de.neemann.digital.core;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Interface to implement observers of the model.
|
||||||
|
*
|
||||||
* @author hneemann
|
* @author hneemann
|
||||||
*/
|
*/
|
||||||
public interface ModelStateObserver {
|
public interface ModelStateObserver {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* called if a event was detected.
|
||||||
|
*
|
||||||
|
* @param event the event
|
||||||
|
*/
|
||||||
void handleEvent(ModelEvent event);
|
void handleEvent(ModelEvent event);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ public class RealTimeClock implements ModelStateObserver {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(ModelEvent event) {
|
public void handleEvent(ModelEvent event) {
|
||||||
switch (event.getType()) {
|
switch (event) {
|
||||||
case STARTED:
|
case STARTED:
|
||||||
if (frequency > 50) // if frequency is high it is not necessary to update the GUI at every clock
|
if (frequency > 50) // if frequency is high it is not necessary to update the GUI at every clock
|
||||||
output.removeObserver(GuiModelObserver.class);
|
output.removeObserver(GuiModelObserver.class);
|
||||||
|
@ -23,14 +23,14 @@ import java.util.ArrayList;
|
|||||||
*/
|
*/
|
||||||
public class DataShape implements Shape {
|
public class DataShape implements Shape {
|
||||||
|
|
||||||
private final ModelEvent.Event type;
|
private final ModelEvent type;
|
||||||
private DataSet dataSet;
|
private DataSet dataSet;
|
||||||
|
|
||||||
public DataShape(ElementAttributes attr) {
|
public DataShape(ElementAttributes attr) {
|
||||||
if (attr.get(AttributeKey.MicroStep))
|
if (attr.get(AttributeKey.MicroStep))
|
||||||
type = ModelEvent.Event.MICROSTEP;
|
type = ModelEvent.MICROSTEP;
|
||||||
else
|
else
|
||||||
type = ModelEvent.Event.STEP;
|
type = ModelEvent.STEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -16,7 +16,7 @@ import de.neemann.digital.gui.components.CircuitComponent;
|
|||||||
*/
|
*/
|
||||||
public class GuiModelObserver implements Observer, ModelStateObserver {
|
public class GuiModelObserver implements Observer, ModelStateObserver {
|
||||||
private final CircuitComponent component;
|
private final CircuitComponent component;
|
||||||
private final ModelEvent.Event type;
|
private final ModelEvent type;
|
||||||
private boolean changed = false;
|
private boolean changed = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -25,7 +25,7 @@ public class GuiModelObserver implements Observer, ModelStateObserver {
|
|||||||
* @param component the component to update
|
* @param component the component to update
|
||||||
* @param type the event type which triggers a repainting
|
* @param type the event type which triggers a repainting
|
||||||
*/
|
*/
|
||||||
public GuiModelObserver(CircuitComponent component, ModelEvent.Event type) {
|
public GuiModelObserver(CircuitComponent component, ModelEvent type) {
|
||||||
this.component = component;
|
this.component = component;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
@ -37,7 +37,7 @@ public class GuiModelObserver implements Observer, ModelStateObserver {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(ModelEvent event) {
|
public void handleEvent(ModelEvent event) {
|
||||||
if (changed && event.getType() == type) {
|
if (changed && event == type) {
|
||||||
component.paintImmediately(0, 0, component.getWidth(), component.getHeight());
|
component.paintImmediately(0, 0, component.getWidth(), component.getHeight());
|
||||||
changed = false;
|
changed = false;
|
||||||
}
|
}
|
||||||
|
@ -374,7 +374,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
|
|||||||
@Override
|
@Override
|
||||||
public void enter() {
|
public void enter() {
|
||||||
super.enter();
|
super.enter();
|
||||||
if (createAndStartModel(settings.get(AttributeKey.StartTimer), ModelEvent.Event.STEP))
|
if (createAndStartModel(settings.get(AttributeKey.StartTimer), ModelEvent.STEP))
|
||||||
circuitComponent.setManualChangeObserver(new FullStepObserver(model));
|
circuitComponent.setManualChangeObserver(new FullStepObserver(model));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -382,7 +382,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
|
|||||||
@Override
|
@Override
|
||||||
public void enter() {
|
public void enter() {
|
||||||
super.enter();
|
super.enter();
|
||||||
if (createAndStartModel(false, ModelEvent.Event.MICROSTEP))
|
if (createAndStartModel(false, ModelEvent.MICROSTEP))
|
||||||
circuitComponent.setManualChangeObserver(new MicroStepObserver(model));
|
circuitComponent.setManualChangeObserver(new MicroStepObserver(model));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -416,7 +416,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean createAndStartModel(boolean runClock, ModelEvent.Event updateEvent) {
|
private boolean createAndStartModel(boolean runClock, ModelEvent updateEvent) {
|
||||||
try {
|
try {
|
||||||
circuitComponent.removeHighLighted();
|
circuitComponent.removeHighLighted();
|
||||||
circuitComponent.setModeAndReset(true);
|
circuitComponent.setModeAndReset(true);
|
||||||
|
@ -20,10 +20,10 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class ProbeDialog extends JDialog implements ModelStateObserver {
|
public class ProbeDialog extends JDialog implements ModelStateObserver {
|
||||||
|
|
||||||
private final ModelEvent.Event type;
|
private final ModelEvent type;
|
||||||
private final SignalTableModel tableModel;
|
private final SignalTableModel tableModel;
|
||||||
|
|
||||||
public ProbeDialog(Frame owner, Model model, ModelEvent.Event type, List<String> ordering) {
|
public ProbeDialog(Frame owner, Model model, ModelEvent 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;
|
||||||
@ -61,7 +61,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserver {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(ModelEvent event) {
|
public void handleEvent(ModelEvent event) {
|
||||||
if (event.getType() == type || event.getType() == ModelEvent.Event.MANUALCHANGE) {
|
if (event == type || event == ModelEvent.MANUALCHANGE) {
|
||||||
tableModel.fireChanged();
|
tableModel.fireChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ public class DataSetDialog extends JDialog implements ModelStateObserver {
|
|||||||
* @param type the event type which triggers a new DataSample
|
* @param type the event type which triggers a new DataSample
|
||||||
* @param ordering
|
* @param ordering
|
||||||
*/
|
*/
|
||||||
public DataSetDialog(Frame owner, Model model, ModelEvent.Event type, List<String> ordering) {
|
public DataSetDialog(Frame owner, Model model, ModelEvent 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);
|
||||||
setAlwaysOnTop(true);
|
setAlwaysOnTop(true);
|
||||||
|
@ -9,29 +9,29 @@ import de.neemann.digital.core.ModelStateObserver;
|
|||||||
public class DataSetObserver implements ModelStateObserver {
|
public class DataSetObserver implements ModelStateObserver {
|
||||||
|
|
||||||
private final DataSet dataSet;
|
private final DataSet dataSet;
|
||||||
private final ModelEvent.Event type;
|
private final ModelEvent type;
|
||||||
|
|
||||||
private DataSample manualSample;
|
private DataSample manualSample;
|
||||||
private int maintime;
|
private int maintime;
|
||||||
|
|
||||||
public DataSetObserver(ModelEvent.Event type, DataSet dataSet) {
|
public DataSetObserver(ModelEvent type, DataSet dataSet) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.dataSet = dataSet;
|
this.dataSet = dataSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(ModelEvent event) {
|
public void handleEvent(ModelEvent event) {
|
||||||
if (event.getType() == ModelEvent.Event.STARTED) {
|
if (event == ModelEvent.STARTED) {
|
||||||
dataSet.clear();
|
dataSet.clear();
|
||||||
maintime = 0;
|
maintime = 0;
|
||||||
}
|
}
|
||||||
if (event.getType() == ModelEvent.Event.MANUALCHANGE) {
|
if (event == ModelEvent.MANUALCHANGE) {
|
||||||
if (manualSample == null)
|
if (manualSample == null)
|
||||||
manualSample = new DataSample(maintime, dataSet.signalSize());
|
manualSample = new DataSample(maintime, dataSet.signalSize());
|
||||||
manualSample.fillWith(dataSet.getSignals());
|
manualSample.fillWith(dataSet.getSignals());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.getType() == type) {
|
if (event == type) {
|
||||||
if (manualSample != null) {
|
if (manualSample != null) {
|
||||||
dataSet.add(manualSample);
|
dataSet.add(manualSample);
|
||||||
manualSample = null;
|
manualSample = null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user