package fabrik.simulator.pic16f84; import com.gluonhq.charm.glisten.control.ToggleButtonGroup; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.FileChooser; import java.io.File; import java.io.IOException; import java.io.BufferedReader; import java.io.FileReader; import javafx.scene.control.Label; import javafx.scene.control.TableView; import javafx.scene.control.TextArea; import javafx.stage.Stage; import java.util.Arrays; import java.util.Objects; import static fabrik.simulator.pic16f84.Commands.totalExecutionTime; public class Controller_Frontend { private int [] prog; private int [][] read; private int [] ind; @FXML private Button stepintoButton; @FXML private TableView tableView; @FXML private ListView lstContentListView; @FXML private Label pclLabel; @FXML private Label statusLabel; @FXML private Label fsrLabel; @FXML private Label pclathLabel; @FXML private Label intconLabel; @FXML private Button stepButton; @FXML private Button autoRunGUI; @FXML private Button stopButton; @FXML private Label totalExecutionTimeLabel; @FXML private CheckBox wdtCheck; private static volatile boolean isAutoRunActive = true; private static volatile boolean isSleeping = false; public static void stopRunFromBackend(String message){ isAutoRunActive = false; if (isSleeping) isSleeping = false; else DataRegister.resetPC(); Stage stoppedStage = new Stage(); stoppedStage.setTitle("Programm unterbrochen!"); VBox vbox = new VBox(); vbox.setAlignment(javafx.geometry.Pos.CENTER); Label grundlabel = new Label("Grund: " + message); grundlabel.setStyle("-fx-font-size: 16px; -fx-font-weight: bold;"); Label ueberlabel = new Label("Programm unterbrochen!"); vbox.getChildren().add(ueberlabel); vbox.getChildren().add(grundlabel); VBox.setMargin(grundlabel, new javafx.geometry.Insets(10, 10, 10, 10)); Scene scene = new Scene(vbox, 300, 90); stoppedStage.setAlwaysOnTop(true); stoppedStage.setScene(scene); stoppedStage.show(); } public static void sleep() { isSleeping = true; } @FXML private void stopAutoRun(ActionEvent event) { isAutoRunActive = false; } @FXML private void autoRunGUI(ActionEvent event) { if (!isAutoRunActive) { isAutoRunActive = true; } Thread autoRunThread = new Thread(() -> { try { while (DataRegister.getPC() < prog.length && isAutoRunActive){ Platform.runLater(() -> { try { stepintoButton(null); } catch (IOException e) { e.printStackTrace(); } }); Thread.sleep(20); //Verzögerungszeit in Millisekunden } } catch (InterruptedException e) { e.printStackTrace(); } }); autoRunThread.setDaemon(true); autoRunThread.start(); } @FXML private void stepintoButton(ActionEvent event) throws IOException { if (lstContentListView.getItems().isEmpty()) { // Datei ist nicht geladen oder leer return; } int currentIndex; // Aktuelle Zeile abrufen if (!isSleeping) currentIndex = ind[DataRegister.getPC()]; else currentIndex = ind[DataRegister.getPC()]-1; // Scrollen zur ausgewählten Zeile lstContentListView.scrollTo(currentIndex -2); // Zeile auswählen lstContentListView.getSelectionModel().clearSelection(); lstContentListView.getSelectionModel().select(currentIndex); String selectedRowStyle; if (!isSleeping) selectedRowStyle = "-fx-background-color: red; -fx-text-fill: white;"; else selectedRowStyle = "-fx-background-color: teal; -fx-text-fill: white;"; lstContentListView.setCellFactory(column -> new ListCell() { @Override protected void updateItem(String item, boolean empty) { super.updateItem(item, empty); setText(item); if (getIndex() == currentIndex) { setStyle(selectedRowStyle); } else { setStyle(""); } } }); // Befehle ausführen if (!isSleeping) { Commands.decode(prog[DataRegister.getPC()]); DataRegister.increasePC(); } else { Commands.decode(0); } WatchdogTimer.testAndTrigger(); Table.refresh(); Stage stage = (Stage) stepintoButton.getScene().getWindow(); CreateWindow.refreshTable(stage); IOPorts.refreshUI(getTRISbuttons(), getPORTbuttons()); totalExecutionTimeLabel.setText("Total Execution Time: " + Commands.getTotalExecutionTime() + "µs"); } @FXML protected void selectFileLST(ActionEvent event){ File selectedFile = chooseLSTFile(); if(selectedFile != null){ read = ParseFile.parseDatei(selectedFile.getAbsolutePath()); prog = read [0]; ind = read[1]; System.out.println(Arrays.toString(Arrays.stream(prog).toArray())); displayLSTFileContent(selectedFile); } } private File chooseLSTFile() { FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Open LST File"); fileChooser.getExtensionFilters().addAll( new FileChooser.ExtensionFilter("LST Files", "*.lst", "*.LST"), new FileChooser.ExtensionFilter("All Files", "*.*")); return fileChooser.showOpenDialog(null); } @FXML private void displayLSTFileContent(File selectedFile) { try (BufferedReader reader = new BufferedReader(new FileReader(selectedFile))) { ObservableList contentList = FXCollections.observableArrayList(); String line; while ((line = reader.readLine()) != null) { contentList.add(line); } lstContentListView.setItems(contentList); } catch (IOException e) { e.printStackTrace(); } } @FXML public void toggleWatchdog(ActionEvent actionEvent) { if (wdtCheck.isSelected()) WatchdogTimer.enable(); else WatchdogTimer.disable(); } @FXML private ToggleButtonGroup bgTRISA0; @FXML private ToggleButtonGroup bgTRISA1; @FXML private ToggleButtonGroup bgTRISA2; @FXML private ToggleButtonGroup bgTRISA3; @FXML private ToggleButtonGroup bgTRISA4; @FXML private ToggleButtonGroup bgTRISB0; @FXML private ToggleButtonGroup bgTRISB1; @FXML private ToggleButtonGroup bgTRISB2; @FXML private ToggleButtonGroup bgTRISB3; @FXML private ToggleButtonGroup bgTRISB4; @FXML private ToggleButtonGroup bgTRISB5; @FXML private ToggleButtonGroup bgTRISB6; @FXML private ToggleButtonGroup bgTRISB7; @FXML private ToggleButtonGroup bgPORTA0; @FXML private ToggleButtonGroup bgPORTA1; @FXML private ToggleButtonGroup bgPORTA2; @FXML private ToggleButtonGroup bgPORTA3; @FXML private ToggleButtonGroup bgPORTA4; @FXML private ToggleButtonGroup bgPORTB0; @FXML private ToggleButtonGroup bgPORTB1; @FXML private ToggleButtonGroup bgPORTB2; @FXML private ToggleButtonGroup bgPORTB3; @FXML private ToggleButtonGroup bgPORTB4; @FXML private ToggleButtonGroup bgPORTB5; @FXML private ToggleButtonGroup bgPORTB6; @FXML private ToggleButtonGroup bgPORTB7; private static ToggleButtonGroup[] allTRISbuttons; private static ToggleButtonGroup[] allPORTbuttons; public void initialize() { ToggleButtonGroup [] allTRISButtons = {bgTRISA0, bgTRISA1, bgTRISA2, bgTRISA3, bgTRISA4, bgTRISB0, bgTRISB1, bgTRISB2, bgTRISB3, bgTRISB4, bgTRISB5, bgTRISB6, bgTRISB7}; ToggleButtonGroup [] allPORTButtons = {bgPORTA0, bgPORTA1, bgPORTA2, bgPORTA3, bgPORTA4, bgPORTB0, bgPORTB1, bgPORTB2, bgPORTB3, bgPORTB4, bgPORTB5, bgPORTB6, bgPORTB7}; for (int i = 0; i