{"id":350,"date":"2017-08-28T13:16:23","date_gmt":"2017-08-28T11:16:23","guid":{"rendered":"https:\/\/aerospaceresearch.net\/?p=350"},"modified":"2017-08-31T09:20:18","modified_gmt":"2017-08-31T07:20:18","slug":"gsoc2017-introduction-to-the-generic-creation-of-a-ground-station-using-usoc","status":"publish","type":"post","link":"https:\/\/aerospaceresearch.net\/?p=350","title":{"rendered":"[GSOC2017] Introduction to the generic creation of a ground station using USOC"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-508\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/usoc.png\" alt=\"\" width=\"1280\" height=\"800\" \/><\/p>\n<p>The <strong>Universal Space Operations Center<\/strong>, USOC, is an\u00a0open-source tool that allows a simple and easy creation of a working groundstation to aid (student) space projects.<\/p>\n<p>Due to the fact that the functionality of every experiment should be checked before lift-off, a communication software for up- und downlink is required.\u00a0USOC follows a generic approach and offers the possibility to write this software automatically using a configuration file. The program structure is divided into three main components:<\/p>\n<ol>\n<li>Communication software<\/li>\n<li>Graphical user interface (GUI)<\/li>\n<li>Controller for interaction between communication software and graphical user interface<\/li>\n<\/ol>\n<p>Based on the input of the user in the configuration file, the GUI and partially also the controllers can be written automatically.\u00a0In this matter, USOC generates appropriate functionalities within\u00a0the controllers for individual GUI contents, which can then be adapted manually.\u00a0Changes in the configuration file are detected, localized and the corresponding GUI structures and controller functionalities are regenerated. If these are manually written functionalities, they are recognized and not overwritten.\u00a0USOC also brings\u00a0pre-coded functions, such as\u00a0communication via serial ports and\/or the Iridium satellite network, as well as a three-dimensional visualization of GNSS data. For further details of these functions, I would like to refer to the GSoC2017 project of Valentin Starlinger, whose blog post can be reached <a href=\"https:\/\/aerospaceresearch.net\/?p=326\">here<\/a>.<\/p>\n<p><span style=\"font-weight: 400;\">In this way, essential parts of a ground segment software can be created quickly and easily. Because of the wide diversity concerning the experiments in the space sector,\u00a0people from all over the world can use USOC\u00a0and add functionalities for their individual project to develop\u00a0and extend\u00a0the Universal Space Operations Center.<\/span><\/p>\n<p><!--more--><\/p>\n<h1>Development Process<\/h1>\n<p>USOC has been\u00a0programmed in Java using the Netbeans IDE. Instead of Java Swing, which is the\u00a0library used for the\u00a0<a href=\"http:\/\/www.ksat-stuttgart.de\/en\/projects\/mirka2-rx\">MIRKA2-RX<\/a>\u00a0ground segment software, JavaFX was\u00a0used for the GUI as it provides advantages such as the separation of application logic and application design and the support of Cascading Style Sheets (CSS) for easy-to-handle and individual design adjustments.<br \/>\nJavaFX provides two different ways of creating GUI\u2019s:<\/p>\n<ol>\n<li style=\"text-align: left;\">The GUI can be created in just one single file using JavaFX. Application design and application logic are merged.<\/li>\n<li>With FXML JavaFX introduces an XML-based language that provides the structure in order to build a user interface separate from the application logic of the code. This structure can be coded\u00a0manually or by using the GUI builder \u2018Scene Builder\u2019.<\/li>\n<\/ol>\n<p>Due to the separation of application design and application logic, the code is easier to maintain. Therefore, a JavaFX FXML application has\u00a0been preferred for this project.\u00a0In addition, the hierarchical markup language FXML is very suitable for the generic approach.<\/p>\n<p>At the beginning of the project, thoughts about a general, reasonable structure of the ground station were made. This was subsequently implemented. By introducing a Java Properties file as the configuration file with\u00a0an associated syntax for specifying the GUI content, it was then possible to generically create\u00a0first parts of the interface.\u00a0This approach was continued until all desired functionalities were implemented in a generic manner.<\/p>\n<p>Then a Java Properties comparison file was created and the Java class <em>ConfigHandler<\/em> was coded.\u00a0The comparison file contains all the keywords and corresponding values \u200b\u200bof the configuration file. In this way, changes can be detected.\u00a0The <em>ConfigHandler<\/em> communicates with the configuration file. It controls the syntax of the entered values, detects and locates changes and forwards them to the <em>GuiBuilder<\/em> class. Afterwards\u00a0the <em>GuiBiulder<\/em> was coded, which writes the FXML structures as well as\u00a0the corresponding controllers automatically based on the user&#8217;s input.<\/p>\n<p>The last step consisted of merging the progress of Valentin Starlingers\u00a0<a href=\"https:\/\/aerospaceresearch.net\/?p=326\">project<\/a>\u00a0with mine.<\/p>\n<h1>User Manual<\/h1>\n<h2>USOC Files<\/h2>\n<p>Since an overview of the code is relevant for the use of USOC, the most important files for the arrangement\u00a0of the graphical user interface seen in the figure below are briefly presented in the following.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-523\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/fStructure.png\" alt=\"\" width=\"294\" height=\"770\" \/><\/p>\n<h3>FXML Files<\/h3>\n<p>These\u00a0files\u00a0are all generated automatically based on the configuration file.\u00a0<strong>Manual changes <\/strong>are<strong> not provided<\/strong>.<\/p>\n<h4>MainFrame.fxml<\/h4>\n<p>The MainFrame is the main window of the ground station. It is divided into the MainPanel, the LogPanel and, if specified in the configuration file, the StatePanel.<\/p>\n<p>MainFrame with keyword\u00a0<em>statePanel<\/em> set to\u00a0<em>true<\/em>:<br \/>\n<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-495\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/MainFramewStatePanel.png\" alt=\"\" width=\"1156\" height=\"697\" \/>MainFrame with keyword\u00a0<em>statePanel<\/em> set to\u00a0<em>false:<br \/>\n<\/em><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-497\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/MainFramenoStatePanel.png\" alt=\"\" width=\"1156\" height=\"697\" \/><\/p>\n<h4>MainPanel.fxml<\/h4>\n<p>The MainPanel is the dynamic central window of the MainFrame. The diagrams are shown here. When configured in the configuration file, the three-dimensional visualization of GNSS data can be accessed via the &#8222;GNSS 3D View&#8220; tab in the MainPanel.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-496\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/MainPanel.png\" alt=\"\" width=\"469\" height=\"343\" \/><\/p>\n<h4>LogPanel.fxml<\/h4>\n<p>The LogPanel is located on the right side of the MainFrame. Various communication paths are displayed here. Communication via the serial port and via the Iridium satellite network are already pre-coded. Individual tabs can be created via the configuration\u00a0file.<br \/>\n<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-493\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/LogPanel.png\" alt=\"\" width=\"272\" height=\"451\" \/><\/p>\n<h4>StatePanel.fxml<\/h4>\n<p>The StatePanel is located on the left side of the MainFrame. Various parameters such as current modes can be displayed here.<\/p>\n<h4>iridiumpanel.fxml<\/h4>\n<p>The IridiumPanel.fxml file contains the FXML structure of the Iridium tab in the LogPanel.<\/p>\n<h4>serialpanel.fxml<\/h4>\n<p>The SerialPanel.fxml\u00a0file contains the FXML structure of the Serial\u00a0tab in the LogPanel.<\/p>\n<h3>Configuration Files<\/h3>\n<h4>config.properties<\/h4>\n<p>The config.properties file contains all necessary information to set up the graphical user interface of the ground station.<\/p>\n<h4>configMod.properties<\/h4>\n<p>The configmod.properties file serves as a comparison file to detect changes within configuration file. It contains all keywords and associated values \u200b\u200bof the config.properties file. During\u00a0each program run, it is matched with the config.properties file and updated afterwards.\u00a0<strong>Manual changes <\/strong>are<strong> not provided<\/strong>.<\/p>\n<h3>GUI Controller<\/h3>\n<p>These\u00a0files\u00a0are all generated automatically based on the configuration file.\u00a0<strong>Manual changes <\/strong>are<strong> not provided<\/strong>.\u00a0The generated dummy methods, which are marked by the comment &#8218;\/\/<em>Automatically generated method dummyMethod()&#8216;<\/em>, can be filled in manually. If the files are regenerated due to changes in the configuration file, the manually entered method contents are recognized and not overwritten.<\/p>\n<h4>MainPanelController.java<\/h4>\n<p>The <em>MainPanelController<\/em> is a class whose methods ensure the functionality of the MainPanel. The charts are declared and records are assigned.<\/p>\n<h4>LogPanelController.java<\/h4>\n<p>The <em>LogPanelController<\/em> provides the functionality of the LogPanel. Apart from pre-coded methods for the SerialLog and IridiumLog, a dummy method is\u00a0written for each button of the individually designed tabs. These methods can be supplemented manually. Those method\u00a0contents are recognized and will not be lost if the button label has been changed. Then the corresponding FXML structure and controller are regenerated.<\/p>\n<h4>StatePanelcontroller.java<\/h4>\n<p>The StatePanelController contains a method for setting and updating the labels in the StatePanel. A label is automatically set for every entered keyword.<\/p>\n<h3>GuiBuilder.java<\/h3>\n<div id=\"tw-target-text-container\" class=\"tw-ta-container tw-nfl\">\n<p id=\"tw-target-text\" class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><span lang=\"en\">The <em>GuiBuilder.java<\/em> class includes methods for regenerating individual FXML structures. Manually added method contents are recognized at specified points in order to ensure these when changes are made to corresponding GUI elements.\u00a0The GuiBuilder\u00a0includes the following methods:<\/span><\/p>\n<ul>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>setExperimentName():<\/strong><br \/>\nThe title of the generated ground station is updated and resetted.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>getGridPosition():<\/strong><br \/>\nIn the MainPanel, as well as in the LogPanel and StatePanel, the elements of the content are filled in a two-column grid. For this purpose, the number of the element from the configuration file must be transformed into a two-dimensional array with line and column specification.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>writeLicence():<br \/>\n<\/strong>This Method writes the MIT licence\u00a0into the automatically generated files depending on the target file type<strong>.<br \/>\n<\/strong><\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>writeMethod():<br \/>\n<\/strong>This method recognizes manually\u00a0added method contents concerning\u00a0additional tabs in the LogPanel or items\u00a0of the StatePanel, to prevent their overwriting when the configuration file is\u00a0changed.<strong><br \/>\n<\/strong><\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>mainFrameBuilder():<br \/>\n<\/strong>The\u00a0<em>MainFrame.fxml<\/em>\u00a0file is regenerated\u00a0according to the settings of the configuration file when the method is called.<strong><br \/>\n<\/strong><\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>mainPanelBuilder():<\/strong><br \/>\nThe <em>MainPanel.fxml\u00a0<\/em>file is regenerated\u00a0according to the settings of the configuration file when the method is called.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>mainPanelControlBuilder():<\/strong><br \/>\nThe <em>MainPanelController.java<\/em>\u00a0file is regenerated\u00a0according to the settings of the configuration file when the method is called.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>logPanelBuilder():<\/strong><br \/>\nThe<em> LogPanel.fxml<\/em> file is regenerated\u00a0according to the settings of the configuration file. The method builds the FXML structure generically in a\u00a0TabPane with an optional number of additional tabs.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>logPanelControlBuilder():<\/strong><br \/>\nThe <em>LogPanelController.java<\/em> file is regenerated\u00a0according to the settings of the configuration file when the method is called.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>statePanelBuilder():<\/strong><br \/>\nThe <em>StatePanel.fxml<\/em> file is regenerated\u00a0according to the settings of the configuration file. The method builds the FXML structure of the generically\u00a0in a ScrollPane with an optional number of vertically stacked segments.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>statePanelControlBuilder():<\/strong>\n<div id=\"tw-target-text-container\" class=\"tw-ta-container tw-nfl\">\n<p id=\"tw-target-text\" class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><span lang=\"en\">The <em>StatePanelController.java<\/em> file is regenerated\u00a0according to the settings of the configuration file when the method is called.<\/span><\/p>\n<h3 class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\">ConfigHandler.java<\/h3>\n<p>The <em>ConfigHandler.java<\/em> class communicates with the configuration file <em>config.properties<\/em>. Changes and additions are recognized and corresponding methods of the <em>GuiBuilder.java<\/em> class are called. The ConfigHandler contains methods, which offer the possibility of recognizing and passing on individual changes, as well as\u00a0controlling the syntax of the configuration file by calling the method rebuildGui().\u00a0The ConfigHandler\u00a0includes the following methods:<\/p>\n<ul>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>countItems():<\/strong><br \/>\nThe number of elements of the transmitted keyword is counted according to the USOC syntax in the associated .properties file and is returned as an integer.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>getAllValues():<br \/>\n<\/strong>All values \u200b\u200bof the configuration file are read out and returned as\u00a0a Java Properties structure.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>updateConfigMod():<\/strong><br \/>\nThe values \u200b\u200bof the comparison file for detecting changes, <em>configMod.properties<\/em>, are overwritten with the current values \u200b\u200bof the configuration file, <em>config.properties<\/em>. This method is performed after each program call.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>valueMod():<\/strong><br \/>\nIt is checked whether the passed keyword has been changed since the last compilation. For this purpose, the configuration file <em>config.properties<\/em> is compared to\u00a0the comparison file <em>configMod.properties<\/em>.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>experimentNameMod():<\/strong><br \/>\nIt is checked whether the keyword <em>experimentName<\/em> has been changed in the configuration file since the last compilation. A corresponding boolean is returned.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>mainPanelMod():<\/strong><br \/>\nIt is checked whether changes to the configuration file have been made to the MainPanel since the last compilation. A corresponding boolean is returned.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>logPanelMod():<\/strong><br \/>\nIt is checked whether changes in the configuration file have been made to the LogPanel since the last compilation. A corresponding boolean is returned.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>statePanelMod():<\/strong><br \/>\nIt is checked whether changes in the configuration file have been made to the StatePanel since the last compilation. A corresponding boolean is returned.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>fileMod():<\/strong><br \/>\nIt is checked whether the configuration file has been changed at any point since the last compilation. A corresponding boolean is returned.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>syntaxCheck():<\/strong><br \/>\nThe syntax of the information in the configuration file is checked for accuracy. A corresponding boolean is returned.<\/li>\n<li class=\"tw-data-text tw-ta tw-text-small\" dir=\"ltr\" data-placeholder=\"\u00dcbersetzung\"><strong>rebuildGui():<br \/>\n<\/strong>This method controls the syntax of the configuration file and executes the corresponding GuiBuilder methods depending on the change. Finally,\u00a0the updateConfigMod()-method is called.<\/li>\n<\/ul>\n<\/div>\n<\/li>\n<\/ul>\n<\/div>\n<h2>Configuration File<\/h2>\n<h3>Settings<\/h3>\n<p>The following parameters determining the GUI content must be specified with the following syntax:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-501\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/syntaxProp.png\" alt=\"\" width=\"2217\" height=\"287\" \/><\/p>\n<h4>RESET<\/h4>\n<p>This option can be used to regenerate the entire GUI code. It is a mandatory setting that has to be specified. The expected input is the data type boolean (<em>true<\/em>, <em>false<\/em>). The following files will be updated if <em>RESET<\/em> is set to <em>true<\/em>:<br \/>\n<strong>FXML Files<br \/>\n<\/strong>&#8211;\u00a0MainFrame.fxml<br \/>\n&#8211;\u00a0MainPanel.fxml<br \/>\n&#8211;\u00a0LogPanel.fxml<br \/>\n&#8211;\u00a0StatePanel.fxml<br \/>\n<strong>Controller<br \/>\n<\/strong>&#8211; MainPanelController.java<br \/>\n&#8211;\u00a0LogPanelController.java<br \/>\n&#8211;\u00a0StatePanelController.java<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-503\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/reset.png\" alt=\"\" width=\"2221\" height=\"497\" \/><\/p>\n<h4>statePanel<\/h4>\n<p>The StatePanel serves as a status display. Here, different modes of the experiment and\/or other individual states can be displayed and monitored. To set the StatePanel, the keyword <em>statePanel<\/em> has to be set on <em>true<\/em> as it is shown below. It is a mandatory setting that has to be specified. USOC expects the data type boolean (<em>true<\/em>, <em>false<\/em>) as input.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-359\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/statePanelProp.png\" alt=\"\" width=\"2221\" height=\"150\" \/><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-360\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/statePanel.png\" alt=\"\" width=\"1280\" height=\"800\" \/><\/p>\n<h4>GNSS3dView<\/h4>\n<p>Another pre-coded function of USOC is the three-dimensional visualization of GNSS (Global Navigation Satellite System) data. To set the &#8222;GNSS 3D View&#8220; tab in the MainPanel, the keyword <em>GNSS3dView<\/em>\u00a0has to be set on <em>true<\/em>\u00a0as it is shown below. It is a mandatory setting that has to be specified. USOC expects the data type boolean (<em>true<\/em>,\u00a0<em>false<\/em>) as input.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-362\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/GNSS3dViewProp.png\" alt=\"\" width=\"2219\" height=\"154\" \/> <img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-361\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/GNSS3dView.png\" alt=\"\" width=\"1280\" height=\"800\" \/><\/p>\n<h4>experimentname<\/h4>\n<p>The <em>experimentName<\/em>\u00a0&#8211; keyword sets the title of the ground station. It is a mandatory setting that has to be specified. Expected input is the data type String.<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-382\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/experimentName.png\" alt=\"\" width=\"2862\" height=\"1815\" \/><\/p>\n<h3>Chart Properties<\/h3>\n<h4>About<\/h4>\n<p>Charts are defined by the three keywords <em>chartTitle[]<\/em>, <em>x[]<\/em>\u00a0and <em>y[]<\/em>. The square brackets include the diagram index, which is incremented starting with <em>1<\/em>. The charts are arranged in rows in a two column grid pane in the following schema:<br \/>\n<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-365\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/chartSchema.png\" alt=\"\" width=\"154\" height=\"142\" \/><\/p>\n<h4>chartTitle[ ], x[ ], y[ ]<\/h4>\n<p>A chart can only be generated successfully if all three elements are specified in the configuration file with the matching index.<br \/>\n<img decoding=\"async\" loading=\"lazy\" class=\"wp-image-366 aligncenter\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/chartSettings.png\" alt=\"\" width=\"457\" height=\"260\" \/><\/p>\n<h4>example<\/h4>\n<p>Chart properties in config.properties file:<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-369\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/propertiesChart.png\" alt=\"\" width=\"2227\" height=\"921\" \/><\/p>\n<p>FXML code generated by input in config.properties file:<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-370\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/fxmlChart.png\" alt=\"\" width=\"2231\" height=\"858\" \/><\/p>\n<p>Final representation of the chart in the graphical user interface:<img decoding=\"async\" loading=\"lazy\" class=\"alignleft wp-image-371\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/resultChart.png\" alt=\"\" width=\"503\" height=\"239\" \/><\/p>\n<h3><\/h3>\n<h3>Log Properties<\/h3>\n<h4>about<\/h4>\n<p>The LogPanel is used to communicate with the experiment. Messages and data can be sent and received over various ways. The communication paths via the serial port and via the iridium satellite network are pre-coded and\u00a0can be enabled in the configuration file.\u00a0The different paths are available as tabs in the LogPanel. Individual tabs can be configured in the configuration file.<\/p>\n<h4>SerialPaneL<\/h4>\n<div>The SerialPanel provides the capability to connect to serial ports and send commands.<\/div>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-404\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/serialPanel.png\" alt=\"\" width=\"180\" height=\"256\" \/>\u00a0<img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-403\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logCommands.png\" alt=\"\" width=\"180\" height=\"256\" \/>\u00a0<img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-402\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logBaudrates.png\" alt=\"\" width=\"180\" height=\"255\" \/><\/p>\n<h4>iridiumPanel<\/h4>\n<p>The IridiumPanel provides information about the received messages.<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-527\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/iridiumPanel-1.png\" alt=\"\" width=\"180\" height=\"253\" \/><\/p>\n<h4>tabTitle[ ], textArea[ ], control[ ][ ]<\/h4>\n<p>Additional tabs can be customized individually. All control items are again\u00a0arranged in rows in a two column grid pane in the following schema:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-365\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/chartSchema.png\" alt=\"\" width=\"154\" height=\"142\" \/>Mandatory inputs are the tab title\u00a0and the setting whether\u00a0a TextArea is needed. Afterwards control items can be added to the tab by using the <em>control[][]<\/em> keyword.\u00a0The square brackets include the indices, which are\u00a0incremented starting with <em>1<\/em>. The first index refers to the number of tab\u00a0and the second index to the control items\u00a0of the respective tab.<br \/>\nImplemented so far are the following control items including the corresponding setting:<\/p>\n<ol>\n<li>Button:<br \/>\ncontrol[i][j] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = \u00a0 button<br \/>\nbText[i][j] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= \u00a0 <em>individual content<\/em><\/li>\n<li>Label:<br \/>\ncontrol[i][j] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= \u00a0 label<br \/>\nlText[i][j] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = \u00a0 <em>individual content<\/em><\/li>\n<li>Textfield:<br \/>\ncontrol[i][j] \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= \u00a0 textField<br \/>\npromptText[i][j] \u00a0 \u00a0= \u00a0 <em>individual content<\/em><\/li>\n<\/ol>\n<p>with <em>j = {1,2,3,&#8230;}<\/em> as number of control item in tab and<em>\u00a0i = {1,2,3,&#8230;}<\/em> as number of additional tab.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-560\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logSetting.png\" alt=\"\" width=\"3307\" height=\"1967\" \/><\/p>\n<h4>Example<\/h4>\n<p>LogPanel properties in config.properties file:<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-540\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logSetting1.png\" alt=\"\" width=\"2212\" height=\"2508\" \/><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-535\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logProp2.png\" alt=\"\" width=\"2213\" height=\"681\" \/><\/p>\n<p>FXML code generated by input in config.properties file:<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-541\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logFXML1.png\" alt=\"\" width=\"2222\" height=\"2496\" \/> <img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-542\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logFXML2.png\" alt=\"\" width=\"2222\" height=\"1032\" \/><\/p>\n<p>Final representation of the LogPanel in the graphical user interface:<img decoding=\"async\" loading=\"lazy\" class=\"wp-image-543 alignnone\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logSerial.png\" alt=\"\" width=\"180\" height=\"267\" \/>\u00a0<img decoding=\"async\" loading=\"lazy\" class=\"wp-image-544 alignnone\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logIridium.png\" alt=\"\" width=\"180\" height=\"267\" \/> <img decoding=\"async\" loading=\"lazy\" class=\"wp-image-545 alignnone\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/logTab3.png\" alt=\"\" width=\"180\" height=\"267\" \/><\/p>\n<p>&nbsp;<\/p>\n<h3>State Properties<\/h3>\n<h4>about<\/h4>\n<p>The StatePanel is specified by the\u00a0<em>statePanel<\/em> &#8211; keyword in the config.properties file. The content is divided into segments, which are initialized by\u00a0the keyword\u00a0<em>boxTitle[]<\/em> and titled by the appropriate value. The contents of the segments are set by the keyword\u00a0<em>keyword[][]<\/em>.\u00a0The square brackets include the indices, which are\u00a0incremented starting with <em>1<\/em>. The first index refers to the number of segment and the second index to the content of the respective segment.<\/p>\n<h4>segmentTitle[ ], keyword[ ][ ]<\/h4>\n<h4><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-524\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/stateElements.png\" alt=\"\" width=\"375\" height=\"260\" \/><\/h4>\n<h4>example<\/h4>\n<p>StatePanel properties in config.properties file:<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-525\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/stateProperties.png\" alt=\"\" width=\"2240\" height=\"1229\" \/><\/p>\n<p>FXML code generated by input in config.properties file:<br \/>\n<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-375\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/fxmlState.png\" alt=\"\" width=\"2223\" height=\"1849\" \/><\/p>\n<p>Final representation of the StatePanel in the graphical user interface:<img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-376 aligncenter\" src=\"https:\/\/aerospaceresearch.net\/wp-content\/uploads\/2017\/08\/resultState.png\" alt=\"\" width=\"196\" height=\"175\" \/><\/p>\n<h1>Example<\/h1>\n<p>The following video shows the use of USOC with\u00a0the example of <a href=\"http:\/\/www.ksat-stuttgart.de\/en\/projects\/roach\">ROACH &#8211; Robotic in-Orbit Analysis of Cover Hulls<\/a>, a project by <a href=\"http:\/\/www.ksat-stuttgart.de\/en\/\">KSat e.V.<\/a>\u00a0(Small Satellite Student Society at the University of Stuttgart).<\/p>\n<p><span style=\"font-weight: 400;\">ROACH is the current REXUS project by KSat e.V..\u00a0<\/span><span style=\"font-weight: 400;\">REXUS\/BEXUS (Rocket Experiments for University Students \/ Balloon Experiments for University Students) is an european program for student experiments on rockets and balloons. The program uses sounding rockets and balloons launched from Esrange in northern Sweden. It first took place in 2007 and has reached a total amount of more than 95 experiments until 2016 with 15 &#8211; 20 experiments launched every year. It is constantly growing and getting an integral and outstanding opportunity for students to gain experience in hands-on space projects.<\/span><\/p>\n<p>The experiment\u00a0ROACH is motivated by threats posed by space debris damages, micrometeoride impacts and structural fatigue of space structures. Space itself, with vacuum and thermal cycles, is a demanding environment for satellites and space stations. Thus, periodical monitoring of the outer hull of these spacecrafts is advisable. \u00a0Regular monitoring and small repairs allow a less conservative and more cost effective design approach for future space structures. Instead of EVAs or photo-optical inspections, small rovers, which travel on the surface and search for potential damages, are a fascinating new idea.<br \/>\n<span style=\"font-weight: 400;\">The ROACH rover utilises electro-adhesive tracks to move on a\u00a0REXUS rocket. It will be equipped with sensors which examine the module structure. The rover itself will be secured with an umbilical to the module, which also supplies power and the communication link to the on-board computer. The goal of the ROACH project is to develop, build and fly this experiment.<\/span><\/p>\n<p>An introduction video will be uploaded soon.<\/p>\n<h1>Future work<\/h1>\n<ul>\n<li>Further expand of the JUnit test scenarios<\/li>\n<li>The <em>StatePanelController<\/em> still needs to be assigned<\/li>\n<li>Introduction of a MenuBar and shifting some functions into this<\/li>\n<li>Implementation of a Forward Error Correction (FEC)<\/li>\n<\/ul>\n<h1>Personal Information and Links<\/h1>\n<p><strong>Personal Information:<\/strong><\/p>\n<p>Name: \u00a0 \u00a0 \u00a0 \u00a0Victor Hertel<br \/>\nE-Mail: \u00a0 \u00a0 \u00a0hertel@ksat-stuttgart.de<\/p>\n<p>The following <strong>links<\/strong> lead to the GSoC GitHub repo, my commits and the USOC user manual:<\/p>\n<p>GSoC GitHub repo: <a href=\"https:\/\/github.com\/aerospaceresearch\/Universal-Space-Operations-Center\">link <\/a><br \/>\nMy commits:\u00a0<a href=\"https:\/\/github.com\/aerospaceresearch\/Universal-Space-Operations-Center\/commits?author=vhertel\">link<\/a><br \/>\nUser Manual: (no link yet)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction The Universal Space Operations Center, USOC, is an\u00a0open-source tool that allows a simple and easy creation of a working groundstation to aid (student) space projects. Due to the fact that the functionality of every experiment should be checked before lift-off, a communication software for up- und downlink is required.\u00a0USOC follows a generic approach and &hellip; <a href=\"https:\/\/aerospaceresearch.net\/?p=350\" class=\"more-link\"><span class=\"screen-reader-text\">\u201e[GSOC2017] Introduction to the generic creation of a ground station using USOC\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=\/wp\/v2\/posts\/350"}],"collection":[{"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=350"}],"version-history":[{"count":59,"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=\/wp\/v2\/posts\/350\/revisions"}],"predecessor-version":[{"id":587,"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=\/wp\/v2\/posts\/350\/revisions\/587"}],"wp:attachment":[{"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=350"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aerospaceresearch.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}