diff --git a/src/Main.java b/src/Main.java index 7e796c6f7a5b24d0443e921aff88d7c4f518ee48..1aacf21f9d47d0b911b4b539cd9d3011588585fa 100644 --- a/src/Main.java +++ b/src/Main.java @@ -3,5 +3,4 @@ public final class Main { public static void main(String[] args) { gui.App.main(args); } - } diff --git a/src/gui/JenkinsScene.java b/src/gui/JenkinsScene.java index acf61efab3a14aaea3b905bdb301be60a1e3cf0c..b1aa9a63d3d958db6aaff08125ed8a6233ee0d45 100644 --- a/src/gui/JenkinsScene.java +++ b/src/gui/JenkinsScene.java @@ -1,11 +1,17 @@ package gui; import javafx.beans.binding.Bindings; +import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; @@ -13,6 +19,7 @@ import javafx.scene.text.Text; import utils.Parser; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -30,6 +37,9 @@ final class JenkinsScene { private final List<boolean[][]> goldenArrays; private final List<boolean[][]> buildArrays; + private final List<Integer> undefinedFramesGold = new ArrayList<>(); + private final List<Integer> undefinedFramesBuild = new ArrayList<>(); + private final Map<Integer, String> inputs; private final TimeBar timebar; @@ -37,6 +47,9 @@ final class JenkinsScene { private final ObjectProperty<boolean[][]> goldenTab = new SimpleObjectProperty<>(); private final ObjectProperty<boolean[][]> buildTab = new SimpleObjectProperty<>(); + private final BooleanProperty errorFrameGold = new SimpleBooleanProperty(); + private final BooleanProperty errorFrameBuild = new SimpleBooleanProperty(); + private final BorderPane pane = new BorderPane(); private final Pane golden = new Pane(); @@ -48,20 +61,28 @@ final class JenkinsScene { this.gridHeight = gridHeight; Parser parser = new Parser(gridWidth, gridHeight); - this.goldenArrays = parser.parseDisplay(gold); - this.buildArrays = parser.parseDisplay(build); - this.timebar = new TimeBar(Math.max(goldenArrays.size(), buildArrays.size()) - 1); + this.goldenArrays = parser.parseDisplay(gold, undefinedFramesGold); + this.buildArrays = parser.parseDisplay(build, undefinedFramesBuild); + + undefinedFramesGold.forEach(id -> goldenArrays.add(id, null)); + undefinedFramesBuild.forEach(id -> buildArrays.add(id, null)); + + this.timebar = new TimeBar(Math.max(goldenArrays.size(), buildArrays.size()) - 1); this.inputs = parser.parseInputs(build); + errorFrameGold.bind(timebar.index().map(id -> undefinedFramesGold.contains(id.intValue()))); + errorFrameBuild.bind(timebar.index().map(id -> undefinedFramesBuild.contains(id.intValue()))); + + goldenTab.bind(timebar.index().map(id -> goldenArrays.get(id.intValue()))); buildTab.bind(timebar.index().map(id -> buildArrays.get(id.intValue()))); - initPanes(); } + private void initPanes() { golden.setStyle("-fx-background-color: #efa810"); @@ -88,6 +109,15 @@ final class JenkinsScene { pane.setTop(timebar); + Text errorText = new Text("Undefined of 'X' bit detected on this frame"); + errorText.setStyle("-fx-font-size: 15px; -fx-font-weight: bold"); + errorText.setLayoutX(App.APP_WIDTH/2d - 150); + errorText.setLayoutY(App.APP_HEIGHT - 5); + + errorText.visibleProperty().bind(errorFrameGold.or(errorFrameBuild)); + + pane.getChildren().add(errorText); + setGridGroup(); setInputs(golden); setLegend(build); @@ -158,7 +188,7 @@ final class JenkinsScene { Rectangle buildRect = new Rectangle(22 * i + OFF_SET_X, 22 * j + OFF_SET_Y, 20, 20); Rectangle goldRect = new Rectangle(22 * i + OFF_SET_X, 22 * j + OFF_SET_Y, 20, 20); - goldRect.visibleProperty().bind(goldenTab.map(goldTab -> goldTab[finalI][finalJ])); + goldRect.visibleProperty().bind(goldenTab.map(goldTab -> goldTab != null && goldTab[finalI][finalJ])); goldRect.setFill(Color.BLACK); goldRect.setArcWidth(15); goldRect.setArcHeight(15); @@ -167,11 +197,14 @@ final class JenkinsScene { buildRect.visibleProperty().bind(Bindings.createBooleanBinding( - () -> goldenTab.get()[finalI][finalJ] || buildTab.get()[finalI][finalJ], + () -> goldenTab.get() != null && buildTab.get() != null && + (goldenTab.get()[finalI][finalJ] || buildTab.get()[finalI][finalJ]), goldenTab, buildTab)); buildRect.fillProperty().bind(Bindings.createObjectBinding( () -> { + if (goldenTab.get() == null || buildTab.get() == null) + return Color.TRANSPARENT; boolean goldV = goldenTab.get()[finalI][finalJ]; boolean buildV = buildTab.get()[finalI][finalJ]; if (!goldV && buildV) return TO_MUCH_COLOR; diff --git a/src/gui/ModelSimScene.java b/src/gui/ModelSimScene.java index e2634f15fc19d716541033223e9b41c89dd86bd5..d23ef28da05f75e80a6c3b50c7262fef99eacb8f 100644 --- a/src/gui/ModelSimScene.java +++ b/src/gui/ModelSimScene.java @@ -2,11 +2,8 @@ package gui; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; -import javafx.geometry.Pos; import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; -import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import utils.Parser; @@ -66,7 +63,7 @@ final class ModelSimScene { Rectangle modelsimRect = new Rectangle(22*i + 300, 22*j + 100, 20, 20); - modelsimRect.visibleProperty().bind(modelSimTab.map(modelTab -> modelTab[finalI][finalJ])); + modelsimRect.visibleProperty().bind(modelSimTab.map(modelTab -> modelTab != null && modelTab[finalI][finalJ])); modelsimRect.setFill(Color.BLACK); modelsimRect.setArcWidth(15); modelsimRect.setArcHeight(15); diff --git a/src/utils/Parser.java b/src/utils/Parser.java index 76ea7b1c425580cb56ae67f0f52602970fe667c1..215ff51c32d7774af4963e5a3b936e1ede0f477e 100644 --- a/src/utils/Parser.java +++ b/src/utils/Parser.java @@ -1,10 +1,7 @@ package utils; import java.io.*; -import java.util.HashMap; -import java.util.HexFormat; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -16,19 +13,26 @@ public final class Parser { private final int height; private final static Pattern PATTERN_OUT = Pattern.compile("^((# )?\\d+:)"); + private final static Pattern HEX_PATTERN = Pattern.compile("(# )?\\d+:[0-9a-fA-F]+"); private final static Pattern PATTERN_IN = Pattern.compile("^(# \\d+->)"); + private final static Pattern MODELSIM_PATTERN = Pattern.compile("([0-1]+ \\+[0-1]+ [0-1]+( )?)$"); public Parser(int width, int height) { this.width = width; this.height = height; } - public List<boolean[][]> parseDisplay(String path) throws IOException { + public List<boolean[][]> parseDisplay(String path, List<Integer> errorFrames) throws IOException { try (BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream(path), UTF_8))) { - return br.lines().filter(str -> PATTERN_OUT.matcher(str).lookingAt()) + return br.lines() + .filter(str -> PATTERN_OUT.matcher(str).lookingAt()) + .peek(str -> { + if (!HEX_PATTERN.matcher(str).matches()) errorFrames.add(Integer.parseInt(str.split(":")[0] + .replace("# ", "")));}) + .filter(str -> HEX_PATTERN.matcher(str).matches()) .map(this::toBoolArray) .collect(Collectors.toList()); }