mirror of
https://github.com/PAMGuard/PAMGuard.git
synced 2024-11-21 22:52:22 +00:00
Merge Tethys updates from DG (#146)
* Localization output * update localiser output * Start effort management system * Start of Effort plotting Strat of effort plotting on map. Framework for using Effort data in other areas (such as Tethys output). * Logger forms update Effort and Symbol selectors working with Logger forms. Also functions to add, edit and delete form rows in Viewer mode. * Update LoggerFormGraphics.java add in correct symbol managemet to forms graphics. * Effort lines on map Sort of working OK in real time mode. * Working effort system Currently only for map, but seems to work OK * Update Tethys to latest nilus schema * Raven importer Start of a system for a raven importer. Not quite working yet. * Raven import Basic functionality working. Not nice to use though. * Tethys Localization work Abstracting out writing of localization objects and document header information so that individual localisers can give fine scale control of this stuff. * updated Nilus A few updates around track and target motion measures.
This commit is contained in:
parent
bea4a544d0
commit
46bd88c197
@ -6,9 +6,8 @@
|
|||||||
<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/jdk-19">
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="module" value="true"/>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -25,7 +25,9 @@
|
|||||||
|
|
||||||
# eclipse project file
|
# eclipse project file
|
||||||
.project
|
.project
|
||||||
.hprof
|
# hprof memory analyser files.
|
||||||
|
*.hprof
|
||||||
|
java_pid*.*
|
||||||
|
|
||||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
hs_err_pid*
|
hs_err_pid*
|
||||||
|
@ -11,9 +11,9 @@ org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
|
|||||||
org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
|
org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=16
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
|
||||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
org.eclipse.jdt.core.compiler.compliance=16
|
org.eclipse.jdt.core.compiler.compliance=17
|
||||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
@ -22,5 +22,5 @@ org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
|||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
||||||
org.eclipse.jdt.core.compiler.release=disabled
|
org.eclipse.jdt.core.compiler.release=enabled
|
||||||
org.eclipse.jdt.core.compiler.source=16
|
org.eclipse.jdt.core.compiler.source=17
|
||||||
|
4
repo/tethys/org/nilus/3.1 - July24/_remote.repositories
Normal file
4
repo/tethys/org/nilus/3.1 - July24/_remote.repositories
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
|
||||||
|
#Tue Jul 16 19:29:56 BST 2024
|
||||||
|
nilus-3.1.jar>=
|
||||||
|
nilus-3.1.pom>=
|
BIN
repo/tethys/org/nilus/3.1 - July24/nilus-3.1-javadoc.jar
Normal file
BIN
repo/tethys/org/nilus/3.1 - July24/nilus-3.1-javadoc.jar
Normal file
Binary file not shown.
BIN
repo/tethys/org/nilus/3.1 - July24/nilus-3.1.jar
Normal file
BIN
repo/tethys/org/nilus/3.1 - July24/nilus-3.1.jar
Normal file
Binary file not shown.
9
repo/tethys/org/nilus/3.1 - July24/nilus-3.1.pom
Normal file
9
repo/tethys/org/nilus/3.1 - July24/nilus-3.1.pom
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>tethys.org</groupId>
|
||||||
|
<artifactId>nilus</artifactId>
|
||||||
|
<version>3.1</version>
|
||||||
|
<description>POM was created from install:install-file</description>
|
||||||
|
</project>
|
@ -1,4 +1,4 @@
|
|||||||
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
|
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
|
||||||
#Tue Jul 16 19:29:56 BST 2024
|
#Fri Aug 16 08:59:15 BST 2024
|
||||||
nilus-3.1.jar>=
|
nilus-3.1.jar>=
|
||||||
nilus-3.1.pom>=
|
nilus-3.1.pom>=
|
||||||
|
8
repo/tethys/org/nilus/3.1/m2e-lastUpdated.properties
Normal file
8
repo/tethys/org/nilus/3.1/m2e-lastUpdated.properties
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#Fri Aug 02 15:37:21 BST 2024
|
||||||
|
repo|file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo|sources=1722609441199
|
||||||
|
github|douggillespie|https\://maven.pkg.github.com/douggillespie/xbee-java|sources=1722609441199
|
||||||
|
central|https\://repo1.maven.org/maven2|sources=1722609441199
|
||||||
|
talan|https\://nexus.talanlabs.com/content/repositories/releases/|sources=1722609441199
|
||||||
|
bedatadriven|https\://nexus.bedatadriven.com/content/groups/public/|sources=1722609441199
|
||||||
|
unidata-all|https\://artifacts.unidata.ucar.edu/repository/unidata-all/|sources=1722609441199
|
||||||
|
repo|file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG/repo|sources=1721155730840
|
Binary file not shown.
16
repo/tethys/org/nilus/3.1/nilus-3.1-sources.jar.lastUpdated
Normal file
16
repo/tethys/org/nilus/3.1/nilus-3.1-sources.jar.lastUpdated
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
|
||||||
|
#Fri Aug 02 15:37:21 BST 2024
|
||||||
|
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1721155730838
|
||||||
|
https\://repo1.maven.org/maven2/.error=
|
||||||
|
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG/repo/.error=
|
||||||
|
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1722609441195
|
||||||
|
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
|
||||||
|
https\://nexus.bedatadriven.com/content/groups/public/.error=
|
||||||
|
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1721155730561
|
||||||
|
https\://repo1.maven.org/maven2/.lastUpdated=1721155729103
|
||||||
|
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact tethys.org\:nilus\:jar\:sources\:3.1 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
|
||||||
|
https\://maven.pkg.github.com/douggillespie/xbee-java/.error=
|
||||||
|
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG/repo/.lastUpdated=1721155729822
|
||||||
|
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.error=
|
||||||
|
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1721155730818
|
||||||
|
https\://maven.pkg.github.com/douggillespie/xbee-java/.lastUpdated=1721155729785
|
Binary file not shown.
@ -77,7 +77,7 @@ public class AcquisitionProcess extends PamProcess {
|
|||||||
|
|
||||||
protected PamRawDataBlock rawDataBlock;
|
protected PamRawDataBlock rawDataBlock;
|
||||||
|
|
||||||
private PamDataBlock<DaqStatusDataUnit> daqStatusDataBlock;
|
private DaqStatusDataBlock daqStatusDataBlock;
|
||||||
|
|
||||||
AcquisitionProcess acquisitionProcess;
|
AcquisitionProcess acquisitionProcess;
|
||||||
|
|
||||||
@ -125,12 +125,11 @@ public class AcquisitionProcess extends PamProcess {
|
|||||||
// PamUtils.makeChannelMap(acquisitionControl.acquisitionParameters.nChannels),
|
// PamUtils.makeChannelMap(acquisitionControl.acquisitionParameters.nChannels),
|
||||||
// acquisitionControl.acquisitionParameters.sampleRate));
|
// acquisitionControl.acquisitionParameters.sampleRate));
|
||||||
|
|
||||||
addOutputDataBlock(rawDataBlock = new PamRawDataBlock(name, this, //Xiao Yan Deng
|
addOutputDataBlock(rawDataBlock = new PamRawDataBlock(name, this,
|
||||||
PamUtils.makeChannelMap(acquisitionControl.acquisitionParameters.nChannels,acquisitionControl.acquisitionParameters.getHardwareChannelList()),
|
PamUtils.makeChannelMap(acquisitionControl.acquisitionParameters.nChannels,acquisitionControl.acquisitionParameters.getHardwareChannelList()),
|
||||||
acquisitionControl.acquisitionParameters.sampleRate));
|
acquisitionControl.acquisitionParameters.sampleRate));
|
||||||
|
|
||||||
|
daqStatusDataBlock = new DaqStatusDataBlock(acquisitionControl.getUnitName(),
|
||||||
daqStatusDataBlock = new PamDataBlock<DaqStatusDataUnit>(DaqStatusDataUnit.class, acquisitionControl.getUnitName(),
|
|
||||||
this, 0);
|
this, 0);
|
||||||
// daqStatusDataBlock.
|
// daqStatusDataBlock.
|
||||||
addOutputDataBlock(daqStatusDataBlock);
|
addOutputDataBlock(daqStatusDataBlock);
|
||||||
@ -1241,6 +1240,9 @@ public class AcquisitionProcess extends PamProcess {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public InputStoreInfo getStoreInfo(boolean detail) {
|
public InputStoreInfo getStoreInfo(boolean detail) {
|
||||||
|
if (runningSystem == null) {
|
||||||
|
runningSystem = acquisitionControl.findDaqSystem(null);
|
||||||
|
}
|
||||||
if (runningSystem instanceof DataInputStore) {
|
if (runningSystem instanceof DataInputStore) {
|
||||||
return ((DataInputStore) runningSystem).getStoreInfo(detail);
|
return ((DataInputStore) runningSystem).getStoreInfo(detail);
|
||||||
}
|
}
|
||||||
|
23
src/Acquisition/DaqStatusDataBlock.java
Normal file
23
src/Acquisition/DaqStatusDataBlock.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package Acquisition;
|
||||||
|
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamProcess;
|
||||||
|
import dataMap.OfflineDataMap;
|
||||||
|
import effort.EffortProvider;
|
||||||
|
import effort.binary.DataMapEffortProvider;
|
||||||
|
import generalDatabase.DBControlUnit;
|
||||||
|
|
||||||
|
public class DaqStatusDataBlock extends PamDataBlock<DaqStatusDataUnit> {
|
||||||
|
|
||||||
|
public DaqStatusDataBlock(String dataName, PamProcess parentProcess, int channelMap) {
|
||||||
|
super(DaqStatusDataUnit.class, dataName, parentProcess, channelMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EffortProvider autoEffortProvider() {
|
||||||
|
// make a provider which will pick up on the database data.
|
||||||
|
// db data are written every 60s, so put 62s as max gap.
|
||||||
|
return new DataMapEffortProvider(this, DBControlUnit.class, 62000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -945,8 +945,12 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
|
|||||||
InputStoreInfo storeInfo = new InputStoreInfo(acquisitionControl, allFiles.size(), firstFileStart, lastFileStart, lastFileEnd);
|
InputStoreInfo storeInfo = new InputStoreInfo(acquisitionControl, allFiles.size(), firstFileStart, lastFileStart, lastFileEnd);
|
||||||
if (detail) {
|
if (detail) {
|
||||||
long[] allFileStarts = new long[allFiles.size()];
|
long[] allFileStarts = new long[allFiles.size()];
|
||||||
|
long[] allFileEnds = new long[allFiles.size()];
|
||||||
for (int i = 0; i < allFiles.size(); i++) {
|
for (int i = 0; i < allFiles.size(); i++) {
|
||||||
allFileStarts[i] = getFileStartTime(allFiles.get(i).getAbsoluteFile());
|
WavFileType aFile = allFiles.get(i);
|
||||||
|
allFileStarts[i] = getFileStartTime(aFile.getAbsoluteFile());
|
||||||
|
aFile.getAudioInfo();
|
||||||
|
allFileEnds[i] = (allFileStarts[i] + (long) (aFile.getDurationInSeconds()*1000.));
|
||||||
if (allFileStarts[i] < firstFileStart) {
|
if (allFileStarts[i] < firstFileStart) {
|
||||||
// System.out.printf("Swap first file from %s to %s\n", firstFile.getName(), allFiles.get(i).getName());
|
// System.out.printf("Swap first file from %s to %s\n", firstFile.getName(), allFiles.get(i).getName());
|
||||||
firstFile = allFiles.get(i);
|
firstFile = allFiles.get(i);
|
||||||
@ -961,6 +965,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
|
|||||||
storeInfo.setFirstFileStart(firstFileStart); // just incase changed.
|
storeInfo.setFirstFileStart(firstFileStart); // just incase changed.
|
||||||
storeInfo.setLastFileEnd(lastFileEnd); // just incase changed
|
storeInfo.setLastFileEnd(lastFileEnd); // just incase changed
|
||||||
storeInfo.setFileStartTimes(allFileStarts);
|
storeInfo.setFileStartTimes(allFileStarts);
|
||||||
|
storeInfo.setFileEndTimes(allFileEnds);
|
||||||
}
|
}
|
||||||
return storeInfo;
|
return storeInfo;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package GPS;
|
|||||||
|
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
|
|
||||||
|
import GPS.effort.GpsEffortProvider;
|
||||||
import nmeaEmulator.EmulatedData;
|
import nmeaEmulator.EmulatedData;
|
||||||
import nmeaEmulator.NMEAEmulator;
|
import nmeaEmulator.NMEAEmulator;
|
||||||
import pamScrollSystem.ViewLoadObserver;
|
import pamScrollSystem.ViewLoadObserver;
|
||||||
@ -37,6 +38,7 @@ public class GPSDataBlock extends PamDataBlock<GpsDataUnit> implements NMEAEmula
|
|||||||
public GPSDataBlock(PamProcess process) {
|
public GPSDataBlock(PamProcess process) {
|
||||||
super(GpsDataUnit.class, process.getPamControlledUnit().getUnitName(), process, 1);
|
super(GpsDataUnit.class, process.getPamControlledUnit().getUnitName(), process, 1);
|
||||||
setSynchLock(NavDataSynchronisation.getSynchobject());
|
setSynchLock(NavDataSynchronisation.getSynchobject());
|
||||||
|
setEffortProvider(new GpsEffortProvider(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
96
src/GPS/effort/GpsEffortProvider.java
Normal file
96
src/GPS/effort/GpsEffortProvider.java
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package GPS.effort;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import GPS.GPSDataBlock;
|
||||||
|
import PamView.symbol.PamSymbolManager;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import PamguardMVC.dataSelector.DataSelector;
|
||||||
|
import dataMap.OfflineDataMap;
|
||||||
|
import effort.EffortDataUnit;
|
||||||
|
import effort.EffortProvider;
|
||||||
|
|
||||||
|
public class GpsEffortProvider extends EffortProvider {
|
||||||
|
|
||||||
|
private GPSDataBlock gpsDataBlock;
|
||||||
|
|
||||||
|
private GpsEffortSymbolManager effortSymbolManager;
|
||||||
|
|
||||||
|
private EffortDataUnit realTimeData;
|
||||||
|
|
||||||
|
public GpsEffortProvider(GPSDataBlock parentDataBlock) {
|
||||||
|
super(parentDataBlock);
|
||||||
|
this.gpsDataBlock = parentDataBlock;
|
||||||
|
effortSymbolManager = new GpsEffortSymbolManager(gpsDataBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EffortDataUnit getEffort(long timeMilliseconds) {
|
||||||
|
return getSingleEffort();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<EffortDataUnit> getAllEffortThings() {
|
||||||
|
EffortDataUnit singleEff = getSingleEffort();
|
||||||
|
ArrayList<EffortDataUnit> effList = new ArrayList<>(1);
|
||||||
|
if (singleEff != null) {
|
||||||
|
effList.add(singleEff);
|
||||||
|
}
|
||||||
|
return effList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DataSelector getDataSelector(String selectorName) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PamSymbolManager getSymbolManager() {
|
||||||
|
return effortSymbolManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
private EffortDataUnit getSingleEffort() {
|
||||||
|
if (!isViewer()) {
|
||||||
|
return realTimeData;
|
||||||
|
}
|
||||||
|
OfflineDataMap dataMap = gpsDataBlock.getPrimaryDataMap();
|
||||||
|
if (dataMap == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
EffortDataUnit effData = new EffortDataUnit(this, null, dataMap.getFirstDataTime(), dataMap.getLastDataTime());
|
||||||
|
return effData;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return gpsDataBlock.getDataName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void realTimeStart(long timeMilliseconds) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void realTimeStop(long timeMilliseconds) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void newData(PamDataUnit pamDataUnit) {
|
||||||
|
if (realTimeData == null) {
|
||||||
|
realTimeData = new EffortDataUnit(this,null,pamDataUnit.getTimeMilliseconds(), pamDataUnit.getTimeMilliseconds());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
realTimeData.setEffortEnd(pamDataUnit.getTimeMilliseconds());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void viewerLoadData() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
22
src/GPS/effort/GpsEffortSymbolManager.java
Normal file
22
src/GPS/effort/GpsEffortSymbolManager.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package GPS.effort;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
|
||||||
|
import PamView.PamColors;
|
||||||
|
import PamView.PamSymbolType;
|
||||||
|
import PamView.PamColors.PamColor;
|
||||||
|
import PamView.symbol.StandardSymbolManager;
|
||||||
|
import PamView.symbol.SymbolData;
|
||||||
|
import PamView.symbol.SymbolOnlyManager;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
|
||||||
|
public class GpsEffortSymbolManager extends SymbolOnlyManager {
|
||||||
|
|
||||||
|
private static Color defColour = PamColors.getInstance().getColor(PamColor.GPSTRACK);
|
||||||
|
private static SymbolData defaultSymbol = new SymbolData(PamSymbolType.SYMBOL_LINESEGMENT, 10, 10, false, defColour, defColour);
|
||||||
|
|
||||||
|
public GpsEffortSymbolManager(PamDataBlock pamDataBlock) {
|
||||||
|
super(pamDataBlock, defaultSymbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,9 +1,6 @@
|
|||||||
package Localiser;
|
package Localiser;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import tethys.localization.LocalizationCreator;
|
||||||
|
|
||||||
import PamDetection.LocContents;
|
|
||||||
import PamDetection.LocalisationInfo;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface to attach to localisation algorithms which can provide basic information
|
* Interface to attach to localisation algorithms which can provide basic information
|
||||||
@ -19,4 +16,12 @@ public interface LocalisationAlgorithm {
|
|||||||
*/
|
*/
|
||||||
public LocalisationAlgorithmInfo getAlgorithmInfo();
|
public LocalisationAlgorithmInfo getAlgorithmInfo();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get something that can make LocalisationType objects of a form
|
||||||
|
* a bit bespoke to the type of localiser. This may be better than having
|
||||||
|
* the standard functions in LocalizationBuilder guess what's best.
|
||||||
|
* @return can be null in which case standard functions will do the best they can.
|
||||||
|
*/
|
||||||
|
public LocalizationCreator getTethysCreator();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import java.io.Serializable;
|
|||||||
import Localiser.LocalisationAlgorithmInfo;
|
import Localiser.LocalisationAlgorithmInfo;
|
||||||
import PamDetection.LocContents;
|
import PamDetection.LocContents;
|
||||||
import pamMaths.PamVector;
|
import pamMaths.PamVector;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class CombinedBearingLocaliser implements BearingLocaliser {
|
public class CombinedBearingLocaliser implements BearingLocaliser {
|
||||||
@ -86,4 +87,10 @@ public class CombinedBearingLocaliser implements BearingLocaliser {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalizationCreator getTethysCreator() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import Localiser.LocalisationAlgorithmInfo;
|
|||||||
import PamDetection.LocContents;
|
import PamDetection.LocContents;
|
||||||
import PamUtils.PamUtils;
|
import PamUtils.PamUtils;
|
||||||
import pamMaths.PamVector;
|
import pamMaths.PamVector;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
|
|
||||||
public class LSQBearingLocaliser implements BearingLocaliser {
|
public class LSQBearingLocaliser implements BearingLocaliser {
|
||||||
|
|
||||||
@ -232,4 +233,10 @@ public class LSQBearingLocaliser implements BearingLocaliser {
|
|||||||
public LocalisationAlgorithmInfo getAlgorithmInfo() {
|
public LocalisationAlgorithmInfo getAlgorithmInfo() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalizationCreator getTethysCreator() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ import PamUtils.ArrayDump;
|
|||||||
import PamUtils.PamUtils;
|
import PamUtils.PamUtils;
|
||||||
import PamUtils.SystemTiming;
|
import PamUtils.SystemTiming;
|
||||||
import pamMaths.PamVector;
|
import pamMaths.PamVector;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maximum likelihood bearing localiser to get bearings from a closely
|
* Maximum likelihood bearing localiser to get bearings from a closely
|
||||||
@ -652,4 +653,10 @@ public class MLGridBearingLocaliser implements BearingLocaliser {
|
|||||||
public LocalisationAlgorithmInfo getAlgorithmInfo() {
|
public LocalisationAlgorithmInfo getAlgorithmInfo() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalizationCreator getTethysCreator() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ import PamUtils.ArrayDump;
|
|||||||
import PamUtils.PamUtils;
|
import PamUtils.PamUtils;
|
||||||
import PamUtils.SystemTiming;
|
import PamUtils.SystemTiming;
|
||||||
import pamMaths.PamVector;
|
import pamMaths.PamVector;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
import tethys.pamdata.AutoTethysProvider;
|
import tethys.pamdata.AutoTethysProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -762,6 +763,12 @@ public class MLGridBearingLocaliser2 implements BearingLocaliser {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalizationCreator getTethysCreator() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For passing to Tethys output.
|
* For passing to Tethys output.
|
||||||
* @author dg50
|
* @author dg50
|
||||||
|
@ -11,6 +11,7 @@ import Localiser.LocalisationAlgorithmInfo;
|
|||||||
import PamDetection.LocContents;
|
import PamDetection.LocContents;
|
||||||
import PamUtils.PamUtils;
|
import PamUtils.PamUtils;
|
||||||
import pamMaths.PamVector;
|
import pamMaths.PamVector;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Really simple BearingLocaliser which works with two element closely
|
* Really simple BearingLocaliser which works with two element closely
|
||||||
@ -309,4 +310,9 @@ public class PairBearingLocaliser implements BearingLocaliser {
|
|||||||
public LocalisationAlgorithmInfo getAlgorithmInfo() {
|
public LocalisationAlgorithmInfo getAlgorithmInfo() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public LocalizationCreator getTethysCreator() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ import Localiser.LocalisationAlgorithmInfo;
|
|||||||
import PamDetection.LocContents;
|
import PamDetection.LocContents;
|
||||||
import PamUtils.PamUtils;
|
import PamUtils.PamUtils;
|
||||||
import pamMaths.PamVector;
|
import pamMaths.PamVector;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class SimplexBearingLocaliser implements BearingLocaliser {
|
public class SimplexBearingLocaliser implements BearingLocaliser {
|
||||||
@ -250,6 +251,12 @@ public class SimplexBearingLocaliser implements BearingLocaliser {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalizationCreator getTethysCreator() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Serializable getParameters() {
|
public Serializable getParameters() {
|
||||||
return null;
|
return null;
|
||||||
|
@ -38,6 +38,7 @@ import java.awt.geom.AffineTransform;
|
|||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
@ -83,6 +84,7 @@ import PamView.paneloverlay.overlaymark.MarkOverlayDraw;
|
|||||||
import PamView.symbol.PamSymbolChooser;
|
import PamView.symbol.PamSymbolChooser;
|
||||||
import PamView.symbol.PamSymbolManager;
|
import PamView.symbol.PamSymbolManager;
|
||||||
import PamView.symbol.SymbolData;
|
import PamView.symbol.SymbolData;
|
||||||
|
import PamView.symbol.modifier.SymbolModifier;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
import PamguardMVC.PamDataUnit;
|
import PamguardMVC.PamDataUnit;
|
||||||
import PamguardMVC.PamObservable;
|
import PamguardMVC.PamObservable;
|
||||||
@ -90,6 +92,8 @@ import PamguardMVC.PamObserver;
|
|||||||
import PamguardMVC.dataSelector.DataSelectDialog;
|
import PamguardMVC.dataSelector.DataSelectDialog;
|
||||||
import PamguardMVC.dataSelector.DataSelector;
|
import PamguardMVC.dataSelector.DataSelector;
|
||||||
import PamguardMVC.debug.Debug;
|
import PamguardMVC.debug.Debug;
|
||||||
|
import effort.EffortDataUnit;
|
||||||
|
import effort.EffortProvider;
|
||||||
import pamMaths.PamVector;
|
import pamMaths.PamVector;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,6 +136,8 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
|
|||||||
|
|
||||||
private boolean repaintBase = false;
|
private boolean repaintBase = false;
|
||||||
|
|
||||||
|
private EffortDataUnit latestEffort;
|
||||||
|
|
||||||
public MapPanel(MapController mapController, SimpleMap simpleMap) {
|
public MapPanel(MapController mapController, SimpleMap simpleMap) {
|
||||||
this.mapController = mapController;
|
this.mapController = mapController;
|
||||||
this.simpleMapRef = simpleMap;
|
this.simpleMapRef = simpleMap;
|
||||||
@ -786,6 +792,7 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
|
|||||||
|
|
||||||
private GpsDataUnit lastDrawGpsDataUnit;
|
private GpsDataUnit lastDrawGpsDataUnit;
|
||||||
private Coordinate3d lastGpsCoodinate;
|
private Coordinate3d lastGpsCoodinate;
|
||||||
|
private PamSymbol latestSymbol;
|
||||||
|
|
||||||
long getMapStartTime() {
|
long getMapStartTime() {
|
||||||
switch (PamController.getInstance().getRunMode()) {
|
switch (PamController.getInstance().getRunMode()) {
|
||||||
@ -798,21 +805,69 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
|
|||||||
return PamCalendar.getTimeInMillis();
|
return PamCalendar.getTimeInMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public EffortProvider findEffortProvider() {
|
||||||
|
if (simpleMapRef.mapParameters.colourByEffort == false) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (simpleMapRef.effortDataBlock == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return simpleMapRef.effortDataBlock.getEffortProvider();
|
||||||
|
}
|
||||||
|
|
||||||
private void paintTrack(Graphics g, PamDataUnit lastDrawnUnit) {
|
private void paintTrack(Graphics g, PamDataUnit lastDrawnUnit) {
|
||||||
|
|
||||||
long mapStartTime = getMapStartTime();
|
|
||||||
g.setColor(PamColors.getInstance().getColor(PamColor.GPSTRACK));
|
GPSDataBlock gpsDataBlock = simpleMapRef.getGpsDataBlock();
|
||||||
|
if (gpsDataBlock == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PamSymbolChooser symbolModifier = null;
|
||||||
|
List<EffortDataUnit> effortThings = null;
|
||||||
|
EffortDataUnit currentEffortThing = null;
|
||||||
|
EffortProvider effortProvider = findEffortProvider();
|
||||||
|
PamSymbol effortSymbol = null;
|
||||||
|
Iterator<EffortDataUnit> effortIterator = null;
|
||||||
|
if (effortProvider != null) {
|
||||||
|
symbolModifier = effortProvider.getSymbolChooser(simpleMapRef.getSelectorName(), rectProj);
|
||||||
|
effortThings = effortProvider.getAllEffortThings();
|
||||||
|
if (effortThings == null || effortThings.size() == 0) {
|
||||||
|
effortThings = null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
effortIterator = effortThings.iterator();
|
||||||
|
}
|
||||||
|
if (effortIterator != null && effortIterator.hasNext()) {
|
||||||
|
currentEffortThing = effortIterator.next();
|
||||||
|
if (symbolModifier != null) {
|
||||||
|
// effortSymbol = symbolModifier.getPamSymbol(rectProj, currentEffortThing);
|
||||||
|
effortSymbol = effortProvider.getPamSymbol(symbolModifier, currentEffortThing);
|
||||||
|
latestEffort = currentEffortThing;
|
||||||
|
latestSymbol = effortSymbol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Graphics2D g2d = (Graphics2D) g;
|
Graphics2D g2d = (Graphics2D) g;
|
||||||
|
long mapStartTime = getMapStartTime();
|
||||||
|
Color defaultColour = PamColors.getInstance().getColor(PamColor.GPSTRACK);
|
||||||
|
if (effortSymbol != null) {
|
||||||
|
g2d.setStroke(new BasicStroke(effortSymbol.getLineThickness()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
g2d.setStroke(new BasicStroke(1));
|
g2d.setStroke(new BasicStroke(1));
|
||||||
|
}
|
||||||
|
if (effortSymbol != null && mapStartTime > currentEffortThing.getEffortStart()) {
|
||||||
|
g.setColor(effortSymbol.getLineColor());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g.setColor(defaultColour);
|
||||||
|
}
|
||||||
|
|
||||||
// GPSControl gpsControl = GPSControl.getGpsControl();
|
// GPSControl gpsControl = GPSControl.getGpsControl();
|
||||||
// if (gpsControl == null) {
|
// if (gpsControl == null) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
// PamDataBlock<GpsDataUnit> gpsDataBlock = gpsControl.getGpsDataBlock();
|
// PamDataBlock<GpsDataUnit> gpsDataBlock = gpsControl.getGpsDataBlock();
|
||||||
GPSDataBlock gpsDataBlock = simpleMapRef.getGpsDataBlock();
|
|
||||||
if (gpsDataBlock == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
long t1 = getMapStartTime(), t2 = Long.MAX_VALUE;
|
long t1 = getMapStartTime(), t2 = Long.MAX_VALUE;
|
||||||
if (PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW) {
|
if (PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW) {
|
||||||
t1 = simpleMapRef.getViewerScroller().getMinimumMillis();
|
t1 = simpleMapRef.getViewerScroller().getMinimumMillis();
|
||||||
@ -826,13 +881,48 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
|
|||||||
GpsDataUnit dataUnit;
|
GpsDataUnit dataUnit;
|
||||||
synchronized (gpsDataBlock.getSynchLock()) {
|
synchronized (gpsDataBlock.getSynchLock()) {
|
||||||
ListIterator<GpsDataUnit> gpsIterator = gpsDataBlock.getListIterator(0);
|
ListIterator<GpsDataUnit> gpsIterator = gpsDataBlock.getListIterator(0);
|
||||||
if (gpsIterator.hasNext()) {
|
|
||||||
dataUnit = gpsIterator.next();
|
dataUnit = gpsIterator.next();
|
||||||
|
|
||||||
|
if (gpsIterator.hasNext()) {
|
||||||
|
|
||||||
gpsData = dataUnit.getGpsData();
|
gpsData = dataUnit.getGpsData();
|
||||||
lastFixTime = dataUnit.getTimeMilliseconds();
|
lastFixTime = dataUnit.getTimeMilliseconds();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
c1 = rectProj.getCoord3d(gpsData.getLatitude(), gpsData.getLongitude(), 0.);
|
c1 = rectProj.getCoord3d(gpsData.getLatitude(), gpsData.getLongitude(), 0.);
|
||||||
while (gpsIterator.hasNext()) {
|
while (gpsIterator.hasNext()) {
|
||||||
dataUnit = gpsIterator.next();
|
dataUnit = gpsIterator.next();
|
||||||
|
|
||||||
|
// sort out effort colours.
|
||||||
|
// if (currentEffortThing != null) {
|
||||||
|
while (currentEffortThing != null && dataUnit.getTimeMilliseconds() > currentEffortThing.getEffortEnd()) {
|
||||||
|
// get the next one. then decide if we're in or not.
|
||||||
|
if (effortIterator.hasNext()) {
|
||||||
|
currentEffortThing = effortIterator.next();
|
||||||
|
if (symbolModifier != null) {
|
||||||
|
effortSymbol = effortProvider.getPamSymbol(symbolModifier, currentEffortThing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// else {
|
||||||
|
// currentEffortThing = null;
|
||||||
|
// effortSymbol = null;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
if (effortSymbol != null && currentEffortThing.inEffort(dataUnit.getTimeMilliseconds())) {
|
||||||
|
g.setColor(effortSymbol.getLineColor());
|
||||||
|
latestEffort = currentEffortThing;
|
||||||
|
latestSymbol = effortSymbol;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g.setColor(defaultColour);
|
||||||
|
// latestSymbol = null;
|
||||||
|
}
|
||||||
|
|
||||||
gpsData = dataUnit.getGpsData();
|
gpsData = dataUnit.getGpsData();
|
||||||
if (gpsData.isDataOk() == false) {
|
if (gpsData.isDataOk() == false) {
|
||||||
continue;
|
continue;
|
||||||
@ -909,7 +999,41 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
|
|||||||
private void paintNewGPSData(Graphics g, GpsDataUnit newGpsDataUnit) {
|
private void paintNewGPSData(Graphics g, GpsDataUnit newGpsDataUnit) {
|
||||||
|
|
||||||
Coordinate3d c2;
|
Coordinate3d c2;
|
||||||
|
// g.setColor(PamColors.getInstance().getColor(PamColor.GPSTRACK));
|
||||||
|
// if (latestSymbol != null) {
|
||||||
|
// float t = latestSymbol.getLineThickness();
|
||||||
|
// if (t != 1) {
|
||||||
|
// Graphics2D g2d = (Graphics2D) g;
|
||||||
|
// g2d.setStroke(new BasicStroke(t));
|
||||||
|
// }
|
||||||
|
// if (latestEffort != null && latestEffort.inEffort(newGpsDataUnit.getTimeMilliseconds())) {
|
||||||
|
// g.setColor(latestSymbol.getLineColor());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
EffortProvider effortProvider = findEffortProvider();
|
||||||
|
boolean effSet = false;
|
||||||
|
if (effortProvider != null) {
|
||||||
|
latestEffort = effortProvider.getLastEffort();
|
||||||
|
if (latestEffort != null) {
|
||||||
|
PamSymbolChooser symbolModifier = effortProvider.getSymbolChooser(simpleMapRef.getSelectorName(), rectProj);
|
||||||
|
if (symbolModifier != null) {
|
||||||
|
PamSymbol symbol = effortProvider.getPamSymbol(symbolModifier, latestEffort);
|
||||||
|
// PamSymbol symbol = symbolModifier.getPamSymbol(rectProj, latestEffort);
|
||||||
|
if (symbol != null && latestEffort.inEffort(newGpsDataUnit.getTimeMilliseconds())) {
|
||||||
|
symbol.getSymbolData().setGraphicsProperties(g);
|
||||||
|
effSet = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!effSet) {
|
||||||
g.setColor(PamColors.getInstance().getColor(PamColor.GPSTRACK));
|
g.setColor(PamColors.getInstance().getColor(PamColor.GPSTRACK));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This can get quite long, so need to do the same iterating through the effort data as for normal plotting.
|
||||||
|
*/
|
||||||
|
|
||||||
GpsData gpsData = newGpsDataUnit.getGpsData();
|
GpsData gpsData = newGpsDataUnit.getGpsData();
|
||||||
c2 = rectProj.getCoord3d(gpsData.getLatitude(), gpsData.getLongitude(), 0.);
|
c2 = rectProj.getCoord3d(gpsData.getLatitude(), gpsData.getLongitude(), 0.);
|
||||||
if (lastGpsCoodinate != null) {
|
if (lastGpsCoodinate != null) {
|
||||||
@ -1055,7 +1179,7 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
|
|||||||
mapDrawingOptions = null;
|
mapDrawingOptions = null;
|
||||||
rectProj.setProjectorDrawingOptions(null);
|
rectProj.setProjectorDrawingOptions(null);
|
||||||
}
|
}
|
||||||
DataSelector ds = dataBlock.getDataSelector(simpleMapRef.getUnitName(), false, DATASELECTNAME);
|
DataSelector ds = dataBlock.getDataSelector(simpleMapRef.getSelectorName(), false, DATASELECTNAME);
|
||||||
rectProj.setDataSelector(ds);
|
rectProj.setDataSelector(ds);
|
||||||
// see if the datablock has a symbol manager.
|
// see if the datablock has a symbol manager.
|
||||||
PamSymbolManager symbolManager = dataBlock.getPamSymbolManager();
|
PamSymbolManager symbolManager = dataBlock.getPamSymbolManager();
|
||||||
@ -1252,13 +1376,21 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addData(PamObservable o, PamDataUnit arg) {
|
public void addData(PamObservable o, PamDataUnit arg) {
|
||||||
|
// if (arg instanceof EffortDataUnit) {
|
||||||
|
// won't work since only the data send notifications.
|
||||||
|
// System.out.println("Effort add, so repaint base");
|
||||||
|
// repaintBaseDrawing();
|
||||||
|
// }
|
||||||
// PamDataBlock block = (PamDataBlock) o;
|
// PamDataBlock block = (PamDataBlock) o;
|
||||||
repaint(250);
|
repaint(250);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateData(PamObservable observable, PamDataUnit pamDataUnit) {
|
public void updateData(PamObservable observable, PamDataUnit pamDataUnit) {
|
||||||
|
// if (pamDataUnit instanceof EffortDataUnit) {
|
||||||
|
// System.out.println("Effort update, so repaint base");
|
||||||
|
// repaintBaseDrawing();
|
||||||
|
// }
|
||||||
repaint(250);
|
repaint(250);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1340,6 +1472,10 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
|
|||||||
aBlock.addObserver(this);
|
aBlock.addObserver(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EffortProvider effBlock = findEffortProvider();
|
||||||
|
if (effBlock != null) {
|
||||||
|
effBlock.getParentDataBlock().addObserver(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void createKey() {
|
protected void createKey() {
|
||||||
@ -1852,6 +1988,27 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
|
|||||||
this.mapController = mapController;
|
this.mapController = mapController;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getToolTipText(MouseEvent event) {
|
||||||
|
String tip = super.getToolTipText(event);
|
||||||
|
if (tip == null) {
|
||||||
|
return tip;
|
||||||
|
}
|
||||||
|
if (tip.startsWith("<html>GPS") == false) {
|
||||||
|
return tip;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EffortDataUnit findEffortThing(long timeMilliseconds) {
|
||||||
|
EffortProvider effortProvider = findEffortProvider();
|
||||||
|
if (effortProvider == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return effortProvider.getEffort(timeMilliseconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -95,6 +95,12 @@ public class MapParameters implements Serializable, Cloneable, ManagedParameters
|
|||||||
|
|
||||||
public int symbolSize = Hydrophone.DefaultSymbolSize;
|
public int symbolSize = Hydrophone.DefaultSymbolSize;
|
||||||
|
|
||||||
|
public boolean colourByEffort = false;
|
||||||
|
/**
|
||||||
|
* Name of data block providing effort data.
|
||||||
|
*/
|
||||||
|
public String effortDataSource;
|
||||||
|
|
||||||
private static final int defaultMapRange = 10000;
|
private static final int defaultMapRange = 10000;
|
||||||
/**
|
/**
|
||||||
* Value to store persistently between runs.
|
* Value to store persistently between runs.
|
||||||
|
@ -31,7 +31,12 @@ import Array.Hydrophone;
|
|||||||
import Map.gridbaselayer.GridDialogPanel;
|
import Map.gridbaselayer.GridDialogPanel;
|
||||||
import PamView.dialog.PamDialog;
|
import PamView.dialog.PamDialog;
|
||||||
import PamView.dialog.PamGridBagContraints;
|
import PamView.dialog.PamGridBagContraints;
|
||||||
|
import PamView.dialog.SettingsButton;
|
||||||
|
import PamView.dialog.SourcePanel;
|
||||||
import PamView.panel.PamNorthPanel;
|
import PamView.panel.PamNorthPanel;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import effort.EffortProvider;
|
||||||
|
import effort.swing.EffortSourcePanel;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -65,6 +70,8 @@ public class MapParametersDialog extends PamDialog {
|
|||||||
|
|
||||||
private JCheckBox showSurface = new JCheckBox("Show sea surface");
|
private JCheckBox showSurface = new JCheckBox("Show sea surface");
|
||||||
|
|
||||||
|
private JCheckBox colourByEffort = new JCheckBox("Colour track-line by efort");
|
||||||
|
|
||||||
private MapFileManager mapFileManager;
|
private MapFileManager mapFileManager;
|
||||||
|
|
||||||
public JSpinner symbolSizeSpinner;
|
public JSpinner symbolSizeSpinner;
|
||||||
@ -79,6 +86,10 @@ public class MapParametersDialog extends PamDialog {
|
|||||||
|
|
||||||
private SimpleMap simpleMap;
|
private SimpleMap simpleMap;
|
||||||
|
|
||||||
|
private EffortSourcePanel effortSourcePanel;
|
||||||
|
|
||||||
|
private SettingsButton effortSettings;
|
||||||
|
|
||||||
private MapParametersDialog(java.awt.Window parentFrame, SimpleMap simpleMap) {
|
private MapParametersDialog(java.awt.Window parentFrame, SimpleMap simpleMap) {
|
||||||
|
|
||||||
super(parentFrame, "Map Options", true);
|
super(parentFrame, "Map Options", true);
|
||||||
@ -110,15 +121,21 @@ public class MapParametersDialog extends PamDialog {
|
|||||||
setDialogComponent(tabbedPane);
|
setDialogComponent(tabbedPane);
|
||||||
setHelpPoint("mapping.mapHelp.docs.overview");
|
setHelpPoint("mapping.mapHelp.docs.overview");
|
||||||
// this.enableHelpButton(true);
|
// this.enableHelpButton(true);
|
||||||
|
colourByEffort.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
enableControls();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
//hydroCheckBox.get
|
//hydroCheckBox.get
|
||||||
}
|
}
|
||||||
// MapParameters oldParameters, MapFileManager mapFile
|
// MapParameters oldParameters, MapFileManager mapFile
|
||||||
|
|
||||||
public static MapParameters showDialog(java.awt.Window parentFrame, SimpleMap simpleMap) {
|
public static MapParameters showDialog(java.awt.Window parentFrame, SimpleMap simpleMap) {
|
||||||
if (singleInstance == null || singleInstance.simpleMap != simpleMap) {
|
// if (singleInstance == null || singleInstance.simpleMap != simpleMap) {
|
||||||
singleInstance = new MapParametersDialog(parentFrame, simpleMap);
|
singleInstance = new MapParametersDialog(parentFrame, simpleMap);
|
||||||
}
|
// }
|
||||||
singleInstance.mapParameters = simpleMap.mapParameters.clone();
|
singleInstance.mapParameters = simpleMap.mapParameters.clone();
|
||||||
singleInstance.mapFileManager = simpleMap.mapFileManager;
|
singleInstance.mapFileManager = simpleMap.mapFileManager;
|
||||||
singleInstance.setParams();
|
singleInstance.setParams();
|
||||||
@ -141,6 +158,8 @@ public class MapParametersDialog extends PamDialog {
|
|||||||
keepShipCentred.setSelected(mapParameters.keepShipCentred);
|
keepShipCentred.setSelected(mapParameters.keepShipCentred);
|
||||||
headingUp.setSelected(mapParameters.headingUp);
|
headingUp.setSelected(mapParameters.headingUp);
|
||||||
showSurface.setSelected(mapParameters.hideSurface == false);
|
showSurface.setSelected(mapParameters.hideSurface == false);
|
||||||
|
colourByEffort.setSelected(mapParameters.colourByEffort);
|
||||||
|
effortSourcePanel.setSource(mapParameters.effortDataSource);
|
||||||
|
|
||||||
filePanel.setMapFile(mapParameters.mapFile);
|
filePanel.setMapFile(mapParameters.mapFile);
|
||||||
|
|
||||||
@ -177,6 +196,8 @@ public class MapParametersDialog extends PamDialog {
|
|||||||
return showWarning("Range rings sepration must be > 0");
|
return showWarning("Range rings sepration must be > 0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mapParameters.colourByEffort = colourByEffort.isSelected();
|
||||||
|
mapParameters.effortDataSource = effortSourcePanel.getSourceName();
|
||||||
}
|
}
|
||||||
catch (Exception Ex) {
|
catch (Exception Ex) {
|
||||||
return false;
|
return false;
|
||||||
@ -216,6 +237,14 @@ public class MapParametersDialog extends PamDialog {
|
|||||||
GridBagLayout layout;
|
GridBagLayout layout;
|
||||||
setLayout(layout = new GridBagLayout());
|
setLayout(layout = new GridBagLayout());
|
||||||
GridBagConstraints constraints = new PamGridBagContraints();
|
GridBagConstraints constraints = new PamGridBagContraints();
|
||||||
|
effortSourcePanel = new EffortSourcePanel(singleInstance);
|
||||||
|
effortSettings = new SettingsButton();
|
||||||
|
effortSettings.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
showEffortSettings();
|
||||||
|
}
|
||||||
|
});
|
||||||
// t.setLayout(new GridLayout(4,3));
|
// t.setLayout(new GridLayout(4,3));
|
||||||
constraints.anchor = GridBagConstraints.WEST;
|
constraints.anchor = GridBagConstraints.WEST;
|
||||||
constraints.gridx = 0;
|
constraints.gridx = 0;
|
||||||
@ -225,15 +254,28 @@ public class MapParametersDialog extends PamDialog {
|
|||||||
addComponent(this,trackShowtime = new JTextField(7), constraints);
|
addComponent(this,trackShowtime = new JTextField(7), constraints);
|
||||||
constraints.gridx ++;
|
constraints.gridx ++;
|
||||||
addComponent(this,new JLabel(" s "), constraints);
|
addComponent(this,new JLabel(" s "), constraints);
|
||||||
|
constraints.gridx++;
|
||||||
|
addComponent(this, colourByEffort, constraints);
|
||||||
|
constraints.gridx += 2;
|
||||||
|
constraints.gridwidth = 1;
|
||||||
|
constraints.fill = constraints.NONE;
|
||||||
|
constraints.anchor = constraints.LINE_END;
|
||||||
|
addComponent(this, effortSettings, constraints);
|
||||||
constraints.gridx = 0;
|
constraints.gridx = 0;
|
||||||
constraints.gridy ++;
|
constraints.gridy ++;
|
||||||
|
constraints.anchor = constraints.LINE_START;
|
||||||
addComponent(this,new JLabel("Data storage time "), constraints);
|
addComponent(this,new JLabel("Data storage time "), constraints);
|
||||||
constraints.gridx ++;
|
constraints.gridx ++;
|
||||||
addComponent(this,dataKeepTime = new JTextField(7), constraints);
|
addComponent(this,dataKeepTime = new JTextField(7), constraints);
|
||||||
constraints.gridx ++;
|
constraints.gridx ++;
|
||||||
addComponent(this,new JLabel(" s "), constraints);
|
addComponent(this,new JLabel(" s "), constraints);
|
||||||
|
constraints.gridx++;
|
||||||
|
constraints.gridwidth = 3;
|
||||||
|
constraints.fill = constraints.HORIZONTAL;
|
||||||
|
addComponent(this, effortSourcePanel.getPanel(), constraints);
|
||||||
constraints.gridx = 0;
|
constraints.gridx = 0;
|
||||||
constraints.gridy ++;
|
constraints.gridy ++;
|
||||||
|
constraints.gridwidth = 1;
|
||||||
addComponent(this,new JLabel("Data display time "), constraints);
|
addComponent(this,new JLabel("Data display time "), constraints);
|
||||||
constraints.gridx ++;
|
constraints.gridx ++;
|
||||||
addComponent(this,dataShowTime = new JTextField(7), constraints);
|
addComponent(this,dataShowTime = new JTextField(7), constraints);
|
||||||
@ -241,20 +283,32 @@ public class MapParametersDialog extends PamDialog {
|
|||||||
addComponent(this,new JLabel(" s "), constraints);
|
addComponent(this,new JLabel(" s "), constraints);
|
||||||
constraints.gridx = 0;
|
constraints.gridx = 0;
|
||||||
constraints.gridy ++;
|
constraints.gridy ++;
|
||||||
constraints.gridwidth = 3;
|
constraints.gridwidth = 2;
|
||||||
|
|
||||||
addComponent(this,shipCheckBox, constraints);
|
addComponent(this,shipCheckBox, constraints);
|
||||||
constraints.gridy ++;
|
constraints.gridx += constraints.gridwidth;
|
||||||
addComponent(this,keepShipOnMap, constraints);
|
addComponent(this,keepShipOnMap, constraints);
|
||||||
|
constraints.gridy ++;
|
||||||
constraints.gridx = 0;
|
constraints.gridx = 0;
|
||||||
constraints.gridy ++;
|
|
||||||
constraints.gridwidth = 3;
|
|
||||||
addComponent(this,keepShipCentred, constraints);
|
addComponent(this,keepShipCentred, constraints);
|
||||||
constraints.gridy ++;
|
constraints.gridx += constraints.gridwidth;
|
||||||
addComponent(this,headingUp, constraints);
|
addComponent(this,headingUp, constraints);
|
||||||
constraints.gridy ++;
|
constraints.gridy ++;
|
||||||
|
constraints.gridx = 0;
|
||||||
addComponent(this, showSurface, constraints);
|
addComponent(this, showSurface, constraints);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void showEffortSettings() {
|
||||||
|
PamDataBlock effortBlock = effortSourcePanel.getSource();
|
||||||
|
if (effortBlock == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
EffortProvider effortProvider = effortBlock.getEffortProvider();
|
||||||
|
if (effortProvider == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
effortProvider.showOptionsDialog(singleInstance, simpleMap.getSelectorName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class HydrophonePanel extends JPanel {
|
class HydrophonePanel extends JPanel {
|
||||||
@ -491,6 +545,9 @@ public class MapParametersDialog extends PamDialog {
|
|||||||
colourByChannel.setEnabled(hydroCheckBox.isSelected());
|
colourByChannel.setEnabled(hydroCheckBox.isSelected());
|
||||||
symbolSizeSpinner.setEnabled(hydroCheckBox.isSelected());
|
symbolSizeSpinner.setEnabled(hydroCheckBox.isSelected());
|
||||||
ringsRange.setEnabled(ringsType.getSelectedIndex() > 0);
|
ringsRange.setEnabled(ringsType.getSelectedIndex() > 0);
|
||||||
|
boolean ec = colourByEffort.isSelected();
|
||||||
|
effortSettings.setSelected(ec);
|
||||||
|
effortSourcePanel.setEnabled(ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ import PamUtils.LatLong;
|
|||||||
import PamUtils.PamCoordinate;
|
import PamUtils.PamCoordinate;
|
||||||
import PamUtils.PamUtils;
|
import PamUtils.PamUtils;
|
||||||
import PamguardMVC.debug.Debug;
|
import PamguardMVC.debug.Debug;
|
||||||
|
import effort.EffortDataUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Map Rectangle Projector.
|
* The Map Rectangle Projector.
|
||||||
@ -427,8 +428,16 @@ public class MapRectProjector extends MapProjector {
|
|||||||
if (rPix > 20) {
|
if (rPix > 20) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
EffortDataUnit effortData = mapPanelRef.findEffortThing(closest.getTimeMilliseconds());
|
||||||
|
if (effortData == null) {
|
||||||
return closest.getSummaryString();
|
return closest.getSummaryString();
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
String effSummary = effortData.toString();
|
||||||
|
String str = closest.getSummaryString() + "Effort: " + effSummary;
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,6 +101,7 @@ import PamguardMVC.PamObservable;
|
|||||||
import PamguardMVC.PamObserver;
|
import PamguardMVC.PamObserver;
|
||||||
import PamguardMVC.dataSelector.DataSelector;
|
import PamguardMVC.dataSelector.DataSelector;
|
||||||
import PamguardMVC.debug.Debug;
|
import PamguardMVC.debug.Debug;
|
||||||
|
import effort.EffortProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mainly a container for map objects, holding the main MapPanel and the right
|
* Mainly a container for map objects, holding the main MapPanel and the right
|
||||||
@ -201,6 +202,8 @@ public class SimpleMap extends JPanel implements PamObserver, PamScrollObserver,
|
|||||||
|
|
||||||
private GridbaseControl gridBaseControl;
|
private GridbaseControl gridBaseControl;
|
||||||
|
|
||||||
|
protected PamDataBlock effortDataBlock;
|
||||||
|
|
||||||
// JToolTip mouseToolTip;
|
// JToolTip mouseToolTip;
|
||||||
|
|
||||||
public SimpleMap(MapController mapController, boolean isMainTab, MapPanel mapPanel) {
|
public SimpleMap(MapController mapController, boolean isMainTab, MapPanel mapPanel) {
|
||||||
@ -264,6 +267,14 @@ public class SimpleMap extends JPanel implements PamObserver, PamScrollObserver,
|
|||||||
this(mapController, isMainTab, new MapPanel(mapController, null));
|
this(mapController, isMainTab, new MapPanel(mapController, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name for data selectors and data filters.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getSelectorName() {
|
||||||
|
return getUnitName();
|
||||||
|
}
|
||||||
|
|
||||||
public String getUnitName() {
|
public String getUnitName() {
|
||||||
if (thisMapIndex != 0) {
|
if (thisMapIndex != 0) {
|
||||||
return mapController.getUnitName()+thisMapIndex;
|
return mapController.getUnitName()+thisMapIndex;
|
||||||
@ -571,6 +582,8 @@ public class SimpleMap extends JPanel implements PamObserver, PamScrollObserver,
|
|||||||
|
|
||||||
initViewerControls();
|
initViewerControls();
|
||||||
|
|
||||||
|
effortDataBlock = PamController.getInstance().getDataBlockByLongName(mapParameters.effortDataSource);
|
||||||
|
|
||||||
if (mapFileManager != null) {
|
if (mapFileManager != null) {
|
||||||
mapFileManager.readFileData(mapParameters.mapFile);
|
mapFileManager.readFileData(mapParameters.mapFile);
|
||||||
}
|
}
|
||||||
@ -1146,10 +1159,24 @@ public class SimpleMap extends JPanel implements PamObserver, PamScrollObserver,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
subscribeEffortProvider();
|
||||||
return changes;
|
return changes;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subscribe the effort provider to the scroller.
|
||||||
|
*/
|
||||||
|
private void subscribeEffortProvider() {
|
||||||
|
if (viewerScroller == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
EffortProvider effProv = mapPanel.findEffortProvider();
|
||||||
|
if (effProv != null) {
|
||||||
|
viewerScroller.addDataBlock(effProv.getParentDataBlock());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public PamScrollSlider getViewerScroller() {
|
public PamScrollSlider getViewerScroller() {
|
||||||
return viewerScroller;
|
return viewerScroller;
|
||||||
}
|
}
|
||||||
@ -1206,6 +1233,7 @@ public class SimpleMap extends JPanel implements PamObserver, PamScrollObserver,
|
|||||||
getViewerScroller().reLoad();
|
getViewerScroller().reLoad();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
effortDataBlock = PamController.getInstance().getDataBlockByLongName(mapParameters.effortDataSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -8,6 +8,7 @@ public class InputStoreInfo {
|
|||||||
private int nFiles;
|
private int nFiles;
|
||||||
private long firstFileStart, lastFileStart, lastFileEnd;
|
private long firstFileStart, lastFileStart, lastFileEnd;
|
||||||
private long[] fileStartTimes;
|
private long[] fileStartTimes;
|
||||||
|
private long[] allFileEnds;
|
||||||
|
|
||||||
public InputStoreInfo(DataInputStore dataInputStore, int nFiles, long firstFileStart, long lastFileStart, long lastFileEnd) {
|
public InputStoreInfo(DataInputStore dataInputStore, int nFiles, long firstFileStart, long lastFileStart, long lastFileEnd) {
|
||||||
super();
|
super();
|
||||||
@ -97,6 +98,21 @@ public class InputStoreInfo {
|
|||||||
this.lastFileEnd = lastFileEnd;
|
this.lastFileEnd = lastFileEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set all file end times.
|
||||||
|
* @param allFileEnds
|
||||||
|
*/
|
||||||
|
public void setFileEndTimes(long[] allFileEnds) {
|
||||||
|
this.allFileEnds = allFileEnds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the allFileEnds
|
||||||
|
*/
|
||||||
|
public long[] getAllFileEnds() {
|
||||||
|
return allFileEnds;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1334,7 +1334,13 @@ public class PamController implements PamControllerInterface, PamSettings {
|
|||||||
}
|
}
|
||||||
for (int iU = 0; iU < pamControlledUnits.size(); iU++) {
|
for (int iU = 0; iU < pamControlledUnits.size(); iU++) {
|
||||||
for (int iP = 0; iP < pamControlledUnits.get(iU).getNumPamProcesses(); iP++) {
|
for (int iP = 0; iP < pamControlledUnits.get(iU).getNumPamProcesses(); iP++) {
|
||||||
pamControlledUnits.get(iU).getPamProcess(iP).pamStart();
|
PamProcess pamProcess = pamControlledUnits.get(iU).getPamProcess(iP);
|
||||||
|
pamProcess.pamStart();
|
||||||
|
int nOut = pamProcess.getNumOutputDataBlocks();
|
||||||
|
for (int iB = 0; iB < nOut; iB++) {
|
||||||
|
PamDataBlock outBlock = pamProcess.getOutputDataBlock(iB);
|
||||||
|
outBlock.pamStart(startTime);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// long t2 = System.currentTimeMillis();
|
// long t2 = System.currentTimeMillis();
|
||||||
// System.out.printf("==================================Time taken to call
|
// System.out.printf("==================================Time taken to call
|
||||||
@ -1379,10 +1385,18 @@ public class PamController implements PamControllerInterface, PamSettings {
|
|||||||
// statusCheckThread.start();
|
// statusCheckThread.start();
|
||||||
ArrayList<PamControlledUnit> pamControlledUnits = pamConfiguration.getPamControlledUnits();
|
ArrayList<PamControlledUnit> pamControlledUnits = pamConfiguration.getPamControlledUnits();
|
||||||
|
|
||||||
|
long stopTime = PamCalendar.getTimeInMillis();
|
||||||
|
|
||||||
// tell all controlled units to stop
|
// tell all controlled units to stop
|
||||||
for (int iU = 0; iU < pamControlledUnits.size(); iU++) {
|
for (int iU = 0; iU < pamControlledUnits.size(); iU++) {
|
||||||
for (int iP = 0; iP < pamControlledUnits.get(iU).getNumPamProcesses(); iP++) {
|
for (int iP = 0; iP < pamControlledUnits.get(iU).getNumPamProcesses(); iP++) {
|
||||||
pamControlledUnits.get(iU).getPamProcess(iP).pamStop();
|
PamProcess pamProcess = pamControlledUnits.get(iU).getPamProcess(iP);
|
||||||
|
pamProcess.pamStop();
|
||||||
|
int nOut = pamProcess.getNumOutputDataBlocks();
|
||||||
|
for (int iB = 0; iB < nOut; iB++) {
|
||||||
|
PamDataBlock outBlock = pamProcess.getOutputDataBlock(iB);
|
||||||
|
outBlock.pamStop(stopTime);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ import fftManager.PamFFTControl;
|
|||||||
import group3dlocaliser.Group3DLocaliserControl;
|
import group3dlocaliser.Group3DLocaliserControl;
|
||||||
import meygenturbine.MeygenTurbine;
|
import meygenturbine.MeygenTurbine;
|
||||||
import printscreen.PrintScreenControl;
|
import printscreen.PrintScreenControl;
|
||||||
|
import ravendata.RavenControl;
|
||||||
import rockBlock.RockBlockControl;
|
import rockBlock.RockBlockControl;
|
||||||
import tethys.TethysControl;
|
import tethys.TethysControl;
|
||||||
import turbineops.TurbineOperationControl;
|
import turbineops.TurbineOperationControl;
|
||||||
@ -473,6 +474,12 @@ final public class PamModel implements PamSettings {
|
|||||||
mi.setMaxNumber(1);
|
mi.setMaxNumber(1);
|
||||||
//mi.addGUICompatabilityFlag(PamGUIManager.FX); //has FX enabled GUI.
|
//mi.addGUICompatabilityFlag(PamGUIManager.FX); //has FX enabled GUI.
|
||||||
mi.setHidden(SMRUEnable.isEnable() == false);
|
mi.setHidden(SMRUEnable.isEnable() == false);
|
||||||
|
|
||||||
|
mi = PamModuleInfo.registerControlledUnit(RavenControl.class.getName(), RavenControl.defaultName);
|
||||||
|
mi.setToolTipText("Import data from Raven selection tables");
|
||||||
|
mi.setModulesMenuGroup(utilitiesGroup);
|
||||||
|
mi.setHidden(SMRUEnable.isEnable() == false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -703,7 +703,7 @@ public class PamDetectionOverlayGraphics extends PanelOverlayDraw {
|
|||||||
Coordinate3d topLeft = generalProjector.getCoord3d(pamDetection.getTimeMilliseconds(),
|
Coordinate3d topLeft = generalProjector.getCoord3d(pamDetection.getTimeMilliseconds(),
|
||||||
frequency[1], 0);
|
frequency[1], 0);
|
||||||
Coordinate3d botRight = generalProjector.getCoord3d(pamDetection.getTimeMilliseconds() +
|
Coordinate3d botRight = generalProjector.getCoord3d(pamDetection.getTimeMilliseconds() +
|
||||||
pamDetection.getSampleDuration() * 1000./parentDataBlock.getSampleRate(),
|
pamDetection.getDurationInMilliseconds(),
|
||||||
frequency[0], 0);
|
frequency[0], 0);
|
||||||
|
|
||||||
if (botRight.x < topLeft.x){
|
if (botRight.x < topLeft.x){
|
||||||
|
@ -372,6 +372,10 @@ public class WarnOnce implements PamSettings {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parent == null) {
|
||||||
|
parent = PamController.getMainFrame();
|
||||||
|
}
|
||||||
|
|
||||||
// show the warning
|
// show the warning
|
||||||
if (canShowDialog()) {
|
if (canShowDialog()) {
|
||||||
WarnOnceDialog wo = new WarnOnceDialog(parent, title, message, messageType, helpPoint, error, okButtonText, cancelButtonText);
|
WarnOnceDialog wo = new WarnOnceDialog(parent, title, message, messageType, helpPoint, error, okButtonText, cancelButtonText);
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package PamView.symbol;
|
package PamView.symbol;
|
||||||
|
|
||||||
|
import java.awt.BasicStroke;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import PamView.PamSymbolType;
|
import PamView.PamSymbolType;
|
||||||
@ -165,4 +168,17 @@ public class SymbolData implements Serializable, Cloneable {
|
|||||||
this.symbol = symbol;
|
this.symbol = symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the line properties for the given graphics handle.
|
||||||
|
* @param g
|
||||||
|
*/
|
||||||
|
public void setGraphicsProperties(Graphics g) {
|
||||||
|
if (lineColor != null) {
|
||||||
|
g.setColor(lineColor);
|
||||||
|
}
|
||||||
|
if (lineThickness != 1) {
|
||||||
|
((Graphics2D) g).setStroke(new BasicStroke(lineThickness));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
21
src/PamView/symbol/SymbolOnlyManager.java
Normal file
21
src/PamView/symbol/SymbolOnlyManager.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package PamView.symbol;
|
||||||
|
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version of the standard symbol manager that only has the optoin on the main
|
||||||
|
* symbol type and no modifiers whatsoever.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SymbolOnlyManager extends StandardSymbolManager {
|
||||||
|
|
||||||
|
public SymbolOnlyManager(PamDataBlock pamDataBlock, SymbolData defaultSymbol) {
|
||||||
|
super(pamDataBlock, defaultSymbol);
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addSymbolModifiers(PamSymbolChooser psc) {
|
||||||
|
}
|
||||||
|
}
|
@ -58,10 +58,13 @@ import tethys.species.DataBlockSpeciesManager;
|
|||||||
import dataGram.DatagramProvider;
|
import dataGram.DatagramProvider;
|
||||||
import dataMap.BespokeDataMapGraphic;
|
import dataMap.BespokeDataMapGraphic;
|
||||||
import dataMap.OfflineDataMap;
|
import dataMap.OfflineDataMap;
|
||||||
|
import effort.EffortProvider;
|
||||||
|
import effort.binary.DataMapEffortProvider;
|
||||||
import annotation.DataAnnotationType;
|
import annotation.DataAnnotationType;
|
||||||
import annotation.handler.AnnotationHandler;
|
import annotation.handler.AnnotationHandler;
|
||||||
import binaryFileStorage.BinaryDataSource;
|
import binaryFileStorage.BinaryDataSource;
|
||||||
import binaryFileStorage.BinaryOfflineDataMap;
|
import binaryFileStorage.BinaryOfflineDataMap;
|
||||||
|
import binaryFileStorage.BinaryStore;
|
||||||
import binaryFileStorage.SecondaryBinaryStore;
|
import binaryFileStorage.SecondaryBinaryStore;
|
||||||
import PamController.OfflineDataStore;
|
import PamController.OfflineDataStore;
|
||||||
import PamController.PamControlledUnit;
|
import PamController.PamControlledUnit;
|
||||||
@ -1081,6 +1084,11 @@ public class PamDataBlock<Tunit extends PamDataUnit> extends PamObservable {
|
|||||||
System.err.printf("Not loading %s since initialisation not yet complete\n", getDataName());
|
System.err.printf("Not loading %s since initialisation not yet complete\n", getDataName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// long tenDays = 3600L*24L*1000L*10L;
|
||||||
|
// if (offlineDataLoadInfo.getEndMillis() - offlineDataLoadInfo.getStartMillis() > tenDays) {
|
||||||
|
// System.out.printf("Big many day data load %s to %s in %s", PamCalendar.formatDateTime(offlineDataLoadInfo.getStartMillis()),
|
||||||
|
// PamCalendar.formatDateTime(offlineDataLoadInfo.getEndMillis()) ,getLongDataName());
|
||||||
|
// }
|
||||||
|
|
||||||
saveViewerData();
|
saveViewerData();
|
||||||
|
|
||||||
@ -1125,6 +1133,11 @@ public class PamDataBlock<Tunit extends PamDataUnit> extends PamObservable {
|
|||||||
lastViewerUID = Math.max(lastViewerUID, uid);
|
lastViewerUID = Math.max(lastViewerUID, uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EffortProvider effProv = getEffortProvider();
|
||||||
|
if (effProv != null) {
|
||||||
|
effProv.viewerLoadData();
|
||||||
|
}
|
||||||
|
|
||||||
return loadOk;
|
return loadOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1269,6 +1282,10 @@ public class PamDataBlock<Tunit extends PamDataUnit> extends PamObservable {
|
|||||||
*/
|
*/
|
||||||
if (shouldNotify()) {
|
if (shouldNotify()) {
|
||||||
notifyInstantObservers(pamDataUnit);
|
notifyInstantObservers(pamDataUnit);
|
||||||
|
EffortProvider effProvider = getEffortProvider();
|
||||||
|
if (effProvider != null) {
|
||||||
|
effProvider.newData(pamDataUnit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offlineDataLoading.isCurrentOfflineLoadKeep()) {
|
if (offlineDataLoading.isCurrentOfflineLoadKeep()) {
|
||||||
@ -3054,7 +3071,16 @@ public class PamDataBlock<Tunit extends PamDataUnit> extends PamObservable {
|
|||||||
case PamControllerInterface.HYDROPHONE_ARRAY_CHANGED:
|
case PamControllerInterface.HYDROPHONE_ARRAY_CHANGED:
|
||||||
clearDataOrigins();
|
clearDataOrigins();
|
||||||
break;
|
break;
|
||||||
|
case PamController.INITIALIZATION_COMPLETE:
|
||||||
|
effortProvider = autoEffortProvider();
|
||||||
|
break;
|
||||||
|
case PamController.ADD_CONTROLLEDUNIT:
|
||||||
|
if (PamController.getInstance().isInitializationComplete()) {
|
||||||
|
effortProvider = autoEffortProvider();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3658,6 +3684,8 @@ public class PamDataBlock<Tunit extends PamDataUnit> extends PamObservable {
|
|||||||
|
|
||||||
private DataSelectorCreator dataSelectorCreator;
|
private DataSelectorCreator dataSelectorCreator;
|
||||||
|
|
||||||
|
private EffortProvider effortProvider;
|
||||||
|
|
||||||
public void setRecordingTrigger(RecorderTrigger recorderTrigger) {
|
public void setRecordingTrigger(RecorderTrigger recorderTrigger) {
|
||||||
this.recorderTrigger = recorderTrigger;
|
this.recorderTrigger = recorderTrigger;
|
||||||
RecorderControl.registerRecorderTrigger(recorderTrigger);
|
RecorderControl.registerRecorderTrigger(recorderTrigger);
|
||||||
@ -4345,4 +4373,60 @@ public class PamDataBlock<Tunit extends PamDataUnit> extends PamObservable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the effort provider.
|
||||||
|
*/
|
||||||
|
public EffortProvider getEffortProvider() {
|
||||||
|
return effortProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto generate an effort provider. This may get called many times
|
||||||
|
* for blocks without effort, but that doesn't really matter since its
|
||||||
|
* only going to happen when opening dialogs, etc.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public EffortProvider autoEffortProvider() {
|
||||||
|
if (effortProvider != null) {
|
||||||
|
// don't change if there already is one.
|
||||||
|
return effortProvider;
|
||||||
|
}
|
||||||
|
// see if we can do an auto binary one.
|
||||||
|
BinaryStore binaryStore = BinaryStore.findBinaryStoreControl();
|
||||||
|
if (binaryStore != null && getBinaryDataSource() != null) {
|
||||||
|
return new DataMapEffortProvider(this, BinaryStore.class);
|
||||||
|
}
|
||||||
|
// other options may follow ...
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param effortProvider the effortProvider to set
|
||||||
|
*/
|
||||||
|
protected void setEffortProvider(EffortProvider effortProvider) {
|
||||||
|
this.effortProvider = effortProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Need this notification at startup time to perform a few standard actions.
|
||||||
|
* @param startTime
|
||||||
|
*/
|
||||||
|
public void pamStart(long startTime) {
|
||||||
|
EffortProvider effP = getEffortProvider();
|
||||||
|
if (effP != null) {
|
||||||
|
effP.realTimeStart(startTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Need this notification at stop time to perform a few standard actions.
|
||||||
|
* @param startTime
|
||||||
|
*/
|
||||||
|
public void pamStop(long stopTime) {
|
||||||
|
EffortProvider effP = getEffortProvider();
|
||||||
|
if (effP != null) {
|
||||||
|
effP.realTimeStop(stopTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -977,8 +977,16 @@ abstract public class PamDataUnit<T extends PamDataUnit, U extends PamDataUnit>
|
|||||||
// add frequency and amplitude information
|
// add frequency and amplitude information
|
||||||
double[] frequency = this.getFrequency();
|
double[] frequency = this.getFrequency();
|
||||||
if (frequency != null) {
|
if (frequency != null) {
|
||||||
|
boolean allzeros = true;
|
||||||
|
for (int i = 0; i < frequency.length; i++) {
|
||||||
|
if (frequency[i] > 0) {
|
||||||
|
allzeros = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!allzeros) {
|
||||||
str += "Frequency: " + FrequencyFormat.formatFrequencyRange(this.getFrequency(), true) + "<br>";
|
str += "Frequency: " + FrequencyFormat.formatFrequencyRange(this.getFrequency(), true) + "<br>";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (getAmplitudeDB() != 0) {
|
if (getAmplitudeDB() != 0) {
|
||||||
str += String.format("Amplitude: %3.1fdB<br>", getAmplitudeDB());
|
str += String.format("Amplitude: %3.1fdB<br>", getAmplitudeDB());
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,8 @@ import Acquisition.RawDataBinaryDataSource;
|
|||||||
import PamController.PamController;
|
import PamController.PamController;
|
||||||
import PamDetection.RawDataUnit;
|
import PamDetection.RawDataUnit;
|
||||||
import PamUtils.PamUtils;
|
import PamUtils.PamUtils;
|
||||||
|
import dataMap.OfflineDataMap;
|
||||||
|
import effort.EffortProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extension of RecyclingDataBlock that is used for Raw audio data.
|
* Extension of RecyclingDataBlock that is used for Raw audio data.
|
||||||
@ -602,6 +604,13 @@ public class PamRawDataBlock extends AcousticDataBlock<RawDataUnit> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EffortProvider autoEffortProvider() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// @Override
|
// @Override
|
||||||
// protected void findParentSource() {
|
// protected void findParentSource() {
|
||||||
// super.findParentSource();
|
// super.findParentSource();
|
||||||
|
@ -32,6 +32,7 @@ import bearinglocaliser.toad.TOADBearingProvider;
|
|||||||
import offlineProcessing.OLProcessDialog;
|
import offlineProcessing.OLProcessDialog;
|
||||||
import offlineProcessing.OfflineTaskGroup;
|
import offlineProcessing.OfflineTaskGroup;
|
||||||
import pamViewFX.fxNodes.pamDialogFX.PamDialogFX2AWT;
|
import pamViewFX.fxNodes.pamDialogFX.PamDialogFX2AWT;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
import userDisplay.UserDisplayControl;
|
import userDisplay.UserDisplayControl;
|
||||||
|
|
||||||
public class BearingLocaliserControl extends PamControlledUnit implements PamSettings, LocalisationAlgorithm, LocalisationAlgorithmInfo {
|
public class BearingLocaliserControl extends PamControlledUnit implements PamSettings, LocalisationAlgorithm, LocalisationAlgorithmInfo {
|
||||||
@ -238,6 +239,12 @@ public class BearingLocaliserControl extends PamControlledUnit implements PamSet
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalizationCreator getTethysCreator() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private BearingAlgorithm findAlgorithm() {
|
private BearingAlgorithm findAlgorithm() {
|
||||||
BearingAlgorithmGroup[] groups = bearingProcess.getBearingAlgorithmGroups();
|
BearingAlgorithmGroup[] groups = bearingProcess.getBearingAlgorithmGroups();
|
||||||
|
@ -39,8 +39,7 @@ import org.w3c.dom.Element;
|
|||||||
import rocca.RoccaControl;
|
import rocca.RoccaControl;
|
||||||
import soundPlayback.PlaybackControl;
|
import soundPlayback.PlaybackControl;
|
||||||
import targetMotionOld.TargetMotionLocaliser;
|
import targetMotionOld.TargetMotionLocaliser;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
|
|
||||||
import binaryFileStorage.BinaryStore;
|
import binaryFileStorage.BinaryStore;
|
||||||
import Filters.FilterDialog;
|
import Filters.FilterDialog;
|
||||||
import Filters.FilterParams;
|
import Filters.FilterParams;
|
||||||
@ -1300,5 +1299,11 @@ public class ClickControl extends PamControlledUnit implements PamSettings, Loca
|
|||||||
return clickDetector.getLocaliserInfo();
|
return clickDetector.getLocaliserInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalizationCreator getTethysCreator() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package clickDetector;
|
|||||||
|
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
|
|
||||||
|
import Localiser.LocalisationAlgorithm;
|
||||||
import pamScrollSystem.ViewLoadObserver;
|
import pamScrollSystem.ViewLoadObserver;
|
||||||
import tethys.TethysControl;
|
import tethys.TethysControl;
|
||||||
import tethys.pamdata.TethysDataProvider;
|
import tethys.pamdata.TethysDataProvider;
|
||||||
@ -336,5 +337,15 @@ public class ClickDataBlock extends AcousticDataBlock<ClickDetection> implement
|
|||||||
return new DataAutomationInfo(DataAutomation.AUTOMATIC);
|
return new DataAutomationInfo(DataAutomation.AUTOMATIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalisationAlgorithm getLocalisationAlgorithm() {
|
||||||
|
/*
|
||||||
|
* This is usually the bearing algorithm from click control.
|
||||||
|
* Howeveer, someone may have added an additional bearing localiser
|
||||||
|
* in which case, the default function should find that.
|
||||||
|
*/
|
||||||
|
return super.getLocalisationAlgorithm();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import Localiser.LocalisationAlgorithm;
|
||||||
import Localiser.detectionGroupLocaliser.GroupDetection;
|
import Localiser.detectionGroupLocaliser.GroupDetection;
|
||||||
import PamController.PamController;
|
import PamController.PamController;
|
||||||
import PamController.PamControllerInterface;
|
import PamController.PamControllerInterface;
|
||||||
@ -16,9 +17,11 @@ import PamController.PamViewParameters;
|
|||||||
import PamUtils.PamCalendar;
|
import PamUtils.PamCalendar;
|
||||||
import PamView.symbol.StandardSymbolManager;
|
import PamView.symbol.StandardSymbolManager;
|
||||||
import pamScrollSystem.ViewLoadObserver;
|
import pamScrollSystem.ViewLoadObserver;
|
||||||
|
import targetMotionOld.TargetMotionLocaliser;
|
||||||
import tethys.TethysControl;
|
import tethys.TethysControl;
|
||||||
import tethys.pamdata.TethysDataProvider;
|
import tethys.pamdata.TethysDataProvider;
|
||||||
import tethys.species.DataBlockSpeciesManager;
|
import tethys.species.DataBlockSpeciesManager;
|
||||||
|
import clickDetector.ClickControl;
|
||||||
import clickDetector.ClickDetection;
|
import clickDetector.ClickDetection;
|
||||||
//import staticLocaliser.StaticLocaliserControl;
|
//import staticLocaliser.StaticLocaliserControl;
|
||||||
//import staticLocaliser.StaticLocaliserProvider;
|
//import staticLocaliser.StaticLocaliserProvider;
|
||||||
@ -317,6 +320,20 @@ public class OfflineEventDataBlock extends SuperDetDataBlock<OfflineEventDataUni
|
|||||||
return new DataAutomationInfo(DataAutomation.MANUALANDAUTOMATIC);
|
return new DataAutomationInfo(DataAutomation.MANUALANDAUTOMATIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalisationAlgorithm getLocalisationAlgorithm() {
|
||||||
|
/**
|
||||||
|
* Need to override the default, which would have been finding the
|
||||||
|
* main click control. Here, we need to explicitly find the
|
||||||
|
* Target Motion Localiser
|
||||||
|
*/
|
||||||
|
ClickControl clickControl = clickDetector.getClickControl();
|
||||||
|
ClicksOffline clicksOffline = clickControl.getClicksOffline();
|
||||||
|
TargetMotionLocaliser<GroupDetection> tml = clickControl.getTargetMotionLocaliser();
|
||||||
|
return tml;
|
||||||
|
// return super.getLocalisationAlgorithm();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
104
src/effort/EffortDataUnit.java
Normal file
104
src/effort/EffortDataUnit.java
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
package effort;
|
||||||
|
|
||||||
|
import PamUtils.PamCalendar;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
|
||||||
|
public class EffortDataUnit extends PamDataUnit {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Value for effort end to say that effort is ongoing.
|
||||||
|
*/
|
||||||
|
public static final long ONGOINGEFFORT = Long.MAX_VALUE/2;
|
||||||
|
|
||||||
|
private PamDataUnit referenceDataUnit;
|
||||||
|
private EffortProvider effortProvider;
|
||||||
|
|
||||||
|
|
||||||
|
public EffortDataUnit(EffortProvider effortProvider, PamDataUnit referenceDataUnit, long effortStart, long effortEnd) {
|
||||||
|
super(effortStart);
|
||||||
|
getBasicData().setEndTime(effortEnd);
|
||||||
|
this.effortProvider = effortProvider;
|
||||||
|
this.setReferenceDataUnit(referenceDataUnit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return Start of effort period.
|
||||||
|
*/
|
||||||
|
public long getEffortStart() {
|
||||||
|
return getTimeMilliseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return End of effort period.
|
||||||
|
*/
|
||||||
|
public long getEffortEnd() {
|
||||||
|
return getEndTimeInMilliseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the effort end time
|
||||||
|
* @param endTime
|
||||||
|
*/
|
||||||
|
public void setEffortEnd(long endTime) {
|
||||||
|
getBasicData().setEndTime(endTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param timeMilliseconds
|
||||||
|
* @return time is in effort period
|
||||||
|
*/
|
||||||
|
public boolean inEffort(long timeMilliseconds) {
|
||||||
|
return (timeMilliseconds >= getEffortStart() && timeMilliseconds <= getEffortEnd());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description of the effort, for tool tips, etc.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getEffortDescription() {
|
||||||
|
return this.getSummaryString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the referenceDataUnit
|
||||||
|
*/
|
||||||
|
public PamDataUnit getReferenceDataUnit() {
|
||||||
|
return referenceDataUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param referenceDataUnit the referenceDataUnit to set
|
||||||
|
*/
|
||||||
|
public void setReferenceDataUnit(PamDataUnit referenceDataUnit) {
|
||||||
|
this.referenceDataUnit = referenceDataUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
String str;
|
||||||
|
if (getEffortEnd() >= ONGOINGEFFORT/2) {
|
||||||
|
str = String.format("%s ongoing from %s",effortProvider.getName(), PamCalendar.formatDBDateTime(getEffortStart()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
str = String.format("%s %s to %s",effortProvider.getName(), PamCalendar.formatDBDateTime(getEffortStart()), PamCalendar.formatDBDateTime(getEffortEnd()));
|
||||||
|
}
|
||||||
|
if (referenceDataUnit != null) {
|
||||||
|
str += "<br>" + referenceDataUnit.getSummaryString();
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(PamDataUnit o) {
|
||||||
|
if (o instanceof EffortDataUnit) {
|
||||||
|
EffortDataUnit oth = (EffortDataUnit) o;
|
||||||
|
return (int) (oth.getEffortStart()-getEffortStart());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
50
src/effort/EffortManager.java
Normal file
50
src/effort/EffortManager.java
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package effort;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import PamController.PamController;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Singleton class to provide management for all types of Effort in PAMGuard.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class EffortManager {
|
||||||
|
|
||||||
|
private static EffortManager singleInstance;
|
||||||
|
|
||||||
|
private EffortManager() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get singleton instance of EffortManager
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static EffortManager getEffortManager() {
|
||||||
|
if (singleInstance == null) {
|
||||||
|
singleInstance = new EffortManager();
|
||||||
|
}
|
||||||
|
return singleInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of all data blocks that might provide effort data.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public ArrayList<PamDataBlock> getEffortDataBlocks() {
|
||||||
|
ArrayList<PamDataBlock> allBlocks = getPamController().getDataBlocks();
|
||||||
|
ArrayList<PamDataBlock> effortBlocks = new ArrayList();
|
||||||
|
for (PamDataBlock aBlock : allBlocks) {
|
||||||
|
if (aBlock.getEffortProvider() != null) {
|
||||||
|
effortBlocks.add(aBlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return effortBlocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PamController getPamController() {
|
||||||
|
return PamController.getInstance();
|
||||||
|
}
|
||||||
|
}
|
192
src/effort/EffortProvider.java
Normal file
192
src/effort/EffortProvider.java
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
package effort;
|
||||||
|
|
||||||
|
import java.awt.Frame;
|
||||||
|
import java.awt.Window;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import Map.MapParametersDialog;
|
||||||
|
import PamController.PamController;
|
||||||
|
import PamView.GeneralProjector;
|
||||||
|
import PamView.PamSymbol;
|
||||||
|
import PamView.symbol.PamSymbolChooser;
|
||||||
|
import PamView.symbol.PamSymbolManager;
|
||||||
|
import PamView.symbol.SwingSymbolOptionsPanel;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import PamguardMVC.dataSelector.DataSelectDialog;
|
||||||
|
import PamguardMVC.dataSelector.DataSelector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set of functions that can be returned from any datablock which can
|
||||||
|
* give information about effort. For detectors with binary storage, they
|
||||||
|
* will return a standard binary store effort provider. Others, e.g.
|
||||||
|
* logger forms, acquisition, etc. can so something much more bespoke. <p>
|
||||||
|
* For real time, will need quite different behaviour to offline. Datablocks
|
||||||
|
* with a effortProvider are going to notify this and a local list will be
|
||||||
|
* kept of starts and ends for the entire operation period. This will be
|
||||||
|
* overridden for differeing offline scenarios and bespoke cases such as
|
||||||
|
* logger forms (so need to get a notification in here for every data unit too !)
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public abstract class EffortProvider {
|
||||||
|
|
||||||
|
private PamDataBlock parentDataBlock;
|
||||||
|
private boolean isViewer;
|
||||||
|
|
||||||
|
public EffortProvider(PamDataBlock parentDataBlock) {
|
||||||
|
super();
|
||||||
|
this.parentDataBlock = parentDataBlock;
|
||||||
|
this.isViewer = PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notified at real time start.
|
||||||
|
* @param timeMilliseconds
|
||||||
|
*/
|
||||||
|
public abstract void realTimeStart(long timeMilliseconds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* notified at real time end
|
||||||
|
* @param timeMilliseconds
|
||||||
|
*/
|
||||||
|
public abstract void realTimeStop(long timeMilliseconds); ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notified for real time data.
|
||||||
|
* @param pamDataUnit
|
||||||
|
*/
|
||||||
|
public abstract void newData(PamDataUnit pamDataUnit); ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the effort for a specific time.
|
||||||
|
* @param timeMilliseconds
|
||||||
|
* @return Effort thing. Can be null if off effort.
|
||||||
|
*/
|
||||||
|
public EffortDataUnit getEffort(long timeMilliseconds) {
|
||||||
|
List<EffortDataUnit> allEfforts = getAllEffortThings();
|
||||||
|
if (allEfforts == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Iterator<EffortDataUnit> it = allEfforts.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
EffortDataUnit next = it.next();
|
||||||
|
if (timeMilliseconds >= next.getEffortStart() && timeMilliseconds <= next.getEffortEnd()) {
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when viewer data have been loaded for the parent datablock.
|
||||||
|
*/
|
||||||
|
public abstract void viewerLoadData();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all effort things. e.g. for binary data this is more or less a copy of
|
||||||
|
* the datamap (perhaps new units without the gaps).
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public abstract List<EffortDataUnit> getAllEffortThings();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the parentDataBlock
|
||||||
|
*/
|
||||||
|
public PamDataBlock getParentDataBlock() {
|
||||||
|
return parentDataBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a data selector. For specialist effort modules, this will probably call
|
||||||
|
* through to the datablocks data selection system. Others, such as binaryEffortProvider
|
||||||
|
* can return null since they are either on or off.
|
||||||
|
* @param selectorName
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public abstract DataSelector getDataSelector(String selectorName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of this effort provider.
|
||||||
|
*/
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a symbol manager. For specialist effort modules, this will probably call
|
||||||
|
* through to the datablocks existing symbol management system. Others, such as binaryEffortProvider
|
||||||
|
* will need a chooser for the simple on/off data types. .
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public abstract PamSymbolManager getSymbolManager();
|
||||||
|
|
||||||
|
public PamSymbolChooser getSymbolChooser(String chooserName, GeneralProjector projector) {
|
||||||
|
PamSymbolManager symbolManager = getSymbolManager();
|
||||||
|
if (symbolManager == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return symbolManager.getSymbolChooser(chooserName, projector);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PamSymbol getPamSymbol(String symbolChooserName, PamDataUnit dataUnit, GeneralProjector projector) {
|
||||||
|
PamSymbolChooser chooser = getSymbolChooser(symbolChooserName, projector);
|
||||||
|
return getPamSymbol(chooser, dataUnit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Need to use this to get symbols for effort instead of direct calls into
|
||||||
|
* the symbol chooser, since the symbol chooser will almost definitely want
|
||||||
|
* it's own type of data unit, NOT the EffortDataUnit which will probably crash
|
||||||
|
* due to a cast exception.
|
||||||
|
* @param chooser
|
||||||
|
* @param dataUnit
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public PamSymbol getPamSymbol(PamSymbolChooser chooser, PamDataUnit dataUnit) {
|
||||||
|
if (chooser == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// possible that the data is an Effort unit that wraps a real data unit. Need to
|
||||||
|
// probably pass the original.
|
||||||
|
if (dataUnit instanceof EffortDataUnit) {
|
||||||
|
PamDataUnit refData = ((EffortDataUnit) dataUnit).getReferenceDataUnit();
|
||||||
|
if (refData != null) {
|
||||||
|
dataUnit = refData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chooser.getPamSymbol(chooser.getProjector(), dataUnit);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean showOptionsDialog(Window parent, String observerName) {
|
||||||
|
PamSymbolChooser symbolChooser = getSymbolChooser(observerName, null);
|
||||||
|
if (symbolChooser == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
SwingSymbolOptionsPanel panel = symbolChooser.getSwingOptionsPanel(null);
|
||||||
|
if (panel == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
DataSelectDialog dataSelectDialog = new DataSelectDialog(parent, parentDataBlock, null, symbolChooser);
|
||||||
|
boolean ans = dataSelectDialog.showDialog();
|
||||||
|
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the isViewer
|
||||||
|
*/
|
||||||
|
public boolean isViewer() {
|
||||||
|
return isViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EffortDataUnit getLastEffort() {
|
||||||
|
List<EffortDataUnit> all = getAllEffortThings();
|
||||||
|
if (all == null || all.size() == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return all.get(all.size()-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
158
src/effort/binary/DataMapEffortProvider.java
Normal file
158
src/effort/binary/DataMapEffortProvider.java
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
package effort.binary;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import PamController.OfflineDataStore;
|
||||||
|
import PamController.PamController;
|
||||||
|
import PamView.symbol.PamSymbolManager;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import PamguardMVC.dataSelector.DataSelector;
|
||||||
|
import binaryFileStorage.BinaryStore;
|
||||||
|
import dataMap.OfflineDataMap;
|
||||||
|
import dataMap.OfflineDataMapPoint;
|
||||||
|
import effort.EffortDataUnit;
|
||||||
|
import effort.EffortProvider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Effort provider for most types of datablock that bases itself off one of the
|
||||||
|
* datamaps, binary (preferred) or database. Binary better since database doesn't really
|
||||||
|
* have proper effort data for most blocks.
|
||||||
|
* However, we want this to work online too, so will need to have quite different functionality
|
||||||
|
* for real time and viewer operations.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DataMapEffortProvider extends EffortProvider {
|
||||||
|
|
||||||
|
private DataMapSymbolManager binarySymbolManager;
|
||||||
|
|
||||||
|
private Class<?> dataStoreClass;
|
||||||
|
|
||||||
|
private long maxGap = 0;
|
||||||
|
|
||||||
|
private ArrayList<EffortDataUnit> allEfforts;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param parentDataBlock
|
||||||
|
* @param dataStoreClass
|
||||||
|
* @param maxGapMillis
|
||||||
|
*/
|
||||||
|
public DataMapEffortProvider(PamDataBlock parentDataBlock, Class<?> dataStoreClass, long maxGapMillis) {
|
||||||
|
super(parentDataBlock);
|
||||||
|
this.dataStoreClass = dataStoreClass;
|
||||||
|
this.maxGap = maxGapMillis;
|
||||||
|
binarySymbolManager = new DataMapSymbolManager(parentDataBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param parentDataBlock
|
||||||
|
* @param dataStoreClass
|
||||||
|
*/
|
||||||
|
public DataMapEffortProvider(PamDataBlock parentDataBlock, Class dataStoreClass) {
|
||||||
|
this(parentDataBlock, dataStoreClass, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return getParentDataBlock().getDataName();
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public EffortDataUnit getEffort(long timeMilliseconds) {
|
||||||
|
// OfflineDataMap dataMap = findDataMap();
|
||||||
|
// if (dataMap == null) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
// OfflineDataMapPoint foundPt = dataMap.findMapPoint(timeMilliseconds);
|
||||||
|
// if (foundPt != null) {
|
||||||
|
// return new DataMapEffortThing(this, getParentDataBlock(), foundPt.getStartTime(), foundPt.getEndTime());
|
||||||
|
// }
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<EffortDataUnit> getAllEffortThings() {
|
||||||
|
return allEfforts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private OfflineDataMap findDataMap() {
|
||||||
|
if (dataStoreClass == null) {
|
||||||
|
return getParentDataBlock().getPrimaryDataMap();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
OfflineDataStore dataStore = (OfflineDataStore) PamController.getInstance().findControlledUnit(dataStoreClass, null);
|
||||||
|
if (dataStore != null) {
|
||||||
|
return getParentDataBlock().getOfflineDataMap(dataStore);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DataSelector getDataSelector(String selectorName) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PamSymbolManager getSymbolManager() {
|
||||||
|
return binarySymbolManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void realTimeStart(long timeMilliseconds) {
|
||||||
|
if (allEfforts == null) {
|
||||||
|
allEfforts = new ArrayList<>();
|
||||||
|
}
|
||||||
|
EffortDataUnit newEffort = new EffortDataUnit(this, null, timeMilliseconds, EffortDataUnit.ONGOINGEFFORT);
|
||||||
|
allEfforts.add(newEffort);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void realTimeStop(long timeMilliseconds) {
|
||||||
|
if (allEfforts == null || allEfforts.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
EffortDataUnit lastEff = allEfforts.get(allEfforts.size()-1);
|
||||||
|
lastEff.setEffortEnd(timeMilliseconds);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void newData(PamDataUnit pamDataUnit) {
|
||||||
|
// do nothing for individual data units.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void viewerLoadData() {
|
||||||
|
// should merge continuous binary data into one big lump or several big lumps if duty cycled.
|
||||||
|
OfflineDataMap dataMap = findDataMap();
|
||||||
|
if (dataMap == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ArrayList<EffortDataUnit> allPoints = new ArrayList<>();
|
||||||
|
Iterator<OfflineDataMapPoint> it = dataMap.getListIterator();
|
||||||
|
DataMapEffortThing currentThing = null;
|
||||||
|
while (it.hasNext()) {
|
||||||
|
OfflineDataMapPoint pt = it.next();
|
||||||
|
if (currentThing == null || pt.getStartTime() - currentThing.getEffortEnd() > maxGap) {
|
||||||
|
currentThing = new DataMapEffortThing(this, getParentDataBlock(), pt.getStartTime(), pt.getEndTime());
|
||||||
|
allPoints.add(currentThing);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
currentThing.setEffortEnd(pt.getEndTime());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allEfforts = allPoints;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
22
src/effort/binary/DataMapEffortThing.java
Normal file
22
src/effort/binary/DataMapEffortThing.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package effort.binary;
|
||||||
|
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import effort.EffortDataUnit;
|
||||||
|
import effort.EffortProvider;
|
||||||
|
|
||||||
|
public class DataMapEffortThing extends EffortDataUnit {
|
||||||
|
|
||||||
|
|
||||||
|
private PamDataBlock parentDatablock;
|
||||||
|
|
||||||
|
public DataMapEffortThing(EffortProvider effortProvider, PamDataBlock parentDatablock, long effortStart, long effortEnd) {
|
||||||
|
super(effortProvider, null, effortStart, effortEnd);
|
||||||
|
this.parentDatablock = parentDatablock;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getEffortDescription() {
|
||||||
|
String str = String.format("%s", parentDatablock.getDataName());
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
18
src/effort/binary/DataMapSymbolManager.java
Normal file
18
src/effort/binary/DataMapSymbolManager.java
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package effort.binary;
|
||||||
|
|
||||||
|
import PamView.symbol.PamSymbolChooser;
|
||||||
|
import PamView.symbol.StandardSymbolManager;
|
||||||
|
import PamView.symbol.SymbolData;
|
||||||
|
import PamView.symbol.SymbolOnlyManager;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
|
||||||
|
public class DataMapSymbolManager extends SymbolOnlyManager {
|
||||||
|
|
||||||
|
public static SymbolData defaultSymbol = new SymbolData();
|
||||||
|
|
||||||
|
public DataMapSymbolManager(PamDataBlock pamDataBlock) {
|
||||||
|
super(pamDataBlock, defaultSymbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
28
src/effort/swing/EffortSourcePanel.java
Normal file
28
src/effort/swing/EffortSourcePanel.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package effort.swing;
|
||||||
|
|
||||||
|
import java.awt.Window;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import PamView.dialog.SourcePanel;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import effort.EffortManager;
|
||||||
|
|
||||||
|
public class EffortSourcePanel extends SourcePanel {
|
||||||
|
|
||||||
|
public EffortSourcePanel(Window ownerWindow) {
|
||||||
|
super(ownerWindow, PamDataBlock.class, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EffortSourcePanel(Window ownerWindow, String borderTitle) {
|
||||||
|
super(ownerWindow, borderTitle, PamDataBlock.class, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<PamDataBlock> getCompatibleDataBlocks() {
|
||||||
|
return EffortManager.getEffortManager().getEffortDataBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -33,6 +33,11 @@ import pamScrollSystem.PamScroller;
|
|||||||
import pamScrollSystem.PamScrollerData;
|
import pamScrollSystem.PamScrollerData;
|
||||||
import userDisplay.UserDisplayControl;
|
import userDisplay.UserDisplayControl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record scroll effort.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
public class EffortControl extends PamControlledUnit implements PamSettings{
|
public class EffortControl extends PamControlledUnit implements PamSettings{
|
||||||
|
|
||||||
public static String unitType = "Scroll Effort";
|
public static String unitType = "Scroll Effort";
|
||||||
|
@ -144,13 +144,16 @@ public class LookUpTables {
|
|||||||
String topic1 = list.get(i).getTopic().trim();
|
String topic1 = list.get(i).getTopic().trim();
|
||||||
for (int j = i+1; j < n; j++) {
|
for (int j = i+1; j < n; j++) {
|
||||||
String code2 = list.get(j).getCode().trim();
|
String code2 = list.get(j).getCode().trim();
|
||||||
String topic2 = list.get(j).getTopic().trim();
|
String topic2 = list.get(j).getTopic();
|
||||||
|
if (topic2 != null) {
|
||||||
|
topic2 = topic2.trim();
|
||||||
if (code.equals(code2) && topic1.equals(topic2)) {
|
if (code.equals(code2) && topic1.equals(topic2)) {
|
||||||
isRepeat[j] = true;
|
isRepeat[j] = true;
|
||||||
nRepeat++;
|
nRepeat++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (nRepeat == 0) {
|
if (nRepeat == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -183,7 +186,7 @@ public class LookUpTables {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
ArrayList<String> topics = new ArrayList<>();
|
ArrayList<String> topics = new ArrayList<>();
|
||||||
String qStr = "SELECT DISTINCT Topic FROM " + lutTableDef.getTableName();
|
String qStr = "SELECT DISTINCT Topic FROM " + lutTableDef.getTableName() + " WHERE TOPIC IS NOT NULL";
|
||||||
try {
|
try {
|
||||||
Statement stmt = con.getConnection().createStatement();
|
Statement stmt = con.getConnection().createStatement();
|
||||||
boolean ok = stmt.execute(qStr);
|
boolean ok = stmt.execute(qStr);
|
||||||
|
@ -17,8 +17,8 @@ public class Group3DParams implements Serializable, Cloneable, ManagedParameters
|
|||||||
|
|
||||||
public static final long serialVersionUID = 1L;
|
public static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@Deprecated
|
// @Deprecated
|
||||||
private GroupedSourceParameters groupedSourceParams;
|
// private GroupedSourceParameters groupedSourceParams;
|
||||||
|
|
||||||
private String sourceName;
|
private String sourceName;
|
||||||
|
|
||||||
@ -146,9 +146,9 @@ public class Group3DParams implements Serializable, Cloneable, ManagedParameters
|
|||||||
* @return the sourceName
|
* @return the sourceName
|
||||||
*/
|
*/
|
||||||
public String getSourceName() {
|
public String getSourceName() {
|
||||||
if (sourceName == null && groupedSourceParams != null) {
|
// if (sourceName == null && groupedSourceParams != null) {
|
||||||
sourceName = groupedSourceParams.getDataSource();
|
// sourceName = groupedSourceParams.getDataSource();
|
||||||
}
|
// }
|
||||||
return sourceName;
|
return sourceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +56,6 @@ import pamScrollSystem.AbstractPamScrollerAWT;
|
|||||||
import pamScrollSystem.ScrollPaneAddon;
|
import pamScrollSystem.ScrollPaneAddon;
|
||||||
import PamView.PamTabPanel;
|
import PamView.PamTabPanel;
|
||||||
import PamView.panel.PamPanel;
|
import PamView.panel.PamPanel;
|
||||||
import PamView.symbol.StandardSymbolManager;
|
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
import PamguardMVC.PamDataUnit;
|
import PamguardMVC.PamDataUnit;
|
||||||
import PamController.PamControlledUnitSettings;
|
import PamController.PamControlledUnitSettings;
|
||||||
@ -67,7 +66,6 @@ import PamUtils.PamCalendar;
|
|||||||
import PamUtils.XMLUtils;
|
import PamUtils.XMLUtils;
|
||||||
import loggerForms.controlDescriptions.ControlTypes;
|
import loggerForms.controlDescriptions.ControlTypes;
|
||||||
import loggerForms.controlDescriptions.InputControlDescription;
|
import loggerForms.controlDescriptions.InputControlDescription;
|
||||||
import loggerForms.PropertyTypes;
|
|
||||||
import loggerForms.controlDescriptions.ControlDescription;
|
import loggerForms.controlDescriptions.ControlDescription;
|
||||||
import loggerForms.formdesign.FormEditDialog;
|
import loggerForms.formdesign.FormEditDialog;
|
||||||
import loggerForms.formdesign.FormEditor;
|
import loggerForms.formdesign.FormEditor;
|
||||||
@ -75,6 +73,7 @@ import loggerForms.formdesign.FormList;
|
|||||||
import loggerForms.propertyInfos.BEARINGinfo;
|
import loggerForms.propertyInfos.BEARINGinfo;
|
||||||
import loggerForms.propertyInfos.HEADINGinfo;
|
import loggerForms.propertyInfos.HEADINGinfo;
|
||||||
import loggerForms.propertyInfos.RANGEinfo;
|
import loggerForms.propertyInfos.RANGEinfo;
|
||||||
|
import loggerForms.symbol.LoggerSymbolManager;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Graham Weatherup - SMRU
|
* @author Graham Weatherup - SMRU
|
||||||
@ -242,7 +241,7 @@ public class FormDescription implements Cloneable, Comparable<FormDescription> {
|
|||||||
formsDataBlock = new FormsDataBlock(this, getFormName(), formsControl.getFormsProcess(), 0);
|
formsDataBlock = new FormsDataBlock(this, getFormName(), formsControl.getFormsProcess(), 0);
|
||||||
formsDataBlock.SetLogging(new FormsLogging(this,formsDataBlock));
|
formsDataBlock.SetLogging(new FormsLogging(this,formsDataBlock));
|
||||||
formsDataBlock.setOverlayDraw(new LoggerFormGraphics(formsControl, this));
|
formsDataBlock.setOverlayDraw(new LoggerFormGraphics(formsControl, this));
|
||||||
formsDataBlock.setPamSymbolManager(new StandardSymbolManager(formsDataBlock, LoggerFormGraphics.defaultSymbol, false));
|
formsDataBlock.setPamSymbolManager(new LoggerSymbolManager(formsDataBlock));
|
||||||
|
|
||||||
|
|
||||||
setTimeOfNextSave();
|
setTimeOfNextSave();
|
||||||
@ -1068,7 +1067,7 @@ public class FormDescription implements Cloneable, Comparable<FormDescription> {
|
|||||||
normalForm = createForm();
|
normalForm = createForm();
|
||||||
formComponent = normalForm.getComponent();
|
formComponent = normalForm.getComponent();
|
||||||
}
|
}
|
||||||
formsDataDisplayTable = new FormsDataDisplayTable(this);
|
formsDataDisplayTable = new FormsDataDisplayTable(formsControl, this);
|
||||||
|
|
||||||
splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, formComponent, formsDataDisplayTable.getMainPanel());
|
splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, formComponent, formsDataDisplayTable.getMainPanel());
|
||||||
if (formSettingsControl.getFormSettings().splitPanelPosition != null) {
|
if (formSettingsControl.getFormSettings().splitPanelPosition != null) {
|
||||||
@ -1122,7 +1121,8 @@ public class FormDescription implements Cloneable, Comparable<FormDescription> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public LoggerForm createForm() {
|
public LoggerForm createForm() {
|
||||||
return new LoggerForm(this,LoggerForm.NewDataForm);
|
boolean viewer = PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW;
|
||||||
|
return new LoggerForm(this, viewer ? LoggerForm.NewDataForm : LoggerForm.NewDataForm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1230,6 +1230,22 @@ public class FormDescription implements Cloneable, Comparable<FormDescription> {
|
|||||||
removeForm(parentFrame);
|
removeForm(parentFrame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a data unit from memory and from database.
|
||||||
|
* @param dataUnit
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean deleteDataUnit(FormsDataUnit dataUnit) {
|
||||||
|
if (dataUnit == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean ans = getFormsDataBlock().remove(dataUnit, true);
|
||||||
|
if (formsDataDisplayTable != null) {
|
||||||
|
formsDataDisplayTable.dataChanged();
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Create a new subtab form on the appropriate sub tab panel.
|
* Create a new subtab form on the appropriate sub tab panel.
|
||||||
*/
|
*/
|
||||||
@ -1647,6 +1663,15 @@ public class FormDescription implements Cloneable, Comparable<FormDescription> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void optionsChange() {
|
||||||
|
if (normalForm != null) {
|
||||||
|
normalForm.optionsChange();
|
||||||
|
}
|
||||||
|
if (formsDataDisplayTable != null) {
|
||||||
|
formsDataDisplayTable.optionsChange();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a count of open sub tab forms.
|
* Get a count of open sub tab forms.
|
||||||
* @return the number of open sub tab forms.
|
* @return the number of open sub tab forms.
|
||||||
|
@ -16,6 +16,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.logging.LogManager;
|
import java.util.logging.LogManager;
|
||||||
|
|
||||||
|
import javax.swing.JCheckBoxMenuItem;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JMenu;
|
import javax.swing.JMenu;
|
||||||
import javax.swing.JMenuItem;
|
import javax.swing.JMenuItem;
|
||||||
@ -34,6 +35,7 @@ import loggerForms.FormDescription.FormPlotOptionsStore;
|
|||||||
import loggerForms.monitor.FormsMonitorMaster;
|
import loggerForms.monitor.FormsMonitorMaster;
|
||||||
import PamController.PamControlledUnit;
|
import PamController.PamControlledUnit;
|
||||||
import PamController.PamControlledUnitSettings;
|
import PamController.PamControlledUnitSettings;
|
||||||
|
import PamController.PamController;
|
||||||
import PamController.PamControllerInterface;
|
import PamController.PamControllerInterface;
|
||||||
import PamController.PamSettingManager;
|
import PamController.PamSettingManager;
|
||||||
import PamController.PamSettings;
|
import PamController.PamSettings;
|
||||||
@ -48,13 +50,11 @@ import PamView.PamTabPanel;
|
|||||||
import PamView.PamView;
|
import PamView.PamView;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Graham Weatherup
|
* @author Graham Weatherup controls the logger forms module
|
||||||
* controls the logger forms module
|
|
||||||
*/
|
*/
|
||||||
public class FormsControl extends PamControlledUnit {
|
public class FormsControl extends PamControlledUnit implements PamSettings {
|
||||||
|
|
||||||
public static ArrayList<String> restrictedTitles = new ArrayList<String>();
|
public static ArrayList<String> restrictedTitles = new ArrayList<String>();
|
||||||
|
|
||||||
@ -71,6 +71,8 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
private FormsMonitorMaster formsMonitor;
|
private FormsMonitorMaster formsMonitor;
|
||||||
|
|
||||||
|
private FormsParameters formsParameters = new FormsParameters();
|
||||||
|
|
||||||
// /** A set of dummy parameters, used solely to pull together different settings for XML export */
|
// /** A set of dummy parameters, used solely to pull together different settings for XML export */
|
||||||
// private FormsTempParams dummyParams;
|
// private FormsTempParams dummyParams;
|
||||||
|
|
||||||
@ -83,8 +85,7 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
formsTabPanel = new FormsTabPanel(this);
|
formsTabPanel = new FormsTabPanel(this);
|
||||||
formsAlertSidePanel = new FormsAlertSidePanel(this);
|
formsAlertSidePanel = new FormsAlertSidePanel(this);
|
||||||
formsMonitor = new FormsMonitorMaster(this, formsProcess);
|
formsMonitor = new FormsMonitorMaster(this, formsProcess);
|
||||||
// dummyParams = new FormsTempParams();
|
PamSettingManager.getInstance().registerSettings(this);
|
||||||
// PamSettingManager.getInstance().registerSettings(this);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,8 +109,7 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
String keywordString = null;
|
String keywordString = null;
|
||||||
try {
|
try {
|
||||||
keywordString = DBControlUnit.findDatabaseControl().getDatabaseSystem().getKeywords();
|
keywordString = DBControlUnit.findDatabaseControl().getDatabaseSystem().getKeywords();
|
||||||
}
|
} catch (NullPointerException e) {
|
||||||
catch (NullPointerException e) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,15 +141,16 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return false;
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
* @see PamController.PamControlledUnit#notifyModelChanged(int)
|
* @see PamController.PamControlledUnit#notifyModelChanged(int)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -173,6 +174,7 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the form description for a specific index.
|
* Get the form description for a specific index.
|
||||||
|
*
|
||||||
* @param iForm form index
|
* @param iForm form index
|
||||||
* @return for description
|
* @return for description
|
||||||
*/
|
*/
|
||||||
@ -182,6 +184,7 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a form index from a form description
|
* Get a form index from a form description
|
||||||
|
*
|
||||||
* @param formDescription Form Descriptions
|
* @param formDescription Form Descriptions
|
||||||
* @return form index or -1 if not found
|
* @return form index or -1 if not found
|
||||||
*/
|
*/
|
||||||
@ -191,6 +194,7 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Find a form which has a particular order value.
|
* Find a form which has a particular order value.
|
||||||
|
*
|
||||||
* @param order order (starts from 1 generally)
|
* @param order order (starts from 1 generally)
|
||||||
* @return a form, or null if none have that order.
|
* @return a form, or null if none have that order.
|
||||||
*/
|
*/
|
||||||
@ -210,6 +214,7 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Find a form description with a given name.
|
* Find a form description with a given name.
|
||||||
|
*
|
||||||
* @param formName
|
* @param formName
|
||||||
* @return form description or null.
|
* @return form description or null.
|
||||||
*/
|
*/
|
||||||
@ -258,10 +263,9 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
return letters.charAt(position);
|
return letters.charAt(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a list of tables beginning with UDF_ and reads
|
* Generates a list of tables beginning with UDF_ and reads their contents into
|
||||||
* their contents into a FormDescription
|
* a FormDescription
|
||||||
*/
|
*/
|
||||||
public void readUDFTables() {
|
public void readUDFTables() {
|
||||||
/*
|
/*
|
||||||
@ -292,8 +296,6 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
String[] types = { "TABLE" };
|
String[] types = { "TABLE" };
|
||||||
ResultSet resultSet = dbmd.getTables(null, null, "%", types);// not getting all tables from db in ODB
|
ResultSet resultSet = dbmd.getTables(null, null, "%", types);// not getting all tables from db in ODB
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Loop through database tables
|
// Loop through database tables
|
||||||
while (resultSet.next()) {
|
while (resultSet.next()) {
|
||||||
String tableName = resultSet.getString(3);
|
String tableName = resultSet.getString(3);
|
||||||
@ -304,12 +306,10 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (UDFErrors.size() > 0) {
|
if (UDFErrors.size() > 0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,13 +346,16 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the correct type of reference to the forms tab panel.
|
* Get the correct type of reference to the forms tab panel.
|
||||||
|
*
|
||||||
* @return reference to the forms tab panel.
|
* @return reference to the forms tab panel.
|
||||||
*/
|
*/
|
||||||
public FormsTabPanel getFormsTabPanel() {
|
public FormsTabPanel getFormsTabPanel() {
|
||||||
return formsTabPanel;
|
return formsTabPanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
* @see PamController.PamControlledUnit#getTabPanel()
|
* @see PamController.PamControlledUnit#getTabPanel()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -372,8 +375,6 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the formsProcess
|
* @return the formsProcess
|
||||||
*/
|
*/
|
||||||
@ -381,7 +382,9 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
return formsProcess;
|
return formsProcess;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
* @see PamController.PamControlledUnit#createDetectionMenu(java.awt.Frame)
|
* @see PamController.PamControlledUnit#createDetectionMenu(java.awt.Frame)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -402,8 +405,19 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
// }
|
// }
|
||||||
detMenu.add(menuItem = new JMenuItem("Regenerate all forms"));
|
detMenu.add(menuItem = new JMenuItem("Regenerate all forms"));
|
||||||
menuItem.addActionListener(new ReGenerateForms(parentFrame));
|
menuItem.addActionListener(new ReGenerateForms(parentFrame));
|
||||||
|
if (PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW) {
|
||||||
|
JCheckBoxMenuItem changebox = new JCheckBoxMenuItem("Allow Viewer changes");
|
||||||
|
changebox.setToolTipText("Allow the editing, adding, and deleting of data in Viewer mode");
|
||||||
|
changebox.setSelected(formsParameters.allowViewerChanges);
|
||||||
|
changebox.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
formsParameters.allowViewerChanges = changebox.isSelected();
|
||||||
|
notifyOptionsChange();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
detMenu.add(changebox);
|
||||||
|
}
|
||||||
|
|
||||||
return detMenu;
|
return detMenu;
|
||||||
}
|
}
|
||||||
@ -419,9 +433,16 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent arg0) {
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
newLoggerform(parentFrame);
|
newLoggerform(parentFrame);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void notifyOptionsChange() {
|
||||||
|
if (formDescriptions == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (FormDescription formDesc: formDescriptions) {
|
||||||
|
formDesc.optionsChange();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReGenerateForms implements ActionListener {
|
class ReGenerateForms implements ActionListener {
|
||||||
@ -443,11 +464,13 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
class EditForm implements ActionListener {
|
class EditForm implements ActionListener {
|
||||||
private FormDescription formDescription;
|
private FormDescription formDescription;
|
||||||
private Frame parentFrame;
|
private Frame parentFrame;
|
||||||
|
|
||||||
public EditForm(Frame parentFrame, FormDescription formDescription) {
|
public EditForm(Frame parentFrame, FormDescription formDescription) {
|
||||||
super();
|
super();
|
||||||
this.parentFrame = parentFrame;
|
this.parentFrame = parentFrame;
|
||||||
this.formDescription = formDescription;
|
this.formDescription = formDescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent arg0) {
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
this.formDescription.editForm(parentFrame);
|
this.formDescription.editForm(parentFrame);
|
||||||
@ -456,11 +479,13 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new logger form
|
* Create a new logger form
|
||||||
|
*
|
||||||
* @param parentFrame parent frame
|
* @param parentFrame parent frame
|
||||||
* @return selected name for new form, or null if nothing created.
|
* @return selected name for new form, or null if nothing created.
|
||||||
*/
|
*/
|
||||||
public String newLoggerform(Frame parentFrame) {
|
public String newLoggerform(Frame parentFrame) {
|
||||||
String newName = JOptionPane.showInputDialog(parentFrame, "Enter the name for the new user form", "New Logger Form", JOptionPane.OK_CANCEL_OPTION);
|
String newName = JOptionPane.showInputDialog(parentFrame, "Enter the name for the new user form",
|
||||||
|
"New Logger Form", JOptionPane.OK_CANCEL_OPTION);
|
||||||
if (newName == null) {
|
if (newName == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -485,7 +510,6 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
return newName;
|
return newName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate all forms and associated processes, notifying databases, maps, etc
|
* Generate all forms and associated processes, notifying databases, maps, etc
|
||||||
* so that any required actions can be taken.
|
* so that any required actions can be taken.
|
||||||
@ -525,6 +549,7 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete and recreate all forms / form data, etc.
|
* Delete and recreate all forms / form data, etc.
|
||||||
|
*
|
||||||
* @param parentFrame
|
* @param parentFrame
|
||||||
*/
|
*/
|
||||||
public void regenerateForms(Window parentFrame) {
|
public void regenerateForms(Window parentFrame) {
|
||||||
@ -565,7 +590,9 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
boolean ans = FormsPlotOptionsDialog.showDialog(parentFrame, this);
|
boolean ans = FormsPlotOptionsDialog.showDialog(parentFrame, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
* @see PamController.PamControlledUnit#canClose()
|
* @see PamController.PamControlledUnit#canClose()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -614,10 +641,10 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
return new ModuleStatus(ModuleStatus.STATUS_OK);
|
return new ModuleStatus(ModuleStatus.STATUS_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Some things that are meant to be boolean are coming out as int or string so
|
* Some things that are meant to be boolean are coming out as int or string so
|
||||||
* need to do some type checking.
|
* need to do some type checking.
|
||||||
|
*
|
||||||
* @param value
|
* @param value
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ -640,45 +667,28 @@ public class FormsControl extends PamControlledUnit {
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// @Override
|
|
||||||
// public Serializable getSettingsReference() {
|
@Override
|
||||||
// return (Serializable) dummyParams;
|
public Serializable getSettingsReference() {
|
||||||
// }
|
return formsParameters;
|
||||||
//
|
}
|
||||||
// @Override
|
|
||||||
// public long getSettingsVersion() {
|
@Override
|
||||||
// return 0;
|
public long getSettingsVersion() {
|
||||||
// }
|
return FormsParameters.serialVersionUID;
|
||||||
//
|
}
|
||||||
// @Override
|
|
||||||
// public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
|
@Override
|
||||||
// return false;
|
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
|
||||||
// }
|
this.formsParameters = (FormsParameters) pamControlledUnitSettings.getSettings();
|
||||||
//
|
return true;
|
||||||
// /**
|
}
|
||||||
// * Private class to pass along various parameter classes that Logger forms use
|
|
||||||
// *
|
/**
|
||||||
// * @author mo55
|
* @return the formsParameters
|
||||||
// *
|
*/
|
||||||
// */
|
public FormsParameters getFormsParameters() {
|
||||||
// private class FormsTempParams implements ManagedParameters {
|
return formsParameters;
|
||||||
//
|
}
|
||||||
// @Override
|
|
||||||
// public PamParameterSet getParameterSet() {
|
|
||||||
// PamParameterSet ps = new PamParameterSet(this);
|
|
||||||
// try {
|
|
||||||
// Field field = FormsControl.this.getClass().getDeclaredField("formDescriptions");
|
|
||||||
// ps.put(new PrivatePamParameterData(this, field) {
|
|
||||||
// @Override
|
|
||||||
// public Object getData() throws IllegalArgumentException, IllegalAccessException {
|
|
||||||
// return formDescriptions;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// } catch (NoSuchFieldException | SecurityException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// }
|
|
||||||
// return ps;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ import PamguardMVC.PamProcess;
|
|||||||
import PamguardMVC.dataSelector.DataSelector;
|
import PamguardMVC.dataSelector.DataSelector;
|
||||||
import PamguardMVC.dataSelector.DataSelectorCreator;
|
import PamguardMVC.dataSelector.DataSelectorCreator;
|
||||||
import loggerForms.dataselect.FormDataSelCreator;
|
import loggerForms.dataselect.FormDataSelCreator;
|
||||||
|
import loggerForms.effort.FormsEffortUnit;
|
||||||
|
import loggerForms.effort.LoggerEffortProvider;
|
||||||
import loggerForms.monitor.FormsDataSelectorCreator;
|
import loggerForms.monitor.FormsDataSelectorCreator;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -17,6 +19,8 @@ public class FormsDataBlock extends PamDataBlock<FormsDataUnit> {
|
|||||||
|
|
||||||
private FormDescription formDescription;
|
private FormDescription formDescription;
|
||||||
|
|
||||||
|
private LoggerEffortProvider loggerEffortProvider;
|
||||||
|
|
||||||
public FormsDataBlock(FormDescription formDescription, String dataName,
|
public FormsDataBlock(FormDescription formDescription, String dataName,
|
||||||
PamProcess parentProcess, int channelMap) {
|
PamProcess parentProcess, int channelMap) {
|
||||||
super(FormsDataUnit.class, dataName, parentProcess, channelMap);
|
super(FormsDataUnit.class, dataName, parentProcess, channelMap);
|
||||||
@ -25,6 +29,7 @@ public class FormsDataBlock extends PamDataBlock<FormsDataUnit> {
|
|||||||
setDataSelectCreator(new FormDataSelCreator(this, formDescription));
|
setDataSelectCreator(new FormDataSelCreator(this, formDescription));
|
||||||
// setBinaryDataSource(new FormsBinaryIO(formDescription.getFormsControl(), this));
|
// setBinaryDataSource(new FormsBinaryIO(formDescription.getFormsControl(), this));
|
||||||
// setNaturalLifetimeMillis(60000);
|
// setNaturalLifetimeMillis(60000);
|
||||||
|
setEffortProvider(loggerEffortProvider = new LoggerEffortProvider(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
public FormDescription getFormDescription() {
|
public FormDescription getFormDescription() {
|
||||||
|
@ -4,10 +4,15 @@
|
|||||||
package loggerForms;
|
package loggerForms;
|
||||||
|
|
||||||
import java.awt.GridLayout;
|
import java.awt.GridLayout;
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
|
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.JTable;
|
import javax.swing.JTable;
|
||||||
import javax.swing.event.ListSelectionEvent;
|
import javax.swing.event.ListSelectionEvent;
|
||||||
@ -20,6 +25,7 @@ import PamController.PamController;
|
|||||||
import PamUtils.PamCalendar;
|
import PamUtils.PamCalendar;
|
||||||
import PamView.PamTable;
|
import PamView.PamTable;
|
||||||
import PamView.dialog.PamDialog;
|
import PamView.dialog.PamDialog;
|
||||||
|
import PamView.dialog.warn.WarnOnce;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,11 +43,13 @@ public class FormsDataDisplayTable {
|
|||||||
|
|
||||||
private JScrollPane scrollPane;
|
private JScrollPane scrollPane;
|
||||||
|
|
||||||
|
private FormsControl formsControl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param formDescription
|
* @param formDescription
|
||||||
*/
|
*/
|
||||||
public FormsDataDisplayTable(FormDescription formDescription) {
|
public FormsDataDisplayTable(FormsControl formsControl, FormDescription formDescription) {
|
||||||
// TODO Auto-generated constructor stub
|
this.formsControl = formsControl;
|
||||||
this.formDescription=formDescription;
|
this.formDescription=formDescription;
|
||||||
|
|
||||||
// GridLayout(rows,columns)
|
// GridLayout(rows,columns)
|
||||||
@ -63,36 +71,16 @@ public class FormsDataDisplayTable {
|
|||||||
formsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
|
formsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
|
||||||
|
|
||||||
// for now, don't allow edits in viewer mode.
|
// for now, don't allow edits in viewer mode.
|
||||||
if (PamController.getInstance().getRunMode() != PamController.RUN_PAMVIEW) {
|
// if (PamController.getInstance().getRunMode() != PamController.RUN_PAMVIEW) {
|
||||||
formsTable.addMouseListener(new EditDataListener());
|
formsTable.addMouseListener(new EditDataListener());
|
||||||
}
|
// }
|
||||||
|
|
||||||
scrollPane = new JScrollPane(formsTable);
|
scrollPane = new JScrollPane(formsTable);
|
||||||
|
|
||||||
mainPanel.add(scrollPane);
|
mainPanel.add(scrollPane);
|
||||||
|
|
||||||
// mainPanel.setPreferredSize(new Dimension(800, 200));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// class TimerListener implements ActionListener {
|
|
||||||
// boolean doneLayout;
|
|
||||||
// public void actionPerformed(ActionEvent ev) {
|
|
||||||
// // table.
|
|
||||||
//// nmeaTableData.fireTableRowsUpdated(0, 10);
|
|
||||||
// formsTableDataModel.fireTableDataChanged();
|
|
||||||
//
|
|
||||||
// if (doneLayout == false && formsTableDataModel.getRowCount() > 0) {
|
|
||||||
// doneLayout = true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TableListListener implements ListSelectionListener {
|
class TableListListener implements ListSelectionListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -108,9 +96,15 @@ public class FormsDataDisplayTable {
|
|||||||
formDescription.viewDataUnit(formsDataUnit);
|
formDescription.viewDataUnit(formsDataUnit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean canEdit() {
|
||||||
|
if (PamController.getInstance().getRunMode() != PamController.RUN_PAMVIEW) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (formsControl == null) return false;
|
||||||
|
return formsControl.getFormsParameters().allowViewerChanges;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Find the data unit for a particular row in the table.
|
* Find the data unit for a particular row in the table.
|
||||||
* @param iRow
|
* @param iRow
|
||||||
@ -125,9 +119,11 @@ public class FormsDataDisplayTable {
|
|||||||
class EditDataListener extends MouseAdapter{
|
class EditDataListener extends MouseAdapter{
|
||||||
@Override
|
@Override
|
||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {
|
||||||
|
if (canEdit() == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (e.getClickCount() == 2) {
|
if (e.getClickCount() == 2) {
|
||||||
|
|
||||||
// FormsDataBlock formsDataBlock = formDescription.getFormsDataBlock();
|
|
||||||
int row = formsTable.getSelectedRow();
|
int row = formsTable.getSelectedRow();
|
||||||
|
|
||||||
FormsDataUnit formsDataUnit = findDataUnitForRow(row);
|
FormsDataUnit formsDataUnit = findDataUnitForRow(row);
|
||||||
@ -135,14 +131,32 @@ public class FormsDataDisplayTable {
|
|||||||
PamDialog.showWarning(null, "WARNING", "could not find formsDataUnit");
|
PamDialog.showWarning(null, "WARNING", "could not find formsDataUnit");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
editDataUnit(formsDataUnit);
|
||||||
|
|
||||||
|
|
||||||
FormsDataUnitEditor due = new FormsDataUnitEditor(formDescription,formsDataUnit);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mousePressed(MouseEvent e) {
|
||||||
|
maybePopup(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent e) {
|
||||||
|
maybePopup(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void maybePopup(MouseEvent e) {
|
||||||
|
if (e.isPopupTrigger() == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (canEdit() == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int row = formsTable.getSelectedRow();
|
||||||
|
|
||||||
|
showPopupMenu(e.getPoint());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -259,8 +273,68 @@ public class FormsDataDisplayTable {
|
|||||||
return mainPanel;
|
return mainPanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showPopupMenu(Point pt) {
|
||||||
|
|
||||||
|
FormsDataUnit dataUnit = findDataUnitForRow(formsTable.getSelectedRow());
|
||||||
|
|
||||||
|
JPopupMenu menu = new JPopupMenu();
|
||||||
|
JMenuItem menuItem;
|
||||||
|
if (dataUnit != null) {
|
||||||
|
menuItem = new JMenuItem("Edit row ...");
|
||||||
|
menuItem.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
editDataUnit(dataUnit);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
menu.add(menuItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
menuItem = new JMenuItem("Create row ...");
|
||||||
|
menuItem.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
addDataUnit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
menu.add(menuItem);
|
||||||
|
|
||||||
|
if (dataUnit != null) {
|
||||||
|
menu.addSeparator();
|
||||||
|
menuItem = new JMenuItem("Delete row ...");
|
||||||
|
menuItem.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
deleteDataUnit(dataUnit);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
menu.add(menuItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.show(formsTable, pt.x, pt.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean editDataUnit(FormsDataUnit dataUnit) {
|
||||||
|
FormsDataUnitEditor due = new FormsDataUnitEditor(formDescription, dataUnit);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean deleteDataUnit(FormsDataUnit dataUnit) {
|
||||||
|
if (dataUnit == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int ans = WarnOnce.showWarning("Delete logger form data", "Are you sure you want to delete data Id " + dataUnit.getDatabaseIndex(), WarnOnce.OK_CANCEL_OPTION);
|
||||||
|
if (ans != WarnOnce.OK_OPTION) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
formDescription.deleteDataUnit(dataUnit);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean addDataUnit() {
|
||||||
|
formDescription.viewDataUnit(null);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when data have changed in the datablock.
|
* Called when data have changed in the datablock.
|
||||||
@ -276,4 +350,12 @@ public class FormsDataDisplayTable {
|
|||||||
public JScrollPane getScrollPane() {
|
public JScrollPane getScrollPane() {
|
||||||
return scrollPane;
|
return scrollPane;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some optins have changed.
|
||||||
|
*/
|
||||||
|
public void optionsChange() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,10 @@ package loggerForms;
|
|||||||
|
|
||||||
import GPS.GpsData;
|
import GPS.GpsData;
|
||||||
import PamUtils.PamCalendar;
|
import PamUtils.PamCalendar;
|
||||||
|
import PamView.GeneralProjector;
|
||||||
import PamguardMVC.PamDataUnit;
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import generalDatabase.SQLTypes;
|
||||||
|
import loggerForms.controlDescriptions.ControlDescription;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Graham Weatherup
|
* @author Graham Weatherup
|
||||||
@ -12,9 +15,6 @@ import PamguardMVC.PamDataUnit;
|
|||||||
* UTCmillisecond
|
* UTCmillisecond
|
||||||
* PCLocalTime
|
* PCLocalTime
|
||||||
*
|
*
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class FormsDataUnit extends PamDataUnit {
|
public class FormsDataUnit extends PamDataUnit {
|
||||||
|
|
||||||
@ -94,6 +94,82 @@ public class FormsDataUnit extends PamDataUnit {
|
|||||||
return formOriginLatLong;
|
return formOriginLatLong;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getTimeMilliseconds() {
|
||||||
|
Long time = findTimeValue(PropertyTypes.STARTTIME);
|
||||||
|
if (time != null) {
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
return super.getTimeMilliseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find one of the time property controls and get its value.
|
||||||
|
* @param timeProperty
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Long findTimeValue(PropertyTypes timeProperty) {
|
||||||
|
if (formData == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
PropertyDescription prop = formDescription.findProperty(timeProperty);
|
||||||
|
if (prop == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String ctrlTitle = prop.getItemInformation().getStringProperty("Title");
|
||||||
|
if (ctrlTitle == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int timeControlIndex = formDescription.findInputControlByName(ctrlTitle);
|
||||||
|
if (timeControlIndex < 0 || timeControlIndex >= formData.length) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Object timeObj = formData[timeControlIndex];
|
||||||
|
/*
|
||||||
|
* this should have found the time contol in the form of a string from the database.
|
||||||
|
* try to unpack it.
|
||||||
|
*/
|
||||||
|
Long timeMillis = SQLTypes.millisFromTimeStamp(timeObj);
|
||||||
|
|
||||||
|
return timeMillis;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* find a correctly set property value for the end time (if set).
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Long getSetEndTime() {
|
||||||
|
return findTimeValue(PropertyTypes.ENDTIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEndTimeInMilliseconds() {
|
||||||
|
Long time = findTimeValue(PropertyTypes.ENDTIME);
|
||||||
|
if (time != null) {
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
return super.getEndTimeInMilliseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSummaryString() {
|
||||||
|
String str = String.format("<html><b>%s</b>", formDescription.getFormNiceName());
|
||||||
|
Object[] data = getFormData();
|
||||||
|
int iDat = 0;
|
||||||
|
for (ControlDescription cd:formDescription.getInputControlDescriptions()) {
|
||||||
|
if (data[iDat] == null) {
|
||||||
|
str += String.format("<p>%s: -", cd.getTitle());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
str += String.format("<p>%s: %s", cd.getTitle(), data[iDat].toString());
|
||||||
|
}
|
||||||
|
iDat++;
|
||||||
|
}
|
||||||
|
|
||||||
|
str += "</html>";
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,6 @@ import PamUtils.PamCalendar;
|
|||||||
public class FormsDataUnitEditor{
|
public class FormsDataUnitEditor{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param formDescription
|
* @param formDescription
|
||||||
* @param formsDataUnit
|
* @param formsDataUnit
|
||||||
@ -29,8 +27,6 @@ public class FormsDataUnitEditor{
|
|||||||
|
|
||||||
JFrame frame=PamController.getInstance().getGuiFrameManager().getFrame(frameNo);
|
JFrame frame=PamController.getInstance().getGuiFrameManager().getFrame(frameNo);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FormsDataUnit updatedData = FormsDataUnitEditDialog.showDialog(frame, formDescription, formsDataUnit);
|
FormsDataUnit updatedData = FormsDataUnitEditDialog.showDialog(frame, formDescription, formsDataUnit);
|
||||||
|
|
||||||
if (updatedData != null) {
|
if (updatedData != null) {
|
||||||
|
@ -2,16 +2,20 @@ package loggerForms;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import PamController.PamViewParameters;
|
||||||
import loggerForms.controlDescriptions.ControlDescription;
|
import loggerForms.controlDescriptions.ControlDescription;
|
||||||
import loggerForms.controlDescriptions.InputControlDescription;
|
import loggerForms.controlDescriptions.InputControlDescription;
|
||||||
|
import pamScrollSystem.ViewLoadObserver;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
import PamguardMVC.PamDataUnit;
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import generalDatabase.PamConnection;
|
||||||
|
import generalDatabase.PamTableDefinition;
|
||||||
import generalDatabase.SQLLogging;
|
import generalDatabase.SQLLogging;
|
||||||
import generalDatabase.SQLTypes;
|
import generalDatabase.SQLTypes;
|
||||||
|
|
||||||
public class FormsLogging extends SQLLogging {
|
public class FormsLogging extends SQLLogging {
|
||||||
|
|
||||||
FormDescription formDescription;
|
private FormDescription formDescription;
|
||||||
|
|
||||||
protected FormsLogging(FormDescription formDescription, PamDataBlock pamDataBlock) {
|
protected FormsLogging(FormDescription formDescription, PamDataBlock pamDataBlock) {
|
||||||
super(pamDataBlock);
|
super(pamDataBlock);
|
||||||
@ -20,53 +24,34 @@ public class FormsLogging extends SQLLogging {
|
|||||||
setTableDefinition(formDescription.getOutputTableDef());
|
setTableDefinition(formDescription.getOutputTableDef());
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Override
|
@Override
|
||||||
// public void setTableData(PamDataUnit pamDataUnit) {
|
public String getViewerLoadClause(SQLTypes sqlTypes, PamViewParameters pvp) {
|
||||||
//
|
// modified clause in case the form defines a start time element in which
|
||||||
// FormsDataUnit formDataUnit = (FormsDataUnit) pamDataUnit;
|
// case we need an OR of that and UTC.
|
||||||
// int dataLen = formDataUnit.getFormData().length;
|
String standardClause = super.getViewerLoadClause(sqlTypes, pvp);
|
||||||
// int tableLen= getTableDefinition().getTableItemCount();
|
PropertyDescription startProp = formDescription.findProperty(PropertyTypes.STARTTIME);
|
||||||
//
|
if (startProp == null) {
|
||||||
//// for (int j=0;j<tableLen;j++){
|
return standardClause;
|
||||||
//// System.out.println(getTableDefinition().getTableItem(j).getName());
|
}
|
||||||
//// }
|
String startName = startProp.getDbTitle();
|
||||||
//
|
if (startName == null) {
|
||||||
// int diff = tableLen-dataLen;
|
return standardClause;
|
||||||
// // put number of standard items as static is pamtable item/table(ie diff ~3-5)
|
}
|
||||||
//
|
startName = PamTableDefinition.deblankString(startName); // replace blanks with underscores.
|
||||||
//// System.out.printf("Save Forms Data "+PamCalendar.formatDateTime(formDataUnit.getTimeMilliseconds())+"\n");
|
startName = sqlTypes.formatColumnName(startName); // wrap as standard for this database taype.
|
||||||
//
|
String t1 = sqlTypes.formatDBDateTimeQueryString(pvp.viewStartTime);
|
||||||
// for (int i=0;i<dataLen;i++){
|
String t2 = sqlTypes.formatDBDateTimeQueryString(pvp.viewEndTime);
|
||||||
//// System.out.printf("INTS.. %d dataLen:%d, tableLen:%d, diff:%d \n",i,dataLen,tableLen,diff);
|
String newClause = String.format(" WHERE (UTC BETWEEN %s AND %s) OR (%s BETWEEN %s AND %s) ORDER BY %s, UTC, UTCMilliseconds",
|
||||||
//// if ((formDataUnit.getFormData()[i]==null)){
|
t1, t2, startName, t1, t2, startName);
|
||||||
//// System.out.println("Object "+i+" to save: ~null");
|
|
||||||
//// getTableDefinition().getTableItem(i+diff).setValue(null); //be null;
|
return newClause;
|
||||||
//// }else{
|
}
|
||||||
//// System.out.println("Object "+i+" to save: "+formDataUnit.getFormData()[i].toString());
|
|
||||||
//// System.out.println("Name: "+getTableDefinition().getTableItem(i+diff).getName());
|
|
||||||
//// System.out.println("Data: "+formDataUnit.getFormData()[i]);
|
|
||||||
// getTableDefinition().getTableItem(i+diff).setValue(formDataUnit.getFormData()[i]);//object
|
|
||||||
//
|
|
||||||
//// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTableData(SQLTypes sqlTypes, PamDataUnit pamDataUnit) {
|
public void setTableData(SQLTypes sqlTypes, PamDataUnit pamDataUnit) {
|
||||||
FormsDataUnit formDataUnit = (FormsDataUnit) pamDataUnit;
|
FormsDataUnit formDataUnit = (FormsDataUnit) pamDataUnit;
|
||||||
|
|
||||||
Object[] datas = formDataUnit.getFormData();
|
Object[] datas = formDataUnit.getFormData();
|
||||||
// for(LoggerControl lc:formDataUnit.getLoggerForm().getInputControls()){
|
|
||||||
//
|
|
||||||
// lc.moveDataToTableItems();
|
|
||||||
//// for (FormsTableItem fti:lc.getControlDescription().getFormsTableItems()){
|
|
||||||
////
|
|
||||||
//// getTableDefinition().getTableItem(fti).setValue(lc.getData());
|
|
||||||
////
|
|
||||||
//// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
ArrayList<InputControlDescription> inputCtrls = formDescription.getInputControlDescriptions();
|
ArrayList<InputControlDescription> inputCtrls = formDescription.getInputControlDescriptions();
|
||||||
InputControlDescription cd;
|
InputControlDescription cd;
|
||||||
@ -76,9 +61,6 @@ public class FormsLogging extends SQLLogging {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// for (ControlDescription controlDescription:formDescription.getInputControlDescriptions()){
|
|
||||||
// controlDescription.moveDataTo
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
@ -98,21 +80,6 @@ public class FormsLogging extends SQLLogging {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// int dataLen = formDescription.getInputControlDescriptions().size();
|
|
||||||
// int tableLen= getTableDefinition().getTableItemCount();
|
|
||||||
// int diff = tableLen-dataLen;
|
|
||||||
// Object[] formData = new Object[dataLen];
|
|
||||||
// int tableIndex;
|
|
||||||
// for (int j=0;j<dataLen;j++){
|
|
||||||
// tableIndex = j+diff;
|
|
||||||
// formData[j] = getTableDefinition().getTableItem(j+diff).getValue();
|
|
||||||
// if (formData[j] != null && formData[j].getClass() == String.class) {
|
|
||||||
// formData[j] = ((String) formData[j]).trim();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// formDescription.getf
|
|
||||||
|
|
||||||
FormsDataUnit formsDataUnit = new FormsDataUnit(null, timeMilliseconds, formDescription, formData);
|
FormsDataUnit formsDataUnit = new FormsDataUnit(null, timeMilliseconds, formDescription, formData);
|
||||||
formsDataUnit.setDatabaseIndex(databaseIndex);
|
formsDataUnit.setDatabaseIndex(databaseIndex);
|
||||||
@ -120,16 +87,17 @@ public class FormsLogging extends SQLLogging {
|
|||||||
|
|
||||||
return formsDataUnit;
|
return formsDataUnit;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean loadViewData(PamConnection con, PamViewParameters pamViewParameters, ViewLoadObserver loadObserver) {
|
||||||
|
boolean ans = super.loadViewData(con, pamViewParameters, loadObserver);
|
||||||
|
if (ans) {
|
||||||
|
getPamDataBlock().sortData();
|
||||||
// LoggerForm.
|
}
|
||||||
// return new FormsDataUnit(null, timeMilliseconds, formDescription, formData);
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
26
src/loggerForms/FormsParameters.java
Normal file
26
src/loggerForms/FormsParameters.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package loggerForms;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some general parameters for PAMGuard Viewer mode
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class FormsParameters implements Serializable, Cloneable{
|
||||||
|
|
||||||
|
public static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public boolean allowViewerChanges = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected FormsParameters clone() {
|
||||||
|
try {
|
||||||
|
return (FormsParameters) super.clone();
|
||||||
|
} catch (CloneNotSupportedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -10,6 +10,7 @@ import java.awt.Component;
|
|||||||
import java.awt.Container;
|
import java.awt.Container;
|
||||||
import java.awt.FlowLayout;
|
import java.awt.FlowLayout;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
|
import java.awt.Frame;
|
||||||
import java.awt.GridLayout;
|
import java.awt.GridLayout;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
@ -50,6 +51,7 @@ import PamView.PamColors;
|
|||||||
import PamView.dialog.PamButton;
|
import PamView.dialog.PamButton;
|
||||||
import PamView.dialog.PamDialog;
|
import PamView.dialog.PamDialog;
|
||||||
import PamView.dialog.PamLabel;
|
import PamView.dialog.PamLabel;
|
||||||
|
import PamView.dialog.warn.WarnOnce;
|
||||||
import PamView.panel.PamPanel;
|
import PamView.panel.PamPanel;
|
||||||
import PamView.panel.VerticalLayout;
|
import PamView.panel.VerticalLayout;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
@ -136,6 +138,7 @@ public class LoggerForm{
|
|||||||
public static final int PreviewDataForm = 2;
|
public static final int PreviewDataForm = 2;
|
||||||
private int NewOrEdit;
|
private int NewOrEdit;
|
||||||
private LoggerFormPanel lastRow;
|
private LoggerFormPanel lastRow;
|
||||||
|
private FormsDataUnit restoredDataUnit;
|
||||||
|
|
||||||
//// /**
|
//// /**
|
||||||
//// * used to hold reference to dataUnit being edited in "edit" mode
|
//// * used to hold reference to dataUnit being edited in "edit" mode
|
||||||
@ -605,21 +608,35 @@ public class LoggerForm{
|
|||||||
* Enable / disable buttons
|
* Enable / disable buttons
|
||||||
* <p> for now this is basically just disabling buttons if
|
* <p> for now this is basically just disabling buttons if
|
||||||
* we're in viewer mode. A More sophisticated function
|
* we're in viewer mode. A More sophisticated function
|
||||||
* might consider enabling / diabling depending on whether
|
* might consider enabling / disabling depending on whether
|
||||||
* or not a form can be saved.
|
* or not a form can be saved.
|
||||||
*/
|
*/
|
||||||
public void enableControls() {
|
public void enableControls() {
|
||||||
boolean isViewer = PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW;
|
boolean isViewer = PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW;
|
||||||
if (saveButton != null) saveButton.setEnabled(!isViewer);
|
boolean viewerEds = false;
|
||||||
if (clearButton != null) clearButton.setEnabled(!isViewer);
|
if (formDescription != null) {
|
||||||
if (cancelButton != null) cancelButton.setEnabled(!isViewer);
|
FormsControl formsControl = formDescription.getFormsControl();
|
||||||
|
viewerEds = formsControl.getFormsParameters().allowViewerChanges;
|
||||||
|
}
|
||||||
|
if (saveButton != null) {
|
||||||
|
saveButton.setEnabled(!isViewer || viewerEds);
|
||||||
|
if (isViewer) {
|
||||||
|
saveButton.setText(restoredDataUnit == null ? "Save" : "Update...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (clearButton != null) {
|
||||||
|
clearButton.setEnabled(!isViewer);
|
||||||
|
}
|
||||||
|
if (cancelButton != null) {
|
||||||
|
cancelButton.setEnabled(!isViewer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class SaveButtonListener implements ActionListener {
|
class SaveButtonListener implements ActionListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
if (e.getActionCommand().equals("Save")) {
|
// if (e.getActionCommand().equals("Save")) {
|
||||||
String er = getFormErrors();
|
String er = getFormErrors();
|
||||||
|
|
||||||
getFormWarnings();
|
getFormWarnings();
|
||||||
@ -628,7 +645,7 @@ public class LoggerForm{
|
|||||||
if (er==null){
|
if (er==null){
|
||||||
save();
|
save();
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,17 +653,16 @@ public class LoggerForm{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
if (e.getActionCommand().equals("Save")) {
|
// if (e.getActionCommand().equals("Save")) {
|
||||||
String er = getFormErrors();
|
String er = getFormErrors();
|
||||||
|
|
||||||
getFormWarnings();
|
getFormWarnings();
|
||||||
|
|
||||||
|
|
||||||
if (er==null){
|
if (er==null){
|
||||||
save();
|
save();
|
||||||
formDescription.removeSubtabform(loggerForm);
|
formDescription.removeSubtabform(loggerForm);
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -737,10 +753,17 @@ public class LoggerForm{
|
|||||||
* @param formsDataUnit
|
* @param formsDataUnit
|
||||||
*/
|
*/
|
||||||
void restoreData(FormsDataUnit formsDataUnit){
|
void restoreData(FormsDataUnit formsDataUnit){
|
||||||
|
restoredDataUnit = formsDataUnit;
|
||||||
|
if (formsDataUnit != null) {
|
||||||
// this.formsDataUnit = formsDataUnit;
|
// this.formsDataUnit = formsDataUnit;
|
||||||
Object[] formData = formsDataUnit.getFormData();
|
Object[] formData = formsDataUnit.getFormData();
|
||||||
transferDataArrayToForm(formData);
|
transferDataArrayToForm(formData);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
enableControls();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Transfers data from the from controls to the data array which will
|
* Transfers data from the from controls to the data array which will
|
||||||
@ -840,14 +863,40 @@ public class LoggerForm{
|
|||||||
* Extract and save teh data inot a new PAmDAtaUnit.
|
* Extract and save teh data inot a new PAmDAtaUnit.
|
||||||
*/
|
*/
|
||||||
private void save() {
|
private void save() {
|
||||||
//create form data object v
|
//create form data object
|
||||||
Object[] formData = extractFormData();
|
Object[] formData = extractFormData();
|
||||||
|
|
||||||
if (NewOrEdit==NewDataForm){
|
boolean isViewer = PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW;
|
||||||
|
boolean isNew = true;
|
||||||
|
if (isViewer && restoredDataUnit != null) {
|
||||||
|
isNew = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isNew){
|
||||||
FormsDataUnit formDataUnit = new FormsDataUnit(loggerForm,PamCalendar.getTimeInMillis(), formDescription, formData);
|
FormsDataUnit formDataUnit = new FormsDataUnit(loggerForm,PamCalendar.getTimeInMillis(), formDescription, formData);
|
||||||
// dU.setParentDataBlock(formDescription.getFormsDataBlock());
|
|
||||||
// System.out.println(formDescription.getXMLData(formDataUnit));
|
|
||||||
formDescription.getFormsDataBlock().addPamData(formDataUnit);
|
formDescription.getFormsDataBlock().addPamData(formDataUnit);
|
||||||
|
// in viewer mode, will need to do something to get this to save.
|
||||||
|
if (isViewer) {
|
||||||
|
formDescription.getFormsDataBlock().getLogging().logData(DBControlUnit.findConnection(), formDataUnit);
|
||||||
|
formDescription.getFormsDataBlock().sortData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// update the data form. Ask first.
|
||||||
|
Frame win = formDescription.getFormsControl().getGuiFrame();
|
||||||
|
String msg = "Do you want to update this form with new data ?";
|
||||||
|
int ans = WarnOnce.showWarning(win, "Logger forms: " + formDescription.getFormName(), msg, WarnOnce.OK_CANCEL_OPTION);
|
||||||
|
if (ans == WarnOnce.OK_OPTION) {
|
||||||
|
if (restoredDataUnit == null) {
|
||||||
|
WarnOnce.showWarning(win, "Logger forms: " + formDescription.getFormName(), "No data to update", WarnOnce.WARNING_MESSAGE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
restoredDataUnit.setFormsData(loggerForm, formData);
|
||||||
|
// should update database on next SaveData, but not before.
|
||||||
|
formDescription.getFormsDataBlock().updatePamData(restoredDataUnit, PamCalendar.getTimeInMillis());
|
||||||
|
formDescription.getFormsDataBlock().sortData();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// else if(NewOrEdit==EditDataForm && formsDataUnit != null){
|
// else if(NewOrEdit==EditDataForm && formsDataUnit != null){
|
||||||
// formsDataUnit.setFormsData(formData);
|
// formsDataUnit.setFormsData(formData);
|
||||||
@ -914,6 +963,9 @@ public class LoggerForm{
|
|||||||
public JButton getSaveButton() {
|
public JButton getSaveButton() {
|
||||||
return saveButton;
|
return saveButton;
|
||||||
}
|
}
|
||||||
|
public void optionsChange() {
|
||||||
|
enableControls();
|
||||||
|
}
|
||||||
|
|
||||||
// public GpsData getOriginLatLong(FormsDataUnit formsDataUnit) {
|
// public GpsData getOriginLatLong(FormsDataUnit formsDataUnit) {
|
||||||
// GpsData gps = getOrigin(GPSOriginSystem.class, formsDataUnit);
|
// GpsData gps = getOrigin(GPSOriginSystem.class, formsDataUnit);
|
||||||
|
@ -32,6 +32,7 @@ import PamView.PamSymbolType;
|
|||||||
import PamView.PanelOverlayDraw;
|
import PamView.PanelOverlayDraw;
|
||||||
import PamView.GeneralProjector.ParameterType;
|
import PamView.GeneralProjector.ParameterType;
|
||||||
import PamView.GeneralProjector.ParameterUnits;
|
import PamView.GeneralProjector.ParameterUnits;
|
||||||
|
import PamView.symbol.PamSymbolChooser;
|
||||||
import PamView.symbol.SymbolData;
|
import PamView.symbol.SymbolData;
|
||||||
import PamguardMVC.PamDataUnit;
|
import PamguardMVC.PamDataUnit;
|
||||||
|
|
||||||
@ -189,7 +190,7 @@ public class LoggerFormGraphics extends PanelOverlayDraw {
|
|||||||
|
|
||||||
double shipCourse = plotOrigin.getCourseOverGround();
|
double shipCourse = plotOrigin.getCourseOverGround();
|
||||||
double shipHead = plotOrigin.getHeading();
|
double shipHead = plotOrigin.getHeading();
|
||||||
PamSymbol plotSymbol = getPlotSymbol(formDataUnit);
|
PamSymbol plotSymbol = getPlotSymbol(generalProjector, formDataUnit);
|
||||||
|
|
||||||
Coordinate3d detOrigin = generalProjector.getCoord3d(plotOrigin.getLatitude(), plotOrigin.getLongitude(), plotOrigin.getHeight());
|
Coordinate3d detOrigin = generalProjector.getCoord3d(plotOrigin.getLatitude(), plotOrigin.getLongitude(), plotOrigin.getHeight());
|
||||||
// see if there is range heading and bearing data.
|
// see if there is range heading and bearing data.
|
||||||
@ -248,7 +249,7 @@ public class LoggerFormGraphics extends PanelOverlayDraw {
|
|||||||
int nControls = data.length;
|
int nControls = data.length;
|
||||||
ControlDescription controlDescription;
|
ControlDescription controlDescription;
|
||||||
ArrayList<InputControlDescription> controlDescriptions = formDescription.getInputControlDescriptions();
|
ArrayList<InputControlDescription> controlDescriptions = formDescription.getInputControlDescriptions();
|
||||||
PamSymbol plotSymbol = getPlotSymbol(dataUnit);
|
PamSymbol plotSymbol = getPlotSymbol(generalProjector, dataUnit);
|
||||||
if (plotSymbol == null) {
|
if (plotSymbol == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -354,7 +355,22 @@ public class LoggerFormGraphics extends PanelOverlayDraw {
|
|||||||
* @param pamDataUnit data unit to plot
|
* @param pamDataUnit data unit to plot
|
||||||
* @return symbol.
|
* @return symbol.
|
||||||
*/
|
*/
|
||||||
private PamSymbol getPlotSymbol(FormsDataUnit dataUnit) {
|
private PamSymbol getPlotSymbol(GeneralProjector projector, FormsDataUnit dataUnit) {
|
||||||
|
/**
|
||||||
|
* Try to use the new selector system. If it's not there, then revert to
|
||||||
|
* the older system.
|
||||||
|
*/
|
||||||
|
PamSymbolChooser chooser = null;
|
||||||
|
if (projector != null) {
|
||||||
|
chooser = projector.getPamSymbolChooser();
|
||||||
|
}
|
||||||
|
if (chooser != null) {
|
||||||
|
PamSymbol chosenSymbol = chooser.getPamSymbol(projector, dataUnit);
|
||||||
|
if (chosenSymbol != null) {
|
||||||
|
return chosenSymbol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* first go through all the controls and see which is
|
* first go through all the controls and see which is
|
||||||
* the first one that's initiated plotting. If it's
|
* the first one that's initiated plotting. If it's
|
||||||
@ -409,22 +425,7 @@ public class LoggerFormGraphics extends PanelOverlayDraw {
|
|||||||
@Override
|
@Override
|
||||||
public String getHoverText(GeneralProjector generalProjector,
|
public String getHoverText(GeneralProjector generalProjector,
|
||||||
PamDataUnit dataUnit, int iSide) {
|
PamDataUnit dataUnit, int iSide) {
|
||||||
FormsDataUnit formsDU = (FormsDataUnit) dataUnit;
|
return dataUnit.getSummaryString();
|
||||||
String str = String.format("<html><b>%s</b>", formDescription.getFormNiceName());
|
|
||||||
Object[] data = formsDU.getFormData();
|
|
||||||
int iDat = 0;
|
|
||||||
for (ControlDescription cd:formDescription.getInputControlDescriptions()) {
|
|
||||||
if (data[iDat] == null) {
|
|
||||||
str += String.format("<p>%s: -", cd.getTitle());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
str += String.format("<p>%s: %s", cd.getTitle(), data[iDat].toString());
|
|
||||||
}
|
|
||||||
iDat++;
|
|
||||||
}
|
|
||||||
|
|
||||||
str += "</html>";
|
|
||||||
return str;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createSymbols() {
|
private void createSymbols() {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package loggerForms;
|
package loggerForms;
|
||||||
|
|
||||||
public enum PropertyTypes {
|
public enum PropertyTypes {
|
||||||
ORDER, AUTOALERT,SUBTABS,POPUP,HIDDEN,AUTORECORD,BEARING,
|
STARTTIME, ENDTIME, ORDER, AUTOALERT,SUBTABS,POPUP,HIDDEN,AUTORECORD,BEARING,
|
||||||
RANGE,HEADING,FONT,DBTABLENAME,
|
RANGE,HEADING,FONT,DBTABLENAME,
|
||||||
FORMCOLOUR,FORMCOLOR,
|
FORMCOLOUR,FORMCOLOR,
|
||||||
HOTKEY,NOCLEAR,NOCANCEL,NOTOFFLINE,NOTONLINE,
|
HOTKEY,NOCLEAR,NOCANCEL,NOTOFFLINE,NOTONLINE,
|
||||||
@ -16,6 +16,10 @@ public enum PropertyTypes {
|
|||||||
|
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
|
case STARTTIME:
|
||||||
|
return "Form start time. Will be used as main data UTC. If undefined, form time is save time";
|
||||||
|
case ENDTIME:
|
||||||
|
return "Form end time. Will be used data end time in period data";
|
||||||
case AUTOALERT:
|
case AUTOALERT:
|
||||||
return "A warning will be issued if the form has not been completed for a set time";
|
return "A warning will be issued if the form has not been completed for a set time";
|
||||||
case AUTORECORD:
|
case AUTORECORD:
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
package loggerForms.controlDescriptions;
|
package loggerForms.controlDescriptions;
|
||||||
|
|
||||||
import generalDatabase.EmptyTableDefinition;
|
|
||||||
|
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
||||||
|
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
@ -12,7 +10,6 @@ import javax.swing.JPanel;
|
|||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
import PamUtils.XMLUtils;
|
|
||||||
import loggerForms.FormDescription;
|
import loggerForms.FormDescription;
|
||||||
import loggerForms.FormsDataUnit;
|
import loggerForms.FormsDataUnit;
|
||||||
import loggerForms.FormsTableItem;
|
import loggerForms.FormsTableItem;
|
||||||
@ -37,7 +34,6 @@ public abstract class ControlDescription extends ItemDescription {
|
|||||||
protected ControlDescription(FormDescription formDescription, ItemInformation itemInformation) {
|
protected ControlDescription(FormDescription formDescription, ItemInformation itemInformation) {
|
||||||
super(formDescription, itemInformation);
|
super(formDescription, itemInformation);
|
||||||
eType = ControlTypes.valueOf(getType());
|
eType = ControlTypes.valueOf(getType());
|
||||||
// System.out.println(getType()+";"+eType.toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -88,11 +84,6 @@ public abstract class ControlDescription extends ItemDescription {
|
|||||||
return formsTableItems;
|
return formsTableItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private ControlTypes eType;
|
private ControlTypes eType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
15
src/loggerForms/effort/FormsEffortUnit.java
Normal file
15
src/loggerForms/effort/FormsEffortUnit.java
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package loggerForms.effort;
|
||||||
|
|
||||||
|
import effort.EffortDataUnit;
|
||||||
|
import loggerForms.FormsDataUnit;
|
||||||
|
|
||||||
|
public class FormsEffortUnit extends EffortDataUnit {
|
||||||
|
|
||||||
|
private FormsDataUnit parentFormUnit;
|
||||||
|
|
||||||
|
public FormsEffortUnit(LoggerEffortProvider loggerEffortProvider, FormsDataUnit parentFormUnit, long formEndTime) {
|
||||||
|
super(loggerEffortProvider, parentFormUnit, parentFormUnit.getTimeMilliseconds(), formEndTime);
|
||||||
|
this.parentFormUnit = parentFormUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
165
src/loggerForms/effort/LoggerEffortProvider.java
Normal file
165
src/loggerForms/effort/LoggerEffortProvider.java
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
package loggerForms.effort;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
|
|
||||||
|
import PamController.PamController;
|
||||||
|
import PamView.symbol.PamSymbolManager;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import PamguardMVC.dataSelector.DataSelector;
|
||||||
|
import dataMap.OfflineDataMap;
|
||||||
|
import effort.EffortDataUnit;
|
||||||
|
import effort.EffortProvider;
|
||||||
|
import loggerForms.FormDescription;
|
||||||
|
import loggerForms.FormsDataBlock;
|
||||||
|
import loggerForms.FormsDataUnit;
|
||||||
|
|
||||||
|
public class LoggerEffortProvider extends EffortProvider {
|
||||||
|
|
||||||
|
private FormsDataBlock formsDataBlock;
|
||||||
|
|
||||||
|
private ArrayList<EffortDataUnit> onlineEffort;
|
||||||
|
|
||||||
|
public LoggerEffortProvider(FormsDataBlock parentDataBlock) {
|
||||||
|
super(parentDataBlock);
|
||||||
|
this.formsDataBlock = parentDataBlock;
|
||||||
|
FormDescription formsDescription = parentDataBlock.getFormDescription();
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public EffortDataUnit getEffort(long timeMilliseconds) {
|
||||||
|
// ListIterator<FormsDataUnit> iterator = formsDataBlock.getListIterator(timeMilliseconds, 0, PamDataBlock.MATCH_BEFORE, PamDataBlock.POSITION_BEFORE);
|
||||||
|
// FormsDataUnit currentUnit = null;
|
||||||
|
// FormsDataUnit nextUnit = null;
|
||||||
|
// if (iterator == null) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (iterator.hasNext()) {
|
||||||
|
// currentUnit = iterator.next();
|
||||||
|
// }
|
||||||
|
// if (iterator.hasNext()) {
|
||||||
|
// nextUnit = iterator.next();
|
||||||
|
// }
|
||||||
|
// if (currentUnit == null) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
// long endTime = getEndTime(currentUnit, nextUnit);
|
||||||
|
//
|
||||||
|
// return new FormsEffortUnit(this, currentUnit, endTime);
|
||||||
|
// }
|
||||||
|
|
||||||
|
private long getEndTime(FormsDataUnit currentUnit, FormsDataUnit nextUnit) {
|
||||||
|
Long end = currentUnit.getSetEndTime();
|
||||||
|
if (end != null) {
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
if (nextUnit == null) {
|
||||||
|
return getLastDatasetTime();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nextUnit.getTimeMilliseconds();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<EffortDataUnit> getAllEffortThings() {
|
||||||
|
return onlineEffort;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void viewerLoadData() {
|
||||||
|
ArrayList<EffortDataUnit> allList = new ArrayList();
|
||||||
|
ListIterator<FormsDataUnit> iterator = formsDataBlock.getListIterator(0);
|
||||||
|
FormsDataUnit currentUnit = null;
|
||||||
|
FormsDataUnit nextUnit = null;
|
||||||
|
if (iterator.hasNext()) {
|
||||||
|
currentUnit = iterator.next();
|
||||||
|
}
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
nextUnit = iterator.next();
|
||||||
|
long end = getEndTime(currentUnit, nextUnit);
|
||||||
|
allList.add(new FormsEffortUnit(this, currentUnit, end));
|
||||||
|
currentUnit = nextUnit;
|
||||||
|
}
|
||||||
|
if (currentUnit != null) {
|
||||||
|
long end = getEndTime(currentUnit, null);
|
||||||
|
allList.add(new FormsEffortUnit(this, currentUnit, end));
|
||||||
|
}
|
||||||
|
onlineEffort = allList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DataSelector getDataSelector(String selectorName) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PamSymbolManager getSymbolManager() {
|
||||||
|
return formsDataBlock.getPamSymbolManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the last time of any data in this dataset from any data map.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private long getLastDatasetTime() {
|
||||||
|
long lastTime = Long.MIN_VALUE;
|
||||||
|
ArrayList<PamDataBlock> allData = PamController.getInstance().getDataBlocks();
|
||||||
|
for (PamDataBlock aBlock : allData) {
|
||||||
|
OfflineDataMap dataMap = aBlock.getPrimaryDataMap();
|
||||||
|
if (dataMap != null) {
|
||||||
|
lastTime = Math.max(lastTime, dataMap.getLastDataTime());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lastTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return formsDataBlock.getDataName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void realTimeStart(long timeMilliseconds) {
|
||||||
|
// Don't do anything with start and end of processing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void realTimeStop(long timeMilliseconds) {
|
||||||
|
// Don't do anything with start and end of processing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void newData(PamDataUnit pamDataUnit) {
|
||||||
|
// generate effort things from incoming form data.
|
||||||
|
if (onlineEffort == null) {
|
||||||
|
onlineEffort = new ArrayList<>();
|
||||||
|
}
|
||||||
|
FormsEffortUnit lastEffort = null;
|
||||||
|
if (onlineEffort.size() > 0) {
|
||||||
|
lastEffort = (FormsEffortUnit) onlineEffort.get(onlineEffort.size()-1);
|
||||||
|
}
|
||||||
|
FormsDataUnit formDataUnit = (FormsDataUnit) pamDataUnit;
|
||||||
|
long thisStart = formDataUnit.getTimeMilliseconds();
|
||||||
|
Long thisEnd = formDataUnit.getSetEndTime();
|
||||||
|
if (lastEffort != null) {
|
||||||
|
/*
|
||||||
|
* If the previous effort didn't have a end time, then use this start as that's end.
|
||||||
|
*/
|
||||||
|
if (lastEffort.getEffortEnd() >= EffortDataUnit.ONGOINGEFFORT/2) {
|
||||||
|
lastEffort.setEffortEnd(thisStart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (thisEnd == null) {
|
||||||
|
thisEnd = EffortDataUnit.ONGOINGEFFORT;
|
||||||
|
}
|
||||||
|
FormsEffortUnit newEffort = new FormsEffortUnit(this, formDataUnit, thisEnd);
|
||||||
|
onlineEffort.add(newEffort);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -11,6 +11,7 @@ import loggerForms.ItemInformation;
|
|||||||
import loggerForms.PropertyDescription;
|
import loggerForms.PropertyDescription;
|
||||||
import loggerForms.PropertyTypes;
|
import loggerForms.PropertyTypes;
|
||||||
import loggerForms.UDColName;
|
import loggerForms.UDColName;
|
||||||
|
import loggerForms.controlDescriptions.ControlTypes;
|
||||||
import loggerForms.formdesign.propertypanels.AutoAlertPanel;
|
import loggerForms.formdesign.propertypanels.AutoAlertPanel;
|
||||||
import loggerForms.formdesign.propertypanels.BearingPanel;
|
import loggerForms.formdesign.propertypanels.BearingPanel;
|
||||||
import loggerForms.formdesign.propertypanels.BooleanPanel;
|
import loggerForms.formdesign.propertypanels.BooleanPanel;
|
||||||
@ -26,6 +27,7 @@ import loggerForms.formdesign.propertypanels.PropertyPanel;
|
|||||||
import loggerForms.formdesign.propertypanels.RangePanel;
|
import loggerForms.formdesign.propertypanels.RangePanel;
|
||||||
import loggerForms.formdesign.propertypanels.SymbolPanel;
|
import loggerForms.formdesign.propertypanels.SymbolPanel;
|
||||||
import loggerForms.formdesign.propertypanels.TextPanel;
|
import loggerForms.formdesign.propertypanels.TextPanel;
|
||||||
|
import loggerForms.formdesign.propertypanels.XReferencePanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Layer that sits between the form description and the actual edit
|
* Layer that sits between the form description and the actual edit
|
||||||
@ -154,6 +156,10 @@ public class FormEditor {
|
|||||||
public PropertyPanel makePropertyPanel(PropertyTypes propertyType) {
|
public PropertyPanel makePropertyPanel(PropertyTypes propertyType) {
|
||||||
|
|
||||||
switch (propertyType) {
|
switch (propertyType) {
|
||||||
|
case STARTTIME:
|
||||||
|
return new XReferencePanel(this, propertyType, ControlTypes.TIMESTAMP);
|
||||||
|
case ENDTIME:
|
||||||
|
return new XReferencePanel(this, propertyType, ControlTypes.TIMESTAMP);
|
||||||
case AUTOALERT:
|
case AUTOALERT:
|
||||||
return new IntegerPanel(this, propertyType, UDColName.AutoUpdate, "Alert operator every", "minutes");
|
return new IntegerPanel(this, propertyType, UDColName.AutoUpdate, "Alert operator every", "minutes");
|
||||||
case AUTORECORD:
|
case AUTORECORD:
|
||||||
|
@ -0,0 +1,95 @@
|
|||||||
|
package loggerForms.formdesign.propertypanels;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
|
||||||
|
import loggerForms.ItemInformation;
|
||||||
|
import loggerForms.PropertyTypes;
|
||||||
|
import loggerForms.UDColName;
|
||||||
|
import loggerForms.controlDescriptions.ControlTypes;
|
||||||
|
import loggerForms.formdesign.ControlTitle;
|
||||||
|
import loggerForms.formdesign.FormEditor;
|
||||||
|
import loggerForms.formdesign.FormEditor.EditNotify;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property form for a cross reference sontrol.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class XReferencePanel extends PropertyPanel {
|
||||||
|
|
||||||
|
private ControlTypes controlType;
|
||||||
|
|
||||||
|
private JComboBox<String> fieldNames;
|
||||||
|
|
||||||
|
public XReferencePanel(FormEditor formEditor, PropertyTypes propertyType, ControlTypes controlType) {
|
||||||
|
super(formEditor, propertyType);
|
||||||
|
this.controlType = controlType;
|
||||||
|
addItem(new JLabel(" Use "));
|
||||||
|
addItem(fieldNames = new JComboBox<String>());
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see loggerForms.formdesign.propertypanels.PropertyPanel#notifyChanges(loggerForms.formdesign.FormEditor.EditNotify)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void notifyChanges(EditNotify notifyType) {
|
||||||
|
fillComboBox();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fill the combo box with a list of all control names that have
|
||||||
|
* numeric data which might be used for bearing information.
|
||||||
|
*/
|
||||||
|
private void fillComboBox() {
|
||||||
|
String currentValue = (String) fieldNames.getSelectedItem();
|
||||||
|
fieldNames.removeAllItems();
|
||||||
|
ArrayList<ControlTitle> ctrlTitles = formEditor.getControlTitles();
|
||||||
|
for (ControlTitle title:ctrlTitles) {
|
||||||
|
if (title.getType() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (title.getType() == controlType) {
|
||||||
|
fieldNames.addItem(title.getItemInformation().getStringProperty(UDColName.Title.toString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (currentValue != null) {
|
||||||
|
fieldNames.setSelectedItem(currentValue);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// pushProperty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void propertyEnable(boolean enabled) {
|
||||||
|
fieldNames.setEnabled(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pushProperty(ItemInformation itemInformation) {
|
||||||
|
super.pushProperty(itemInformation);
|
||||||
|
if (itemInformation == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
fieldNames.setSelectedItem(itemInformation.getStringProperty(UDColName.Title.toString()));
|
||||||
|
}
|
||||||
|
catch (Exception e) {};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemInformation fetchProperty(ItemInformation itemInformation) {
|
||||||
|
itemInformation = super.fetchProperty(itemInformation);
|
||||||
|
if (itemInformation == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
itemInformation.setProperty(UDColName.Title.toString(), fieldNames.getSelectedItem());
|
||||||
|
|
||||||
|
return itemInformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
53
src/loggerForms/symbol/IntegerSymbolModifier.java
Normal file
53
src/loggerForms/symbol/IntegerSymbolModifier.java
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package loggerForms.symbol;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
|
||||||
|
import PamView.GeneralProjector;
|
||||||
|
import PamView.PamColors;
|
||||||
|
import PamView.PamSymbolType;
|
||||||
|
import PamView.symbol.PamSymbolChooser;
|
||||||
|
import PamView.symbol.SymbolData;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import loggerForms.FormDescription;
|
||||||
|
import loggerForms.controlDescriptions.ControlDescription;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integer symbol modifier. Basically returns the whale colour rotation.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class IntegerSymbolModifier extends LoggerSymbolModifier {
|
||||||
|
|
||||||
|
public IntegerSymbolModifier(FormDescription formDescription, ControlDescription controlDescription,
|
||||||
|
PamSymbolChooser symbolChooser, int modifyableBits) {
|
||||||
|
super(formDescription, controlDescription, symbolChooser, modifyableBits);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SymbolData getSymbolData(GeneralProjector projector, PamDataUnit dataUnit) {
|
||||||
|
Object data = getControlData(dataUnit);
|
||||||
|
if (data == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int number = 0;
|
||||||
|
if (data instanceof String) {
|
||||||
|
try {
|
||||||
|
number = Integer.valueOf(data.toString());
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (data instanceof Number) {
|
||||||
|
try {
|
||||||
|
number = Integer.valueOf(data.toString());
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Color col = PamColors.getInstance().getChannelColor(number);
|
||||||
|
return new SymbolData(PamSymbolType.SYMBOL_CIRCLE, 1, 1, true, col, col);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
23
src/loggerForms/symbol/LoggerSymbolChooser.java
Normal file
23
src/loggerForms/symbol/LoggerSymbolChooser.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package loggerForms.symbol;
|
||||||
|
|
||||||
|
import PamView.GeneralProjector;
|
||||||
|
import PamView.symbol.StandardSymbolChooser;
|
||||||
|
import PamView.symbol.StandardSymbolManager;
|
||||||
|
import PamView.symbol.SymbolData;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import dataPlots.data.SimpleSymbolChooser;
|
||||||
|
import loggerForms.FormsDataBlock;
|
||||||
|
|
||||||
|
public class LoggerSymbolChooser extends StandardSymbolChooser {
|
||||||
|
|
||||||
|
private FormsDataBlock formsDataBlock;
|
||||||
|
|
||||||
|
public LoggerSymbolChooser(StandardSymbolManager standardSymbolManager, FormsDataBlock pamDataBlock,
|
||||||
|
String displayName, SymbolData defaultSymbol, GeneralProjector projector) {
|
||||||
|
super(standardSymbolManager, pamDataBlock, displayName, defaultSymbol, projector);
|
||||||
|
this.formsDataBlock = pamDataBlock;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
130
src/loggerForms/symbol/LoggerSymbolManager.java
Normal file
130
src/loggerForms/symbol/LoggerSymbolManager.java
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
package loggerForms.symbol;
|
||||||
|
|
||||||
|
import PamView.GeneralProjector;
|
||||||
|
import PamView.PamSymbol;
|
||||||
|
import PamView.symbol.PamSymbolChooser;
|
||||||
|
import PamView.symbol.PamSymbolManager;
|
||||||
|
import PamView.symbol.StandardSymbolChooser;
|
||||||
|
import PamView.symbol.StandardSymbolManager;
|
||||||
|
import PamView.symbol.SymbolData;
|
||||||
|
import PamView.symbol.modifier.SymbolModType;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import loggerForms.FormDescription;
|
||||||
|
import loggerForms.FormsDataBlock;
|
||||||
|
import loggerForms.LoggerFormGraphics;
|
||||||
|
import loggerForms.PropertyDescription;
|
||||||
|
import loggerForms.PropertyTypes;
|
||||||
|
import loggerForms.controlDescriptions.ControlDescription;
|
||||||
|
import loggerForms.formdesign.FormList;
|
||||||
|
import loggerForms.formdesign.propertypanels.SymbolPanel;
|
||||||
|
|
||||||
|
public class LoggerSymbolManager extends StandardSymbolManager {
|
||||||
|
|
||||||
|
private FormsDataBlock formsDataBlock;
|
||||||
|
private SymbolData standardFormSymbol;
|
||||||
|
|
||||||
|
public LoggerSymbolManager(FormsDataBlock pamDataBlock) {
|
||||||
|
super(pamDataBlock, LoggerFormGraphics.defaultSymbol);
|
||||||
|
this.formsDataBlock = pamDataBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected LoggerSymbolChooser createSymbolChooser(String displayName, GeneralProjector projector) {
|
||||||
|
return new LoggerSymbolChooser(this, formsDataBlock, displayName, getDefaultSymbol(), projector);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SymbolData getDefaultSymbol() {
|
||||||
|
/**
|
||||||
|
* the default default is a generic one for logger data. See if it is overridden by a symbol
|
||||||
|
* specified for the form.
|
||||||
|
*/
|
||||||
|
SymbolData formSymbol = getFormSymbol();
|
||||||
|
if (formSymbol != null) {
|
||||||
|
return formSymbol;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return super.getDefaultSymbol();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the default symbol for the form. Might be null,
|
||||||
|
* though might have been set in the form properties.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public SymbolData getFormSymbol() {
|
||||||
|
if (standardFormSymbol == null) {
|
||||||
|
FormDescription formDescription = formsDataBlock.getFormDescription();
|
||||||
|
PropertyDescription formProperty = formDescription.findProperty(PropertyTypes.SYMBOLTYPE);
|
||||||
|
if (formProperty == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
PamSymbol symbol = SymbolPanel.createSymbol(formProperty.getItemInformation());
|
||||||
|
if (symbol != null) {
|
||||||
|
standardFormSymbol = symbol.getSymbolData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return standardFormSymbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addSymbolModifiers(PamSymbolChooser psc) {
|
||||||
|
// probably don't want the standard ones.
|
||||||
|
// super.addSymbolModifiers(psc);
|
||||||
|
/*
|
||||||
|
* now add symbol modifiers for each control in the form.
|
||||||
|
* This will primarily be lookups which should have defined colours.
|
||||||
|
* May be able to do other controls based on their type / null / >0 values.
|
||||||
|
* Focus on lut's for now.
|
||||||
|
*/
|
||||||
|
FormDescription formDescription = formsDataBlock.getFormDescription();
|
||||||
|
FormList<ControlDescription> ctrls = formDescription.getControlDescriptions();
|
||||||
|
for (ControlDescription ctrlDescription : ctrls) {
|
||||||
|
LoggerSymbolModifier modifier = createSymbolModifier(formDescription, ctrlDescription, psc);
|
||||||
|
if (modifier != null) {
|
||||||
|
psc.addSymbolModifier(modifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private LoggerSymbolModifier createSymbolModifier(FormDescription formDescription,
|
||||||
|
ControlDescription ctrlDescription, PamSymbolChooser psc) {
|
||||||
|
switch (ctrlDescription.getEType()) {
|
||||||
|
case CHAR:
|
||||||
|
break;
|
||||||
|
case CHECKBOX:
|
||||||
|
break;
|
||||||
|
case COUNTER:
|
||||||
|
return new IntegerSymbolModifier(formDescription, ctrlDescription, psc, SymbolModType.FILLCOLOUR | SymbolModType.LINECOLOUR);
|
||||||
|
case DOUBLE:
|
||||||
|
break;
|
||||||
|
case INTEGER:
|
||||||
|
return new IntegerSymbolModifier(formDescription, ctrlDescription, psc, SymbolModType.FILLCOLOUR | SymbolModType.LINECOLOUR);
|
||||||
|
case LATLONG:
|
||||||
|
break;
|
||||||
|
case LOOKUP:
|
||||||
|
return new LookupSymbolModifier(formDescription, ctrlDescription, psc, SymbolModType.EVERYTHING);
|
||||||
|
case NMEACHAR:
|
||||||
|
break;
|
||||||
|
case NMEAFLOAT:
|
||||||
|
break;
|
||||||
|
case NMEAINT:
|
||||||
|
break;
|
||||||
|
case SHORT:
|
||||||
|
return new IntegerSymbolModifier(formDescription, ctrlDescription, psc, SymbolModType.FILLCOLOUR | SymbolModType.LINECOLOUR);
|
||||||
|
case SINGLE:
|
||||||
|
break;
|
||||||
|
case STATIC:
|
||||||
|
break;
|
||||||
|
case TIME:
|
||||||
|
break;
|
||||||
|
case TIMESTAMP:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
66
src/loggerForms/symbol/LoggerSymbolModifier.java
Normal file
66
src/loggerForms/symbol/LoggerSymbolModifier.java
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package loggerForms.symbol;
|
||||||
|
|
||||||
|
import PamView.GeneralProjector;
|
||||||
|
import PamView.symbol.PamSymbolChooser;
|
||||||
|
import PamView.symbol.SymbolData;
|
||||||
|
import PamView.symbol.modifier.SymbolModifier;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import loggerForms.FormDescription;
|
||||||
|
import loggerForms.FormsDataUnit;
|
||||||
|
import loggerForms.controlDescriptions.ControlDescription;
|
||||||
|
|
||||||
|
abstract public class LoggerSymbolModifier extends SymbolModifier {
|
||||||
|
|
||||||
|
protected FormDescription formDescription;
|
||||||
|
protected ControlDescription controlDescription;
|
||||||
|
protected int controlIndex;
|
||||||
|
|
||||||
|
public LoggerSymbolModifier(FormDescription formDescription, ControlDescription controlDescription,
|
||||||
|
PamSymbolChooser symbolChooser, int modifyableBits) {
|
||||||
|
super(controlDescription.getTitle(), symbolChooser, modifyableBits);
|
||||||
|
this.formDescription = formDescription;
|
||||||
|
this.controlDescription = controlDescription;
|
||||||
|
controlIndex = formDescription.getControlIndex(controlDescription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data object for this control from the data unit.
|
||||||
|
* @param dataUnit
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Object getControlData(PamDataUnit dataUnit) {
|
||||||
|
if (dataUnit instanceof FormsDataUnit == false) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
FormsDataUnit formDataUnit = (FormsDataUnit) dataUnit;
|
||||||
|
Object[] data = formDataUnit.getFormData();
|
||||||
|
if (data == null || data.length <= controlIndex || controlIndex < 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return data[controlIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the formDescription
|
||||||
|
*/
|
||||||
|
protected FormDescription getFormDescription() {
|
||||||
|
return formDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the controlDescription
|
||||||
|
*/
|
||||||
|
protected ControlDescription getControlDescription() {
|
||||||
|
return controlDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the controlIndex
|
||||||
|
*/
|
||||||
|
protected int getControlIndex() {
|
||||||
|
return controlIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
42
src/loggerForms/symbol/LookupSymbolModifier.java
Normal file
42
src/loggerForms/symbol/LookupSymbolModifier.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package loggerForms.symbol;
|
||||||
|
|
||||||
|
import PamView.GeneralProjector;
|
||||||
|
import PamView.PamSymbol;
|
||||||
|
import PamView.symbol.PamSymbolChooser;
|
||||||
|
import PamView.symbol.SymbolData;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import generalDatabase.lookupTables.LookupItem;
|
||||||
|
import generalDatabase.lookupTables.LookupList;
|
||||||
|
import loggerForms.FormDescription;
|
||||||
|
import loggerForms.FormsDataUnit;
|
||||||
|
import loggerForms.controlDescriptions.CdLookup;
|
||||||
|
import loggerForms.controlDescriptions.ControlDescription;
|
||||||
|
|
||||||
|
public class LookupSymbolModifier extends LoggerSymbolModifier {
|
||||||
|
|
||||||
|
public LookupSymbolModifier(FormDescription formDescription, ControlDescription controlDescription,
|
||||||
|
PamSymbolChooser symbolChooser, int modifyableBits) {
|
||||||
|
super(formDescription, controlDescription, symbolChooser, modifyableBits);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SymbolData getSymbolData(GeneralProjector projector, PamDataUnit dataUnit) {
|
||||||
|
Object data = getControlData(dataUnit);
|
||||||
|
if (data == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
LookupList lutList = ((CdLookup)controlDescription).getLookupList();
|
||||||
|
int lutIndex = lutList.indexOfCode(data.toString());
|
||||||
|
LookupItem lutItem = lutList.getLookupItem(lutIndex);
|
||||||
|
if (lutItem == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
PamSymbol symbol = lutItem.getSymbol();
|
||||||
|
if (symbol == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return symbol.getSymbolData();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
103
src/ravendata/RavenControl.java
Normal file
103
src/ravendata/RavenControl.java
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
package ravendata;
|
||||||
|
|
||||||
|
import java.awt.Frame;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
|
||||||
|
import Acquisition.AcquisitionControl;
|
||||||
|
import PamController.InputStoreInfo;
|
||||||
|
import PamController.PamConfiguration;
|
||||||
|
import PamController.PamControlledUnit;
|
||||||
|
import PamController.PamControlledUnitSettings;
|
||||||
|
import PamController.PamController;
|
||||||
|
import PamController.PamSettingManager;
|
||||||
|
import PamController.PamSettings;
|
||||||
|
import PamView.dialog.warn.WarnOnce;
|
||||||
|
import pamViewFX.PamSettingsMenuPane;
|
||||||
|
import ravendata.swing.RavenImportDialog;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* System for importing and displaying data from Raven selection tables.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class RavenControl extends PamControlledUnit implements PamSettings {
|
||||||
|
|
||||||
|
private RavenProcess ravenProcess;
|
||||||
|
|
||||||
|
private static final String unitType = "Raven Import";
|
||||||
|
public static final String defaultName = unitType;
|
||||||
|
|
||||||
|
private RavenParameters ravenParameters = new RavenParameters();
|
||||||
|
|
||||||
|
public RavenControl(String unitName) {
|
||||||
|
super(unitType, unitName);
|
||||||
|
this.ravenProcess = new RavenProcess(this);
|
||||||
|
addPamProcess(ravenProcess);
|
||||||
|
PamSettingManager.getInstance().registerSettings(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RavenControl(PamConfiguration pamConfiguration, String unitType, String unitName) {
|
||||||
|
super(pamConfiguration, unitType, unitName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JMenuItem createDetectionMenu(Frame parentFrame) {
|
||||||
|
JMenuItem menuItem = new JMenuItem("Import Raven data ...");
|
||||||
|
menuItem.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
importData(parentFrame);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return menuItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void importData(Frame parentFrame) {
|
||||||
|
RavenParameters newParams = RavenImportDialog.showDialog(parentFrame, ravenParameters);
|
||||||
|
if (newParams == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ravenParameters = newParams;
|
||||||
|
// import the data. 1. Check for existing and delete, 2. Import, 3. rebuild datamap, 4. load data
|
||||||
|
RavenFileReader fileReader = null;
|
||||||
|
ArrayList<RavenDataRow> ravenData = null;
|
||||||
|
try {
|
||||||
|
fileReader = new RavenFileReader(this, ravenParameters.importFile);
|
||||||
|
ravenData = fileReader.readTable();
|
||||||
|
|
||||||
|
fileReader.closeFile();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ravenData != null) {
|
||||||
|
ravenProcess.createPAMGuardData(fileReader, ravenData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Serializable getSettingsReference() {
|
||||||
|
return ravenParameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getSettingsVersion() {
|
||||||
|
return RavenParameters.serialVersionUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
|
||||||
|
ravenParameters = (RavenParameters) pamControlledUnitSettings.getSettings();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
16
src/ravendata/RavenDataBlock.java
Normal file
16
src/ravendata/RavenDataBlock.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package ravendata;
|
||||||
|
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamProcess;
|
||||||
|
|
||||||
|
public class RavenDataBlock extends PamDataBlock<RavenDataUnit> {
|
||||||
|
|
||||||
|
private RavenProcess ravenProcess;
|
||||||
|
|
||||||
|
public RavenDataBlock(RavenProcess parentProcess, int channelMap) {
|
||||||
|
super(RavenDataUnit.class, "Selection", parentProcess, channelMap);
|
||||||
|
this.ravenProcess = parentProcess;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
159
src/ravendata/RavenDataRow.java
Normal file
159
src/ravendata/RavenDataRow.java
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
package ravendata;
|
||||||
|
|
||||||
|
public class RavenDataRow {
|
||||||
|
|
||||||
|
private int iRow;
|
||||||
|
private String[] data;
|
||||||
|
private Integer selection;
|
||||||
|
private String view;
|
||||||
|
private Integer channel;
|
||||||
|
private double beginT;
|
||||||
|
private double endT;
|
||||||
|
private double f1;
|
||||||
|
private double f2;
|
||||||
|
private int[] dataIndexes;
|
||||||
|
private boolean unpackOK;
|
||||||
|
|
||||||
|
// data on a row of raven data from a table.
|
||||||
|
public RavenDataRow(int iRow, String[] data, int[] dataIndexes) {
|
||||||
|
this.iRow = iRow;
|
||||||
|
this.data = data;
|
||||||
|
this.dataIndexes = dataIndexes;
|
||||||
|
unpackOK = unpackRow(dataIndexes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the iRow
|
||||||
|
*/
|
||||||
|
protected int getiRow() {
|
||||||
|
return iRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the data
|
||||||
|
*/
|
||||||
|
protected String[] getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a String value from the given column.
|
||||||
|
* @param iCol
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getString(int iCol) {
|
||||||
|
return data[iCol];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read an Integer value from the given column.
|
||||||
|
* @param iCol
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Integer getInteger(int iCol) {
|
||||||
|
try {
|
||||||
|
return Integer.valueOf(data[iCol]);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Read a double value from the given column.
|
||||||
|
* @param iCol
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Double getDouble(int iCol) {
|
||||||
|
try {
|
||||||
|
return Double.valueOf(data[iCol]);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unpack the row into more useful columns using the column indexes.
|
||||||
|
* @param mainIndexes
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean unpackRow(int[] mainIndexes) {
|
||||||
|
try {
|
||||||
|
selection = getInteger(mainIndexes[0]);
|
||||||
|
view = getString(mainIndexes[1]);
|
||||||
|
channel = getInteger(mainIndexes[2]);
|
||||||
|
beginT = getDouble(mainIndexes[3]);
|
||||||
|
endT = getDouble(mainIndexes[4]);
|
||||||
|
f1 = getDouble(mainIndexes[5]);
|
||||||
|
f2 = getDouble(mainIndexes[6]);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the selection
|
||||||
|
*/
|
||||||
|
protected Integer getSelection() {
|
||||||
|
return selection;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the view
|
||||||
|
*/
|
||||||
|
protected String getView() {
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the channel
|
||||||
|
*/
|
||||||
|
protected Integer getChannel() {
|
||||||
|
return channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the beginT
|
||||||
|
*/
|
||||||
|
protected double getBeginT() {
|
||||||
|
return beginT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the endT
|
||||||
|
*/
|
||||||
|
protected double getEndT() {
|
||||||
|
return endT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the f1
|
||||||
|
*/
|
||||||
|
protected double getF1() {
|
||||||
|
return f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the f2
|
||||||
|
*/
|
||||||
|
protected double getF2() {
|
||||||
|
return f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the dataIndexes
|
||||||
|
*/
|
||||||
|
protected int[] getDataIndexes() {
|
||||||
|
return dataIndexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the unpackOK
|
||||||
|
*/
|
||||||
|
protected boolean isUnpackOK() {
|
||||||
|
return unpackOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
20
src/ravendata/RavenDataUnit.java
Normal file
20
src/ravendata/RavenDataUnit.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package ravendata;
|
||||||
|
|
||||||
|
import PamDetection.PamDetection;
|
||||||
|
import PamguardMVC.AcousticDataUnit;
|
||||||
|
import PamguardMVC.DataUnitBaseData;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
|
||||||
|
public class RavenDataUnit extends PamDataUnit implements AcousticDataUnit, PamDetection {
|
||||||
|
|
||||||
|
public RavenDataUnit(long timeMilliseconds, int channelMap, long durationMillis, double f1, double f2) {
|
||||||
|
super(timeMilliseconds);
|
||||||
|
setChannelBitmap(channelMap);
|
||||||
|
setDurationInMilliseconds(durationMillis);
|
||||||
|
double[] freq = {f1, f2};
|
||||||
|
setFrequency(freq);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
101
src/ravendata/RavenFileReader.java
Normal file
101
src/ravendata/RavenFileReader.java
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
package ravendata;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class RavenFileReader {
|
||||||
|
|
||||||
|
private RavenControl ravenControl;
|
||||||
|
private File ravenFile;
|
||||||
|
private ArrayList<String> columnNames;
|
||||||
|
private BufferedReader fileReader;
|
||||||
|
|
||||||
|
private static String[] standardColumns = {"Selection", "View", "Channel", "Begin Time (s)", "End Time (s)", "Low Freq (Hz)", "High Freq (Hz)"};
|
||||||
|
// private static String[] otherColumns = {"Selection", "View", "Channel", "Begin Time (s)", "End Time (s)", "end", "Low Freq (Hz)", "High Freq (Hz)",
|
||||||
|
// "Begin File", "Delta Time (s)", "File Offset (s)", "Occupancy", "Manual Review", "Notes", "SongNumber"};
|
||||||
|
/*
|
||||||
|
* Sometimes some names appear in different places. Bugger.
|
||||||
|
* so need to find the index of each of the main columns we want.
|
||||||
|
*/
|
||||||
|
private int[] mainIndexes;
|
||||||
|
private int columnErrors;
|
||||||
|
|
||||||
|
|
||||||
|
public RavenFileReader(RavenControl ravenControl, String ravenFile) throws IOException {
|
||||||
|
this.ravenControl = ravenControl;
|
||||||
|
this.ravenFile = new File(ravenFile);
|
||||||
|
openFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void closeFile() throws IOException {
|
||||||
|
if (fileReader != null) {
|
||||||
|
fileReader.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* open the file, read the file header and get a list of column names.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
private void openFile() throws IOException {
|
||||||
|
fileReader = new BufferedReader(new FileReader(ravenFile));
|
||||||
|
String firstLine = fileReader.readLine();
|
||||||
|
if (firstLine == null) {
|
||||||
|
throw new IOException("Empty file");
|
||||||
|
}
|
||||||
|
String[] cols = firstLine.split("\t");
|
||||||
|
columnNames = new ArrayList<>();
|
||||||
|
for (int i = 0; i < cols.length; i++) {
|
||||||
|
columnNames.add(cols[i]);
|
||||||
|
}
|
||||||
|
checkColumnNames();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<RavenDataRow> readTable() throws IOException {
|
||||||
|
ArrayList<RavenDataRow> allData = new ArrayList();
|
||||||
|
int iRow = 0;
|
||||||
|
while(true) {
|
||||||
|
String aLine = fileReader.readLine();
|
||||||
|
if (aLine == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
String[] split = aLine.split("\t");
|
||||||
|
RavenDataRow aRow = new RavenDataRow(iRow++, split, mainIndexes);
|
||||||
|
allData.add(aRow);
|
||||||
|
}
|
||||||
|
return allData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check we have the correct standard columns.
|
||||||
|
*/
|
||||||
|
private int checkColumnNames() {
|
||||||
|
mainIndexes = new int[standardColumns.length];
|
||||||
|
columnErrors = 0;
|
||||||
|
for (int i = 0; i < standardColumns.length; i++) {
|
||||||
|
mainIndexes[i] = columnNames.indexOf(standardColumns[i]);
|
||||||
|
if (mainIndexes[i] < 0) {
|
||||||
|
System.out.printf("Raven error: Unable to find column \"%s\" in data table\n", standardColumns[i]);
|
||||||
|
columnErrors++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return columnErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean exists() {
|
||||||
|
return ravenFile.exists();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get a count of column errors.
|
||||||
|
* @return the columnErrors
|
||||||
|
*/
|
||||||
|
protected int getColumnErrors() {
|
||||||
|
return columnErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
30
src/ravendata/RavenLogging.java
Normal file
30
src/ravendata/RavenLogging.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package ravendata;
|
||||||
|
|
||||||
|
import PamDetection.AcousticSQLLogging;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import generalDatabase.PamTableItem;
|
||||||
|
import generalDatabase.SQLLogging;
|
||||||
|
import generalDatabase.SQLTypes;
|
||||||
|
|
||||||
|
public class RavenLogging extends AcousticSQLLogging {
|
||||||
|
|
||||||
|
private RavenDataBlock ravenDataBlock;
|
||||||
|
private RavenControl ravenControl;
|
||||||
|
|
||||||
|
private PamTableItem f1;
|
||||||
|
|
||||||
|
public RavenLogging(RavenControl ravenControl, RavenDataBlock pamDataBlock) {
|
||||||
|
super(pamDataBlock, ravenControl.getUnitName());
|
||||||
|
this.ravenControl = ravenControl;
|
||||||
|
this.ravenDataBlock = pamDataBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected PamDataUnit createDataUnit(SQLTypes sqlTypes, long timeMilliseconds, int chanMap, long duration,
|
||||||
|
double[] f) {
|
||||||
|
return new RavenDataUnit(timeMilliseconds, chanMap, duration, f[0], f[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
10
src/ravendata/RavenParameters.java
Normal file
10
src/ravendata/RavenParameters.java
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package ravendata;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class RavenParameters implements Serializable, Cloneable {
|
||||||
|
|
||||||
|
public static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public String importFile;
|
||||||
|
}
|
130
src/ravendata/RavenProcess.java
Normal file
130
src/ravendata/RavenProcess.java
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
package ravendata;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import Acquisition.AcquisitionControl;
|
||||||
|
import PamController.InputStoreInfo;
|
||||||
|
import PamController.PamController;
|
||||||
|
import PamView.PamSymbolType;
|
||||||
|
import PamView.dialog.warn.WarnOnce;
|
||||||
|
import PamView.symbol.StandardSymbolManager;
|
||||||
|
import PamView.symbol.SymbolData;
|
||||||
|
import PamguardMVC.PamProcess;
|
||||||
|
import dataMap.OfflineDataMap;
|
||||||
|
import generalDatabase.DBControlUnit;
|
||||||
|
import ravendata.swing.RavenGraphics;
|
||||||
|
|
||||||
|
public class RavenProcess extends PamProcess {
|
||||||
|
|
||||||
|
private RavenControl ravenControl;
|
||||||
|
|
||||||
|
private RavenDataBlock ravenDataBlock;
|
||||||
|
|
||||||
|
private RavenLogging ravenLogging;
|
||||||
|
|
||||||
|
private static SymbolData standardSymbol = new SymbolData(PamSymbolType.SYMBOL_SQUARE, 20, 20, false, Color.white, Color.red);
|
||||||
|
|
||||||
|
public RavenProcess(RavenControl pamControlledUnit) {
|
||||||
|
super(pamControlledUnit, null);
|
||||||
|
this.ravenControl = pamControlledUnit;
|
||||||
|
ravenDataBlock = new RavenDataBlock(this, 0);
|
||||||
|
addOutputDataBlock(ravenDataBlock);
|
||||||
|
ravenLogging = new RavenLogging(pamControlledUnit, ravenDataBlock);
|
||||||
|
ravenDataBlock.SetLogging(ravenLogging);
|
||||||
|
ravenDataBlock.setOverlayDraw(new RavenGraphics(ravenDataBlock));
|
||||||
|
ravenDataBlock.setPamSymbolManager(new StandardSymbolManager(ravenDataBlock, standardSymbol));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pamStart() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pamStop() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
protected void createPAMGuardData(RavenFileReader fileReader, ArrayList<RavenDataRow> ravenData) {
|
||||||
|
/**
|
||||||
|
* Need to find the acquisition module and then get detailed times of every file, not just
|
||||||
|
* the datamap, which is currently just a normal databsae map of the db entries, so it not
|
||||||
|
* necessarily precise on the starts / ends of files for the viewer.
|
||||||
|
*/
|
||||||
|
AcquisitionControl daqControl = (AcquisitionControl) PamController.getInstance().findControlledUnit(AcquisitionControl.class, null);
|
||||||
|
if (daqControl == null) {
|
||||||
|
WarnOnce.showWarning("No acquisition module", "Can only import ROCCA data if there is a Sound Acquisition Module",
|
||||||
|
WarnOnce.WARNING_MESSAGE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// need to get the detailed data map.
|
||||||
|
InputStoreInfo daqInfo = daqControl.getStoreInfo(true);
|
||||||
|
if (daqInfo == null || daqInfo.getAllFileEnds() == null || daqInfo.getAllFileEnds().length == 0) {
|
||||||
|
WarnOnce.showWarning("No sound file info module", "Can only import ROCCA data if sound files arre present to extract absolute times",
|
||||||
|
WarnOnce.WARNING_MESSAGE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// need these to look for gaps to convert ROCCA time to abs time.
|
||||||
|
long[] fileStarts = daqInfo.getFileStartTimes();
|
||||||
|
long[] fileEnds = daqInfo.getAllFileEnds();
|
||||||
|
// make an array of absolute times to match to ROCCA data.
|
||||||
|
// these are the end times of each file (start of first file is known to be 0).
|
||||||
|
long[] absTime = new long[fileStarts.length+1]; // one longer to capture end of last file.
|
||||||
|
for (int i = 0; i < fileStarts.length; i++) {
|
||||||
|
absTime[i+1] = absTime[i] + fileEnds[i]-fileStarts[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete all existing data from database.
|
||||||
|
ravenDataBlock.clearAll();
|
||||||
|
ravenLogging.deleteData(0, System.currentTimeMillis()*2);
|
||||||
|
|
||||||
|
for (RavenDataRow ravenRow : ravenData) {
|
||||||
|
int fileInd = getTimeIndex(ravenRow.getBeginT()*1000, absTime);
|
||||||
|
if (fileInd == absTime.length) {
|
||||||
|
String msg = String.format("Data at time %6.4f is beyond the end of available sound file data", ravenRow.getBeginT());
|
||||||
|
WarnOnce.showWarning("Error importing RAVEN data", msg, WarnOnce.WARNING_MESSAGE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
long fileStart = fileStarts[fileInd];
|
||||||
|
long absStart = fileStart + (long) (ravenRow.getBeginT()*1000.)-absTime[fileInd];
|
||||||
|
long duration = (long) ((ravenRow.getEndT()-ravenRow.getBeginT())*1000.);
|
||||||
|
int chanMap = 1<<(ravenRow.getChannel()-1);
|
||||||
|
RavenDataUnit rdu = new RavenDataUnit(absStart, chanMap, duration, ravenRow.getF1(), ravenRow.getF2());
|
||||||
|
getRavenDataBlock().addPamData(rdu);
|
||||||
|
ravenLogging.logData(DBControlUnit.findConnection(), rdu);
|
||||||
|
}
|
||||||
|
|
||||||
|
OfflineDataMap dataMap = ravenDataBlock.getPrimaryDataMap();
|
||||||
|
// dataMap.c
|
||||||
|
DBControlUnit dbControl = DBControlUnit.findDatabaseControl();
|
||||||
|
if (dbControl != null) {
|
||||||
|
dbControl.createOfflineDataMap(ravenControl.getGuiFrame(), ravenControl);
|
||||||
|
}
|
||||||
|
|
||||||
|
dataMap = ravenDataBlock.getPrimaryDataMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find which file time bin the raven data are in
|
||||||
|
* @param ravenTime
|
||||||
|
* @param absTimes
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private int getTimeIndex(double ravenTime, long[] absTimes) {
|
||||||
|
int i = 0;
|
||||||
|
while (i < absTimes.length-1 && ravenTime > absTimes[i+1]) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the ravenDataBlock
|
||||||
|
*/
|
||||||
|
public RavenDataBlock getRavenDataBlock() {
|
||||||
|
return ravenDataBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
18
src/ravendata/swing/RavenGraphics.java
Normal file
18
src/ravendata/swing/RavenGraphics.java
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package ravendata.swing;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
|
||||||
|
import PamView.PamDetectionOverlayGraphics;
|
||||||
|
import PamView.PamSymbol;
|
||||||
|
import PamView.PamSymbolType;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
|
||||||
|
public class RavenGraphics extends PamDetectionOverlayGraphics {
|
||||||
|
|
||||||
|
public static final PamSymbol defaultSymbol = new PamSymbol(PamSymbolType.SYMBOL_SQUARE,12, 12, false, Color.white, Color.red);
|
||||||
|
|
||||||
|
public RavenGraphics(PamDataBlock parentDataBlock) {
|
||||||
|
super(parentDataBlock, defaultSymbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
111
src/ravendata/swing/RavenImportDialog.java
Normal file
111
src/ravendata/swing/RavenImportDialog.java
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
package ravendata.swing;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.GridBagConstraints;
|
||||||
|
import java.awt.GridBagLayout;
|
||||||
|
import java.awt.Window;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JFileChooser;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
import javax.swing.border.TitledBorder;
|
||||||
|
|
||||||
|
import PamUtils.PamFileChooser;
|
||||||
|
import PamUtils.PamFileFilter;
|
||||||
|
import PamView.dialog.PamDialog;
|
||||||
|
import PamView.dialog.PamGridBagContraints;
|
||||||
|
import PamView.panel.PamAlignmentPanel;
|
||||||
|
import ravendata.RavenParameters;
|
||||||
|
|
||||||
|
public class RavenImportDialog extends PamDialog {
|
||||||
|
|
||||||
|
private static RavenImportDialog singleInstance;
|
||||||
|
private RavenParameters ravenParameters;
|
||||||
|
|
||||||
|
private JTextField ravenFile;
|
||||||
|
|
||||||
|
private JButton chooseButton;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private RavenImportDialog(Window parentFrame) {
|
||||||
|
super(parentFrame, "Import Raven Data", false);
|
||||||
|
JPanel mainPanel = new JPanel(new GridBagLayout());
|
||||||
|
mainPanel.setBorder(new TitledBorder("Choose Raven selection table"));
|
||||||
|
GridBagConstraints c = new PamGridBagContraints();
|
||||||
|
ravenFile = new JTextField(80);
|
||||||
|
ravenFile.setEditable(false);
|
||||||
|
chooseButton = new JButton("Select ...");
|
||||||
|
c.gridwidth = 2;
|
||||||
|
mainPanel.add(ravenFile, c);
|
||||||
|
c.gridy++;
|
||||||
|
mainPanel.add(new PamAlignmentPanel(chooseButton, BorderLayout.EAST), c);
|
||||||
|
|
||||||
|
chooseButton.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
chooseFile(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
setDialogComponent(mainPanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void chooseFile(ActionEvent e) {
|
||||||
|
PamFileFilter fileFilter = new PamFileFilter("Raven files", ".txt");
|
||||||
|
// fileFilter.
|
||||||
|
PamFileChooser chooser = new PamFileChooser(ravenParameters.importFile);
|
||||||
|
chooser.setFileFilter(fileFilter);
|
||||||
|
int ans = chooser.showDialog(this, "Select ...");
|
||||||
|
if (ans == JFileChooser.APPROVE_OPTION) {
|
||||||
|
File f = chooser.getSelectedFile();
|
||||||
|
if (f != null) {
|
||||||
|
ravenFile.setText(f.getAbsolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RavenParameters showDialog(Window parentFrame, RavenParameters ravenParameters) {
|
||||||
|
// if (singleInstance == null) {
|
||||||
|
singleInstance = new RavenImportDialog(parentFrame);
|
||||||
|
// }
|
||||||
|
singleInstance.setParams(ravenParameters);
|
||||||
|
singleInstance.setVisible(true);
|
||||||
|
return singleInstance.ravenParameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setParams(RavenParameters ravenParameters) {
|
||||||
|
this.ravenParameters = ravenParameters;
|
||||||
|
ravenFile.setText(ravenParameters.importFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getParams() {
|
||||||
|
String fn = ravenFile.getText();
|
||||||
|
if (fn == null) {
|
||||||
|
return showWarning("Error - No file selected");
|
||||||
|
}
|
||||||
|
File f = new File(fn);
|
||||||
|
if (f.exists() == false) {
|
||||||
|
String str = String.format("The file %s does not exist", fn);
|
||||||
|
return showWarning(str);
|
||||||
|
}
|
||||||
|
ravenParameters.importFile = fn;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cancelButtonPressed() {
|
||||||
|
this.ravenParameters = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void restoreDefaultSettings() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,6 +3,7 @@ package targetMotionOld;
|
|||||||
import java.awt.Frame;
|
import java.awt.Frame;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
|
import java.io.Serializable;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -17,12 +18,17 @@ import javax.swing.SwingWorker;
|
|||||||
|
|
||||||
import pamScrollSystem.AbstractScrollManager;
|
import pamScrollSystem.AbstractScrollManager;
|
||||||
import pamScrollSystem.ViewerScrollerManager;
|
import pamScrollSystem.ViewerScrollerManager;
|
||||||
|
import targetMotionModule.TargetMotionLocaliserProvider;
|
||||||
import targetMotionOld.algorithms.LeastSquaresNew;
|
import targetMotionOld.algorithms.LeastSquaresNew;
|
||||||
import targetMotionOld.algorithms.Simplex2DNew;
|
import targetMotionOld.algorithms.Simplex2DNew;
|
||||||
import targetMotionOld.algorithms.Simplex3DNew;
|
import targetMotionOld.algorithms.Simplex3DNew;
|
||||||
import targetMotionOld.dialog.TargetMotionDialog;
|
import targetMotionOld.dialog.TargetMotionDialog;
|
||||||
|
import targetMotionOld.tethys.TMALocalizationCreator;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
import GPS.GPSDataBlock;
|
import GPS.GPSDataBlock;
|
||||||
import GPS.GpsDataUnit;
|
import GPS.GpsDataUnit;
|
||||||
|
import Localiser.LocalisationAlgorithm;
|
||||||
|
import Localiser.LocalisationAlgorithmInfo;
|
||||||
import Localiser.algorithms.timeDelayLocalisers.bearingLoc.AbstractLocaliser;
|
import Localiser.algorithms.timeDelayLocalisers.bearingLoc.AbstractLocaliser;
|
||||||
import Localiser.detectionGroupLocaliser.DetectionGroupOptions;
|
import Localiser.detectionGroupLocaliser.DetectionGroupOptions;
|
||||||
import Localiser.detectionGroupLocaliser.GroupDetection;
|
import Localiser.detectionGroupLocaliser.GroupDetection;
|
||||||
@ -32,12 +38,14 @@ import PamController.PamControlledUnit;
|
|||||||
import PamController.PamController;
|
import PamController.PamController;
|
||||||
import PamController.PamControllerInterface;
|
import PamController.PamControllerInterface;
|
||||||
import PamDetection.AbstractLocalisation;
|
import PamDetection.AbstractLocalisation;
|
||||||
|
import PamDetection.LocContents;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
import PamguardMVC.PamDataUnit;
|
import PamguardMVC.PamDataUnit;
|
||||||
import PamguardMVC.PamObservable;
|
import PamguardMVC.PamObservable;
|
||||||
import PamguardMVC.PamObserver;
|
import PamguardMVC.PamObserver;
|
||||||
import PamguardMVC.PamObserverAdapter;
|
import PamguardMVC.PamObserverAdapter;
|
||||||
import PamguardMVC.debug.Debug;
|
import PamguardMVC.debug.Debug;
|
||||||
|
import bearinglocaliser.BearingLocaliserParams;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reinstated Target motion add-in as used by the click detector. Hope one day still to replace this
|
* Reinstated Target motion add-in as used by the click detector. Hope one day still to replace this
|
||||||
@ -46,7 +54,7 @@ import PamguardMVC.debug.Debug;
|
|||||||
*
|
*
|
||||||
* @param <T>
|
* @param <T>
|
||||||
*/
|
*/
|
||||||
public class TargetMotionLocaliser<T extends GroupDetection> extends AbstractLocaliser<T> {
|
public class TargetMotionLocaliser<T extends GroupDetection> extends AbstractLocaliser<T> implements LocalisationAlgorithm, LocalisationAlgorithmInfo {
|
||||||
|
|
||||||
public enum Interractive {START, SAVE, BACK, CANCEL, SETNULL, KEEPOLD};
|
public enum Interractive {START, SAVE, BACK, CANCEL, SETNULL, KEEPOLD};
|
||||||
// public enum WorkStatus {IDLE, LOADING, WAITING};
|
// public enum WorkStatus {IDLE, LOADING, WAITING};
|
||||||
@ -77,6 +85,7 @@ public class TargetMotionLocaliser<T extends GroupDetection> extends AbstractLoc
|
|||||||
public int currentEventIndex;
|
public int currentEventIndex;
|
||||||
// private T currentEvent;
|
// private T currentEvent;
|
||||||
//private WorkStatus workStatus;
|
//private WorkStatus workStatus;
|
||||||
|
private TMALocalizationCreator tmaLocalizationCreator;
|
||||||
|
|
||||||
public TargetMotionLocaliser(PamControlledUnit pamControlledUnit, PamDataBlock<T> dataBlock, PamDataBlock subDetectionBlock) {
|
public TargetMotionLocaliser(PamControlledUnit pamControlledUnit, PamDataBlock<T> dataBlock, PamDataBlock subDetectionBlock) {
|
||||||
super(dataBlock);
|
super(dataBlock);
|
||||||
@ -97,6 +106,11 @@ public class TargetMotionLocaliser<T extends GroupDetection> extends AbstractLoc
|
|||||||
return "Target Motion Localiser";
|
return "Target Motion Localiser";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalisationAlgorithmInfo getAlgorithmInfo() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean localiseDataUnit(T dataUnit) {
|
public boolean localiseDataUnit(T dataUnit) {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
@ -719,4 +733,30 @@ public class TargetMotionLocaliser<T extends GroupDetection> extends AbstractLoc
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getLocalisationContents() {
|
||||||
|
return LocContents.HAS_LATLONG | LocContents.HAS_AMBIGUITY | LocContents.HAS_DEPTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAlgorithmName() {
|
||||||
|
return "Target Motion Localiser";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalizationCreator getTethysCreator() {
|
||||||
|
if (tmaLocalizationCreator == null) {
|
||||||
|
tmaLocalizationCreator = new TMALocalizationCreator(this);
|
||||||
|
}
|
||||||
|
return tmaLocalizationCreator;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Serializable getParameters() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
// return new BearingLocaliserParams();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,8 +73,7 @@ public class LeastSquaresNew<T extends GroupDetection> extends AbstractTargetMot
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LocContents getLocContents() {
|
public LocContents getLocContents() {
|
||||||
// TODO Auto-generated method stub
|
return new LocContents(LocContents.HAS_LATLONG | LocContents.HAS_PERPENDICULARERRORS);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -61,8 +61,7 @@ public class Simplex2DNew<T extends GroupDetection> extends AbstractTargetMotion
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LocContents getLocContents() {
|
public LocContents getLocContents() {
|
||||||
// TODO Auto-generated method stub
|
return new LocContents(LocContents.HAS_LATLONG | LocContents.HAS_PERPENDICULARERRORS);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -35,8 +35,7 @@ public class Simplex3DNew<T extends GroupDetection> extends Simplex2DNew<T>{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LocContents getLocContents() {
|
public LocContents getLocContents() {
|
||||||
// TODO Auto-generated method stub
|
return new LocContents(LocContents.HAS_LATLONG | LocContents.HAS_DEPTH | LocContents.HAS_DEPTHERROR | LocContents.HAS_PERPENDICULARERRORS);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
181
src/targetMotionOld/tethys/TMALocalizationCreator.java
Normal file
181
src/targetMotionOld/tethys/TMALocalizationCreator.java
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
package targetMotionOld.tethys;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import Localiser.LocaliserModel;
|
||||||
|
import Localiser.algorithms.locErrors.EllipticalError;
|
||||||
|
import Localiser.algorithms.locErrors.LocaliserError;
|
||||||
|
import Localiser.detectionGroupLocaliser.GroupLocResult;
|
||||||
|
import Localiser.detectionGroupLocaliser.GroupLocalisation;
|
||||||
|
import PamDetection.AbstractLocalisation;
|
||||||
|
import PamDetection.LocContents;
|
||||||
|
import PamUtils.LatLong;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import nilus.AngularCoordinateType;
|
||||||
|
import nilus.LocalizationType;
|
||||||
|
import nilus.Localize;
|
||||||
|
import nilus.WGS84CoordinateType;
|
||||||
|
import nilus.LocalizationType.Angular;
|
||||||
|
import nilus.LocalizationType.Parameters;
|
||||||
|
import nilus.LocalizationType.WGS84;
|
||||||
|
import nilus.LocalizationType.Parameters.TargetMotionAnalysis;
|
||||||
|
import nilus.Localize.Effort;
|
||||||
|
import nilus.Localize.Effort.CoordinateReferenceSystem;
|
||||||
|
import pamMaths.PamVector;
|
||||||
|
import targetMotionOld.TargetMotionLocaliser;
|
||||||
|
import tethys.TethysTimeFuncs;
|
||||||
|
import tethys.localization.CoordinateName;
|
||||||
|
import tethys.localization.LocalizationBuilder;
|
||||||
|
import tethys.localization.LocalizationCreator;
|
||||||
|
import tethys.localization.LocalizationSubTypes;
|
||||||
|
import tethys.localization.LocalizationTypes;
|
||||||
|
import tethys.localization.ReferenceFrame;
|
||||||
|
import tethys.localization.TimeReference;
|
||||||
|
import tethys.pamdata.AutoTethysProvider;
|
||||||
|
|
||||||
|
public class TMALocalizationCreator implements LocalizationCreator {
|
||||||
|
|
||||||
|
|
||||||
|
int maxDimension = 2;
|
||||||
|
|
||||||
|
public TMALocalizationCreator(TargetMotionLocaliser targetMotionLocaliser) {
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean sortLocalisationCoordinates(LocalizationBuilder localizationBuilder, PamDataBlock dataBlock) {
|
||||||
|
Localize doc = localizationBuilder.getCurrentDocument();
|
||||||
|
Effort locEffort = doc.getEffort();
|
||||||
|
locEffort.setTimeReference(TimeReference.beam.toString());
|
||||||
|
|
||||||
|
List<String> locTypes = locEffort.getLocalizationType();
|
||||||
|
locTypes.add(LocalizationTypes.Point.toString());
|
||||||
|
locTypes.add(LocalizationTypes.PerpendicularRange.toString());
|
||||||
|
|
||||||
|
CoordinateReferenceSystem coordRefs = locEffort.getCoordinateReferenceSystem();
|
||||||
|
coordRefs.setName(CoordinateName.WGS84.toString());
|
||||||
|
coordRefs.setSubtype(LocalizationSubTypes.Geographic.toString());
|
||||||
|
|
||||||
|
locEffort.setDimension(2);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalizationType createLocalization(LocalizationBuilder localizationBuilder, PamDataUnit dataUnit) {
|
||||||
|
/*
|
||||||
|
* Add two types of localisation. A WGS84 and a perpendicular range.
|
||||||
|
*/
|
||||||
|
AbstractLocalisation pamLoc = dataUnit.getLocalisation();
|
||||||
|
LatLong latLong = pamLoc.getLatLong(0);
|
||||||
|
if (pamLoc instanceof GroupLocalisation == false || latLong == null) {
|
||||||
|
return localizationBuilder.createStandardLocalization(dataUnit);
|
||||||
|
}
|
||||||
|
LocalizationType loc = localizationBuilder.makeBaseLoc(dataUnit);
|
||||||
|
GroupLocalisation groupLoc = (GroupLocalisation) pamLoc;
|
||||||
|
GroupLocResult groupLocResult = groupLoc.getGroupLocaResult(0);
|
||||||
|
LocaliserModel tmaModel = groupLocResult.getModel();
|
||||||
|
boolean hasDepth = false;
|
||||||
|
LocContents locCont = new LocContents(LocContents.HAS_LATLONG);
|
||||||
|
if (tmaModel != null) {
|
||||||
|
locCont = tmaModel.getLocContents();
|
||||||
|
if (locCont.hasLocContent(LocContents.HAS_DEPTH)) {
|
||||||
|
hasDepth = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int nDim = hasDepth ? 3 : 2;
|
||||||
|
maxDimension = Math.max(maxDimension, nDim);
|
||||||
|
/**
|
||||||
|
* Export the latlong data.
|
||||||
|
*/
|
||||||
|
WGS84 wgs84 = new WGS84();
|
||||||
|
WGS84CoordinateType coord = new WGS84CoordinateType();
|
||||||
|
wgs84.setCoordinate(coord);
|
||||||
|
coord.setLongitude(latLong.getLongitude());
|
||||||
|
coord.setLatitude(latLong.getLatitude());
|
||||||
|
if (hasDepth) {
|
||||||
|
coord.setElevationM(AutoTethysProvider.roundDecimalPlaces(latLong.getHeight(),3));
|
||||||
|
}
|
||||||
|
PamVector errors = groupLocResult.getErrorVector();
|
||||||
|
LocaliserError genError = groupLocResult.getLocError();
|
||||||
|
WGS84CoordinateType wgsErr = null;
|
||||||
|
double[] errorVec = null;
|
||||||
|
if (errors != null) {
|
||||||
|
errorVec = errors.getVector();
|
||||||
|
}
|
||||||
|
else if (genError instanceof EllipticalError) {
|
||||||
|
EllipticalError elliptical = (EllipticalError) genError;
|
||||||
|
PamVector dir = genError.getErrorDirection();
|
||||||
|
// these are errors perpendicular and parallel to the track
|
||||||
|
// so aren't really lat long errors.
|
||||||
|
errorVec = elliptical.getEllipseDim();
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Needs a bit of work to get errors in correct direction (needs import
|
||||||
|
* of track data for this value ?) and conversion to latlong units.
|
||||||
|
*/
|
||||||
|
// if (errorVec != null && errorVec.length >= 2) {
|
||||||
|
// wgsErr = new WGS84CoordinateType();
|
||||||
|
// wgsErr.setLongitude(errorVec[0]);
|
||||||
|
// wgsErr.setLatitude(errorVec[1]);
|
||||||
|
// if (hasDepth && errorVec.length >= 3) {
|
||||||
|
// wgsErr.setElevationM(errorVec[2]);
|
||||||
|
// }
|
||||||
|
// wgs84.setCoordinateError(wgsErr);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
loc.setWGS84(wgs84);
|
||||||
|
|
||||||
|
// set the TMA information
|
||||||
|
Parameters params = loc.getParameters();
|
||||||
|
if (params == null) {
|
||||||
|
params = new Parameters();
|
||||||
|
loc.setParameters(params);
|
||||||
|
}
|
||||||
|
TargetMotionAnalysis tma = new TargetMotionAnalysis();
|
||||||
|
tma.setStart(TethysTimeFuncs.xmlGregCalFromMillis(dataUnit.getTimeMilliseconds()));
|
||||||
|
tma.setEnd(TethysTimeFuncs.xmlGregCalFromMillis(dataUnit.getEndTimeInMilliseconds()));
|
||||||
|
params.setTargetMotionAnalysis(tma);
|
||||||
|
Long timeAbeam = groupLocResult.getBeamTime();
|
||||||
|
if (timeAbeam != null) {
|
||||||
|
loc.setTimeStamp(TethysTimeFuncs.xmlGregCalFromMillis(timeAbeam));
|
||||||
|
}
|
||||||
|
|
||||||
|
// now also output a perpendicular distance.
|
||||||
|
Double perp = groupLocResult.getPerpendicularDistance();
|
||||||
|
if (perp != null) {
|
||||||
|
loc.setPerpendicularRangeM(perp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// con only output one type.
|
||||||
|
// if (perp != null) {
|
||||||
|
// AngularCoordinateType acType = new AngularCoordinateType();
|
||||||
|
// acType.setAngle1(90);
|
||||||
|
// acType.setDistanceM(AutoTethysProvider.roundDecimalPlaces(perp,1));
|
||||||
|
// Angular angular = new Angular();
|
||||||
|
// angular.setCoordinate(acType);
|
||||||
|
// if (errors != null) {
|
||||||
|
// AngularCoordinateType angErr = new AngularCoordinateType();
|
||||||
|
// angErr.setDistanceM(errors.norm());
|
||||||
|
// angular.setCoordinateError(angErr);
|
||||||
|
// }
|
||||||
|
// loc.setAngular(angular);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkDocument(LocalizationBuilder localizationBuilder) {
|
||||||
|
boolean ok = localizationBuilder.checkDocument();
|
||||||
|
Effort locEffort = localizationBuilder.getCurrentDocument().getEffort();
|
||||||
|
locEffort.setDimension(maxDimension);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,19 @@
|
|||||||
package tethys;
|
package tethys;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import PamController.PamControlledUnit;
|
||||||
|
import PamController.PamguardVersionInfo;
|
||||||
|
import PamModel.PamPluginInterface;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamProcess;
|
||||||
|
import nilus.Deployment;
|
||||||
|
import nilus.DetectionEffort;
|
||||||
|
import nilus.DetectionEffortKind;
|
||||||
|
import tethys.niluswraps.PDeployment;
|
||||||
|
import tethys.output.StreamExportParams;
|
||||||
|
import tethys.pamdata.TethysDataProvider;
|
||||||
|
|
||||||
abstract public class CollectionHandler {
|
abstract public class CollectionHandler {
|
||||||
|
|
||||||
private Collection collection;
|
private Collection collection;
|
||||||
@ -35,4 +49,93 @@ abstract public class CollectionHandler {
|
|||||||
|
|
||||||
public abstract String getHelpPoint();
|
public abstract String getHelpPoint();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the Detection Effort part of a Detections document
|
||||||
|
* @param pDeployment
|
||||||
|
* @param dataBlock
|
||||||
|
* @param exportParams
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public DetectionEffort getDetectorEffort(PDeployment pDeployment, PamDataBlock dataBlock, StreamExportParams exportParams) {
|
||||||
|
DetectionEffort effort = new DetectionEffort();
|
||||||
|
Deployment deployment = pDeployment.nilusObject;
|
||||||
|
Long effortStart = pDeployment.getAudioStart();
|
||||||
|
Long effortEnd = pDeployment.getAudioEnd();
|
||||||
|
effort.setStart(TethysTimeFuncs.xmlGregCalFromMillis(effortStart));
|
||||||
|
effort.setEnd(TethysTimeFuncs.xmlGregCalFromMillis(effortEnd));
|
||||||
|
// effort.set // no setter for DetectionEffortKind
|
||||||
|
List<DetectionEffortKind> effortKinds = effort.getKind();
|
||||||
|
|
||||||
|
TethysDataProvider dataProvider = dataBlock.getTethysDataProvider(tethysControl);
|
||||||
|
dataProvider.getEffortKinds(pDeployment, effortKinds, exportParams);
|
||||||
|
|
||||||
|
|
||||||
|
return effort;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method string for Detections Algorithm documents.
|
||||||
|
* @param dataBlock
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getMethodString(PamDataBlock dataBlock) {
|
||||||
|
if (dataBlock == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
PamProcess process = dataBlock.getParentProcess();
|
||||||
|
return "PAMGuard " + process.getProcessName();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Software string for Detections Algorithm documents.
|
||||||
|
* @param dataBlock
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getSoftwareString(PamDataBlock dataBlock) {
|
||||||
|
if (dataBlock == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return dataBlock.getLongDataName();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Software string for Detections Algorithm documents.
|
||||||
|
* @param dataBlock
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getVersionString(PamDataBlock dataBlock) {
|
||||||
|
if (dataBlock == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
PamProcess process = dataBlock.getParentProcess();
|
||||||
|
PamControlledUnit pcu = process.getPamControlledUnit();
|
||||||
|
PamPluginInterface plugin = pcu.getPlugin();
|
||||||
|
if (plugin == null) {
|
||||||
|
return PamguardVersionInfo.version;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return plugin.getVersion();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param dataBlock
|
||||||
|
* @return default value is PAMGuard
|
||||||
|
*/
|
||||||
|
public String getSupportSoftware(PamDataBlock dataBlock) {
|
||||||
|
return "PAMGuard";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param dataBlock
|
||||||
|
* @return PAMGuard version
|
||||||
|
*/
|
||||||
|
public String getSupportSoftwareVersion(PamDataBlock dataBlock) {
|
||||||
|
// should try to dig into the binary store and get the version from there.
|
||||||
|
return PamguardVersionInfo.version;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -622,13 +622,15 @@ public class DBXMLQueries {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the names of all detection documents for a given deployment for all data streams.
|
* Get the names of all the detection or localisation documents for a given deployment id.
|
||||||
* @param deploymentId
|
* @param collection Localizations or Detetections
|
||||||
|
* @param deploymentId Deployment document id.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public ArrayList<String> getDetectionsDocuments(String deploymentId) {
|
public ArrayList<String> getDeploymentDocuments(Collection collection, String deploymentId) {
|
||||||
String queryBase = "{\"species\":{\"query\":{\"op\":\"lib:abbrev2tsn\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]},\"return\":{\"op\":\"lib:tsn2abbrev\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]}},\"return\":[\"Detections/Id\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Detections/DataSource/DeploymentId\",\"SomeDeploymentId\"],\"optype\":\"binary\"}],\"enclose\":1}";
|
String queryBase = "{\"species\":{\"query\":{\"op\":\"lib:abbrev2tsn\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]},\"return\":{\"op\":\"lib:tsn2abbrev\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]}},\"return\":[\"collectionname/Id\"],\"select\":[{\"op\":\"=\",\"operands\":[\"collectionname/DataSource/DeploymentId\",\"SomeDeploymentId\"],\"optype\":\"binary\"}],\"enclose\":1}";
|
||||||
String queryStr = queryBase.replace("SomeDeploymentId", deploymentId);
|
String queryStr = queryBase.replace("SomeDeploymentId", deploymentId);
|
||||||
|
queryStr = queryStr.replace("collectionname", collection.documentName());
|
||||||
DBQueryResult queryResult = null;
|
DBQueryResult queryResult = null;
|
||||||
try {
|
try {
|
||||||
queryResult = executeQuery(queryStr);
|
queryResult = executeQuery(queryStr);
|
||||||
@ -660,6 +662,86 @@ public class DBXMLQueries {
|
|||||||
return detectionDocs;
|
return detectionDocs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the names of all detection documents for a given deployment for all data streams.
|
||||||
|
* @param deploymentId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public ArrayList<String> getDetectionsDocuments(String deploymentId) {
|
||||||
|
return getDeploymentDocuments(Collection.Detections, deploymentId);
|
||||||
|
// String queryBase = "{\"species\":{\"query\":{\"op\":\"lib:abbrev2tsn\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]},\"return\":{\"op\":\"lib:tsn2abbrev\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]}},\"return\":[\"Detections/Id\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Detections/DataSource/DeploymentId\",\"SomeDeploymentId\"],\"optype\":\"binary\"}],\"enclose\":1}";
|
||||||
|
// String queryStr = queryBase.replace("SomeDeploymentId", deploymentId);
|
||||||
|
// DBQueryResult queryResult = null;
|
||||||
|
// try {
|
||||||
|
// queryResult = executeQuery(queryStr);
|
||||||
|
// } catch (TethysQueryException e) {
|
||||||
|
// // TODO Auto-generated catch block
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
// if (queryResult == null || queryResult.queryException != null) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // PamguardXMLWriter pamXMLWriter = PamguardXMLWriter.getXMLWriter();
|
||||||
|
//
|
||||||
|
// Document doc = convertStringToXMLDocument(queryResult.queryResult);
|
||||||
|
// if (doc == null) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// ArrayList<String> detectionDocs = new ArrayList<>();
|
||||||
|
//
|
||||||
|
// NodeList returns = doc.getElementsByTagName("Record");
|
||||||
|
// if (returns.getLength() == 0) {
|
||||||
|
// returns = doc.getElementsByTagName("Record");
|
||||||
|
// }
|
||||||
|
// for (int i = 0; i < returns.getLength(); i++) {
|
||||||
|
// Node aNode = returns.item(i);
|
||||||
|
// detectionDocs.add(aNode.getTextContent());
|
||||||
|
// }
|
||||||
|
// return detectionDocs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the names of all localisation documents for a given deployment for all data streams.
|
||||||
|
* @param deploymentId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public ArrayList<String> getLocalizationsDocuments(String deploymentId) {
|
||||||
|
return getDeploymentDocuments(Collection.Localizations, deploymentId);
|
||||||
|
// String queryBase = "{\"species\":{\"query\":{\"op\":\"lib:abbrev2tsn\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]},\"return\":{\"op\":\"lib:tsn2abbrev\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]}},\"return\":[\"Localize/Id\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Localize/DataSource/DeploymentId\",\"SomeDeploymentId\"],\"optype\":\"binary\"}],\"enclose\":1}";
|
||||||
|
// String queryStr = queryBase.replace("SomeDeploymentId", deploymentId);
|
||||||
|
// DBQueryResult queryResult = null;
|
||||||
|
// try {
|
||||||
|
// queryResult = executeQuery(queryStr);
|
||||||
|
// } catch (TethysQueryException e) {
|
||||||
|
// // TODO Auto-generated catch block
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
// if (queryResult == null || queryResult.queryException != null) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // PamguardXMLWriter pamXMLWriter = PamguardXMLWriter.getXMLWriter();
|
||||||
|
//
|
||||||
|
// Document doc = convertStringToXMLDocument(queryResult.queryResult);
|
||||||
|
// if (doc == null) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// ArrayList<String> detectionDocs = new ArrayList<>();
|
||||||
|
//
|
||||||
|
// NodeList returns = doc.getElementsByTagName("Record");
|
||||||
|
// if (returns.getLength() == 0) {
|
||||||
|
// returns = doc.getElementsByTagName("Record");
|
||||||
|
// }
|
||||||
|
// for (int i = 0; i < returns.getLength(); i++) {
|
||||||
|
// Node aNode = returns.item(i);
|
||||||
|
// detectionDocs.add(aNode.getTextContent());
|
||||||
|
// }
|
||||||
|
// return detectionDocs;
|
||||||
|
}
|
||||||
|
|
||||||
public int countData(PamDataBlock dataBlock, String deploymentId) {
|
public int countData(PamDataBlock dataBlock, String deploymentId) {
|
||||||
// /**
|
// /**
|
||||||
// * first query for Detections documents associated with this deployment and datablock.
|
// * first query for Detections documents associated with this deployment and datablock.
|
||||||
|
@ -60,7 +60,8 @@ import nilus.Deployment.Data;
|
|||||||
import nilus.Deployment.Data.Tracks;
|
import nilus.Deployment.Data.Tracks;
|
||||||
import nilus.Deployment.Data.Tracks.Track;
|
import nilus.Deployment.Data.Tracks.Track;
|
||||||
import nilus.Deployment.Data.Tracks.Track.Point;
|
import nilus.Deployment.Data.Tracks.Track.Point;
|
||||||
import nilus.Deployment.Data.Tracks.Track.Point.BearingDegN;
|
import nilus.Deployment.Data.Tracks.Track.Point.CourseOverGroundDegN;
|
||||||
|
import nilus.Deployment.Data.Tracks.Track.Point.HeadingDegN;
|
||||||
import nilus.Deployment.Instrument;
|
import nilus.Deployment.Instrument;
|
||||||
import nilus.Deployment.SamplingDetails;
|
import nilus.Deployment.SamplingDetails;
|
||||||
import nilus.Deployment.Sensors;
|
import nilus.Deployment.Sensors;
|
||||||
@ -890,6 +891,7 @@ public class DeploymentHandler extends CollectionHandler implements TethysStateO
|
|||||||
tracks = new Tracks();
|
tracks = new Tracks();
|
||||||
deployment.getData().setTracks(tracks);
|
deployment.getData().setTracks(tracks);
|
||||||
}
|
}
|
||||||
|
tracks.setSpeedUnit("kn");
|
||||||
List<Track> trackList = tracks.getTrack(); // lists are usually there.
|
List<Track> trackList = tracks.getTrack(); // lists are usually there.
|
||||||
|
|
||||||
Track aTrack = new Track();
|
Track aTrack = new Track();
|
||||||
@ -909,13 +911,32 @@ public class DeploymentHandler extends CollectionHandler implements TethysStateO
|
|||||||
gpsPoint.setTimeStamp(TethysTimeFuncs.xmlGregCalFromMillis(gpsDataUnit.getTimeMilliseconds()));
|
gpsPoint.setTimeStamp(TethysTimeFuncs.xmlGregCalFromMillis(gpsDataUnit.getTimeMilliseconds()));
|
||||||
gpsPoint.setLatitude(gpsData.getLatitude());
|
gpsPoint.setLatitude(gpsData.getLatitude());
|
||||||
gpsPoint.setLongitude(PamUtils.constrainedAngle(gpsData.getLongitude()));
|
gpsPoint.setLongitude(PamUtils.constrainedAngle(gpsData.getLongitude()));
|
||||||
BearingDegN bdn = gpsPoint.getBearingDegN();
|
CourseOverGroundDegN cog = gpsPoint.getCourseOverGroundDegN();
|
||||||
if (bdn == null) {
|
if (cog == null) {
|
||||||
bdn = new BearingDegN();
|
cog = new CourseOverGroundDegN();
|
||||||
gpsPoint.setBearingDegN(bdn);
|
gpsPoint.setCourseOverGroundDegN(cog);
|
||||||
}
|
}
|
||||||
bdn.setValue(AutoTethysProvider.roundDecimalPlaces(PamUtils.constrainedAngle(gpsData.getHeading()),1));
|
cog.setValue(PamUtils.constrainedAngle(gpsData.getCourseOverGround()));
|
||||||
gpsPoint.setSpeedKn(AutoTethysProvider.roundDecimalPlaces(gpsData.getSpeed(),2));
|
cog.setNorth(HeadingTypes.TRUE.toString());
|
||||||
|
Double trueHead = gpsData.getTrueHeading();
|
||||||
|
if (trueHead != null && trueHead.isInfinite()) {
|
||||||
|
HeadingDegN th = new HeadingDegN();
|
||||||
|
th.setValue(PamUtils.constrainedAngle(trueHead));
|
||||||
|
th.setNorth(HeadingTypes.TRUE.toString());
|
||||||
|
gpsPoint.setHeadingDegN(th);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// else try magnetic
|
||||||
|
Double magHead = gpsData.getMagneticHeading();
|
||||||
|
if (magHead != null && magHead.isInfinite()) {
|
||||||
|
HeadingDegN mh = new HeadingDegN();
|
||||||
|
mh.setValue(PamUtils.constrainedAngle(magHead));
|
||||||
|
mh.setNorth(HeadingTypes.MAGNETIC.toString());
|
||||||
|
gpsPoint.setHeadingDegN(mh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gpsPoint.setSpeedOverGround(AutoTethysProvider.roundDecimalPlaces(gpsData.getSpeed(),2));
|
||||||
|
|
||||||
points.add(gpsPoint);
|
points.add(gpsPoint);
|
||||||
lastPointTime = gpsDataUnit.getTimeMilliseconds();
|
lastPointTime = gpsDataUnit.getTimeMilliseconds();
|
||||||
|
24
src/tethys/deployment/HeadingTypes.java
Normal file
24
src/tethys/deployment/HeadingTypes.java
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package tethys.deployment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum of heading types (mostly for track output in Deployment documents)
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public enum HeadingTypes {
|
||||||
|
|
||||||
|
TRUE, MAGNETIC;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
switch (this) {
|
||||||
|
case MAGNETIC:
|
||||||
|
return "magnetic";
|
||||||
|
case TRUE:
|
||||||
|
return "true";
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package tethys.detection;
|
package tethys.detection;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -14,16 +13,11 @@ import Localiser.LocalisationAlgorithm;
|
|||||||
import Localiser.LocalisationAlgorithmInfo;
|
import Localiser.LocalisationAlgorithmInfo;
|
||||||
import PamController.PamControlledUnit;
|
import PamController.PamControlledUnit;
|
||||||
import PamController.PamController;
|
import PamController.PamController;
|
||||||
import PamController.PamguardVersionInfo;
|
|
||||||
import PamDetection.LocContents;
|
|
||||||
import PamDetection.LocalisationInfo;
|
|
||||||
import PamModel.PamPluginInterface;
|
|
||||||
import PamUtils.PamCalendar;
|
import PamUtils.PamCalendar;
|
||||||
import PamView.dialog.PamDialog;
|
import PamView.dialog.PamDialog;
|
||||||
import PamView.dialog.warn.WarnOnce;
|
import PamView.dialog.warn.WarnOnce;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
import PamguardMVC.PamDataUnit;
|
import PamguardMVC.PamDataUnit;
|
||||||
import PamguardMVC.PamProcess;
|
|
||||||
import PamguardMVC.dataSelector.DataSelector;
|
import PamguardMVC.dataSelector.DataSelector;
|
||||||
import PamguardMVC.superdet.SuperDetDataBlock;
|
import PamguardMVC.superdet.SuperDetDataBlock;
|
||||||
import PamguardMVC.superdet.SuperDetDataBlock.ViewerLoadPolicy;
|
import PamguardMVC.superdet.SuperDetDataBlock.ViewerLoadPolicy;
|
||||||
@ -32,20 +26,12 @@ import dataMap.OfflineDataMapPoint;
|
|||||||
import nilus.AlgorithmType;
|
import nilus.AlgorithmType;
|
||||||
import nilus.AlgorithmType.SupportSoftware;
|
import nilus.AlgorithmType.SupportSoftware;
|
||||||
import nilus.Localize.Effort;
|
import nilus.Localize.Effort;
|
||||||
import nilus.Localize.Effort.CoordinateReferenceSystem;
|
|
||||||
import nilus.Localize.Effort.ReferencedDocuments;
|
|
||||||
import nilus.Localize.Effort.ReferencedDocuments.Document;
|
|
||||||
import nilus.Localize.Localizations;
|
|
||||||
import nilus.DataSourceType;
|
import nilus.DataSourceType;
|
||||||
import nilus.Deployment;
|
|
||||||
import nilus.Detection;
|
import nilus.Detection;
|
||||||
import nilus.DetectionEffort;
|
|
||||||
import nilus.DetectionEffortKind;
|
|
||||||
import nilus.DetectionGroup;
|
import nilus.DetectionGroup;
|
||||||
import nilus.Detections;
|
import nilus.Detections;
|
||||||
import nilus.GranularityEnumType;
|
import nilus.GranularityEnumType;
|
||||||
import nilus.Helper;
|
import nilus.Helper;
|
||||||
import nilus.Localize;
|
|
||||||
import tethys.Collection;
|
import tethys.Collection;
|
||||||
import tethys.CollectionHandler;
|
import tethys.CollectionHandler;
|
||||||
import tethys.TethysControl;
|
import tethys.TethysControl;
|
||||||
@ -53,11 +39,8 @@ import tethys.TethysTimeFuncs;
|
|||||||
import tethys.dbxml.DBXMLConnect;
|
import tethys.dbxml.DBXMLConnect;
|
||||||
import tethys.dbxml.TethysException;
|
import tethys.dbxml.TethysException;
|
||||||
import tethys.deployment.DeploymentHandler;
|
import tethys.deployment.DeploymentHandler;
|
||||||
import tethys.localization.CoordinateName;
|
import tethys.localization.LocalizationBuilder;
|
||||||
import tethys.localization.LocalizationHandler;
|
import tethys.localization.LocalizationHandler;
|
||||||
import tethys.localization.LocalizationSubType;
|
|
||||||
import tethys.localization.LocalizationType;
|
|
||||||
import tethys.localization.PLocalization;
|
|
||||||
import tethys.niluswraps.NilusDataWrapper;
|
import tethys.niluswraps.NilusDataWrapper;
|
||||||
import tethys.niluswraps.PDeployment;
|
import tethys.niluswraps.PDeployment;
|
||||||
import tethys.niluswraps.PDetections;
|
import tethys.niluswraps.PDetections;
|
||||||
@ -78,7 +61,6 @@ import tethys.swing.export.DetectionsExportWizard;
|
|||||||
public class DetectionsHandler extends CollectionHandler {
|
public class DetectionsHandler extends CollectionHandler {
|
||||||
|
|
||||||
public int uniqueDetectionsId=1;
|
public int uniqueDetectionsId=1;
|
||||||
public int uniqueDetectionId;
|
|
||||||
|
|
||||||
private volatile boolean activeExport;
|
private volatile boolean activeExport;
|
||||||
|
|
||||||
@ -134,94 +116,94 @@ public class DetectionsHandler extends CollectionHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Get the Detection Effort part of a Detections document
|
// * Get the Detection Effort part of a Detections document
|
||||||
* @param pDeployment
|
// * @param pDeployment
|
||||||
* @param dataBlock
|
// * @param dataBlock
|
||||||
* @param exportParams
|
// * @param exportParams
|
||||||
* @return
|
// * @return
|
||||||
*/
|
// */
|
||||||
private DetectionEffort getDetectorEffort(PDeployment pDeployment, PamDataBlock dataBlock, StreamExportParams exportParams) {
|
// private DetectionEffort getDetectorEffort(PDeployment pDeployment, PamDataBlock dataBlock, StreamExportParams exportParams) {
|
||||||
DetectionEffort effort = new DetectionEffort();
|
// DetectionEffort effort = new DetectionEffort();
|
||||||
Deployment deployment = pDeployment.nilusObject;
|
// Deployment deployment = pDeployment.nilusObject;
|
||||||
Long effortStart = pDeployment.getAudioStart();
|
// Long effortStart = pDeployment.getAudioStart();
|
||||||
Long effortEnd = pDeployment.getAudioEnd();
|
// Long effortEnd = pDeployment.getAudioEnd();
|
||||||
effort.setStart(TethysTimeFuncs.xmlGregCalFromMillis(effortStart));
|
// effort.setStart(TethysTimeFuncs.xmlGregCalFromMillis(effortStart));
|
||||||
effort.setEnd(TethysTimeFuncs.xmlGregCalFromMillis(effortEnd));
|
// effort.setEnd(TethysTimeFuncs.xmlGregCalFromMillis(effortEnd));
|
||||||
// effort.set // no setter for DetectionEffortKind
|
// // effort.set // no setter for DetectionEffortKind
|
||||||
List<DetectionEffortKind> effortKinds = effort.getKind();
|
// List<DetectionEffortKind> effortKinds = effort.getKind();
|
||||||
|
//
|
||||||
TethysDataProvider dataProvider = dataBlock.getTethysDataProvider(tethysControl);
|
// TethysDataProvider dataProvider = dataBlock.getTethysDataProvider(tethysControl);
|
||||||
dataProvider.getEffortKinds(pDeployment, effortKinds, exportParams);
|
// dataProvider.getEffortKinds(pDeployment, effortKinds, exportParams);
|
||||||
|
//
|
||||||
|
//
|
||||||
return effort;
|
// return effort;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Method string for Detections Algorithm documents.
|
// * Method string for Detections Algorithm documents.
|
||||||
* @param dataBlock
|
// * @param dataBlock
|
||||||
* @return
|
// * @return
|
||||||
*/
|
// */
|
||||||
public String getMethodString(PamDataBlock dataBlock) {
|
// public String getMethodString(PamDataBlock dataBlock) {
|
||||||
if (dataBlock == null) {
|
// if (dataBlock == null) {
|
||||||
return null;
|
// return null;
|
||||||
}
|
// }
|
||||||
PamProcess process = dataBlock.getParentProcess();
|
// PamProcess process = dataBlock.getParentProcess();
|
||||||
return "PAMGuard " + process.getProcessName();
|
// return "PAMGuard " + process.getProcessName();
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Software string for Detections Algorithm documents.
|
// * Software string for Detections Algorithm documents.
|
||||||
* @param dataBlock
|
// * @param dataBlock
|
||||||
* @return
|
// * @return
|
||||||
*/
|
// */
|
||||||
public String getSoftwareString(PamDataBlock dataBlock) {
|
// public String getSoftwareString(PamDataBlock dataBlock) {
|
||||||
if (dataBlock == null) {
|
// if (dataBlock == null) {
|
||||||
return null;
|
// return null;
|
||||||
}
|
// }
|
||||||
return dataBlock.getLongDataName();
|
// return dataBlock.getLongDataName();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Software string for Detections Algorithm documents.
|
// * Software string for Detections Algorithm documents.
|
||||||
* @param dataBlock
|
// * @param dataBlock
|
||||||
* @return
|
// * @return
|
||||||
*/
|
// */
|
||||||
public String getVersionString(PamDataBlock dataBlock) {
|
// public String getVersionString(PamDataBlock dataBlock) {
|
||||||
if (dataBlock == null) {
|
// if (dataBlock == null) {
|
||||||
return null;
|
// return null;
|
||||||
}
|
// }
|
||||||
PamProcess process = dataBlock.getParentProcess();
|
// PamProcess process = dataBlock.getParentProcess();
|
||||||
PamControlledUnit pcu = process.getPamControlledUnit();
|
// PamControlledUnit pcu = process.getPamControlledUnit();
|
||||||
PamPluginInterface plugin = pcu.getPlugin();
|
// PamPluginInterface plugin = pcu.getPlugin();
|
||||||
if (plugin == null) {
|
// if (plugin == null) {
|
||||||
return PamguardVersionInfo.version;
|
// return PamguardVersionInfo.version;
|
||||||
}
|
// }
|
||||||
else {
|
// else {
|
||||||
return plugin.getVersion();
|
// return plugin.getVersion();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
*
|
// *
|
||||||
* @param dataBlock
|
// * @param dataBlock
|
||||||
* @return default value is PAMGuard
|
// * @return default value is PAMGuard
|
||||||
*/
|
// */
|
||||||
public String getSupportSoftware(PamDataBlock dataBlock) {
|
// public String getSupportSoftware(PamDataBlock dataBlock) {
|
||||||
return "PAMGuard";
|
// return "PAMGuard";
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
*
|
// *
|
||||||
* @param dataBlock
|
// * @param dataBlock
|
||||||
* @return PAMGuard version
|
// * @return PAMGuard version
|
||||||
*/
|
// */
|
||||||
public String getSupportSoftwareVersion(PamDataBlock dataBlock) {
|
// public String getSupportSoftwareVersion(PamDataBlock dataBlock) {
|
||||||
// should try to dig into the binary store and get the version from there.
|
// // should try to dig into the binary store and get the version from there.
|
||||||
return PamguardVersionInfo.version;
|
// return PamguardVersionInfo.version;
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detections will be exported in a separate worker thread since export may take some time and
|
* Detections will be exported in a separate worker thread since export may take some time and
|
||||||
@ -418,14 +400,13 @@ public class DetectionsHandler extends CollectionHandler {
|
|||||||
ArrayList<PDeployment> deployments = depHandler.getMatchedDeployments();
|
ArrayList<PDeployment> deployments = depHandler.getMatchedDeployments();
|
||||||
|
|
||||||
LocalizationHandler localizationHandler = tethysControl.getLocalizationHandler();
|
LocalizationHandler localizationHandler = tethysControl.getLocalizationHandler();
|
||||||
|
LocalizationBuilder localizationBuilder = null;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The main documents for both dets and locs.
|
* The main documents for both dets and locs.
|
||||||
*/
|
*/
|
||||||
Detections detectionsDocument = null;
|
Detections detectionsDocument = null;
|
||||||
Localize localiseDocument = null;
|
|
||||||
DetectionGroup onEffortDetections = null;
|
DetectionGroup onEffortDetections = null;
|
||||||
Localizations localisations = null;
|
|
||||||
|
|
||||||
OfflineDataMap dataMap = dataBlock.getPrimaryDataMap();
|
OfflineDataMap dataMap = dataBlock.getPrimaryDataMap();
|
||||||
DataSelector dataSelector = dataBlock.getDataSelector(tethysControl.getDataSelectName(), false);
|
DataSelector dataSelector = dataBlock.getDataSelector(tethysControl.getDataSelectName(), false);
|
||||||
@ -479,11 +460,10 @@ public class DetectionsHandler extends CollectionHandler {
|
|||||||
// onEffortDetections = null;
|
// onEffortDetections = null;
|
||||||
// detectionList = null;
|
// detectionList = null;
|
||||||
// }
|
// }
|
||||||
if (localiseDocument == null && streamExportParams.exportLocalisations) {
|
if (localizationBuilder == null && streamExportParams.exportLocalisations) {
|
||||||
localiseDocument = startLocalisationDocument(deployment, detectionsDocument, dataBlock, streamExportParams);
|
localizationBuilder = new LocalizationBuilder(tethysControl, deployment, detectionsDocument, dataBlock, streamExportParams);
|
||||||
Effort eff = localiseDocument.getEffort();
|
Effort eff = localizationBuilder.getCurrentDocument().getEffort();
|
||||||
localiseDocument.getEffort().setStart(TethysTimeFuncs.xmlGregCalFromMillis(deployment.getAudioStart()));
|
eff.setStart(TethysTimeFuncs.xmlGregCalFromMillis(deployment.getAudioStart()));
|
||||||
localisations = localiseDocument.getLocalizations();
|
|
||||||
}
|
}
|
||||||
// else {
|
// else {
|
||||||
// localisations = null;
|
// localisations = null;
|
||||||
@ -517,11 +497,7 @@ public class DetectionsHandler extends CollectionHandler {
|
|||||||
* Localisations don't do granularity, so do all.
|
* Localisations don't do granularity, so do all.
|
||||||
*/
|
*/
|
||||||
if (streamExportParams.exportLocalisations) {
|
if (streamExportParams.exportLocalisations) {
|
||||||
// convert the dets into localisations and add them.
|
localizationBuilder.addLocalization(dataUnit);
|
||||||
nilus.LocalizationType localization = localizationHandler.createLocalization(localiseDocument, dataBlock, dataUnit, streamExportParams);
|
|
||||||
if (localization != null) {
|
|
||||||
localisations.getLocalization().add(localization);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exportCount % 100 == 0) {
|
if (exportCount % 100 == 0) {
|
||||||
@ -552,16 +528,16 @@ public class DetectionsHandler extends CollectionHandler {
|
|||||||
}
|
}
|
||||||
detectionsDocument = null;
|
detectionsDocument = null;
|
||||||
}
|
}
|
||||||
if (localiseDocument != null) {
|
if (localizationBuilder != null) {
|
||||||
closeLocaliseDocument(localiseDocument, mapPoint.getEndTime());
|
localizationBuilder.closeDocument(mapPoint.getEndTime());
|
||||||
try {
|
try {
|
||||||
if (checkLocaliseDocument(localiseDocument, granularityHandler)) {
|
if (localizationBuilder.checkDocument()) {
|
||||||
dbxmlConnect.postAndLog(localiseDocument);
|
dbxmlConnect.postAndLog(localizationBuilder.getCurrentDocument());
|
||||||
}
|
}
|
||||||
} catch (TethysException e) {
|
} catch (TethysException e) {
|
||||||
tethysControl.showException(e);
|
tethysControl.showException(e);
|
||||||
}
|
}
|
||||||
localiseDocument = null;
|
localizationBuilder = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,26 +574,18 @@ public class DetectionsHandler extends CollectionHandler {
|
|||||||
}
|
}
|
||||||
detectionsDocument = null;
|
detectionsDocument = null;
|
||||||
}
|
}
|
||||||
if (localiseDocument != null) {
|
|
||||||
Detection dets[] = granularityHandler.cleanup(deployment.getAudioEnd());
|
|
||||||
if (dets != null) {
|
|
||||||
for (int dd = 0; dd < dets.length; dd++) {
|
|
||||||
exportCount++;
|
|
||||||
documentCount++;
|
|
||||||
// localiseDocument.getOnEffort().getDetection().add(dets[dd]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prog = new DetectionExportProgress(deployment, detectionsDocument,totalMapPoints, doneMapPoints,
|
prog = new DetectionExportProgress(deployment, detectionsDocument,totalMapPoints, doneMapPoints,
|
||||||
lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_WRITING);
|
lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_WRITING);
|
||||||
closeLocaliseDocument(localiseDocument, deployment.getAudioEnd());
|
if (localizationBuilder != null) {
|
||||||
|
localizationBuilder.closeDocument(deployment.getAudioEnd());
|
||||||
try {
|
try {
|
||||||
if (checkLocaliseDocument(localiseDocument, granularityHandler)) {
|
if (localizationBuilder.checkDocument()) {
|
||||||
dbxmlConnect.postAndLog(localiseDocument);
|
dbxmlConnect.postAndLog(localizationBuilder.getCurrentDocument());
|
||||||
}
|
}
|
||||||
} catch (TethysException e) {
|
} catch (TethysException e) {
|
||||||
tethysControl.showException(e);
|
tethysControl.showException(e);
|
||||||
}
|
}
|
||||||
localiseDocument = null;
|
localizationBuilder = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -686,175 +654,6 @@ public class DetectionsHandler extends CollectionHandler {
|
|||||||
return detections;
|
return detections;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Localize startLocalisationDocument(PDeployment deployment, Detections detectionsDocument, PamDataBlock dataBlock,
|
|
||||||
StreamExportParams exportParams) {
|
|
||||||
Localize localisations = new Localize();
|
|
||||||
try {
|
|
||||||
Helper.createRequiredElements(localisations);
|
|
||||||
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
Effort eff = localisations.getEffort();
|
|
||||||
if (eff == null) {
|
|
||||||
eff = new Effort();
|
|
||||||
try {
|
|
||||||
Helper.createRequiredElements(eff);
|
|
||||||
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
localisations.setEffort(eff);
|
|
||||||
}
|
|
||||||
if (detectionsDocument != null) {
|
|
||||||
/*
|
|
||||||
* add the reference document information.
|
|
||||||
* Within PAMGuard, this will always be 1:1 with a Detections doc.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ReferencedDocuments refDocs = eff.getReferencedDocuments();
|
|
||||||
if (refDocs == null) {
|
|
||||||
refDocs = new ReferencedDocuments();
|
|
||||||
try {
|
|
||||||
Helper.createRequiredElements(refDocs);
|
|
||||||
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
eff.setReferencedDocuments(refDocs);
|
|
||||||
}
|
|
||||||
Document detectsDoc = new Document();
|
|
||||||
detectsDoc.setId(detectionsDocument.getId());
|
|
||||||
detectsDoc.setType(Collection.Detections.collectionName());
|
|
||||||
detectsDoc.setIndex(BigInteger.ZERO);
|
|
||||||
eff.getReferencedDocuments().getDocument().add(detectsDoc);
|
|
||||||
}
|
|
||||||
|
|
||||||
TethysDataProvider dataProvider = dataBlock.getTethysDataProvider(tethysControl);
|
|
||||||
|
|
||||||
String prefix = deployment.nilusObject.getId() + "_" + dataProvider.getDetectionsName();
|
|
||||||
String fullId = "";
|
|
||||||
/*
|
|
||||||
* Check the document name isn't already used and increment id as necessary.
|
|
||||||
*/
|
|
||||||
while (true) {
|
|
||||||
fullId = String.format("%s_%d", prefix, uniqueDetectionsId++);
|
|
||||||
if (!tethysControl.getDbxmlQueries().documentExists(Collection.Localizations.toString(), fullId)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
localisations.setId(fullId);
|
|
||||||
// detections.setDescription(dataProvider.getDescription(deployment, tethysExportParams));
|
|
||||||
localisations.setDescription(exportParams.getNilusDetectionDescription());
|
|
||||||
DataSourceType dataSource = new DataSourceType();
|
|
||||||
dataSource.setDeploymentId(deployment.nilusObject.getId());
|
|
||||||
// dataSource.setEnsembleId(""); ToDo
|
|
||||||
localisations.setDataSource(dataSource);
|
|
||||||
AlgorithmType algorithm = localisations.getAlgorithm();
|
|
||||||
|
|
||||||
if (dataProvider != null) {
|
|
||||||
algorithm = dataProvider.getAlgorithm(Collection.Localizations);
|
|
||||||
// detections.setAlgorithm(algorithm);
|
|
||||||
}
|
|
||||||
LocalisationAlgorithm locAlgorithm = dataBlock.getLocalisationAlgorithm();
|
|
||||||
LocalisationAlgorithmInfo locAlgoinfo = null;
|
|
||||||
if (locAlgorithm != null) {
|
|
||||||
locAlgoinfo = locAlgorithm.getAlgorithmInfo();
|
|
||||||
}
|
|
||||||
if (locAlgoinfo != null) {
|
|
||||||
algorithm.setMethod(locAlgoinfo.getAlgorithmName());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
algorithm.setMethod(getMethodString(dataBlock));
|
|
||||||
}
|
|
||||||
algorithm.setSoftware(getSoftwareString(dataBlock));
|
|
||||||
algorithm.setVersion(getVersionString(dataBlock));
|
|
||||||
|
|
||||||
List<SupportSoftware> supSoft = algorithm.getSupportSoftware();
|
|
||||||
SupportSoftware supportSoft = new SupportSoftware();
|
|
||||||
supportSoft.setSoftware(getSupportSoftware(dataBlock));
|
|
||||||
supportSoft.setVersion(getSupportSoftwareVersion(dataBlock));
|
|
||||||
supSoft.add(supportSoft);
|
|
||||||
localisations.setAlgorithm(algorithm);
|
|
||||||
|
|
||||||
localisations.setUserId("PAMGuard user");
|
|
||||||
// localisations.setEffort(getLocaliserEffort(deployment, dataBlock, exportParams));
|
|
||||||
sortLocaliseCoordinates(dataBlock, localisations);
|
|
||||||
|
|
||||||
// sort out coordinate system.
|
|
||||||
|
|
||||||
return localisations;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean sortLocaliseCoordinates(PamDataBlock dataBlock, Localize localisations) {
|
|
||||||
LocalisationInfo locInfo = dataBlock.getLocalisationContents();
|
|
||||||
Effort locEffort = localisations.getEffort();
|
|
||||||
if (locEffort == null) {
|
|
||||||
locEffort = new Effort();
|
|
||||||
localisations.setEffort(locEffort);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Helper.createRequiredElements(locEffort);
|
|
||||||
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
locEffort.setTimeReference("relative");
|
|
||||||
// List<String> locTypes = locEffort.getLocalizationType();
|
|
||||||
boolean ambiguity = locInfo.hasLocContent(LocContents.HAS_AMBIGUITY);
|
|
||||||
CoordinateReferenceSystem coordRefs = locEffort.getCoordinateReferenceSystem();
|
|
||||||
if (locInfo.getLocContent() == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (locInfo.hasLocContent(LocContents.HAS_LATLONG)) {
|
|
||||||
coordRefs.setName(CoordinateName.WGS84.toString());
|
|
||||||
coordRefs.setSubtype(LocalizationSubType.Geographic.toString());
|
|
||||||
locEffort.setLocalizationType(LocalizationType.Point.toString());
|
|
||||||
// locEffort.set
|
|
||||||
if (locInfo.hasLocContent(LocContents.HAS_DEPTH)) {
|
|
||||||
locEffort.setDimension(3);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
locEffort.setDimension(2);
|
|
||||||
}
|
|
||||||
// locEffort.set
|
|
||||||
}
|
|
||||||
else if (locInfo.hasLocContent(LocContents.HAS_XYZ)) {
|
|
||||||
coordRefs.setName(CoordinateName.Cartesian.toString());
|
|
||||||
coordRefs.setSubtype(LocalizationSubType.Engineering.toString());
|
|
||||||
locEffort.setLocalizationType(LocalizationType.Point.toString());
|
|
||||||
locEffort.setDimension(3);
|
|
||||||
}
|
|
||||||
else if (locInfo.hasLocContent(LocContents.HAS_XY)) {
|
|
||||||
coordRefs.setName(CoordinateName.Cartesian.toString());
|
|
||||||
coordRefs.setSubtype(LocalizationSubType.Engineering.toString());
|
|
||||||
locEffort.setLocalizationType(LocalizationType.Point.toString());
|
|
||||||
locEffort.setDimension(2);
|
|
||||||
}
|
|
||||||
else if (locInfo.hasLocContent(LocContents.HAS_BEARING)) {
|
|
||||||
coordRefs.setName(CoordinateName.Polar.toString());
|
|
||||||
coordRefs.setSubtype(LocalizationSubType.Engineering.toString());
|
|
||||||
locEffort.setLocalizationType(LocalizationType.Bearing.toString());
|
|
||||||
if (ambiguity) {
|
|
||||||
locEffort.setDimension(1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
locEffort.setDimension(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private nilus.Localize.Effort getLocaliserEffort(PDeployment deployment, PamDataBlock dataBlock, StreamExportParams exportParams) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close a detections document. This basically just means rewriting the end time and it's only
|
* Close a detections document. This basically just means rewriting the end time and it's only
|
||||||
* important in the event that a document got too big and has to be restarted.
|
* important in the event that a document got too big and has to be restarted.
|
||||||
@ -865,9 +664,6 @@ public class DetectionsHandler extends CollectionHandler {
|
|||||||
detections.getEffort().setEnd(TethysTimeFuncs.xmlGregCalFromMillis(audioEnd));
|
detections.getEffort().setEnd(TethysTimeFuncs.xmlGregCalFromMillis(audioEnd));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void closeLocaliseDocument(Localize localiseDocument, long endTime) {
|
|
||||||
localiseDocument.getEffort().setEnd(TethysTimeFuncs.xmlGregCalFromMillis(endTime));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -914,10 +710,6 @@ public class DetectionsHandler extends CollectionHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkLocaliseDocument(Localize localiseDocument, GranularityHandler granularityHandler) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Worker thread for exporting detections.
|
* Worker thread for exporting detections.
|
||||||
|
@ -7,5 +7,38 @@ package tethys.localization;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public enum CoordinateName {
|
public enum CoordinateName {
|
||||||
WGS84, UTM, Cartesian, Polar, Spherical, Cylindrical, Range, PerpindicularRange;
|
WGS84, UTM, Cartesian, Polar, Spherical, Cylindrical, Range, PerpendicularRange;
|
||||||
|
/*
|
||||||
|
* I beleive there is only one LocalizationSubType for each of these.
|
||||||
|
* Cartesian onwards is always engineering subtype
|
||||||
|
* WGS84 must be geographic
|
||||||
|
* UTM must be derived.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Localizationtype is more confusing
|
||||||
|
* e.g. for WGS84, LocalizationType might be point or track.
|
||||||
|
* UTM can be point or track.
|
||||||
|
* The most of the others
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
public LocalizationSubTypes getSubType() {
|
||||||
|
switch (this) {
|
||||||
|
case Cartesian:
|
||||||
|
case Cylindrical:
|
||||||
|
case PerpendicularRange:
|
||||||
|
case Polar:
|
||||||
|
case Range:
|
||||||
|
case Spherical:
|
||||||
|
return LocalizationSubTypes.Engineering;
|
||||||
|
case UTM:
|
||||||
|
return LocalizationSubTypes.Derived;
|
||||||
|
case WGS84:
|
||||||
|
return LocalizationSubTypes.Geographic;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
619
src/tethys/localization/LocalizationBuilder.java
Normal file
619
src/tethys/localization/LocalizationBuilder.java
Normal file
@ -0,0 +1,619 @@
|
|||||||
|
package tethys.localization;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import Localiser.LocalisationAlgorithm;
|
||||||
|
import Localiser.LocalisationAlgorithmInfo;
|
||||||
|
import Localiser.detectionGroupLocaliser.GroupLocResult;
|
||||||
|
import Localiser.detectionGroupLocaliser.GroupLocalisation;
|
||||||
|
import PamDetection.AbstractLocalisation;
|
||||||
|
import PamDetection.LocContents;
|
||||||
|
import PamDetection.LocalisationInfo;
|
||||||
|
import PamUtils.LatLong;
|
||||||
|
import PamUtils.PamUtils;
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import nilus.AlgorithmType;
|
||||||
|
import nilus.AngularCoordinateType;
|
||||||
|
import nilus.BearingType;
|
||||||
|
import nilus.DataSourceType;
|
||||||
|
import nilus.Detections;
|
||||||
|
import nilus.Helper;
|
||||||
|
import nilus.LocalizationType;
|
||||||
|
import nilus.Localize;
|
||||||
|
import nilus.SpeciesIDType;
|
||||||
|
import nilus.WGS84CoordinateType;
|
||||||
|
import nilus.AlgorithmType.SupportSoftware;
|
||||||
|
import nilus.LocalizationType.Angular;
|
||||||
|
import nilus.LocalizationType.Bearing;
|
||||||
|
import nilus.LocalizationType.Parameters;
|
||||||
|
import nilus.LocalizationType.References;
|
||||||
|
import nilus.LocalizationType.WGS84;
|
||||||
|
import nilus.LocalizationType.Parameters.TargetMotionAnalysis;
|
||||||
|
import nilus.LocalizationType.References.Reference;
|
||||||
|
import nilus.Localize.Effort;
|
||||||
|
import nilus.Localize.Effort.CoordinateReferenceSystem;
|
||||||
|
import nilus.Localize.Effort.ReferencedDocuments;
|
||||||
|
import nilus.Localize.Effort.ReferencedDocuments.Document;
|
||||||
|
import pamMaths.PamVector;
|
||||||
|
import tethys.Collection;
|
||||||
|
import tethys.TethysControl;
|
||||||
|
import tethys.TethysTimeFuncs;
|
||||||
|
import tethys.niluswraps.PDeployment;
|
||||||
|
import tethys.output.StreamExportParams;
|
||||||
|
import tethys.pamdata.AutoTethysProvider;
|
||||||
|
import tethys.pamdata.TethysDataProvider;
|
||||||
|
import tethys.species.DataBlockSpeciesManager;
|
||||||
|
import tethys.species.SpeciesMapItem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to build a single localisation document during export.
|
||||||
|
* Works hand in had with the global LocalisationHandler and also
|
||||||
|
* with other functions it's going to find in the datablock and whatever localisation
|
||||||
|
* algorithm was used.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class LocalizationBuilder {
|
||||||
|
|
||||||
|
private PDeployment deployment;
|
||||||
|
private Detections detectionsDocument;
|
||||||
|
private PamDataBlock dataBlock;
|
||||||
|
private StreamExportParams streamExportParams;
|
||||||
|
private TethysControl tethysControl;
|
||||||
|
private LocalizationHandler localisationHandler;
|
||||||
|
private LocalisationAlgorithm localisationAlgorithm;
|
||||||
|
|
||||||
|
private Localize currentDocument;
|
||||||
|
private LocalizationCreator localisationCreator;
|
||||||
|
private TethysDataProvider dataProvider;
|
||||||
|
|
||||||
|
public LocalizationBuilder(TethysControl tethysControl, PDeployment deployment, Detections detectionsDocument, PamDataBlock dataBlock,
|
||||||
|
StreamExportParams exportParams) {
|
||||||
|
this.deployment = deployment;
|
||||||
|
this.detectionsDocument = detectionsDocument;
|
||||||
|
this.dataBlock = dataBlock;
|
||||||
|
this.streamExportParams = exportParams;
|
||||||
|
this.tethysControl = tethysControl;
|
||||||
|
dataProvider = dataBlock.getTethysDataProvider(tethysControl);
|
||||||
|
localisationHandler = tethysControl.getLocalizationHandler();
|
||||||
|
localisationAlgorithm = dataBlock.getLocalisationAlgorithm();
|
||||||
|
if (localisationAlgorithm != null) {
|
||||||
|
localisationCreator = localisationAlgorithm.getTethysCreator();
|
||||||
|
}
|
||||||
|
currentDocument = startLocalisationDocument(deployment, detectionsDocument, dataBlock, exportParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Localize startLocalisationDocument(PDeployment deployment, Detections detectionsDocument, PamDataBlock dataBlock,
|
||||||
|
StreamExportParams exportParams) {
|
||||||
|
currentDocument = new Localize();
|
||||||
|
try {
|
||||||
|
Helper.createRequiredElements(currentDocument);
|
||||||
|
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Effort eff = currentDocument.getEffort();
|
||||||
|
if (eff == null) {
|
||||||
|
eff = new Effort();
|
||||||
|
try {
|
||||||
|
Helper.createRequiredElements(eff);
|
||||||
|
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
currentDocument.setEffort(eff);
|
||||||
|
}
|
||||||
|
if (detectionsDocument != null) {
|
||||||
|
/*
|
||||||
|
* add the reference document information.
|
||||||
|
* Within PAMGuard, this will always be 1:1 with a Detections doc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ReferencedDocuments refDocs = eff.getReferencedDocuments();
|
||||||
|
if (refDocs == null) {
|
||||||
|
refDocs = new ReferencedDocuments();
|
||||||
|
try {
|
||||||
|
Helper.createRequiredElements(refDocs);
|
||||||
|
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
eff.setReferencedDocuments(refDocs);
|
||||||
|
}
|
||||||
|
Document detectsDoc = new Document();
|
||||||
|
detectsDoc.setId(detectionsDocument.getId());
|
||||||
|
detectsDoc.setType(Collection.Localizations.collectionName());
|
||||||
|
detectsDoc.setIndex(BigInteger.ZERO);
|
||||||
|
eff.getReferencedDocuments().getDocument().add(detectsDoc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
String prefix = deployment.nilusObject.getId() + "_" + dataProvider.getDetectionsName();
|
||||||
|
String fullId = localisationHandler.getLocalisationdocId(prefix);
|
||||||
|
currentDocument.setId(fullId);
|
||||||
|
// detections.setDescription(dataProvider.getDescription(deployment, tethysExportParams));
|
||||||
|
currentDocument.setDescription(exportParams.getNilusDetectionDescription());
|
||||||
|
DataSourceType dataSource = new DataSourceType();
|
||||||
|
dataSource.setDeploymentId(deployment.nilusObject.getId());
|
||||||
|
// dataSource.setEnsembleId(""); ToDo
|
||||||
|
currentDocument.setDataSource(dataSource);
|
||||||
|
AlgorithmType algorithm = currentDocument.getAlgorithm();
|
||||||
|
|
||||||
|
if (dataProvider != null) {
|
||||||
|
algorithm = dataProvider.getAlgorithm(Collection.Localizations);
|
||||||
|
// detections.setAlgorithm(algorithm);
|
||||||
|
}
|
||||||
|
LocalisationAlgorithm locAlgorithm = dataBlock.getLocalisationAlgorithm();
|
||||||
|
LocalisationAlgorithmInfo locAlgoinfo = null;
|
||||||
|
if (locAlgorithm != null) {
|
||||||
|
locAlgoinfo = locAlgorithm.getAlgorithmInfo();
|
||||||
|
}
|
||||||
|
if (locAlgoinfo != null) {
|
||||||
|
algorithm.setMethod(locAlgoinfo.getAlgorithmName());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
algorithm.setMethod(localisationHandler.getMethodString(dataBlock));
|
||||||
|
}
|
||||||
|
algorithm.setSoftware(localisationHandler.getSoftwareString(dataBlock));
|
||||||
|
algorithm.setVersion(localisationHandler.getVersionString(dataBlock));
|
||||||
|
|
||||||
|
List<SupportSoftware> supSoft = algorithm.getSupportSoftware();
|
||||||
|
SupportSoftware supportSoft = new SupportSoftware();
|
||||||
|
supportSoft.setSoftware(localisationHandler.getSupportSoftware(dataBlock));
|
||||||
|
supportSoft.setVersion(localisationHandler.getSupportSoftwareVersion(dataBlock));
|
||||||
|
supSoft.add(supportSoft);
|
||||||
|
currentDocument.setAlgorithm(algorithm);
|
||||||
|
|
||||||
|
currentDocument.setUserId("PAMGuard user");
|
||||||
|
// localisations.setEffort(getLocaliserEffort(deployment, dataBlock, exportParams));
|
||||||
|
sortLocaliseCoordinates(dataBlock);
|
||||||
|
|
||||||
|
// sort out coordinate system.
|
||||||
|
|
||||||
|
return currentDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean sortLocaliseCoordinates(PamDataBlock dataBlock) {
|
||||||
|
boolean done = false;
|
||||||
|
if (localisationCreator != null) {
|
||||||
|
done = localisationCreator.sortLocalisationCoordinates(this, dataBlock);
|
||||||
|
}
|
||||||
|
if (!done) {
|
||||||
|
sortStandardCoordinates(dataBlock);
|
||||||
|
}
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean sortStandardCoordinates(PamDataBlock dataBlock) {
|
||||||
|
LocalisationInfo locInfo = dataBlock.getLocalisationContents();
|
||||||
|
Effort locEffort = currentDocument.getEffort();
|
||||||
|
if (locEffort == null) {
|
||||||
|
locEffort = new Effort();
|
||||||
|
currentDocument.setEffort(locEffort);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Helper.createRequiredElements(locEffort);
|
||||||
|
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
locEffort.setTimeReference("relative");
|
||||||
|
// List<String> locTypes = locEffort.getLocalizationType();
|
||||||
|
boolean ambiguity = locInfo.hasLocContent(LocContents.HAS_AMBIGUITY);
|
||||||
|
CoordinateReferenceSystem coordRefs = locEffort.getCoordinateReferenceSystem();
|
||||||
|
List<String> locTypes = locEffort.getLocalizationType();
|
||||||
|
if (locInfo.getLocContent() == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (locInfo.hasLocContent(LocContents.HAS_LATLONG)) {
|
||||||
|
coordRefs.setName(CoordinateName.WGS84.toString());
|
||||||
|
coordRefs.setSubtype(LocalizationSubTypes.Geographic.toString());
|
||||||
|
locTypes.add(LocalizationTypes.Point.toString());
|
||||||
|
// locEffort.set
|
||||||
|
if (locInfo.hasLocContent(LocContents.HAS_DEPTH)) {
|
||||||
|
locEffort.setDimension(3);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
locEffort.setDimension(2);
|
||||||
|
}
|
||||||
|
// locEffort.set
|
||||||
|
}
|
||||||
|
else if (locInfo.hasLocContent(LocContents.HAS_XYZ)) {
|
||||||
|
coordRefs.setName(CoordinateName.Cartesian.toString());
|
||||||
|
coordRefs.setSubtype(LocalizationSubTypes.Engineering.toString());
|
||||||
|
locTypes.add(LocalizationTypes.Point.toString());
|
||||||
|
locEffort.setDimension(3);
|
||||||
|
}
|
||||||
|
else if (locInfo.hasLocContent(LocContents.HAS_XY)) {
|
||||||
|
coordRefs.setName(CoordinateName.Cartesian.toString());
|
||||||
|
coordRefs.setSubtype(LocalizationSubTypes.Engineering.toString());
|
||||||
|
locTypes.add(LocalizationTypes.Point.toString());
|
||||||
|
locEffort.setDimension(2);
|
||||||
|
}
|
||||||
|
else if (locInfo.hasLocContent(LocContents.HAS_BEARING)) {
|
||||||
|
coordRefs.setName(CoordinateName.Polar.toString());
|
||||||
|
coordRefs.setSubtype(LocalizationSubTypes.Engineering.toString());
|
||||||
|
locTypes.add(LocalizationTypes.Bearing.toString());
|
||||||
|
if (ambiguity) {
|
||||||
|
locEffort.setDimension(1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
locEffort.setDimension(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType addLocalization(PamDataUnit dataUnit) {
|
||||||
|
LocalizationType newLoc = createLocalization(dataUnit);
|
||||||
|
if (newLoc != null) {
|
||||||
|
currentDocument.getLocalizations().getLocalization().add(newLoc);
|
||||||
|
}
|
||||||
|
return newLoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private LocalizationType createLocalization(PamDataUnit dataUnit) {
|
||||||
|
if (localisationCreator != null) {
|
||||||
|
return localisationCreator.createLocalization(this, dataUnit);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return createStandardLocalization(dataUnit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType createStandardLocalization(PamDataUnit dataUnit) {
|
||||||
|
/*
|
||||||
|
* Get the current type from the document. This should always exist, so
|
||||||
|
* just go for it, then switch on the value to make the localisation.
|
||||||
|
*/
|
||||||
|
CoordinateReferenceSystem coordSystem = currentDocument.getEffort().getCoordinateReferenceSystem();
|
||||||
|
String name = coordSystem.getName();
|
||||||
|
CoordinateName coordName = CoordinateName.valueOf(name);
|
||||||
|
if (coordName == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
LocalizationType locEl = null;
|
||||||
|
switch (coordName) {
|
||||||
|
case Cartesian:
|
||||||
|
locEl = createCartesianLoc(dataUnit);
|
||||||
|
break;
|
||||||
|
case Cylindrical:
|
||||||
|
locEl = createCylindricalLoc(dataUnit);
|
||||||
|
break;
|
||||||
|
case PerpendicularRange:
|
||||||
|
locEl = createPerpRange(dataUnit);
|
||||||
|
break;
|
||||||
|
case Polar:
|
||||||
|
locEl = createPolarLoc(dataUnit);
|
||||||
|
break;
|
||||||
|
case Range:
|
||||||
|
locEl = createRangeLoc(dataUnit);
|
||||||
|
break;
|
||||||
|
case Spherical:
|
||||||
|
locEl = createSphericalLoc(dataUnit);
|
||||||
|
break;
|
||||||
|
case UTM:
|
||||||
|
break;
|
||||||
|
case WGS84:
|
||||||
|
locEl = createWGS84Loc(dataUnit);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
return locEl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType makeBaseLoc(PamDataUnit dataUnit) {
|
||||||
|
LocalizationType locType = new LocalizationType();
|
||||||
|
try {
|
||||||
|
Helper.createRequiredElements(locType);
|
||||||
|
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
locType.setTimeStamp(TethysTimeFuncs.xmlGregCalFromMillis(dataUnit.getTimeMilliseconds()));
|
||||||
|
|
||||||
|
locType.setEvent(TethysTimeFuncs.xmlGregCalFromMillis(dataUnit.getTimeMilliseconds()).toString());
|
||||||
|
|
||||||
|
DataBlockSpeciesManager spManager = dataBlock.getDatablockSpeciesManager();
|
||||||
|
if (spManager != null) {
|
||||||
|
SpeciesMapItem speciesStuff = spManager.getSpeciesItem(dataUnit);
|
||||||
|
SpeciesIDType species = new SpeciesIDType();
|
||||||
|
if (speciesStuff != null) {
|
||||||
|
species.setValue(BigInteger.valueOf(speciesStuff.getItisCode()));
|
||||||
|
locType.setSpeciesId(species);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
References references = locType.getReferences();
|
||||||
|
if (references == null) {
|
||||||
|
references = new References();
|
||||||
|
try {
|
||||||
|
Helper.createRequiredElements(references);
|
||||||
|
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
locType.setReferences(references);
|
||||||
|
}
|
||||||
|
Reference reference = new Reference();
|
||||||
|
reference.setIndex(BigInteger.valueOf(dataUnit.getUID()));
|
||||||
|
reference.setEventRef("UID");
|
||||||
|
locType.getReferences().getReference().add(reference);
|
||||||
|
|
||||||
|
return locType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get angle in degrees constrained to 0-360
|
||||||
|
* @param radians
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public double constrainRadianAngle(double radians) {
|
||||||
|
double deg = Math.toDegrees(radians);
|
||||||
|
if (Math.abs(deg) > 3600) {
|
||||||
|
return 359.9;
|
||||||
|
}
|
||||||
|
deg = PamUtils.constrainedAngle(deg);
|
||||||
|
deg = AutoTethysProvider.roundDecimalPlaces(deg, 2);
|
||||||
|
return deg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a vertical angle from radians to degrees and round.
|
||||||
|
* @param radians
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public double toSlantAngle(double radians) {
|
||||||
|
/*
|
||||||
|
* these really need to be constrained to -90 to 90, but I don't see what to do if
|
||||||
|
* they are outside that range.
|
||||||
|
*/
|
||||||
|
double deg = Math.toDegrees(radians);
|
||||||
|
deg= PamUtils.constrainedAngle(deg, 180);
|
||||||
|
deg = AutoTethysProvider.roundDecimalPlaces(deg, 2);
|
||||||
|
return deg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType createWGS84Loc(PamDataUnit dataUnit) {
|
||||||
|
AbstractLocalisation loc = dataUnit.getLocalisation();
|
||||||
|
if (loc == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
LatLong latlong = loc.getLatLong(0);
|
||||||
|
if (latlong == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
LocalizationType locType = makeBaseLoc(dataUnit);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export the latlong data.
|
||||||
|
*/
|
||||||
|
WGS84 wgs84 = new WGS84();
|
||||||
|
WGS84CoordinateType coord = new WGS84CoordinateType();
|
||||||
|
wgs84.setCoordinate(coord);
|
||||||
|
coord.setLongitude(latlong.getLongitude());
|
||||||
|
coord.setLatitude(latlong.getLatitude());
|
||||||
|
coord.setElevationM(AutoTethysProvider.roundDecimalPlaces(latlong.getHeight(),3));
|
||||||
|
|
||||||
|
PamVector planarVec = loc.getPlanarVector();
|
||||||
|
locType.setWGS84(wgs84);
|
||||||
|
|
||||||
|
// locType.setParameters(null);
|
||||||
|
Parameters params = locType.getParameters();
|
||||||
|
if (params == null) {
|
||||||
|
params = new Parameters();
|
||||||
|
locType.setParameters(params);
|
||||||
|
}
|
||||||
|
TargetMotionAnalysis tma = new TargetMotionAnalysis();
|
||||||
|
tma.setStart(TethysTimeFuncs.xmlGregCalFromMillis(dataUnit.getTimeMilliseconds()));
|
||||||
|
tma.setEnd(TethysTimeFuncs.xmlGregCalFromMillis(dataUnit.getEndTimeInMilliseconds()));
|
||||||
|
params.setTargetMotionAnalysis(tma);
|
||||||
|
|
||||||
|
|
||||||
|
// see if it's possible to get a beam measurement.
|
||||||
|
if (loc instanceof GroupLocalisation) {
|
||||||
|
GroupLocalisation groupLoc = (GroupLocalisation) loc;
|
||||||
|
GroupLocResult groupLocResult = groupLoc.getGroupLocaResult(0);
|
||||||
|
Double perpDist = groupLocResult.getPerpendicularDistance();
|
||||||
|
Long beamTime = groupLocResult.getBeamTime();
|
||||||
|
if (perpDist != null && beamTime != null) {
|
||||||
|
AngularCoordinateType acType = new AngularCoordinateType();
|
||||||
|
acType.setAngle1(90);
|
||||||
|
acType.setDistanceM(AutoTethysProvider.roundDecimalPlaces(perpDist,1));
|
||||||
|
Angular angular = new Angular();
|
||||||
|
angular.setCoordinate(acType);
|
||||||
|
locType.setAngular(angular);
|
||||||
|
locType.setTimeStamp(TethysTimeFuncs.xmlGregCalFromMillis(beamTime));
|
||||||
|
currentDocument.getEffort().setTimeReference(TimeReference.beam.toString());
|
||||||
|
}
|
||||||
|
// groupLoc.getp
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to also add a range loc.
|
||||||
|
*/
|
||||||
|
// loc.
|
||||||
|
|
||||||
|
return locType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType createSphericalLoc(PamDataUnit dataUnit) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType createRangeLoc(PamDataUnit dataUnit) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType createBearingLoc(PamDataUnit dataUnit) {
|
||||||
|
AbstractLocalisation loc = dataUnit.getLocalisation();
|
||||||
|
if (loc == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
LocalizationType locType = makeBaseLoc(dataUnit);
|
||||||
|
double[] angles = loc.getAngles();
|
||||||
|
if (angles == null || angles.length == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
BearingType angType = new BearingType();
|
||||||
|
angType.setAngle1(constrainRadianAngle(angles[0]));
|
||||||
|
if (angles.length >= 2) {
|
||||||
|
angType.setAngle2(toSlantAngle(angles[1]));
|
||||||
|
// if (angType.getAngle2() > 360) {
|
||||||
|
// angType.setAngle2(Math.toDegrees(angles[1]));
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
Bearing bearing = new Bearing();
|
||||||
|
bearing.setCoordinate(angType);
|
||||||
|
locType.setBearing(bearing);
|
||||||
|
|
||||||
|
double[] angErr = loc.getAngleErrors();
|
||||||
|
if (angErr != null && angErr.length >= 1) {
|
||||||
|
BearingType angErrType = new BearingType();
|
||||||
|
angErrType.setAngle1(constrainRadianAngle(angErr[0]));
|
||||||
|
if (angErr.length >= 2) {
|
||||||
|
angErrType.setAngle2(constrainRadianAngle(angErr[1]));
|
||||||
|
}
|
||||||
|
bearing.setCoordinateError(angErrType);
|
||||||
|
}
|
||||||
|
|
||||||
|
return locType;
|
||||||
|
}
|
||||||
|
public LocalizationType createPolarLoc(PamDataUnit dataUnit) {
|
||||||
|
AbstractLocalisation loc = dataUnit.getLocalisation();
|
||||||
|
if (loc == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (loc.hasLocContent(LocContents.HAS_RANGE) == false) {
|
||||||
|
|
||||||
|
// do the more basic bearing type instead.
|
||||||
|
return createBearingLoc(dataUnit);
|
||||||
|
}
|
||||||
|
LocalizationType locType = makeBaseLoc(dataUnit);
|
||||||
|
double[] angles = loc.getAngles();
|
||||||
|
if (angles == null || angles.length == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
AngularCoordinateType angType = new AngularCoordinateType();
|
||||||
|
angType.setAngle1(constrainRadianAngle(angles[0]));
|
||||||
|
if (angles.length >= 2) {
|
||||||
|
angType.setAngle2(constrainRadianAngle(angles[1]));
|
||||||
|
if (angType.getAngle2() > 360) {
|
||||||
|
angType.setAngle2(toSlantAngle(angles[1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loc.hasLocContent(LocContents.HAS_RANGE)) {
|
||||||
|
angType.setDistanceM(loc.getRange(0));
|
||||||
|
}
|
||||||
|
Angular angular = new Angular();
|
||||||
|
angular.setCoordinate(angType);
|
||||||
|
locType.setAngular(angular);
|
||||||
|
|
||||||
|
double[] angErr = loc.getAngleErrors();
|
||||||
|
if (angErr != null && angErr.length >= 1) {
|
||||||
|
AngularCoordinateType angErrType = new AngularCoordinateType();
|
||||||
|
angErrType.setAngle1(constrainRadianAngle(angErr[0]));
|
||||||
|
if (angErr.length >= 2) {
|
||||||
|
angErrType.setAngle2(constrainRadianAngle(angErr[1]));
|
||||||
|
}
|
||||||
|
if (loc.hasLocContent(LocContents.HAS_RANGEERROR)) {
|
||||||
|
angErrType.setDistanceM(loc.getRangeError(0));
|
||||||
|
}
|
||||||
|
angular.setCoordinateError(angErrType);
|
||||||
|
}
|
||||||
|
|
||||||
|
return locType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType createPerpRange(PamDataUnit dataUnit) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType createCylindricalLoc(PamDataUnit dataUnit) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalizationType createCartesianLoc(PamDataUnit dataUnit) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the deployment
|
||||||
|
*/
|
||||||
|
public PDeployment getDeployment() {
|
||||||
|
return deployment;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the detectionsDocument
|
||||||
|
*/
|
||||||
|
public Detections getDetectionsDocument() {
|
||||||
|
return detectionsDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the dataBlock
|
||||||
|
*/
|
||||||
|
public PamDataBlock getDataBlock() {
|
||||||
|
return dataBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the exportParams
|
||||||
|
*/
|
||||||
|
public StreamExportParams getExportParams() {
|
||||||
|
return streamExportParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the tethysControl
|
||||||
|
*/
|
||||||
|
public TethysControl getTethysControl() {
|
||||||
|
return tethysControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the localisationHandler
|
||||||
|
*/
|
||||||
|
public LocalizationHandler getLocalisationHandler() {
|
||||||
|
return localisationHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the localisationAlgorithm
|
||||||
|
*/
|
||||||
|
public LocalisationAlgorithm getLocalisationAlgorithm() {
|
||||||
|
return localisationAlgorithm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the currentDocument
|
||||||
|
*/
|
||||||
|
public Localize getCurrentDocument() {
|
||||||
|
return currentDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void closeDocument(long endTime) {
|
||||||
|
currentDocument.getEffort().setEnd(TethysTimeFuncs.xmlGregCalFromMillis(endTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkDocument() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
21
src/tethys/localization/LocalizationCreator.java
Normal file
21
src/tethys/localization/LocalizationCreator.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package tethys.localization;
|
||||||
|
|
||||||
|
import PamguardMVC.PamDataBlock;
|
||||||
|
import PamguardMVC.PamDataUnit;
|
||||||
|
import nilus.LocalizationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creator thingy that Localisation algorithms can use to overwrite any standard
|
||||||
|
* behaviour in LocalizatinBuilder.
|
||||||
|
* @author dg50
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface LocalizationCreator {
|
||||||
|
|
||||||
|
public boolean sortLocalisationCoordinates(LocalizationBuilder localizationBuilder, PamDataBlock dataBlock) ;
|
||||||
|
|
||||||
|
public LocalizationType createLocalization(LocalizationBuilder localizationBuilder, PamDataUnit dataUnit);
|
||||||
|
|
||||||
|
public boolean checkDocument(LocalizationBuilder localizationBuilder);
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package tethys.localization;
|
package tethys.localization;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import Localiser.detectionGroupLocaliser.GroupLocResult;
|
import Localiser.detectionGroupLocaliser.GroupLocResult;
|
||||||
@ -10,14 +9,6 @@ import PamDetection.LocContents;
|
|||||||
import PamUtils.LatLong;
|
import PamUtils.LatLong;
|
||||||
import PamUtils.PamUtils;
|
import PamUtils.PamUtils;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import nilus.AngularCoordinateType;
|
|
||||||
import nilus.BearingType;
|
|
||||||
import nilus.CoordinateType;
|
|
||||||
import nilus.Helper;
|
|
||||||
import nilus.LocalizationType;
|
|
||||||
import nilus.LocalizationType.References;
|
|
||||||
import nilus.LocalizationType.References.Reference;
|
|
||||||
import nilus.Localize;
|
import nilus.Localize;
|
||||||
import nilus.SpeciesIDType;
|
import nilus.SpeciesIDType;
|
||||||
import pamMaths.PamVector;
|
import pamMaths.PamVector;
|
||||||
@ -25,17 +16,14 @@ import nilus.Localize.Effort.CoordinateReferenceSystem;
|
|||||||
import tethys.Collection;
|
import tethys.Collection;
|
||||||
import tethys.CollectionHandler;
|
import tethys.CollectionHandler;
|
||||||
import tethys.TethysControl;
|
import tethys.TethysControl;
|
||||||
import tethys.TethysTimeFuncs;
|
|
||||||
import tethys.detection.StreamDetectionsSummary;
|
import tethys.detection.StreamDetectionsSummary;
|
||||||
import tethys.niluswraps.NilusDataWrapper;
|
import tethys.niluswraps.NilusDataWrapper;
|
||||||
import tethys.niluswraps.PDeployment;
|
import tethys.niluswraps.PDeployment;
|
||||||
import tethys.output.StreamExportParams;
|
|
||||||
import tethys.pamdata.AutoTethysProvider;
|
|
||||||
import tethys.species.DataBlockSpeciesManager;
|
|
||||||
import tethys.species.SpeciesMapItem;
|
|
||||||
|
|
||||||
public class LocalizationHandler extends CollectionHandler {
|
public class LocalizationHandler extends CollectionHandler {
|
||||||
|
|
||||||
|
private int uniqueLocalisationsId = 1;
|
||||||
|
|
||||||
public LocalizationHandler(TethysControl tethysControl) {
|
public LocalizationHandler(TethysControl tethysControl) {
|
||||||
super(tethysControl, Collection.Localizations);
|
super(tethysControl, Collection.Localizations);
|
||||||
}
|
}
|
||||||
@ -93,276 +81,18 @@ public class LocalizationHandler extends CollectionHandler {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public String getLocalisationdocId(String prefix) {
|
||||||
* Create a Localization element object to add to a Localizations document.
|
|
||||||
* @param localiseDocument
|
|
||||||
* @param dataBlock
|
|
||||||
* @param dataUnit
|
|
||||||
* @param streamExportParams
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public LocalizationType createLocalization(Localize localiseDocument, PamDataBlock dataBlock, PamDataUnit dataUnit,
|
|
||||||
StreamExportParams streamExportParams) {
|
|
||||||
/*
|
/*
|
||||||
* Get the current type from the document. This should always exist, so
|
* Check the document name isn't already used and increment id as necessary.
|
||||||
* just go for it, then switch on the value to make the localisation.
|
|
||||||
*/
|
*/
|
||||||
CoordinateReferenceSystem coordSystem = localiseDocument.getEffort().getCoordinateReferenceSystem();
|
String fullId;
|
||||||
String name = coordSystem.getName();
|
while (true) {
|
||||||
CoordinateName coordName = CoordinateName.valueOf(name);
|
fullId = String.format("%s_%d", prefix, uniqueLocalisationsId++);
|
||||||
if (coordName == null) {
|
if (!tethysControl.getDbxmlQueries().documentExists(Collection.Localizations.toString(), fullId)) {
|
||||||
return null;
|
|
||||||
}
|
|
||||||
LocalizationType locEl = null;
|
|
||||||
switch (coordName) {
|
|
||||||
case Cartesian:
|
|
||||||
locEl = createCartesianLoc(localiseDocument, dataBlock, dataUnit, streamExportParams);
|
|
||||||
break;
|
break;
|
||||||
case Cylindrical:
|
|
||||||
locEl = createCylindricalLoc(localiseDocument, dataBlock, dataUnit, streamExportParams);
|
|
||||||
break;
|
|
||||||
case PerpindicularRange:
|
|
||||||
locEl = createPerpRange(localiseDocument, dataBlock, dataUnit, streamExportParams);
|
|
||||||
break;
|
|
||||||
case Polar:
|
|
||||||
locEl = createPolarLoc(localiseDocument, dataBlock, dataUnit, streamExportParams);
|
|
||||||
break;
|
|
||||||
case Range:
|
|
||||||
locEl = createRangeLoc(localiseDocument, dataBlock, dataUnit, streamExportParams);
|
|
||||||
break;
|
|
||||||
case Spherical:
|
|
||||||
locEl = createSphericalLoc(localiseDocument, dataBlock, dataUnit, streamExportParams);
|
|
||||||
break;
|
|
||||||
case UTM:
|
|
||||||
break;
|
|
||||||
case WGS84:
|
|
||||||
locEl = createWGS84Loc(localiseDocument, dataBlock, dataUnit, streamExportParams);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
return locEl;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LocalizationType makeBaseLoc(PamDataBlock dataBlock, PamDataUnit dataUnit) {
|
|
||||||
LocalizationType locType = new LocalizationType();
|
|
||||||
try {
|
|
||||||
Helper.createRequiredElements(locType);
|
|
||||||
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
locType.setTimeStamp(TethysTimeFuncs.xmlGregCalFromMillis(dataUnit.getTimeMilliseconds()));
|
|
||||||
|
|
||||||
DataBlockSpeciesManager spManager = dataBlock.getDatablockSpeciesManager();
|
|
||||||
if (spManager != null) {
|
|
||||||
SpeciesMapItem speciesStuff = spManager.getSpeciesItem(dataUnit);
|
|
||||||
SpeciesIDType species = new SpeciesIDType();
|
|
||||||
if (speciesStuff != null) {
|
|
||||||
species.setValue(BigInteger.valueOf(speciesStuff.getItisCode()));
|
|
||||||
locType.setSpeciesId(species);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return fullId;
|
||||||
References references = locType.getReferences();
|
|
||||||
if (references == null) {
|
|
||||||
references = new References();
|
|
||||||
try {
|
|
||||||
Helper.createRequiredElements(references);
|
|
||||||
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
locType.setReferences(references);
|
|
||||||
}
|
|
||||||
Reference reference = new Reference();
|
|
||||||
reference.setIndex(BigInteger.valueOf(dataUnit.getUID()));
|
|
||||||
reference.setEventRef("UID");
|
|
||||||
locType.getReferences().getReference().add(reference);
|
|
||||||
|
|
||||||
return locType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get angle in degrees constrained to 0-360
|
|
||||||
* @param radians
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private double constrainRadianAngle(double radians) {
|
|
||||||
double deg = Math.toDegrees(radians);
|
|
||||||
if (Math.abs(deg) > 3600) {
|
|
||||||
return 359.9;
|
|
||||||
}
|
|
||||||
deg = PamUtils.constrainedAngle(deg);
|
|
||||||
deg = AutoTethysProvider.roundDecimalPlaces(deg, 2);
|
|
||||||
return deg;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a vertical angle from radians to degrees and round.
|
|
||||||
* @param radians
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private double toSlantAngle(double radians) {
|
|
||||||
/*
|
|
||||||
* these really need to be constrained to -90 to 90, but I don't see what to do if
|
|
||||||
* they are outside that range.
|
|
||||||
*/
|
|
||||||
double deg = Math.toDegrees(radians);
|
|
||||||
deg= PamUtils.constrainedAngle(deg, 180);
|
|
||||||
deg = AutoTethysProvider.roundDecimalPlaces(deg, 2);
|
|
||||||
return deg;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LocalizationType createWGS84Loc(Localize localiseDocument, PamDataBlock dataBlock, PamDataUnit dataUnit,
|
|
||||||
StreamExportParams streamExportParams) {
|
|
||||||
AbstractLocalisation loc = dataUnit.getLocalisation();
|
|
||||||
if (loc == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
LatLong latlong = loc.getLatLong(0);
|
|
||||||
if (latlong == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
LocalizationType locType = makeBaseLoc(dataBlock, dataUnit);
|
|
||||||
CoordinateType coord = new CoordinateType();
|
|
||||||
coord.setX(latlong.getLongitude());
|
|
||||||
coord.setY(latlong.getLatitude());
|
|
||||||
coord.setZ(latlong.getHeight());
|
|
||||||
|
|
||||||
PamVector planarVec = loc.getPlanarVector();
|
|
||||||
locType.setCoordinate(coord);
|
|
||||||
|
|
||||||
// see if it's possible to get a beam measurement.
|
|
||||||
if (loc instanceof GroupLocalisation) {
|
|
||||||
GroupLocalisation groupLoc = (GroupLocalisation) loc;
|
|
||||||
GroupLocResult groupLocResult = groupLoc.getGroupLocaResult(0);
|
|
||||||
Double perpDist = groupLocResult.getPerpendicularDistance();
|
|
||||||
Long beamTime = groupLocResult.getBeamTime();
|
|
||||||
if (perpDist != null && beamTime != null) {
|
|
||||||
AngularCoordinateType acType = new AngularCoordinateType();
|
|
||||||
acType.setAngle1(90);
|
|
||||||
acType.setDistanceM(AutoTethysProvider.roundDecimalPlaces(perpDist,1));
|
|
||||||
locType.setAngularCoordinate(acType);
|
|
||||||
locType.setTimeStamp(TethysTimeFuncs.xmlGregCalFromMillis(beamTime));
|
|
||||||
locType.setCoordinate(null);
|
|
||||||
}
|
|
||||||
// groupLoc.getp
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try to also add a range loc.
|
|
||||||
*/
|
|
||||||
// loc.
|
|
||||||
|
|
||||||
return locType;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LocalizationType createSphericalLoc(Localize localiseDocument, PamDataBlock dataBlock, PamDataUnit dataUnit,
|
|
||||||
StreamExportParams streamExportParams) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LocalizationType createRangeLoc(Localize localiseDocument, PamDataBlock dataBlock, PamDataUnit dataUnit,
|
|
||||||
StreamExportParams streamExportParams) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LocalizationType createBearingLoc(Localize localiseDocument, PamDataBlock dataBlock, PamDataUnit dataUnit,
|
|
||||||
StreamExportParams streamExportParams) {
|
|
||||||
AbstractLocalisation loc = dataUnit.getLocalisation();
|
|
||||||
if (loc == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
LocalizationType locType = makeBaseLoc(dataBlock, dataUnit);
|
|
||||||
double[] angles = loc.getAngles();
|
|
||||||
if (angles == null || angles.length == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
BearingType angType = new BearingType();
|
|
||||||
angType.setAngle1(constrainRadianAngle(angles[0]));
|
|
||||||
if (angles.length >= 2) {
|
|
||||||
angType.setAngle2(toSlantAngle(angles[1]));
|
|
||||||
// if (angType.getAngle2() > 360) {
|
|
||||||
// angType.setAngle2(Math.toDegrees(angles[1]));
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
locType.setBearing(angType);
|
|
||||||
|
|
||||||
double[] angErr = loc.getAngleErrors();
|
|
||||||
if (angErr != null && angErr.length >= 1) {
|
|
||||||
BearingType angErrType = new BearingType();
|
|
||||||
angErrType.setAngle1(constrainRadianAngle(angErr[0]));
|
|
||||||
if (angErr.length >= 2) {
|
|
||||||
angErrType.setAngle2(constrainRadianAngle(angErr[1]));
|
|
||||||
}
|
|
||||||
locType.setBearingError(angErrType);
|
|
||||||
}
|
|
||||||
|
|
||||||
return locType;
|
|
||||||
}
|
|
||||||
private LocalizationType createPolarLoc(Localize localiseDocument, PamDataBlock dataBlock, PamDataUnit dataUnit,
|
|
||||||
StreamExportParams streamExportParams) {
|
|
||||||
AbstractLocalisation loc = dataUnit.getLocalisation();
|
|
||||||
if (loc == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (loc.hasLocContent(LocContents.HAS_RANGE) == false) {
|
|
||||||
|
|
||||||
// do the more basic bearing type instead.
|
|
||||||
return createBearingLoc(localiseDocument, dataBlock, dataUnit, streamExportParams);
|
|
||||||
}
|
|
||||||
LocalizationType locType = makeBaseLoc(dataBlock, dataUnit);
|
|
||||||
double[] angles = loc.getAngles();
|
|
||||||
if (angles == null || angles.length == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
AngularCoordinateType angType = new AngularCoordinateType();
|
|
||||||
angType.setAngle1(constrainRadianAngle(angles[0]));
|
|
||||||
if (angles.length >= 2) {
|
|
||||||
angType.setAngle2(constrainRadianAngle(angles[1]));
|
|
||||||
if (angType.getAngle2() > 360) {
|
|
||||||
angType.setAngle2(toSlantAngle(angles[1]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (loc.hasLocContent(LocContents.HAS_RANGE)) {
|
|
||||||
angType.setDistanceM(loc.getRange(0));
|
|
||||||
}
|
|
||||||
locType.setAngularCoordinate(angType);
|
|
||||||
|
|
||||||
double[] angErr = loc.getAngleErrors();
|
|
||||||
if (angErr != null && angErr.length >= 1) {
|
|
||||||
AngularCoordinateType angErrType = new AngularCoordinateType();
|
|
||||||
angErrType.setAngle1(constrainRadianAngle(angErr[0]));
|
|
||||||
if (angErr.length >= 2) {
|
|
||||||
angErrType.setAngle2(constrainRadianAngle(angErr[1]));
|
|
||||||
}
|
|
||||||
if (loc.hasLocContent(LocContents.HAS_RANGEERROR)) {
|
|
||||||
angErrType.setDistanceM(loc.getRangeError(0));
|
|
||||||
}
|
|
||||||
locType.setAngularCoordinateError(angErrType);
|
|
||||||
}
|
|
||||||
|
|
||||||
return locType;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LocalizationType createPerpRange(Localize localiseDocument, PamDataBlock dataBlock, PamDataUnit dataUnit,
|
|
||||||
StreamExportParams streamExportParams) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LocalizationType createCylindricalLoc(Localize localiseDocument, PamDataBlock dataBlock,
|
|
||||||
PamDataUnit dataUnit, StreamExportParams streamExportParams) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LocalizationType createCartesianLoc(Localize localiseDocument, PamDataBlock dataBlock, PamDataUnit dataUnit,
|
|
||||||
StreamExportParams streamExportParams) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,11 @@ package tethys.localization;
|
|||||||
* @author dg50
|
* @author dg50
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public enum LocalizationSubType {
|
public enum LocalizationSubTypes {
|
||||||
Geographic, Derived, Engineering;
|
Geographic, Derived, Engineering;
|
||||||
|
/*
|
||||||
|
* Geographic is WGS84
|
||||||
|
* Derived is something like UTM, but is basically geographic
|
||||||
|
* Engineering is relative to platform or fixed point.
|
||||||
|
*/
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user