diff --git a/ApplicationCubesatSim/pom.xml b/ApplicationCubesatSim/pom.xml
index aadbca333cfadd3f45d820b7f0cfb79705d76fe4..1c0fe64da1e55d012013c705b9d8ab74b89ba0ce 100644
--- a/ApplicationCubesatSim/pom.xml
+++ b/ApplicationCubesatSim/pom.xml
@@ -9,7 +9,7 @@
ApplicationCubesatSim
- 1.2
+
ApplicationCubesatSim
@@ -22,6 +22,7 @@
1.8
${env.JAVA_HOME}
0.1.5
+ ${josast.version}
@@ -34,7 +35,7 @@
org.josast
ModuleCubesatSim
- 1.2
+ ${ModuleCubesatSim.version}
commons-cli
diff --git a/ApplicationKissTool/pom.xml b/ApplicationKissTool/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aa8e34adee53ebe5c7d4b8475cd7b860b057b531
--- /dev/null
+++ b/ApplicationKissTool/pom.xml
@@ -0,0 +1,136 @@
+
+ 4.0.0
+
+
+ org.josast
+ JOSAST-parent
+ 0.0.2
+
+
+
+ ApplicationKissTool
+ 0.0.1-SNAPSHOT
+
+ UTF-8
+ 11
+ 11
+
+
+
+
+ ${josast.version}
+ ${josast.version}
+ ${josast.version}
+ 13
+
+
+
+
+
+ org.openjfx
+ javafx-controls
+ ${JavaFx.version}
+
+
+ org.openjfx
+ javafx-graphics
+ ${JavaFx.version}
+
+
+ org.openjfx
+ javafx-base
+ ${JavaFx.version}
+
+
+ org.openjfx
+ javafx-fxml
+ ${JavaFx.version}
+
+
+ org.openjfx
+ javafx-web
+ ${JavaFx.version}
+
+
+ org.openjfx
+ javafx-media
+ ${JavaFx.version}
+
+
+ org.openjfx
+ javafx-swing
+ ${JavaFx.version}
+
+
+
+
+
+
+
+
+
+
+
+ org.josast
+ ModuleSIDS
+ ${ModuleSIDS.version}
+
+
+ org.josast
+ ModuleSoundModem
+ ${ModuleSoundModem.version}
+
+
+ org.josast
+ ModuleConfig
+ ${ModuleConfig.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ 11
+
+
+
+ org.openjfx
+ javafx-maven-plugin
+ 0.0.4
+
+ org.josast.ApplicationKissTool.App
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+ org.josast.ApplicationKissTool.App
+
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ApplicationKissTool/src/main/java/module-info.java b/ApplicationKissTool/src/main/java/module-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..3691fcbb8c4b6ff52577a63f3dac53541406c945
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/module-info.java
@@ -0,0 +1,14 @@
+module org.josast.ApplicationKissTool {
+ requires javafx.controls;
+ requires javafx.fxml;
+ requires java.logging;
+ requires javafx.graphics;
+ requires java.desktop;
+ requires ModuleSoundModem;
+ requires ModuleSIDS;
+ requires ModuleConfig;
+ requires javafx.swing;
+
+ opens org.josast.ApplicationKissTool to javafx.fxml;
+ exports org.josast.ApplicationKissTool;
+}
\ No newline at end of file
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/AlertHelper.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/AlertHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ba50ef331bd9c420cf30e3e4270a797fa6b94aa
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/AlertHelper.java
@@ -0,0 +1,28 @@
+package org.josast.ApplicationKissTool;
+
+import javafx.scene.control.Alert;
+import javafx.stage.Window;
+
+public class AlertHelper {
+
+ private AlertHelper()
+ {
+
+ }
+ /**
+ * Display a window in order to display a message
+ * @param alertType Type of alert
+ * @param owner
+ * @param title title of the windows
+ * @param message message to display
+ */
+ public static void showAlert(Alert.AlertType alertType, Window owner, String title, String message) {
+ Alert alert = new Alert(alertType);
+ alert.setTitle(title);
+ alert.setHeaderText(null);
+ alert.setContentText(message);
+ alert.initOwner(owner);
+ alert.show();
+ }
+
+}
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/App.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/App.java
new file mode 100644
index 0000000000000000000000000000000000000000..8545ad993c126dc0ec98e6c08c6fa58ff2cbb6f2
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/App.java
@@ -0,0 +1,82 @@
+package org.josast.ApplicationKissTool;
+
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.FileHandler;
+import java.util.logging.Handler;
+import java.util.logging.Logger;
+
+
+
+/**
+ * JavaFX App
+ */
+public class App extends Application {
+
+ private static Scene scene;
+ private static FXMLLoader fxmlLoader;
+ private static Logger logger = Logger.getLogger("AmsatLogger");
+
+ @Override
+ public void start(Stage stage) throws IOException {
+
+ System.setProperty("glass.accessible.force", "false");
+ scene = new Scene(loadFXML("KissTool"), 800, 600);
+ stage.setScene(scene);
+
+
+ Controler ctrl = fxmlLoader.getController();
+ ctrl.setPrimaryStage(stage);
+ scene.getStylesheets().add(this.getClass().getResource("boot.css").toExternalForm());
+ stage.setTitle("KISS tool");
+ ctrl.initMMI();
+ stage.show();
+ }
+
+ static void setRoot(String fxml) throws IOException {
+ scene.setRoot(loadFXML(fxml));
+ }
+
+ private static Parent loadFXML(String fxml) throws IOException {
+ fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
+ return fxmlLoader.load();
+ }
+
+ public static void main(String[] args) {
+ // initialisation du systéme de log en premier
+ try {
+ String path = System.getProperty("user.dir") + "/log";
+ File apath = new File(path);
+
+ if (!apath.exists()) {
+ if (apath.mkdir() == false) {
+ System.err.println("fail to create " + path);
+ }
+ }
+ FileHandler fh = new FileHandler(path + "/" + "KissTool.log");
+ logger.setUseParentHandlers(false);
+ Handler[] handlers = logger.getHandlers();
+ for (Handler handler : handlers) {
+ logger.removeHandler(handler);
+ }
+ logger.addHandler(fh);
+
+ } catch (SecurityException e) {
+
+ e.printStackTrace();
+
+ } catch (IOException e) {
+
+ e.printStackTrace();
+
+ }
+ launch();
+ }
+
+}
\ No newline at end of file
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/Configuration.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/Configuration.java
new file mode 100644
index 0000000000000000000000000000000000000000..33af419cb2162f01bcee1fb970a9342771b507db
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/Configuration.java
@@ -0,0 +1,237 @@
+/**
+ *
+ */
+package org.josast.ApplicationKissTool;
+
+import org.josast.property.CONFIG;
+
+/**
+ * Singleton to manage all application parameter
+ * The default configuration is automaticaly saved in a properties file.
+ * @author christophe
+ *
+ *
+ */
+public class Configuration {
+
+
+ /*
+ * parameter with default value
+ */
+ private String callsign="Anonymous";
+ private String longitude="0.0W";
+ private String latitude="0.0N";
+
+ private String soundModemIP="127.0.0.1";
+ private String soundModemPort="8100";
+
+ private String SIDSAMSATSource="Anonymous";
+ private String SIDSAMSATUrl="https://amsat.electrolab.fr/SIDS";
+ private String SIDSSatnogsSource="Anonymous";
+ private String SIDSSatnogsURL="https://db.satnogs.org/api/telemetry/";
+ private String SIDSSatnogs="0";
+ private String SIDSAMSAT="1";
+ private boolean SISD_SatNogs = false;
+ private boolean SIDS_AMSAT = true;
+
+
+ private CONFIG conf = CONFIG.getInstance();
+
+ public static Configuration getInstance()
+ {
+ return SingletonHolder.instance;
+ }
+
+ public boolean isSISD_SatNogs() {
+
+ return SISD_SatNogs;
+ }
+
+
+
+ private Configuration()
+ {
+ if ( conf.GetProperty("Callsign")!=null)
+ {
+ callsign = conf.GetProperty("Callsign");
+ latitude = conf.GetProperty("Latitude");
+ longitude = conf.GetProperty("Longitude");
+
+ SIDSAMSATSource=conf.GetProperty("SIDSAMSATSource");
+ SIDSAMSATUrl=conf.GetProperty("SIDSAMSATUrl");
+ SIDSSatnogsSource=conf.GetProperty("SIDSSatnogsSource");
+ SIDSSatnogsURL=conf.GetProperty("SIDSSatnogsURL");
+ SIDSSatnogs=conf.GetProperty("SIDSSatnogs");
+ SIDSAMSAT=conf.GetProperty("SIDSAMSAT");
+ soundModemIP = conf.GetProperty("soundModemIP");
+ soundModemPort = conf.GetProperty("soundModemPort");
+ if (SIDSSatnogs.contentEquals("1") )
+ {
+ SISD_SatNogs=true;
+ } else
+ {
+ SISD_SatNogs=false;
+ }
+ if (SIDSAMSAT.contentEquals("1") )
+ {
+ SIDS_AMSAT=true;
+ } else
+ {
+ SIDS_AMSAT=false;
+ }
+
+ }
+ else // si le fichier n'existe pas, il est créé par défaut
+ {
+ save();
+ }
+
+
+ }
+
+
+ private static class SingletonHolder
+ {
+
+ private final static Configuration instance = new Configuration();
+ }
+
+
+
+
+ public void setSIDSSatnogs(String sIDSSatnogs) {
+ SIDSSatnogs = sIDSSatnogs;
+ if (SIDSSatnogs.contentEquals("1") )
+ {
+ SISD_SatNogs=true;
+ } else
+ {
+ SISD_SatNogs=false;
+ }
+ }
+
+
+ public void setSIDSAMSAT(String sIDSEntrySat) {
+ SIDSAMSAT = sIDSEntrySat;
+ if (SIDSAMSAT.contentEquals("1") )
+ {
+ SIDS_AMSAT=true;
+ } else
+ {
+ SIDS_AMSAT=false;
+ }
+ }
+
+
+ public void save() {
+
+ conf.SetProperty("Callsign",callsign);
+ conf.SetProperty("Latitude",latitude);
+ conf.SetProperty("Longitude",longitude);
+ conf.SetProperty("SIDSAMSATSource",this.SIDSAMSATSource);
+ conf.SetProperty("SIDSAMSATUrl",this.SIDSAMSATUrl);
+ conf.SetProperty("SIDSSatnogsSource",this.SIDSSatnogsSource);
+ conf.SetProperty("SIDSSatnogsURL",this.SIDSSatnogsURL);
+ conf.SetProperty("SIDSSatnogs",this.SIDSSatnogs);
+ conf.SetProperty("SIDSAMSAT",this.SIDSAMSAT);
+ conf.SetProperty("soundModemPort",this.soundModemPort);
+ conf.SetProperty("soundModemIP",this.soundModemIP);
+ }
+
+ public String getCallsign() {
+ return callsign;
+ }
+
+ public void setCallsign(String callsign) {
+ this.callsign = callsign;
+ }
+
+ public String getLongitude() {
+ return longitude;
+ }
+
+ public void setLongitude(String longitude) {
+ this.longitude = longitude;
+ }
+
+ public String getLatitude() {
+ return latitude;
+ }
+
+ public void setLatitude(String latitude) {
+ this.latitude = latitude;
+ }
+
+ public String getSoundModemIP() {
+ return soundModemIP;
+ }
+
+ public void setSoundModemIP(String soundModemIP) {
+ this.soundModemIP = soundModemIP;
+ }
+
+ public String getSoundModemPort() {
+ return soundModemPort;
+ }
+
+ public void setSoundModemPort(String soundModemPort) {
+ this.soundModemPort = soundModemPort;
+ }
+
+ public String getSIDSAMSATSource() {
+ return SIDSAMSATSource;
+ }
+
+ public void setSIDSAMSATSource(String sIDSAMSATSource) {
+ SIDSAMSATSource = sIDSAMSATSource;
+ }
+
+ public String getSIDSAMSATUrl() {
+ return SIDSAMSATUrl;
+ }
+
+ public void setSIDSAMSATUrl(String sIDSAMSATUrl) {
+ SIDSAMSATUrl = sIDSAMSATUrl;
+ }
+
+ public String getSIDSSatnogsSource() {
+ return SIDSSatnogsSource;
+ }
+
+ public void setSIDSSatnogsSource(String sIDSSatnogsSource) {
+ SIDSSatnogsSource = sIDSSatnogsSource;
+ }
+
+ public String getSIDSSatnogsURL() {
+ return SIDSSatnogsURL;
+ }
+
+ public void setSIDSSatnogsURL(String sIDSSatnogsURL) {
+ SIDSSatnogsURL = sIDSSatnogsURL;
+ }
+
+
+
+
+
+ public boolean isSIDS_AMSAT() {
+ return SIDS_AMSAT;
+ }
+
+
+
+ public CONFIG getConf() {
+ return conf;
+ }
+
+ public void setConf(CONFIG conf) {
+ this.conf = conf;
+ }
+
+ public void setSISD_SatNogs(boolean sISD_SatNogs) {
+ SISD_SatNogs = sISD_SatNogs;
+ }
+
+
+
+}
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/Controler.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/Controler.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e7823fa52ed9cd9b8765aabb0f306add29d591a
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/Controler.java
@@ -0,0 +1,565 @@
+package org.josast.ApplicationKissTool;
+
+import java.awt.image.BufferedImage;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.logging.Logger;
+
+import javax.imageio.ImageIO;
+
+import org.josast.AX25.AX25DecodedData;
+import org.josast.ModuleSoundModem.SoundModemConfiguration;
+import org.josast.SIDS.Station;
+
+
+
+
+import org.josast.propertyHttp.ConfigHttp;
+//import org.josast.uvsqsat.Frame;
+//import org.josast.uvsqsat.generated.Uvsqsat;
+
+import io.kaitai.struct.ByteBufferKaitaiStream;
+import javafx.application.Platform;
+import javafx.concurrent.WorkerStateEvent;
+
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+
+//import java.util.logging.Logger;
+
+import javafx.fxml.FXML;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Button;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.TextArea;
+import javafx.scene.control.TextField;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.stage.Stage;
+import javafx.stage.Window;
+import javafx.embed.swing.SwingFXUtils;
+
+public class Controler {
+
+ private static final String LINE_SEPARATOR = "\r\n";
+ private static final int STATE_INIT = 0;
+ private static final int STATE_START = 1;
+ protected static final int STATE_STOP = 2;
+ private static final int STATE_SAVE = 3;
+
+ private static Logger appLogger = Logger.getLogger("AmsatLogger");
+
+ private String version = "1.0";
+
+ @FXML
+ private Button ButtonStart;
+ @FXML
+ private Button ButtonStop;
+ @FXML
+ private Button ButtonSave;
+ @FXML
+ private Label LabelIP;
+
+ @FXML
+ private Button ButtonFile;
+ @FXML
+ private Button ButtonSerial;
+ @FXML
+ private Button ButtonKiss;
+
+ @FXML
+ private TextField FieldIP;
+ @FXML
+ private TextField FieldPort;
+
+ @FXML
+ private Label labelStatus;
+ @FXML
+ private Label LabelFrame;
+
+ @FXML
+ private TextArea DecodedData;
+
+ @FXML
+ private TextArea TexAreaLog;
+
+ @FXML
+ private TextField textFieldMode;
+
+ @FXML
+ private TextField textFieldDate;
+
+ @FXML
+ private Label LabelInformation;
+
+ @FXML
+ private ImageView ImageViewAMSAT;
+
+ @FXML
+ private ImageView imageViewEntrysat;
+
+ @FXML
+ private TextField TextFieldCallsign;
+ @FXML
+ private TextField TextFieldLatitude;
+ @FXML
+ private TextField TextFieldLongitude;
+
+ @FXML
+ private CheckBox CheckbBoxAmicalSat;
+ @FXML
+ private CheckBox CheckBoxSatNogs;
+
+ @FXML
+ private Button ButtonSaveConfiguration;
+
+ @FXML
+ private TextField TextFieldSIDSEntrysat;
+ @FXML
+ private TextField TextFieldSIDSSatnogs;
+
+
+
+ Stage primaryStage = null;
+
+ private String imgAmsat = "logoAmsat.png";
+ private String imgAmicalsat = "logoAmsat.png";
+
+ Station station = new Station();
+
+ ModelReceivedData receivedFrame = new ModelReceivedData();
+ Configuration conf = Configuration.getInstance();
+
+ private TaskSoundmodemTCP task;
+ private SendSIDS SendSIDSSatnogs;
+ private SendSIDS SendSIDSMVPAmsat;
+
+ private LogFile logfile = null;
+ private String generateRepository ="./ouputFile";
+ private int cpt=0;
+
+ @FXML
+ private void HandleSaveConfiguration(ActionEvent event) {
+
+ String erreurmsg = null;
+ String Callsign = null;
+
+ if (TextFieldCallsign.getText().isEmpty()) {
+ erreurmsg += "please enter a CallSign \r\n";
+ } else {
+ Callsign = TextFieldCallsign.getText();
+ }
+
+ String Latitude = TextFieldLatitude.getText();
+ String Longitude = TextFieldLongitude.getText();
+
+ if (station.checkLatitude(Latitude) == false) {
+ erreurmsg += "Wrong format for Latitude : XX.XXE/W \r\n";
+ }
+
+ if (station.checkLongitude(Longitude) == false) {
+ erreurmsg += "Wrong format for Longitude : XX.XXS/N \r\n";
+ }
+ if (erreurmsg != null) {
+ Window owner = ButtonSaveConfiguration.getScene().getWindow();
+ AlertHelper.showAlert(Alert.AlertType.ERROR, owner, "Form Error!",
+ erreurmsg);
+ return;
+ }
+
+ station.setCallsign(Callsign);
+ station.setLatitude(Latitude);
+ station.setLongitude(Longitude);
+
+ conf.setCallsign(Callsign);
+ conf.setLatitude(Latitude);
+ conf.setLongitude(Longitude);
+
+ conf.setSIDSAMSATSource(TextFieldSIDSEntrysat.getText());
+ conf.setSIDSSatnogsSource(TextFieldSIDSSatnogs.getText());
+ conf.setSoundModemIP(FieldIP.getText());
+ conf.setSoundModemPort(FieldPort.getText());
+
+ Station StationSatnogs = new Station(conf.getSIDSSatnogsSource(),
+ station.getLongitude(), station.getLatitude());
+ Station StationEntry = new Station(conf.getSIDSAMSATSource(),
+ station.getLongitude(), station.getLatitude());
+
+ if (CheckbBoxAmicalSat.isSelected() == true) {
+ conf.setSIDSAMSAT("1");
+//@Todo : revoir SendSIDS
+// SendSIDSMVPAmsat = new SendSIDS(StationEntry, conf.getNorad(),
+// conf.getSIDSAMSATUrl());
+ } else {
+ conf.setSIDSAMSAT("0");
+
+ }
+
+ if (CheckBoxSatNogs.isSelected() == true) {
+ conf.setSIDSSatnogs("1");
+//@Todo : revoir SendSIDS
+// SendSIDSSatnogs = new SendSIDS(StationSatnogs, conf.getNorad(),
+// conf.getSIDSSatnogsURL());
+ } else {
+ conf.setSIDSSatnogs("0");
+ }
+
+ conf.save();
+ manageStatusinformation("Configuration Saved", "Configuration Saved");
+
+ }
+
+ @FXML
+ private void handleStart(ActionEvent event) {
+
+ manageStatusinformation("Connected to modem", "Connection to modem");
+ manageStateMMI(STATE_START);
+
+ // TODO : to improve
+ SoundModemConfiguration smc = new SoundModemConfiguration("default");
+ smc.setSmIPadress(FieldIP.getText());
+ smc.setSmPort(Integer.parseInt(FieldPort.getText()));
+
+ if (task == null) {
+ receivedFrame
+ .addPropertyChangeListener(new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ final ReceivedData decodedData = receivedFrame
+ .getLastReceivedData();
+ Platform.runLater(new Runnable() {
+ @Override
+ public void run() {
+ try {
+
+ if (decodedData != null) {
+ displayLog(decodedData.toString());
+ AX25DecodedData ax25 = new AX25DecodedData(decodedData.getData());
+ DecodedData.appendText("\r\n");
+ DecodedData.appendText(decodedData.getTime().toString());
+ DecodedData.appendText(ax25.toStringHeader());
+ DecodedData.appendText(ax25.toStringData());
+ DecodedData.appendText("\r\n");
+
+ saveRawFile(decodedData.getData());
+
+ updateFrame(receivedFrame
+ .getNumberFrame());
+// if (ax25.source.contains("LATMOS"))
+// {
+// System.out.println("UVSqat");
+// Uvsqsat cube = new Uvsqsat(new ByteBufferKaitaiStream(decodedData.getData()));
+// Frame frame = new Frame ();
+// frame.setUp(cube);
+// DecodedData.appendText(frame.toString());
+// DecodedData.appendText("\r\n");
+// }
+
+// UpdateDecodedData(decodedData);
+// SendSids(receivedFrame.getLastReceivedData());
+
+ } else {
+ displayLog(
+ "received frame : null");
+ }
+
+ } catch (Exception e) {
+ displayLog("Run - error");
+ displayLog(e.toString());
+ e.printStackTrace();
+ }
+
+ }
+
+
+ });
+ }
+
+ }
+
+ );
+
+ }
+ task = new TaskSoundmodemTCP(smc, receivedFrame);
+
+ task.setOnSucceeded(new EventHandler() {
+
+ @Override
+ public void handle(WorkerStateEvent event) {
+ // La tache s'est correctement terminee.
+ manageStatusinformation("KISS TCP CONNECTION FAILED",
+ "KISS TCP DISCONNECTED");
+ manageStateMMI(STATE_STOP);
+
+ }
+
+ });
+
+ task.setOnFailed(new EventHandler() {
+
+ @Override
+ public void handle(WorkerStateEvent event) {
+ // La tache s'est correctement terminee.
+ manageStatusinformation("KISS TCP CONNECTION FAILED",
+ "KISS TCP DISCONNECTED - Connection failed");
+ displayLog(event.toString());
+ displayLog(event.getSource().toString());
+ manageStateMMI(STATE_STOP);
+ }
+
+ });
+
+ Thread backgroundThread = new Thread(task);
+ backgroundThread.setDaemon(true);
+ backgroundThread.start();
+
+ }
+
+ @FXML
+ private void handleStop(ActionEvent event) {
+
+ manageStateMMI(STATE_STOP);
+ task.arreter();
+ manageStatusinformation("Stop received data",
+ "Stop task to receive telemetrie");
+ }
+
+ @FXML
+ private void handleSave(ActionEvent event) {
+
+ manageStateMMI(STATE_SAVE);
+ manageStatusinformation("save data", "save Telemetry in file");
+ saveDataFile();
+ manageStatusinformation("Data Saved", "Telemetry Data saved in file");
+ }
+
+ @FXML
+ private void HandleIP(ActionEvent event) {
+ }
+
+ @FXML
+ private void HandlePort(ActionEvent event) {
+ }
+
+ public void initMMI() {
+
+ logfile = new LogFile();
+ // initialise le log
+ // initdisplayLogFile();
+
+ manageStatusinformation("Initialised",
+ "KISS TOOL - LOG \r\n Initialise application");
+ appLogger.warning("Initialise ");
+ primaryStage.setTitle("KISS TOOL - " + version);
+
+ station.setCallsign(conf.getCallsign());
+ station.setLatitude(conf.getLatitude());
+ station.setLongitude(conf.getLongitude());
+
+ TextFieldCallsign.setText(station.getCallsign());
+ TextFieldLatitude.setText(station.getLatitude());
+ TextFieldLongitude.setText(station.getLongitude());
+
+ TextFieldSIDSEntrysat.setText(conf.getSIDSAMSATSource());
+ TextFieldSIDSSatnogs.setText(conf.getSIDSSatnogsSource());
+
+ if (conf.isSIDS_AMSAT()) {
+ CheckbBoxAmicalSat.setSelected(true);
+ }
+ if (conf.isSISD_SatNogs()) {
+ CheckBoxSatNogs.setSelected(true);
+ }
+
+ displayLog(conf.getSIDSSatnogsURL());
+ displayLog(conf.getSIDSAMSATUrl());
+ displayLog("Initialisation with Properties File Done ");
+
+ BufferedImage bufferedImage1 = null;
+ BufferedImage bufferedImage2 = null;
+
+ try {
+
+ bufferedImage1 = ImageIO.read(getClass().getResource((imgAmsat)));
+ bufferedImage2 = ImageIO
+ .read(getClass().getResource((imgAmicalsat)));
+ } catch (IOException e) {
+
+ appLogger.severe("Error loading Image resources");
+ appLogger.severe(e.toString());
+ }
+ Image imageamsat = SwingFXUtils.toFXImage(bufferedImage1, null);
+ ImageViewAMSAT.setImage(imageamsat);
+ Image imgQB = SwingFXUtils.toFXImage(bufferedImage2, null);
+ imageViewEntrysat.setImage(imgQB);
+
+ ConfigHttp c = new ConfigHttp(
+ "http://site.amsat-f.org/download/117168/");
+ String ver;
+ String message;
+
+ if (c.isConnected()) {
+ ver = c.GetProperty("AmicalsatVersion");
+ message = c.GetProperty("Message");
+ } else {
+ ver = version;
+ message = "not connected to internet";
+ }
+
+
+ manageStateMMI(STATE_INIT);
+ manageStatusinformation("Application Ready", "Application initialised");
+ this.LabelInformation.setText("");
+
+ // initialise SIDS
+
+ Station StationSatnogs = new Station(conf.getSIDSSatnogsSource(),
+ station.getLongitude(), station.getLatitude());
+ Station StationEntry = new Station(conf.getSIDSAMSATSource(),
+ station.getLongitude(), station.getLatitude());
+
+ if (conf.isSISD_SatNogs() == true) {
+// SendSIDSSatnogs = new SendSIDS(StationSatnogs, conf.getNorad(),
+// conf.getSIDSSatnogsURL());
+ }
+
+ if (conf.isSIDS_AMSAT() == true) {
+// SendSIDSMVPAmsat = new SendSIDS(StationEntry, conf.getNorad(),
+// conf.getSIDSAMSATUrl());
+ }
+
+ String erreurmsg = message;
+
+ if (ver.equals(version) == false) {
+ erreurmsg += " New version " + ver + " available ! ";
+
+ }
+ this.LabelInformation.setText(erreurmsg);
+
+ }
+
+ public void setPrimaryStage(Stage primaryStage) {
+ this.primaryStage = primaryStage;
+
+ }
+
+ /**
+ * Save telemetry data received in text file. The file is stored in data
+ * folder.
+ */
+ public void saveDataFile() {
+ SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd-HHmmss");
+ Date aujourdhui = new Date();
+
+ //
+
+ String path = System.getProperty("user.dir") + "/data";
+ File apath = new File(path);
+
+ if (!apath.exists()) {
+ if (apath.mkdir() == false) {
+ appLogger.severe("fail to create " + path);
+ }
+ }
+
+ PrintWriter pw = null;
+
+ long NbFrame = receivedFrame.getNumberFrame();
+
+ try {
+ pw = new PrintWriter(new FileWriter(path + "/"
+ + formater.format(aujourdhui) + "-tlm-Hexa.txt"));
+ for (int i = 0; i < NbFrame; i++) {
+ pw.write(receivedFrame.getRawFrame(i));
+ pw.write(LINE_SEPARATOR);
+ }
+
+ pw.flush();
+ pw.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private void updateFrame(long nbframe) {
+ LabelFrame.setText("frame : " + nbframe);
+
+ }
+
+ private void displayLog(String log) {
+ appLogger.info(log);
+ logfile.displayLog(log);
+ TexAreaLog.appendText(log);
+ TexAreaLog.appendText("\r\n");
+ }
+
+ private void manageStateMMI(int state) {
+ switch (state) {
+ case STATE_INIT:
+ ButtonStop.setDisable(true);
+ ButtonStart.setDisable(false);
+ ButtonSave.setDisable(true);
+ break;
+ case STATE_START:
+ ButtonStop.setDisable(false);
+ ButtonStart.setDisable(true);
+ ButtonSave.setDisable(false);
+ break;
+ case STATE_STOP:
+ ButtonStop.setDisable(true);
+ ButtonStart.setDisable(false);
+ ButtonSave.setDisable(false);
+ break;
+ case STATE_SAVE:
+ ButtonStop.setDisable(true);
+ ButtonStart.setDisable(false);
+ ButtonSave.setDisable(true);
+ break;
+ default :
+ ButtonStop.setDisable(true);
+ ButtonStart.setDisable(false);
+ ButtonSave.setDisable(false);
+ break;
+ }
+ }
+
+ private void manageStatusinformation(String statusMessage,
+ String logMessage) {
+ labelStatus.setText(statusMessage);
+ displayLog(logMessage);
+
+ }
+
+
+ private void SendSids(ReceivedData receivedData) {
+
+ if (conf.isSIDS_AMSAT() == true) {
+ int results = SendSIDSMVPAmsat.Send(receivedData);
+ displayLog("Send SIDS AMSAT-F Database ; "+results);
+ }
+
+ if (conf.isSISD_SatNogs() == true) {
+ int results = SendSIDSSatnogs.Send(receivedData);
+ displayLog("Send SIDS SatNogs Database : "+results );
+ }
+ }
+
+ private void saveRawFile(byte[] data)
+ {
+ try {
+ Files.write(Paths.get(generateRepository + "\\Frame_" + cpt+++".bin"), data);
+ } catch (IOException e) {
+ displayLog(e.toString());
+ }
+ }
+
+}
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/LogFile.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/LogFile.java
new file mode 100644
index 0000000000000000000000000000000000000000..78263019ae93c656be4f92229de5f6ec8a924c41
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/LogFile.java
@@ -0,0 +1,65 @@
+/**
+ *
+ */
+package org.josast.ApplicationKissTool;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.logging.Logger;
+
+/**
+ * @author christophe
+ *
+ */
+public class LogFile {
+
+ private static Logger appLogger = Logger.getLogger("AmsatLogger");
+ private PrintWriter pw;
+
+ /**
+ *
+ */
+ public LogFile() {
+ // TODO Auto-generated constructor stub
+ initdisplayLogFile();
+ }
+
+
+ private void initdisplayLogFile()
+ {
+
+
+ SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd-HHmmss");
+ Date aujourdhui = new Date();
+ String path = System.getProperty("user.dir") + "/log";
+ File apath = new File(path);
+
+ if (!apath.exists()) {
+ if (apath.mkdir() == false) {
+ appLogger.severe("fail to create " + path);
+ }
+ }
+ try {
+ pw = new PrintWriter (new FileWriter(path+"/"+formater.format(aujourdhui)+"-"+".log"));
+ } catch (IOException e) {
+ appLogger.severe("erreur creating log file");
+ appLogger.severe (e.toString());
+ }
+ }
+
+ public void displayLog(String log) {
+ if(pw!=null)
+ {
+ pw.println(log);
+ pw.flush();
+ }
+ appLogger.info(log);
+
+ }
+
+
+}
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/ModelReceivedData.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/ModelReceivedData.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2c89014398dc88f78296c721935486d510ae308
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/ModelReceivedData.java
@@ -0,0 +1,65 @@
+package org.josast.ApplicationKissTool;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.util.Date;
+import java.util.Vector;
+
+
+
+
+
+
+public class ModelReceivedData {
+
+ long numberFrame = 0;
+ Vector vecRawData = new Vector();
+
+
+
+ private PropertyChangeSupport listenerList = new PropertyChangeSupport(this);
+
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ listenerList.addPropertyChangeListener(listener);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ listenerList.removePropertyChangeListener(listener);
+ }
+
+ public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ listenerList.addPropertyChangeListener(propertyName, listener);
+ }
+
+ public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ listenerList.removePropertyChangeListener(propertyName, listener);
+ }
+
+ public long getNumberFrame() {
+ return numberFrame;
+ }
+
+ public ReceivedData getLastReceivedData() {
+ return vecRawData.lastElement();
+ }
+
+
+
+
+
+ public void addFrame(byte[] received) {
+ long oldNumberFrame = numberFrame;
+ numberFrame++;
+ vecRawData.add(new ReceivedData(new Date(),received));
+ listenerList.firePropertyChange("numberFrame", oldNumberFrame, numberFrame);
+
+ }
+
+ public String getRawFrame(int i) {
+
+ return vecRawData.get(i).toString();
+ }
+
+
+
+}
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/PrimaryController.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/PrimaryController.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd1ddfe09d8b458b0d669f92d34a29c7340bfb41
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/PrimaryController.java
@@ -0,0 +1,12 @@
+package org.josast.ApplicationKissTool;
+
+import java.io.IOException;
+import javafx.fxml.FXML;
+
+public class PrimaryController {
+
+ @FXML
+ private void switchToSecondary() throws IOException {
+ App.setRoot("secondary");
+ }
+}
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/ReceivedData.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/ReceivedData.java
new file mode 100644
index 0000000000000000000000000000000000000000..27a6173fb229d5f294645ad9c4b1dc35d2236fbb
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/ReceivedData.java
@@ -0,0 +1,40 @@
+package org.josast.ApplicationKissTool;
+
+import java.util.Date;
+
+
+public class ReceivedData {
+
+ private Date time;
+ private byte [] data;
+
+ public ReceivedData(Date receivedTime, byte [] receivedData) {
+ super();
+ time = receivedTime;
+ data = receivedData ;
+ }
+
+ public Date getTime() {
+ return time;
+ }
+
+ public void setTime(Date time) {
+ this.time = time;
+ }
+
+
+ public byte[] getData() {
+ return data;
+ }
+
+ public void setData(byte[] data) {
+ this.data = data;
+ }
+
+ @Override
+ public String toString() {
+ return "Frame [time=" + time + "][ Frame=" + new String(data) + "]";
+ }
+
+
+}
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/SecondaryController.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/SecondaryController.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c5ae0069f7024fedc3f6c60d7bd3328b3b42e98
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/SecondaryController.java
@@ -0,0 +1,12 @@
+package org.josast.ApplicationKissTool;
+
+import java.io.IOException;
+import javafx.fxml.FXML;
+
+public class SecondaryController {
+
+ @FXML
+ private void switchToPrimary() throws IOException {
+ App.setRoot("primary");
+ }
+}
\ No newline at end of file
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/SendSIDS.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/SendSIDS.java
new file mode 100644
index 0000000000000000000000000000000000000000..a91c48e49fe2ec77145fec399487f8768ad4be9f
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/SendSIDS.java
@@ -0,0 +1,43 @@
+package org.josast.ApplicationKissTool;
+
+import java.math.BigInteger;
+import java.util.logging.Logger;
+
+import org.josast.SIDS.HttpPostSIDS;
+import org.josast.SIDS.SIDSData;
+import org.josast.SIDS.Station;
+
+/**
+ *
+ * @author christophe
+ *
+ */
+public class SendSIDS {
+
+ private static Logger appLogger = Logger.getLogger("AmsatLogger");
+ SIDSData sids = new SIDSData();
+ HttpPostSIDS client;
+
+ public SendSIDS ( Station station, int norad, String url)
+ {
+ sids.setStation(station);
+ sids.setNoradID(norad);
+ client = new HttpPostSIDS(url);
+
+
+ }
+
+ public int Send(ReceivedData data)
+ {
+ //BasicConfigurator.configure();
+
+ // transforme en hexa String
+ String hexaString = new BigInteger(1, data.getData()).toString(16);
+ sids.setTelemetryData(data.getTime(),hexaString);
+ appLogger.info(sids.toStringBasic());
+ int result = client.SendSIDSBasic(sids);
+ return result;
+
+ }
+
+}
diff --git a/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/TaskSoundmodemTCP.java b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/TaskSoundmodemTCP.java
new file mode 100644
index 0000000000000000000000000000000000000000..672bfe3337851a8d02787a52a0e48a93cbd7066e
--- /dev/null
+++ b/ApplicationKissTool/src/main/java/org/josast/ApplicationKissTool/TaskSoundmodemTCP.java
@@ -0,0 +1,89 @@
+package org.josast.ApplicationKissTool;
+
+import java.util.logging.Logger;
+
+
+import org.josast.ModuleSoundModem.SoundModemClient;
+import org.josast.ModuleSoundModem.SoundModemConfiguration;
+
+import javafx.concurrent.Task;
+
+public class TaskSoundmodemTCP extends Task {
+
+ private Logger log = Logger.getLogger("AmsatLogger");
+
+ private volatile boolean running = true;
+
+ SoundModemConfiguration smConfiguration = null;
+ SoundModemClient smc = null;
+ ModelReceivedData receivedFrame = null;
+
+ /**
+ * @param smConfiguration fichier de configuration
+ * @param receivedFrame Frame Data model
+ */
+ public TaskSoundmodemTCP(SoundModemConfiguration smConfiguration, ModelReceivedData receivedFrame) {
+ this.smConfiguration = smConfiguration;
+ smc = new SoundModemClient(smConfiguration);
+ if (smc.isOpen() == false) {
+ this.failed();
+ }
+ this.receivedFrame = receivedFrame;
+
+ }
+
+ public TaskSoundmodemTCP(ModelReceivedData receivedFrame) {
+
+ smConfiguration = new SoundModemConfiguration("default");
+ smc = new SoundModemClient(smConfiguration);
+ if (smc.isOpen() == false) {
+ this.failed();
+ }
+ this.receivedFrame = receivedFrame;
+ }
+
+ /**
+ * while the connection is open, the modem is listening. When a frame is received,
+ * this frame is added to the model
+ */
+ @Override
+ protected String call() {
+ try {
+
+ while (running == true) {
+ if(smc.isOpen())
+ {
+ byte[] temp = smc.receivedRawData();
+ receivedFrame.addFrame(temp);
+ this.updateValue(receivedFrame.toString());
+ } else
+ {
+ this.running=false;
+ log.severe("Erreur SoundModem closed");
+ }
+ }
+ } catch (Exception e) {
+ log.severe("Erreur SoundModem not available");
+ log.severe(e.toString());
+ this.failed();
+
+ }
+ return receivedFrame.toString();
+ }
+
+
+
+ public void arreter() {
+
+ this.running = false;
+
+ }
+
+ public void redemarrer()
+ {
+
+ this.running = true;
+
+ }
+
+}
diff --git a/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/KissTool.fxml b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/KissTool.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..fdaa97ef651ad9144f4d495f0e6a2766a5052ea5
--- /dev/null
+++ b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/KissTool.fxml
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/boot.css b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/boot.css
new file mode 100644
index 0000000000000000000000000000000000000000..25a15c646a78bfa1ab291098d973fa45137683ae
--- /dev/null
+++ b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/boot.css
@@ -0,0 +1,930 @@
+.root {
+ -fx-body-color : #F5F5F5;
+ -fx-outer-border : #cecece;
+}
+.button:focused, .toggle-button:focused,
+.split-menu-button:focused, .menu-button:focused,
+.number-button:focused,
+.combo-box:focused .text-field, .choice-box:focused, .color-picker:focused, .date-picker:focused .text-field
+{
+ -fx-effect: dropshadow(gaussian, #b4d1f3, 3, 3, 0, 0);
+}
+.combo-box:focused * {
+ -fx-effect: none;
+}
+
+.button,.menu-button,.toggle-button,.split-menu-button {
+ -fx-font-size: 14;
+ -fx-background-radius: 4;
+ -fx-border-radius: 4;
+ -fx-pref-height: 30;
+ -fx-min-width: 30;
+}
+.button,.menu-button,.split-menu-button,.toggle-button,.number-button {
+ -fx-background-insets: 0, 0, -1, 0;
+}
+
+.split-menu-button > .label {
+ -fx-border-radius: 4 0 0 4;
+ -fx-background-radius: 3 0 0 3;
+}
+
+.split-menu-button > .arrow-button {
+ -fx-border-radius: 0 4 4 0;
+ -fx-background-radius: 0 3 3 0;
+}
+
+.lg {
+ -fx-min-height: 46;
+ -fx-max-height: 46;
+ -fx-font-size: 18;
+}
+
+.sm {
+ -fx-min-height: 30;
+ -fx-max-height: 30;
+}
+
+.xs {
+ -fx-min-height: 22;
+ -fx-max-height: 22;
+ -fx-font-size: 10;
+}
+
+.primary .arrow,
+.success .arrow,
+.info .arrow,
+.warning .arrow,
+.danger .arrow {
+ -fx-background-color: transparent, white;
+}
+
+.primary > .label,
+.success > .label,
+.info > .label,
+.warning > .label,
+.danger > .label {
+ -fx-text-fill: white;
+}
+
+.action-btn {
+ -fx-min-width: 80;
+}
+
+/*positions*/
+/*first*/
+.button.first, .menu-button.first, .toggle-button.first, .text-field.first, .text-area.first {
+ -fx-border-radius: 4 0 0 4;
+ -fx-background-radius: 4 0 0 4;
+}
+
+.split-menu-button.first > .arrow-button, .split-menu-button.middle > .arrow-button {
+ -fx-border-radius: 0;
+ -fx-background-radius: 0;
+}
+
+VBox > .button.first,
+VBox > .menu-button.first,
+VBox > .toggle-button.first,
+VBox > .split-menu-button.first,
+VBox > .text-field.first,
+VBox > .text-area.first {
+ -fx-border-radius: 4 4 0 0;
+ -fx-background-radius: 4 4 0 0;
+}
+
+VBox > .split-menu-button.first > .label {
+ -fx-border-radius: 4 0 0 0;
+ -fx-background-radius: 3 0 0 0;
+}
+VBox > .split-menu-button.first > .arrow-button {
+ -fx-border-radius: 0 4 0 0;
+ -fx-background-radius: 0 3 0 0;
+}
+/*middle*/
+.middle {
+ -fx-border-radius: 0;
+ -fx-background-radius: 0;
+}
+
+/*last*/
+.split-menu-button.middle > .label, .split-menu-button.last > .label {
+ -fx-border-radius: 0;
+ -fx-background-radius: 0;
+}
+
+.split-menu-button.last {
+ -fx-border-radius: 0 4 4 0;
+ -fx-background-radius: 0 4 4 0;
+}
+
+.button.middle, .text-field.middle, .text-area.middle, .split-menu-button.middle, .toggle-button.middle {
+ -fx-border-radius: 0;
+ -fx-background-radius: 0;
+}
+
+.button.last, .text-field.last, .text-area.last, .split-menu-button.last, .toggle-button.last, .menu-button.last {
+ -fx-border-radius: 0 4 4 0;
+ -fx-background-radius: 0 4 4 0;
+}
+VBox > .button.last,
+VBox > .menu-button.last,
+VBox > .toggle-button.last,
+VBox > .split-menu-button.last,
+VBox > .text-field.last,
+VBox > .text-area.last {
+ -fx-border-radius: 0 0 4 4;
+ -fx-background-radius: 0 0 4 4;
+}
+
+VBox > .split-menu-button.last > .label {
+ -fx-border-radius: 0 0 0 4;
+ -fx-background-radius: 0 0 0 3;
+}
+VBox > .split-menu-button.last > .arrow-button {
+ -fx-border-radius: 0 0 4 0;
+ -fx-background-radius: 0 0 3 0;
+}
+
+/*button styles*/
+
+/*default button settings*/
+
+/*bgcolor setting*/
+.color-picker,.date-picker > .arrow-button,
+.number-button,.left-arrow-button,.right-arrow-button,
+.button,.split-menu-button,.toggle-button,.menu-button,
+.font-menu-button, .split-menu-button > .label, .split-menu-button > .arrow-button {
+ -fx-background-color: white;
+}
+
+.color-picker,.date-picker > .arrow-button,
+.button,.menu-button,.toggle-button,.number-button,.left-arrow-button,.right-arrow-button,
+.font-menu-button,
+.split-menu-button > .label,.split-menu-button > .arrow-button {
+ -fx-border-color: #cccccc;
+ -fx-text-fill: #333333;
+}
+ /*just for the special split menu button*/
+.split-menu-button > .label {
+ -fx-border-width: 1 0 1 1;
+}
+ /*for date picker arrow button*/
+.date-picker > .arrow-button {
+ -fx-border-radius: 0 4 4 0;
+}
+.combo-box > .arrow-button, .choice-box > .arrow-button {
+ -fx-border-width: 0;
+}
+ /*hover state*/
+.color-picker:hover,
+.date-picker:hover > .arrow-button,
+.combo-box:hover,.choice-box:hover,
+.number-button:hover,.left-arrow-button:hover,.right-arrow-button:hover,
+.button:hover,.menu-button:hover,.toggle-button:hover,
+.font-menu-button:hover,
+.split-menu-button > .label:hover, .split-menu-button > .arrow-button:hover {
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #acacac;
+}
+ /*pressed selected*/
+.color-picker:pressed,.color-picker:selected,
+.number-button:pressed,.number-button:selected,
+.date-picker:pressed > .arrow-button,
+.combo-box:pressed > .arrow-button,.combo-box:selected > .arrow-button,
+.choice-box:pressed > .arrow-button,.choice-box:selected > .arrow-button,
+.font-menu-button:pressed,.font-menu-button:selected,
+.left-arrow-button:pressed,.left-arrow-button:selected,
+.right-arrow-button:pressed,.right-arrow-button:selected,
+.button:pressed, .button:selected,.menu-button:pressed,.menu-button:selected
+,.toggle-button:pressed,.toggle-button:selected,
+.split-menu-button:pressed > .label, .split-menu-button > .arrow-button:pressed {
+ -fx-background-color: #e6e6e6;
+ -fx-border-color: #acacac;
+ -fx-effect: innershadow(gaussian, #adadad, 10, 0, 0, 3);
+}
+
+ /*primary*/
+
+.button.primary,.split-menu-button.primary,.toggle-button.primary,.menu-button.primary,
+.split-menu-button.primary > .label, .split-menu-button.primary > .arrow-button {
+ -fx-background-color: #337ab7;
+}
+
+.button.primary,.menu-button.primary,.toggle-button.primary,
+.split-menu-button.primary > .label,.split-menu-button.primary > .arrow-button {
+ -fx-border-color: #2e6da4;
+ -fx-text-fill: white;
+}
+/*hover state*/
+.button.primary:hover,.menu-button.primary:hover,.toggle-button.primary:hover,
+.split-menu-button.primary > .label:hover, .split-menu-button.primary > .arrow-button:hover {
+ -fx-border-color: #204d74;
+ -fx-background-color: #286090;
+}
+/*pressed selected*/
+.button.primary:pressed, .button.primary:selected,
+.menu-button.primary:pressed,.menu-button.primary:selected
+,.toggle-button.primary:pressed,.toggle-button.primary:selected,
+.split-menu-button.primary:pressed > .label, .split-menu-button.primary > .arrow-button:pressed {
+ -fx-background-color: #286090;
+ -fx-border-color: #204d74;
+ -fx-effect: innershadow(gaussian, #204d74, 10, 0, 0, 3);
+}
+
+/*success*/
+
+.button.success,.split-menu-button.success,.toggle-button.success,.menu-button.success,
+.split-menu-button.success > .label, .split-menu-button.success > .arrow-button {
+ -fx-background-color: #5cb85c;
+}
+
+.button.success,.menu-button.success,.toggle-button.success,
+.split-menu-button.success > .label,.split-menu-button.success > .arrow-button {
+ -fx-border-color: #4cae4c;
+ -fx-text-fill: white;
+}
+/*hover state*/
+.button.success:hover,.menu-button.success:hover,.toggle-button.success:hover,
+.split-menu-button.success > .label:hover, .split-menu-button.success > .arrow-button:hover {
+ -fx-border-color: #398439;
+ -fx-background-color: #449d44;
+}
+/*pressed selected*/
+.button.success:pressed, .button.success:selected,
+.menu-button.success:pressed,.menu-button.success:selected
+,.toggle-button.success:pressed,.toggle-button.success:selected,
+.split-menu-button.success:pressed > .label, .split-menu-button.success > .arrow-button:pressed {
+ -fx-background-color: #449d44;
+ -fx-border-color: #398439;
+ -fx-effect: innershadow(gaussian, #398439, 10, 0, 0, 3);
+}
+
+/*info*/
+
+.button.info,.split-menu-button.info,.toggle-button.info,.menu-button.info,
+.split-menu-button.info > .label, .split-menu-button.info > .arrow-button {
+ -fx-background-color: #5bc0de;
+}
+
+.button.info,.menu-button.info,.toggle-button.info,
+.split-menu-button.info > .label,.split-menu-button.info > .arrow-button {
+ -fx-border-color: #46b8da;
+ -fx-text-fill: white;
+}
+/*hover state*/
+.button.info:hover,.menu-button.info:hover,.toggle-button.info:hover,
+.split-menu-button.info > .label:hover, .split-menu-button.info > .arrow-button:hover {
+ -fx-border-color: #269abc;
+ -fx-background-color: #31b0d5;
+}
+/*pressed selected*/
+.button.info:pressed, .button.info:selected,
+.menu-button.info:pressed,.menu-button.info:selected
+,.toggle-button.info:pressed,.toggle-button.info:selected,
+.split-menu-button.info:pressed > .label, .split-menu-button.info > .arrow-button:pressed {
+ -fx-background-color: #31b0d5;
+ -fx-border-color: #269abc;
+ -fx-effect: innershadow(gaussian, #269abc, 10, 0, 0, 3);
+}
+
+/*warning*/
+
+.button.warning,.split-menu-button.warning,.toggle-button.warning,.menu-button.warning,
+.split-menu-button.warning > .label, .split-menu-button.warning > .arrow-button {
+ -fx-background-color: #f0ad4e;
+}
+
+.button.warning,.menu-button.warning,.toggle-button.warning,
+.split-menu-button.warning > .label,.split-menu-button.warning > .arrow-button {
+ -fx-border-color: #eea236;
+ -fx-text-fill: white;
+}
+/*hover state*/
+.button.warning:hover,.menu-button.warning:hover,.toggle-button.warning:hover,
+.split-menu-button.warning > .label:hover, .split-menu-button.warning > .arrow-button:hover {
+ -fx-border-color: #d58512;
+ -fx-background-color: #ec971f;
+}
+/*pressed selected*/
+.button.warning:pressed, .button.warning:selected,
+.menu-button.warning:pressed,.menu-button.warning:selected
+,.toggle-button.warning:pressed,.toggle-button.warning:selected,
+.split-menu-button.warning:pressed > .label, .split-menu-button.warning > .arrow-button:pressed {
+ -fx-background-color: #ec971f;
+ -fx-border-color: #d58512;
+ -fx-effect: innershadow(gaussian, #d58512, 10, 0, 0, 3);
+}
+
+/*danger*/
+
+.button.danger,.split-menu-button.danger,.toggle-button.danger,.menu-button.danger,
+.split-menu-button.danger > .label, .split-menu-button.danger > .arrow-button {
+ -fx-background-color: #d9534f;
+}
+
+.button.danger,.menu-button.danger,.toggle-button.danger,
+.split-menu-button.danger > .label,.split-menu-button.danger > .arrow-button {
+ -fx-border-color: #d43f3a;
+ -fx-text-fill: white;
+}
+/*hover state*/
+.button.danger:hover,.menu-button.danger:hover,.toggle-button.danger:hover,
+.split-menu-button.danger > .label:hover, .split-menu-button.danger > .arrow-button:hover {
+ -fx-border-color: #ac2925;
+ -fx-background-color: #c9302c;
+}
+/*pressed selected*/
+.button.danger:pressed, .button.danger:selected,
+.menu-button.danger:pressed,.menu-button.danger:selected
+,.toggle-button.danger:pressed,.toggle-button.danger:selected,
+.split-menu-button.danger:pressed > .label, .split-menu-button.danger > .arrow-button:pressed {
+ -fx-border-color: #ac2925;
+ -fx-background-color: #c9302c;
+ -fx-effect: innershadow(gaussian, #ac2925, 10, 0, 0, 3);
+}
+
+.menu-item {
+ -fx-min-width: 200;
+}
+
+.menu-item:focused {
+ -fx-background-color: #f5f5f5;
+}
+
+.menu-item:focused > * {
+ -fx-text-fill: #262626;
+}
+.menu-item:focused .arrow {
+ -fx-background-color: #333333;
+}
+
+.check-menu-item:checked:hover > .left-container > .check,
+.check-menu-item:checked:focused > .left-container > .check,
+.radio-menu-item:checked:hover > .left-container > .radio,
+.radio-menu-item:checked:focused > .left-container > .radio {
+ -fx-background-color: #333333;
+}
+
+.context-menu {
+ -fx-border-radius: 4;
+ -fx-background-radius: 4;
+ -fx-border-color: #bebec0;
+}
+
+.context-menu > * {
+ -fx-padding: 5 0 5 0;
+}
+
+.separator {
+ -fx-padding: 5 0 5 0;
+}
+
+.text-field {
+ -fx-pref-height: 30;
+}
+
+.combo-box, .choice-box {
+ -fx-background-insets: 0;
+ -fx-border-color: #cecece;
+ -fx-padding: -1;
+ -fx-border-width: 1;
+}
+.combo-box, .choice-box, .color-picker, .date-picker {
+ -fx-border-radius: 4;
+ -fx-background-radius: 4;
+ -fx-pref-height: 30;
+}
+
+.combo-box:editable > .arrow-button {
+ -fx-background-color: white;
+}
+
+.combo-box:editable > .arrow-button:hover {
+ -fx-background-color: #e6e6e6;
+}
+
+.combo-box:editable > .arrow-button:pressed {
+ -fx-effect: innershadow(gaussian, #adadad, 10, 0, 0, 3);
+}
+
+.combo-box > .text-input, .date-picker > .text-input {
+ -fx-background-radius: 4 0 0 4;
+ -fx-border-width: 0;
+}
+
+.text-field, .text-area {
+ -fx-border-color: #cccccc;
+ -fx-background-color: white;
+ -fx-border-radius: 4;
+ -fx-background-radius: 4;
+ -fx-effect: innershadow(gaussian, transparent, 0, 0, 0, 0);
+}
+
+.text-field:focused, .text-area:focused {
+ -fx-border-color: #66afe9;
+ -fx-effect: dropshadow(gaussian, #66afe9, 10, 0, 0, 0);
+}
+
+.text-area .scroll-pane, .text-area .scroll-pane .content {
+ -fx-background-color: white;
+ -fx-background-radius: 4;
+}
+
+.tab-pane .tab-header-background {
+ -fx-background-color: #f4f4f4;
+}
+.tab-pane.plain .tab-header-background {
+ -fx-background-color: transparent;
+}
+
+.tab-pane .tab-header-area .tab {
+ -fx-border-radius: 4 4 0 0;
+ -fx-background-radius: 5 5 0 0;
+ -fx-background-color: transparent;
+ -fx-border-color: transparent;
+ -fx-padding: 3 10 5 10;
+ -fx-background-insets: 0;
+}
+
+.tab-pane .tab-header-area .tab .tab-label {
+ -fx-text-fill: #337ab7;
+}
+
+.tab-pane .tab-header-area .tab:hover {
+ -fx-background-color: #eeeeee;
+}
+.tab-pane .tab-header-area .tab:disabled:hover {
+ -fx-background-color: transparent;
+}
+
+.tab-pane .tab-header-area .tab:selected {
+ -fx-focus-color: transparent;
+ -fx-border-color: #dddddd #dddddd white #dddddd;
+ -fx-background-color: white;
+}
+.tab-pane .tab-header-area .tab:selected .tab-label {
+ -fx-text-fill: #333333;
+}
+.tab-pane > .tab-content-area {
+ -fx-background-color: white;
+}
+
+.tab-pane .tab-header-area .tab .tab-label {
+ -fx-focus-color: transparent;
+}
+
+.tab-pane:focused > .tab-header-area > .headers-region > .tab:selected .focus-indicator {
+ -fx-border-color: transparent;
+}
+
+.tab-pane > .tab-header-area > .headers-region > .tab > .tab-container > .tab-close-button {
+ -fx-background-color: #337ab7;
+}
+.tab-pane > .tab-header-area > .headers-region > .tab:selected > .tab-container > .tab-close-button {
+ -fx-background-color: #333333;
+}
+.tab-pane > .tab-header-area > .headers-region > .tab > .tab-container > .tab-close-button:hover {
+ -fx-background-color: red;
+ -fx-cursor: hand;
+}
+
+.scroll-bar {
+ -fx-background-color: #fafafa;
+ -fx-background-radius: 0;
+ -fx-block-increment: 50;
+}
+
+.corner {
+ -fx-background-color: transparent;
+}
+
+.scroll-bar .decrement-button, .scroll-bar .decrement-arrow {
+ visibility: hidden;
+ -fx-pref-height: 1;
+ -fx-pref-width: 1;
+}
+
+.scroll-bar .increment-button, .scroll-bar .increment-arrow {
+ visibility: hidden;
+ -fx-pref-height: 1;
+ -fx-pref-width: 1;
+}
+
+.scroll-bar:vertical {
+ -fx-pref-width: 10;
+}
+
+.scroll-bar:horizontal {
+ -fx-pref-height: 10;
+}
+
+.scroll-bar:horizontal .track,
+.scroll-bar:vertical .track {
+ -fx-background-color: transparent;
+ -fx-border-color: transparent;
+ -fx-background-radius: 5;
+}
+
+.scroll-bar:vertical .track-background,
+.scroll-bar:horizontal .track-background {
+ -fx-background-color: transparent;
+ -fx-background-insets: 0;
+ -fx-background-radius: 5;
+}
+
+.scroll-bar:horizontal .thumb {
+ -fx-background-color: #c9c9c9;
+ -fx-background-insets: 2 0 2 0;
+ -fx-background-radius: 5;
+}
+
+.scroll-bar:vertical .thumb {
+ -fx-background-color: #c9c9c9;
+ -fx-background-insets: 0 2 0 2;
+ -fx-background-radius: 5;
+}
+
+.scroll-bar:horizontal .thumb:hover,
+.scroll-bar:vertical .thumb:hover {
+ -fx-background-color: #b5b5b5;
+}
+
+.scroll-bar:horizontal .thumb:pressed,
+.scroll-bar:vertical .thumb:pressed {
+ -fx-background-color: #a0a0a0;
+}
+
+.scroll-bar:vertical .increment-button, .scroll-bar:vertical .decrement-button {
+ -fx-background-color: transparent;
+ -fx-background-radius: 5;
+ -fx-padding: 5;
+}
+
+.scroll-bar:horizontal .increment-button, .scroll-bar:horizontal .decrement-button {
+ -fx-background-color: transparent;
+ -fx-background-radius: 5;
+ -fx-padding: 5;
+}
+
+.scroll-bar:vertical:focused,
+.scroll-bar:horizontal:focused {
+ -fx-background-color: transparent, rgb(96, 96, 96), rgb(96, 96, 96);
+}
+
+.menu-bar {
+ -fx-background-color: white;
+}
+.menu-bar > .container > .menu-button {
+ -fx-background-radius: 0;
+ -fx-background-insets: 0;
+ -fx-border-width: 0;
+ -fx-border-radius: 0;
+}
+.menu-bar > .container > .menu-button:hover,
+.menu-bar > .container > .menu-button:showing {
+ -fx-background-color: #56c0e0;
+}
+
+.color-palette {
+ -fx-background-color: white;
+}
+
+.pagination > .pagination-control > .control-box {
+ -fx-spacing: -1;
+}
+.pagination > .pagination-control > .control-box > .left-arrow-button {
+ -fx-border-radius: 3 0 0 3;
+ -fx-border-insets: 0 0 0 7;
+ -fx-background-insets: 0 0 0 7, 0 0 0 5, 1 1 1 6, 2 2 2 7;
+}
+.pagination > .pagination-control > .control-box > .right-arrow-button {
+ -fx-border-radius: 0 3 3 0;
+ -fx-border-insets: 0 7 0 0;
+ -fx-background-insets: 0 7 -1 0, 0 5 0 0, 1 6 1 1, 2 7 2 2;
+}
+.pagination > .pagination-control > .control-box > .number-button {
+ -fx-background-radius: 0;
+ -fx-border-radius: 0;
+}
+
+.progress-bar > .track {
+ -fx-pref-height: 10;
+ -fx-background-radius: 3;
+ -fx-effect: innershadow(gaussian, #e4e4e4, 4, 0, 0, 1);
+ -fx-background-color: #f5f5f5;
+}
+
+.progress-bar > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #337ab7;
+}
+
+.progress-bar.success > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #5cb85c;
+}
+
+.progress-bar.info > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #5bc0de;
+}
+
+.progress-bar.warning > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #f0ad4e
+}
+
+.progress-bar.danger > .bar {
+ -fx-background-insets: 0;
+ -fx-background-color: #d9534f;
+}
+
+.tooltip {
+ -fx-background: white;
+ -fx-text-fill: #333333;
+ -fx-background-color: white;
+ -fx-background-radius: 4px;
+ -fx-border-radius: 4px;
+ -fx-border-color: #C0C0C0;
+ -fx-background-insets: 0;
+ -fx-padding: 0.667em 0.75em 0.667em 0.75em; /* 10px */
+ -fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.5), 10, 0.0, 0, 3);
+ -fx-font-size: 0.85em;
+}
+
+.tooltip.success {
+ -fx-background: #dff0d8;
+ -fx-background-color: #dff0d8;
+ -fx-text-fill: #99bb96;
+ -fx-border-color: #d6e9c6;
+}
+
+.tooltip.info {
+ -fx-background: #d8ecf6;
+ -fx-background-color: #d8ecf6;
+ -fx-text-fill: #31708f;
+ -fx-border-color: #bce8f1;
+}
+
+.tooltip.warning {
+ -fx-background: #fcf8e3;
+ -fx-background-color: #fcf8e3;
+ -fx-text-fill: #8a6e3c;
+ -fx-border-color: #faebcc;
+}
+
+.tooltip.danger {
+ -fx-background: #f2dede;
+ -fx-background-color: #f2dede;
+ -fx-text-fill: #a94442;
+ -fx-border-color: #ebccd1;
+}
+
+.titled-pane > .title {
+ -fx-background-color: #f5f5f5;
+ -fx-border-color: #dddddd;
+ /*-fx-background-insets: 5, 1, 5;*/
+ -fx-background-radius: 3 3 0 0, 2 2 0 0, 1 1 0 0;
+ -fx-border-radius: 3 3 0 0, 2 2 0 0, 1 1 0 0;
+ -fx-padding: 11
+}
+
+.titled-pane > .content {
+ -fx-background-color: white;
+ -fx-background-radius: 0 0 4 4;
+ -fx-border-radius: 0 0 4 4;
+ -fx-border-color: #dddddd;
+ /*-fx-padding: -11;*/
+}
+
+.titled-pane.primary {
+ -fx-text-fill: white;
+}
+
+.titled-pane.primary > .title {
+ -fx-background-color: #337ab7;
+ -fx-border-color: #337ab7;
+}
+
+.titled-pane.primary > .content {
+ -fx-border-color: #337ab7;
+}
+
+.titled-pane.success .arrow,
+.titled-pane.info .arrow,
+.titled-pane.warning .arrow,
+.titled-pane.danger .arrow {
+ -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
+}
+
+.titled-pane.success {
+ -fx-text-fill: #3c763d;
+}
+
+.titled-pane.success > .title {
+ -fx-background-color: #dff0d8;
+ -fx-border-color: #d6e9c6;
+}
+
+.titled-pane.success > .content {
+ -fx-border-color: #d6e9c6;
+}
+
+.titled-pane.info {
+ -fx-text-fill: #31708f;
+}
+
+.titled-pane.info > .title {
+ -fx-background-color: #d9edf7;
+ -fx-border-color: #bce8f1;
+}
+
+.titled-pane.info > .content {
+ -fx-border-color: #bce8f1;
+}
+
+.titled-pane.warning {
+ -fx-text-fill: #8a6d3b;
+}
+
+.titled-pane.warning > .title {
+ -fx-background-color: #fcf8e3;
+ -fx-border-color: #faebcc;
+}
+
+.titled-pane.warning > .content {
+ -fx-border-color: #faebcc;
+}
+
+.titled-pane.danger {
+ -fx-text-fill: #a94442;
+}
+
+.titled-pane.danger > .title {
+ -fx-background-color: #f2dede;
+ -fx-border-color: #eacbd0;
+}
+
+.titled-pane.danger > .content {
+ -fx-border-color: #eacbd0;
+}
+
+.accordion > .titled-pane > .title,
+.accordion > .titled-pane > .content {
+ -fx-background-radius: 0;
+ -fx-border-radius: 0;
+}
+
+.tool-bar:vertical { /* left */
+ -fx-border-color: transparent #dddddd transparent transparent;
+}
+
+.tool-bar { /* top */
+ -fx-background-color: white;
+ -fx-border-color: transparent transparent #dddddd transparent;
+}
+
+.tool-bar:vertical {
+ -fx-background-insets: 0, 0 1 0 0;
+}
+
+/*table view columns*/
+.filler,.column-header,.show-hide-columns-button {
+ -fx-background-color: #dddddd, white, white;
+}
+.show-hide-columns-button {
+ -fx-border-width: 0;
+ -fx-background-insets: 0 0 1 1;
+}
+.column-header:hover,.show-hide-columns-button:hover {
+ -fx-background-color: #dddddd, white, #f8f8f8;
+}
+.column-header-background > .filler {
+ -fx-border-color: transparent #dddddd transparent transparent;
+ -fx-border-insets: 0 1 0 0;
+}
+.column-drag-header {
+ -fx-background-color: #2fb254;
+}
+
+/*split pane*/
+.split-pane > .split-pane-divider {
+ -fx-background-color: white;
+ -fx-border-color: #eeeeee;
+ -fx-pref-width: 8;
+}
+.split-pane:horizontal > .split-pane-divider {
+ -fx-background-insets: 0, 0 1 0 1;
+ -fx-border-width: 0 1 0 1;
+}
+/* vertical the two nodes are placed on top of each other. */
+.split-pane:vertical > .split-pane-divider {
+ -fx-background-insets: 0, 1 0 1 0;
+ -fx-border-width: 1 0 1 0;
+}
+.split-pane > .split-pane-divider:hover {
+ -fx-background-color: #E0E0E0;
+}
+
+/*******************************************************************************
+ * *
+ * CheckBox *
+ * *
+ ******************************************************************************/
+.check-box > .box {
+ -fx-background-radius: 3;
+ /*-fx-padding: 0.166667em 0.166667em 0.25em 0.25em; !* 2 2 3 3 *!*/
+ -fx-padding:0;
+ -fx-border-color: #56c0e0;
+ -fx-border-radius: 3;
+ -fx-background-color: white;
+}
+.check-box > .box > .mark {
+ -fx-background-color: null;
+ -fx-padding: 0.416667em 0.416667em 0.5em 0.5em; /* 5 5 6 6 */
+ -fx-shape: "M927.936 272.992l-68.288-68.288c-12.608-12.576-32.96-12.576-45.536 0l-409.44 409.44-194.752-196.16c-12.576-12.576-32.928-12.576-45.536 0l-68.288 68.288c-12.576 12.608-12.576 32.96 0 45.536l285.568 287.488c12.576 12.576 32.96 12.576 45.536 0l500.736-500.768c12.576-12.544 12.576-32.96 0-45.536z";
+ -fx-background-insets: -3 -3 1 0;
+}
+.check-box {
+ -fx-label-padding: 0.2em 0.0em 0.3em 0.416667em; /* 0 0 0 5 */
+ -fx-text-fill: -fx-text-background-color;
+ -fx-padding: 0 0 2 0;
+}
+.check-box:indeterminate > .box {
+ -fx-padding: 0;
+}
+.check-box:selected > .box > .mark {
+ -fx-background-color: linear-gradient(to bottom, #56c0e0, #40b8dc);
+}
+
+/*******************************************************************************
+ * *
+ * RadioButton *
+ * *
+ ******************************************************************************/
+
+.radio-button {
+ -fx-label-padding: 0.0em 0.0em 0.1em 0.416667em; /* 0 0 0 5 */
+ -fx-text-fill: -fx-text-background-color;
+ -fx-padding: 0 0 .5 0;
+}
+.radio-button > .radio,
+.radio-button:focused > .radio {
+ -fx-border-color: #56c0e0;
+ -fx-border-radius: 1em;
+ -fx-background-radius: 1.0em; /* large value to make sure this remains circular */
+ -fx-padding: 1 2 3 2;
+ -fx-background-color: white;
+}
+.radio-button > .radio > .dot {
+ -fx-background-color: transparent;
+ -fx-background-radius: 1.0em; /* large value to make sure this remains circular */
+ -fx-padding: 0.333333em; /* 4 -- radius of the inner black dot when selected */
+ -fx-background-insets: 3 2 1 2;
+}
+.radio-button:selected > .radio,.radio-button:hover > .radio {
+ -fx-fill-color: #56c0e0;
+}
+.radio-button:pressed > .radio {
+ -fx-background-color: #50c0e2;
+}
+.radio-button:selected > .radio > .dot {
+ -fx-background-color: #56c0e0;
+}
+
+/*common things*/
+.check-box:hover > .box,
+.check-box:selected > .box,
+.radio-button:hover > .radio,
+.radio-button:selected > .radio {
+ -fx-background-color: linear-gradient(to bottom, white, #efefef);
+}
+
+.check-box:pressed > .box,
+.radio-button:pressed > .radio {
+ -fx-background-color: #50c0e2;
+}
+
+/*******************************************************************************
+ * *
+ * Slider *
+ * *
+ ******************************************************************************/
+
+.slider .thumb {
+ -fx-background-color: #dad9da, white, #3fbadf;
+ -fx-background-insets: 0, 1, 5;
+ -fx-effect: dropshadow(two-pass-box , rgba(0, 0, 0, 0.2), 5, 0.0 , 0, 0);
+}
+.slider .thumb:hover {
+ -fx-effect: dropshadow(two-pass-box , rgba(0, 0, 0, 0.4), 5, 0.0 , 0, 0);
+}
+.slider .track {
+ -fx-background-color: #dad9da, white;
+ -fx-background-insets: -1, 0, 1;
+ -fx-pref-height: 5;
+}
+.slider:vertical .track {
+ -fx-pref-width: 5;
+}
\ No newline at end of file
diff --git a/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/logoAmsat.png b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/logoAmsat.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d040fba4b8e99ac74424b8e65bf4a9b05995fde
Binary files /dev/null and b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/logoAmsat.png differ
diff --git a/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/primary.fxml b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/primary.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..a538df20b27548afb49c17951b3cfe1fdfe101c3
--- /dev/null
+++ b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/primary.fxml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/secondary.fxml b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/secondary.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..6b00348ed4a1f37fd7fda1710b8b513e3a53c0c3
--- /dev/null
+++ b/ApplicationKissTool/src/main/resources/org/josast/ApplicationKissTool/secondary.fxml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ModuleCubesatSim/pom.xml b/ModuleCubesatSim/pom.xml
index 12e638b975888c204d956fa2c1ce2b5da8c7c8e2..7b2778ace7a18db9f335b86dba2c7d3f25ab6127 100644
--- a/ModuleCubesatSim/pom.xml
+++ b/ModuleCubesatSim/pom.xml
@@ -13,7 +13,7 @@
4.0.0
ModuleCubesatSim
- 1.2
+
jar
@@ -23,6 +23,8 @@
1.8
${env.JAVA_HOME}
0.1.5
+ ${josast.version}
+ ${josast.version}
@@ -50,13 +52,13 @@
org.josast
ModuleSoundModem
- 0.0.2-SNAPSHOT
+ ${ModuleSoundModem.version}
org.josast
ModuleConfig
- 0.2
+ ${ModuleConfig.version}
commons-cli
diff --git a/ModuleSatelliteDatabase/pom.xml b/ModuleSatelliteDatabase/pom.xml
index 87db074e4d09192fdd219b1b2f892769c9ec8ac1..3c69309771deb53704dd97f0bed5823823c51eaa 100644
--- a/ModuleSatelliteDatabase/pom.xml
+++ b/ModuleSatelliteDatabase/pom.xml
@@ -54,7 +54,11 @@
commons-cli
1.4
-
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.9.8
+
javax.xml.bind
diff --git a/ModuleSatelliteDatabase/src/main/java/org/josast/ModuleSatelliteDatabase/AmsatListFile.java b/ModuleSatelliteDatabase/src/main/java/org/josast/ModuleSatelliteDatabase/AmsatListFile.java
index 6866ae7c3f774f59cb7a5869e21616937d4382da..43673b3d5571dfebc89223a2154e4dff0ab2ff11 100644
--- a/ModuleSatelliteDatabase/src/main/java/org/josast/ModuleSatelliteDatabase/AmsatListFile.java
+++ b/ModuleSatelliteDatabase/src/main/java/org/josast/ModuleSatelliteDatabase/AmsatListFile.java
@@ -3,6 +3,7 @@ package org.josast.ModuleSatelliteDatabase;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.util.Hashtable;
import java.util.List;
import java.util.ListIterator;
import javax.xml.bind.JAXBContext;
@@ -16,8 +17,12 @@ import org.josast.AmsatList.generated.Satellites;
public class AmsatListFile {
- FlatSatList amsatListFlat = new FlatSatList();
- AmsatList amsatList = null;
+ private FlatSatList amsatListFlat = new FlatSatList();
+ private AmsatList amsatList = null;
+ private Hashtable amsatListByName = new Hashtable();
+ private Hashtable amsatListNasaId = new Hashtable();
+
+
/**
* @param filein
@@ -71,6 +76,8 @@ public class AmsatListFile {
while (it.hasNext()) {
Satellites sat = it.next();
AmsatListFlat amSatFlat = new AmsatListFlat(sat);
+ amsatListByName.put(sat.getName(), sat);
+ amsatListNasaId.put(sat.getNasaID(), sat);
amsatListFlat.put(amSatFlat.getSatelliteNoradId(),amSatFlat);
}
@@ -134,7 +141,26 @@ public class AmsatListFile {
public void setAmsatList(AmsatList amsatList) {
this.amsatList = amsatList;
}
-
+
+
+
+
+
+ /**
+ * @return the amsatListByName
+ */
+ public Hashtable getAmsatListByName() {
+ return amsatListByName;
+ }
+
+ /**
+ * @return the amsatListNasaId
+ */
+ public Hashtable getAmsatListNasaId() {
+ return amsatListNasaId;
+ }
+
+
}
diff --git a/ToolGenaratePOJOFromKSY/README.md b/ToolGenaratePOJOFromKSY/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..505d452c0366192746800cd4981e542135ff047e
--- /dev/null
+++ b/ToolGenaratePOJOFromKSY/README.md
@@ -0,0 +1,44 @@
+
+# KSY to java POJO generator
+
+ **GeneratePOJOfromKSY** is a tool to accelerate the display of telemetry data when the data description is written for Kaitai tool.
+
+## Maturity level
+
+ **Maturity level :** experimental
+
+Tool configuration is done by code update ( Parameters.java and GeneratePOJOfromKSYCli.java )
+
+## Context
+
+This tool has been written for testing purpose and facilitate display of data.
+
+Description off telemetry structure are perform with a descriptive language define by [kaitai project](https://kaitai.io/).
+Based on this file, kaitai tool generate code in different language in order to extract data.
+
+Base on same KSY file, **GeneratePOJOfromKSY** tools generate a set of java classes in order to display automaticaly data analysed ( raw data or computed data).
+
+Each class inherit from a common abstract class **AFrame**
+
+## GeneratePOJOfromKSY
+
+
+ - update parameter.java class with your information
+ - launch
+ ''maven install''
+ - launch the application generated
+
+
+
+
+
+## Contributing
+
+Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
+
+Please make sure to update tests as appropriate.
+
+A dedicated folder on AMSAT-Francophone forum is set : [Rubrique Josast](http://forum.amsat-f.org/forumdisplay.php?fid=38)
+
+## License
+[GNU Lesser General Public License v2.1](http://choosealicense.com/licenses/lgpl-2.1/)
diff --git a/ToolGenaratePOJOFromKSY/pom.xml b/ToolGenaratePOJOFromKSY/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b0160f2b7b332c5751574047b8a2c76ae3955e92
--- /dev/null
+++ b/ToolGenaratePOJOFromKSY/pom.xml
@@ -0,0 +1,46 @@
+
+ 4.0.0
+
+ JOSAST-parent
+ org.josast
+ 0.0.2
+
+
+
+ ToolGenaratePOJOFromKSY
+
+ UTF-8
+ 11
+ 11
+
+
+
+ jar
+
+ ToolGenaratePOJOFromKSY
+ http://maven.apache.org
+
+
+ commons-cli
+ commons-cli
+ 1.4
+
+
+
+ org.yaml
+ snakeyaml
+ 1.21
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.5.2
+ test
+
+
+
+
diff --git a/ToolGenaratePOJOFromKSY/src/main/java/org/josast/abstractclass/AFrame.java b/ToolGenaratePOJOFromKSY/src/main/java/org/josast/abstractclass/AFrame.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ea6459f7d2480559da5e7412e459fbb932197fc
--- /dev/null
+++ b/ToolGenaratePOJOFromKSY/src/main/java/org/josast/abstractclass/AFrame.java
@@ -0,0 +1,24 @@
+/**
+ *
+ */
+package org.josast.abstractclass;
+
+/**
+ * @author chris
+ *
+ */
+public abstract class AFrame {
+
+ public String toStringCompute()
+ {
+ return " toStringCompute not implemented";
+
+ }
+
+
+ public String toStringRaw()
+ {
+ return " toStringRaw not implemented";
+
+ }
+}
diff --git a/ToolGenaratePOJOFromKSY/src/main/java/org/josast/tools/pojofromksy/GeneratePOJOfromKSY.java b/ToolGenaratePOJOFromKSY/src/main/java/org/josast/tools/pojofromksy/GeneratePOJOfromKSY.java
new file mode 100644
index 0000000000000000000000000000000000000000..4c459bcc7668720f2ff1f6988947a95e3e846edc
--- /dev/null
+++ b/ToolGenaratePOJOFromKSY/src/main/java/org/josast/tools/pojofromksy/GeneratePOJOfromKSY.java
@@ -0,0 +1,275 @@
+package org.josast.tools.pojofromksy;
+
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.yaml.snakeyaml.Yaml;
+
+public class GeneratePOJOfromKSY {
+
+ private Logger log = Logger.getLogger("AmsatLogger");
+ private Parameters params;
+
+ @SuppressWarnings("rawtypes")
+ public GeneratePOJOfromKSY(Parameters param) {
+
+ params = param;
+
+ @SuppressWarnings("rawtypes")
+ ArrayList tablseq = null;
+ ArrayList tablinstance = null;
+
+ // Create Yaml parser
+ Yaml yaml = new Yaml();
+
+ InputStream inputStream = null;
+ try {
+ inputStream = new FileInputStream(param.getKsyFileName());
+ } catch (FileNotFoundException e) {
+ log.severe("input file error" + e.getMessage());
+ e.printStackTrace();
+ }
+ if (inputStream == null) {
+ log.severe("input file error, input Stream empty ");
+
+ } else {
+ // load file
+ Map obj = yaml.load(inputStream);
+ // get all data defined with Types
+
+// instances
+// LinkedHashMap types = (LinkedHashMap) obj.get("types");
+
+ @SuppressWarnings("rawtypes")
+ LinkedHashMap types = (LinkedHashMap) obj.get("types");
+
+ @SuppressWarnings("rawtypes")
+ Iterator i = types.keySet().iterator();
+
+ while (i.hasNext()) {
+ String dataclassName = (String) i.next();
+ Object valeur = types.get(dataclassName);
+ @SuppressWarnings("rawtypes")
+ LinkedHashMap data = (LinkedHashMap) valeur;
+ @SuppressWarnings("rawtypes")
+ Iterator j = data.keySet().iterator();
+
+ while (j.hasNext()) {
+
+ String clef2 = (String) j.next();
+ Object valeur3 = data.get(clef2);
+ // according to key - perform traitement
+
+ if (clef2.contentEquals("seq")) {
+
+ // only data based on ArrayList
+ if (valeur3.getClass() == ArrayList.class) {
+
+ tablseq = (ArrayList) valeur3;
+ // Generate java class
+
+ }
+ }
+ tablinstance = new ArrayList();
+ if (clef2.contentEquals("instances")) {
+
+ if (valeur3.getClass() == LinkedHashMap.class) {
+ LinkedHashMap v = (LinkedHashMap) valeur3;
+ Iterator z = v.keySet().iterator();
+ while (z.hasNext()) {
+ String clef24 = (String) z.next();
+ Object valeur4 = v.get(clef24);
+ tablinstance.add(clef24);
+
+ }
+ }
+ }
+ generateClassJava(dataclassName, tablseq, tablinstance);
+ tablseq.clear();
+ tablinstance.clear();
+ }
+
+ }
+
+ }
+
+ }
+
+ @SuppressWarnings("rawtypes")
+ public void generateClassJava(String name, ArrayList data, ArrayList tablinstance) {
+
+ String javafolders = params.getPackageName();
+ String javafold = javafolders.replace (".", "/");
+ String outputfoldercomp = params.getOutputFolder()+"/"+javafold;
+ File outputFolder = new File(outputfoldercomp);
+ if (!outputFolder.exists()) {
+ outputFolder.mkdirs();
+ log.info("make diretory "+outputFolder.getAbsolutePath());
+ }
+
+
+ PrintWriter writer = null;
+ String classname = upcase(name);
+ String ksyclassname = upcaseFirstCaracter(classname);
+
+ // preparation
+
+ ArrayList list = new ArrayList();
+ ArrayList listcomp = new ArrayList();
+ // create java class file
+ try {
+ writer = new PrintWriter(outputfoldercomp + "/" + classname + ".java");
+ } catch (FileNotFoundException e) {
+ log.severe("Error file creation" + e.getMessage());
+ e.printStackTrace();
+ }
+
+ // create class header
+ writer.println("// this class has been automaticaly generated based on KSY file");
+ writer.println("// @see Josast project");
+ writer.println("");
+
+ writer.println("package " + params.getPackageName() + ";");
+ writer.println("");
+ writer.println("import " + params.getPackageNameksyGenerated() + "." + ksyclassname + ";");
+ writer.println("");
+ writer.println("public class " + classname + " extends AFrame {");
+ writer.println("");
+ writer.println("\t private String separator=\" \\r\" ;");
+ // generate field
+
+ for (int ki = 0; ki < data.size(); ki++) {
+ LinkedHashMap data2 = (LinkedHashMap) data.get(ki);
+ Iterator l = data2.keySet().iterator();
+
+ if (data2.size() == 2) {
+ String variable = (String) data2.get("id");
+ variable = upcase(variable);
+ list.add(variable);
+// traitement type
+ Object type = data2.get("type");
+ Object size = data2.get("size");
+ Object sizeeos = data2.get("size-eos");
+
+ if (type != null) {
+ if (type.getClass() == String.class) {
+ String typeString = (String) type;
+ // u1 to u2
+ if (typeString.contains("u1") || typeString.contains("u2")) {
+ writer.println("\t private int " + variable + ";");
+ // other u
+ } else if (typeString.contains("u")) {
+ writer.println("\t private long " + variable + ";");
+ // bx
+ } else if (typeString.contains("b")) {
+ writer.println("\t private long " + variable + ";");
+ }
+ } else {
+ log.warning(classname + " type not computed for java class : "+type.getClass() + " contents : "+ type );
+ writer.println("\t private object " + variable + ";");
+ }
+
+ } else {
+
+ if (size != null) {
+
+ writer.println("\t private byte[] " + variable + ";");
+ }
+ }
+
+ } else {
+ log.warning(classname +" data size not computed for : "+data2.getClass() + " contents : "+ data2 );
+
+
+ }
+
+ }
+
+ // champs compute
+ if (tablinstance != null) {
+ for (int ki = 0; ki < tablinstance.size(); ki++) {
+ String variable = (String) tablinstance.get(ki);
+ variable = upcase(variable);
+ listcomp.add(variable);
+ writer.println("\t private double comp" + variable + ";");
+ }
+ }
+
+ // generate constructor
+
+ writer.println(" public " + classname + "(" + ksyclassname + " o) { \r\n");
+ for (int t = 0; t < list.size(); t++) {
+
+ writer.println("\t" + list.get(t) + " = o." + list.get(t) + "();");
+ }
+ for (int t = 0; t < listcomp.size(); t++) {
+ writer.println("\t comp" + listcomp.get(t) + " = o." + listcomp.get(t) + "();");
+ // writer.println("\t + separator + " + "\" comp" + listcomp.get(t) + " : \" +"
+ // + listcomp.get(t));
+ }
+
+ writer.println(" } \r\n");
+
+ // generate display raw data
+
+ writer.println(" public String toStringRaw () { \r\n ");
+ writer.println(" return \" \" ");
+ for (int t = 0; t < list.size(); t++) {
+
+ writer.println("\t + separator + " + "\"" + list.get(t) + " : \" +" + list.get(t));
+ }
+
+ writer.println("; } \r\n");
+
+ // generate display compute data
+ writer.println(" public String toStringCompute () { \r\n ");
+ writer.println(" return \" \" ");
+
+ for (int t = 0; t < listcomp.size(); t++) {
+
+ writer.println("\t + separator + " + "\"" + listcomp.get(t) + " : \" +" + " comp" + listcomp.get(t));
+ }
+
+ writer.println("; } \r\n");
+
+ // generate end file
+
+ writer.println("}");
+ writer.close();
+
+ log.info(classname+".java generated");
+
+ }
+
+ public String upcase(String in) {
+
+ StringBuffer stbuf = new StringBuffer();
+ for (int cpt = 0; cpt < in.length(); cpt++) {
+ if (in.charAt(cpt) == '_') {
+ cpt++;
+ char up = Character.toUpperCase(in.charAt(cpt));
+ stbuf.append(up);
+ } else {
+ stbuf.append(in.charAt(cpt));
+ }
+
+ }
+
+ return stbuf.toString();
+
+ }
+
+ private String upcaseFirstCaracter(final String line) {
+ return Character.toUpperCase(line.charAt(0)) + line.substring(1);
+ }
+
+}
diff --git a/ToolGenaratePOJOFromKSY/src/main/java/org/josast/tools/pojofromksy/GeneratePOJOfromKSYCli.java b/ToolGenaratePOJOFromKSY/src/main/java/org/josast/tools/pojofromksy/GeneratePOJOfromKSYCli.java
new file mode 100644
index 0000000000000000000000000000000000000000..88438289255634a7e299404050dbd62455ac085c
--- /dev/null
+++ b/ToolGenaratePOJOFromKSY/src/main/java/org/josast/tools/pojofromksy/GeneratePOJOfromKSYCli.java
@@ -0,0 +1,39 @@
+package org.josast.tools.pojofromksy;
+
+public class GeneratePOJOfromKSYCli {
+
+ private String version = "0.0.1" ;
+
+
+ public void message()
+ {
+ System.out.println("KSY to POJO generator - Version : "+version);
+ System.out.println("see Josast project for information");
+ }
+
+ public void execute ()
+ {
+ Parameters param = new Parameters();
+ param.setKsyFileName("D:\\01-Projets\\telemetrydescription\\UVSQsat\\uvsqsat.ksy");
+ param.setPackageNameksyGenerated("org.josast.uvsqsat.generated.Uvsqsat");
+ param.setPackageName("org.josast.uvsqsat.pojogenerated");
+ param.setOutputFolder("./outputfile");
+ GeneratePOJOfromKSY test = new GeneratePOJOfromKSY(param);
+ }
+
+ public static void main(String[] args) {
+
+ GeneratePOJOfromKSYCli generator = new GeneratePOJOfromKSYCli();
+ generator.message();
+ generator.execute();
+ System.out.println("Java class generated !");
+
+
+
+
+
+
+ }
+
+
+}
diff --git a/ToolGenaratePOJOFromKSY/src/main/java/org/josast/tools/pojofromksy/Parameters.java b/ToolGenaratePOJOFromKSY/src/main/java/org/josast/tools/pojofromksy/Parameters.java
new file mode 100644
index 0000000000000000000000000000000000000000..72cbd94f0b0be3273c4b4622d8f653d3f5005c19
--- /dev/null
+++ b/ToolGenaratePOJOFromKSY/src/main/java/org/josast/tools/pojofromksy/Parameters.java
@@ -0,0 +1,63 @@
+package org.josast.tools.pojofromksy;
+
+public class Parameters {
+
+ private String packageName = "";
+ private String packageNameksyGenerated = "";
+ private String ksyFileName = null;
+ private String outputFolder= "./outputFile";
+
+
+ /**
+ * @return the packageName
+ */
+ public String getPackageName() {
+ return packageName;
+ }
+ /**
+ * @param packageName the packageName to set
+ */
+ public void setPackageName(String packageName) {
+ this.packageName = packageName;
+ }
+ /**
+ * @return the ksyFileName
+ */
+ public String getKsyFileName() {
+ return ksyFileName;
+ }
+ /**
+ * @param ksyFileName the ksyFileName to set
+ */
+ public void setKsyFileName(String ksyFileName) {
+ this.ksyFileName = ksyFileName;
+ }
+ /**
+ * @return the packageNameksyGenerated
+ */
+ public String getPackageNameksyGenerated() {
+ return packageNameksyGenerated;
+ }
+ /**
+ * @param packageNameksyGenerated the packageNameksyGenerated to set
+ */
+ public void setPackageNameksyGenerated(String packageNameksyGenerated) {
+ this.packageNameksyGenerated = packageNameksyGenerated;
+ }
+ /**
+ * @return the outputFolder
+ */
+ public String getOutputFolder() {
+ return outputFolder;
+ }
+ /**
+ * @param outputFolder the outputFolder to set
+ */
+ public void setOutputFolder(String outputFolder) {
+ this.outputFolder = outputFolder;
+ }
+
+
+
+
+}
diff --git a/pom.xml b/pom.xml
index 7be68d20f4e97afcbd23caaa99ea727336b5b6ee..6810cbf54dc65a63b230082edee293bfdfa77cdf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -695,7 +695,7 @@
copy-dependencies
- E:/gitjosast/josast/lib
+ D:/01-Projets/josast/lib