diff --git a/src/main/java/fabrik/simulator/pic16f84/Commands.java b/src/main/java/fabrik/simulator/pic16f84/Commands.java index f34645b..bd2856a 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Commands.java +++ b/src/main/java/fabrik/simulator/pic16f84/Commands.java @@ -1,7 +1,8 @@ package fabrik.simulator.pic16f84; + import fabrik.simulator.pic16f84.interfaces.*; -public class Commands extends PICComponent implements CommandInterface { +public class Commands extends ExecutionTimeSubject implements CommandInterface { private int wRegister; private long totalExecutionTime; private double executionTimeMultiplier = 1; @@ -18,16 +19,17 @@ public class Commands extends PICComponent implements CommandInterface { public void addExecutionTime(int i) { totalExecutionTime += i; - timer.cycles(i); - eeprom.registerTime(false); + super.notifyObservers(); } + @Override public double getTotalExecutionTime() { return (totalExecutionTime * getExecutionTimeMultiplier()); } public void resetTotalExecutionTime() { totalExecutionTime = 0; + super.notifyObservers(); } @@ -252,7 +254,7 @@ public class Commands extends PICComponent implements CommandInterface { } public void SLEEP() { - frontendController.sleep(); + ExecutionState.sleep(); } public void RETFIE() { @@ -556,10 +558,12 @@ public class Commands extends PICComponent implements CommandInterface { } } + @Override public double getExecutionTimeMultiplier(){ return executionTimeMultiplier; } + @Override public void setExecutionTimeMultiplier(String option){ switch (option) { case "8 MHZ": @@ -584,11 +588,6 @@ public class Commands extends PICComponent implements CommandInterface { executionTimeMultiplier = 125; break; } - } - - - @Override - public void initialize(PICComponentLocator locator) { - super.initialize(locator); + super.notifyObservers(); } } diff --git a/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java b/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java index 6b5ea96..24dc854 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java +++ b/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java @@ -1,6 +1,8 @@ package fabrik.simulator.pic16f84; -import com.gluonhq.charm.glisten.control.ToggleButtonGroup; + +import fabrik.simulator.pic16f84.frontendspecifics.FrontendSpecificToggleButtonGroup; +import fabrik.simulator.pic16f84.frontendspecifics.ToggleButtonGroup; import fabrik.simulator.pic16f84.interfaces.*; import javafx.application.Platform; @@ -36,7 +38,7 @@ import java.util.Set; import static java.lang.Math.max; -public class Controller_Frontend extends PICComponent implements FrontendControllerInterface { +public class Controller_Frontend extends PICComponent implements FrontendControllerInterface, ExecutionTimeObserver { private int [] prog; private int [][] read; @@ -163,7 +165,7 @@ public class Controller_Frontend extends PICComponent implements FrontendControl private void updateExecutionTimeMultiplier() { String selectedOption = executionTimeComboBox.getValue(); - commands.setExecutionTimeMultiplier(selectedOption); + executionTime.setExecutionTimeMultiplier(selectedOption); } @FXML @@ -219,15 +221,14 @@ public class Controller_Frontend extends PICComponent implements FrontendControl commands.decode(0); } watchdogTimer.testAndTrigger(); - Table.refresh(); + table.refresh(); CreateWindow.refreshTable(); ioPorts.refreshUI(getTRISbuttons(), getPORTbuttons()); updateStack(); updateWatchdog(); - double totalExecutionTime = commands.getTotalExecutionTime(); - totalExecutionTimeLabel.setText("Total Execution Time: " + totalExecutionTime + "µs"); } + private void markSelectedRow(int currentIndex, String selectedRowStyle) { lstContentListView.setCellFactory(column -> new ListCell() { @Override @@ -282,10 +283,10 @@ public class Controller_Frontend extends PICComponent implements FrontendControl ExecutionState.wakeUp(); breakpoints.clear(); ioPorts.refreshUI(getTRISbuttons(), getPORTbuttons()); - commands.resetTotalExecutionTime(); + executionTime.resetTotalExecutionTime(); watchdogTimer.reset(); wdtCheck.setSelected(false); - Table.refresh(); + table.refresh(); read = ParseFile.parseDatei(fileAddress); prog = read [0]; ind = read[1]; @@ -477,27 +478,27 @@ public class Controller_Frontend extends PICComponent implements FrontendControl - private static void setTRISbuttons(ToggleButtonGroup[] allButtons) { + private void setTRISbuttons(ToggleButtonGroup[] allButtons) { allTRISbuttons = allButtons; } - public static ToggleButtonGroup [] getTRISbuttons() { + public FrontendSpecificToggleButtonGroup [] getTRISbuttons() { return allTRISbuttons; } - private static void setPORTbuttons(ToggleButtonGroup[] allButtons) { + private void setPORTbuttons(ToggleButtonGroup[] allButtons) { allPORTbuttons = allButtons; } - public static ToggleButtonGroup [] getPORTbuttons() { + public ToggleButtonGroup [] getPORTbuttons() { return allPORTbuttons; } - public static Circle[] getLEDsA() { + public Circle[] getLEDsA() { return allLEDsA; } - public static Circle[] getLEDsB() { + public Circle[] getLEDsB() { return allLEDsB; } @@ -565,11 +566,14 @@ public class Controller_Frontend extends PICComponent implements FrontendControl @Override public void initialize(PICComponentLocator locator) { super.initialize(locator); + executionTime.registerObserver(this); this.picComponents = locator; System.out.println("Frontend"); } + + @Override + public void executionTimeChanged() { + totalExecutionTimeLabel.setText("Total Execution Time: " + executionTime.getTotalExecutionTime() + "µs"); + } } - - - diff --git a/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java b/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java index 5ccceeb..f2d7308 100644 --- a/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java +++ b/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java @@ -1,5 +1,6 @@ package fabrik.simulator.pic16f84; +import fabrik.simulator.pic16f84.frontendspecifics.VBox; import fabrik.simulator.pic16f84.interfaces.*; import javafx.application.Application; @@ -8,7 +9,6 @@ import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.layout.GridPane; -import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.io.IOException; @@ -17,19 +17,25 @@ import java.util.Objects; public class CreateWindow extends Application implements WindowManagement { private static PICComponentLocator picComponents; // Subjekt public static GridPane grid = new GridPane(); - private static VBox table; + private TableInterface table; + private static VBox tableBox; @Override public void start(Stage primaryStage) throws IOException { + picComponents.registerComponent(ToggleButtonInterface.class, new ToggleButtonGroupExt()); + picComponents.registerComponent(IOPortInterface.class, new IOPorts()); + picComponents.registerComponent(TableInterface.class, new Table()); picComponents.registerComponent(FrontendControllerInterface.class, new Controller_Frontend()); picComponents.initAll(); + table = picComponents.getComponent(TableInterface.class); + FXMLLoader codewindow = new FXMLLoader(CreateWindow.class.getResource("frontend.fxml")); codewindow.setController(picComponents.getComponent(FrontendControllerInterface.class)); Parent code = codewindow.load(); - table = Table.init(picComponents); - grid.add(table, 1, 1); + tableBox = (VBox) table.getTable(); + grid.add(tableBox, 1, 1); grid.add(code, 0, 1); grid.relocate(0, 0); @@ -50,9 +56,11 @@ public class CreateWindow extends Application implements WindowManagement { } public static void refreshTable() { - grid.getChildren().remove(table); - table= Table.refresh(); - grid.add(table, 1, 1); + TableInterface table = picComponents.getComponent(TableInterface.class); + grid.getChildren().remove(table.getTable()); + table.refresh(); + tableBox = (VBox) table.getTable(); + grid.add(tableBox, 1, 1); } @Override @@ -61,7 +69,6 @@ public class CreateWindow extends Application implements WindowManagement { } public CreateWindow (){ - } } diff --git a/src/main/java/fabrik/simulator/pic16f84/DataRegister.java b/src/main/java/fabrik/simulator/pic16f84/DataRegister.java index a88328e..38712d9 100644 --- a/src/main/java/fabrik/simulator/pic16f84/DataRegister.java +++ b/src/main/java/fabrik/simulator/pic16f84/DataRegister.java @@ -60,7 +60,7 @@ public class DataRegister extends PICComponent implements DataRegisterInterface carryFlag = 0; zeroFlag = 0; digitCarryFlag = 0; - ioPorts.resetTRIS(); + if (null != ioPorts) ioPorts.resetTRIS(); System.out.println(Arrays.toString(dataRegister)); } diff --git a/src/main/java/fabrik/simulator/pic16f84/EEPROM.java b/src/main/java/fabrik/simulator/pic16f84/EEPROM.java index 747b76f..06ea13c 100644 --- a/src/main/java/fabrik/simulator/pic16f84/EEPROM.java +++ b/src/main/java/fabrik/simulator/pic16f84/EEPROM.java @@ -13,7 +13,7 @@ import java.nio.file.Paths; import fabrik.simulator.pic16f84.interfaces.*; -public class EEPROM extends PICComponent implements EEPROMInterface { +public class EEPROM extends PICComponent implements EEPROMInterface, ExecutionTimeObserver { private final int EEDATA = 0x08; private final int EEADR = 0x09; private final int EECON1 = 0x88; @@ -83,13 +83,13 @@ public class EEPROM extends PICComponent implements EEPROMInterface { dataRegister.setDirectBit(EECON1, WRERR, 1); return; } - registerTime(true); + registerTime(executionTime.getTotalExecutionTime(), true); } - public void registerTime(boolean reset) { + public void registerTime(double executionTime, boolean reset) { if (reset) - startTime = commands.getTotalExecutionTime(); - else if ((commands.getTotalExecutionTime() >= (startTime + 1000)) && writeControl) { + startTime = executionTime; + else if ((executionTime >= (startTime + 1000)) && writeControl) { eecon2stages = new boolean[]{false, false}; dataRegister.setDirectBit(EECON1, EEIF, 1); dataRegister.setDirectBit(EECON1, WR, 0); @@ -174,5 +174,11 @@ public class EEPROM extends PICComponent implements EEPROMInterface { @Override public void initialize(PICComponentLocator locator) { super.initialize(locator); + executionTime.registerObserver(this); + } + + @Override + public void executionTimeChanged() { + registerTime(executionTime.getTotalExecutionTime(), false); } } diff --git a/src/main/java/fabrik/simulator/pic16f84/ExecutionState.java b/src/main/java/fabrik/simulator/pic16f84/ExecutionState.java index f35c969..62e1e1e 100644 --- a/src/main/java/fabrik/simulator/pic16f84/ExecutionState.java +++ b/src/main/java/fabrik/simulator/pic16f84/ExecutionState.java @@ -2,18 +2,18 @@ package fabrik.simulator.pic16f84; public class ExecutionState { - private static boolean isAutoRunActive = false; - private static boolean isSleeping = false; - private static double executionTimeMultiplier = 1; + private static boolean isAutoRunActive = false; + private static boolean isSleeping = false; + private static double executionTimeMultiplier = 1; - public static boolean isAutoRunActive() { return isAutoRunActive; } - public static void setAutoRunActive(boolean active) { isAutoRunActive = active; } + public static boolean isAutoRunActive() { return isAutoRunActive; } + public static void setAutoRunActive(boolean active) { isAutoRunActive = active; } - public static boolean isSleeping() { return isSleeping; } - public static void sleep() { isSleeping = true; } - public static void wakeUp() { isSleeping = false; } + public static boolean isSleeping() { return isSleeping; } + public static void sleep() { isSleeping = true; } + public static void wakeUp() { isSleeping = false; } - public static double getExecutionTimeMultiplier() { return executionTimeMultiplier; } - public static void setExecutionTimeMultiplier(double multiplier) { executionTimeMultiplier = multiplier; } - } + public static double getExecutionTimeMultiplier() { return executionTimeMultiplier; } + public static void setExecutionTimeMultiplier(double multiplier) { executionTimeMultiplier = multiplier; } +} diff --git a/src/main/java/fabrik/simulator/pic16f84/ExecutionTimeSubject.java b/src/main/java/fabrik/simulator/pic16f84/ExecutionTimeSubject.java new file mode 100644 index 0000000..f5fe308 --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/ExecutionTimeSubject.java @@ -0,0 +1,54 @@ +package fabrik.simulator.pic16f84; + +import java.util.HashSet; +import java.util.Set; + +import fabrik.simulator.pic16f84.interfaces.ExecutionTimeObserver; +import fabrik.simulator.pic16f84.interfaces.PICComponentInterface; + +public abstract class ExecutionTimeSubject extends PICComponent implements PICComponentInterface{ + private Set observers; + + public ExecutionTimeSubject(){ + super(); + this.observers = new HashSet<>(); + } + + + public void registerObserver(ExecutionTimeObserver observer){ + observers.add(observer); + } + + public void unregisterObserver(ExecutionTimeObserver observer){ + observers.remove(observer); + } + + protected void notifyObservers(){ + observers.forEach(o -> o.executionTimeChanged()); + } + + public double getTotalExecutionTime(){ + throw new UnsupportedOperationException("No class implements ExecutionTimeSubject correctly!"); + } + + public void addExecutionTime(int i){ + throw new UnsupportedOperationException("No class implements ExecutionTimeSubject correctly!"); + } + + public double getExecutionTimeMultiplier(){ + throw new UnsupportedOperationException("No class implements ExecutionTimeSubject correctly!"); + } + + public void setExecutionTimeMultiplier(String option){ + throw new UnsupportedOperationException("No class implements ExecutionTimeSubject correctly!"); + } + + public void resetTotalExecutionTime(){ + throw new UnsupportedOperationException("No class implements ExecutionTimeSubject correctly!"); + } + + @Override + public void initialize(PICComponentLocator locator) { + super.initialize(locator); + } +} diff --git a/src/main/java/fabrik/simulator/pic16f84/IOPorts.java b/src/main/java/fabrik/simulator/pic16f84/IOPorts.java index f8f675e..526804e 100644 --- a/src/main/java/fabrik/simulator/pic16f84/IOPorts.java +++ b/src/main/java/fabrik/simulator/pic16f84/IOPorts.java @@ -1,6 +1,7 @@ package fabrik.simulator.pic16f84; -import com.gluonhq.charm.glisten.control.ToggleButtonGroup; +import fabrik.simulator.pic16f84.frontendspecifics.FrontendSpecificToggleButtonGroup; +import fabrik.simulator.pic16f84.frontendspecifics.ToggleButtonGroup; import fabrik.simulator.pic16f84.interfaces.*; import javafx.collections.ObservableList; import javafx.scene.control.ToggleButton; @@ -77,7 +78,7 @@ public class IOPorts extends PICComponent implements IOPortInterface { dataRegister.setDirectRegister(TRISB, trisLatch[B]); if (((trisLatch[A] >> 4) & 1 )== 1) timer.incrementFromPin(dataRegister.getDirectRegister(PORTA)); - ToggleButtonGroup[] buttons = Controller_Frontend.getPORTbuttons(); + ToggleButtonGroup[] buttons = (ToggleButtonGroup[]) frontendController.getPORTbuttons(); for (int i = 0; i < buttons.length; i++){ int port = (i < 8) ? PORTA : PORTB; int bit = i % 8; @@ -139,7 +140,7 @@ public class IOPorts extends PICComponent implements IOPortInterface { int tris = params[0]; int bit = params[1]; int value = params[2]; - ToggleButtonGroup [] buttonsPORT = Controller_Frontend.getPORTbuttons(); + ToggleButtonGroup [] buttonsPORT = (ToggleButtonGroup[]) frontendController.getPORTbuttons(); if (value == 1){ setBit(tris, bit); buttonsPORT[(tris-TRISA)*8 + bit].setDisable(false); @@ -192,7 +193,7 @@ public class IOPorts extends PICComponent implements IOPortInterface { } public void refreshTable(ToggleButtonGroup parent) { - Table.refresh(); + table.refresh(); CreateWindow.refreshTable(); } @@ -231,4 +232,20 @@ public class IOPorts extends PICComponent implements IOPortInterface { super.initialize(locator); System.out.println("IOPorts.\n"); } + + @Override + public void setPORTfromUI(FrontendSpecificToggleButtonGroup parent) throws IOException { + setPORTfromUI((ToggleButtonGroup) parent); + } + + @Override + public void setTRISfromUI(FrontendSpecificToggleButtonGroup parent) throws IOException { + setTRISfromUI((ToggleButtonGroup) parent); + } + + @Override + public void refreshUI(FrontendSpecificToggleButtonGroup[] trisButtons, + FrontendSpecificToggleButtonGroup[] portButtons) { + refreshUI((ToggleButtonGroup[]) trisButtons, (ToggleButtonGroup[]) portButtons); + } } diff --git a/src/main/java/fabrik/simulator/pic16f84/Interrupts.java b/src/main/java/fabrik/simulator/pic16f84/Interrupts.java index 8561389..5b37b53 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Interrupts.java +++ b/src/main/java/fabrik/simulator/pic16f84/Interrupts.java @@ -30,7 +30,7 @@ public class Interrupts extends PICComponent implements InterruptInterface { enableFlag = dataRegister.getDirectBit(INTCON, enableFlag); int globalFlag = dataRegister.getDirectBit(INTCON, GIE); if (enableFlag == 1) { - frontendController.wakeUpFromSleep(); + ExecutionState.wakeUp(); if (globalFlag == 1) { dataRegister.clearBit(INTCON, GIE); commands.CALL(ISR); diff --git a/src/main/java/fabrik/simulator/pic16f84/Main.java b/src/main/java/fabrik/simulator/pic16f84/Main.java index b59cd38..0092a97 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Main.java +++ b/src/main/java/fabrik/simulator/pic16f84/Main.java @@ -6,12 +6,12 @@ public class Main { private static final PICComponentLocator picComponents = new PICComponentLocator(); // Subjekt public static void main(String[] args) { - picComponents.registerComponent(CommandInterface.class, new Commands()); - picComponents.registerComponent(ToggleButtonInterface.class, new ToggleButtonGroupExt()); + Commands commands = new Commands(); + picComponents.registerComponent(CommandInterface.class, commands); + picComponents.registerComponent(ExecutionTimeSubject.class, commands); picComponents.registerComponent(DataRegisterInterface.class, new DataRegister()); picComponents.registerComponent(EEPROMInterface.class, new EEPROM()); picComponents.registerComponent(InterruptInterface.class, new Interrupts()); - picComponents.registerComponent(IOPortInterface.class, new IOPorts()); picComponents.registerComponent(PreScalerInterface.class, new PreScaler()); picComponents.registerComponent(ProgramStackInterface.class, new ProgramStack()); picComponents.registerComponent(TimerInterface.class, new Timer()); diff --git a/src/main/java/fabrik/simulator/pic16f84/PICComponent.java b/src/main/java/fabrik/simulator/pic16f84/PICComponent.java index c1c70ab..291a7ca 100644 --- a/src/main/java/fabrik/simulator/pic16f84/PICComponent.java +++ b/src/main/java/fabrik/simulator/pic16f84/PICComponent.java @@ -9,13 +9,15 @@ public abstract class PICComponent { IOPortInterface ioPorts; TimerInterface timer; InterruptInterface interrupts; + TableInterface table; FrontendControllerInterface frontendController; WatchdogTimerInterface watchdogTimer; ProgramStackInterface programStack; CommandInterface commands; + ExecutionTimeSubject executionTime; ToggleButtonInterface toggleButtonExt; - void initialize(PICComponentLocator locator) { + public void initialize(PICComponentLocator locator) { toggleButtonExt = locator.getComponent(ToggleButtonInterface.class); dataRegister = locator.getComponent(DataRegisterInterface.class); eeprom = locator.getComponent(EEPROMInterface.class); @@ -27,5 +29,7 @@ public abstract class PICComponent { watchdogTimer = locator.getComponent(WatchdogTimerInterface.class); programStack = locator.getComponent(ProgramStackInterface.class); commands = locator.getComponent(CommandInterface.class); + table = locator.getComponent(TableInterface.class); + executionTime = locator.getComponent(ExecutionTimeSubject.class); } } diff --git a/src/main/java/fabrik/simulator/pic16f84/Table.java b/src/main/java/fabrik/simulator/pic16f84/Table.java index e00ee18..aaa54cc 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Table.java +++ b/src/main/java/fabrik/simulator/pic16f84/Table.java @@ -1,5 +1,6 @@ package fabrik.simulator.pic16f84; +import fabrik.simulator.pic16f84.frontendspecifics.VBox; import fabrik.simulator.pic16f84.interfaces.*; import javafx.beans.property.SimpleStringProperty; import javafx.geometry.Insets; @@ -10,24 +11,15 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.layout.HBox; -import javafx.scene.layout.VBox; import static javafx.application.Application.launch; -public class Table { - - - //Hier wird die Tabelle aktualisiert - //Tabelle aktualisieren - private static DataRegisterInterface dataRegister; - private static CommandInterface commands; - +public class Table extends PICComponent implements TableInterface { + private VBox tableBox; private static final int NUM_COLUMNS = 8; // Anzahl der Spalten private static final double TABLE_WIDTH = 425; // Breite der TableView private static final double TABLE_HEIGHT = 600; // Höhe der TableView - private static IOPortInterface ioPorts; - private static PreScalerInterface preScaler; private static String formatHex(String s) { return (s.length() == 1) ? "0" + s : s; @@ -45,27 +37,16 @@ public class Table { return s; } - public static VBox init(PICComponentLocator picComponents){ - dataRegister = (DataRegisterInterface) picComponents.getComponent(DataRegisterInterface.class); - commands = (CommandInterface) picComponents.getComponent(CommandInterface.class); - ioPorts = (IOPortInterface) picComponents.getComponent(IOPortInterface.class); - preScaler = (PreScalerInterface) picComponents.getComponent(PreScalerInterface.class); - return refresh(); + public VBox getTable(){ + refresh(); + return tableBox; } - public static VBox refresh() { - - // Erstelle eine Instanz der dataRegister-Klasse - - + public void refresh() { // Erstelle eine TableView für die Datenanzeige TableView tableView = new TableView<>(); tableView.setPrefWidth(TABLE_WIDTH); tableView.setPrefHeight(TABLE_HEIGHT); - - - - // Erstelle Spalten für die TableView for (int i = 0; i < NUM_COLUMNS; i++) { TableColumn column = new TableColumn<>("0" + (i)); @@ -79,7 +60,6 @@ public class Table { }); tableView.getColumns().add(column); } - // Fülle die TableView mit Daten aus dem Array int numRows = (int) Math.ceil((double) dataRegister.getDataRegister().length / NUM_COLUMNS); for (int row = 0; row < numRows; row++) { @@ -135,14 +115,12 @@ public class Table { VBox table = new VBox(); table.getChildren().addAll(tableView, labelsAndButton); VBox.setMargin(tableView, new Insets(0, 0, 0, 0)); - - return table; - + tableBox = table; } - private static void triggerReset() { + private void triggerReset() { dataRegister.initDataRegister(); - ioPorts.refreshUI(Controller_Frontend.getTRISbuttons(), Controller_Frontend.getPORTbuttons()); + ioPorts.refreshUI(frontendController.getTRISbuttons(), frontendController.getPORTbuttons()); CreateWindow.refreshTable(); } @@ -169,5 +147,7 @@ public class Table { } } - + public void initialize(PICComponentLocator picComponents) { + super.initialize(picComponents); + } } diff --git a/src/main/java/fabrik/simulator/pic16f84/Timer.java b/src/main/java/fabrik/simulator/pic16f84/Timer.java index 45415b8..a6e7773 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Timer.java +++ b/src/main/java/fabrik/simulator/pic16f84/Timer.java @@ -1,8 +1,9 @@ package fabrik.simulator.pic16f84; +import fabrik.simulator.pic16f84.interfaces.ExecutionTimeObserver; import fabrik.simulator.pic16f84.interfaces.TimerInterface; -public class Timer extends PICComponent implements TimerInterface { +public class Timer extends PICComponent implements TimerInterface, ExecutionTimeObserver { private final int TIMERREG = 0x1; private final int T0SE = 0x4; private final int T0CS = 0x5; @@ -27,7 +28,7 @@ public class Timer extends PICComponent implements TimerInterface { public void incrementFromPin (int register){ - if ((dataRegister.getDirectBit(OPTION, T0CS) == 1) && !frontendController.isSleeping()){ + if ((dataRegister.getDirectBit(OPTION, T0CS) == 1) && !ExecutionState.isSleeping()){ int newpin = (register >> 4) & 1; if (newpin != oldpin) { if (dataRegister.getDirectBit(OPTION, T0SE) == 0) { @@ -66,5 +67,11 @@ public class Timer extends PICComponent implements TimerInterface { @Override public void initialize(PICComponentLocator locator) { super.initialize(locator); + executionTime.registerObserver(this); + } + + @Override + public void executionTimeChanged() { + cycles((int) executionTime.getTotalExecutionTime()); } } diff --git a/src/main/java/fabrik/simulator/pic16f84/ToggleButtonGroupExt.java b/src/main/java/fabrik/simulator/pic16f84/ToggleButtonGroupExt.java index 4868ca9..3fe6425 100644 --- a/src/main/java/fabrik/simulator/pic16f84/ToggleButtonGroupExt.java +++ b/src/main/java/fabrik/simulator/pic16f84/ToggleButtonGroupExt.java @@ -1,6 +1,8 @@ package fabrik.simulator.pic16f84; -import com.gluonhq.charm.glisten.control.ToggleButtonGroup; + +import fabrik.simulator.pic16f84.frontendspecifics.FrontendSpecificObject; +import fabrik.simulator.pic16f84.frontendspecifics.ToggleButtonGroup; import fabrik.simulator.pic16f84.interfaces.ToggleButtonInterface; import javafx.collections.ListChangeListener; import javafx.event.EventHandler; @@ -10,7 +12,7 @@ import javafx.scene.input.MouseEvent; import java.io.IOException; -public class ToggleButtonGroupExt extends PICComponent implements ToggleButtonInterface { +public class ToggleButtonGroupExt extends PICComponent implements ToggleButtonInterface, FrontendSpecificObject { private static ToggleButtonGroupExt me; @@ -57,7 +59,7 @@ public class ToggleButtonGroupExt extends PICComponent implements ToggleButtonIn } }; - @Override + public void initialize(PICComponentLocator locator) { System.out.println("ToggleButtonGroupExt"); super.initialize(locator); diff --git a/src/main/java/fabrik/simulator/pic16f84/WatchdogTimer.java b/src/main/java/fabrik/simulator/pic16f84/WatchdogTimer.java index a2c16b4..3ae2ad3 100644 --- a/src/main/java/fabrik/simulator/pic16f84/WatchdogTimer.java +++ b/src/main/java/fabrik/simulator/pic16f84/WatchdogTimer.java @@ -21,18 +21,18 @@ public class WatchdogTimer extends PICComponent implements WatchdogTimerInterfac if (enabled) { if (realtimer >= (watchdogTime + lastReset - 1)) { dataRegister.clearBit(3, 4); - lastReset = commands.getTotalExecutionTime(); + lastReset = executionTime.getTotalExecutionTime(); frontendController.stopRunFromBackend("Watchdog Timer"); } else { rawtimer++; - realtimer = (long) (rawtimer * commands.getExecutionTimeMultiplier()); + realtimer = (long) (rawtimer * executionTime.getExecutionTimeMultiplier()); } } } public void reset (){ - lastReset = commands.getTotalExecutionTime(); + lastReset = executionTime.getTotalExecutionTime(); rawtimer = 0; realtimer = 0; preScaler.reset(); diff --git a/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificObject.java b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificObject.java new file mode 100644 index 0000000..09caaed --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificObject.java @@ -0,0 +1,4 @@ +package fabrik.simulator.pic16f84.frontendspecifics; + +public interface FrontendSpecificObject { +} diff --git a/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificToggleButtonGroup.java b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificToggleButtonGroup.java new file mode 100644 index 0000000..8510ae3 --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificToggleButtonGroup.java @@ -0,0 +1,5 @@ +package fabrik.simulator.pic16f84.frontendspecifics; + +public interface FrontendSpecificToggleButtonGroup extends FrontendSpecificObject{ + +} diff --git a/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificVBox.java b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificVBox.java new file mode 100644 index 0000000..0c5109b --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificVBox.java @@ -0,0 +1,4 @@ +package fabrik.simulator.pic16f84.frontendspecifics; + +public interface FrontendSpecificVBox extends FrontendSpecificObject { +} diff --git a/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/ToggleButtonGroup.java b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/ToggleButtonGroup.java new file mode 100644 index 0000000..09e18cc --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/ToggleButtonGroup.java @@ -0,0 +1,13 @@ +package fabrik.simulator.pic16f84.frontendspecifics; + +import javafx.scene.control.ToggleButton; + +public class ToggleButtonGroup extends com.gluonhq.charm.glisten.control.ToggleButtonGroup implements FrontendSpecificToggleButtonGroup { + public ToggleButtonGroup(){ + super(); + } + + public ToggleButtonGroup(ToggleButton... toggles) { + super(toggles); + } +} \ No newline at end of file diff --git a/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/VBox.java b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/VBox.java new file mode 100644 index 0000000..5b4f467 --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/VBox.java @@ -0,0 +1,7 @@ +package fabrik.simulator.pic16f84.frontendspecifics; + +public class VBox extends javafx.scene.layout.VBox implements FrontendSpecificVBox { + public VBox(){ + super(); + } +} diff --git a/src/main/java/fabrik/simulator/pic16f84/interfaces/CommandInterface.java b/src/main/java/fabrik/simulator/pic16f84/interfaces/CommandInterface.java index 4cbeacb..3381b73 100644 --- a/src/main/java/fabrik/simulator/pic16f84/interfaces/CommandInterface.java +++ b/src/main/java/fabrik/simulator/pic16f84/interfaces/CommandInterface.java @@ -3,17 +3,10 @@ package fabrik.simulator.pic16f84.interfaces; public interface CommandInterface extends PICComponentInterface { void CALL(int isr); - double getTotalExecutionTime(); - int get_wRegister(); void decode(int i); - void resetTotalExecutionTime(); - void addExecutionTime(int i); - double getExecutionTimeMultiplier(); - - void setExecutionTimeMultiplier(String option); } diff --git a/src/main/java/fabrik/simulator/pic16f84/interfaces/EEPROMInterface.java b/src/main/java/fabrik/simulator/pic16f84/interfaces/EEPROMInterface.java index 4f4c49f..1473f4d 100644 --- a/src/main/java/fabrik/simulator/pic16f84/interfaces/EEPROMInterface.java +++ b/src/main/java/fabrik/simulator/pic16f84/interfaces/EEPROMInterface.java @@ -1,7 +1,7 @@ package fabrik.simulator.pic16f84.interfaces; public interface EEPROMInterface extends PICComponentInterface { - void registerTime(boolean b); + void registerTime(double executionTime, boolean b); void parse(int i, int content, int i1); diff --git a/src/main/java/fabrik/simulator/pic16f84/interfaces/ExecutionTimeObserver.java b/src/main/java/fabrik/simulator/pic16f84/interfaces/ExecutionTimeObserver.java new file mode 100644 index 0000000..fe46990 --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/interfaces/ExecutionTimeObserver.java @@ -0,0 +1,5 @@ +package fabrik.simulator.pic16f84.interfaces; + +public interface ExecutionTimeObserver { + void executionTimeChanged(); +} diff --git a/src/main/java/fabrik/simulator/pic16f84/interfaces/FrontendControllerInterface.java b/src/main/java/fabrik/simulator/pic16f84/interfaces/FrontendControllerInterface.java index fb3e010..444cc6d 100644 --- a/src/main/java/fabrik/simulator/pic16f84/interfaces/FrontendControllerInterface.java +++ b/src/main/java/fabrik/simulator/pic16f84/interfaces/FrontendControllerInterface.java @@ -1,8 +1,13 @@ package fabrik.simulator.pic16f84.interfaces; -public interface FrontendControllerInterface extends PICComponentInterface { +import fabrik.simulator.pic16f84.frontendspecifics.FrontendSpecificObject; +import fabrik.simulator.pic16f84.frontendspecifics.FrontendSpecificToggleButtonGroup; +public interface FrontendControllerInterface extends PICComponentInterface, FrontendSpecificObject { + FrontendSpecificToggleButtonGroup[] getPORTbuttons(); + + FrontendSpecificToggleButtonGroup[] getTRISbuttons(); void stopRunFromBackend(String watchdogTimer); } diff --git a/src/main/java/fabrik/simulator/pic16f84/interfaces/IOPortInterface.java b/src/main/java/fabrik/simulator/pic16f84/interfaces/IOPortInterface.java index 90e3221..1ae1413 100644 --- a/src/main/java/fabrik/simulator/pic16f84/interfaces/IOPortInterface.java +++ b/src/main/java/fabrik/simulator/pic16f84/interfaces/IOPortInterface.java @@ -1,11 +1,13 @@ package fabrik.simulator.pic16f84.interfaces; -import com.gluonhq.charm.glisten.control.ToggleButtonGroup; import javafx.scene.shape.Circle; import java.io.IOException; -public interface IOPortInterface extends PICComponentInterface { +import fabrik.simulator.pic16f84.frontendspecifics.FrontendSpecificObject; +import fabrik.simulator.pic16f84.frontendspecifics.FrontendSpecificToggleButtonGroup; + +public interface IOPortInterface extends PICComponentInterface, FrontendSpecificObject { void resetTRIS(); void setRegister(int i, int content); @@ -14,11 +16,11 @@ public interface IOPortInterface extends PICComponentInterface { void setBit(int i, int bit); - void setPORTfromUI(ToggleButtonGroup parent) throws IOException; + void setPORTfromUI(FrontendSpecificToggleButtonGroup parent) throws IOException; - void setTRISfromUI(ToggleButtonGroup parent) throws IOException; + void setTRISfromUI(FrontendSpecificToggleButtonGroup parent) throws IOException; - void refreshUI(ToggleButtonGroup[] triSbuttons, ToggleButtonGroup[] porTbuttons); + void refreshUI(FrontendSpecificToggleButtonGroup[] trisButtons, FrontendSpecificToggleButtonGroup[] portButtons); void reset(); diff --git a/src/main/java/fabrik/simulator/pic16f84/interfaces/TableInterface.java b/src/main/java/fabrik/simulator/pic16f84/interfaces/TableInterface.java index 8d6e594..54a3045 100644 --- a/src/main/java/fabrik/simulator/pic16f84/interfaces/TableInterface.java +++ b/src/main/java/fabrik/simulator/pic16f84/interfaces/TableInterface.java @@ -1,7 +1,10 @@ package fabrik.simulator.pic16f84.interfaces; +import fabrik.simulator.pic16f84.frontendspecifics.FrontendSpecificVBox; import javafx.scene.layout.VBox; public interface TableInterface extends PICComponentInterface { - VBox refresh(); + void refresh(); + + FrontendSpecificVBox getTable(); } diff --git a/src/main/java/fabrik/simulator/pic16f84/interfaces/ToggleButtonInterface.java b/src/main/java/fabrik/simulator/pic16f84/interfaces/ToggleButtonInterface.java index e90d3f1..e6eee42 100644 --- a/src/main/java/fabrik/simulator/pic16f84/interfaces/ToggleButtonInterface.java +++ b/src/main/java/fabrik/simulator/pic16f84/interfaces/ToggleButtonInterface.java @@ -1,7 +1,8 @@ package fabrik.simulator.pic16f84.interfaces; -import com.gluonhq.charm.glisten.control.ToggleButtonGroup; +import fabrik.simulator.pic16f84.frontendspecifics.FrontendSpecificObject; +import fabrik.simulator.pic16f84.frontendspecifics.ToggleButtonGroup; -public interface ToggleButtonInterface extends PICComponentInterface { +public interface ToggleButtonInterface extends PICComponentInterface, FrontendSpecificObject { void addAlwaysOneSelectedSupport(ToggleButtonGroup allTRISButton); } diff --git a/src/main/java/fabrik/simulator/pic16f84/interfaces/WindowManagement.java b/src/main/java/fabrik/simulator/pic16f84/interfaces/WindowManagement.java index 75c3dca..3cffa8e 100644 --- a/src/main/java/fabrik/simulator/pic16f84/interfaces/WindowManagement.java +++ b/src/main/java/fabrik/simulator/pic16f84/interfaces/WindowManagement.java @@ -4,4 +4,4 @@ public interface WindowManagement extends PICComponentInterface { static void refreshTable() {} static void startFromMain(String[] args) {} -} +} \ No newline at end of file diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 125bf6f..4e7bdd3 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -11,7 +11,9 @@ module fabrik.simulator.pic16f84 { requires json.simple; opens fabrik.simulator.pic16f84 to javafx.fxml; + opens fabrik.simulator.pic16f84.frontendspecifics to javafx.fxml; exports fabrik.simulator.pic16f84; exports fabrik.simulator.pic16f84.interfaces; + exports fabrik.simulator.pic16f84.frontendspecifics; opens fabrik.simulator.pic16f84.interfaces to javafx.fxml; } \ No newline at end of file diff --git a/src/main/resources/fabrik/simulator/pic16f84/frontend.fxml b/src/main/resources/fabrik/simulator/pic16f84/frontend.fxml index 26d74de..f59eabf 100644 --- a/src/main/resources/fabrik/simulator/pic16f84/frontend.fxml +++ b/src/main/resources/fabrik/simulator/pic16f84/frontend.fxml @@ -1,5 +1,6 @@ + diff --git a/src/test/java/fabrik/simulator/pic16f84/CommandsTests.java b/src/test/java/fabrik/simulator/pic16f84/CommandsTests.java index 43d7721..a5a5552 100644 --- a/src/test/java/fabrik/simulator/pic16f84/CommandsTests.java +++ b/src/test/java/fabrik/simulator/pic16f84/CommandsTests.java @@ -27,7 +27,7 @@ class CommandsTests { EEPROMInterface eepromMock = mock(EEPROMInterface.class); picComponents.registerComponent(EEPROMInterface.class, eepromMock); - CommandInterface commands = new Commands(); + Commands commands = new Commands(); picComponents.registerComponent(CommandInterface.class, commands); picComponents.initAll(); @@ -47,7 +47,7 @@ class CommandsTests { EEPROMInterface eepromMock = mock(EEPROMInterface.class); picComponents.registerComponent(EEPROMInterface.class, eepromMock); - CommandInterface commands = new Commands(); + Commands commands = new Commands(); picComponents.registerComponent(CommandInterface.class, commands); picComponents.initAll(); @@ -68,7 +68,7 @@ class CommandsTests { EEPROMInterface eepromMock = mock(EEPROMInterface.class); picComponents.registerComponent(EEPROMInterface.class, eepromMock); - CommandInterface commands = new Commands(); + Commands commands = new Commands(); picComponents.registerComponent(CommandInterface.class, commands); picComponents.initAll(); diff --git a/src/test/java/fabrik/simulator/pic16f84/EEPROMTests.java b/src/test/java/fabrik/simulator/pic16f84/EEPROMTests.java index d1174ab..ad8bd0b 100644 --- a/src/test/java/fabrik/simulator/pic16f84/EEPROMTests.java +++ b/src/test/java/fabrik/simulator/pic16f84/EEPROMTests.java @@ -69,8 +69,8 @@ class EEPROMTests { DataRegisterInterface mockDataRegister = Mockito.mock(DataRegisterInterface.class); picComponents.registerComponent(DataRegisterInterface.class, mockDataRegister); - CommandInterface mockCommands = mock(CommandInterface.class); - picComponents.registerComponent(CommandInterface.class, mockCommands); + ExecutionTimeSubject mockExecutionTime = mock(ExecutionTimeSubject.class); + picComponents.registerComponent(ExecutionTimeSubject.class, mockExecutionTime); EEPROMInterface eeprom = new EEPROM(); picComponents.registerComponent(EEPROMInterface.class, eeprom); diff --git a/src/test/java/fabrik/simulator/pic16f84/WatchDogTimerTests.java b/src/test/java/fabrik/simulator/pic16f84/WatchDogTimerTests.java index 3b601c4..b91a4db 100644 --- a/src/test/java/fabrik/simulator/pic16f84/WatchDogTimerTests.java +++ b/src/test/java/fabrik/simulator/pic16f84/WatchDogTimerTests.java @@ -29,13 +29,13 @@ class WatchDogTimerTests { picComponents.registerComponent(PreScalerInterface.class, mockPreScaler); - CommandInterface mockCommands = mock(CommandInterface.class); + ExecutionTimeSubject mockExecutionTime = mock(ExecutionTimeSubject.class); when( - mockCommands.getExecutionTimeMultiplier() + mockExecutionTime.getExecutionTimeMultiplier() ).thenReturn( 1.0 ); - picComponents.registerComponent(CommandInterface.class, mockCommands); + picComponents.registerComponent(ExecutionTimeSubject.class, mockExecutionTime); WatchdogTimerInterface watchDogTimer = new WatchdogTimer(); picComponents.registerComponent(WatchdogTimerInterface.class, watchDogTimer);