diff --git a/repo/pamguard/org/x3/2.2.3/_remote.repositories b/repo/pamguard/org/x3/2.2.3/_remote.repositories
new file mode 100644
index 00000000..8724e7f4
--- /dev/null
+++ b/repo/pamguard/org/x3/2.2.3/_remote.repositories
@@ -0,0 +1,4 @@
+#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
+#Thu Oct 26 14:35:14 BST 2023
+x3-2.2.3.jar>=
+x3-2.2.3.pom>=
diff --git a/repo/pamguard/org/x3/2.2.3/m2e-lastUpdated.properties b/repo/pamguard/org/x3/2.2.3/m2e-lastUpdated.properties
new file mode 100644
index 00000000..c73665e6
--- /dev/null
+++ b/repo/pamguard/org/x3/2.2.3/m2e-lastUpdated.properties
@@ -0,0 +1,12 @@
+#Thu Oct 26 15:50:39 BST 2023
+bedatadriven|https\://nexus.bedatadriven.com/content/groups/public/|javadoc=1698327546071
+repo|file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo|sources=1698327461721
+repo|file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo|javadoc=1698327546071
+talan|https\://nexus.talanlabs.com/content/repositories/releases/|javadoc=1698327546071
+central|https\://repo1.maven.org/maven2|sources=1698331839689
+unidata-all|https\://artifacts.unidata.ucar.edu/repository/unidata-all/|javadoc=1698327546071
+talan|https\://nexus.talanlabs.com/content/repositories/releases/|sources=1698331839689
+bedatadriven|https\://nexus.bedatadriven.com/content/groups/public/|sources=1698331839689
+unidata-all|https\://artifacts.unidata.ucar.edu/repository/unidata-all/|sources=1698331839689
+central|https\://repo1.maven.org/maven2|javadoc=1698327546071
+repo|file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG/repo|sources=1698331839689
diff --git a/repo/pamguard/org/x3/2.2.3/x3-2.2.3-javadoc.jar.lastUpdated b/repo/pamguard/org/x3/2.2.3/x3-2.2.3-javadoc.jar.lastUpdated
new file mode 100644
index 00000000..e9aa1150
--- /dev/null
+++ b/repo/pamguard/org/x3/2.2.3/x3-2.2.3-javadoc.jar.lastUpdated
@@ -0,0 +1,12 @@
+#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
+#Thu Oct 26 14:39:06 BST 2023
+@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1698327545863
+file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1698327544361
+https\://repo1.maven.org/maven2/.error=
+file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.error=
+https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
+https\://nexus.bedatadriven.com/content/groups/public/.error=
+https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1698327545797
+https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1698327545616
+https\://repo1.maven.org/maven2/.lastUpdated=1698327546068
+https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact pamguard.org\:x3\:jar\:javadoc\:2.2.3 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
diff --git a/repo/pamguard/org/x3/2.2.3/x3-2.2.3-sources.jar.lastUpdated b/repo/pamguard/org/x3/2.2.3/x3-2.2.3-sources.jar.lastUpdated
new file mode 100644
index 00000000..c4ae07f1
--- /dev/null
+++ b/repo/pamguard/org/x3/2.2.3/x3-2.2.3-sources.jar.lastUpdated
@@ -0,0 +1,14 @@
+#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
+#Thu Oct 26 15:50:39 BST 2023
+@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1698327461349
+file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1698327459306
+https\://repo1.maven.org/maven2/.error=
+file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG/repo/.error=
+https\://nexus.bedatadriven.com/content/groups/public/.error=
+https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
+https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1698327460817
+https\://repo1.maven.org/maven2/.lastUpdated=1698327461652
+https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact pamguard.org\:x3\:jar\:sources\:2.2.3 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
+file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG/repo/.lastUpdated=1698331839687
+file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.error=
+https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1698327461288
diff --git a/repo/pamguard/org/x3/2.2.3/x3-2.2.3.jar b/repo/pamguard/org/x3/2.2.3/x3-2.2.3.jar
new file mode 100644
index 00000000..a158f84b
Binary files /dev/null and b/repo/pamguard/org/x3/2.2.3/x3-2.2.3.jar differ
diff --git a/repo/pamguard/org/x3/2.2.3/x3-2.2.3.pom b/repo/pamguard/org/x3/2.2.3/x3-2.2.3.pom
new file mode 100644
index 00000000..e739da2f
--- /dev/null
+++ b/repo/pamguard/org/x3/2.2.3/x3-2.2.3.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ pamguard.org
+ x3
+ 2.2.3
+ POM was created from install:install-file
+
diff --git a/src/Acquisition/pamAudio/WavAudioFile.java b/src/Acquisition/pamAudio/WavAudioFile.java
index bf0ec6d0..b20a4b1b 100644
--- a/src/Acquisition/pamAudio/WavAudioFile.java
+++ b/src/Acquisition/pamAudio/WavAudioFile.java
@@ -14,6 +14,7 @@ import javax.sound.sampled.UnsupportedAudioFileException;
import org.codehaus.plexus.util.FileUtils;
import Acquisition.offlineFuncs.AquisitionLoadPoint;
import PamDetection.RawDataUnit;
+//import PamUtils.CPUMonitor;
import PamguardMVC.PamDataBlock;
import PamguardMVC.dataOffline.OfflineDataLoadInfo;
import dataMap.OfflineDataMap;
@@ -70,9 +71,13 @@ public class WavAudioFile implements PamAudioFileLoader {
FileDataMapPoint mapPoint = offlineFileServer.findFirstMapPoint(mapIt, offlineDataLoadInfo.getStartMillis(), offlineDataLoadInfo.getEndMillis());
if (openSoundFile(mapPoint.getSoundFile()) == false) {
- System.out.println("Could not open .wav sound file " + mapPoint.getSoundFile().getAbsolutePath());
+ System.out.println("Could not open sound file " + mapPoint.getSoundFile().getAbsolutePath());
return false;
}
+ if (offlineDataLoadInfo.cancel) {
+ return false;
+ }
+
File soundFile;
ByteConverter byteConverter = ByteConverter.createByteConverter(audioFormat);
@@ -106,7 +111,11 @@ public class WavAudioFile implements PamAudioFileLoader {
try {
//System.out.println("Skipped " + skipped+ " " + skipBytes + " " + audioInputStream.available());
+// CPUMonitor cpuMonitor = new CPUMonitor();
+// cpuMonitor.start();
skipped = audioInputStream.skip(skipBytes);
+// cpuMonitor.stop();
+// System.out.println(cpuMonitor.getSummary("Sound skip: " + skipBytes + " bytes "));
//System.out.println("Offline " + (offlineDataLoadInfo.getStartMillis()-currentTime) + " ms : frame size: " + audioFormat.getFrameSize());
} catch (IOException e) {
diff --git a/src/PamView/paneloverlay/overlaymark/OverlayMarkProviders.java b/src/PamView/paneloverlay/overlaymark/OverlayMarkProviders.java
index a9d4611e..5bcc67ee 100644
--- a/src/PamView/paneloverlay/overlaymark/OverlayMarkProviders.java
+++ b/src/PamView/paneloverlay/overlaymark/OverlayMarkProviders.java
@@ -49,7 +49,7 @@ public class OverlayMarkProviders {
continue;
}
String existingName = marker.getMarkerName();
- if (existingName.equals(nameToAdd)) {
+ if (existingName!=null && existingName.equals(nameToAdd)) {
markProviders.remove(i);
break;
}
diff --git a/src/PamView/symbol/PamSymbolManager.java b/src/PamView/symbol/PamSymbolManager.java
index 96d74f46..440f3111 100644
--- a/src/PamView/symbol/PamSymbolManager.java
+++ b/src/PamView/symbol/PamSymbolManager.java
@@ -125,7 +125,7 @@ abstract public class PamSymbolManager implements Pa
* This doesn't work since different displays will still need different options based on
* their projector - so it can work, but need to set the projector.
*/
- if (managedSymbolData.useGeneric) {
+ if (managedSymbolData.useGeneric || displayName==null) {
displayName = GENERICNAME;
}
diff --git a/src/PamguardMVC/dataOffline/OfflineDataLoading.java b/src/PamguardMVC/dataOffline/OfflineDataLoading.java
index c10a716c..0e9dbb3f 100644
--- a/src/PamguardMVC/dataOffline/OfflineDataLoading.java
+++ b/src/PamguardMVC/dataOffline/OfflineDataLoading.java
@@ -129,8 +129,8 @@ public class OfflineDataLoading {
this.orderOfflineData(offlineDataInfo);
}
-
-
+
+
/**
* Clears all raw and FFT data blocks prior to a new load.
*/
@@ -140,7 +140,7 @@ public class OfflineDataLoading {
datablocks.get(i).clearAll();
datablocks.get(i).clearDeletedList();
}
-
+
datablocks = PamController.getInstance().getRawDataBlocks();
for (int i=0; i {
long t4 = t2;
// String orderDates = String.format(" %s to %s",
// PamCalendar.formatDateTime(startMillis), PamCalendar.formatDateTime(endMillis));
-// System.out.printf("Offline data order in %s %s from %s to %s\n", pamDataBlock.getDataName(), offlineDataInfo.toString(),
-// PamCalendar.formatDBDateTime(offlineDataInfo.getStartMillis()),
-// PamCalendar.formatDBDateTime(offlineDataInfo.getEndMillis()));
-// if (offlineDataInfo.getEndMillis()-offlineDataInfo.getStartMillis() > 3600000L) {
-// System.out.printf("Stupid long load time !");
-// return;
-// }
+ // System.out.printf("Offline data order in %s %s from %s to %s\n", pamDataBlock.getDataName(), offlineDataInfo.toString(),
+ // PamCalendar.formatDBDateTime(offlineDataInfo.getStartMillis()),
+ // PamCalendar.formatDBDateTime(offlineDataInfo.getEndMillis()));
+ // if (offlineDataInfo.getEndMillis()-offlineDataInfo.getStartMillis() > 3600000L) {
+ // System.out.printf("Stupid long load time !");
+ // return;
+ // }
try {
- if (orderData != null) {
- // System.out.println("order Data is not null");
- if (orderData.isDone() == false) {
- switch (offlineDataInfo.getInterrupt()) {
- case OFFLINE_DATA_INTERRUPT:
- // System.out.println("Request order cancelling");
+ if (orderData != null) {
+ // System.out.println("order Data is not null");
+ if (orderData.isDone() == false) {
+ switch (offlineDataInfo.getInterrupt()) {
+ case OFFLINE_DATA_INTERRUPT:
+ // System.out.println("Request order cancelling");
- if (orderData.cancelOrder()) {
+ if (orderData.cancelOrder()) {
- while (orderData!=null || !orderData.isDone()) {
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- return;
+ while (orderData!=null || !orderData.isDone()) {
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ return;
+ }
}
}
+ else {
+ // System.out.println("Old order could not be cancelled");
+ }
+ break;
+ case OFFLINE_DATA_CANCEL:
+ // System.out.println("Don't order new data " + orderDates);
+ return;
+ case OFFLINE_DATA_WAIT:
+ int waitCount = 0;
+ t3 = System.currentTimeMillis();
+ waitingDataLoads.add(offlineDataInfo);
+ return;
+ // // System.out.println("Wait for old lot to complete " + orderDates);
+ // while (true) {
+ // if (orderData==null || orderData.isDone() || orderData.isCancelled()) {
+ // break;
+ // }
+ // waitCount++;
+ // try {
+ // Thread.sleep(10, 0);
+ // } catch (InterruptedException e) {
+ // e.printStackTrace();
+ // }
+ // }
}
- else {
- // System.out.println("Old order could not be cancelled");
- }
- break;
- case OFFLINE_DATA_CANCEL:
- // System.out.println("Don't order new data " + orderDates);
- return;
- case OFFLINE_DATA_WAIT:
- int waitCount = 0;
- t3 = System.currentTimeMillis();
- waitingDataLoads.add(offlineDataInfo);
- return;
-// // System.out.println("Wait for old lot to complete " + orderDates);
-// while (true) {
-// if (orderData==null || orderData.isDone() || orderData.isCancelled()) {
-// break;
-// }
-// waitCount++;
-// try {
-// Thread.sleep(10, 0);
-// } catch (InterruptedException e) {
-// e.printStackTrace();
-// }
-// }
+ t4 = System.currentTimeMillis() - t3;
}
- t4 = System.currentTimeMillis() - t3;
}
}
- }
catch (NullPointerException e) {
// happens when orderData is set null in a different thread.
}
@@ -244,8 +244,8 @@ public class OfflineDataLoading {
//t = new Timer(1000, new StartOrderOnTimer(orderData));
} // end of order lock
}
-
-
+
+
/**
* Cancels the current order.
*/
@@ -259,16 +259,19 @@ public class OfflineDataLoading {
* @param que
*/
public void cancelDataOrder(boolean que) {
- synchronized (orderLock) {
- if (orderData != null) {
- try {
- orderData.cancelOrder();
- }
- catch (NullPointerException e) {
- System.err.println("Null pointer in Cancel data order " + e.getMessage());
+// threadMessage("Calling cancelDataOrder");
+ synchronized (orderLock) {
+// threadMessage("cancelDataOrder is in synchronized oderLock");
+ if (orderData != null) {
+ try {
+ boolean isCancelled = orderData.cancelOrder();
+// threadMessage("candelDataOrder returned: isCancelled = " + isCancelled);
+ }
+ catch (NullPointerException e) {
+ System.err.println("Null pointer in Cancel data order " + e.getMessage());
+ }
}
}
- }
if (que) this.waitingDataLoads.clear();
}
/**
@@ -319,16 +322,19 @@ public class OfflineDataLoading {
@Override
protected Integer doInBackground() {
+// threadMessage("Start background");
try {
-// System.out.println("Enter get offline data " + pamDataBlock.getDataName() + " Thread " + Thread.currentThread().getName());
-
+ // System.out.println("Enter get offline data " + pamDataBlock.getDataName() + " Thread " + Thread.currentThread().getName());
+
clearAllFFTBlocks();
+// threadMessage("Called clearAllFTBlocks");
int ans = getOfflineData(offlineDataInfo);
-// System.out.println("Leave get offline data " + pamDataBlock.getDataName());
+ // System.out.println("Leave get offline data " + pamDataBlock.getDataName());
if (this == orderData) {
orderData = null;
}
+// threadMessage("End background exit code " + ans);
return ans;
}
catch (Exception e) {
@@ -338,8 +344,8 @@ public class OfflineDataLoading {
}
return 0;
}
-
}
+
@Override
protected void done() {
@@ -354,7 +360,7 @@ public class OfflineDataLoading {
if (isCancelled()) {
status = REQUEST_INTERRUPTED;
//check whether the cancelled thread should be saved for later loading.
-// System.out.println("The load has been cancelled: " + offlineDataInfo.getCurrentObserver().getObserverName());
+ // System.out.println("The load has been cancelled: " + offlineDataInfo.getCurrentObserver().getObserverName());
checkDataReloadQue(offlineDataInfo);
}
else {
@@ -376,11 +382,11 @@ public class OfflineDataLoading {
}
-// System.out.println("WAITING DATA LOAD");
+ // System.out.println("WAITING DATA LOAD");
for (int i=0; i {
}
+// private void threadMessage(String message) {
+// String name = Thread.currentThread().getName();
+// String now = PamCalendar.formatDBDateTime(System.currentTimeMillis(), true);
+// System.out.printf("Thread %s load for %s at %s: %s\n", name, pamDataBlock.getDataName(), now, message);
+// }
+
private void launchQuedReloadThread(){
-// System.out.println(" launchQuedReloadThread(): ");
+ // System.out.println(" launchQuedReloadThread(): ");
if (waitingDataLoads.size()>=1){
OfflineDataLoadInfo offlineDataInfo=waitingDataLoads.get(0);
-// System.out.println("Removing: " + offlineDataInfo.getCurrentObserver().getObserverName());
+ // System.out.println("Removing: " + offlineDataInfo.getCurrentObserver().getObserverName());
waitingDataLoads.remove(0);
this.orderOfflineData(offlineDataInfo);
}
@@ -470,15 +482,15 @@ public class OfflineDataLoading {
pamDataBlock.clearAll();
-// System.out.println("Start loading some offline data: from " + PamCalendar.formatDateTime(offlineDataInfo.getStartMillis() ) +" to "+
-// PamCalendar.formatDateTime(offlineDataInfo.getEndMillis() ) + " "+offlineDataInfo.getCurrentObserver().getObserverName() +
-// " "+offlineDataInfo.getLoadKeepLayers());
+ // System.out.println("Start loading some offline data: from " + PamCalendar.formatDateTime(offlineDataInfo.getStartMillis() ) +" to "+
+ // PamCalendar.formatDateTime(offlineDataInfo.getEndMillis() ) + " "+offlineDataInfo.getCurrentObserver().getObserverName() +
+ // " "+offlineDataInfo.getLoadKeepLayers());
lastRequestAnswer = pamDataBlock.getParentProcess().getOfflineData(offlineDataInfo);
// System.out.println(String.format("getOfflineData %s has %d units ",
// getDataName(), getUnitsCount()));
-// System.out.println("Orderring done: " + offlineDataInfo.getCurrentObserver().getObserverName() + " " + offlineDataInfo.getLoadKeepLayers());
+ // System.out.println("Orderring done: " + offlineDataInfo.getCurrentObserver().getObserverName() + " " + offlineDataInfo.getLoadKeepLayers());
//reset some of the changeable variables in offline data info.
offlineDataInfo.reset();
diff --git a/src/PamguardMVC/dataSelector/DataSelectorSettings.java b/src/PamguardMVC/dataSelector/DataSelectorSettings.java
index 7d593f4d..f29c8103 100644
--- a/src/PamguardMVC/dataSelector/DataSelectorSettings.java
+++ b/src/PamguardMVC/dataSelector/DataSelectorSettings.java
@@ -23,7 +23,9 @@ public class DataSelectorSettings implements Serializable, ManagedParameters {
if (selectorParams == null) {
selectorParams = new Hashtable<>();
}
+ if (name != null) {
selectorParams.put(name, params);
+ }
}
/**
diff --git a/src/bearinglocaliser/offline/BLOfflineTask.java b/src/bearinglocaliser/offline/BLOfflineTask.java
index 3f98c031..3fcde7c1 100644
--- a/src/bearinglocaliser/offline/BLOfflineTask.java
+++ b/src/bearinglocaliser/offline/BLOfflineTask.java
@@ -22,6 +22,7 @@ public class BLOfflineTask extends OfflineTask {
this.bearingLocaliserControl = bearingLocaliserControl;
bearingProcess = bearingLocaliserControl.getBearingProcess();
this.addRequiredDataBlock(rawOrFFTBlock = bearingProcess.getParentDataBlock());
+ addAffectedDataBlock(detectionBlock);
// PamDataBlock detectionSource = bearingLocaliserControl.getDetectionMonitor().getParentDataBlock();
// this.setParentDataBlock(detectionSource);
// setParentDataBlock(bearingProcess.getParentDataBlock());
diff --git a/src/difar/DifarProcess.java b/src/difar/DifarProcess.java
index 694c4529..644da952 100644
--- a/src/difar/DifarProcess.java
+++ b/src/difar/DifarProcess.java
@@ -316,11 +316,19 @@ public class DifarProcess extends PamProcess {
sP = difarControl.getDifarParameters().findSpeciesParams(difarDataUnit);
}
difarDataUnit.setDisplaySampleRate(sP.sampleRate);
- if (!sP.useMarkedBandsForSpectrogramClips){
- double[] frequency = {sP.processFreqMin, sP.processFreqMax};
- difarDataUnit.setFrequency(frequency);
+ if (difarDataUnit.triggerName.equals(difarControl.getUnitName())) { // User detection
+ if (!sP.useMarkedBandsForSpectrogramClips ){
+ double[] frequency = {sP.processFreqMin, sP.processFreqMax};
+ difarDataUnit.setFrequency(frequency);
+ }
+ } else { //Check whether to override auto detection freq limits with DIFAR limits
+ if (!sP.useDetectionLimitsForTriggeredDetections ){ // Auto-detection
+ double[] frequency = {sP.processFreqMin, sP.processFreqMax};
+ difarDataUnit.setFrequency(frequency);
+ }
}
+
demuxDataUnit(difarDataUnit, demuxWorker, startTime);
calculateDifarGram(difarDataUnit, demuxWorker, startTime);
diff --git a/src/rawDeepLearningClassifier/dlClassification/DLClassifyProcess.java b/src/rawDeepLearningClassifier/dlClassification/DLClassifyProcess.java
index 1e28666c..d2b79841 100644
--- a/src/rawDeepLearningClassifier/dlClassification/DLClassifyProcess.java
+++ b/src/rawDeepLearningClassifier/dlClassification/DLClassifyProcess.java
@@ -106,7 +106,8 @@ public class DLClassifyProcess extends PamInstantProcess {
addOutputDataBlock(dlDetectionDataBlock);
dlDetectionDataBlock.setNaturalLifetimeMillis(600*1000); //keep this data for a while.
dlDetectionDataBlock.addDataAnnotationType(dlAnnotationType);
-
+ //ClipGeneration allows processing of detections by DIFAR module (and possibly others)
+ dlDetectionDataBlock.setCanClipGenerate(true);
//add custom graphics
PamDetectionOverlayGraphics overlayGraphics = new DLGraphics(dlModelResultDataBlock);
overlayGraphics.setDetectionData(true);
@@ -482,7 +483,7 @@ public class DLClassifyProcess extends PamInstantProcess {
DataUnitBaseData basicData = groupDataBuffer.get(0).getBasicData().clone();
basicData.setMillisecondDuration(1000.*rawdata[0].length/this.sampleRate);
- basicData.setSampleDuration((long) (groupDataBuffer.size()*dlControl.getDLParams().sampleHop));
+ basicData.setSampleDuration((long) (groupDataBuffer.size()*dlControl.getDLParams().rawSampleSize));
// System.out.println("Model result: " + modelResult.size());
DLDetection dlDetection = new DLDetection(basicData, rawdata);