Merge DG branch (#45)

* Variable sound output level

Mods to SoundPlayback module to allow additional parameters. Implemented
system for NI cards to allow changes to selected output voltage range
meaning output can be boosted to level higher than current default.

* Code to support nogui operations when no screens present on headless
system

* Fix problem of nogui headless operation trying to access screen size.

* Click detector display fixes

1. ICI not displaying correctly
2. Component sizes in display dialog on hres monitors

* Work on batch processing, after testing of options to autostart,
autoexit and set wav file folder, database and binary store.

* Update MHTClickTrainAlgorithm.java

Fix unsynchronised access to a datablock in click train detector which was causing index errors.

* Revamp of offline process messaging and control

Includes some databsae logging of completed tasks

* Offline task logging

Bit more work, including notes and database storage of task
reprocessing. Guess this could all become 'proper' PAMGuard data and be
shown in a table on the display but that not priority enough.

* Dialog packing

Fix a couple of dialogs which don't back well on HDPI monitors

* UDP Control

Added multiport functionality
This commit is contained in:
Douglas Gillespie 2022-08-04 11:40:29 +01:00 committed by GitHub
parent 016cfd0da5
commit 49cd547aee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 170 additions and 1 deletions

View File

@ -55,6 +55,7 @@ import generalDatabase.DBControlUnit;
import javafx.application.Platform;
import javafx.stage.Stage;
import Array.ArrayManager;
import PamController.command.MultiportController;
import PamController.command.NetworkController;
import PamController.command.TerminalController;
import PamController.command.WatchdogComms;
@ -255,6 +256,9 @@ public class PamController implements PamControllerInterface, PamSettings {
if (pamBuoyGlobals.getNetworkControlPort() != null) {
networkController = new NetworkController(this);
}
if (pamBuoyGlobals.getMultiportAddress() != null) {
new MultiportController(this);
}
// binaryStore = new BinaryStore(this);

View File

@ -0,0 +1,118 @@
package PamController.command;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import PamController.PamController;
import PamController.pamBuoyGlobals;
public class MultiportController extends CommandManager {
//The multicast addresses are in the range 224.0.0.0 through 239.255.255.255
private static String unitName = "Multiport Controller";
private PamController pamController;
private String mAddress;
private int mPort;
private MulticastSocket socket;
InetAddress inetAddr;
static private final int MAX_COMMAND_LENGTH = 4096;
private byte[] byteBuffer = new byte[MAX_COMMAND_LENGTH];
private DatagramPacket lastDatagram;
public MultiportController(PamController pamController) {
super(pamController, unitName);
this.pamController = pamController;
this.mAddress = pamBuoyGlobals.getMultiportAddress();
this.mPort = pamBuoyGlobals.getMuliportPort();
Thread t = new Thread(new ListenerThread());
t.start();
}
public void runListenerLoop() {
try {
// inetAddr = InetAddress.getByName(mAddress);
// SocketAddress sockAddr = new SocketAddress()
// socket = new MulticastSocket(mPort);
// socket.joinGroup(inetAddr, null);
// socket.joinG
// open port
InetAddress mcastaddr = InetAddress.getByName(mAddress);
InetSocketAddress group = new InetSocketAddress(mcastaddr, mPort);
NetworkInterface netIf = NetworkInterface.getByName("bge0");
socket = new MulticastSocket(mPort);
socket.joinGroup(group, netIf);
socket.setSoTimeout(0);
System.out.printf("Waiting for multicast messages at %s port %d\n", mAddress, mPort);
// sit in loop
while (true) {
try {
DatagramPacket datagram = new DatagramPacket(byteBuffer, MAX_COMMAND_LENGTH);
socket.receive(datagram);
processDatagram(datagram);
}
catch (IOException ioE) {
ioE.printStackTrace();
break;
}
}
// close port.
socket.leaveGroup(group, netIf);
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void processDatagram(DatagramPacket datagram) {
lastDatagram = datagram;
String str = new String(datagram.getData(), 0, datagram.getLength());
// str = str.substring(0, datagram.getLength());
System.out.println("Datagram received \"" + str + "\"");
interpretCommand(str);
}
@Override
public boolean sendData(String dataString) {
DatagramPacket senderInfo = lastDatagram;
System.out.printf("Send back data \"%s\" to %s port %d\n", dataString, senderInfo.getAddress(), senderInfo.getPort());
// dataString += "\n";
DatagramPacket packet = new DatagramPacket(dataString.getBytes(), dataString.length());
packet.setAddress(senderInfo.getAddress());
packet.setPort(senderInfo.getPort());
try {
socket.send(packet);
// receiveSocket.
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}
private class ListenerThread implements Runnable {
@Override
public void run() {
runListenerLoop();
}
}
}

View File

@ -14,7 +14,9 @@ public class pamBuoyGlobals {
// public static Integer useGstreamer = 0;
// public static boolean useNetworkCont = false;
private static Integer networkControlPort = null;
private static String multiportAddress;
// private static boolean useDSP = false;
private static int muliportPort;
/**
* @return the networkControlPort
@ -30,6 +32,31 @@ public class pamBuoyGlobals {
pamBuoyGlobals.networkControlPort = networkControlPort;
}
/**
* Set parameters for mulitport configutation.
* @param mAddr
* @param mPort
*/
public static void setMultiportConfig(String mAddr, int mPort) {
multiportAddress = mAddr;
muliportPort = mPort;
}
/**
* @return the multiportAddress
*/
public static String getMultiportAddress() {
return multiportAddress;
}
/**
* @return the muliportPort
*/
public static int getMuliportPort() {
return muliportPort;
}
//public static HashMap pbHash = new HashMap(10,0.75);
//

View File

@ -24,10 +24,23 @@ public class GlobalArguments {
/**
* Get a global parameter value
* @param name value name
* @return value
* @return value in original String format
*/
public static String getParam(String name) {
return globalFlags.get(name);
}
/**
* Get a param read as an integer
* @param name
* @return value as integer or null if not set. Throws exception if invalid integer.
*/
public static Integer getParamI(String name) {
String val = getParam(name);
if (val == null) {
return null;
}
return Integer.valueOf(val);
}
}

View File

@ -212,8 +212,15 @@ public class Pamguard {
System.out.println("Running using settings from " + autoPsf);
}
else if (anArg.equalsIgnoreCase("-port")) {
// port id to open a udp port to receive commands
pamBuoyGlobals.setNetworkControlPort(Integer.parseInt(args[iArg++]));
}
else if (anArg.equalsIgnoreCase("-mport")) {
// multicast control (for multiple PAMGuards)
String mAddr = args[iArg++];
int mPort = Integer.parseInt(args[iArg++]);
pamBuoyGlobals.setMultiportConfig(mAddr, mPort);
}
else if (anArg.equalsIgnoreCase("-nolog")) {
System.out.println("Disabling log file from command line switch...");
ProxyPrintStream.disableLogFile();