diff --git a/src/main/java/com/application/DB/Constants.java b/src/main/java/com/application/DB/Constants.java index ed2b28a7a2b93ac7805c5a478d46a44ae0cce66e..ccb1facb19eda28314facb4e06f8ae58fd4cfe11 100644 --- a/src/main/java/com/application/DB/Constants.java +++ b/src/main/java/com/application/DB/Constants.java @@ -16,26 +16,15 @@ public final class Constants { } // Today's date - public static final String CURRENT_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); + public static String CURRENT_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); - // Start- & end time - public static String START_TIME = ""; - public static String STOP_TIME = ""; - - // Boolean variable to tell if the drying process is finished - public static boolean IS_FINISHED = false; - - // User inputs - public static String TREE_SPECIES = ""; - public static String DIMENSIONS = ""; - public static String SAWSET = ""; - public static String MOISTURE_GOAL = ""; + public static String TIME_LEFT = ""; // Number of manual moisture checks public static int NUMBER_OF_CHECKS = 1; // Number of wanted drying periods - public static int NUMBER_OF_PERIODS = 1; + public static int NUMBER_OF_PERIODS = 2; // Number of seconds to wait before updating live data, in seconds public static int NUMBER_OF_SECONDS_LIVE_DATA = 10; diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java index 3b0936d87144e8e6ed07c3435a08fc418b7e88e7..42574d67d24a06ba2c196f62e5ef95b8feda1521 100644 --- a/src/main/java/com/application/DB/DB.java +++ b/src/main/java/com/application/DB/DB.java @@ -6,6 +6,8 @@ import org.joda.time.DateTime; import java.util.*; import static com.application.DB.Constants.*; +import static com.application.DB.HelpingFunctions.IS_FINISHED; +import static com.application.DB.HelpingFunctions.getNoOfChambers; /** * This class is responsible for handling database related activities @@ -25,7 +27,8 @@ public class DB { //getKwh(); //getName(); //getZeroPointDate(); - System.out.println(setInputParameters()); + //System.out.println(setInputParameters()); + getNoOfChambers(); } @@ -70,6 +73,9 @@ public class DB { String valueIDName; int valueID; + getNoOfChambers(); + int chamberNo = 1; + while(true){ @@ -91,16 +97,16 @@ public class DB { if (location.getKey() == 124) { // If location is Valasen, then the database stores furu as fura, swedish. - if (TREE_SPECIES.equalsIgnoreCase("Furu")) { - TREE_SPECIES = "Fura"; + if (HelpingFunctions.TREE_SPECIES.equalsIgnoreCase("Furu")) { + HelpingFunctions.TREE_SPECIES = "Fura"; } locationTables = getValasenTableNames(); valmeticsChamberIDS = getValasenValmeticsChamberIDS(); kwhChamberIDS = getValasenKwhChamberIDS(); } if (location.getKey() == 174) { - if (TREE_SPECIES.equalsIgnoreCase("Fura")) { - TREE_SPECIES = "Furu"; + if (HelpingFunctions.TREE_SPECIES.equalsIgnoreCase("Fura")) { + HelpingFunctions.TREE_SPECIES = "Furu"; } locationTables = getArjangTableNames(); valmeticsChamberIDS = getArjangValmeticsChamberIDS(); @@ -124,33 +130,33 @@ public class DB { //valueID = Integer.parseInt(location.getValue().get(locationTables.get("Kwh")).get("ValueID")); - System.out.printf("Tree species: \t%s\n", TREE_SPECIES); - System.out.printf("Width: \t\t\t%s\n", DIMENSIONS); - System.out.printf("Sawset: \t\t%s\n", SAWSET); - System.out.printf("Moisture: \t\t%s\n", MOISTURE_GOAL); + System.out.printf("Tree species: \t%s\n", HelpingFunctions.TREE_SPECIES); + System.out.printf("Width: \t\t\t%s\n", HelpingFunctions.DIMENSIONS); + System.out.printf("Sawset: \t\t%s\n", HelpingFunctions.SAWSET); + System.out.printf("Moisture: \t\t%s\n", HelpingFunctions.MOISTURE_GOAL); // Defining the extra sql statements for extra parameters - treeSpecies = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + TREE_SPECIES + "%" + '"' + ") "; - dimensions = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + DIMENSIONS + "%" + '"' + ") "; - sawset = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + SAWSET + "%" + '"' + ") "; - moistureGoal = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + MOISTURE_GOAL + "\\\\%" + "%" + '"' + ") "; + treeSpecies = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + HelpingFunctions.TREE_SPECIES + "%" + '"' + ") "; + dimensions = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + HelpingFunctions.DIMENSIONS + "%" + '"' + ") "; + sawset = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + HelpingFunctions.SAWSET + "%" + '"' + ") "; + moistureGoal = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + HelpingFunctions.MOISTURE_GOAL + "\\\\%" + "%" + '"' + ") "; // 1. Checking if user input is empty. // 2. Checking if the extraInputParameter variable already contains the extra parameters, // if so not adding a second time. // 3. Checking if the while loop have previously removed the parameter, if so, not adding again. - if (!TREE_SPECIES.isEmpty() && !extraInputParameter.contains(treeSpecies) && !treespeciesRemoved) { + if (!HelpingFunctions.TREE_SPECIES.isEmpty() && !extraInputParameter.contains(treeSpecies) && !treespeciesRemoved) { extraInputParameter += treeSpecies; } - if (!DIMENSIONS.isEmpty() && !extraInputParameter.contains(dimensions) && !dimensionsRemoved) { + if (!HelpingFunctions.DIMENSIONS.isEmpty() && !extraInputParameter.contains(dimensions) && !dimensionsRemoved) { extraInputParameter += dimensions; } - if (!SAWSET.isEmpty() && !extraInputParameter.contains(sawset) && !sawsetRemoved) { + if (!HelpingFunctions.SAWSET.isEmpty() && !extraInputParameter.contains(sawset) && !sawsetRemoved) { extraInputParameter += sawset; } - if (!MOISTURE_GOAL.isEmpty() && !extraInputParameter.contains(moistureGoal) && !moistureRemoved) { + if (!HelpingFunctions.MOISTURE_GOAL.isEmpty() && !extraInputParameter.contains(moistureGoal) && !moistureRemoved) { extraInputParameter += moistureGoal; } @@ -172,6 +178,7 @@ public class DB { System.out.printf("valueID: \t%d\n",valueID); //System.out.println("Før results"); + Map<Integer, Map<String, Number>> results = new TreeMap<>(getKwh(getZeroPointDate(locationID, extraInputParameter, nameParameter, kilinName, kilinID, startDryingTime, stopDryingTime, valmeticsTableName, limit), locationID, kwhTableName, KwhName, timestamp, valueIDName, valueID, index)); @@ -560,11 +567,47 @@ public class DB { } - public static void pushManMoisture(String moisture, boolean finished) throws Exception { + public static void pushManMoisture(String moisture) throws Exception { + + String startTime = null; + String stopTime = null; + String treeSpecies; + String dimensions; + String sawset; + String moistureGoal; + + // Checks if variables is not null, if so, formats correctly for the sql statement + if(!HelpingFunctions.START_TIME.equals("")){ + startTime = '"'+ HelpingFunctions.START_TIME+'"'; + } + if(HelpingFunctions.STOP_TIME != null){ + stopTime = '"'+ HelpingFunctions.STOP_TIME+'"'; + } + if(!HelpingFunctions.TREE_SPECIES.equals("")){ + treeSpecies = '"'+ HelpingFunctions.TREE_SPECIES+'"'; + } else { + treeSpecies = null; + } + if(!HelpingFunctions.DIMENSIONS.equals("")){ + dimensions = '"'+ HelpingFunctions.DIMENSIONS+'"'; + } else { + dimensions = null; + } + if(!HelpingFunctions.SAWSET.equals("")){ + sawset = '"'+ HelpingFunctions.SAWSET+'"'; + } else { + sawset = null; + } + if(!HelpingFunctions.MOISTURE_GOAL.equals("")){ + moistureGoal = '"'+ HelpingFunctions.MOISTURE_GOAL+'"'; + } else { + moistureGoal = null; + } + // Sqlstatement final String sqlStatement = - "INSERT INTO " + PROJECT_ID + "." + LOCATION_ID + "." + MAN_MOISTURE_TABLE + "(moisture,tree_species,dimensions,sawset,moisture_goal,no_moisture_checkstart_time,start_time,stop_time,finished) " + - "VALUES("+moisture+","+TREE_SPECIES+","+DIMENSIONS+","+SAWSET+","+MOISTURE_GOAL+","+NUMBER_OF_CHECKS+","+",) "; + "INSERT INTO " + PROJECT_ID + "." + LOCATION_ID + "." + MAN_MOISTURE_TABLE + "(moisture,tree_species,dimensions,sawset,moisture_goal,no_moisture_check,start_time,stop_time,finished) " + + "VALUES("+moisture+","+treeSpecies+","+dimensions+","+sawset+","+moistureGoal+","+NUMBER_OF_CHECKS+","+startTime+","+stopTime+","+IS_FINISHED+") "; System.out.println(sqlStatement); @@ -587,8 +630,8 @@ public class DB { // Sqlstatement final String sqlStatement = "SELECT `" + KWH_TIMESTAMP_NAME_PARAMETER + "`, `" + KWH_NAME_PARAMETER + "` " + "FROM `" + PROJECT_ID + "." + LOCATION_ID + "." + KWH_TABLE_NAME + "` " + - "WHERE " + KWH_TIMESTAMP_NAME_PARAMETER + " BETWEEN " + '"' + START_TIME + '"' + - " AND " + '"' + STOP_TIME + '"' + + "WHERE " + KWH_TIMESTAMP_NAME_PARAMETER + " BETWEEN " + '"' + HelpingFunctions.START_TIME + '"' + + " AND " + '"' + HelpingFunctions.STOP_TIME + '"' + " AND " + KWH_VALUE_ID_NAME_PARAMETER + " = " + KWH_VALUE_ID_VALUE_PARAMETER + " " + " AND " + KWH_NAME_PARAMETER + " <> 0 " + " ORDER BY " + KWH_TIMESTAMP_NAME_PARAMETER + " ASC"; diff --git a/src/main/java/com/application/DB/HelpingFunctions.java b/src/main/java/com/application/DB/HelpingFunctions.java index a34f4f536e07e53e75938bc46c990806a5fa6995..7cea97f5b8f146729c7c9136bde59f7dbddc3d39 100644 --- a/src/main/java/com/application/DB/HelpingFunctions.java +++ b/src/main/java/com/application/DB/HelpingFunctions.java @@ -11,11 +11,22 @@ import java.util.HashMap; import java.util.Map; import java.util.TimeZone; -import static com.application.DB.Constants.PROJECT_ID; +import static com.application.DB.Constants.*; public class HelpingFunctions { + // Start- & end time + public static String START_TIME = ""; + public static String STOP_TIME = ""; + // Boolean variable to tell if the drying process is finished + public static boolean IS_FINISHED = false; + public static boolean LOADED_DATA = false; + // User inputs + public static String TREE_SPECIES = ""; + public static String DIMENSIONS = ""; + public static String SAWSET = ""; + public static String MOISTURE_GOAL = ""; static Map<String,String> manMoist = new HashMap<>(); /** @@ -149,4 +160,32 @@ public class HelpingFunctions { } } } + + public static int getNoOfChambers(){ + int valmeticsChamberIDS = 0; + int kwhChamberIDS = 0; + int noOfChambers = 0; + System.out.println("Constants.getSawmills().size(): "+Constants.getSawmills().size()); + for (HashMap.Entry<Integer, HashMap<String, HashMap<String, String>>> first : Constants.getSawmills().entrySet()) { + if (first.getKey() == 124) { + valmeticsChamberIDS = getValasenValmeticsChamberIDS().size(); + kwhChamberIDS = getValasenKwhChamberIDS().size(); + } + if (first.getKey() == 174) { + valmeticsChamberIDS = getArjangValmeticsChamberIDS().size(); + kwhChamberIDS = getArjangKwhChamberIDS().size(); + } + noOfChambers+= Math.min(valmeticsChamberIDS, kwhChamberIDS); + System.out.println("NO_OF_CHAMBERS: "+noOfChambers); + } + return noOfChambers; + } + + public static boolean isLoadedData() { + return LOADED_DATA; + } + + public static void setLoadedData(boolean loadedData) { + LOADED_DATA = loadedData; + } } diff --git a/src/main/java/com/application/GUI/InputPopUpWindow.java b/src/main/java/com/application/GUI/InputPopUpWindow.java index 3043841d2e149601c4bd11ad10ac7972ea495763..545e799d67c88fd3f0e2501ad365955b2570bf8d 100644 --- a/src/main/java/com/application/GUI/InputPopUpWindow.java +++ b/src/main/java/com/application/GUI/InputPopUpWindow.java @@ -1,5 +1,8 @@ package com.application.GUI; +import com.application.DB.Constants; +import com.application.DB.HelpingFunctions; +import com.application.Main; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -15,10 +18,11 @@ import java.util.Map; import static com.application.DB.Constants.*; import static com.application.DB.DB.getCurrentDrying; -import static com.application.GUI.LineChartFunctionality.loadLiveData; +import static com.application.DB.HelpingFunctions.LOADED_DATA; +import static com.application.DB.HelpingFunctions.setLoadedData; +import static com.application.GUI.LineChartFunctionality.*; import static com.application.Main.*; import static com.application.DB.DB.setInputParameters; -import static com.application.GUI.LineChartFunctionality.loadSingleSeries; /** @@ -29,6 +33,8 @@ import static com.application.GUI.LineChartFunctionality.loadSingleSeries; */ public class InputPopUpWindow { + private static boolean err = false; + public static void exitDataThread(){ Platform.exit(); System.exit(0); @@ -91,7 +97,7 @@ public class InputPopUpWindow { "4ex" ); ComboBox<String> sawsetList = new ComboBox<>(sawset); - sawsetList.setPromptText("Select Dimensions"); + sawsetList.setPromptText("Select Sawset"); sawsetList.setId("inputDropDownBox"); sawsetList.setEditable(true); @@ -107,7 +113,7 @@ public class InputPopUpWindow { "20%" ); ComboBox<String> moistureList = new ComboBox<>(moistureGoal); - moistureList.setPromptText("Select Dimensions"); + moistureList.setPromptText("Select Moisture Goal"); moistureList.setId("inputDropDownBox"); moistureList.setEditable(true); @@ -118,171 +124,132 @@ public class InputPopUpWindow { startButton.setOnAction(e -> { - // Sets the start time - - START_TIME = CURRENT_DATE; + // Sets the start time + Constants.CURRENT_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); + HelpingFunctions.START_TIME = CURRENT_DATE; + + // Retrieves the user inputs + HelpingFunctions.TREE_SPECIES = treeSpeciesList.getValue(); + HelpingFunctions.DIMENSIONS = dimensionsList.getValue(); + HelpingFunctions.SAWSET = sawsetList.getValue(); + if (moistureList.getValue() != null && moistureList.getValue().contains("%")) { + HelpingFunctions.MOISTURE_GOAL = moistureList.getValue().replace("%", ""); + } else { + HelpingFunctions.MOISTURE_GOAL = moistureList.getValue(); + } - // Retrieves the user inputs - TREE_SPECIES = treeSpeciesList.getValue(); - DIMENSIONS = dimensionsList.getValue(); - SAWSET = sawsetList.getValue(); - if(moistureList.getValue() != null && moistureList.getValue().contains("%")) - { - MOISTURE_GOAL = moistureList.getValue().replace("%",""); - } else { - MOISTURE_GOAL = moistureList.getValue(); - } + // If the input is null, sets the value to be empty + if (treeSpeciesList.getValue() == null) { + HelpingFunctions.TREE_SPECIES = ""; + } else if (treeSpeciesList.getValue().length() > 10) { + treeSpeciesList.setPromptText("A maximum of 10 characters is allowed!"); + err = true; + } + if (dimensionsList.getValue() == null) { + HelpingFunctions.DIMENSIONS = ""; + } else if (dimensionsList.getValue().length() > 10) { + dimensionsList.setPromptText("A maximum of 10 characters is allowed!"); + err = true; + } + if (sawsetList.getValue() == null) { + HelpingFunctions.SAWSET = ""; + } else if (sawsetList.getValue().length() > 10) { + sawsetList.setPromptText("A maximum of 10 characters is allowed!"); + err = true; + } + if (moistureList.getValue() == null) { + HelpingFunctions.MOISTURE_GOAL = ""; + } else if (moistureList.getValue().length() > 10) { + moistureList.setPromptText("A maximum of 10 characters is allowed!"); + err = true; + } - // If the input is null, sets the value to be empty - if (treeSpeciesList.getValue() == null) { - TREE_SPECIES = ""; - } - if (dimensionsList.getValue() == null) { - DIMENSIONS = ""; - } - if (sawsetList.getValue() == null) { - SAWSET = ""; - } - if (moistureList.getValue() == null) { - MOISTURE_GOAL = ""; - } - setTreeSpeciesText(TREE_SPECIES); - setDimensionsText(DIMENSIONS); - setSawsetText(SAWSET); - setMoistureGoalText(MOISTURE_GOAL); - window.close(); + if (!err) { + setTreeSpeciesText(HelpingFunctions.TREE_SPECIES); + setDimensionsText(HelpingFunctions.DIMENSIONS); + setSawsetText(HelpingFunctions.SAWSET); + setMoistureGoalText(HelpingFunctions.MOISTURE_GOAL); -/* - FutureTask[] randomNumberTasks = new FutureTask[1]; - Callable callable = new CallableExample(); - randomNumberTasks[0] = new FutureTask(callable); - Thread t = new Thread(randomNumberTasks[0]); - t.start(); + window.close(); - try { - System.out.println(randomNumberTasks[0].get()); - } catch (InterruptedException | ExecutionException ex) { - ex.printStackTrace(); - } - }); - */ -/* + // Fungerende ny thread!!@@@@@ + // Gather data + try { + Thread thread = new Thread(() -> { try { - //getData(); - loadSingleSeries(setInputParameters()); - //loadMultipleSeries(setInputParameters()); - //loadSingleSeries(); - //loadMultipleSeries(); + setLoadedData(false); + // Henter her data fra databasen + Map<Integer, Map<String, Number>> data = setInputParameters(); + Platform.runLater(() -> { + try { + loadSingleSeries(data); + setLoadedData(true); + } catch (Exception ex) { + ex.printStackTrace(); + } + }); } catch (Exception ex) { ex.printStackTrace(); } } - ); - - */ - - - - - - - -/* - try{ - Thread thread = new Thread(new Runnable() { - - @Override - public void run() { - try { - // Henter her data fra databasen - loadSingleSeries(setInputParameters(false,false,false,false)); - //loadSingleSeries(); - //loadMultipleSeries(); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - }); + thread.setDaemon(true); + thread.interrupt(); + thread.join(); + //Platform.exit(); thread.start(); + } catch (Exception ex) { ex.printStackTrace(); } - } - ); - - */ - // Fungerende ny thread!!@@@@@ - // Gather data - try{ - Thread thread = new Thread(() -> { + // Retrieve data for current drying period + try { + Thread liveDataThread = new Thread(() -> { + try { + while (!HelpingFunctions.IS_FINISHED) { + HelpingFunctions.STOP_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); + Map<String, Number> data = getCurrentDrying(); + Platform.runLater(() -> { try { - // Henter her data fra databasen - Map<Integer, Map<String, Number>> data = setInputParameters(); - Platform.runLater(() -> { - try { - loadSingleSeries(data); - } catch (Exception ex) { - ex.printStackTrace(); - } - }); + loadLiveData(data); } catch (Exception ex) { ex.printStackTrace(); } - } - ); - thread.setDaemon(true); - thread.start(); - + }); + Thread.sleep(1000L * NUMBER_OF_SECONDS_LIVE_DATA); + } } catch (Exception ex) { ex.printStackTrace(); } + } + ); + liveDataThread.setDaemon(true); + liveDataThread.interrupt(); + liveDataThread.join(); + //Platform.exit(); + liveDataThread.start(); - // Retrieve data for current drying period - try{ - Thread thread = new Thread(() -> { - try { - while(!IS_FINISHED){ - - STOP_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); - Map<String, Number> data = getCurrentDrying(); - Platform.runLater(() -> { - try { - loadLiveData(data); - } catch (Exception ex) { - ex.printStackTrace(); - } - }); - Thread.sleep(1000L *NUMBER_OF_SECONDS_LIVE_DATA); - } - } catch (Exception ex) { - ex.printStackTrace(); - } - } - ); - thread.setDaemon(true); - thread.start(); - - } catch (Exception ex) { - ex.printStackTrace(); - } - + } catch (Exception ex) { + ex.printStackTrace(); + } + } } ); + /* // Fungerende ny thread!!@@@@@ try{ @@ -374,5 +341,4 @@ public class InputPopUpWindow { window.setScene(scene); window.showAndWait(); } - } diff --git a/src/main/java/com/application/GUI/LineChartFunctionality.java b/src/main/java/com/application/GUI/LineChartFunctionality.java index c5b42259e1085cbe135eb933243c8e890cfdf2a3..98836700a206684aaa85ffedcc236c24b080999a 100644 --- a/src/main/java/com/application/GUI/LineChartFunctionality.java +++ b/src/main/java/com/application/GUI/LineChartFunctionality.java @@ -1,6 +1,6 @@ package com.application.GUI; -import javafx.collections.ObservableList; +import com.application.Main; import javafx.scene.chart.CategoryAxis; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; @@ -11,11 +11,9 @@ import org.apache.commons.math3.exception.MathIllegalArgumentException; import org.apache.commons.math3.stat.descriptive.SummaryStatistics; import org.apache.commons.math3.stat.regression.SimpleRegression; -import java.lang.reflect.Array; import java.util.*; import static com.application.DB.Constants.ADJUST_REGRESSION; -//import static com.application.DB.DB. public class LineChartFunctionality { @@ -24,10 +22,11 @@ public class LineChartFunctionality { private static CategoryAxis xAxis; private static NumberAxis yAxis; private static final double CONFIDENCE_INTERVAL = 0.90; + private static int dataPoints = 0; + private static Map<String, Number> liveData; public LineChartFunctionality() { - liveDataSeries = new XYChart.Series<String, Number>(); xAxis = new CategoryAxis(); yAxis = new NumberAxis(); lineChart = new LineChart<>(xAxis, yAxis); @@ -36,7 +35,6 @@ public class LineChartFunctionality { yAxis.setLabel("Kwh"); yAxis.setAnimated(false); lineChart.setTitle("Drying Processes"); - lineChart.getData().add(liveDataSeries); } @@ -193,14 +191,15 @@ public class LineChartFunctionality { } endOfGraphPoints.add(confidenceIntervalData.size()); - int dataPoints = 0; + dataPoints = 0; for (int i = 0; i < endOfGraphPoints.size(); i++) { dataPoints+=endOfGraphPoints.get(i); } dataPoints = dataPoints/endOfGraphPoints.size(); - + liveDataSeries = new XYChart.Series<String, Number>(); + updateLineChart(liveDataSeries); XYChart.Series<String, Number> regressionSeries = new XYChart.Series<String, Number>(); @@ -258,11 +257,16 @@ public class LineChartFunctionality { //simpleRegression.add + getTimeLeft(0); + return getLineChart(); } public static void loadLiveData(Map<String, Number> userInput) throws Exception { + setLiveData(userInput); + getTimeLeft(userInput.size()); + int index = 0; for (Map.Entry<String, Number> entryKwh : userInput.entrySet()) { Double kwhValue = entryKwh.getValue().doubleValue(); @@ -271,7 +275,24 @@ public class LineChartFunctionality { liveDataSeries.getData().add(new XYChart.Data<String, Number>(String.valueOf(index), kwhValue)); index++; } -} + } + + public static void getTimeLeft(int liveData){ + int time = 0; + + if(liveData == 0) { + time = getDataPoints()*10; + + } else { + time = (getDataPoints()/liveData)*10; + } + if(time > 60){ + time = time/60; + Main.setTimeLeftText(time + " h"); + } else { + Main.setTimeLeftText(time + " min"); + } + } public static double getNonLinearRegression(Map<Integer, ArrayList<Double>> confidenceIntervalData, double y0, double alpha, double j, int n) { @@ -306,4 +327,16 @@ public class LineChartFunctionality { return p_t; } + + public static int getDataPoints() { + return dataPoints; + } + + public static Map<String, Number> getLiveData() { + return liveData; + } + + public static void setLiveData(Map<String, Number> input) { + liveData = input; + } } diff --git a/src/main/java/com/application/GUI/OutputPopUpWindow.java b/src/main/java/com/application/GUI/OutputPopUpWindow.java index 94d7d93cae131313a583194d6286a8fa38104ffb..321ebdc2b1d5900b03b6d7ea4d3404a43e1ff1db 100644 --- a/src/main/java/com/application/GUI/OutputPopUpWindow.java +++ b/src/main/java/com/application/GUI/OutputPopUpWindow.java @@ -1,6 +1,7 @@ package com.application.GUI; import com.application.DB.DB; +import com.application.DB.HelpingFunctions; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; @@ -14,6 +15,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import static com.application.DB.Constants.*; +import static com.application.DB.HelpingFunctions.IS_FINISHED; public class OutputPopUpWindow { @@ -36,15 +38,24 @@ public class OutputPopUpWindow { moistureCheckTextField.setId("inputLabel"); moistureCheckTextField.setAlignment(Pos.CENTER); + + // Bottom - Buttons Button countinueButton = new Button("Continue"); countinueButton.setId("inputButtonStart"); countinueButton.setAlignment(Pos.BOTTOM_CENTER); countinueButton.setOnAction(e -> { try { - STOP_TIME = ""; - DB.pushManMoisture(moistureCheckTextField.getCharacters().toString(), false); - NUMBER_OF_CHECKS++; + if(!moistureCheckTextField.getCharacters().toString().isEmpty() && + !moistureCheckTextField.getCharacters().toString().equals("Please enter a value")) { + HelpingFunctions.STOP_TIME = null; + DB.pushManMoisture(moistureCheckTextField.getCharacters().toString()); + NUMBER_OF_CHECKS++; + window.close(); + } else { + moistureCheckTextField.setPromptText("Please enter a value"); + } + } catch (Exception ex) { ex.printStackTrace(); } @@ -54,8 +65,15 @@ public class OutputPopUpWindow { finishButton.setAlignment(Pos.BOTTOM_CENTER); finishButton.setOnAction(e -> { try { - STOP_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); - DB.pushManMoisture(moistureCheckTextField.getCharacters().toString(),true); + if(!moistureCheckTextField.getCharacters().toString().isEmpty() && + !moistureCheckTextField.getCharacters().toString().equals("Please enter a value")) { + IS_FINISHED = true; + HelpingFunctions.STOP_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); + DB.pushManMoisture(moistureCheckTextField.getCharacters().toString()); + window.close(); + } else { + moistureCheckTextField.setPromptText("Please enter a value"); + } } catch (Exception ex) { ex.printStackTrace(); } diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 2a15a6eb4f244bc1d32dc735709c16fe8dcf6edc..b795ec3dd57730f274660ee66ea94c309ac7b5c7 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1,6 +1,6 @@ package com.application; -import com.application.DB.Constants; +import com.application.DB.HelpingFunctions; import com.application.GUI.InputPopUpWindow; import com.application.GUI.OutputPopUpWindow; import com.application.GUI.RingProgressIndicator; @@ -22,6 +22,10 @@ import java.io.IOException; import java.util.logging.Logger; import static com.application.DB.Constants.*; +import static com.application.DB.HelpingFunctions.*; +import static com.application.DB.HelpingFunctions.isLoadedData; +import static com.application.GUI.LineChartFunctionality.getDataPoints; +import static com.application.GUI.LineChartFunctionality.getLiveData; import static java.util.logging.Level.SEVERE; /** @@ -42,6 +46,7 @@ public class Main extends Application { private static TextField dimensionsText; private static TextField sawsetText; private static TextField moistureGoalText; + private static TextField timeLeftText; /** * Starts the application @@ -162,7 +167,7 @@ public class Main extends Application { treeSpeciesText = new TextField(); treeSpeciesText.setId("sideBarLabelText"); treeSpeciesText.setPromptText("No Input"); - treeSpeciesText.setText(TREE_SPECIES); + treeSpeciesText.setText(HelpingFunctions.TREE_SPECIES); treeSpeciesText.setEditable(false); Label dimensionsLabel = new Label("Width x Height"); @@ -170,7 +175,7 @@ public class Main extends Application { dimensionsText = new TextField(); dimensionsText.setId("sideBarLabelText"); dimensionsText.setPromptText("No Input"); - dimensionsText.setText(DIMENSIONS); + dimensionsText.setText(HelpingFunctions.DIMENSIONS); dimensionsText.setEditable(false); Label sawsetLabel = new Label("Sawset"); @@ -178,7 +183,7 @@ public class Main extends Application { sawsetText = new TextField(); sawsetText.setId("sideBarLabelText"); sawsetText.setPromptText("No Input"); - sawsetText.setText(SAWSET); + sawsetText.setText(HelpingFunctions.SAWSET); sawsetText.setEditable(false); Label moistureGoalLabel = new Label("Moisture Goal"); @@ -186,9 +191,17 @@ public class Main extends Application { moistureGoalText = new TextField(); moistureGoalText.setId("sideBarLabelText"); moistureGoalText.setPromptText("No Input"); - moistureGoalText.setText(MOISTURE_GOAL); + moistureGoalText.setText(HelpingFunctions.MOISTURE_GOAL); moistureGoalText.setEditable(false); + Label timeLeftLabel = new Label("Time Left"); + timeLeftLabel.setId("sideBarLabelText"); + timeLeftText = new TextField(); + timeLeftText.setId("sideBarLabelText"); + timeLeftText.setPromptText("Calculating..."); + timeLeftText.setText(TIME_LEFT); + timeLeftText.setEditable(false); + Button inputParametersButton = new Button("Input Parameters"); inputParametersButton.setId("sideBarButtonInputParameters"); inputParametersButton.setOnAction(e -> InputPopUpWindow.display()); @@ -217,24 +230,32 @@ public class Main extends Application { } @Override - public void run(){ - try { - Thread.sleep(100000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - while (true){ + public void run() { + while (!IS_FINISHED) { + try { - Thread.sleep(100); + ringProgressIndicator.makeIndeterminate(); + Thread.sleep(500L * NUMBER_OF_SECONDS_LIVE_DATA); } catch (InterruptedException e) { e.printStackTrace(); - Logger.getLogger(getClass().getName()).log(SEVERE,null,e); } - Platform.runLater(() -> {rpi.setProgress(progress);}); - progress += 1; - if(progress>100){ - break; + while (isLoadedData()) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + Logger.getLogger(getClass().getName()).log(SEVERE, null, e); + } + Platform.runLater(() -> { + rpi.setProgress(progress); + }); + + progress = getLiveData().size()/getDataPoints(); + + if (progress > 100) { + break; + } } } } @@ -245,7 +266,7 @@ public class Main extends Application { sideBarVBox.getChildren().addAll(ringProgressIndicator, treeSpeciesLabel, treeSpeciesText, dimensionsLabel, dimensionsText, - sawsetLabel, sawsetText, moistureGoalLabel, moistureGoalText, inputParametersButton, finishButton, exitButton); + sawsetLabel, sawsetText, moistureGoalLabel, moistureGoalText, timeLeftLabel, timeLeftText, inputParametersButton, finishButton, exitButton); VBox.setVgrow(sideBarVBox, Priority.ALWAYS); @@ -302,6 +323,10 @@ public class Main extends Application { public static void setMoistureGoalText(String moistureGoalText) { Main.moistureGoalText.setText(moistureGoalText); } + + public static void setTimeLeftText(String moistureGoalText) { + Main.timeLeftText.setText(moistureGoalText); + } } diff --git a/src/main/resources/com.application/GUI/graphStyles.css b/src/main/resources/com.application/GUI/graphStyles.css index bbef3d52ce4941ae4c58f31aa59e4f0e8b31486e..ce64d11a6212e471d83818c65688d7718b717114 100644 --- a/src/main/resources/com.application/GUI/graphStyles.css +++ b/src/main/resources/com.application/GUI/graphStyles.css @@ -4,8 +4,8 @@ -fx-effect: null; } -.default-color0.chart-series-line{-fx-stroke: green; -fx-opacity: 1.0} -.default-color1.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color0.chart-series-line{-fx-stroke: red; -fx-opacity: 1.0} +.default-color1.chart-series-line{-fx-stroke: green; -fx-opacity: 1.0} .default-color2.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} .default-color3.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} .default-color4.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} @@ -13,8 +13,8 @@ .default-color6.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} .default-color7.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} -.default-color0.chart-line-symbol{-fx-background-color: green,green;} -.default-color1.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color0.chart-line-symbol{-fx-background-color: red,red;} +.default-color1.chart-line-symbol{-fx-background-color: green,green;} .default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} .default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} .default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} diff --git a/target/classes/com/application/DB/Constants.class b/target/classes/com/application/DB/Constants.class index 12b796c5c7f59d192a5504fb50d7263ec9fee188..02c56a821341bc307e15807c05b63c49702bfc51 100644 Binary files a/target/classes/com/application/DB/Constants.class and b/target/classes/com/application/DB/Constants.class differ diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class index 907ca7cd83870015b2dfa3d10e234e29292ea61b..26a1f36fce1a238184b8a29e8cb4e0d4a150c8f8 100644 Binary files a/target/classes/com/application/DB/DB.class and b/target/classes/com/application/DB/DB.class differ diff --git a/target/classes/com/application/DB/HelpingFunctions.class b/target/classes/com/application/DB/HelpingFunctions.class index 77d4802660217db2dbb5a825bf559f40a6d64f55..36d469c1d0ca1685925a9c9f742790f882b7ae9b 100644 Binary files a/target/classes/com/application/DB/HelpingFunctions.class and b/target/classes/com/application/DB/HelpingFunctions.class differ diff --git a/target/classes/com/application/GUI/InputPopUpWindow.class b/target/classes/com/application/GUI/InputPopUpWindow.class index 22435a873bdd72d725141bb68ad28bf4d1bb7f2d..037171ffa7925880946ed5def0d7a08388321c3e 100644 Binary files a/target/classes/com/application/GUI/InputPopUpWindow.class and b/target/classes/com/application/GUI/InputPopUpWindow.class differ diff --git a/target/classes/com/application/GUI/LineChartFunctionality.class b/target/classes/com/application/GUI/LineChartFunctionality.class index f70466837b2fd6c3753ca6494fe6f688c79c214e..125b40b88613c6967a6c7d4b98232326c6796831 100644 Binary files a/target/classes/com/application/GUI/LineChartFunctionality.class and b/target/classes/com/application/GUI/LineChartFunctionality.class differ diff --git a/target/classes/com/application/GUI/OutputPopUpWindow.class b/target/classes/com/application/GUI/OutputPopUpWindow.class index 3ce6d7422da8fe27aa5bfd05cc8d07d7c6ca9408..27d06e89690bd8ca3dda77884ecb9438ad689235 100644 Binary files a/target/classes/com/application/GUI/OutputPopUpWindow.class and b/target/classes/com/application/GUI/OutputPopUpWindow.class differ diff --git a/target/classes/com/application/Main$1WorkerThread.class b/target/classes/com/application/Main$1WorkerThread.class index 96fdabd6ebabc2018a0dd6405c464e591d7e57cb..8764a06752f05b58c77755135c22afadf0c8bbf2 100644 Binary files a/target/classes/com/application/Main$1WorkerThread.class and b/target/classes/com/application/Main$1WorkerThread.class differ diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class index 4f200bb95090d532276bac28a3d5cf147cbf33a6..b9e38140f6b49fd482603f5b043ca7205cbe4856 100644 Binary files a/target/classes/com/application/Main.class and b/target/classes/com/application/Main.class differ