update X3 to get Detector parameters

X3 and PAMguard updated to get and save the SoundTrap click detector
parameters.
This commit is contained in:
Douglas Gillespie 2023-05-03 19:06:45 +01:00
parent f74bb5eb89
commit 2953d82b58
7 changed files with 219 additions and 11 deletions

View File

@ -6,7 +6,7 @@
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/Java 17"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<attributes> <attributes>
<attribute name="module" value="true"/> <attribute name="module" value="true"/>
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>

View File

@ -784,7 +784,7 @@
<dependency> <dependency>
<groupId>pamguard.org</groupId> <groupId>pamguard.org</groupId>
<artifactId>x3</artifactId> <artifactId>x3</artifactId>
<version>2.2.1</version> <version>2.2.2</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/it.sauronsoftware/jave --> <!-- https://mvnrepository.com/artifact/it.sauronsoftware/jave -->

View File

@ -453,12 +453,18 @@ public class ImportBCLDialog extends PamDialog {
int nFiles = 0; int nFiles = 0;
int nCDET = 0; int nCDET = 0;
int nDWV = 0; int nDWV = 0;
STClickControl clickControl = (STClickControl) PamController.getInstance().findControlledUnit(STClickControl.STUNITTYPE, stToolsParams.clickDetName);
for (File xmlFile:xmlFiles) { for (File xmlFile:xmlFiles) {
Debug.out.println("Opening xml file " + xmlFile.getAbsolutePath()); Debug.out.println("Opening xml file " + xmlFile.getAbsolutePath());
if (xmlFile.getAbsolutePath().equals("E:\\STOctober2016\\335839252\\335839252.161031002807.log.xml")) { // if (xmlFile.getAbsolutePath().equals("E:\\STOctober2016\\335839252\\335839252.161031002807.log.xml")) {
System.out.println("Opening xml file " + xmlFile.getAbsolutePath()); // System.out.println("Opening xml file " + xmlFile.getAbsolutePath());
} // }
STXMLFile xmlFileInfo = STXMLFile.openXMLFile(xmlFile, customDateTimeFormat.getText()); STXMLFile xmlFileInfo = STXMLFile.openXMLFile(xmlFile, customDateTimeFormat.getText());
if (clickControl != null && xmlFileInfo.getSudDetectorInfo() != null) {
clickControl.setSudClickDetectorInfo(xmlFileInfo.getSudDetectorInfo());
}
if (xmlFileInfo == null || xmlFileInfo.getDwvInfo() == null) { if (xmlFileInfo == null || xmlFileInfo.getDwvInfo() == null) {
String title = "Error with Soundtrap file"; String title = "Error with Soundtrap file";

View File

@ -25,19 +25,26 @@
package soundtrap; package soundtrap;
import java.awt.Frame; import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import javax.swing.JMenu; import javax.swing.JMenu;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import org.pamguard.x3.sud.SUDClickDetectorInfo;
import Acquisition.AcquisitionControl; import Acquisition.AcquisitionControl;
import Acquisition.sud.SUDNotificationManager; import PamController.PamControlledUnitSettings;
import PamController.PamController; import PamController.PamController;
import PamguardMVC.PamRawDataBlock; import PamguardMVC.PamRawDataBlock;
import clickDetector.ClickBTDisplay; import clickDetector.ClickBTDisplay;
import clickDetector.ClickControl; import clickDetector.ClickControl;
import clickDetector.ClickDisplay; import clickDetector.ClickDisplay;
import clickDetector.ClickDisplayManager; import clickDetector.ClickDisplayManager;
import soundtrap.sud.SUDParamsDialog;
import soundtrap.sud.SudFileDWVHandler; import soundtrap.sud.SudFileDWVHandler;
/** /**
@ -46,6 +53,8 @@ import soundtrap.sud.SudFileDWVHandler;
*/ */
public class STClickControl extends ClickControl { public class STClickControl extends ClickControl {
private SUDClickDetectorInfo sudClickDetectorInfo;
public static final String STUNITTYPE = "SoundTrap Click Detector"; public static final String STUNITTYPE = "SoundTrap Click Detector";
/** /**
@ -117,9 +126,23 @@ public class STClickControl extends ClickControl {
} }
} }
JMenuItem sudItem = new JMenuItem("Sound Trap settings ...");
sudItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showSudParameters(parentFrame);
}
});
newMenu.add(sudItem, 0);
newMenu.add(new JSeparator(), 1);
return newMenu; return newMenu;
} }
protected void showSudParameters(Frame parentFrame) {
SUDParamsDialog.showDialog(parentFrame, this);
}
@Override @Override
public void pamStart() { public void pamStart() {
sudFileDWVHandler.pamStart(); sudFileDWVHandler.pamStart();
@ -157,6 +180,43 @@ public class STClickControl extends ClickControl {
} }
} }
} }
@Override
public long getSettingsVersion() {
return SUDClickDetectorInfo.serialVersionUID;
}
@Override
public Serializable getSettingsReference() {
return getSudClickDetectorInfo();
}
@Override
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
Object o = pamControlledUnitSettings.getSettings();
if (o instanceof SUDClickDetectorInfo) {
sudClickDetectorInfo = (SUDClickDetectorInfo) o;
return true;
}
return false;
}
/**
* @return the sudClickDetectorInfo
*/
public SUDClickDetectorInfo getSudClickDetectorInfo() {
if (sudClickDetectorInfo == null) {
sudClickDetectorInfo = new SUDClickDetectorInfo();
}
return sudClickDetectorInfo;
}
/**
* @param sudClickDetectorInfo the sudClickDetectorInfo to set
*/
public void setSudClickDetectorInfo(SUDClickDetectorInfo sudClickDetectorInfo) {
this.sudClickDetectorInfo = sudClickDetectorInfo;
}
} }

View File

@ -12,6 +12,8 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import org.pamguard.x3.sud.SUDClickDetectorInfo;
import org.pamguard.x3.sud.SUDXMLUtils;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
@ -41,6 +43,7 @@ public class STXMLFile {
private WAVInfo wavInfo; private WAVInfo wavInfo;
private String soundTrapId; private String soundTrapId;
private String dateFormat = defaultDateFormat; private String dateFormat = defaultDateFormat;
private SUDClickDetectorInfo sudDetectorInfo;
public static void main(String[] args) { public static void main(String[] args) {
@ -70,6 +73,9 @@ public class STXMLFile {
} }
private void unpackXMLDoc() throws Exception{ private void unpackXMLDoc() throws Exception{
// try to get the new format complete settings as has been developed for the
// SUD direct reader.
cfgNodes = doc.getElementsByTagName("CFG"); cfgNodes = doc.getElementsByTagName("CFG");
NodeList procEvents = doc.getElementsByTagName("PROC_EVENT"); NodeList procEvents = doc.getElementsByTagName("PROC_EVENT");
@ -231,8 +237,14 @@ public class STXMLFile {
return null; return null;
} }
doc.getDocumentElement().normalize(); doc.getDocumentElement().normalize();
STXMLFile stXMLFile = new STXMLFile(doc, xmlFile, dateTimeFormat);
SUDXMLUtils sudXml = new SUDXMLUtils();
SUDClickDetectorInfo detectorInfo = sudXml.extractDetectorInfo(doc);
stXMLFile.setSudDetectorInfo(detectorInfo);
return new STXMLFile(doc, xmlFile, dateTimeFormat); return stXMLFile;
} }
/** /**
@ -299,4 +311,18 @@ public class STXMLFile {
} }
return null; return null;
} }
/**
* @return the sudDetectorInfo
*/
public SUDClickDetectorInfo getSudDetectorInfo() {
return sudDetectorInfo;
}
/**
* @param sudDetectorInfo the sudDetectorInfo to set
*/
public void setSudDetectorInfo(SUDClickDetectorInfo sudDetectorInfo) {
this.sudDetectorInfo = sudDetectorInfo;
}
} }

View File

@ -0,0 +1,107 @@
package soundtrap.sud;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Window;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import org.pamguard.x3.sud.SUDClickDetectorInfo;
import PamView.dialog.PamDialog;
import PamView.dialog.PamGridBagContraints;
import soundtrap.STClickControl;
/**
* Display ST detection parameters. These cannot be changed so all boxes are disabled.
* @author dg50
*
*/
public class SUDParamsDialog extends PamDialog {
private STClickControl stClickControl;
private JTextField sampleRate, channels, threshold, blanking, preSamps, postSamps, len;
private static SUDParamsDialog singleInstance;
private SUDParamsDialog(Window parentFrame, STClickControl stClickControl) {
super(parentFrame, stClickControl.getUnitName(), false);
this.stClickControl = stClickControl;
JPanel mainPanel = new JPanel(new GridBagLayout());
mainPanel.setBorder(new TitledBorder("SoundTrap Detector Configuration"));
GridBagConstraints c = new PamGridBagContraints();
sampleRate = addThing(mainPanel, "Sample Rate", "Hz", c);
channels = addThing(mainPanel, "Num Channels", null, c);
threshold = addThing(mainPanel, "Threshold", "dB", c);
blanking = addThing(mainPanel, "Blanking", "samples", c);
preSamps = addThing(mainPanel, "Pre Samples", "samples", c);
postSamps = addThing(mainPanel, "Post Samples", "samples", c);
len = addThing(mainPanel, "Length", "samples", c);
setDialogComponent(mainPanel);
}
public static void showDialog(Window parent, STClickControl stClickControl) {
// if (singleInstance == null) {
singleInstance = new SUDParamsDialog(parent, stClickControl);
// }
singleInstance.setParams(stClickControl.getSudClickDetectorInfo());
singleInstance.setVisible(true);
return;
}
private void setParams(SUDClickDetectorInfo sudClickDetectorInfo) {
sampleRate.setText(String.format("%d", sudClickDetectorInfo.sampleRate));
channels.setText(String.format("%d", sudClickDetectorInfo.nChan));
threshold.setText(String.format("%3.1f", sudClickDetectorInfo.detThr));
blanking.setText(String.format("%d", sudClickDetectorInfo.blankingSamples));
preSamps.setText(String.format("%d", sudClickDetectorInfo.preSamples));
postSamps.setText(String.format("%d", sudClickDetectorInfo.postSamples));
len.setText(String.format("%d", sudClickDetectorInfo.lenSamples));
}
private JTextField addThing(JPanel mainPanel, String title, String postTit, GridBagConstraints c) {
c.gridx = 0;
mainPanel.add(new JLabel(title, JLabel.RIGHT), c);
c.gridx++;
STField field = new STField(5);
mainPanel.add(field, c);
if (postTit != null) {
c.gridx++;
mainPanel.add(new JLabel(postTit, JLabel.LEFT), c);
}
c.gridy++;
return field;
}
@Override
public boolean getParams() {
return true;
}
@Override
public void cancelButtonPressed() {
// TODO Auto-generated method stub
}
@Override
public void restoreDefaultSettings() {
// TODO Auto-generated method stub
}
private class STField extends JTextField {
public STField(int columns) {
super(columns);
setEditable(false);
}
}
}

View File

@ -10,6 +10,7 @@ import java.util.List;
import org.pamguard.x3.sud.Chunk; import org.pamguard.x3.sud.Chunk;
import org.pamguard.x3.sud.SudAudioInputStream; import org.pamguard.x3.sud.SudAudioInputStream;
import org.pamguard.x3.sud.SudDataInputStream; import org.pamguard.x3.sud.SudDataInputStream;
import org.pamguard.x3.sud.SudFileMap;
import Acquisition.AcquisitionControl; import Acquisition.AcquisitionControl;
import Acquisition.sud.SUDNotificationHandler; import Acquisition.sud.SUDNotificationHandler;
@ -73,7 +74,15 @@ public class SudFileDWVHandler implements SUDNotificationHandler {
// this is the wav sample rate, not the detector sample rate, so don't use it // this is the wav sample rate, not the detector sample rate, so don't use it
// sampleRate = sudAudioInputStream.getFormat().getFrameRate(); // sampleRate = sudAudioInputStream.getFormat().getFrameRate();
// this is the right one // this is the right one
sampleRate = sudAudioInputStream.getSudMap().clickDetSampleRate; SudFileMap sudMap = sudAudioInputStream.getSudMap();
sampleRate = 0;
if (sudMap.detectorInfo != null) {
sampleRate = sudMap.detectorInfo.sampleRate;
stClickControl.setSudClickDetectorInfo(sudMap.detectorInfo);
}
if (sampleRate == 0) {
sampleRate = sudAudioInputStream.getSudMap().clickDetSampleRate;
}
fileStartMicros = sudAudioInputStream.getSudMap().getFirstChunkTimeMicros(); fileStartMicros = sudAudioInputStream.getSudMap().getFirstChunkTimeMicros();
stClickControl.findRawDataBlock().setChannelMap(1); stClickControl.findRawDataBlock().setChannelMap(1);
stClickControl.findRawDataBlock().setSampleRate((float) sampleRate, true); stClickControl.findRawDataBlock().setSampleRate((float) sampleRate, true);
@ -81,7 +90,7 @@ public class SudFileDWVHandler implements SUDNotificationHandler {
stClickControl.getSTAcquisition().acquisitionParameters.voltsPeak2Peak = STAcquisitionControl.SOUNDTRAPVP2P; stClickControl.getSTAcquisition().acquisitionParameters.voltsPeak2Peak = STAcquisitionControl.SOUNDTRAPVP2P;
stClickControl.getSTAcquisition().getAcquisitionProcess().setSampleRate((float) sampleRate, true); stClickControl.getSTAcquisition().getAcquisitionProcess().setSampleRate((float) sampleRate, true);
// System.out.printf("Open input stream fs = %3.1f\n", sampleRate); // System.out.printf("Open input stream fs = %3.1f\n", sampleRate);
} }
@Override @Override
@ -104,10 +113,10 @@ public class SudFileDWVHandler implements SUDNotificationHandler {
String chunkName = "Unknown"; String chunkName = "Unknown";
int chunkSize = sudChunk.buffer.length; int chunkSize = sudChunk.buffer.length;
if (sudAudioInputStream.getChunkIDString(chunkID).equals("wav")) { if (sudAudioInputStream.getChunkIDString(chunkID).equals("wav")) {
long millis = sudChunk.getChunkHeader().getMillisTime(); long millis = sudChunk.getChunkHeader().getMillisTime();
stClickControl.updateDisplayScrollers(millis); stClickControl.updateDisplayScrollers(millis);
if (sudAudioInputStream.isChunkIDWav(chunkID)) { if (sudAudioInputStream.isChunkIDWav(chunkID)) {
// chunkName = "RECORDINGS"; // chunkName = "RECORDINGS";
// System.out.printf("Chunk ID %d, size %d, type %s\n", chunkID, chunkSize, // System.out.printf("Chunk ID %d, size %d, type %s\n", chunkID, chunkSize,