├── KISSetGUI ├── src │ ├── main │ │ ├── resources │ │ │ ├── messages_us.properties │ │ │ ├── commons-logging.properties │ │ │ ├── fonts │ │ │ │ └── bedstead │ │ │ │ │ └── bedstead.otf │ │ │ ├── simplelog.properties │ │ │ ├── build-info │ │ │ │ └── build-info.properties │ │ │ ├── version.txt │ │ │ └── org │ │ │ │ └── prowl │ │ │ │ └── kissetgui │ │ │ │ ├── userinterface │ │ │ │ └── desktop │ │ │ │ │ ├── img │ │ │ │ │ ├── aprs0.png │ │ │ │ │ ├── aprs1.png │ │ │ │ │ ├── aprs2.png │ │ │ │ │ ├── icon.png │ │ │ │ │ ├── tray-black.png │ │ │ │ │ └── tray-white.png │ │ │ │ │ └── fx │ │ │ │ │ ├── about │ │ │ │ │ └── app-icon.png │ │ │ │ │ ├── DXController.fxml │ │ │ │ │ ├── FBBController.fxml │ │ │ │ │ ├── AboutController.fxml │ │ │ │ │ ├── MonitorController.fxml │ │ │ │ │ ├── TerminalController.fxml │ │ │ │ │ ├── APRSController.fxml │ │ │ │ │ └── ChooseLocationController.fxml │ │ │ │ └── config │ │ │ │ └── config-default.xml │ │ └── java │ │ │ ├── org │ │ │ └── prowl │ │ │ │ ├── maps │ │ │ │ ├── Point.java │ │ │ │ ├── MapPoint.java │ │ │ │ └── tile │ │ │ │ │ └── TileRetriever.java │ │ │ │ └── kissetgui │ │ │ │ ├── userinterface │ │ │ │ └── desktop │ │ │ │ │ ├── terminals │ │ │ │ │ ├── Terminal.java │ │ │ │ │ └── DebugTerminal.java │ │ │ │ │ ├── fx │ │ │ │ │ ├── AboutController.java │ │ │ │ │ └── ConnectionPreferenceInterface.java │ │ │ │ │ └── utils │ │ │ │ │ └── GUITools.java │ │ │ │ └── guiconfig │ │ │ │ ├── OSDefaults.java │ │ │ │ └── GUIConf.java │ │ │ └── module-info.java │ └── packaging │ │ ├── deb │ │ ├── kisset-gui.desktop │ │ ├── control │ │ ├── postrm │ │ ├── prerm │ │ └── postinst │ │ ├── osx-jpackage.txt │ │ ├── linux-jpackage.txt │ │ ├── windows-jpackage.txt │ │ └── add-launch-to-msi.js ├── app-icon.ico ├── app-icon.png ├── app-icon.icns └── .gitignore ├── KISSetMain ├── src │ ├── main │ │ ├── resources │ │ │ ├── messages_us.properties │ │ │ ├── commons-logging.properties │ │ │ ├── simplelog.properties │ │ │ ├── build-info │ │ │ │ └── build-info.properties │ │ │ ├── version.txt │ │ │ └── org │ │ │ │ └── prowl │ │ │ │ └── kisset │ │ │ │ ├── userinterface │ │ │ │ └── desktop │ │ │ │ │ ├── img │ │ │ │ │ ├── icon.png │ │ │ │ │ ├── tray-black.png │ │ │ │ │ └── tray-white.png │ │ │ │ │ └── fx │ │ │ │ │ ├── about │ │ │ │ │ └── app-icon.png │ │ │ │ │ ├── DXController.fxml │ │ │ │ │ ├── FBBController.fxml │ │ │ │ │ ├── AboutController.fxml │ │ │ │ │ ├── MonitorController.fxml │ │ │ │ │ ├── TerminalController.fxml │ │ │ │ │ ├── APRSController.fxml │ │ │ │ │ ├── ChooseLocationController.fxml │ │ │ │ │ └── ConnectionPreferenceHost.fxml │ │ │ │ └── config │ │ │ │ ├── tidy.xslt │ │ │ │ └── config-default.xml │ │ ├── java │ │ │ ├── org │ │ │ │ └── prowl │ │ │ │ │ ├── kisset │ │ │ │ │ ├── services │ │ │ │ │ │ ├── ClientHandler.java │ │ │ │ │ │ ├── host │ │ │ │ │ │ │ └── parser │ │ │ │ │ │ │ │ ├── ExtensionState.java │ │ │ │ │ │ │ │ ├── commands │ │ │ │ │ │ │ │ ├── Help.java │ │ │ │ │ │ │ │ ├── Quit.java │ │ │ │ │ │ │ │ ├── Monitor.java │ │ │ │ │ │ │ │ ├── Converse.java │ │ │ │ │ │ │ │ ├── DeleteMessage.java │ │ │ │ │ │ │ │ ├── Command.java │ │ │ │ │ │ │ │ ├── Mycall.java │ │ │ │ │ │ │ │ ├── Routes.java │ │ │ │ │ │ │ │ ├── Disconnect.java │ │ │ │ │ │ │ │ ├── TXTail.java │ │ │ │ │ │ │ │ ├── TXDelay.java │ │ │ │ │ │ │ │ ├── SlotTime.java │ │ │ │ │ │ │ │ ├── Persistence.java │ │ │ │ │ │ │ │ └── FullDuplex.java │ │ │ │ │ │ │ │ └── Mode.java │ │ │ │ │ │ ├── remote │ │ │ │ │ │ │ ├── netrom │ │ │ │ │ │ │ │ ├── circuit │ │ │ │ │ │ │ │ │ ├── CircuitState.java │ │ │ │ │ │ │ │ │ └── CircuitException.java │ │ │ │ │ │ │ │ ├── opcodebeans │ │ │ │ │ │ │ │ │ ├── ProtocolExtension.java │ │ │ │ │ │ │ │ │ ├── Reset.java │ │ │ │ │ │ │ │ │ ├── DisconnectAcknowledge.java │ │ │ │ │ │ │ │ │ └── DisconnectRequest.java │ │ │ │ │ │ │ │ └── user │ │ │ │ │ │ │ │ │ └── parser │ │ │ │ │ │ │ │ │ ├── commands │ │ │ │ │ │ │ │ │ ├── Help.java │ │ │ │ │ │ │ │ │ ├── Bye.java │ │ │ │ │ │ │ │ │ ├── ColourToggle.java │ │ │ │ │ │ │ │ │ ├── Interfaces.java │ │ │ │ │ │ │ │ │ └── Command.java │ │ │ │ │ │ │ │ │ └── Mode.java │ │ │ │ │ │ │ └── pms │ │ │ │ │ │ │ │ ├── parser │ │ │ │ │ │ │ │ ├── commands │ │ │ │ │ │ │ │ │ ├── Help.java │ │ │ │ │ │ │ │ │ ├── Abort.java │ │ │ │ │ │ │ │ │ ├── ColourToggle.java │ │ │ │ │ │ │ │ │ ├── Bye.java │ │ │ │ │ │ │ │ │ ├── Command.java │ │ │ │ │ │ │ │ │ ├── Interfaces.java │ │ │ │ │ │ │ │ │ ├── MHeard.java │ │ │ │ │ │ │ │ │ └── UnHeard.java │ │ │ │ │ │ │ │ └── Mode.java │ │ │ │ │ │ │ │ └── PMSService.java │ │ │ │ │ │ ├── Service.java │ │ │ │ │ │ └── ServiceHandler.java │ │ │ │ │ ├── eventbus │ │ │ │ │ │ ├── events │ │ │ │ │ │ │ ├── BaseEvent.java │ │ │ │ │ │ │ ├── ConfigurationChangedEvent.java │ │ │ │ │ │ │ ├── DXSpotEvent.java │ │ │ │ │ │ │ ├── APRSPacketEvent.java │ │ │ │ │ │ │ ├── ConfigurationChangeCompleteEvent.java │ │ │ │ │ │ │ ├── HeardNodeEvent.java │ │ │ │ │ │ │ └── InvalidFrameEvent.java │ │ │ │ │ │ └── SingleThreadBus.java │ │ │ │ │ ├── annotations │ │ │ │ │ │ ├── NodeCommand.java │ │ │ │ │ │ ├── PMSCommand.java │ │ │ │ │ │ ├── TNCCommand.java │ │ │ │ │ │ └── InterfaceDriver.java │ │ │ │ │ ├── config │ │ │ │ │ │ ├── BadConfigException.java │ │ │ │ │ │ └── BeaconType.java │ │ │ │ │ ├── objects │ │ │ │ │ │ ├── InvalidMessageException.java │ │ │ │ │ │ ├── Priority.java │ │ │ │ │ │ └── dxcluster │ │ │ │ │ │ │ └── DXSpot.java │ │ │ │ │ ├── userinterface │ │ │ │ │ │ ├── TerminalHost.java │ │ │ │ │ │ └── stdinout │ │ │ │ │ │ │ └── StdTerminal.java │ │ │ │ │ ├── io │ │ │ │ │ │ ├── InterfaceStatus.java │ │ │ │ │ │ ├── StreamState.java │ │ │ │ │ │ └── Stream.java │ │ │ │ │ ├── statistics │ │ │ │ │ │ └── Statistics.java │ │ │ │ │ ├── protocols │ │ │ │ │ │ ├── core │ │ │ │ │ │ │ └── Capability.java │ │ │ │ │ │ ├── mqtt │ │ │ │ │ │ │ └── MQTTPacket.java │ │ │ │ │ │ ├── fbb │ │ │ │ │ │ │ └── FBBListener.java │ │ │ │ │ │ ├── dxcluster │ │ │ │ │ │ │ └── DXListener.java │ │ │ │ │ │ ├── aprs │ │ │ │ │ │ │ └── APRSListener.java │ │ │ │ │ │ ├── RoutingListener.java │ │ │ │ │ │ └── xrouter │ │ │ │ │ │ │ └── INP3RoutingTable.java │ │ │ │ │ ├── util │ │ │ │ │ │ ├── compression │ │ │ │ │ │ │ ├── deflate │ │ │ │ │ │ │ │ └── Dictionary.java │ │ │ │ │ │ │ └── deflatehuffman │ │ │ │ │ │ │ │ └── huffman │ │ │ │ │ │ │ │ ├── Node.java │ │ │ │ │ │ │ │ ├── Leaf.java │ │ │ │ │ │ │ │ └── InternalNode.java │ │ │ │ │ │ ├── UnTokenize.java │ │ │ │ │ │ └── LoopingCircularBuffer.java │ │ │ │ │ └── Messages.java │ │ │ │ │ └── ax25 │ │ │ │ │ ├── KissParameterType.java │ │ │ │ │ ├── KissParameter.java │ │ │ │ │ ├── util │ │ │ │ │ └── AX25Tools.java │ │ │ │ │ ├── AX25FrameListener.java │ │ │ │ │ ├── FrameListener.java │ │ │ │ │ ├── Scope.java │ │ │ │ │ ├── ConnStateChangeListener.java │ │ │ │ │ ├── AX25ParserWithDistributor.java │ │ │ │ │ ├── ParsedAX25MessageListener.java │ │ │ │ │ ├── ProtocolFamily.java │ │ │ │ │ ├── FrameState.java │ │ │ │ │ ├── AX25Parser.java │ │ │ │ │ ├── Transmitting.java │ │ │ │ │ ├── ConnectionRequestListener.java │ │ │ │ │ └── ConnectionEstablishmentListener.java │ │ │ └── module-info.java │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── prowl │ │ │ └── kisset │ │ │ ├── util │ │ │ └── ToolsTest.java │ │ │ └── protocols │ │ │ └── netrom │ │ │ └── NetRomRoutingPacketTest.java │ └── packaging │ │ ├── osx-jpackage.txt │ │ ├── linux-jpackage.txt │ │ ├── deb │ │ ├── control │ │ ├── postrm │ │ └── postinst │ │ ├── windows-jpackage.txt │ │ └── add-launch-to-msi.js ├── app-icon.icns ├── app-icon.ico ├── app-icon.png ├── lib │ └── org │ │ └── prowl │ │ └── aprslib │ │ └── 1.0.0 │ │ ├── aprslib-1.0.0.jar │ │ └── aprslib-1.0.0.pom └── .gitignore ├── doc └── screen2.png ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── .idea ├── vcs.xml ├── .gitignore ├── misc.xml └── encodings.xml ├── .github ├── dependabot.yml └── workflows │ └── build.yml ├── pom.xml ├── .gitignore └── README.md /KISSetGUI/src/main/resources/messages_us.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/messages_us.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /doc/screen2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/doc/screen2.png -------------------------------------------------------------------------------- /KISSetGUI/app-icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/app-icon.ico -------------------------------------------------------------------------------- /KISSetGUI/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/app-icon.png -------------------------------------------------------------------------------- /KISSetGUI/app-icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/app-icon.icns -------------------------------------------------------------------------------- /KISSetMain/app-icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetMain/app-icon.icns -------------------------------------------------------------------------------- /KISSetMain/app-icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetMain/app-icon.ico -------------------------------------------------------------------------------- /KISSetMain/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetMain/app-icon.png -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/commons-logging.properties: -------------------------------------------------------------------------------- 1 | org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog 2 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/commons-logging.properties: -------------------------------------------------------------------------------- 1 | org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog 2 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/fonts/bedstead/bedstead.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/src/main/resources/fonts/bedstead/bedstead.otf -------------------------------------------------------------------------------- /KISSetMain/lib/org/prowl/aprslib/1.0.0/aprslib-1.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetMain/lib/org/prowl/aprslib/1.0.0/aprslib-1.0.0.jar -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/simplelog.properties: -------------------------------------------------------------------------------- 1 | org.apache.commons.logging.simplelog.defaultlog=debug 2 | org.apache.commons.logging.simplelog.showdatetime=true 3 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/simplelog.properties: -------------------------------------------------------------------------------- 1 | org.apache.commons.logging.simplelog.defaultlog=debug 2 | org.apache.commons.logging.simplelog.showdatetime=true 3 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/build-info/build-info.properties: -------------------------------------------------------------------------------- 1 | build.architecture=${os.detected.classifier} 2 | build.timestamp=${maven.build.timestamp} 3 | build.arch=${os.detected.arch} -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/ClientHandler.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services; 2 | 3 | public interface ClientHandler { 4 | 5 | void start(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/build-info/build-info.properties: -------------------------------------------------------------------------------- 1 | build.architecture=${os.detected.classifier} 2 | build.timestamp=${maven.build.timestamp} 3 | build.arch=${os.detected.arch} -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/version.txt: -------------------------------------------------------------------------------- 1 | ${maven.build.timestamp} 2 | ${env.GITHUB_RUN_NUMBER} 3 | ${env.GITHUB_RUN_ID} 4 | ${env.GITHUB_RUN_ATTEMPT} 5 | ${env.GITHUB_WORKFLOW} 6 | ${env.RUNNER_ARCH} -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/version.txt: -------------------------------------------------------------------------------- 1 | ${maven.build.timestamp} 2 | ${env.GITHUB_RUN_NUMBER} 3 | ${env.GITHUB_RUN_ID} 4 | ${env.GITHUB_RUN_ATTEMPT} 5 | ${env.GITHUB_WORKFLOW} 6 | ${env.RUNNER_ARCH} -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/img/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/img/icon.png -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/aprs0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/aprs0.png -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/aprs1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/aprs1.png -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/aprs2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/aprs2.png -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/icon.png -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/eventbus/events/BaseEvent.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.eventbus.events; 2 | 3 | public class BaseEvent { 4 | 5 | public BaseEvent() { 6 | 7 | } 8 | 9 | 10 | } -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/img/tray-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/img/tray-black.png -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/img/tray-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/img/tray-white.png -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/tray-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/tray-black.png -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/tray-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/img/tray-white.png -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/fx/about/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/fx/about/app-icon.png -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/fx/about/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piemmm/KISSet/HEAD/KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/fx/about/app-icon.png -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/host/parser/ExtensionState.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.host.parser; 2 | 3 | public enum ExtensionState { 4 | 5 | NONE, 6 | NEGOTIATING, 7 | NOT_SUPPORTED, 8 | ENABLED 9 | 10 | } 11 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/netrom/circuit/CircuitState.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.netrom.circuit; 2 | 3 | public enum CircuitState { 4 | CONNECTING, 5 | CONNECTED, 6 | DISCONNECTING, 7 | DISCONNECTED; 8 | } 9 | -------------------------------------------------------------------------------- /KISSetGUI/src/packaging/deb/kisset-gui.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=KISSet 3 | Comment=KISSet 4 | Exec=/opt/kisset-gui/bin/kisset-gui 5 | Icon=/opt/kisset-gui/lib/kisset-gui.png 6 | Terminal=false 7 | Type=Application 8 | Categories=Network;HamRadio 9 | MimeType= 10 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/eventbus/events/ConfigurationChangedEvent.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.eventbus.events; 2 | 3 | public class ConfigurationChangedEvent extends BaseEvent { 4 | 5 | public ConfigurationChangedEvent() { 6 | 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/annotations/NodeCommand.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.annotations; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface NodeCommand { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/annotations/PMSCommand.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.annotations; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface PMSCommand { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/annotations/TNCCommand.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.annotations; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface TNCCommand { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/netrom/circuit/CircuitException.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.netrom.circuit; 2 | 3 | public class CircuitException extends Exception { 4 | 5 | public CircuitException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/config/BadConfigException.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.config; 2 | 3 | import java.io.IOException; 4 | 5 | public class BadConfigException extends IOException { 6 | 7 | public BadConfigException(String message) { 8 | super(message); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/objects/InvalidMessageException.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.objects; 2 | 3 | public class InvalidMessageException extends Exception { 4 | 5 | public InvalidMessageException(String message, Throwable e) { 6 | super(message, e); 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/userinterface/TerminalHost.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.userinterface; 2 | 3 | public interface TerminalHost { 4 | 5 | Object getTerminal(); 6 | 7 | void setTerminal(Object terminal); 8 | 9 | void setStatus(String statusText, int currentStream); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/netrom/opcodebeans/ProtocolExtension.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.netrom.opcodebeans; 2 | 3 | /** 4 | * Protocol extension - unknown opcode at the moment except it can be used for some form of IP encap, 5 | * and Xrouter seems to do things with it as well (NCMP)? 6 | */ 7 | public class ProtocolExtension { 8 | } 9 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/annotations/InterfaceDriver.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.annotations; 2 | 3 | 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | @Retention(RetentionPolicy.RUNTIME) 8 | public @interface InterfaceDriver { 9 | 10 | String name(); 11 | 12 | String description(); 13 | 14 | String uiName(); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/config/tidy.xslt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/config/config-default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/config/config-default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/java/org/prowl/maps/Point.java: -------------------------------------------------------------------------------- 1 | package org.prowl.maps; 2 | 3 | public final class Point { 4 | 5 | public double x; 6 | public double y; 7 | 8 | public Point() { 9 | 10 | } 11 | 12 | public Point(double x, double y) { 13 | this.x = x; 14 | this.y = y; 15 | } 16 | 17 | public void set(double x, double y) { 18 | this.x = x; 19 | this.y = y; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/eventbus/events/DXSpotEvent.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.eventbus.events; 2 | 3 | 4 | import org.prowl.kisset.objects.dxcluster.DXSpot; 5 | 6 | public class DXSpotEvent extends BaseEvent { 7 | 8 | DXSpot dxSpot; 9 | 10 | public DXSpotEvent(DXSpot dxSpot) { 11 | this.dxSpot = dxSpot; 12 | } 13 | 14 | public DXSpot getDxSpot() { 15 | return dxSpot; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /KISSetGUI/src/packaging/osx-jpackage.txt: -------------------------------------------------------------------------------- 1 | --name ${app.name} 2 | --icon "${project.basedir}/app-icon.icns" 3 | --dest "${project.build.directory}/../../target" 4 | --main-jar ${project.build.finalName}.jar 5 | --main-class ${main-class} 6 | --java-options "-Xmaxf0.1 -Xminf0.01" 7 | --input "${project.build.directory}/dependency" 8 | --app-version ${app.version} 9 | --runtime-image "${project.build.directory}/jvm-image" 10 | --temp "${project.build.directory}/installer-main-work" 11 | ${macos.sign} 12 | ${macos.sign.identity} 13 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/eventbus/events/APRSPacketEvent.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.eventbus.events; 2 | 3 | 4 | import org.prowl.aprslib.parser.APRSPacket; 5 | 6 | public class APRSPacketEvent extends BaseEvent { 7 | 8 | private final APRSPacket aprsPacket; 9 | 10 | public APRSPacketEvent(APRSPacket aprsPacket) { 11 | this.aprsPacket = aprsPacket; 12 | 13 | } 14 | 15 | public APRSPacket getAprsPacket() { 16 | return aprsPacket; 17 | } 18 | 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/java/org/prowl/kissetgui/userinterface/desktop/terminals/Terminal.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kissetgui.userinterface.desktop.terminals; 2 | 3 | import javafx.scene.Node; 4 | import javafx.scene.text.Font; 5 | 6 | public interface Terminal { 7 | 8 | void append(int i); 9 | 10 | void clearSelection(); 11 | 12 | void copySelectedTextToClipboard(); 13 | 14 | boolean hasSelectedArea(); 15 | 16 | void setFont(Font f); 17 | 18 | Node getNode(); 19 | 20 | String getName(); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /KISSetMain/src/packaging/osx-jpackage.txt: -------------------------------------------------------------------------------- 1 | --name ${app.name} 2 | --icon "${project.basedir}/app-icon.icns" 3 | --dest "${project.build.directory}/../../target" 4 | --main-jar ${project.build.finalName}.jar 5 | --main-class ${main-class} 6 | --java-options "-Xmaxf0.1 -Xminf0.01" 7 | --input "${project.build.directory}/dependency" 8 | --app-version ${app.version} 9 | --runtime-image "${project.build.directory}/jvm-image" 10 | --temp "${project.build.directory}/installer-main-work" 11 | ${macos.sign} 12 | ${macos.sign.identity} 13 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/eventbus/events/ConfigurationChangeCompleteEvent.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.eventbus.events; 2 | 3 | public class ConfigurationChangeCompleteEvent extends BaseEvent { 4 | 5 | boolean interfacesWereChanged = false; 6 | public ConfigurationChangeCompleteEvent(boolean interfacesWereChanged) { 7 | this.interfacesWereChanged = interfacesWereChanged; 8 | } 9 | 10 | public boolean interfacesWereChanged() { 11 | return interfacesWereChanged; 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/objects/Priority.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.objects; 2 | 3 | /** 4 | * Priorities ensure that time critical messages have a better chance of being 5 | * delivered quickly through the node network. Packets with high priority are 6 | * permitted to jump any queues and be propagated sooner. 7 | */ 8 | public enum Priority { 9 | 10 | 11 | HIGH, // things like chat 12 | MEDIUM, // APRS and things that are not as important as chat 13 | LOW // background message sync 14 | 15 | 16 | } 17 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "maven" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/ax25/KissParameterType.java: -------------------------------------------------------------------------------- 1 | package org.prowl.ax25; 2 | 3 | 4 | /** 5 | * Enum containing a list of KISS parameters 6 | */ 7 | public enum KissParameterType { 8 | TXDELAY(0x01), 9 | PERSISTENCE(0x02), 10 | SLOT_TIME(0x03), 11 | TX_TAIL(0x04), 12 | FULL_DUPLEX(0x05), 13 | SET_HARDWARE(0x06), 14 | RETURN(0xFF); 15 | private final int value; 16 | 17 | KissParameterType(int value) { 18 | this.value = value; 19 | } 20 | 21 | public int getValue() { 22 | return value; 23 | } 24 | } -------------------------------------------------------------------------------- /KISSetGUI/src/packaging/linux-jpackage.txt: -------------------------------------------------------------------------------- 1 | --name kisset-gui 2 | --icon "${project.basedir}/app-icon.png" 3 | --dest "${project.build.directory}/../../target" 4 | --main-jar ${project.build.finalName}.jar 5 | --main-class ${main-class} 6 | --java-options "-Xmaxf0.1 -Xminf0.01" 7 | --resource-dir "${project.build.directory}/packaging/deb" 8 | --input "${project.build.directory}/dependency" 9 | --app-version ${app.version} 10 | --runtime-image "${project.build.directory}/jvm-image" 11 | --temp "${project.build.directory}/installer-main-work" 12 | --linux-shortcut 13 | --linux-menu-group Network;HamRadio 14 | -------------------------------------------------------------------------------- /KISSetMain/src/packaging/linux-jpackage.txt: -------------------------------------------------------------------------------- 1 | --name kisset 2 | --icon "${project.basedir}/app-icon.png" 3 | --dest "${project.build.directory}/../../target" 4 | --main-jar ${project.build.finalName}.jar 5 | --main-class ${main-class} 6 | --java-options "-Xmaxf0.1 -Xminf0.01" 7 | --resource-dir "${project.build.directory}/packaging/deb" 8 | --input "${project.build.directory}/dependency" 9 | --app-version ${app.version} 10 | --runtime-image "${project.build.directory}/jvm-image" 11 | --temp "${project.build.directory}/installer-main-work" 12 | --linux-shortcut 13 | --linux-menu-group Network;HamRadio 14 | 15 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/io/InterfaceStatus.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.io; 2 | 3 | public class InterfaceStatus { 4 | 5 | private final State state; 6 | private final String message; 7 | 8 | public InterfaceStatus(State state, String message) { 9 | this.state = state; 10 | this.message = message; 11 | } 12 | 13 | public String getMessage() { 14 | return message; 15 | } 16 | 17 | public State getState() { 18 | return state; 19 | } 20 | 21 | public enum State { 22 | UP, 23 | DOWN, 24 | FAULTED; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/eventbus/events/HeardNodeEvent.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.eventbus.events; 2 | 3 | 4 | import org.prowl.kisset.protocols.core.Node; 5 | import org.prowl.kisset.util.Tools; 6 | 7 | public class HeardNodeEvent extends BaseEvent { 8 | 9 | private final Node node; 10 | 11 | public HeardNodeEvent(Node node) { 12 | this.node = node; 13 | } 14 | 15 | public Node getNode() { 16 | return node; 17 | } 18 | 19 | public boolean isValidPacket() { 20 | return node.getFrame().isValid() && Tools.isAlphaNumeric(node.getCallsign()); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/statistics/Statistics.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.statistics; 2 | 3 | import org.prowl.kisset.statistics.types.MHeard; 4 | import org.prowl.kisset.statistics.types.UnHeard; 5 | 6 | 7 | public class Statistics { 8 | 9 | private final MHeard mHeard; 10 | private final UnHeard unHeard; 11 | 12 | public Statistics() { 13 | 14 | mHeard = new MHeard(); 15 | unHeard = new UnHeard(); 16 | 17 | } 18 | 19 | public MHeard getHeard() { 20 | return mHeard; 21 | } 22 | 23 | public UnHeard getUnHeard() { 24 | return unHeard; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.prowl 8 | kisset 9 | 1.0-SNAPSHOT 10 | KISSet 11 | 12 | pom 13 | 14 | 15 | KISSetMain 16 | KISSetGUI 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /KISSetMain/lib/org/prowl/aprslib/1.0.0/aprslib-1.0.0.pom: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | org.prowl 6 | aprslib 7 | jar 8 | 1.0.0 9 | ARPSlib 10 | https://github.com/piemmm/APRSlib 11 | Improved, forked APRS library 12 | -------------------------------------------------------------------------------- /KISSetMain/src/main/test/java/org/prowl/kisset/util/ToolsTest.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.util; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.prowl.kisset.util.Tools; 5 | 6 | import static org.junit.jupiter.api.Assertions.assertEquals; 7 | 8 | public class ToolsTest { 9 | 10 | @Test 11 | public void testLocator() { 12 | assertEquals("JN58TD", Tools.toLocator(48.14666, 11.60833)); 13 | assertEquals("GF15VC", Tools.toLocator(-34.91, -56.21166)); 14 | assertEquals("FM18LW", Tools.toLocator(38.92, -77.065)); 15 | assertEquals("RE78IR", Tools.toLocator(-41.28333, 174.745)); 16 | } 17 | 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /KISSetMain/src/packaging/deb/control: -------------------------------------------------------------------------------- 1 | Package: kisset 2 | Version: ${app.version} 3 | Section: hamradio 4 | Maintainer: Ian Hawkins 5 | Priority: optional 6 | Architecture: ${app.arch} 7 | Provides: kisset 8 | Depends: libbz2-1.0, libc6, libcap2, libcom-err2, libdbus-1-3, libexpat1, libgcc-s1, libgpg-error0, libkeyutils1, liblzma5, libselinux1, zlib1g 9 | Installed-Size: 238200 10 | Homepage: http://prowl.org/kisset 11 | Description: AX.25 terminal program for devices that support the KISS protocol. 12 | This is a hamradio specific terminal package for driving KISS 13 | compatible modems such as the NinoTNC, Kenwood TH-D74 as well 14 | as other TNCs that support KISS -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/io/StreamState.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.io; 2 | 3 | /** 4 | * A stream state represents the state of the connection on a paticular interface (or stream on that interface) 5 | * at a given time. 6 | */ 7 | public enum StreamState { 8 | 9 | // Connected to a remote station and are conversing with it 10 | CONNECTED, 11 | 12 | // We are disconnected from the remote station and are not connecting. 13 | DISCONNECTED, 14 | 15 | // We are trying to connect to a remote station. 16 | CONNECTING, 17 | 18 | // In a connected state, but we are requesting a graceful disconnect 19 | DISCONNECTING 20 | 21 | 22 | } 23 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/fx/DXController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 |
9 | 10 | 11 |
12 |
13 |
14 |
15 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/fx/DXController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 |
9 | 10 | 11 |
12 |
13 |
14 |
15 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/fx/FBBController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 |
9 | 10 | 11 |
12 |
13 |
14 |
15 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/fx/FBBController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 |
9 | 10 | 11 |
12 |
13 |
14 |
15 | -------------------------------------------------------------------------------- /KISSetGUI/.gitignore: -------------------------------------------------------------------------------- 1 | ../target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### IntelliJ IDEA ### 7 | .idea/modules.xml 8 | .idea/jarRepositories.xml 9 | .idea/compiler.xml 10 | .idea/libraries/ 11 | *.iws 12 | *.iml 13 | *.ipr 14 | 15 | ### Eclipse ### 16 | .apt_generated 17 | .classpath 18 | .factorypath 19 | .project 20 | .settings 21 | .springBeans 22 | .sts4-cache 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | build/ 31 | !**/src/main/**/build/ 32 | !**/src/test/**/build/ 33 | 34 | ### VS Code ### 35 | .vscode/ 36 | 37 | ### Mac OS ### 38 | .DS_Store 39 | /target/ 40 | -------------------------------------------------------------------------------- /KISSetMain/.gitignore: -------------------------------------------------------------------------------- 1 | ../target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### IntelliJ IDEA ### 7 | .idea/modules.xml 8 | .idea/jarRepositories.xml 9 | .idea/compiler.xml 10 | .idea/libraries/ 11 | *.iws 12 | *.iml 13 | *.ipr 14 | 15 | ### Eclipse ### 16 | .apt_generated 17 | .classpath 18 | .factorypath 19 | .project 20 | .settings 21 | .springBeans 22 | .sts4-cache 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | build/ 31 | !**/src/main/**/build/ 32 | !**/src/test/**/build/ 33 | 34 | ### VS Code ### 35 | .vscode/ 36 | 37 | ### Mac OS ### 38 | .DS_Store 39 | /target/ 40 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/eventbus/SingleThreadBus.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.eventbus; 2 | 3 | import com.google.common.eventbus.EventBus; 4 | import org.prowl.kisset.eventbus.events.BaseEvent; 5 | 6 | /** 7 | * Simple event bus 8 | */ 9 | public enum SingleThreadBus { 10 | 11 | INSTANCE; 12 | 13 | private final EventBus eventBus = new EventBus(); 14 | 15 | public final void post(final BaseEvent event) { 16 | eventBus.post(event); 17 | } 18 | 19 | public final void register(final Object o) { 20 | eventBus.register(o); 21 | } 22 | 23 | public final void unregister(final Object o) { 24 | eventBus.unregister(o); 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /KISSetGUI/src/packaging/deb/control: -------------------------------------------------------------------------------- 1 | Package: kisset-gui 2 | Version: ${app.version} 3 | Section: hamradio 4 | Maintainer: Ian Hawkins 5 | Priority: optional 6 | Architecture: ${app.arch} 7 | Provides: kisset-gui 8 | Depends: libbz2-1.0, libc6, libcap2, libcom-err2, libdbus-1-3, libexpat1, libgcc-s1, libgpg-error0, libkeyutils1, liblzma5, libselinux1, xdg-utils, zlib1g, extra-xdg-menus 9 | Installed-Size: 238200 10 | Homepage: http://prowl.org/kisset 11 | Description: AX.25 GUI terminal program for devices that support the KISS protocol 12 | This is a hamradio specific terminal package for driving KISS 13 | compatible modems such as the NinoTNC, Kenwood TH-D74 as well 14 | as other TNCs that support KISS -------------------------------------------------------------------------------- /KISSetGUI/src/packaging/windows-jpackage.txt: -------------------------------------------------------------------------------- 1 | --type msi 2 | --name ${app.name} 3 | --win-menu 4 | --win-menu-group HamRadio 5 | --win-console 6 | --vendor ${windows.vendor} 7 | --icon "${project.basedir}/app-icon.ico" 8 | --dest "${project.build.directory}/../../target" 9 | --main-jar ${project.build.finalName}.jar 10 | --main-class ${main-class} 11 | --java-options "-Xmaxf0.1 -Xminf0.01" 12 | --input "${project.build.directory}/dependency" 13 | --app-version ${app.version} 14 | --runtime-image "${project.build.directory}/jvm-image" 15 | --temp "${project.build.directory}/installer-main-work" 16 | --win-upgrade-uuid ${windows.upgrade.uuid} 17 | --description "${project.description}" 18 | --copyright "(C) ${windows.vendor}" 19 | -------------------------------------------------------------------------------- /KISSetMain/src/packaging/windows-jpackage.txt: -------------------------------------------------------------------------------- 1 | --type msi 2 | --name ${app.name} 3 | --win-menu 4 | --win-menu-group HamRadio 5 | --win-console 6 | --vendor ${windows.vendor} 7 | --icon "${project.basedir}/app-icon.ico" 8 | --dest "${project.build.directory}/../../target" 9 | --main-jar ${project.build.finalName}.jar 10 | --main-class ${main-class} 11 | --java-options "-Xmaxf0.1 -Xminf0.01" 12 | --input "${project.build.directory}/dependency" 13 | --app-version ${app.version} 14 | --runtime-image "${project.build.directory}/jvm-image" 15 | --temp "${project.build.directory}/installer-main-work" 16 | --win-upgrade-uuid ${windows.upgrade.uuid} 17 | --description "${project.description}" 18 | --copyright "(C) ${windows.vendor}" 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ../target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### IntelliJ IDEA ### 7 | .idea/modules.xml 8 | .idea/jarRepositories.xml 9 | .idea/compiler.xml 10 | .idea/libraries/ 11 | *.iws 12 | *.iml 13 | *.ipr 14 | 15 | ### Eclipse ### 16 | .apt_generated 17 | .classpath 18 | .factorypath 19 | .project 20 | .settings 21 | .springBeans 22 | .sts4-cache 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | build/ 31 | !**/src/main/**/build/ 32 | !**/src/test/**/build/ 33 | 34 | ### VS Code ### 35 | .vscode/ 36 | 37 | ### Mac OS ### 38 | .DS_Store 39 | /target/ 40 | /KISSetMain/target/ 41 | /KISSetGUI/target/ 42 | /target/ 43 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/eventbus/events/InvalidFrameEvent.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.eventbus.events; 2 | 3 | import org.prowl.ax25.BasicTransmittingConnector; 4 | 5 | /** 6 | * Represents an invalid AX.25/KISS frame being received. 7 | */ 8 | public class InvalidFrameEvent extends BaseEvent { 9 | 10 | /** 11 | * The invalid data. 12 | */ 13 | public final byte[] invalidData; 14 | 15 | /** 16 | * The connector that received the invalid data. 17 | */ 18 | public final BasicTransmittingConnector connector; 19 | 20 | public InvalidFrameEvent(byte[] invalidData, BasicTransmittingConnector connector) { 21 | this.invalidData = invalidData; 22 | this.connector = connector; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/fx/AboutController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 |
11 | 12 |
13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/fx/AboutController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 |
11 | 12 |
13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/host/parser/commands/Help.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.host.parser.commands; 2 | 3 | import org.prowl.kisset.Messages; 4 | import org.prowl.kisset.annotations.TNCCommand; 5 | import org.prowl.kisset.services.host.parser.Mode; 6 | 7 | import java.io.IOException; 8 | 9 | /** 10 | * Help for commands in CMD mode only 11 | */ 12 | @TNCCommand 13 | public class Help extends Command { 14 | 15 | @Override 16 | public boolean doCommand(String[] data) throws IOException { 17 | if (!getMode().equals(Mode.CMD)) { 18 | return false; 19 | } 20 | 21 | writeToTerminal(CR); 22 | writeToTerminal(Messages.get("help") + CR); 23 | return true; 24 | } 25 | 26 | @Override 27 | public String[] getCommandNames() { 28 | return new String[]{"help", "?", "h"}; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/pms/parser/commands/Help.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.pms.parser.commands; 2 | 3 | import org.prowl.kisset.Messages; 4 | import org.prowl.kisset.annotations.PMSCommand; 5 | import org.prowl.kisset.services.remote.pms.parser.Mode; 6 | 7 | import java.io.IOException; 8 | 9 | /** 10 | * Help for commands in CMD mode only 11 | */ 12 | @PMSCommand 13 | public class Help extends Command { 14 | 15 | @Override 16 | public boolean doCommand(String[] data) throws IOException { 17 | if (!getMode().equals(Mode.CMD)) { 18 | return false; 19 | } 20 | 21 | write(CR); 22 | write(Messages.get("pms_help") + CR); 23 | return true; 24 | } 25 | 26 | @Override 27 | public String[] getCommandNames() { 28 | return new String[]{"help", "?", "h"}; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/netrom/user/parser/commands/Help.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.netrom.user.parser.commands; 2 | 3 | import org.prowl.kisset.Messages; 4 | import org.prowl.kisset.annotations.NodeCommand; 5 | import org.prowl.kisset.services.remote.netrom.user.parser.Mode; 6 | 7 | 8 | import java.io.IOException; 9 | 10 | /** 11 | * Help for commands in CMD mode only 12 | */ 13 | @NodeCommand 14 | public class Help extends Command { 15 | 16 | @Override 17 | public boolean doCommand(String[] data) throws IOException { 18 | if (!getMode().equals(Mode.CMD)) { 19 | return false; 20 | } 21 | 22 | write(CR); 23 | write(Messages.get("node_help") + CR); 24 | return true; 25 | } 26 | 27 | @Override 28 | public String[] getCommandNames() { 29 | return new String[]{"help", "?", "h"}; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/protocols/core/Capability.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.protocols.core; 2 | 3 | /** 4 | * Reference to what services this node is running and when that service was last seen so it can be expired; 5 | */ 6 | public class Capability { 7 | private final Node.Service service; 8 | private long lastSeen; 9 | 10 | public Capability(Node.Service service, long lastSeen) { 11 | this.service = service; 12 | this.lastSeen = lastSeen; 13 | } 14 | 15 | public Capability(Node.Service service) { 16 | this.service = service; 17 | this.lastSeen = System.currentTimeMillis(); 18 | } 19 | 20 | public Node.Service getService() { 21 | return service; 22 | } 23 | 24 | public long getLastSeen() { 25 | return lastSeen; 26 | } 27 | 28 | public void setLastSeen(long lastSeen) { 29 | this.lastSeen = lastSeen; 30 | } 31 | } -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/util/compression/deflate/Dictionary.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.util.compression.deflate; 2 | 3 | public class Dictionary { 4 | 5 | private static final int DICTIONARY_SIZE = 32768; 6 | 7 | private final byte[] dictionary; 8 | private int position; 9 | 10 | public Dictionary() { 11 | dictionary = new byte[DICTIONARY_SIZE]; 12 | } 13 | 14 | public void addToDictionary(byte[] array, int offset, int length) { 15 | // Add to the dictionary, byte walking and loop around when we get to the end 16 | for (int i = 0; i < length; i++) { 17 | dictionary[position] = array[offset + i]; 18 | position++; 19 | if (position >= dictionary.length) { 20 | position = 0; 21 | } 22 | } 23 | 24 | } 25 | 26 | public byte[] getDictionary() { 27 | return dictionary; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/fx/MonitorController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
10 | 11 | 12 |
13 | 14 | 16 | 17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/fx/MonitorController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
10 | 11 | 12 |
13 | 14 | 16 | 17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/pms/parser/commands/Abort.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.pms.parser.commands; 2 | 3 | 4 | import org.prowl.kisset.Messages; 5 | import org.prowl.kisset.annotations.PMSCommand; 6 | import org.prowl.kisset.services.remote.pms.parser.Mode; 7 | import org.prowl.kisset.util.ANSI; 8 | 9 | import java.io.IOException; 10 | 11 | @PMSCommand 12 | public class Abort extends Command { 13 | 14 | @Override 15 | public boolean doCommand(String[] data) throws IOException { 16 | 17 | 18 | if (getMode().equals(Mode.MESSAGE_LIST_PAGINATION) || getMode().equals(Mode.MESSAGE_READ_PAGINATION)) { 19 | write(ANSI.BOLD + Messages.get("abortMessageList") + ANSI.NORMAL + CR); 20 | popModeFromStack(); 21 | return true; 22 | } 23 | return false; 24 | } 25 | 26 | @Override 27 | public String[] getCommandNames() { 28 | return new String[]{"abort", "a"}; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/fx/TerminalController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | 13 | 14 |
15 | 16 | 17 | 18 |
19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/fx/TerminalController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | 13 | 14 |
15 | 16 | 17 | 18 |
19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /KISSetMain/src/packaging/deb/postrm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # postrm script for kisset 3 | # 4 | # see: dh_installdeb(1) 5 | SYMLINK="/usr/bin/kisset" 6 | 7 | set -e 8 | 9 | # summary of how this script can be called: 10 | # * `remove' 11 | # * `purge' 12 | # * `upgrade' 13 | # * `failed-upgrade' 14 | # * `abort-install' 15 | # * `abort-install' 16 | # * `abort-upgrade' 17 | # * `disappear' 18 | # 19 | # for details, see https://www.debian.org/doc/debian-policy/ or 20 | # the debian-policy package 21 | 22 | case "$1" in 23 | purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) 24 | rm /usr/bin/kisset 25 | 26 | 27 | ;; 28 | 29 | *) 30 | echo "postrm called with unknown argument \`$1'" >&2 31 | exit 1 32 | ;; 33 | esac 34 | 35 | exit 0 36 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/java/org/prowl/kissetgui/guiconfig/OSDefaults.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kissetgui.guiconfig; 2 | 3 | 4 | import javafx.scene.text.Font; 5 | import org.controlsfx.tools.Platform; 6 | 7 | import java.util.List; 8 | 9 | public class OSDefaults { 10 | 11 | 12 | public static final String getDefaultPlatformFont() { 13 | 14 | List fontFamilies = Font.getFamilies(); 15 | List fontNames = Font.getFontNames(); 16 | 17 | 18 | String font = "Monospace"; 19 | 20 | Platform current = Platform.getCurrent(); 21 | if (current.equals(Platform.WINDOWS)) { 22 | font = "Consolas"; 23 | } else if (current.equals(Platform.OSX)) { 24 | font = "Monaco"; 25 | } else if (current.equals(Platform.UNIX)) { 26 | if (fontFamilies.contains("Hack")) { 27 | font = "Hack"; 28 | } else { 29 | font = "Monospace"; 30 | } 31 | } 32 | 33 | return font; 34 | } 35 | 36 | 37 | } 38 | -------------------------------------------------------------------------------- /KISSetGUI/src/packaging/deb/postrm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # postrm script for kisset-gui 3 | # 4 | # see: dh_installdeb(1) 5 | SYMLINK="/usr/bin/kisset-gui" 6 | 7 | set -e 8 | 9 | # summary of how this script can be called: 10 | # * `remove' 11 | # * `purge' 12 | # * `upgrade' 13 | # * `failed-upgrade' 14 | # * `abort-install' 15 | # * `abort-install' 16 | # * `abort-upgrade' 17 | # * `disappear' 18 | # 19 | # for details, see https://www.debian.org/doc/debian-policy/ or 20 | # the debian-policy package 21 | 22 | case "$1" in 23 | purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) 24 | rm /usr/bin/kisset-gui 25 | 26 | 27 | ;; 28 | 29 | *) 30 | echo "postrm called with unknown argument \`$1'" >&2 31 | exit 1 32 | ;; 33 | esac 34 | 35 | exit 0 36 | -------------------------------------------------------------------------------- /KISSetGUI/src/packaging/deb/prerm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # prerm script for kisset-gui 3 | # 4 | # see: dh_installdeb(1) 5 | 6 | set -e 7 | 8 | # summary of how this script can be called: 9 | # * `remove' 10 | # * `upgrade' 11 | # * `failed-upgrade' 12 | # * `remove' `in-favour' 13 | # * `deconfigure' `in-favour' 14 | # `removing' 15 | # 16 | # for details, see https://www.debian.org/doc/debian-policy/ or 17 | # the debian-policy package 18 | 19 | 20 | package_type=deb 21 | 22 | 23 | 24 | case "$1" in 25 | remove|upgrade|deconfigure) 26 | xdg-desktop-menu uninstall /opt/kisset-gui/lib/kisset-gui-kisset-gui.desktop 27 | 28 | ;; 29 | 30 | failed-upgrade) 31 | ;; 32 | 33 | *) 34 | echo "prerm called with unknown argument \`$1'" >&2 35 | exit 1 36 | ;; 37 | esac 38 | 39 | exit 0 40 | -------------------------------------------------------------------------------- /KISSetMain/src/packaging/deb/postinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # postinst script for kisset 3 | # 4 | # see: dh_installdeb(1) 5 | 6 | set -e 7 | 8 | # summary of how this script can be called: 9 | # * `configure' 10 | # * `abort-upgrade' 11 | # * `abort-remove' `in-favour' 12 | # 13 | # * `abort-remove' 14 | # * `abort-deconfigure' `in-favour' 15 | # `removing' 16 | # 17 | # for details, see https://www.debian.org/doc/debian-policy/ or 18 | # the debian-policy package 19 | 20 | package_type=deb 21 | 22 | 23 | case "$1" in 24 | configure) 25 | ln -s /opt/kisset/bin/kisset /usr/bin/kisset 26 | 27 | ;; 28 | 29 | abort-upgrade|abort-remove|abort-deconfigure) 30 | ;; 31 | 32 | *) 33 | echo "postinst called with unknown argument \`$1'" >&2 34 | exit 1 35 | ;; 36 | esac 37 | 38 | exit 0 39 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/netrom/opcodebeans/Reset.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.netrom.opcodebeans; 2 | 3 | import org.prowl.ax25.AX25Callsign; 4 | import org.prowl.kisset.protocols.netrom.NetROMPacket; 5 | 6 | /** 7 | * Undocumented reset - operation inferred from linux sources. 8 | */ 9 | public class Reset { 10 | 11 | private NetROMPacket netROMPacket; 12 | 13 | public Reset(NetROMPacket packet) { 14 | this.netROMPacket = packet; 15 | } 16 | 17 | public int getYourCircuitIndex() { 18 | return netROMPacket.getCircuitIndex(); 19 | } 20 | 21 | public int getYourCircuitID() { 22 | return netROMPacket.getCircuitId(); 23 | } 24 | 25 | public int getOpcode() { 26 | return netROMPacket.getOpCode(); 27 | } 28 | 29 | 30 | public AX25Callsign getSourceCallsign() { 31 | return new AX25Callsign(netROMPacket.getOriginCallsign()); 32 | } 33 | 34 | public AX25Callsign getDestinationCallsign() { 35 | return new AX25Callsign(netROMPacket.getDestinationCallsign()); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build and Sign macOS 2 | on: 3 | push: 4 | tags: 5 | - '*' 6 | jobs: 7 | macos: 8 | runs-on: macos-11.0 9 | steps: 10 | - uses: actions/checkout@v2 11 | 12 | # Install dependencies and build you app here # 13 | # - name: Build executable 14 | # run: --- 15 | 16 | - name: Codesign executable 17 | env: 18 | MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }} 19 | MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }} 20 | run: | 21 | echo $MACOS_CERTIFICATE | base64 —decode > certificate.p12 22 | security create-keychain -p build.keychain 23 | security default-keychain -s build.keychain 24 | security unlock-keychain -p build.keychain 25 | security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PWD -T /usr/bin/codesign 26 | security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k build.keychain 27 | /usr/bin/codesign --force -s ./path/to/you/app -v 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/ax25/KissParameter.java: -------------------------------------------------------------------------------- 1 | package org.prowl.ax25; 2 | 3 | 4 | import java.util.Objects; 5 | 6 | /** 7 | * Holds a KISS parameter and it's data 8 | */ 9 | public class KissParameter { 10 | 11 | int[] data; 12 | KissParameterType parameter; 13 | 14 | public KissParameter(KissParameterType parameter, int[] data) { 15 | this.parameter = parameter; 16 | this.data = data; 17 | } 18 | 19 | public KissParameter(KissParameterType parameter, int data) { 20 | this.parameter = parameter; 21 | this.data = new int[]{data}; 22 | } 23 | 24 | public int[] getData() { 25 | return data; 26 | } 27 | 28 | public KissParameterType getParameter() { 29 | return parameter; 30 | } 31 | 32 | @Override 33 | public boolean equals(Object o) { 34 | if (this == o) return true; 35 | if (o == null || getClass() != o.getClass()) return false; 36 | KissParameter that = (KissParameter) o; 37 | return parameter == that.parameter; 38 | } 39 | 40 | @Override 41 | public int hashCode() { 42 | return Objects.hash(parameter); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /KISSetGUI/src/packaging/deb/postinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # postinst script for kisset-gui 3 | # 4 | # see: dh_installdeb(1) 5 | 6 | set -e 7 | 8 | # summary of how this script can be called: 9 | # * `configure' 10 | # * `abort-upgrade' 11 | # * `abort-remove' `in-favour' 12 | # 13 | # * `abort-remove' 14 | # * `abort-deconfigure' `in-favour' 15 | # `removing' 16 | # 17 | # for details, see https://www.debian.org/doc/debian-policy/ or 18 | # the debian-policy package 19 | 20 | package_type=deb 21 | 22 | 23 | case "$1" in 24 | configure) 25 | xdg-desktop-menu install /opt/kisset-gui/lib/kisset-gui-kisset-gui.desktop 26 | ln -s /opt/kisset-gui/bin/kisset-gui /usr/bin/kisset-gui 27 | 28 | ;; 29 | 30 | abort-upgrade|abort-remove|abort-deconfigure) 31 | ;; 32 | 33 | *) 34 | echo "postinst called with unknown argument \`$1'" >&2 35 | exit 1 36 | ;; 37 | esac 38 | 39 | exit 0 40 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/ax25/util/AX25Tools.java: -------------------------------------------------------------------------------- 1 | package org.prowl.ax25.util; 2 | 3 | public class AX25Tools { 4 | 5 | 6 | /** 7 | * Convert a byte array to a hex string 8 | * 9 | * @param output 10 | * @return a String 11 | */ 12 | public static String byteArrayToHexString(byte[] output) { 13 | if (output == null) { 14 | return "null array"; 15 | } 16 | StringBuffer hexString = new StringBuffer(); 17 | for (int i = 0; i < output.length; i++) { 18 | hexString.append(String.format("%02X", output[i])); 19 | hexString.append(" "); 20 | } 21 | return hexString.toString(); 22 | } 23 | 24 | public static String byteArrayToReadableASCIIString(byte[] data) { 25 | StringBuilder sb = new StringBuilder(); 26 | for (byte b : data) { 27 | if (b < 0x20 || b > 0xFA) { 28 | sb.append("<"); 29 | sb.append(String.format("%02X", b)); 30 | sb.append(">"); 31 | } else { 32 | sb.append((char) b); 33 | } 34 | } 35 | return sb.toString(); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/host/parser/commands/Quit.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.host.parser.commands; 2 | 3 | import org.prowl.kisset.KISSet; 4 | import org.prowl.kisset.annotations.TNCCommand; 5 | import org.prowl.kisset.services.host.parser.Mode; 6 | import org.prowl.kisset.util.ANSI; 7 | 8 | import java.io.IOException; 9 | 10 | /** 11 | * Display a list of settings from KISS and also some app preferences. 12 | */ 13 | @TNCCommand 14 | public class Quit extends Command { 15 | 16 | 17 | @Override 18 | public boolean doCommand(String[] data) throws IOException { 19 | if (!getMode().equals(Mode.CMD)) { 20 | return false; 21 | } 22 | 23 | // Show a list of the settings available (this loosely mirrors the command help as well) 24 | writeToTerminal(ANSI.YELLOW+ANSI.BOLD+"*** Quit requested, shutting down: "+ANSI.NORMAL+ CR); 25 | 26 | KISSet.INSTANCE.quit(); 27 | 28 | // We're probably not getting here given the above calls System.exit() 29 | return true; 30 | } 31 | 32 | @Override 33 | public String[] getCommandNames() { 34 | return new String[]{"quit", "exit"}; 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/java/org/prowl/kissetgui/guiconfig/GUIConf.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kissetgui.guiconfig; 2 | 3 | import org.prowl.kisset.KISSet; 4 | 5 | public enum GUIConf { 6 | 7 | terminalFont(OSDefaults.getDefaultPlatformFont()); 8 | 9 | 10 | public Object defaultSetting; 11 | 12 | GUIConf(Object defaultSetting) { 13 | this.defaultSetting = defaultSetting; 14 | } 15 | 16 | /** 17 | * Create a default Net/ROM alias based on the callsign. 18 | * 19 | * @return 20 | */ 21 | public static final String createDefaultNetromAlias() { 22 | if (KISSet.INSTANCE.getMyCall().length() > 0) { 23 | return KISSet.INSTANCE.getMyCallNoSSID().substring(KISSet.INSTANCE.getMyCallNoSSID().length() - 3) + "NOD"; 24 | } else { 25 | return ""; 26 | } 27 | 28 | 29 | } 30 | 31 | public String stringDefault() { 32 | return String.valueOf(defaultSetting); 33 | } 34 | 35 | public int intDefault() { 36 | return Integer.parseInt(String.valueOf(defaultSetting)); 37 | } 38 | 39 | public boolean boolDefault() { 40 | return Boolean.parseBoolean(String.valueOf(defaultSetting)); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/pms/parser/commands/ColourToggle.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.pms.parser.commands; 2 | 3 | import org.prowl.kisset.Messages; 4 | import org.prowl.kisset.annotations.PMSCommand; 5 | import org.prowl.kisset.services.remote.pms.parser.Mode; 6 | 7 | import java.io.IOException; 8 | 9 | @PMSCommand 10 | public class ColourToggle extends Command { 11 | 12 | /** 13 | * Colour toggle is a special case command and is accessible in any mode. 14 | * 15 | * @param data 16 | * @return 17 | * @throws IOException 18 | */ 19 | @Override 20 | public boolean doCommand(String[] data) throws IOException { 21 | 22 | if (!getMode().equals(Mode.CMD)) { 23 | return false; 24 | } 25 | 26 | 27 | client.setColourEnabled(!client.getColourEnabled()); 28 | if (client.getColourEnabled()) { 29 | write(Messages.get("colourEnabled") + CR); 30 | } else { 31 | write(Messages.get("colourDisabled") + CR); 32 | } 33 | 34 | return true; 35 | } 36 | 37 | @Override 38 | public String[] getCommandNames() { 39 | return new String[]{"CC"}; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/netrom/user/parser/commands/Bye.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.netrom.user.parser.commands; 2 | 3 | import org.prowl.kisset.Messages; 4 | import org.prowl.kisset.annotations.NodeCommand; 5 | import org.prowl.kisset.services.remote.netrom.user.parser.Mode; 6 | 7 | import java.io.IOException; 8 | 9 | @NodeCommand 10 | public class Bye extends Command { 11 | 12 | 13 | @Override 14 | public boolean doCommand(String[] data) throws IOException { 15 | // We're only interesteed in comamnd moed - other modes may need use these command words to exit their mode 16 | if (!getMode().equals(Mode.CMD)) { 17 | return false; 18 | } 19 | 20 | // Possibly save user at this point? 21 | 22 | 23 | // Now say goodbye and close the connection 24 | write(CR); 25 | write(Messages.get(client.getUser(), "userDisconnecting") + CR); 26 | client.flush(); 27 | // Disconnect the client. 28 | client.close(); 29 | 30 | 31 | return true; 32 | } 33 | 34 | @Override 35 | public String[] getCommandNames() { 36 | return new String[]{"b", "q", "bye", "end", "logoff", "logout", "exit", "quit"}; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/Messages.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset; 2 | 3 | import org.apache.commons.logging.Log; 4 | import org.apache.commons.logging.LogFactory; 5 | import org.prowl.kisset.objects.user.User; 6 | import org.prowl.kisset.util.UnTokenize; 7 | 8 | import java.util.ResourceBundle; 9 | 10 | public final class Messages { 11 | private static final Log LOG = LogFactory.getLog("Messages"); 12 | 13 | 14 | private static ResourceBundle bundle; 15 | 16 | public static void init() { 17 | bundle = ResourceBundle.getBundle("messages"); 18 | } 19 | 20 | public static String get(String key) { 21 | return UnTokenize.str(getInternal(key)); 22 | } 23 | 24 | public static String get(User user, String key) { 25 | return UnTokenize.str(user, getInternal(key)); 26 | } 27 | 28 | private static String getInternal(String key) { 29 | String s; 30 | try { 31 | s = bundle.getString(key); 32 | if (s == null || s.length() == 0) { 33 | return "Missing: " + key; 34 | } 35 | } catch (Throwable e) { 36 | LOG.error(e.getMessage(), e); 37 | s = e.getMessage(); 38 | } 39 | return s; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/netrom/user/parser/commands/ColourToggle.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.netrom.user.parser.commands; 2 | 3 | 4 | 5 | import org.prowl.kisset.Messages; 6 | import org.prowl.kisset.annotations.NodeCommand; 7 | import org.prowl.kisset.services.remote.netrom.user.parser.Mode; 8 | 9 | import java.io.IOException; 10 | 11 | @NodeCommand 12 | public class ColourToggle extends Command { 13 | 14 | /** 15 | * Colour toggle is a special case command and is accessible in any mode. 16 | * 17 | * @param data 18 | * @return 19 | * @throws IOException 20 | */ 21 | @Override 22 | public boolean doCommand(String[] data) throws IOException { 23 | 24 | if (!getMode().equals(Mode.CMD)) { 25 | return false; 26 | } 27 | 28 | 29 | client.setColourEnabled(!client.getColourEnabled()); 30 | if (client.getColourEnabled()) { 31 | write(Messages.get("colourEnabled") + CR); 32 | } else { 33 | write(Messages.get("colourDisabled") + CR); 34 | } 35 | 36 | return true; 37 | } 38 | 39 | @Override 40 | public String[] getCommandNames() { 41 | return new String[]{"CC"}; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/pms/parser/commands/Bye.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.pms.parser.commands; 2 | 3 | import org.prowl.kisset.Messages; 4 | import org.prowl.kisset.annotations.PMSCommand; 5 | import org.prowl.kisset.io.Stream; 6 | import org.prowl.kisset.services.remote.pms.parser.Mode; 7 | 8 | import java.io.IOException; 9 | 10 | @PMSCommand 11 | public class Bye extends Command { 12 | 13 | 14 | @Override 15 | public boolean doCommand(String[] data) throws IOException { 16 | // We're only interesteed in comamnd moed - other modes may need use these command words to exit their mode 17 | if (!getMode().equals(Mode.CMD)) { 18 | return false; 19 | } 20 | 21 | // Possibly save user at this point? 22 | 23 | 24 | 25 | // Now say goodbye and close the connection 26 | write(CR); 27 | write(Messages.get(client.getUser(), "userDisconnecting") + CR); 28 | client.flush(); 29 | // Disconnect the client. 30 | client.close(); 31 | 32 | 33 | return true; 34 | } 35 | 36 | @Override 37 | public String[] getCommandNames() { 38 | return new String[]{"b", "q", "bye", "end", "logoff", "logout", "exit", "quit"}; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/protocols/mqtt/MQTTPacket.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.protocols.mqtt; 2 | 3 | import org.apache.commons.logging.Log; 4 | import org.apache.commons.logging.LogFactory; 5 | import org.eclipse.paho.client.mqttv3.IMqttClient; 6 | import org.eclipse.paho.client.mqttv3.MqttMessage; 7 | import org.prowl.kisset.protocols.core.Node; 8 | 9 | import java.util.concurrent.Callable; 10 | 11 | public class MQTTPacket implements Callable { 12 | 13 | private static final Log LOG = LogFactory.getLog("MQTTPacket"); 14 | 15 | 16 | private final IMqttClient client; 17 | private final String topic; 18 | private final Node node; 19 | 20 | public MQTTPacket(IMqttClient client, Node node, String topic) { 21 | this.client = client; 22 | this.topic = topic; 23 | this.node = node; 24 | } 25 | 26 | @Override 27 | public Void call() throws Exception { 28 | if (!client.isConnected()) { 29 | return null; 30 | } 31 | MqttMessage msg = readPacket(); 32 | msg.setQos(0); 33 | msg.setRetained(true); 34 | client.publish(topic, msg); 35 | return null; 36 | 37 | } 38 | 39 | private MqttMessage readPacket() { 40 | return new MqttMessage(node.getFrame().getRawPacket()); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/config/BeaconType.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.config; 2 | 3 | /** 4 | * A fixed list of sensible beacon intervals for the user to choose from. 5 | */ 6 | public enum BeaconType { 7 | 8 | INTERVAL0("No beacon", 0), 9 | INTERVAL5("5 minute intervals", 5), 10 | INTERVAL10("10 minute intervals", 10), 11 | INTERVAL15("15 minute intervals", 15), 12 | INTERVAL30("30 minute intervals", 30), 13 | INTERVAL60("60 minute intervals", 60), 14 | INTERVAL120("120 minute intervals", 120), 15 | INTERVAL240("240 minute intervals", 240); 16 | 17 | private final String description; 18 | private final int interval; 19 | 20 | BeaconType(String description, int interval) { 21 | this.description = description; 22 | this.interval = interval; 23 | } 24 | 25 | public static BeaconType getBeaconType(int interval) { 26 | for (BeaconType beaconType : BeaconType.values()) { 27 | if (beaconType.getInterval() == interval) { 28 | return beaconType; 29 | } 30 | } 31 | return BeaconType.INTERVAL0; 32 | } 33 | 34 | public String getDescription() { 35 | return description; 36 | } 37 | 38 | public int getInterval() { 39 | return interval; 40 | } 41 | 42 | public String toString() { 43 | return description; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /KISSetMain/src/main/test/java/org/prowl/kisset/protocols/netrom/NetRomRoutingPacketTest.java: -------------------------------------------------------------------------------- 1 | //package org.prowl.kisset.protocols.netrom; 2 | // 3 | // 4 | //import org.junit.Assert; 5 | //import org.junit.Test; 6 | //import org.prowl.ax25.AX25Frame; 7 | //import org.prowl.kisset.objects.routing.NetROMRoute; 8 | //import org.prowl.kisset.protocols.core.Node; 9 | //import org.prowl.kisset.protocols.netrom.NetROMRoutingPacket; 10 | // 11 | //import java.text.ParseException; 12 | // 13 | //public class NetRomRoutingPacketTest { 14 | // 15 | // @Test 16 | // public void testPacket() { 17 | // 18 | // NetROMRoute testRoute = new NetROMRoute(null, "G0ABC", "G1BCD", "BCDNOD", "G2NBR", 56); 19 | // 20 | // NetROMRoutingPacket packet = new NetROMRoutingPacket(); 21 | // packet.addNode(testRoute); 22 | // 23 | // System.out.println(testRoute.toString()); 24 | // 25 | // byte[] data = packet.toPacketBody("G1SND"); 26 | // 27 | // 28 | // AX25Frame frame = new AX25Frame(); 29 | // frame.body = data; 30 | // Node node = new Node(null, "G6DEF", System.currentTimeMillis(), "NODES", frame); 31 | // try { 32 | // NetROMRoutingPacket packet2 = new NetROMRoutingPacket(node); 33 | // 34 | // System.out.println(packet2.toString()); 35 | // 36 | // } catch (ParseException e) { 37 | // Assert.fail(e.getMessage()); 38 | // } 39 | // 40 | // 41 | // } 42 | // 43 | // 44 | //} 45 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/host/parser/commands/Monitor.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.host.parser.commands; 2 | 3 | import org.prowl.kisset.annotations.TNCCommand; 4 | import org.prowl.kisset.services.host.parser.Mode; 5 | 6 | import java.io.IOException; 7 | 8 | /** 9 | * Turn on/off monitoring of packets to the main terminal window instead of the dedicated monitor window 10 | */ 11 | @TNCCommand 12 | public class Monitor extends Command { 13 | 14 | @Override 15 | public boolean doCommand(String[] data) throws IOException { 16 | 17 | if (!getMode().equals(Mode.CMD)) { 18 | return false; 19 | } 20 | 21 | if (data.length == 1) { 22 | writeToTerminal("*** Monitor is " + (tncHost.isMonitorEnabled() ? "on" : "off") + CR); 23 | } else { 24 | if (data[1].equalsIgnoreCase("on")) { 25 | tncHost.setMonitor(true); 26 | writeToTerminal("*** Monitor is on" + CR); 27 | } else if (data[1].equalsIgnoreCase("off")) { 28 | tncHost.setMonitor(false); 29 | writeToTerminal("*** Monitor is off" + CR); 30 | } else { 31 | writeToTerminal("*** Usage: mon [on|off]" + CR); 32 | } 33 | } 34 | return true; 35 | } 36 | 37 | 38 | @Override 39 | public String[] getCommandNames() { 40 | return new String[]{"mon", "m", "monitor"}; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /KISSetMain/src/main/java/org/prowl/kisset/services/remote/pms/PMSService.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kisset.services.remote.pms; 2 | 3 | import org.apache.commons.configuration.HierarchicalConfiguration; 4 | import org.apache.commons.logging.Log; 5 | import org.apache.commons.logging.LogFactory; 6 | import org.prowl.kisset.io.Interface; 7 | import org.prowl.kisset.objects.user.User; 8 | import org.prowl.kisset.services.Service; 9 | 10 | import java.io.InputStream; 11 | import java.io.OutputStream; 12 | 13 | /** 14 | * PMS Service 15 | */ 16 | public class PMSService extends Service { 17 | 18 | private static final Log LOG = LogFactory.getLog("PMSService"); 19 | 20 | private boolean stop; 21 | 22 | private HierarchicalConfiguration config; 23 | 24 | private final String callsign; 25 | 26 | public PMSService(String name, String callsign) { 27 | super(name); 28 | LOG.debug("Starting PMS Service, listening on " + callsign); 29 | this.callsign = callsign; 30 | } 31 | 32 | public void acceptedConnection(Interface anInterface, User user, InputStream in, OutputStream out) { 33 | PMSClientHandler client = new PMSClientHandler(anInterface, user, in, out); 34 | client.start(); 35 | } 36 | 37 | public void start() { 38 | } 39 | 40 | public void stop() { 41 | stop = true; 42 | } 43 | 44 | @Override 45 | public String getCallsign() { 46 | return callsign; 47 | } 48 | 49 | 50 | } 51 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/fx/APRSController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 25 | 26 | 27 |
28 | 29 | 30 |
31 |
32 |
33 |
34 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/resources/org/prowl/kissetgui/userinterface/desktop/fx/APRSController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 25 | 26 | 27 |
28 | 29 | 30 |
31 |
32 |
33 |
34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KISSet 2 | 3 | A terminal program for connecting to a TNC or modem that only support the KISS protocol (NinoTNC, TH-D74, etc) 4 | 5 | ### Installers/Packages 6 | 7 | Releases are available for:
8 | Windows (.msi file) 9 |
Linux (.deb file) 10 |
macOS (.dmg file) 11 |
Raspberry Pi 64bit (arm64) (.deb file), 32bit armv7l (.deb file)
12 | 13 | > [!NOTE] 14 | > Packages ending with 'GUI' are the full graphical version - the non-'GUI' packages are console only 15 | 16 | 17 | ### Building from source 18 | 19 | KISSet uses Bellsofts liberica jdk which has java-fx bundled in. If you require to use a different jdk, you will need to install java-fx separately or add the dependencies to the pom.xml 20 | 21 | 22 | ### Next Planned features / Todo 23 | 24 | * Remember remote connecting users colour choices for ANSI colour support 25 | * Access control for the PMS system 26 | * Finish Net/ROM support 27 | * Multi window mode 28 | * Flashing/notification icon/system tray icon for new PMS messages 29 | * Interface statistics window 30 | * Terminal support (for systems with no GUI) 31 | 32 | 33 | ![Picture of running node](./doc/screen2.png) 34 | 35 | -------------------------------------------------------------------------------- /KISSetGUI/src/main/java/org/prowl/kissetgui/userinterface/desktop/fx/AboutController.java: -------------------------------------------------------------------------------- 1 | package org.prowl.kissetgui.userinterface.desktop.fx; 2 | 3 | import javafx.fxml.FXML; 4 | import javafx.scene.paint.Color; 5 | import javafx.scene.web.WebEngine; 6 | import javafx.scene.web.WebView; 7 | import org.prowl.kisset.KISSet; 8 | 9 | public class AboutController { 10 | 11 | @FXML 12 | WebView aboutWebView; 13 | 14 | public void setup() { 15 | WebEngine engine = aboutWebView.getEngine(); 16 | aboutWebView.setPageFill(Color.TRANSPARENT); 17 | 18 | 19 | String version = KISSet.INSTANCE.getVersion(); 20 | version = version.replace("\n", "
"); 21 | engine.loadContent("" + 30 | "


KISSet

" + 31 | "

Author: Ian Hawkins G0TAI Web

" + 32 | "

Build Information:
" + version + "

" + 33 | 34 | "
"); 35 | 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /KISSetMain/src/main/resources/org/prowl/kisset/userinterface/desktop/fx/ChooseLocationController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 25 | 26 |