Major code cleanup

Cleanup of imports, whitespace, etc. across all of PAMGuard. No other changes to code apart from this automatic cleanup.
This commit is contained in:
Douglas Gillespie 2024-08-27 12:48:16 +01:00
parent b9c613ea1b
commit b420fd9f9d
964 changed files with 5890 additions and 5952 deletions

View File

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.pamguard</groupId>
<artifactId>Pamguard</artifactId>
<version>2.02.13</version>
<version>2.02.13a</version>
<name>Pamguard</name>
<description>Pamguard using Maven to control dependencies</description>
<url>www.pamguard.org</url>

View File

@ -13,7 +13,6 @@ import binaryFileStorage.BinaryHeader;
import binaryFileStorage.BinaryObjectData;
import binaryFileStorage.ModuleFooter;
import binaryFileStorage.ModuleHeader;
import binaryFileStorage.PackedBinaryObject;
public class AISBinaryDataSource extends BinaryDataSource {

View File

@ -32,7 +32,7 @@ public class AISBugSearch {
// first comma separates date and NMEA data
int chPos = line.indexOf(",");
String nmeaData = line.substring(chPos+1);
if (nmeaData.contains("AIVDM") == false) {
if (!nmeaData.contains("AIVDM")) {
continue;
}
System.out.println(nmeaData);

View File

@ -44,6 +44,7 @@ public class AISControl extends PamControlledUnit implements PamSettings {
super();
this.parentFrame = parentFrame;
}
@Override
public void actionPerformed(ActionEvent e) {
AISStringsTable.show(aisControl);
}
@ -55,6 +56,7 @@ public class AISControl extends PamControlledUnit implements PamSettings {
super();
this.parentFrame = parentFrame;
}
@Override
public void actionPerformed(ActionEvent e) {
AISParameters newParams = AISDisplayDialog.showDialog(parentFrame, aisParameters);
@ -70,6 +72,7 @@ public class AISControl extends PamControlledUnit implements PamSettings {
super();
this.parentFrame = parentFrame;
}
@Override
public void actionPerformed(ActionEvent e) {
AISParameters newParams = AISSettingsDialog.showDialog(parentFrame, aisParameters);
if (newParams != null) {
@ -115,14 +118,17 @@ public class AISControl extends PamControlledUnit implements PamSettings {
aisProcess.noteNewSettings();
}
@Override
public Serializable getSettingsReference() {
return aisParameters;
}
@Override
public long getSettingsVersion() {
return AISParameters.serialVersionUID;
}
@Override
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
this.aisParameters = ((AISParameters) pamControlledUnitSettings.getSettings()).clone();

View File

@ -1,18 +1,16 @@
package AIS;
import generalDatabase.DBControlUnit;
import generalDatabase.SQLTypes;
import java.util.ListIterator;
import pamScrollSystem.ViewLoadObserver;
import nmeaEmulator.EmulatedData;
import nmeaEmulator.NMEAEmulator;
import NMEA.AcquireNmeaData;
import PamController.masterReference.MasterReferencePoint;
import PamUtils.LatLong;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamProcess;
import generalDatabase.DBControlUnit;
import generalDatabase.SQLTypes;
import nmeaEmulator.EmulatedData;
import nmeaEmulator.NMEAEmulator;
public class AISDataBlock extends PamDataBlock<AISDataUnit> implements NMEAEmulator {
@ -76,7 +74,7 @@ public class AISDataBlock extends PamDataBlock<AISDataUnit> implements NMEAEmula
}
private boolean wantData(AISDataUnit existingUnit, AISDataUnit newUnit) {
if (aisControl.aisParameters.limitRange == false) {
if (!aisControl.aisParameters.limitRange) {
return true;
}
double range = 0;
@ -133,7 +131,7 @@ public class AISDataBlock extends PamDataBlock<AISDataUnit> implements NMEAEmula
@Override
public EmulatedData getNextData() {
SQLTypes sqlTypes = DBControlUnit.findConnection().getSqlTypes();
if (getLogging().readNextEmulation(sqlTypes) == false) {
if (!getLogging().readNextEmulation(sqlTypes)) {
return null;
}
// now all data should be in the loggers table definition.

View File

@ -5,7 +5,6 @@ import java.util.ArrayList;
import NMEA.NMEABitArray;
import NMEA.NMEADataBlock;
import PamDetection.AbstractLocalisation;
import PamDetection.LocContents;
import PamUtils.PamCalendar;
import PamguardMVC.PamDataUnit;

View File

@ -7,8 +7,6 @@ import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import radardisplay.RadarProjector;
import GPS.GpsData;
import GPS.GpsDataUnit;
import Map.MapRectProjector;
@ -20,14 +18,14 @@ import PamUtils.Coordinate3d;
import PamUtils.LatLong;
import PamUtils.PamCalendar;
import PamView.GeneralProjector;
import PamView.GeneralProjector.ParameterType;
import PamView.PamDetectionOverlayGraphics;
import PamView.PamKeyItem;
import PamView.PamSymbol;
import PamView.PamSymbolType;
import PamView.GeneralProjector.ParameterType;
import PamView.symbol.SymbolData;
import PamguardMVC.PamDataUnit;
import PamguardMVC.debug.Debug;
import radardisplay.RadarProjector;
public class AISGraphics extends PamDetectionOverlayGraphics {
@ -73,12 +71,12 @@ public class AISGraphics extends PamDetectionOverlayGraphics {
AISStaticData staticData = aisDataUnit.getStaticData();
AISPositionReport positionReport = aisDataUnit.getPositionReport();
if (aisDataUnit.isComplete() == false) {
if (!aisDataUnit.isComplete()) {
return null;
}
AbstractLocalisation localisation = pamDataUnit.getLocalisation();
if (localisation == null || localisation.hasLocContent(LocContents.HAS_BEARING | LocContents.HAS_RANGE) == false) return null;
if (localisation == null || !localisation.hasLocContent(LocContents.HAS_BEARING | LocContents.HAS_RANGE)) return null;
double bearing = localisation.getBearing(0) * 180 / Math.PI;
double range = localisation.getRange(0);
Coordinate3d c3d = generalProjector.getCoord3d(bearing, range, 0);

View File

@ -1,22 +1,19 @@
package AIS;
import generalDatabase.DBProcess;
import generalDatabase.PamConnection;
import generalDatabase.PamTableDefinition;
import generalDatabase.PamTableItem;
import generalDatabase.SQLLogging;
import generalDatabase.SQLTypes;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import javax.naming.ldap.HasControls;
import PamController.PamController;
import PamView.dialog.warn.WarnOnce;
import PamguardMVC.PamDataUnit;
import generalDatabase.DBProcess;
import generalDatabase.PamConnection;
import generalDatabase.PamTableDefinition;
import generalDatabase.PamTableItem;
import generalDatabase.SQLLogging;
import generalDatabase.SQLTypes;
public class AISLogger extends SQLLogging {
@ -167,7 +164,7 @@ public class AISLogger extends SQLLogging {
acallSign = (String) callSign.getValue();
ashipName = (String) shipName.getValue();
ashipType = (String) shipType.getValue();
aetaMillis = sqlTypes.millisFromTimeStamp(eta.getValue());
aetaMillis = SQLTypes.millisFromTimeStamp(eta.getValue());
// aetaMillis = (Long) eta.getValue();
adraught = (Double) draft.getValue();
adestination = (String) destination.getValue();

View File

@ -199,7 +199,7 @@ public class AISStaticData extends AISReport implements Serializable, ManagedPar
}
switch(stationType) {
case BASESTATION:
return stationType.BASESTATION.toString();
return StationType.BASESTATION.toString();
case A:
case B:
return getVesselTypeAndCargo(type);

View File

@ -109,12 +109,13 @@ public class AISStringsTable {
class TimerListener implements ActionListener {
boolean doneLayout;
@Override
public void actionPerformed(ActionEvent ev) {
// table.
// nmeaTableData.fireTableRowsUpdated(0, 10);
aisTableData.fireTableDataChanged();
if (doneLayout == false && aisTableData.getRowCount() > 0) {
if (!doneLayout && aisTableData.getRowCount() > 0) {
doneLayout = true;
}
}
@ -134,6 +135,7 @@ public class AISStringsTable {
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnCount()
*/
@Override
public int getColumnCount() {
return tableColumns.length;
}
@ -141,6 +143,7 @@ public class AISStringsTable {
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getRowCount()
*/
@Override
public int getRowCount() {
if (aisDataBlock == null) return 0;
//System.out.println(aisDataBlock.getUnitsCount() + " rows in AIS data");
@ -150,6 +153,7 @@ public class AISStringsTable {
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
AISDataUnit aisDataUnit = aisDataBlock.getDataUnit(rowIndex, PamDataBlock.REFERENCE_CURRENT);

View File

@ -3,7 +3,6 @@ package AIS;
import NMEA.NMEADataBlock;
import NMEA.NMEADataUnit;
import PamController.PamController;
import PamDetection.AbstractLocalisation;
import PamDetection.LocContents;
import PamUtils.PamCalendar;
import PamView.symbol.StandardSymbolManager;
@ -11,7 +10,6 @@ import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import PamguardMVC.PamObservable;
import PamguardMVC.PamProcess;
import autecPhones.AutecGraphics;
/**
* Process NMEA data to extract AIS information

View File

@ -2,7 +2,7 @@ package Acquisition;
/**
* Very simplified version of the Acquisition parameters
* to be passed over the JNI to the C backend.
* to be passed over the JNI to the C backend.
* @author Doug
*
*/
@ -12,7 +12,7 @@ public class AcquisitionCParameters {
public static final int SOUNDCARD = 1;
public static final int WAVFILE = 2;
public static final int DAQCARD = 3;
public int deviceType;
public int deviceNumber;
public int sampleRate;
@ -23,7 +23,7 @@ public class AcquisitionCParameters {
public String spareString2 = null;
public int[] channelList = new int[MAXCHAN];
public String soundFile;
public int setDaqType(String daqType) {
deviceType = -1;
if (daqType.equalsIgnoreCase("Sound Card")) {
@ -37,5 +37,5 @@ public class AcquisitionCParameters {
}
return deviceType;
}
}

View File

@ -1,19 +1,19 @@
/* PAMGUARD - Passive Acoustic Monitoring GUARDianship.
* To assist in the Detection Classification and Localisation
* To assist in the Detection Classification and Localisation
* of marine mammals (cetaceans).
*
* Copyright (C) 2006
*
*
* Copyright (C) 2006
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@ -21,10 +21,6 @@
package Acquisition;
import hfDaqCard.SmruDaqSystem;
//import mcc.mccacquisition.MCCDaqSystem;
import mcc.mccacquisition.MCCDaqSystem;
import java.awt.Component;
import java.awt.Frame;
import java.awt.Window;
@ -38,20 +34,6 @@ import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import org.pamguard.x3.sud.Chunk;
import org.pamguard.x3.sud.SudFileListener;
import dataGram.DatagramManager;
import dataMap.OfflineDataMapPoint;
import dataMap.filemaps.OfflineFileServer;
import dataPlotsFX.data.TDDataProviderRegisterFX;
import dataPlotsFX.rawDataPlotFX.RawSoundProviderFX;
import pamScrollSystem.ViewLoadObserver;
import simulatedAcquisition.SimProcess;
//import xarraydaq.XArrayDaq;
import asiojni.ASIOSoundSystem;
import asiojni.NewAsioSoundSystem;
import nidaqdev.NIDAQProcess;
import Acquisition.filedate.FileDate;
import Acquisition.filedate.StandardFileDate;
import Acquisition.filetypes.SoundFileTypes;
@ -74,8 +56,6 @@ import PamController.PamGUIManager;
import PamController.PamSettingManager;
import PamController.PamSettings;
import PamController.RawInputControlledUnit;
import PamController.fileprocessing.StoreStatus;
import PamModel.PamModel;
import PamModel.SMRUEnable;
import PamUtils.FrequencyFormat;
import PamUtils.PamCalendar;
@ -91,6 +71,20 @@ import PamguardMVC.PamDataBlock;
import PamguardMVC.PamProcess;
import PamguardMVC.PamRawDataBlock;
import PamguardMVC.dataOffline.OfflineDataLoadInfo;
//import xarraydaq.XArrayDaq;
import asiojni.ASIOSoundSystem;
import asiojni.NewAsioSoundSystem;
import dataGram.DatagramManager;
import dataMap.OfflineDataMapPoint;
import dataMap.filemaps.OfflineFileServer;
import dataPlotsFX.data.TDDataProviderRegisterFX;
import dataPlotsFX.rawDataPlotFX.RawSoundProviderFX;
import hfDaqCard.SmruDaqSystem;
//import mcc.mccacquisition.MCCDaqSystem;
import mcc.mccacquisition.MCCDaqSystem;
import nidaqdev.NIDAQProcess;
import pamScrollSystem.ViewLoadObserver;
import simulatedAcquisition.SimProcess;
/**
* Main data acquisition control to get audio data from sound cards,
@ -98,9 +92,9 @@ import PamguardMVC.dataOffline.OfflineDataLoadInfo;
* <p>
* Uses a plug in architecture to allow new types to be added. This
* is done through RegisterDaqType().
*
*
* @author Doug Gillespie
*
*
* @see Acquisition.DaqSystem
*
*/
@ -133,26 +127,26 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
protected FolderInputSystem folderSystem;
private DCL5System dclSystem;
protected FileDate fileDate;
/**
* The JavaFX GUI for the sound acquisition module.
* The JavaFX GUI for the sound acquisition module.
*/
private AquisitionGUIFX aquisitionGUIFX;
private SUDNotificationManager sudNotificationManager;
protected SoundFileTypes soundFileTypes;
/**
* Main control unit for audio data acquisition.
* <p>
* It is possible to instantiate several instances of this, preferably
* with different names to simultaneously acquire sound from a number of
* sources such as multiple sound cards, fast ADC boards, etc.
* sources such as multiple sound cards, fast ADC boards, etc.
* <p>
* Each different acquisition device must implement the DaqSystem interface
* Each different acquisition device must implement the DaqSystem interface
* and register with each AcquisitionControl.
* @param name name of the Acquisition control that will appear in menus. These should be
* different for each instance of AcquistionControl since the names are used by PamProcesses
@ -164,13 +158,13 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
super(unitType, name);
acquisitionControl = this;
fileDate = new StandardFileDate(this);
pamController = PamController.getInstance();
soundFileTypes = new SoundFileTypes(this);
registerDaqSystem(new SoundCardSystem(this));
if (PlatformInfo.calculateOS() == OSType.WINDOWS) {
long tic = System.currentTimeMillis();
@ -178,13 +172,13 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
registerDaqSystem(new ASIOSoundSystem(this));
toc = System.currentTimeMillis();
if (toc-tic>1000) {
System.out.printf("Registering ASIOSoundSystem took %3.1fs\n", (double)(toc-tic)/1000.);
System.out.printf("Registering ASIOSoundSystem took %3.1fs\n", (toc-tic)/1000.);
}
tic = System.currentTimeMillis();
registerDaqSystem(new NewAsioSoundSystem(this));
toc = System.currentTimeMillis();
if (toc-tic>1000) {
System.out.printf("Registering NewAsioSoundSystem took %3.1fs\n", (double)(toc-tic)/1000.);
System.out.printf("Registering NewAsioSoundSystem took %3.1fs\n", (toc-tic)/1000.);
}
}
registerDaqSystem(new FileInputSystem(this));
@ -200,7 +194,7 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
registerDaqSystem(new MCCDaqSystem(this));
// registerDaqSystem(new RonaInputSystem(this));
}
// load the DAQ Systems found in the plugins folder
loadExternalDaqSystems();
@ -231,7 +225,7 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
}
}
setSelectedSystem();
TDDataProviderRegisterFX.getInstance().registerDataInfo(new RawSoundProviderFX(this));
}
@ -242,22 +236,22 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
acquisitionControl = this;
}
/**
* Overloaded constructor - used by the STAcquisitionControl class as a way to call
* the PamController.PamControlledUnit constructor without all of the AcquisitionControl
* code above
*
*
* @param type the type of unit
* @param name the name of the unit
*/
public AcquisitionControl(String type, String name) {
super(type, name);
}
private PamPanel systemPanel;
protected Component getStatusBarComponent() {
PamPanel p = new PamPanel();
p.add(statusBarText = new PamLabel());
@ -275,7 +269,7 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
*/
public void registerDaqSystem(DaqSystem daqSystem){
if (systemList == null) {
systemList = new ArrayList<DaqSystem>();
systemList = new ArrayList<>();
}
systemList.add(daqSystem);
//daqSystem.getItemsList();
@ -283,7 +277,7 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
}
public static ArrayList<AcquisitionControl> getControllers() {
ArrayList<AcquisitionControl> daqControllers = new ArrayList<AcquisitionControl>();
ArrayList<AcquisitionControl> daqControllers = new ArrayList<>();
PamControlledUnit pcu;
for (int i = 0; i < PamController.getInstance().getNumControlledUnits(); i++) {
pcu = PamController.getInstance().getControlledUnit(i);
@ -315,7 +309,7 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
/**
* Finds a reference to a given DAQ system based on it's type (e.g. sound card, file, etc.
* @param systemType
* @return reference to a DaqSystem object
* @return reference to a DaqSystem object
*/
public DaqSystem findDaqSystem(String systemType) {
@ -323,8 +317,8 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
if (systemType == null) systemType = acquisitionParameters.daqSystemType;
for (int i = 0; i < systemList.size(); i++) {
if (systemList.get(i).getSystemType().equals(systemType)) return systemList.get(i);
for (DaqSystem element : systemList) {
if (element.getSystemType().equals(systemType)) return element;
}
return null;
@ -347,6 +341,7 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
this.parentFrame = parentFrame;
}
@Override
public void actionPerformed(ActionEvent e) {
AcquisitionParameters newParameters = AcquisitionDialog.showDialog(parentFrame, acquisitionControl, acquisitionParameters);
if (newParameters != null) {
@ -378,28 +373,28 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
}
lastSelSystem = selSystem;
}
/**
* Check array channels have corresponding hydrophones in the array manager. Does
* not open a dialog to warn or fix.
* @return check array channel. False if array manager
* Check array channels have corresponding hydrophones in the array manager. Does
* not open a dialog to warn or fix.
* @return check array channel. False if array manager
*/
public boolean checkArrayChannels() {
int error = arrayChannelsOK();
if (error == ARRAY_ERROR_OK) {
return true;
}
else return false;
}
else return false;
}
/**
* Run a check to see that all read out channels are connected to
* a hydrophone and if not, do something about it.
* @return true if OK, or problem resolved.
* Run a check to see that all read out channels are connected to
* a hydrophone and if not, do something about it.
* @return true if OK, or problem resolved.
*/
public boolean checkArrayChannels(Frame parentFrame) {
public boolean checkArrayChannels(Frame parentFrame) {
int error = arrayChannelsOK();
if (error == ARRAY_ERROR_OK) {
@ -526,14 +521,17 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
* (non-Javadoc)
* @see PamController.PamSettings#GetSettingsReference()
*/
@Override
public Serializable getSettingsReference() {
return acquisitionParameters;
}
@Override
public long getSettingsVersion() {
return AcquisitionParameters.serialVersionUID;
}
@Override
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
// if (PamSettingManager.getInstance().isSettingsUnit(this, pamControlledUnitSettings)) {
@ -568,11 +566,11 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
// converts a list of ADC channels to a list of hydrophones
public int ChannelsToHydrophones(int channels) {
int[] hydrophoneList = getHydrophoneList();
if (hydrophoneList == null) return channels; // they are the same by default
//In viewer mode sometimes the number of channels in sound aquisition can be lost i.e.
//there are 0 channels. This causes bugs so if occurs return standard list.
if (acquisitionParameters.nChannels==0) return channels;
// they are the same by default
//In viewer mode sometimes the number of channels in sound aquisition can be lost i.e.
//there are 0 channels. This causes bugs so if occurs return standard list.
if ((hydrophoneList == null) || (acquisitionParameters.nChannels==0)) return channels;
int hydrophones = 0;
int channelListIndex;
for (int i = 0; i < PamConstants.MAX_CHANNELS; i++) {
@ -585,8 +583,8 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
}
/**
* Return a list of which channels are connected to which hydrophones in
* the currentarray.
* Return a list of which channels are connected to which hydrophones in
* the currentarray.
* @return List of hydrophone numbers.
*/
public int[] getHydrophoneList() {
@ -601,15 +599,15 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
acquisitionParameters.setHydrophoneList(hydrophoneList);
}
/**
*
* finds the ADC channel for a given hydrophone.
*
* finds the ADC channel for a given hydrophone.
* Will return -1 if no ADC channel uses this hydrophone
*
*
* @param hydrophoneId Number of a hydrophone in a PamArray
* @return the ADC channel for the given hydrophone
*/
public int findHydrophoneChannel(int hydrophoneId) {
// finds the ADC channel for a given hydrophone.
// finds the ADC channel for a given hydrophone.
// will return -1 if no ADC channel uses this hydrophone
// if no list, assume 1-1 mapping
int channelList[] = acquisitionControl.acquisitionParameters.getHardwareChannelList();
@ -664,7 +662,7 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
/**
* Getter for acquisition parameters.
* @return data acquisition parameters.
* @return data acquisition parameters.
*/
public AcquisitionParameters getAcquisitionParameters() {
return acquisitionParameters;
@ -679,6 +677,7 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
/**
* @return the offlineFileServer
*/
@Override
public OfflineFileServer getOfflineFileServer() {
return offlineFileServer;
}
@ -759,15 +758,15 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
public FileDate getFileDate() {
return fileDate;
}
/**
* Load any classes that were found in the plugins folder and implement the DaqSystemInterface interface
*/
public void loadExternalDaqSystems() {
// get a list of plugins
List<DaqSystemInterface> daqList = ((PamModel) PamController.getInstance().getModelInterface()).getDaqList();
// get a list of plugins
List<DaqSystemInterface> daqList = PamController.getInstance().getModelInterface().getDaqList();
// if there are no plugins, return
if (daqList.isEmpty()) {
return;
@ -776,7 +775,7 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
registerDaqSystem(dsi.createDAQControl(this));
}
}
/**
* Get the available DAQ systems
* @return
@ -784,16 +783,16 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
public ArrayList<DaqSystem> getSystemList() {
return this.systemList;
}
/**
* Set the acquisition parameters.
* @param params - the acquisition params to set.
* Set the acquisition parameters.
* @param params - the acquisition params to set.
*/
public void setAquisitionParams(AcquisitionParameters params) {
this.acquisitionParameters=params;
}
@Override
public PamControlledUnitGUI getGUI(int flag) {
if (flag==PamGUIManager.FX) {
@ -805,18 +804,18 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
//TODO swing
return null;
}
/**
* Get a summary of the daq settings for the QA module.
* @return summary of DAQ settings.
* Get a summary of the daq settings for the QA module.
* @return summary of DAQ settings.
*/
public String getDaqSummary() {
DaqSystem daqSys = findDaqSystem(null);
if (daqSys == null) {
return String.format("%s - currently unavailable", acquisitionParameters.daqSystemType);
}
String str = String.format("%s - %s, %3.1fVp-p",
acquisitionParameters.daqSystemType, daqSys.getDeviceName(),
String str = String.format("%s - %s, %3.1fVp-p",
acquisitionParameters.daqSystemType, daqSys.getDeviceName(),
acquisitionParameters.voltsPeak2Peak);
Preamplifier preamp = acquisitionParameters.getPreamplifier();
if (preamp != null) {
@ -825,11 +824,11 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
str += ", Sample Rate " + FrequencyFormat.formatFrequency(acquisitionParameters.sampleRate, true);
return str;
}
@Override
public String tellModule(String command) {
/**
* Get timing summary and return as a string.
* Get timing summary and return as a string.
*/
switch (command) {
case "gettimeinfo":
@ -837,35 +836,35 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
}
return super.tellModule(command);
}
/**
* Get a summary of time information as to what's going on in the DAQ
* @return time summary
*/
private String getTimeInfoString() {
/*
*
*
sprintf(returned,"%s:%lld,%lld,%ld,%lld",getModuleName(),calendar->getRawStartTime(),
calendar->getMillisecondTime(),(int)daqProcess->getSampleRate(),acquiredSamples);
*/
return String.format("%s:%d,%d,%d,%d", getUnitName(), PamCalendar.getSessionStartTime(), PamCalendar.getTimeInMillis(),
return String.format("%s:%d,%d,%d,%d", getUnitName(), PamCalendar.getSessionStartTime(), PamCalendar.getTimeInMillis(),
(int) acquisitionProcess.getSampleRate(), acquisitionProcess.getTotalSamples(0));
}
@Override
public void pamHasStopped() {
acquisitionProcess.pamHasStopped();
}
@Override
public String getModuleSummary(boolean clear) {
return getDaqProcess().getRawDataBlock().getSummaryString(clear);
}
/**
* Get the SUD processing notification manager.
* @return SUD processing notification manager.
* Get the SUD processing notification manager.
* @return SUD processing notification manager.
*/
public SUDNotificationManager getSUDNotificationManager() {
if (sudNotificationManager == null) {
@ -873,8 +872,8 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
}
return sudNotificationManager;
}
@Override
public int getRawInputType() {
DaqSystem system = acquisitionProcess.getRunningSystem();
@ -889,17 +888,18 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
public InputStoreInfo getStoreInfo(boolean detail) {
return getDaqProcess().getStoreInfo(detail);
}
@Override
public boolean setAnalysisStartTime(long startTime) {
return getDaqProcess().setAnalysisStartTime(startTime);
}
/**
* Very specific command handler for batch status which will only work
* with the folderinputSystem.
* Very specific command handler for batch status which will only work
* with the folderinputSystem.
* @return
*/
@Override
public String getBatchStatus() {
DaqSystem runningSystem = getAcquisitionProcess().getRunningSystem();
if (runningSystem instanceof FolderInputSystem) {
@ -909,5 +909,5 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
return null;
}
}
}

View File

@ -30,87 +30,87 @@ import dataMap.filemaps.OfflineFileDialogPanel;
import dataMap.filemaps.OfflineFileParameters;
/**
* Main dialog for acquisition control. Takes plug in panels from
* Main dialog for acquisition control. Takes plug in panels from
* the various sound systems to give more device specific controls where
* necessary.
*
* necessary.
*
* @author Doug Gillespie
*
*/
public class AcquisitionDialog extends PamDialog {
private static AcquisitionParameters acquisitionParameters;
private static AcquisitionDialog singleInstance;
private static AcquisitionControl acquisitionControl;
private OfflineFileDialogPanel offlineDAQDialogPanel;
private PPSDialogPanel ppsDialogPanel;
private DaqSystem currentDaqSystem;
private JComboBox deviceType;
private JPanel mainPanel;
private JComponent deviceSpecificPanel;
private JTextField sampleRate, nChannels, vPeak2Peak;
private JTextField preampGain;
private JTextField preampGain;
// bandwidth0, bandwidth1;
private JCheckBox subtractDC;
private JTextField dcTimeconstant;
// public int channelList[] = new int[PamConstants.MAX_CHANNELS];
//
// private JLabel panelChannelLabel[] = new JLabel[PamConstants.MAX_CHANNELS];
// private JComboBox panelChannelList[] = new JComboBox[PamConstants.MAX_CHANNELS];
private ChannelListPanel standardChannelListPanel = new StandardChannelListPanel();
private ChannelListPanel currentChannelListPanel;
private JPanel channelListPanelArea = new JPanel();
//private static AcquisitionParameters acquisitionParameters; //Xiao Yan Deng
/**
* Main dialog for data acquisition control
* <p>
* When shown, the dialog contains three main panels.
* <p>The top one shows
* a list of available DaqSystems (e.g. sound cards, NI cards, etc.
* Main dialog for data acquisition control
* <p>
* When shown, the dialog contains three main panels.
* <p>The top one shows
* a list of available DaqSystems (e.g. sound cards, NI cards, etc.
* >p>
* The middle panel selected based on the type of DaqSytem and is implemented differently
* within each DaqSystem. For instance, the sound card DaqSystem displays a list
* of available sound cards. The file system displays a list of recent files,
* of available sound cards. The file system displays a list of recent files,
* systems for other ADC cards mght display a channel selector and gain settings
* specific for a particular device.
* specific for a particular device.
* <p>
* The bottom panel shows the number of channels, sample rate, and device sensitivity.
* The bottom panel shows the number of channels, sample rate, and device sensitivity.
* The selected DaqSystem is queried to see if these are fixed, unknown or user entered
* and enables the controls accordingly. If they are set by the DaqSystem, the
* and enables the controls accordingly. If they are set by the DaqSystem, the
* DaqSystem should set them explicity using setSampleRate(), setChannels, and
* setVPeak2Peak
* setVPeak2Peak
*
*/
private AcquisitionDialog (Frame parentFrame) {
super(parentFrame, "Audio Data Acquisition", false);
mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
mainPanel.add(DeviceTypePanel());
mainPanel.add(SamplingPanel());
mainPanel.add(CalibrationPanel());
nChannels.addActionListener(new NumChannels());
nChannels.addActionListener(new NumChannels());
setHelpPoint("sound_processing.AcquisitionHelp.docs.AcquisitionConfiguration");
if (PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW) {
JTabbedPane tabbedPane = new JTabbedPane();
offlineDAQDialogPanel = new OfflineFileDialogPanel(acquisitionControl, this);
@ -131,45 +131,45 @@ public class AcquisitionDialog extends PamDialog {
setParams(); //Xiao Yan Deng
sortChannelLists(); // Xiao Yan Deng
}
/**
* Clear the static instance so that the dialog is
* totally rebuilt next time it's launched.
* Clear the static instance so that the dialog is
* totally rebuilt next time it's launched.
*/
static public void clearInstance() {
singleInstance = null;
}
/**
* Shows the data acquisition dialog.
* Shows the data acquisition dialog.
* @param daqControl the calling AcquisitionControl
* @param oldParams current parameters from the AcquisitionControl
* @return new parameters selected in the dialog
* @see AcquisitionControl
*/
static public AcquisitionParameters showDialog(Frame parentFrame, AcquisitionControl daqControl, AcquisitionParameters oldParams) {
acquisitionParameters = oldParams.clone();
acquisitionControl = daqControl;
// singleInstance = null;
if (singleInstance == null || singleInstance.getOwner() != parentFrame) {
singleInstance = new AcquisitionDialog(parentFrame);
}
singleInstance.setParams();
singleInstance.sortChannelLists();
singleInstance.setVisible(true);
singleInstance.sortChannelLists(); // Xiao Yan Deng
return acquisitionParameters;
}
private void setParams() {
// fill in the different device types.
deviceType.removeAllItems();
int ind = 0;
@ -180,23 +180,23 @@ public class AcquisitionDialog extends PamDialog {
}
}
deviceType.setSelectedIndex(ind);
newDeviceType();
setSampleRate(acquisitionParameters.sampleRate);
setChannels(acquisitionParameters.nChannels);
setVPeak2Peak(acquisitionParameters.voltsPeak2Peak);
// preampGain.setText(String.format("%.1f", acquisitionParameters.preamplifier.getGain()));
setPreampGain(acquisitionParameters.preamplifier.getGain());
// bandwidth0.setText(String.format("%.1f", acquisitionParameters.preamplifier.getBandwidth()[0]));
// bandwidth1.setText(String.format("%.1f", acquisitionParameters.preamplifier.getBandwidth()[1]));
subtractDC.setSelected(acquisitionParameters.subtractDC);
dcTimeconstant.setText(String.format("%3.1f", acquisitionParameters.dcTimeConstant));
if (currentDaqSystem != null) currentDaqSystem.dialogSetParams();
if (currentChannelListPanel != null) {
@ -206,24 +206,24 @@ public class AcquisitionDialog extends PamDialog {
if (offlineDAQDialogPanel != null) {
offlineDAQDialogPanel.setParams();
}
if (ppsDialogPanel != null) {
ppsDialogPanel.setParams(acquisitionParameters.getPpsParameters());
}
enableControls();
}
/**
* Called by the specific DaqSystem to set sample rate when it is set by
* the DaqSystem (for instance FileInputSystem will set sample rate to the
* sample rate of data in the current file.
* the DaqSystem (for instance FileInputSystem will set sample rate to the
* sample rate of data in the current file.
* @param sampleRate Current sample rate
*/
public void setSampleRate(float sampleRate) {
this.sampleRate.setText(String.format("%.0f", sampleRate));
}
/**
* Get the sample rate, or null if sample rate is not a valid number
* @return sample rate or null
@ -239,15 +239,15 @@ public class AcquisitionDialog extends PamDialog {
/**
* Called by the specific DaqSystem to set the number of channels when it is set by
* the DaqSystem (for instance FileInputSystem will set it to the
* number of channels in the current file.
* the DaqSystem (for instance FileInputSystem will set it to the
* number of channels in the current file.
* @param nChannels Number of channels
*/
public void setChannels(int nChannels) {
this.nChannels.setText(String.format("%d", nChannels));
}
/**
/**
* @return the number of channels or null if invalid number
*/
public Integer getChannels() {
@ -258,7 +258,7 @@ public class AcquisitionDialog extends PamDialog {
return null;
}
}
public void setPreampGain(double gain) {
preampGain.setText(String.format("%.1f", gain));
}
@ -266,13 +266,13 @@ public class AcquisitionDialog extends PamDialog {
/**
* Called by the specific DaqSystem to set the peak to peak voltage range.
* This is used for calculating absolute SPL's in various detectors
* the DaqSystem
* the DaqSystem
* @param vPeak2Peak Peak to Peak input voltage
*/
public void setVPeak2Peak(double vPeak2Peak) {
this.vPeak2Peak.setText(String.format("%4.3f", vPeak2Peak));
}
// read parameters back from the dialog
@Override
public boolean getParams() {
@ -287,15 +287,15 @@ public class AcquisitionDialog extends PamDialog {
// bw[0] = Double.valueOf(bandwidth0.getText());
// bw[1] = Double.valueOf(bandwidth1.getText());
// acquisitionParameters.preamplifier.setBandwidth(bw);
if(!currentDaqSystem.areSampleSettingsOk(acquisitionParameters.nChannels, acquisitionParameters.sampleRate)){
if(!currentDaqSystem.areSampleSettingsOk(acquisitionParameters.nChannels, acquisitionParameters.sampleRate)){
currentDaqSystem.showSampleSettingsDialog(this);
return false;
}
}
int nP = getNumChannels();
if (getCurrentDaqSystem().supportsChannelLists() && currentChannelListPanel != null) {
if (currentChannelListPanel.isDataOk() == false) {
if (!currentChannelListPanel.isDataOk()) {
return false;
}
int[] chL = currentChannelListPanel.getChannelList();
@ -312,7 +312,7 @@ public class AcquisitionDialog extends PamDialog {
Ex.printStackTrace();
return false;
}
acquisitionParameters.subtractDC = subtractDC.isSelected();
if (acquisitionParameters.subtractDC) {
try {
@ -325,8 +325,8 @@ public class AcquisitionDialog extends PamDialog {
return showWarning("The DC bacround subtractino time constant must be greater than zero");
}
}
if (offlineDAQDialogPanel != null) {
OfflineFileParameters ofp = offlineDAQDialogPanel.getParams();
if (ofp == null) {
@ -346,13 +346,13 @@ public class AcquisitionDialog extends PamDialog {
return false;
}
}
return true;
}
/**
* Read the latest sample rate value.
* @return sample rate Hz.
/**
* Read the latest sample rate value.
* @return sample rate Hz.
*/
public double readSampleRate() {
double sr = 0;
@ -365,22 +365,24 @@ public class AcquisitionDialog extends PamDialog {
return sr;
}
@Override
public void cancelButtonPressed() {
acquisitionParameters = null;
}
@Override
public void restoreDefaultSettings() {
}
private class NewDeviceType implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
newDeviceType();
}
}
private class NumChannels implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
sortChannelLists();
}
@ -395,7 +397,7 @@ public class AcquisitionDialog extends PamDialog {
deviceType.addActionListener(new NewDeviceType());
return p;
}
/**
* Only need to show the channel panel for certain device types,
*
@ -415,20 +417,20 @@ public class AcquisitionDialog extends PamDialog {
channelListPanelArea.add(standardChannelListPanel.getComponent());
// channelListPanel.setVisible(currentSystem.supportsChannelLists());
}
}
private JPanel SamplingPanel () {
JPanel sP = new PamAlignmentPanel(new BorderLayout(), BorderLayout.WEST);
JPanel p = new JPanel();
sP.setBorder(new TitledBorder("Sampling"));
GridBagLayout layout;
p.setLayout(layout = new GridBagLayout());
GridBagConstraints constraints = new PamGridBagContraints();
constraints.anchor = GridBagConstraints.EAST;
constraints.insets = new Insets(2,2,2,2);
constraints.fill = GridBagConstraints.NONE;
@ -450,31 +452,31 @@ public class AcquisitionDialog extends PamDialog {
constraints.gridx ++;
constraints.gridwidth = 2;
addComponent(p, new JLabel(" (hit enter)"), constraints);
sP.add(BorderLayout.NORTH, p);
// constraints.gridy++;
// constraints.gridx = 0;
// constraints.gridwidth = 4;
standardChannelListPanel = new StandardChannelListPanel();
// addComponent(p, channelListPanel, constraints);
constraints.insets = new Insets(2,2,2,2);
sP.add(BorderLayout.CENTER, channelListPanelArea);
return sP;
}
//
//
// private JPanel createStandardChannelListPanel() {
//
// /* code for select channel */
// /*
// * put this in a separate panel so it can be hidden if
// * it's not possible to change these parameters.
// *
// * put this in a separate panel so it can be hidden if
// * it's not possible to change these parameters.
// *
// * Text information updated DG & JG 12/8/08
// */
// JPanel cP;
@ -494,7 +496,7 @@ public class AcquisitionDialog extends PamDialog {
// s += "<br>So be aware. If you've put a plug into socket 1, <br>you probably want to select channel 0, etc.</html>";
// for (int i = 0; i < PamConstants.MAX_CHANNELS; i++){ //Xiao Yan Deng
// //for (int i = 0; i < getNumChannels(); i++){
//
//
// if (i%2 ==0){
// c2.gridx = 0;
// c2.gridy ++;
@ -509,28 +511,28 @@ public class AcquisitionDialog extends PamDialog {
// else {
// spaceStr = "";
// }
// addComponent(cP, panelChannelLabel[i] =
// addComponent(cP, panelChannelLabel[i] =
// new JLabel(spaceStr + " SW Ch " + i + " = HW Ch "), c2);
// c2.gridx ++;
// //constraints.gridwidth = 2;
// addComponent(cP, panelChannelList[i] = new JComboBox(), c2);
// panelChannelLabel[i].setToolTipText(s);
// panelChannelList[i].setToolTipText(s);
//
//
// }
// return cP;
// }
//
//
private JPanel CalibrationPanel() {
JPanel p = new PamAlignmentPanel(BorderLayout.WEST) ;
p.setBorder(new TitledBorder("Calibration"));
GridBagLayout layout;
p.setLayout(layout = new GridBagLayout());
GridBagConstraints constraints = new PamGridBagContraints();
constraints.anchor = GridBagConstraints.WEST;
constraints.insets = new Insets(2,2,2,2);
constraints.gridx = 0;
@ -588,13 +590,13 @@ public class AcquisitionDialog extends PamDialog {
enableControls();
}
});
String t = "Some input devices have a fixed (DC) offset in their voltage measurement.\n" +
String t = "Some input devices have a fixed (DC) offset in their voltage measurement.\n" +
"Subtracting this off can lead to improved PAMGuard performance.";
dcTimeconstant.setToolTipText(t);
subtractDC.setToolTipText(t);
return p;
}
@ -604,10 +606,10 @@ public class AcquisitionDialog extends PamDialog {
/**
*
*
* @return the number of channels
*/
int getNumChannels() {
int getNumChannels() {
try {
return Integer.valueOf(nChannels.getText());
}
@ -616,7 +618,7 @@ public class AcquisitionDialog extends PamDialog {
}
}
private void sortChannelLists() {
private void sortChannelLists() {
// first of all, only show the ones in range of nPanels
if (currentChannelListPanel != null) {
currentChannelListPanel.setNumChannels(getNumChannels());
@ -624,64 +626,64 @@ public class AcquisitionDialog extends PamDialog {
pack();
}
/**
* Called when the device type changes. Loads the appropriate panel for
* Called when the device type changes. Loads the appropriate panel for
* the newly selected DaqSystem into the dialog
*
*/
*/
private void newDeviceType() {
int devNumber = deviceType.getSelectedIndex();
if (devNumber < 0) return;
// remove the old type specific panel and replace it with a new one.
if (deviceSpecificPanel != null) {
mainPanel.remove(deviceSpecificPanel);
}
currentDaqSystem = acquisitionControl.systemList.get(devNumber);
deviceSpecificPanel = currentDaqSystem.getDaqSpecificDialogComponent(this);
if (deviceSpecificPanel != null) {
mainPanel.add(deviceSpecificPanel, 1);
currentDaqSystem.dialogSetParams();
}
sampleRate.setEnabled(currentDaqSystem.getMaxSampleRate() != DaqSystem.PARAMETER_FIXED);
nChannels.setEnabled(currentDaqSystem.getMaxChannels() != DaqSystem.PARAMETER_FIXED);
vPeak2Peak.setEnabled(currentDaqSystem.getPeak2PeakVoltage(0) == DaqSystem.PARAMETER_UNKNOWN);
showHideChannelPanel();
if (currentChannelListPanel != null) {
currentChannelListPanel.setNumChannels(getNumChannels());
currentChannelListPanel.setParams(acquisitionParameters.getHardwareChannelList());
}
pack();
}
public DaqSystem getCurrentDaqSystem() {
return currentDaqSystem;
}
/**
*
*
* @return the sample rate component
*/
public JTextField getSampleRateComponent() {
return sampleRate;
}
/**
*
* @return the nChannels component.
*
* @return the nChannels component.
*/
public JTextField getnChanComponent() {
return nChannels;
}
}

View File

@ -1,20 +1,16 @@
package Acquisition;
import java.sql.Types;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import generalDatabase.PamTableDefinition;
import generalDatabase.PamTableItem;
import generalDatabase.SQLLogging;
import generalDatabase.SQLTypes;
import java.sql.Types;
import PamUtils.PamCalendar;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import PamguardMVC.debug.Debug;
import clickTrainDetector.CTDataUnit;
/**
* Very simple concrete implementation of SQLLogging to log the starts
* Very simple concrete implementation of SQLLogging to log the starts
* and stops of PAMGUARD in the database.
* @author Doug Gillespie
*
@ -22,16 +18,16 @@ import clickTrainDetector.CTDataUnit;
public class AcquisitionLogging extends SQLLogging {
AcquisitionControl acquisitionControl;
PamTableDefinition tableDef;
PamTableItem adcClockTime, adcClockMillis, rawADCTime, status, reason, daqSystemType, sampleRate, nChannels, voltsPeak2Peak,
PamTableItem adcClockTime, adcClockMillis, rawADCTime, status, reason, daqSystemType, sampleRate, nChannels, voltsPeak2Peak,
gain, duration, clockError, samples, gSamples, GPSPPSTime, serverTime, daqSystemName;
public AcquisitionLogging(PamDataBlock pamDataBlock, AcquisitionControl acquisitionControl) {
super(pamDataBlock);
this.acquisitionControl = acquisitionControl;
tableDef = new PamTableDefinition(pamDataBlock.getDataName(), UPDATE_POLICY_OVERWRITE);
tableDef.addTableItem(adcClockTime = new PamTableItem("ADC Clock", Types.TIMESTAMP, "Time based on PC clock and samples since last PC clock read"));
tableDef.addTableItem(adcClockMillis = new PamTableItem("ADC Clock millis", Types.INTEGER, "Millis for adcClockTime if not supported by database"));
@ -50,7 +46,7 @@ public class AcquisitionLogging extends SQLLogging {
tableDef.addTableItem(duration = new PamTableItem("duration", Types.DOUBLE, "Time since start in seconds"));
tableDef.addTableItem(clockError = new PamTableItem("clockError", Types.DOUBLE, "Clock error in milliseconds"));
tableDef.addTableItem(serverTime = new PamTableItem("Server Time", Types.TIMESTAMP, "Time taken from an Internet time server"));
setTableDefinition(tableDef);
}
@ -68,8 +64,8 @@ public class AcquisitionLogging extends SQLLogging {
adcClockMillis.setValue((int)(ds.getAdcMilliseconds()%1000));
rawADCTime.setValue(sqlTypes.getTimeStamp(ds.getRawADCMillis()));
long s = ds.getSamples();
gSamples.setValue((long)(s/1000000000));
samples.setValue((long) (s%1000000000));
gSamples.setValue(s/1000000000);
samples.setValue(s%1000000000);
Long gT = ds.getGpsPPSMilliseconds();
if (gT == null) {
GPSPPSTime.setValue(null);
@ -84,7 +80,7 @@ public class AcquisitionLogging extends SQLLogging {
sampleRate.setValue(ds.getSampleRate());
nChannels.setValue(ds.getNChannels());
voltsPeak2Peak.setValue(ds.getVoltsPeak2Peak());
gain.setValue((float) daqParameters.getPreamplifier().getGain());
gain.setValue((float) daqParameters.getPreamplifier().getGain());
duration.setValue(ds.getSampleDuration());
clockError.setValue(ds.clockError);
Long sTime = ds.getServerTime();
@ -95,55 +91,55 @@ public class AcquisitionLogging extends SQLLogging {
serverTime.setValue(sqlTypes.getTimeStamp(sTime));
}
}
@Override
protected DaqStatusDataUnit createDataUnit(SQLTypes sqlTypes, long timeMilliseconds, int databaseIndex) {
// Debug.out.println("DaqStatusDataUnit sql Logging: " + PamCalendar.formatDateTime(timeMilliseconds) + " ADC: " +adcClockTime.getDeblankedStringValue() + " Samples: " + samples.getLongValue());
long adcClock ;
// Debug.out.println("DaqStatusDataUnit sql Logging: " + PamCalendar.formatDateTime(timeMilliseconds) + " ADC: " +adcClockTime.getDeblankedStringValue() + " Samples: " + samples.getLongValue());
long adcClock ;
if (adcClockTime.getDeblankedStringValue()!=null) {
adcClock = SQLTypes.millisFromTimeStamp(adcClockTime.getValue());
adcClock = SQLTypes.millisFromTimeStamp(adcClockTime.getValue());
}
else {
adcClock =-1;
adcClock =-1;
}
Long adcRawClock = SQLTypes.millisFromTimeStamp(rawADCTime.getValue());
if (adcRawClock == null) {
adcRawClock = 0L;
}
//long adcClockMillisVal = adcClockMillis.getLongValue();
long gpsPPSClock ;
//long adcClockMillisVal = adcClockMillis.getLongValue();
long gpsPPSClock ;
if (GPSPPSTime.getDeblankedStringValue()!=null) {
gpsPPSClock = SQLTypes.millisFromTimeStamp(GPSPPSTime.getValue());
gpsPPSClock = SQLTypes.millisFromTimeStamp(GPSPPSTime.getValue());
}
else {
gpsPPSClock=1;
gpsPPSClock=1;
}
Long samplesVal = samples.getLongValue();
String reasonVal = reason.getDeblankedStringValue();
String statusVal = status.getDeblankedStringValue();
Long samplesVal = samples.getLongValue();
double clockErrVal = clockError.getDoubleValue();
String reasonVal = reason.getDeblankedStringValue();
String statusVal = status.getDeblankedStringValue();
double clockErrVal = clockError.getDoubleValue();
double durationValue = duration.getDoubleValue();
String systemName = daqSystemName.getStringValue();
// DaqStatusDataUnit(long timeMilliseconds, long adcMilliseconds, long samples, Long gpsPPSMillis,
// String status, String reason,
// DaqStatusDataUnit(long timeMilliseconds, long adcMilliseconds, long samples, Long gpsPPSMillis,
// String status, String reason,
// AcquisitionParameters daqParameters, double duration, double clockError)
// Debug.out.println("DaqStatusDataUnit sql Logging: " + samplesVal);
DaqStatusDataUnit dataUnit = new DaqStatusDataUnit(timeMilliseconds, adcClock, adcRawClock, samplesVal, gpsPPSClock,
statusVal, reasonVal, null, systemName, durationValue, clockErrVal) ;
return dataUnit;
// Debug.out.println("DaqStatusDataUnit sql Logging: " + samplesVal);
DaqStatusDataUnit dataUnit = new DaqStatusDataUnit(timeMilliseconds, adcClock, adcRawClock, samplesVal, gpsPPSClock,
statusVal, reasonVal, null, systemName, durationValue, clockErrVal) ;
return dataUnit;
}
}

View File

@ -1,7 +1,5 @@
package Acquisition;
import hfDaqCard.SmruDaqSystem;
import java.io.Serializable;
import java.lang.reflect.Field;
@ -13,58 +11,59 @@ import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamguardMVC.PamConstants;
import hfDaqCard.SmruDaqSystem;
public class AcquisitionParameters implements Serializable, Cloneable, ManagedParameters {
static final long serialVersionUID = 2;
String daqSystemType = "Sound Card";
public float sampleRate = 48000;
public int nChannels = 2;
public double voltsPeak2Peak = 5;
private transient boolean isNetReceive;
/**
* List of channels data are acquired from (not necessarily 0,1,2, etc.)
* List of channels data are acquired from (not necessarily 0,1,2, etc.)
* With NI boards, this has become a pain since if multiple boards are
* used, there may be repeats within this list.
* used, there may be repeats within this list.
*/
private int channelList[];// = new int[PamConstants.MAX_CHANNELS]; //Xiao Yan Deng
public Preamplifier preamplifier = new Preamplifier(0, new double[] {0, 20000});
/**
* Hydrophone list is a short list of length equal to the number of channels, so if
* your channel list does not start at zero, you have to first use the
* channelListIndexes before using this lookup table.
* your channel list does not start at zero, you have to first use the
* channelListIndexes before using this lookup table.
*/
private int[] hydrophoneList;
/**
* list of indexes for each hardware channel in channelList (i.e. opposite LUT)
*/
transient int[] channelListIndexes;
transient int[] channelListIndexes;
private PPSParameters ppsParameters;
public boolean subtractDC;
public double dcTimeConstant; // time constant for DC subtraction in seconds.
public double dcTimeConstant; // time constant for DC subtraction in seconds.
public AcquisitionParameters() {
getHardwareChannelList(); // automatically create a channellist.
/*
* this won't work since the constructor is only ever called for a new config, so if an old
* config is loaded, this will never be called.
* config is loaded, this will never be called.
*/
isNetReceive = PamController.getInstance().getRunMode() == PamController.RUN_NETWORKRECEIVER;
}
@Override
public AcquisitionParameters clone() {
try {
@ -106,7 +105,7 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
/**
* Gets a list of hydrophones from channel Indexes (not channel numbers)
* @return list of hydrophones.
* @return list of hydrophones.
*/
public int[] getHydrophoneList() {
if ((hydrophoneList == null || hydrophoneList.length < nChannels) && nChannels > 0) {
@ -119,15 +118,15 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
}
/**
* Set a hydrophone list.
* Set a hydrophone list.
* @param hydrophoneList
*/
public void setHydrophoneList(int[] hydrophoneList) {
this.hydrophoneList = hydrophoneList;
}
/**
* Gets a hydrophone number from a channel number (not channel index)
/**
* Gets a hydrophone number from a channel number (not channel index)
* @param channel software channel number
* @return a specific hydrophone number from the selected array
*/
@ -146,18 +145,15 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
if (channel < 0) {
return channel;
}
if (channelListIndexes.length <= channel) return -1;
// this line no longer needed now that software channels are alwasy 0,1,2,3
// even if hardware channels are more random.
// even if hardware channels are more random.
// channel = this.channelListIndexes[channel];
//channel = this.channelListIndexes[channel];
if (channel < 0) {
return -1;
}
if (hydrophoneList.length <= channel) return -1;
if ((channelListIndexes.length <= channel) || (channel < 0) || (hydrophoneList.length <= channel)) return -1;
return hydrophoneList[channel];
}
public int getNChannels() {
return nChannels;
}
@ -165,7 +161,7 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
public void setNChannels(int channels) {
nChannels = channels;
}
public int[] getNChannelList(){
return channelList;
}
@ -196,7 +192,7 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
/**
* Gets / creates a list of hardware channels used. <p>
* i.e. converts from channel indexes to channel numbers.
* i.e. converts from channel indexes to channel numbers.
* @return List of channel numbers
*/
public int[] getHardwareChannelList() {
@ -221,7 +217,7 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
this.channelList = channelList;
sortChannelListIndexes();
}
public void setChannelList(int index, int channelNumber) {
getHardwareChannelList();
if (index >= channelList.length) {
@ -230,7 +226,7 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
channelList[index] = channelNumber;
sortChannelListIndexes();
}
/**
* Creates a default channel list 0,1,2,3,4 etc.
*/
@ -241,19 +237,19 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
}
sortChannelListIndexes();
}
/**
* Gets the channel number for a particular channel index.
* Gets the channel number for a particular channel index.
* @param index channel index
* @return channel number
*/
public int getChannelList(int index) {
return getHardwareChannelList()[index];
}
/**
* Gets the complete list of channel indexes.
* @return list of channel indexes.
* Gets the complete list of channel indexes.
* @return list of channel indexes.
*/
public int[] getChannelListIndexes() {
if (channelListIndexes == null) {
@ -261,7 +257,7 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
}
return channelListIndexes;
}
/**
* Sets the channel list indeces
* @param channelListIndexes
@ -269,11 +265,11 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
public void setChannelListIndexes(int[] channelListIndexes) {
this.channelListIndexes = channelListIndexes;
}
/**
* Gets the channel index for a particular hardware channel
* Gets the channel index for a particular hardware channel
* @param channel
* @return channel index or -1 if it doesn't exist.
* @return channel index or -1 if it doesn't exist.
*/
public int getChannelListIndexes(int channel) {
if (channelListIndexes == null) {
@ -284,10 +280,10 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
}
else return -1;
}
/**
* Creates a set of easily accessible channel indexes
* which can be used to convert from channel numbers to
* which can be used to convert from channel numbers to
* channel index e.g. used channel numbers might be 3 and 4
* so the listIndexes will be {-1 -1 -1 0 1]
*/
@ -297,7 +293,7 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
for (int i = 0; i < nChannels; i++) {
max = Math.max(max, channelList[i]);
}
channelListIndexes = new int[max+1];
for (int i = 0; i < channelListIndexes.length; i++) {
channelListIndexes[i] = -1;

View File

@ -1,19 +1,13 @@
package Acquisition;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.swing.Timer;
import Acquisition.gpstiming.PPSDetector;
import Acquisition.gpstiming.PPSParameters;
import Array.ArrayManager;
import Array.Hydrophone;
import Array.PamArray;
import Array.Preamplifier;
import Filters.Filter;
@ -23,40 +17,29 @@ import Filters.FilterType;
import Filters.IirfFilter;
import PamController.DataInputStore;
import PamController.InputStoreInfo;
import PamController.OfflineDataStore;
import PamController.PamControlledUnit;
import PamController.PamController;
import PamController.fileprocessing.ReprocessManager;
import PamController.fileprocessing.StoreStatus;
import PamController.status.BaseProcessCheck;
import PamController.status.ProcessCheck;
import PamDetection.RawDataUnit;
import PamUtils.PamCalendar;
import PamUtils.PamUtils;
import PamUtils.time.ntp.PamNTPTime;
import PamUtils.time.ntp.PamNTPTimeException;
import PamguardMVC.PamConstants;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import PamguardMVC.PamObservable;
import PamguardMVC.PamObserver;
import PamguardMVC.PamProcess;
import PamguardMVC.PamRawDataBlock;
import PamguardMVC.RequestCancellationObject;
import PamguardMVC.dataOffline.OfflineDataLoadInfo;
import dataGram.DatagramManager;
import dataMap.OfflineDataMapPoint;
import pamScrollSystem.AbstractScrollManager;
import pamScrollSystem.ViewLoadObserver;
/**
* Data acquisition process for all types of input device.
* This arranges the output data block and starts and stops the
* device in the detected DaqSystem. Each DaqSystem should
* Data acquisition process for all types of input device.
* This arranges the output data block and starts and stops the
* device in the detected DaqSystem. Each DaqSystem should
* operate a different thread to read the device / file and add its
* data to the volatile Vector newDataUnits. AcquisitonProcess will
* poll newDataUnits on a timer and when new data is found, put that
* data into PamDataUnits and PamRawDataBlocks to be sent out for
* data to the volatile Vector newDataUnits. AcquisitonProcess will
* poll newDataUnits on a timer and when new data is found, put that
* data into PamDataUnits and PamRawDataBlocks to be sent out for
* processing.
* <p>
* @author Doug Gillespie
@ -66,9 +49,9 @@ import pamScrollSystem.ViewLoadObserver;
*
*/
public class AcquisitionProcess extends PamProcess {
public static final int LASTDATA = 2; // don't use zero since need to see if no notification has been received.
public static final int LASTDATA = 2; // don't use zero since need to see if no notification has been received.
public static final int FIRSTDATA = 1;
AcquisitionControl acquisitionControl;
@ -90,23 +73,23 @@ public class AcquisitionProcess extends PamProcess {
private volatile boolean bufferOverflow = false;
private Timer restartTimer;
private Filter sampleRateErrorFilter;
private double totalExtraSamples;
private DaqStatusDataUnit previousDaqStatus = null;
private long millisecondSampleOffset;
private AudioDataQueue newDataQueue = new AudioDataQueue();
private final double sqrt2 = Math.sqrt(2.0);
private Object runingSynchObject = new Object();
private PPSDetector ppsDetector;
private DCFilter dcFilter;
protected AcquisitionProcess(AcquisitionControl acquisitionControl) {
@ -116,16 +99,16 @@ public class AcquisitionProcess extends PamProcess {
acquisitionProcess = this;
this.acquisitionControl = acquisitionControl;
ppsDetector = new PPSDetector(this);
String name = String.format("Raw input data from %s", acquisitionControl.getUnitName());
//addOutputDataBlock(rawDataBlock = new PamRawDataBlock(name, this,
// PamUtils.makeChannelMap(acquisitionControl.acquisitionParameters.nChannels),
// PamUtils.makeChannelMap(acquisitionControl.acquisitionParameters.nChannels),
// acquisitionControl.acquisitionParameters.sampleRate));
addOutputDataBlock(rawDataBlock = new PamRawDataBlock(name, this,
addOutputDataBlock(rawDataBlock = new PamRawDataBlock(name, this,
PamUtils.makeChannelMap(acquisitionControl.acquisitionParameters.nChannels,acquisitionControl.acquisitionParameters.getHardwareChannelList()),
acquisitionControl.acquisitionParameters.sampleRate));
@ -134,11 +117,11 @@ public class AcquisitionProcess extends PamProcess {
// daqStatusDataBlock.
addOutputDataBlock(daqStatusDataBlock);
daqStatusDataBlock.SetLogging(new AcquisitionLogging(daqStatusDataBlock, acquisitionControl));
/**
* We really don't wand the binary data source set for normal ops since it stops the data getting
* written to the database by default. When using certain Network receiver settings, they use binary
* type data, so do need it. this will therefore be configured from the network receiver when required.
* written to the database by default. When using certain Network receiver settings, they use binary
* type data, so do need it. this will therefore be configured from the network receiver when required.
*/
// daqStatusDataBlock.setBinaryDataSource(new DaqStatusBinaryStore(daqStatusDataBlock, acquisitionControl));
AbstractScrollManager.getScrollManager().addToSpecialDatablock(daqStatusDataBlock);
@ -151,14 +134,14 @@ public class AcquisitionProcess extends PamProcess {
// stallCheckTimer = new Timer(60000, new StallCheckAction());
bufferTimer = new Timer(1000, new BufferTimerTest());
ProcessCheck pp = new BaseProcessCheck(this, null, 0, 10);
setProcessCheck(pp);
/**
* Make a filter to low pass filter the sample rate errors. these
* Make a filter to low pass filter the sample rate errors. these
* will eventually get used to update / fix estimated RawDataunit milliseconds
* times based on the total sample offset compared to UTC.
* times based on the total sample offset compared to UTC.
*/
FilterParams filterParams = new FilterParams();
filterParams.filterBand = FilterBand.LOWPASS;
@ -205,27 +188,27 @@ public class AcquisitionProcess extends PamProcess {
// private long daqCheckInterval = 60 * 1000;
@Override
public void pamStart() {
// called by PamController. Don't actually start if
// we're in network receive mode.
// called by PamController. Don't actually start if
// we're in network receive mode.
if (systemPrepared == false) return;
if (!systemPrepared) return;
newDataQueue.clearList(); // clear this first to make sure nothing new comes in.
newDataQueue.clearList(); // clear this first to make sure nothing new comes in.
// before starting, clear all old data
rawDataBlock.clearAll();
sampleRateErrorFilter.prepareFilter();
totalExtraSamples = 0;
millisecondSampleOffset = 0;
if (runningSystem == null) {
return;
}
boolean netRX = PamController.getInstance().getRunMode() == PamController.RUN_NETWORKRECEIVER;
if (!netRX) {
if (runningSystem.startSystem(acquisitionControl) == false) return;
if (!runningSystem.startSystem(acquisitionControl)) return;
}
// Log a data unit asap to get the start time
long daqStartedTime = PamCalendar.getTimeInMillis();
@ -243,7 +226,7 @@ public class AcquisitionProcess extends PamProcess {
acquisitionControl.fillStatusBarText();
bufferTimer.start();
// stallCheckTimer.start();
/**
@ -255,13 +238,13 @@ public class AcquisitionProcess extends PamProcess {
addServerTime(daqStatusDataUnit);
daqStatusDataBlock.addPamData(daqStatusDataUnit);
previousDaqStatus = daqStatusDataUnit;
/*
* All systems work in much the same way - set up a timer to look for new data which is
* put there by a separate thread that gets the data from it's source.
*
*
*/
bufferOverflow = false;
// daqCheckTime = PamCalendar.getTimeInMillis();
if (!netRX) {
@ -270,9 +253,9 @@ public class AcquisitionProcess extends PamProcess {
t.start();
}
}
private boolean addServerTime(DaqStatusDataUnit daqStatusDataUnit) {
if (runningSystem.isRealTime() == false) {
if (!runningSystem.isRealTime()) {
return false;
}
// PamNTPTime pamNTPTime = PamNTPTime.getInstance();
@ -301,7 +284,7 @@ public class AcquisitionProcess extends PamProcess {
// called by PamController.
// stop the running system - not the selected system since
// this may have changed
restartTimer.stop();
// stallCheckTimer.stop();
pamStop("");
@ -316,15 +299,15 @@ public class AcquisitionProcess extends PamProcess {
// Boolean s = isStalled();
//// System.out.printf("%s Stall state = %s\n", PamCalendar.formatDateTime(System.currentTimeMillis()), s.toString());
// }
//
//
// }
private long simpleSamplesToMilliseconds(long samples) {
return (long) (samples * 1000. / sampleRate) + PamCalendar.getSessionStartTime();
}
/**
* Periodic logging of ADC status into database.
* Periodic logging of ADC status into database.
*/
private void logRunningStatus() {
if (runningSystem == null) return;
@ -334,16 +317,16 @@ public class AcquisitionProcess extends PamProcess {
long adcMillis = this.absSamplesToMilliseconds(samplesRead);
long simpleTime= simpleSamplesToMilliseconds(samplesRead);
DaqStatusDataUnit ds = new DaqStatusDataUnit(PamCalendar.getTimeInMillis(), adcMillis, simpleTime,
samplesRead, null, "Continue", "",
samplesRead, null, "Continue", "",
acquisitionControl.acquisitionParameters, runningSystem.getSystemName(), duration, clockError);
addServerTime(ds);
if (runningSystem.isRealTime()) {
long pcTime = PamCalendar.getTimeInMillis(); // time hopefully corrected from NTP or GPs.
long pcTime = PamCalendar.getTimeInMillis(); // time hopefully corrected from NTP or GPs.
millisecondSampleOffset = (long) sampleRateErrorFilter.runFilter(pcTime-simpleTime);
}
// System.out.printf("Current ADC clock correction at %s %d millis\n" , PamCalendar.formatDateTime(pcTime), millisecondSampleOffset);
// System.out.printf("Sample rate estimated at %s, %dMSamples = %7.2fHz, filtered err %3.1fHz, TotExtraSamples = %3.1f, offest %d mills\n",
// System.out.printf("Sample rate estimated at %s, %dMSamples = %7.2fHz, filtered err %3.1fHz, TotExtraSamples = %3.1f, offest %d mills\n",
// PamCalendar.formatDateTime(ds.getTimeMilliseconds()), samplesRead/1000000, estSampleRate, filteredEstSampleRateError, totalExtraSamples, millisecondSampleOffset);
// if (previousDaqStatus != null) {
//// Double trueSampleRate = ds.calculateTrueSampleRate(previousDaqStatus);
@ -353,14 +336,14 @@ public class AcquisitionProcess extends PamProcess {
// totalExtraSamples += extExtraSamples;
// millisecondSampleOffset = (long) (totalExtraSamples / getSampleRate() * 1000.);
// /*
// * Extra samples +ve means that more samples have arrived than we expected. Therefore the estimate of the
// * Extra samples +ve means that more samples have arrived than we expected. Therefore the estimate of the
// * UTC of the next RawDataunit is going to be too high, so we'll need to subtract off the millisecondSampleOffset
// * when we create a raw data unit.
// * when we create a raw data unit.
// */
//// if (trueSampleRate != null) {
// System.out.printf("Sample rate estimated at %s, %dMSamples = %7.2fHz, filtered err %3.1fHz, TotExtraSamples = %3.1f, offest %d mills\n",
// System.out.printf("Sample rate estimated at %s, %dMSamples = %7.2fHz, filtered err %3.1fHz, TotExtraSamples = %3.1f, offest %d mills\n",
// PamCalendar.formatDateTime(ds.getTimeMilliseconds()), samplesRead/1000000, estSampleRate, filteredEstSampleRateError, totalExtraSamples, millisecondSampleOffset);
//
//
//// }
// }
daqStatusDataBlock.addPamData(ds);
@ -376,11 +359,11 @@ public class AcquisitionProcess extends PamProcess {
long adcMillis = this.absSamplesToMilliseconds(samplesRead);
long simpleMillis = this.simpleSamplesToMilliseconds(samplesRead);
DaqStatusDataUnit ds = new DaqStatusDataUnit(PamCalendar.getTimeInMillis(), adcMillis, simpleMillis,
samplesRead, null, "Stop", reason,
samplesRead, null, "Stop", reason,
acquisitionControl.acquisitionParameters, runningSystem.getSystemName(), duration, clockError);
addServerTime(ds);
daqStatusDataBlock.addPamData(ds);
runningSystem.stopSystem(acquisitionControl);
keepRunning = false;
@ -397,19 +380,19 @@ public class AcquisitionProcess extends PamProcess {
double duration = (double) edgeSample / getSampleRate();
double clockError = checkClockSpeed(edgeSample, 0);
DaqStatusDataUnit ds = new DaqStatusDataUnit(timeNow, adcMillis, simpleMillis,
edgeSample, gpsUTC, "GPSPPS", "",
edgeSample, gpsUTC, "GPSPPS", "",
acquisitionControl.acquisitionParameters, runningSystem.getSystemName(), duration, clockError);
ds.setServerTime(serverTime);
daqStatusDataBlock.addPamData(ds);
}
public void acquisitionStopped() {
/*
* can get called by a DaqSystem thread just as it exits to
/*
* can get called by a DaqSystem thread just as it exits to
* say that DAQ has stopped. Only needs to be implemented for things
* like files which will stop themselves. Can also be implemented for
* like files which will stop themselves. Can also be implemented for
* other devices which might stop accidentally (e.g. UDP sources)
*/
@ -427,9 +410,9 @@ public class AcquisitionProcess extends PamProcess {
}
}
// call acquireData one last time to make sure that
// all data have been flushed from the buffer.
if (bufferOverflow == false) {
// call acquireData one last time to make sure that
// all data have been flushed from the buffer.
if (!bufferOverflow) {
acquireData();
}
else {
@ -441,7 +424,7 @@ public class AcquisitionProcess extends PamProcess {
/*
* runningSystem needs to be set null here since the call to PamController.PamStop()
* will call back to pamStop and we'll get an infinite loop !
* Synch on runingSynchObject to stop crash during shut down of system.
* Synch on runingSynchObject to stop crash during shut down of system.
*/
synchronized(runingSynchObject) {
runningSystem = null;
@ -459,21 +442,21 @@ public class AcquisitionProcess extends PamProcess {
// PamController.pamStop will wait for that to happen, so if we call pamStop
// first it will hang.
sendSourceNotification(LASTDATA, null);
// stop all controlled units
// 2021-05-14 removed - not sure why this is here, and it's just causing PamController.pamStop to get called twice
// acquisitionControl.pamController.pamStop();
}
/**
* Called from AcquisitionControl when all observer thread data queues
* have been emptied and processing has stopped
*/
protected void pamHasStopped() {
newDataQueue.clearList(); // clear this first to make sure nothing new comes in.
newDataQueue.clearList(); // clear this first to make sure nothing new comes in.
if (runningSystem == null){
runningSystem = acquisitionControl.findDaqSystem(null);
}
@ -481,12 +464,12 @@ public class AcquisitionProcess extends PamProcess {
runningSystem.daqHasEnded();
}
}
/**
* Let all observers of the raw data know that the daq status has changed. Right now,
* this is intended to let everyone know that the Daq has started or stopped, so that
* the various threads can clean themselves up.
*
*
* @param type the type of change (see global fields at the top of this class)
* @param object (null for now, but added in case we need to pass something later)
*/
@ -496,7 +479,7 @@ public class AcquisitionProcess extends PamProcess {
rawDataBlock.getPamObserver(i).receiveSourceNotification(type, object);
}
}
@Override
public boolean prepareProcessOK() {
super.prepareProcessOK();
@ -512,9 +495,9 @@ public class AcquisitionProcess extends PamProcess {
lastStallCheckTime = 0;
lastStallCheckSamples = 0;
lastStallState = false;
if (acquisitionControl.acquisitionParameters.subtractDC) {
dcFilter = new DCFilter(acquisitionControl.acquisitionParameters.sampleRate,
dcFilter = new DCFilter(acquisitionControl.acquisitionParameters.sampleRate,
acquisitionControl.acquisitionParameters.dcTimeConstant, PamConstants.MAX_CHANNELS);
}
else {
@ -524,20 +507,20 @@ public class AcquisitionProcess extends PamProcess {
setSampleRate(acquisitionControl.acquisitionParameters.sampleRate, true);
super.prepareProcess();
ppsDetector.prepare(acquisitionControl.acquisitionParameters);
if (runningSystem != null) {
pamStop();
}
dataBlockLength = -1;
runningSystem = acquisitionControl.findDaqSystem(null);
if (runningSystem == null) {
System.out.printf("Unable to find daq system %s\n", acquisitionControl.acquisitionParameters.daqSystemType);
return;
}
systemPrepared = runningSystem.prepareSystem(acquisitionControl);
}
@ -559,7 +542,7 @@ public class AcquisitionProcess extends PamProcess {
/**
* Set up channels when using a channel list - note
* that hardware channels are no longer passed through the system
* so software channels are now used throughout.
* so software channels are now used throughout.
* @param numChannels
* @param channelList
*/
@ -567,7 +550,7 @@ public class AcquisitionProcess extends PamProcess {
acquisitionControl.acquisitionParameters.nChannels = numChannels;
acquisitionControl.acquisitionParameters.setChannelList(channelList);
rawDataBlock.setChannelMap(PamUtils.makeChannelMap(numChannels));
// rawDataBlock.setChannelMap(PamUtils.makeChannelMap(numChannels, channelList));
// rawDataBlock.setChannelMap(PamUtils.makeChannelMap(numChannels, channelList));
}
/*
@ -585,6 +568,7 @@ public class AcquisitionProcess extends PamProcess {
class BufferTimerTest implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
acquisitionControl.fillStatusBarText();
@ -609,7 +593,7 @@ public class AcquisitionProcess extends PamProcess {
e.printStackTrace();
}
if (acquireData() == false) {
if (!acquireData()) {
break;
}
}
@ -641,12 +625,13 @@ public class AcquisitionProcess extends PamProcess {
/**
* Used to restart after a buffer overflow.
* Used to restart after a buffer overflow.
* @author Doug Gillespie
*
*/
class RestartTimerFunction implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("PAMGUARD cannot process data at the required rate and is restarting");
@ -675,8 +660,8 @@ public class AcquisitionProcess extends PamProcess {
int channel = PamUtils.getSingleChannel(threadDataUnit.getChannelBitmap());
// long unitMillis = absSamplesToMilliseconds(threadDataUnit.getStartSample()) - millisecondSampleOffset;
long unitMillis = (long) simpleSamplesToMilliseconds(threadDataUnit.getStartSample()) + millisecondSampleOffset;
newDataUnit = new RawDataUnit(unitMillis,
long unitMillis = simpleSamplesToMilliseconds(threadDataUnit.getStartSample()) + millisecondSampleOffset;
newDataUnit = new RawDataUnit(unitMillis,
threadDataUnit.getChannelBitmap(), threadDataUnit.getStartSample(),
threadDataUnit.getSampleDuration());
if (dcFilter != null) {
@ -688,23 +673,23 @@ public class AcquisitionProcess extends PamProcess {
// calculated in the call to setRawData, to dB.
newDataUnit.setCalculatedAmlitudeDB(rawAmplitude2dB(newDataUnit.getMeasuredAmplitude(),
PamUtils.getSingleChannel(threadDataUnit.getChannelBitmap()), false));
PPSParameters ppsParams = acquisitionControl.acquisitionParameters.getPpsParameters();
if (ppsParams.useGpsPPS & newDataUnit.getChannelBitmap() == 1<<ppsParams.gpsPPSChannel){
ppsDetector.newData(newDataUnit);
}
addData(null, newDataUnit);
rawData = newDataUnit.getRawData();
dataBlockLength = rawData.length;
for (int i = 0; i < rawData.length; i++) {
maxLevel = Math.max(maxLevel, Math.abs(rawData[i]));
for (double element : rawData) {
maxLevel = Math.max(maxLevel, Math.abs(element));
}
levelSamples += rawData.length;
if (bufferOverflow) {
break;
}
if (threadDataUnit.getChannelBitmap() == 1<<(acquisitionControl.getAcquisitionParameters().nChannels-1) &&
threadDataUnit.getTimeMilliseconds() - lastStatusTime > statusInterval) {
logRunningStatus();
@ -726,39 +711,39 @@ public class AcquisitionProcess extends PamProcess {
// * buffer with a 10s maximum
// */
// if (needRestart() && finalFlush == false) {
//
// System.out.println(PamCalendar.formatDateTime(System.currentTimeMillis()) +
//
// System.out.println(PamCalendar.formatDateTime(System.currentTimeMillis()) +
// " : Emergency sound system restart due to buffer overflow");
// pamStop("Buffer overflow in sound system");
//
//
// newDataUnits.clear();
//
//
// acquisitionStopped();
//
//
// restartTimer.start();
//
//
// return;
// }
//
//
// long now = PamCalendar.getTimeInMillis();
// if (now - daqCheckTime >= daqCheckInterval) {
// double duration = (double) totalSamples[0] / getSampleRate();
// double clockError = checkClockSpeed(totalSamples[0], 1);
// DaqStatusDataUnit ds = new DaqStatusDataUnit(PamCalendar.getTimeInMillis(), "Continue", "Check",
// DaqStatusDataUnit ds = new DaqStatusDataUnit(PamCalendar.getTimeInMillis(), "Continue", "Check",
// runningSystem.getSystemName(), getSampleRate(), acquisitionControl.acquisitionParameters.nChannels,
// acquisitionControl.acquisitionParameters.voltsPeak2Peak, duration, clockError);
// daqStatusDataBlock.addPamData(ds);
// daqCheckTime = now;
// }
//
//
// /*
// * The blocks should be in pairs, so there should generally
// * The blocks should be in pairs, so there should generally
// * be two blocks there every time this gets called. Adjust timing
// * automatically to deal with just about any data rate. Start at a low
// * value though since file reading only adds blocks if there are none
// * there - so would never reduce the delay !
// *
// * Don't do this if it isn't a real time process since we want to
// * there - so would never reduce the delay !
// *
// * Don't do this if it isn't a real time process since we want to
// * keep going as fast as possible
// */
//// trials++;
@ -766,25 +751,25 @@ public class AcquisitionProcess extends PamProcess {
//// if (trials == 15 || counts >= 40) {
//// if (trials > counts * 3) {
//// daqTimer.setDelay(Math.max(10,daqTimer.getDelay() * 5 / 4));
//// System.out.println("Increasing timer delay to " + daqTimer.getDelay() + " ms");
//// System.out.println("Increasing timer delay to " + daqTimer.getDelay() + " ms");
//// }
//// else if (counts > trials * 2) {
//// daqTimer.setDelay(Math.max(1,daqTimer.getDelay() * 2 / 3));
//// System.out.println("Reducing timer delay to " + daqTimer.getDelay() + " ms");
//// System.out.println("Reducing timer delay to " + daqTimer.getDelay() + " ms");
//// }
//// trials = counts = 0;
//// }
// }
//
//
// RawDataUnit newDataUnit, threadDataUnit;
//
//
// int readCount = 0;
// while (!newDataUnits.isEmpty()) {
//
// threadDataUnit = newDataUnits.remove(0);
//
//
// int channel = PamUtils.getSingleChannel(threadDataUnit.getChannelBitmap());
// newDataUnit = new RawDataUnit(absSamplesToMilliseconds(threadDataUnit.getStartSample()),
// newDataUnit = new RawDataUnit(absSamplesToMilliseconds(threadDataUnit.getStartSample()),
// threadDataUnit.getChannelBitmap(), threadDataUnit.getStartSample(),
// threadDataUnit.getDuration());
// newDataUnit.setRawData(threadDataUnit.getRawData(), true);
@ -800,13 +785,13 @@ public class AcquisitionProcess extends PamProcess {
// maxLevel = Math.max(maxLevel, Math.abs(rawData[i]));
// }
// levelSamples += rawData.length;
//
//
//
// // about every 5 seconds, check the buffer isn't filling
// if (newDataUnit.getAbsBlockIndex() % (50 * acquisitionControl.acquisitionParameters.nChannels) == 0) {
// double buffer = getBufferEstimate(newDataUnit.getStartSample() + newDataUnit.getDuration());
// if (buffer > 3) {
// System.out.println(PamCalendar.formatDateTime(System.currentTimeMillis()) +
// System.out.println(PamCalendar.formatDateTime(System.currentTimeMillis()) +
// " : Emergency sound system restart due to Buffer overflow type 2");
// pamStop("Type 2 Buffer overflow in sound system");
//
@ -819,7 +804,7 @@ public class AcquisitionProcess extends PamProcess {
// return;
// }
// }
//
//
// // about every minute, or every 1200 blocks, check the timing
// if ((newDataUnit.getAbsBlockIndex()+1) % (600 * acquisitionControl.acquisitionParameters.nChannels) == 0) {
// checkClockSpeed(newDataUnit.getStartSample() + newDataUnit.getDuration(), 1);
@ -829,7 +814,7 @@ public class AcquisitionProcess extends PamProcess {
// if (++readCount >= acquisitionControl.acquisitionParameters.nChannels * 4 && finalFlush == false) {
// break;
// }
//
//
// }
// if (levelSamples >= sampleRate * acquisitionControl.acquisitionParameters.nChannels * 2) {
// acquisitionControl.setStatusBarLevel(maxLevel);
@ -854,7 +839,7 @@ public class AcquisitionProcess extends PamProcess {
double soundCardError = (sampleSeconds - clockSeconds) / clockSeconds * 100;
int missingSamples = (int) ((sampleSeconds - clockSeconds) * getSampleRate());
// if (print >= 2 || (print >= 1 && shouldPrintSoundCardError(soundCardError))) {
// System.out.println(String.format("%s at %3.2f%% PC clock speed after %d seconds (about %3.1f seconds or %d samples)",
// System.out.println(String.format("%s at %3.2f%% PC clock speed after %d seconds (about %3.1f seconds or %d samples)",
// runningSystem.getSystemName(), soundCardError, (int)clockSeconds, (sampleSeconds - clockSeconds), missingSamples));
// }
return soundCardError;
@ -881,19 +866,19 @@ public class AcquisitionProcess extends PamProcess {
{
// if (newDataUnits == null) return 0;
// if (dataBlockLength <= 0) return 0;
// double blocksPerSecond = getSampleRate() / dataBlockLength *
// double blocksPerSecond = getSampleRate() / dataBlockLength *
// acquisitionControl.acquisitionParameters.nChannels;
// return newDataUnits.size() / blocksPerSecond;
return (double) newDataQueue.getQueuedSamples(0) / getSampleRate();
}
/**
*
* @return the maximum number of seconds of data which can be buffered.
*
* @return the maximum number of seconds of data which can be buffered.
* This used to be fixed at 3, but now that individual raw data blocks contain >> 1s
* of data for low frequency DAQ, this can be exceeded in a single
* data unit, which causes continual resets.
* data unit, which causes continual resets.
*/
public double getMaxBufferSeconds() {
/**
@ -908,7 +893,7 @@ public class AcquisitionProcess extends PamProcess {
System.out.printf("Restart because %ss buffer > %ss maximum\n", getBufferSeconds(), getMaxBufferSeconds());
return true;
}
return false;
return false;
}
@Override
@ -931,20 +916,20 @@ public class AcquisitionProcess extends PamProcess {
/**
* Convert a raw amplitude to dB re 1 micropascal based on
* calibration information held in the AcquisitionController
*
*
* @param rawAmplitude raw amplitude (should be -1 < rawAmplitude < 1)
* @return amplitude in dB re 1 uPa.
*/
public double rawAmplitude2dB(double rawAmplitude, int channel, boolean fast){
channel = checkSingleChannel(channel);
double constantTerm;
if (fast && fixedAmplitudeConstantTerm[channel] != 0) {
constantTerm = fixedAmplitudeConstantTerm[channel];
}
else {
constantTerm = getAmplitudeConstantTerm(channel);
constantTerm = getAmplitudeConstantTerm(channel);
}
double vp2p = getPeak2PeakVoltage(channel);
@ -952,7 +937,7 @@ public class AcquisitionProcess extends PamProcess {
/*
* Need an extra divide by 2 in here since the standard scaling of PAMGUARD
* data is -1 to +1, so data really needed to be scaled against half
* the peak to peak voltage.
* the peak to peak voltage.
*/
double dB = 20 * Math.log10(rawAmplitude * vp2p / 2) - constantTerm;
@ -964,15 +949,15 @@ public class AcquisitionProcess extends PamProcess {
}
/**
* Check it's a single channel and not a channel map.
* Check it's a single channel and not a channel map.
* This fundamentally messed up the amplitude calculations when the
* channels were > 2 since it was only taking the number of the lowest set
* bit. So if a genuine channel was sent, rather than a channel map with a
* channels were > 2 since it was only taking the number of the lowest set
* bit. So if a genuine channel was sent, rather than a channel map with a
* single set channel, it messed up. Have made this function redundant
* and we need to be 100% sure that all amplitude calculations are sent a
* channel number not a bitmap with a single set channel.
* and we need to be 100% sure that all amplitude calculations are sent a
* channel number not a bitmap with a single set channel.
* @param channel
* @return single channel if it seemed to be a bitmap.
* @return single channel if it seemed to be a bitmap.
*/
private int checkSingleChannel(int channel) {
return channel;
@ -986,7 +971,7 @@ public class AcquisitionProcess extends PamProcess {
/**
* Some devices may be setting this per channel.
* @param swChannel software channel number
* @return peak to peak voltage range.
* @return peak to peak voltage range.
*/
public double getPeak2PeakVoltage(int swChannel) {
@ -1005,17 +990,17 @@ public class AcquisitionProcess extends PamProcess {
/**
* A Constant used for fast amplitude calculations when things
* like preamp gain will remain constant. Contains a constant
* term in the SPL calculations bases on preamp gains and
* hdrophone sensitivities.
* Changes to be channel specific since with multi threading it goes horribly
* wrong if different channels have different sensitivities.
* term in the SPL calculations bases on preamp gains and
* hdrophone sensitivities.
* Changes to be channel specific since with multi threading it goes horribly
* wrong if different channels have different sensitivities.
*/
private double[] fixedAmplitudeConstantTerm = new double[PamConstants.MAX_CHANNELS];
private DaqSystem ampSystem;
/**
* Gets the fixedAmplitudeConstantTerm based on channel and hydrophone This is
* the hydrophone sensitivity + all gains + ADC sensitivity in counts / volt.
* Gets the fixedAmplitudeConstantTerm based on channel and hydrophone This is
* the hydrophone sensitivity + all gains + ADC sensitivity in counts / volt.
* @param channel = single software channel
* @return constant term for amplitude calculations
*/
@ -1027,7 +1012,7 @@ public class AcquisitionProcess extends PamProcess {
if (hydrophoneChannel < 0) hydrophoneChannel = 0;
// Hydrophone hydrophone = array.getHydrophone(hydrophoneChannel);
double hSens = array.getHydrophoneSensitivityAndGain(hydrophoneChannel);
Preamplifier preamp = acquisitionControl.acquisitionParameters.preamplifier;
if (getRunningSystem() != null) {
ampSystem = getRunningSystem();
@ -1037,14 +1022,14 @@ public class AcquisitionProcess extends PamProcess {
}
double xtra = 0;
if (ampSystem != null) {
xtra = ampSystem.getChannelGain(channel);
xtra = ampSystem.getChannelGain(channel);
}
return (hSens + preamp.getGain() + xtra);
}
/**
* Prepares for fast amplitude calculations
* @param channel number i.e. 0 - 31, NOT a bitmap.
* @param channel number i.e. 0 - 31, NOT a bitmap.
*/
public double prepareFastAmplitudeCalculation(int channel) {
channel = checkSingleChannel(channel);
@ -1055,7 +1040,7 @@ public class AcquisitionProcess extends PamProcess {
* Convert a raw amplitude to dB re 1 micropascal based on
* calibration information held in the AcquisitionController
* for an array of double data
*
*
* @param rawAmplitude raw amplitude (should be -1 < rawAmplitude < 1)
* @param channel channel number (MUST be a channel 0 - 31, not a sequence number)
* @return amplitude in dB re 1 uPa.
@ -1073,10 +1058,10 @@ public class AcquisitionProcess extends PamProcess {
* dB re 1 micropacal / sqrt(Hz).
* @param fftAmplitude magnitude of the fft data (not the magnitude squared !)
* @param channel channel number (MUST be a channel, and not a sequence number)
* @param sampleRate sample rate - this needs to be sent, since this function is
* often called from decimated data, in which case the sample rate will be different.
* @param fftLength length of the FFT (needed for Parsevals correction)
* @param isSquared is magnitude squared (in which case sqrt will be taken).
* @param sampleRate sample rate - this needs to be sent, since this function is
* often called from decimated data, in which case the sample rate will be different.
* @param fftLength length of the FFT (needed for Parsevals correction)
* @param isSquared is magnitude squared (in which case sqrt will be taken).
* @param fast use fast calculation (after call to prepareFastAmplitudeCalculation(...).
* @return spectrum level amplitude.
*/
@ -1096,13 +1081,13 @@ public class AcquisitionProcess extends PamProcess {
double dB = rawAmplitude2dB(fftAmplitude, channel, fast);
return dB;
}
/**
* Convert the amplitude of fft data into a spectrum level measurement in
* dB re 1 micropacal / sqrt(Hz) for an array of double values.
* @param fftAmplitude magnitude of the fft data (not the magnitude squared !)
* @param channel the channel number (MUST be a channel, and not a sequence number)
* @param fftLength lengthof the fft (needed for Parsevals correction)
* @param fftLength lengthof the fft (needed for Parsevals correction)
* @return spectrum level amplitude.
*/
public double[] fftAmplitude2dB(double[] fftAmplitude, int channel, float sampleRate, int fftLength, boolean isSquared){
@ -1118,11 +1103,11 @@ public class AcquisitionProcess extends PamProcess {
* Convert the amplitude of fft data into a level measurement in
* dB re 1 micropacal / sqrt(Hz).
* <p>
* Note that this function differs from fftAmplitude2dB in that this one used the
* FFT length to correct for Parsevals theorum and integratin over the length of the
* FFT, but it does NOT convert the result to a spectrum level measurement.
* Note that this function differs from fftAmplitude2dB in that this one used the
* FFT length to correct for Parsevals theorum and integratin over the length of the
* FFT, but it does NOT convert the result to a spectrum level measurement.
* @param fftAmplitude magnitude of the fft data (not the magnitude squared !)
* @param fftLength lengthof the fft (needed for Parsevals correction)
* @param fftLength lengthof the fft (needed for Parsevals correction)
* @return level amplitude in dB
*/
public double fftBandAmplitude2dB(double fftAmplitude, int channel, int fftLength, boolean isSquared, boolean fast){
@ -1143,10 +1128,10 @@ public class AcquisitionProcess extends PamProcess {
}
/**
* Converts dB in micropascal to ADC counts on a 0 - 1 scale.
* @param channel channel number, i.e. channel index 0 - 31 NOT a bitmap.
* Converts dB in micropascal to ADC counts on a 0 - 1 scale.
* @param channel channel number, i.e. channel index 0 - 31 NOT a bitmap.
* @param dBMuPascal db in micropascal
* @return ADC counts on a 0-1 scale.
* @return ADC counts on a 0-1 scale.
*/
public double dbMicropascalToSignal(int channel, double dBMuPascal) {
double db = dBMuPascal + getAmplitudeConstantTerm(channel);
@ -1171,9 +1156,9 @@ public class AcquisitionProcess extends PamProcess {
@Override
public int getOfflineData(OfflineDataLoadInfo offlineLoadDataInfo) {
// System.out.println("AquisitionProcess: GetofflineData: " + offlineLoadDataInfo.getCurrentObserver().getObserverName())
if (acquisitionControl.getOfflineFileServer() == null) {
return PamDataBlock.REQUEST_NO_DATA;
}
@ -1184,11 +1169,11 @@ public class AcquisitionProcess extends PamProcess {
return PamDataBlock.REQUEST_NO_DATA;
}
}
/**
* Get the total number of samples acquired by a particular channel.
* Get the total number of samples acquired by a particular channel.
* @param iChannel
* @return number of samples.
* @return number of samples.
*/
public long getTotalSamples(int iChannel) {
return newDataQueue.getSamplesIn(iChannel);
@ -1205,8 +1190,8 @@ public class AcquisitionProcess extends PamProcess {
long lastStallCheckSamples = 0;
boolean lastStallState = false;
/**
*
* @return if the acquisition system seems to have stopped acquiring data.
*
* @return if the acquisition system seems to have stopped acquiring data.
*/
public boolean isStalled() {
long samples = getTotalSamples(0);
@ -1214,13 +1199,13 @@ public class AcquisitionProcess extends PamProcess {
long stallCheckSecs = getStallCheckSeconds();
long runTime = now - PamCalendar.getSessionStartTime();
if (runTime < stallCheckSecs * 2000 && samples == 0) {
return false; // give it plenty of time to get started.
return false; // give it plenty of time to get started.
}
if (now - lastStallCheckTime < (stallCheckSecs*1000) && lastStallState == false) {
if (now - lastStallCheckTime < (stallCheckSecs*1000) && !lastStallState) {
return lastStallState;
}
double aveSR = (double) (samples - lastStallCheckSamples) / (double) (now-lastStallCheckTime) * 1000.;
// check on lastStallCheckTime > 0 will stop this doing anything the first time through when it will always get a stupid small value.
// check on lastStallCheckTime > 0 will stop this doing anything the first time through when it will always get a stupid small value.
boolean stalled = (aveSR < getSampleRate() * .7 && lastStallCheckTime > 0);
if (stalled) {
System.out.println(String.format("System stalled samples %d, lastCallSamples %d, mean SR = %5.1f", samples, lastStallCheckSamples, aveSR));
@ -1232,7 +1217,7 @@ public class AcquisitionProcess extends PamProcess {
}
/**
* Get the DAQ status data block. Contains data unit with info on sample numbers etc.
* Get the DAQ status data block. Contains data unit with info on sample numbers etc.
* @return the daqStatusDataBlock
*/
public PamDataBlock<DaqStatusDataUnit> getDaqStatusDataBlock() {
@ -1261,6 +1246,6 @@ public class AcquisitionProcess extends PamProcess {
}
}

View File

@ -9,40 +9,40 @@ import PamUtils.PamUtils;
import PamguardMVC.PamConstants;
/**
* Better management of new data list.
* Better management of new data list.
* <p>
* This is a queue that sits between individual acquisition systems and
* This is a queue that sits between individual acquisition systems and
* the main Acquisition process. DAQ systems write data units into this list
* in their own thread and data are read out in a different thread.
* @author Doug Gillespie.
* in their own thread and data are read out in a different thread.
* @author Doug Gillespie.
*
*/
public class AudioDataQueue {
private volatile List<RawDataUnit> newDataUnits;
private long samplesIn[] = new long[PamConstants.MAX_CHANNELS];
private long samplesOut[] = new long[PamConstants.MAX_CHANNELS];
public AudioDataQueue() {
newDataUnits = Collections.synchronizedList(new LinkedList<RawDataUnit>());
}
public synchronized void clearList() {
newDataUnits.clear();
for (int i = 0; i < PamConstants.MAX_CHANNELS; i++) {
samplesIn[i] = samplesOut[i] = 0;
}
}
public synchronized boolean hasData() {
return !newDataUnits.isEmpty();
}
public synchronized int getQueueSize() {
return newDataUnits.size();
}
public synchronized RawDataUnit removeOldest() {
RawDataUnit ru = newDataUnits.remove(0);
if (ru != null) {
@ -54,17 +54,17 @@ public class AudioDataQueue {
public void addNewData(RawDataUnit newDataUnit) {
addNewData(newDataUnit, PamUtils.getSingleChannel(newDataUnit.getChannelBitmap()));
}
public synchronized void addNewData(RawDataUnit newDataUnit, int channel) {
samplesIn[channel] += newDataUnit.getSampleDuration();
newDataUnits.add(newDataUnit);
}
/**
* Get the total number of samples in the data queue based on the difference between
* the last sample put in and the last taken out.
* Get the total number of samples in the data queue based on the difference between
* the last sample put in and the last taken out.
* @param channel channel number
* @return number of stored samples in queue
*/

View File

@ -7,48 +7,48 @@ import javafx.scene.Node;
/**
* Interface allowing individual devices to provide their
* own channel list panel. Some devices (such as sound cards)
* don't use this at all. ASIO cards use a standard concrete
* don't use this at all. ASIO cards use a standard concrete
* implementation. NI cards use a more sophisticated one
* whereby multiple devices may be used.
* whereby multiple devices may be used.
* @author Doug Gillespie
*
*/
public interface ChannelListPanel {
/**
*
* @return the component for the dialog panel.
*
* @return the component for the dialog panel.
*/
public Component getComponent();
/**
*
* @return the component for the dialog panel.
*
* @return the component for the dialog panel.
*/
public Node getNode();
/**
* Set the channel list.
* Set the channel list.
* @param channelList channel list
*/
public void setParams(int[] channelList);
/**
*
*
* @return the channel list
*/
public int[] getChannelList();
/**
*
*
* @return true if the configuration seems to be valid (i.e. no repeated channels, etc)
*/
public boolean isDataOk();
/**
* Set the total number of channels to display.
* @param nChannels the total number of channels to display.
* Set the total number of channels to display.
* @param nChannels the total number of channels to display.
*/
public void setNumChannels(int nChannels);
}

View File

@ -42,7 +42,7 @@ public class CheckWavFileHeaders extends PamDialog {
private CheckFiles checkFilesWorker;
private ArrayList<File> allFiles = new ArrayList<File>();
private ArrayList<File> allFiles = new ArrayList<>();
private CheckWavFileHeaders(Window parentFrame) {
super(parentFrame, "Check File Headers", false);
@ -89,8 +89,8 @@ public class CheckWavFileHeaders extends PamDialog {
}
private void enableControls() {
getOkButton().setEnabled(nFiles > 0 & running == false && ran == false);
getCancelButton().setEnabled(running == false);
getOkButton().setEnabled(nFiles > 0 & !running && !ran);
getCancelButton().setEnabled(!running);
}
private int countFiles(File folder) {
@ -98,8 +98,8 @@ public class CheckWavFileHeaders extends PamDialog {
File[] files = folder.listFiles(new PamAudioFileFilter());
if (files == null) return 0;
File file;
for (int i = 0; i < files.length; i++) {
file = files[i];
for (File file2 : files) {
file = file2;
if (file.isDirectory() && subFolders) {
System.out.println(file.getAbsoluteFile());
nF += countFiles(file.getAbsoluteFile());
@ -146,7 +146,7 @@ public class CheckWavFileHeaders extends PamDialog {
private void setProgressInfo(ProgressData progressData) {
progressBar.setValue(++doneFiles);
String msg = AudioFileFuncs.getMessage(progressData.headerError);
textArea.append(String.format("\n%s - %s", progressData.file.getName(), msg));
textArea.append(String.format("\n%s - %s", progressData.file.getName(), msg));
boolean problem = progressData.headerError != AudioFileFuncs.FILE_OK;
if (problem) {
nErrors++;
@ -164,7 +164,7 @@ public class CheckWavFileHeaders extends PamDialog {
* @return true if there is an error
*/
private int checkFile(File aFile) {
if (aFile.exists() == false || aFile.isDirectory() == true) {
if (!aFile.exists() || aFile.isDirectory()) {
return AudioFileFuncs.FILE_DOESNTEXIST;
}
String fileName = aFile.getName();
@ -179,7 +179,7 @@ public class CheckWavFileHeaders extends PamDialog {
}
else if (fileEnd.equalsIgnoreCase("aif")) {
return checkAifFile(aFile);
}
}
return AudioFileFuncs.FILE_UNKNOWNTYPE;
}
@ -198,13 +198,13 @@ public class CheckWavFileHeaders extends PamDialog {
protected Integer doInBackground() throws Exception {
/*
* need to loop over files again
* for each file, report on progress with it's name and
* for each file, report on progress with it's name and
* whether or not it had an error
*/
int error;
File aFile;
for (int i = 0; i < allFiles.size(); i++) {
error = checkFile(aFile = allFiles.get(i));
for (File file : allFiles) {
error = checkFile(aFile = file);
publish(new ProgressData(aFile, error));
}
return null;
@ -220,8 +220,8 @@ public class CheckWavFileHeaders extends PamDialog {
@Override
protected void process(List<ProgressData> progressData) {
for (int i = 0; i < progressData.size(); i++) {
setProgressInfo(progressData.get(i));
for (ProgressData element : progressData) {
setProgressInfo(element);
}
}

View File

@ -4,7 +4,7 @@ import PamguardMVC.ChannelListManager;
/**
* Class for converting channel indexes and numbers to hydrophones
* for the main PAMGAURD DAQ.
* for the main PAMGAURD DAQ.
* <p>
* All these functions are passed through to the AcquisitionParameters class
* but these ones are better organised and therefore much easier to use than
@ -16,7 +16,7 @@ import PamguardMVC.ChannelListManager;
public class DAQChannelListManager extends ChannelListManager {
private AcquisitionControl acquisitionControl;
public DAQChannelListManager(AcquisitionControl acquisitionControl) {
this.acquisitionControl = acquisitionControl;
}
@ -25,7 +25,7 @@ public class DAQChannelListManager extends ChannelListManager {
// public int channelIndexToNumber(int channelIndex) {
//
// return acquisitionControl.acquisitionParameters.getChannelList(channelIndex);
//
//
// }
@Override

View File

@ -1,7 +1,7 @@
package Acquisition;
/**
* Class to remove DC offset from audio data.
* Class to remove DC offset from audio data.
* @author Douglas Gillespie
*
*/
@ -20,7 +20,7 @@ public class DCFilter {
background = new double[nChannels];
alpha = 1-1./(sampleRate*timeConstant);
}
public void filterData(int channel, double[] data) {
double x;
double b = background[channel];

View File

@ -21,7 +21,7 @@ public class DCL5System extends FolderInputSystem implements PamSettings {
// PamSettingManager.getInstance().registerSettings(this);
// }
String xmlDocName = "C:\\DCL_5_2011\\Matlab\\SpeciesFiletimes2.xml";
Document doc;
@ -84,9 +84,9 @@ public class DCL5System extends FolderInputSystem implements PamSettings {
String timeString = e.getAttribute("time");
return super.getFileStartTime(new File(timeString));
/*
* Get the file time from the XML document.
* Get the file time from the XML document.
*/
// return super.getFileStartTime(file);
}
}

View File

@ -13,7 +13,6 @@ import binaryFileStorage.BinaryHeader;
import binaryFileStorage.BinaryObjectData;
import binaryFileStorage.ModuleFooter;
import binaryFileStorage.ModuleHeader;
import binaryFileStorage.PackedBinaryObject;
public class DaqStatusBinaryStore extends BinaryDataSource {
@ -50,12 +49,12 @@ public class DaqStatusBinaryStore extends BinaryDataSource {
@Override
public PamDataUnit sinkData(BinaryObjectData binaryObjectData, BinaryHeader bh, int moduleVersion) {
ByteArrayInputStream bis = new ByteArrayInputStream(binaryObjectData.getData(),
ByteArrayInputStream bis = new ByteArrayInputStream(binaryObjectData.getData(),
0, binaryObjectData.getDataLength());
DataInputStream dis = new DataInputStream(bis);
long adcMilliseconds = 0;
long samples = 0;
long samples = 0;
Long gpsPPSMillis = null;
short status = 0;
short reason = 0;
@ -68,7 +67,7 @@ public class DaqStatusBinaryStore extends BinaryDataSource {
gpsPPSMillis = dis.readLong();
if (gpsPPSMillis == 0) {
// zero must be intrpreted as null (no data) or it can screw up some time corrections in the
// network receiver.
// network receiver.
gpsPPSMillis = null;
}
status = dis.readShort();
@ -97,24 +96,24 @@ public class DaqStatusBinaryStore extends BinaryDataSource {
channels = PamUtils.PamUtils.makeChannelMap(acquisitionControl.acquisitionParameters.nChannels);
voltsPeak2Peak = acquisitionControl.acquisitionParameters.voltsPeak2Peak;
}
AcquisitionParameters daqParams = new AcquisitionParameters();
daqParams.setVoltsPeak2Peak(voltsPeak2Peak);
daqParams.setPreamplifier(new Preamplifier(0, null));
daqParams.setSampleRate(sampleRate);
daqParams.setDaqSystemType(daqSystemType);
/**
* Only used in netrx mode and doesn't handle corrected milliseconds.
* Only used in netrx mode and doesn't handle corrected milliseconds.
*/
DaqStatusDataUnit dsdu = new DaqStatusDataUnit(binaryObjectData.getTimeMilliseconds(),
adcMilliseconds, adcMilliseconds, samples, gpsPPSMillis, (new Short(status)).toString(),
DaqStatusDataUnit dsdu = new DaqStatusDataUnit(binaryObjectData.getTimeMilliseconds(),
adcMilliseconds, adcMilliseconds, samples, gpsPPSMillis, (new Short(status)).toString(),
(new Short(reason)).toString(), daqParams, null, duration, clockError);
return dsdu;
}
@Override
public ModuleHeader sinkModuleHeader(BinaryObjectData binaryObjectData, BinaryHeader bh) {
ByteArrayInputStream bis = new ByteArrayInputStream(binaryObjectData.getData(),
ByteArrayInputStream bis = new ByteArrayInputStream(binaryObjectData.getData(),
0, binaryObjectData.getDataLength());
DataInputStream dis = new DataInputStream(bis);
moduleHeader = new DaqStatusModuleHeader(bh.getHeaderFormat());
@ -127,7 +126,7 @@ public class DaqStatusBinaryStore extends BinaryDataSource {
} catch (IOException e) {
e.printStackTrace();
}
return moduleHeader;
}

View File

@ -2,7 +2,6 @@ package Acquisition;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamProcess;
import dataMap.OfflineDataMap;
import effort.EffortProvider;
import effort.binary.DataMapEffortProvider;
import generalDatabase.DBControlUnit;
@ -15,9 +14,9 @@ public class DaqStatusDataBlock extends PamDataBlock<DaqStatusDataUnit> {
@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.
// 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);
}
}

View File

@ -1,42 +1,41 @@
package Acquisition;
import PamUtils.PamCalendar;
import PamUtils.PamUtils;
import PamguardMVC.PamDataUnit;
/**
* Data unit containing information on run starts and stops.
* Data unit containing information on run starts and stops.
* <p>
* The main purpose of producing these is so that they get picked up
* The main purpose of producing these is so that they get picked up
* by the database and logged
*
*
* @author Doug Gillespie
*
*/
public class DaqStatusDataUnit extends PamDataUnit {
private String status = "Stop";
private String reason = "";
private String daqSystemType = "";
public int sampleRate;
public Double trueSampleRate;
public int nChannels = 2;
public double voltsPeak2Peak = 5;
public double duration = 0;
public double clockError;
private long adcMilliseconds;
private long samples;
private Long gpsPPSMilliseconds;
private Long serverTime;
@ -44,13 +43,13 @@ public class DaqStatusDataUnit extends PamDataUnit {
private AcquisitionParameters daqParameters;
private long rawADCMillis;
private String systemName;
// private static DaqStatusDataUnit previousDaqStatusUnit = null;
public DaqStatusDataUnit(long timeMilliseconds, long adcMilliseconds, long rawADCMillis,
long samples, Long gpsPPSMillis,
String status, String reason,
public DaqStatusDataUnit(long timeMilliseconds, long adcMilliseconds, long rawADCMillis,
long samples, Long gpsPPSMillis,
String status, String reason,
AcquisitionParameters daqParameters, String systemName, double duration, double clockError) {
super(timeMilliseconds);
this.adcMilliseconds = adcMilliseconds;
@ -60,7 +59,7 @@ public class DaqStatusDataUnit extends PamDataUnit {
this.status = status;
this.reason = reason;
if (daqParameters!=null) {
//null if statement only used in viewer mode were DAQ params are not loaded from database.
//null if statement only used in viewer mode were DAQ params are not loaded from database.
this.daqSystemType = daqParameters.daqSystemType;
this.daqParameters = daqParameters;
this.sampleRate = (int) daqParameters.getSampleRate();
@ -70,17 +69,17 @@ public class DaqStatusDataUnit extends PamDataUnit {
this.systemName = systemName;
this.duration = duration;
this.clockError = clockError;
// set the DataUnitBaseData duration (in samples) to this duration
this.setSampleDuration((long) (duration*sampleRate));
// /*
// * This won't work if data are being sent from multiple receivers !
// */
// calculateTrueSampleRate(previousDaqStatusUnit);
// previousDaqStatusUnit = this;
}
/**
* @return the systemName
*/
@ -99,9 +98,9 @@ public class DaqStatusDataUnit extends PamDataUnit {
if (previousUnit == null || gpsPPSMilliseconds == null || previousUnit.getGpsPPSMilliseconds() == null) {
trueSampleRate = null;
return null;
}
double samples = (double) (this.samples - previousUnit.getSamples());
double tDiff = (double) (this.gpsPPSMilliseconds - previousUnit.getGpsPPSMilliseconds()) / 1000.;
}
double samples = this.samples - previousUnit.getSamples();
double tDiff = (this.gpsPPSMilliseconds - previousUnit.getGpsPPSMilliseconds()) / 1000.;
if (tDiff > 0 && tDiff < 900 && samples > 0) {
trueSampleRate = samples/tDiff;
}

View File

@ -14,7 +14,7 @@ import binaryFileStorage.ModuleHeader;
class DaqStatusModuleHeader extends ModuleHeader implements Serializable, ManagedParameters {
private static final long serialVersionUID = 1L;
public DaqStatusModuleHeader(int moduleVersion) {
super(moduleVersion);
}

View File

@ -6,86 +6,84 @@ import javax.swing.JComponent;
import Acquisition.layoutFX.AcquisitionPaneFX;
import Acquisition.layoutFX.DAQSettingsPane;
import PamController.SettingsPane;
import PamUtils.PamUtils;
import javafx.scene.Node;
import soundPlayback.FilePlayback;
import soundPlayback.PlaybackControl;
import soundPlayback.PlaybackSystem;
/**
*
* Abstraction to multiple data acquisition devices. This interface performs
*
* Abstraction to multiple data acquisition devices. This interface performs
* the following tasks:
* <p>
* 1. Provides information about the device such as min and max sample rates, number of channelse, etc.
* 2. Provides a dialog panel with specific options. This automatically gets incorporated into a more
* general data acquisition panel
* 3. Provides threads and any other functions necessary to create packets of raw audio data in
* PamDataUnit's.
* 4. Each concrete class should, if needed, save it's own setting using the PamSettings package.
* 3. Provides threads and any other functions necessary to create packets of raw audio data in
* PamDataUnit's.
* 4. Each concrete class should, if needed, save it's own setting using the PamSettings package.
* <p>
* Current examples are in SoundCardSystem and FileInputSystem
*
*
* @author Doug Gillespie
*
*/
// is sampleRate ok? set true - return false from getparams...
// is numChannels ok? set true /override these in asio - before returning false
// is numChannels ok? set true /override these in asio - before returning false
public abstract class DaqSystem {
public static final int PARAMETER_UNKNOWN = -1;
public static final int PARAMETER_FIXED = -2;
private int streamStatus = STREAM_CLOSED;
/**
* @return The 'type' of data source for display in the Data Source dialog
* <p> Calling functions should be able to handle 'null'
*/
abstract public String getSystemType();
/**
*
*
* @return A string describing the data source, e.g. the sound card name, file name, udp port, etc.
*/
abstract public String getSystemName();
/**
* The AcquisitionDialog has been designed to that each data source type can plug
* in it's own panel of device specific controls. These could be things like a file
* name, gain settings, channel lists, whatever is available for the specific device
* <p>
* The AcquisitionDialog will handle placing this component on the dialog when a
* particular DaqSystem is selected. The component will be placed between a drop down
* particular DaqSystem is selected. The component will be placed between a drop down
* list of available DaqSystem's and a section of the dialog showing the sample rate and
* number of channels.
* number of channels.
* <p>
* @param acquisitionDialog the AcquisitionDialog this component will be added to
* @return dialog component specific to this DAQ device
*/
abstract public JComponent getDaqSpecificDialogComponent(AcquisitionDialog acquisitionDialog);
/**
* Get a channel list panel (invented for NI cards which have many more options)
* @param acquisitionDialog reference to main acquisition dialog
* @return ChannelListPanel component.
* @return ChannelListPanel component.
*/
public ChannelListPanel getDaqSpecificChannelListPanel(AcquisitionDialog acquisitionDialog) {
return null;
}
/**
* Called by AcquisitionDialog.SetParams so that the dialog componenet can update it's
* fields
*
*/
abstract public void dialogSetParams();
/**
* Called by AcquisitionDialog.GetParams so that parameters can be extracted from the dialog
* component. The DaqSystem should also implement PamSettings and handle storage of parameters
@ -94,49 +92,49 @@ public abstract class DaqSystem {
* dialog will not respond to its Ok button.
*/
abstract public boolean dialogGetParams();
/**
* Tell a DAQ system it's been selected or deselected.
* Tell a DAQ system it's been selected or deselected.
* @param select
*/
public void setSelected(boolean select) {
}
/**
* Get model changed events.
* Get model changed events.
* @param changeType
*/
public void notifyModelChanged(int changeType) {
}
/**
*
*
* @return the maximum sample rate supporrted by the selected device, or PARAMETER_UNKNOWN
*/
abstract public int getMaxSampleRate();
/**
*
*
* @return the maximum number of channels supporrted by the selected device, or PARAMETER_UNKNOWN
*/
abstract public int getMaxChannels();
/**
*
*
* @return peak to peak voltage for the device or PARAMETER_UNKNOWN
*/
abstract public double getPeak2PeakVoltage(int swChannel);
/**
* Prepare the DaqSystem.
* Prepare the DaqSystem.
* <p>
* Usually this is the time for opening files, preparing data buffers, etc.
* @param daqControl AcquisitionControl unit.
* @return true if OK, false otherwise.
*/
abstract public boolean prepareSystem(AcquisitionControl daqControl);
/**
* Start the DaqSystem. This is called immediately after PrepareSystem
* <p>
@ -148,46 +146,46 @@ public abstract class DaqSystem {
* @return true if OK, false otherwise
*/
abstract public boolean startSystem(AcquisitionControl daqControl);
/**
* Stop the DaqSystem.
* Stop the DaqSystem.
* @param daqControl
*/
abstract public void stopSystem(AcquisitionControl daqControl);
/**
*
*
* @return true for real time systems (e.g. sound cards, NI cards, wav files
* which are being played back over speakers. false for reading files which are to be
* processed as fast as possible with no playback.
*/
abstract public boolean isRealTime();
/**
*
* @return true if the system can also play back sound - likely to be true for sound cards
* and ASIO, and some NI cards, false for wav files. Simulator ?
*
* @return true if the system can also play back sound - likely to be true for sound cards
* and ASIO, and some NI cards, false for wav files. Simulator ?
*/
abstract public boolean canPlayBack(float sampleRate);
/**
*
* @return the number of samples expected in each data unit.
*
* @return the number of samples expected in each data unit.
*/
abstract public int getDataUnitSamples();
/**
* Gets a playback system for playing sound back out through headphones / speakers, etc.
* <p>
* Generally, anything acquiring data in real time should play the sound back through
* itself so that clocks are correctly synchronised. i.e. A sound card input will go to the
* same sound card output, etc. At a later date, we may try to support output through
* Generally, anything acquiring data in real time should play the sound back through
* itself so that clocks are correctly synchronised. i.e. A sound card input will go to the
* same sound card output, etc. At a later date, we may try to support output through
* different devices at different speeds - but this will be problematic !
* <p>
* If data are being read from a file, then playback is through a sound card which sits
* in a stand alone implementation of PlaybackSystem
* @param playbackControl
* @param daqSystem
* in a stand alone implementation of PlaybackSystem
* @param playbackControl
* @param daqSystem
* @return null if no playback available or a PlaybackSystem object.
* @see PlaybackSystem
* @see FilePlayback
@ -203,7 +201,7 @@ public abstract class DaqSystem {
*
*/
abstract public void daqHasEnded();
public static final int STREAM_CLOSED = 0;
public static final int STREAM_OPEN = 1;
public static final int STREAM_RUNNING = 2;
@ -220,36 +218,36 @@ public abstract class DaqSystem {
public void setStreamStatus(int streamStatus) {
this.streamStatus = streamStatus;
}
public boolean areSampleSettingsOk(int numInputsRequested, float sampleRateRequested){
return true;
}
public void showSampleSettingsDialog(AcquisitionDialog acquisitionDialog){
}
public Component getStatusBarComponent() {
return null;
}
public boolean supportsChannelLists() {
return false;
}
/**
*
*
* @return a bitmap of output channels. this should ALWAYS be
* a bitmap of channels 0 to n-1 even if different hardware channels
* are used since hardware channels are no longer passed through PAMGUARD.
* are used since hardware channels are no longer passed through PAMGUARD.
*/
public int getInputChannelMap(AcquisitionParameters acquisitionParameters) {
return PamUtils.makeChannelMap(acquisitionParameters.nChannels);
}
/**
* Gets a name for the acquisition device (may just be a number
* but need to generalise).
* but need to generalise).
* @return
*/
public abstract String getDeviceName();
@ -262,18 +260,18 @@ public abstract class DaqSystem {
public double getChannelGain(int channel) {
return 0;
}
/**
* Get the number of bits in each sample.
* @return the number of bits in each sample.
* Get the number of bits in each sample.
* @return the number of bits in each sample.
*/
public int getSampleBits() {
return 16;
}
/**
*
* @return how often its reasonable to check whether or not the system has stalled.
*
* @return how often its reasonable to check whether or not the system has stalled.
*/
public long getStallCheckSeconds() {
return 2;
@ -283,23 +281,23 @@ public abstract class DaqSystem {
/**
* Get a channel list panel (invented for NI cards which have many more options)
* @param acquisitionDialog reference to main acquisition dialog
* @return ChannelListPanel component.
* @return ChannelListPanel component.
*/
public ChannelListPanel getDaqSpecificChannelListNode(AcquisitionPaneFX acquisitionPaneFX) {
// TODO Auto-generated method stub
return null;
}
/**
* The AcquisitionDialog has been designed to that each data source type can plug
* in it's own panel of device specific controls. These could be things like a file
* name, gain settings, channel lists, whatever is available for the specific device
* <p>
* The AcquisitionDialog will handle placing this component on the dialog when a
* particular DaqSystem is selected. The component will be placed between a drop down
* particular DaqSystem is selected. The component will be placed between a drop down
* list of available DaqSystem's and a section of the dialog showing the sample rate and
* number of channels.
* number of channels.
* <p>
* @param acquisitionDialog the AcquisitionPaneFX this component will be added to
* @return dialog component specific to this DAQ device
@ -309,5 +307,5 @@ public abstract class DaqSystem {
return null;
}
}

View File

@ -1,25 +1,23 @@
package Acquisition;
import PamModel.CommonPluginInterface;
import PamModel.PamModel;
import PamModel.PamModuleInfo;
/**
* Interface for External DAQ Systems
*
*
* @author MO
*
*/
public interface DaqSystemInterface extends CommonPluginInterface {
/**
* Creates a new instance of the DAQ System controller, the class that extends
* DaqSystem.class. The AcquisitionControl object that gets passed to the
* interface provides the DAQ System with a link to hardware information
* e.g. channel list, sample rate, etc.
* e.g. channel list, sample rate, etc.
* <p>
* This field cannot be null.
*
*
* @param the AcquisitionControl object
* @return the DaqSystem object
*/

View File

@ -15,11 +15,11 @@ import PamController.PamController;
* is shared by multiple PamSettings classes. For example: the SoundCardParameters class is used
* by the SoundCardSystem, ASIOSoundSystem and NewAsioSoundSystem classes. Each of these has it's own
* type (see the individual getUnitType calls) but the SoundCardParameters class doesn't know who called
* it and so can't properly check whether the type matches. Further, SoundCardParameters is extended by
* it and so can't properly check whether the type matches. Further, SoundCardParameters is extended by
* NIDAQParams, SimParameters and SmruDaqParameters. So trying to make SoundCardParameters check for a
* type would potentially screw up those extended classes. That being said, the extended classes are
* able to check for their types themselves.
*
*
* @author dg50
*
*/
@ -30,8 +30,8 @@ public class DaqSystemXMLManager {
if (daqs == null) {
return false;
}
for (int i = 0; i < daqs.size(); i++) {
AcquisitionControl daq = (AcquisitionControl) daqs.get(i);
for (PamControlledUnit daq2 : daqs) {
AcquisitionControl daq = (AcquisitionControl) daq2;
AcquisitionParameters daqParams = daq.getAcquisitionParameters();
if (daqParams.daqSystemType.equals(daqSystemType)) {
return true;

View File

@ -16,14 +16,14 @@ import PamModel.parametermanager.PamParameterSet.ParameterSetType;
public class FileInputParameters implements Serializable, Cloneable, ManagedParameters {
static public final long serialVersionUID = 1;
static public final int MAX_RECENT_FILES = 20;
/**
* A list of the recent files or folders selected.
* A list of the recent files or folders selected.
*/
public ArrayList<String> recentFiles = new ArrayList<String>();
public ArrayList<String> recentFiles = new ArrayList<>();
public boolean realTime;
public String getMostRecentFile() {
@ -34,21 +34,21 @@ public class FileInputParameters implements Serializable, Cloneable, ManagedPara
return null;
}
}
public String systemType;
/**
* Repeat in an infinite loop
*/
public boolean repeatLoop;
public boolean repeatLoop;
/**
* Skip a section an initial section of the file in millis. For example, use with SoundTrap calibration values.
* Skip a section an initial section of the file in millis. For example, use with SoundTrap calibration values.
*/
public long skipStartFileTime = 0;
public int bitDepth;
/**
* @param systemType
*/
@ -71,7 +71,7 @@ public class FileInputParameters implements Serializable, Cloneable, ManagedPara
}
return null;
}
@Override
public PamParameterSet getParameterSet() {
// if the user has not selected this system type, just return null

View File

@ -7,8 +7,6 @@ import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@ -20,9 +18,9 @@ import java.util.Calendar;
import java.util.List;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.sound.sampled.AudioFormat.Encoding;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
@ -32,33 +30,24 @@ import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileFilter;
import org.jflac.FLACDecoder;
import org.jflac.PCMProcessor;
import org.jflac.frame.Frame;
import org.jflac.metadata.StreamInfo;
import org.jflac.sound.spi.FlacEncoding;
import org.jflac.util.ByteData;
import org.pamguard.x3.sud.Chunk;
import org.pamguard.x3.sud.SudAudioInputStream;
import org.pamguard.x3.sud.SudFileListener;
import org.pamguard.x3.sud.SudParams;
import org.jflac.PCMProcessor;
import org.jflac.metadata.StreamInfo;
import org.jflac.sound.spi.FlacEncoding;
//import org.kc7bfi.jflac.FLACDecoder;
//import org.kc7bfi.jflac.PCMProcessor;
//import org.kc7bfi.jflac.frame.Frame;
//import org.kc7bfi.jflac.metadata.SeekPoint;
//import org.kc7bfi.jflac.metadata.StreamInfo;
//import org.kc7bfi.jflac.sound.spi.FlacEncoding;
//import org.kc7bfi.jflac.util.ByteData;
import wavFiles.ByteConverter;
import Acquisition.filedate.FileDate;
import Acquisition.filedate.FileDateDialogStrip;
import Acquisition.filedate.FileDateObserver;
import Acquisition.filetypes.SoundFileType;
import Acquisition.pamAudio.PamAudioFileManager;
import Acquisition.pamAudio.PamAudioFileFilter;
import Acquisition.pamAudio.PamAudioFileManager;
import PamController.PamControlledUnitSettings;
import PamController.PamController;
import PamController.PamSettingManager;
@ -73,9 +62,19 @@ import PamView.panel.PamProgressBar;
import pamguard.GlobalArguments;
import warnings.PamWarning;
//import org.kc7bfi.jflac.FLACDecoder;
//import org.kc7bfi.jflac.PCMProcessor;
//import org.kc7bfi.jflac.frame.Frame;
//import org.kc7bfi.jflac.metadata.SeekPoint;
//import org.kc7bfi.jflac.metadata.StreamInfo;
//import org.kc7bfi.jflac.sound.spi.FlacEncoding;
//import org.kc7bfi.jflac.util.ByteData;
import wavFiles.ByteConverter;
/**
* Implementation of DaqSystem for reading data from audio files.
*
* Implementation of DaqSystem for reading data from audio files.
*
* @author Doug Gillespie
* @see Acquisition.DaqSystem
* @see Acquisition.AcquisitionProcess
@ -109,7 +108,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
protected PamLabel speedLabel;
/**
* using a system.currentTimeMS not PamCalander time to predict eta.
* using a system.currentTimeMS not PamCalander time to predict eta.
*/
protected long fileStartTime;
@ -148,14 +147,14 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
protected ByteConverter byteConverter;
protected FileDateDialogStrip fileDateStrip;
/**
* Sound file types present in the current selections.
*/
private List<SoundFileType> selectedFileTypes;
/**
* Text field for skipping initial few seconds of a file.
* Text field for skipping initial few seconds of a file.
*/
private JTextField skipSecondsField;
@ -186,7 +185,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
/**
* Gets and where necessary creates ...
* @return Daq dialog panel.
* @return Daq dialog panel.
*/
protected JPanel getDialogPanel() {
if (daqDialog == null) {
@ -217,7 +216,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.WEST;
constraints.gridx = 0;
addComponent(p, repeat = new JCheckBox("Repeat"), constraints);
addComponent(p, repeat = new JCheckBox("Repeat"), constraints);
constraints.gridx = 2;
constraints.gridy = 1;
constraints.gridwidth = 1;
@ -234,7 +233,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
p.add(fileDateStrip.getDialogComponent(), constraints);
// if (SMRUEnable.isEnable()) {
// no reason to hide this option from users.
// no reason to hide this option from users.
constraints.gridy++;
constraints.gridx = 0;
constraints.gridwidth = 1;
@ -287,8 +286,8 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
fileNameCombo.removeAllItems();
String file;
if (fileInputParameters.recentFiles.size() == 0) return;
for (int i = 0; i < fileInputParameters.recentFiles.size(); i++){
file = fileInputParameters.recentFiles.get(i);
for (String element : fileInputParameters.recentFiles) {
file = element;
if (file == null || file.length() == 0) continue;
fileNameCombo.addItem(file);
}
@ -301,7 +300,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
if (file != null && file.length() > 0) {
fileInputParameters.recentFiles.remove(file);
fileInputParameters.recentFiles.add(0, file);
// check we're not building up too long a list.
// check we're not building up too long a list.
while (fileInputParameters.recentFiles.size() > FileInputParameters.MAX_RECENT_FILES) {
fileInputParameters.recentFiles.remove(fileInputParameters.recentFiles.size()-1);
fileInputParameters.recentFiles.trimToSize();
@ -317,11 +316,11 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
if (skipSecondsField!=null) {
try {
Double skipSeconds = Double.valueOf(skipSecondsField.getText())*1000.; // saved in millis.
Double skipSeconds = Double.valueOf(skipSecondsField.getText())*1000.; // saved in millis.
fileInputParameters.skipStartFileTime = skipSeconds.longValue();
}
catch (Exception e) {
return false;
return false;
}
}
@ -335,13 +334,13 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
@Override
public String getSystemName() {
if (fileInputParameters.recentFiles == null) return null;
if (fileInputParameters.recentFiles.size() < 1) return null;
if ((fileInputParameters.recentFiles == null) || (fileInputParameters.recentFiles.size() < 1)) return null;
File f = getCurrentFile();
if (f == null) return null;
return f.getName();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == fileSelect) {
@ -374,8 +373,8 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
javax.swing.filechooser.FileFilter[] filters = fileChooser
.getChoosableFileFilters();
for (int i = 0; i < filters.length; i++) {
fileChooser.removeChoosableFileFilter(filters[i]);
for (FileFilter filter : filters) {
fileChooser.removeChoosableFileFilter(filter);
}
fileChooser.addChoosableFileFilter(new PamAudioFileFilter());
@ -392,7 +391,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
}
/**
* Called when user selects a file in the dialog.
* Called when user selects a file in the dialog.
* @param newFile
*/
public void setNewFile (String newFile) {
@ -403,17 +402,16 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
}
/**
* Called when a new file or folder is selected.
* Called when a new file or folder is selected.
* @param newFile
*/
public void interpretNewFile(String newFile){
if (newFile == null) return;
if (newFile.length() == 0) return;
if ((newFile == null) || (newFile.length() == 0)) return;
File file = new File(newFile);
setSelectedFileTypes(acquisitionControl.soundFileTypes.getUsedTypes(file));
if (file == null) return;
// try to work out the date of the file
@ -430,13 +428,13 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
// acquisitionDialog.NotifyChange();
if (file.isFile() && !file.isHidden() && acquisitionDialog != null) {
try {
System.out.println("FileInputSystem - interpretNewFile");
System.out.println("FileInputSystem - interpretNewFile");
AudioInputStream audioStream = PamAudioFileManager.getInstance().getAudioInputStream(file);
// // Get additional information from the header if it's a wav file.
// // Get additional information from the header if it's a wav file.
// if (WavFileInputStream.class.isAssignableFrom(audioStream.getClass())) {
// WavHeader wavHeader = ((WavFileInputStream) audioStream).getWavHeader();
// WavHeader wavHeader = ((WavFileInputStream) audioStream).getWavHeader();
// int nChunks = wavHeader.getNumHeadChunks();
// for (int i = 0; i < nChunks; i++) {
// WavHeadChunk aChunk = wavHeader.getHeadChunk(i);
@ -447,7 +445,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
if (audioStream instanceof SudAudioInputStream) {
acquisitionControl.getSUDNotificationManager().interpretNewFile(newFile, (SudAudioInputStream) audioStream);
}
AudioFormat audioFormat = audioStream.getFormat();
// fileLength = file.length();
fileSamples = audioStream.getFrameLength();
@ -473,7 +471,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
super.setStreamStatus(streamStatus);
// file has ended, so notify the daq control.
if (streamStatus == STREAM_ENDED) {
// tell the rest of PAMGUARD to stop.
// tell the rest of PAMGUARD to stop.
PamController.getInstance().stopLater();
}
}
@ -511,24 +509,29 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
return false;
}
@Override
public Serializable getSettingsReference() {
return fileInputParameters;
}
@Override
public long getSettingsVersion() {
return FileInputParameters.serialVersionUID;
}
@Override
public String getUnitName() {
// return "File Input System";
return acquisitionControl.getUnitName();
}
@Override
public String getUnitType() {
// return "Acquisition System";
return "File Input System";
}
@Override
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
// if (PamSettingManager.getInstance().isSettingsUnit(this, pamControlledUnitSettings)) {
fileInputParameters = ((FileInputParameters) pamControlledUnitSettings.getSettings()).clone();
@ -561,16 +564,15 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
// if (fileInputParameters.recentFiles == null) return false;
// if (fileInputParameters.recentFiles.size() < 1) return false;
// String fileName = fileInputParameters.recentFiles.get(0);
if (runFileAnalysis() == false) {
if (!runFileAnalysis()) {
return false;
}
return true;
}
public File getCurrentFile() {
// System.out.println("fileInputParameters: " + fileInputParameters);
if (fileInputParameters.recentFiles == null) return null;
if (fileInputParameters.recentFiles.size() < 1) return null;
// System.out.println("fileInputParameters: " + fileInputParameters);
if ((fileInputParameters.recentFiles == null) || (fileInputParameters.recentFiles.size() < 1)) return null;
String fileName = fileInputParameters.recentFiles.get(0);
return new File(fileName);
}
@ -585,8 +587,8 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
}
/**
* Open the audio stream for processing.
* @return true if audio stream opened correctly.
* Open the audio stream for processing.
* @return true if audio stream opened correctly.
*/
public boolean prepareInputFile() {
@ -603,7 +605,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
audioStream.close();
}
// System.out.println("FileInputSystem - prepareInputFile");
// System.out.println("FileInputSystem - prepareInputFile");
audioStream = PamAudioFileManager.getInstance().getAudioInputStream(currentFile);
@ -627,8 +629,8 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
audioFormat = audioStream.getFormat();
if (audioFormat==null) {
System.err.println("AudioFormat was null: " + currentFile.getAbsolutePath());
return false;
System.err.println("AudioFormat was null: " + currentFile.getAbsolutePath());
return false;
}
// fileLength = currentFile.length();
@ -639,8 +641,8 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
fileInputParameters.bitDepth = audioFormat.getSampleSizeInBits();
loadByteConverter(audioFormat);
// System.out.println("FileInputSystem - prepareInputFile done");
// System.out.println("FileInputSystem - prepareInputFile done");
} catch (UnsupportedAudioFileException ex) {
@ -652,7 +654,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
} catch (IOException ex) {
ex.printStackTrace();
return false;
}
}
return true;
}
@ -671,7 +673,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
this.newDataUnits = acquisitionControl.getDaqProcess().getNewDataQueue();
// if (this.newDataUnits == null) {
// System.err.println("newDataUnits: == null: ");
// System.err.println("newDataUnits: == null: ");
// return false;
// }
@ -679,7 +681,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
String audioFileStr = getCurrentFile()==null? "Null File": getCurrentFile().getAbsolutePath();
String title = "Error loading audio file";
String msg = "<html><p>There was an error trying to access the audio file </p><b> " +
String msg = "<html><p>There was an error trying to access the audio file </p><b> " +
audioFileStr +
"</b><br><br><p>Please check to ensure that the file exists, and that the path entered in PAMGuard is correct.</p>" +
"<p>Note this error may also indicate that the file is corrupt and unreadable by PAMGuard.</p></html>";
@ -707,9 +709,9 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
String audioFileStr = getCurrentFile()==null? "Null File": getCurrentFile().getAbsolutePath();
System.err.println("FileInputSystem: runFileAnalysis: AudioFile format is null: " + audioFileStr);
System.err.println("FileInputSystem: runFileAnalysis: AudioFile format is null: " + audioFileStr);
return false;
return false;
}
nChannels = audioFormat.getChannels();
@ -733,11 +735,11 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
}
/**
* Interpret the file name to get the file time.
* <p>Moved to a separate function so it can be overridden in a special version
* for the DCL5 data set.
* @param file audio file.
* @return time in milliseconds.
* Interpret the file name to get the file time.
* <p>Moved to a separate function so it can be overridden in a special version
* for the DCL5 data set.
* @param file audio file.
* @return time in milliseconds.
*/
public long getFileStartTime(File file) {
// if there is no file, return 0
@ -749,11 +751,11 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
public boolean startSystem(AcquisitionControl daqControl) {
if (audioStream == null) return false;
dontStop = true;
fullyStopped = false;
theThread.start();
@ -767,7 +769,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
public void stopSystem(AcquisitionControl daqControl) {
/*
* This only gets called when daq is stopped manually from the GUI menu.
* It does not get called when a file ends.
* It does not get called when a file ends.
*/
boolean stillRunning = (audioStream != null);
@ -813,7 +815,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
/**
* FLAC uses such a different way of decoding data to wav and aif
* that it needs to use it's own reader.
* that it needs to use it's own reader.
*/
protected void collectFlacData() {
FileInputStream fileStream;
@ -875,7 +877,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
@Override
public void processPCM(ByteData byteData) {
if (dontStop == false) {
if (!dontStop) {
try {
fileStream.close(); // will make the flac reader bomb out !
}
@ -914,7 +916,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
sayEta();
long now = System.currentTimeMillis();
if (lastProgressTime > 0 && totalSamples > lastProgressUpdate) {
double speed = (double) (totalSamples - lastProgressUpdate) /
double speed = (double) (totalSamples - lastProgressUpdate) /
getSampleRate() / ((now-lastProgressTime)/1000.);
speedLabel.setText(String.format(" (%3.1f X RT)", speed));
}
@ -923,7 +925,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
}
while (newDataUnits.getQueueSize() > 3*nChannels) {
if (dontStop == false) break;
if (!dontStop) break;
try {
Thread.sleep(2);
} catch (Exception ex) {
@ -943,6 +945,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
public class CollectorThread implements Runnable {
@Override
public void run() {
if (audioFormat.getEncoding() == FlacEncoding.FLAC) {
collectFlacData();
@ -985,9 +988,9 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
break; // file read error
}
while (bytesRead < blockSize) {
// for single file operation, don't do anything, but need to have a hook
// for single file operation, don't do anything, but need to have a hook
// in here to read multiple files, in which case we may just get the extra
// samples from the next file.
// samples from the next file.
if (bytesRead == -1) {
bytesRead = 0;
}
@ -1009,7 +1012,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
}
if (bytesRead > 0) {
// convert byte array to set of double arrays, one per
// channel
// channel
newSamples = bytesRead / audioFormat.getFrameSize();
doubleData = new double[nChannels][newSamples];
int convertedSamples = byteConverter.bytesToDouble(byteArray, doubleData, bytesRead);
@ -1038,7 +1041,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
sayEta();
long now = System.currentTimeMillis();
if (lastProgressTime > 0 && totalSamples > lastProgressUpdate) {
double speed = (double) (totalSamples - lastProgressUpdate) /
double speed = (double) (totalSamples - lastProgressUpdate) /
getSampleRate() / ((now-lastProgressTime)/1000.);
if (speedLabel!=null) speedLabel.setText(String.format(" (%3.1f X RT)", speed));
}
@ -1051,7 +1054,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
* unit, then set it's reference to zero.
*/
while (newDataUnits.getQueueSize() > 3*nChannels) {
if (dontStop == false) break;
if (!dontStop) break;
try {
Thread.sleep(1);
} catch (Exception ex) {
@ -1062,7 +1065,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
totalSamples += newSamples;
readFileSamples += newSamples;
}
}
else {
break; // end of file
}
@ -1079,10 +1082,10 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
}
}
// note the reason why the file has ended.
if (dontStop == false) { // stop button pressed
if (!dontStop) { // stop button pressed
setStreamStatus(STREAM_PAUSED);
}
else { // file ended, since dont stop is true.
else { // file ended, since dont stop is true.
setStreamStatus(STREAM_ENDED);
}
//acquisitionControl.getDaqProcess().acquisitionStopped();
@ -1094,13 +1097,13 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
}
/**
* Open next file in a list for continuous processing, not the
* Open next file in a list for continuous processing, not the
* function that opens a file for normal processing.
* @param totalSamples
* @return
*/
protected boolean openNextFile(long totalSamples) {
if (fileInputParameters.repeatLoop == false) {
if (!fileInputParameters.repeatLoop) {
return false;
}
// otherwise, open the same file again.
@ -1112,7 +1115,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
/** Format one channel of the data in a byte array into a sample array.
*/
public static double[] bytesToSamples(byte[] byteArray, long nBytes, int channel,
AudioFormat audioFormat)
AudioFormat audioFormat)
{
int nSamples = (int)(nBytes / audioFormat.getFrameSize());
double[] samples = new double[nSamples];
@ -1120,7 +1123,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
int bytesPerSample = ((audioFormat.getSampleSizeInBits() + 7) / 8);
int byteI = channel * bytesPerSample;
for (int isamp = 0; isamp < nSamples; isamp++) {
samples[isamp] =
samples[isamp] =
getSample(byteArray, byteI, bytesPerSample, audioFormat.isBigEndian());
byteI += audioFormat.getFrameSize();
}
@ -1160,7 +1163,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
}
/**
* Called when all files to be processed have been processed.
* Called when all files to be processed have been processed.
*/
protected void fileListComplete() {
if (GlobalArguments.getParam(PamController.AUTOEXIT) != null) {
@ -1248,7 +1251,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
/**
* Get the acquisition control for the input system
* @return the acquisition control.
* @return the acquisition control.
*/
public AcquisitionControl getAquisitionControl() {
return this.acquisitionControl;
@ -1272,7 +1275,7 @@ public class FileInputSystem extends DaqSystem implements ActionListener, PamSe
/**
* Called when the file or file list selection is changes and finds a list of all
* sound file types included in the selection. this is only implemented for SUD files
* at the moment, the idea being to offer some additional functionality.
* at the moment, the idea being to offer some additional functionality.
* @param selectedFileTypes the selectedFileTypes to set
*/
public void setSelectedFileTypes(List<SoundFileType> selectedFileTypes) {

View File

@ -7,7 +7,6 @@ import java.lang.reflect.Field;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PrivatePamParameterData;
import simulatedAcquisition.SimProcess;
/**
* Control parameters for FolderInputSystem
@ -18,11 +17,11 @@ import simulatedAcquisition.SimProcess;
public class FolderInputParameters extends FileInputParameters implements Serializable, Cloneable, ManagedParameters {
static public final long serialVersionUID = 1;
public boolean subFolders;
public boolean mergeFiles;
private String[] selectedFileNames;
/**
@ -38,9 +37,9 @@ public class FolderInputParameters extends FileInputParameters implements Serial
}
/**
* Get the list of selected files as strings. If you want them as
* Get the list of selected files as strings. If you want them as
* Files, call getselectedFileFiles()
* @return List of file paths in String format.
* @return List of file paths in String format.
*/
public String[] getSelectedFiles() {
return selectedFileNames;
@ -53,7 +52,7 @@ public class FolderInputParameters extends FileInputParameters implements Serial
public void setSelectedFiles(String[] selectedFiles) {
this.selectedFileNames = selectedFiles;
}
/**
* Set the list of selected files. Note that these are now stored as strings
* to avoid some serialisation problems with some subclasses of io.File
@ -69,11 +68,11 @@ public class FolderInputParameters extends FileInputParameters implements Serial
selectedFileNames[i] = files[i].getAbsolutePath();
}
}
/**
* Get the list of selected Files, converted back to File objects
* Get the list of selected Files, converted back to File objects
* from strings
* @return list of selected files.
* @return list of selected files.
*/
public File[] getSelectedFileFiles() {
if (selectedFileNames == null) {

View File

@ -24,16 +24,14 @@ import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.border.TitledBorder;
import Acquisition.filedate.FileDateDialogStrip;
import Acquisition.layoutFX.AcquisitionPaneFX;
import Acquisition.layoutFX.DAQSettingsPane;
import Acquisition.layoutFX.FolderInputPane;
import javafx.application.Platform;
import pamguard.GlobalArguments;
import Acquisition.pamAudio.PamAudioFileManager;
import Acquisition.pamAudio.PamAudioFileFilter;
import Acquisition.pamAudio.PamAudioFileLoader;
import Acquisition.pamAudio.PamAudioSystem;
import Acquisition.pamAudio.PamAudioFileManager;
import PamController.DataInputStore;
import PamController.InputStoreInfo;
import PamController.PamControlledUnitSettings;
@ -52,12 +50,14 @@ import PamView.dialog.PamLabel;
import PamView.panel.PamPanel;
import PamView.panel.PamProgressBar;
import PamguardMVC.debug.Debug;
import javafx.application.Platform;
import pamguard.GlobalArguments;
/**
* Read multiple files in sequence. Options exist to either pause and
* restart analysis after each file, or to merge files into one long
* continuous sound stream.
*
*
* @author Doug Gillespie
*
*/
@ -70,7 +70,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
private boolean running = false;
protected ArrayList<WavFileType> allFiles = new ArrayList<WavFileType>();
protected ArrayList<WavFileType> allFiles = new ArrayList<>();
protected int currentFile;
@ -85,18 +85,18 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
protected long eta = -1;
private FolderInputParameters folderInputParameters;
public static final String GlobalWavFolderArg = "-wavfilefolder";
/**
* Text field for skipping initial few seconds of a file.
* Text field for skipping initial few seconds of a file.
*/
private JTextField skipSecondsField;
/**
* Panel which shows bespoke settings for certain audio loaders. Contains nothing
* if the audio loader has no settings or no file is selected.
* if the audio loader has no settings or no file is selected.
*/
protected PamPanel audioLoaderHolder;
@ -109,11 +109,11 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
@Override
public boolean prepareInputFile() {
boolean ans = super.prepareInputFile();
if (ans == false && ++currentFile < allFiles.size()) {
if (!ans && ++currentFile < allFiles.size()) {
System.out.println("Failed to open sound file. Try again with file " + allFiles.get(currentFile).getName());
/*
* jumping striaght to the next file messes it up if it thinks the files
* are continuous, so we HAVE to stop and restart.
* are continuous, so we HAVE to stop and restart.
*/
// return prepareInputFile();
PamController.getInstance().pamStop();
@ -138,7 +138,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
/**
* Check to see if acquisition source folder was set in the command line.
* Check to see if acquisition source folder was set in the command line.
*/
private String[] checkComandLineFolder() {
String globalFolder = GlobalArguments.getParam(GlobalWavFolderArg);
@ -146,28 +146,29 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
if (globalFolder == null) {
return null;
}
// see if it at least exists, though will we want to do this for Network folders ?
// see if it at least exists, though will we want to do this for Network folders ?
File aFile = new File(globalFolder);
if (aFile.exists() == false) {
if (!aFile.exists()) {
System.err.printf("Command line wav folder \"%s\" does not exist", globalFolder);
// return null;
}
String[] selList = {globalFolder};
// folderInputParameters.setSelectedFiles(selList);
// need to immediately make the allfiles list since it's about to get used by the reprocess manager
// need to worry about how to wait for this since it's starting in a different thread.
// need to worry about how to wait for this since it's starting in a different thread.
//makeSelFileList();
return selList;
}
/**
* Restarts after a file has ended when processing multiple files.
* Restarts after a file has ended when processing multiple files.
* 27 Jan 2011 - this now reschedules in the AWT thread
* @author Doug Gillespie
*
*/
class RestartTimer implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// System.out.println("Restart later time action");
@ -177,8 +178,8 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
}
@Override
protected JPanel createDaqDialogPanel() {
JPanel p = new JPanel();
@ -247,7 +248,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
// if (SMRUEnable.isEnable()) {
// no reason to hide this option from users.
// no reason to hide this option from users.
constraints.gridy++;
constraints.gridx = 0;
constraints.gridwidth = 1;
@ -259,7 +260,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
// }
//panel to show bespoke settings for certain audio loaders.
//panel to show bespoke settings for certain audio loaders.
constraints.anchor = GridBagConstraints.WEST;
constraints.gridx = 0;
constraints.gridy++;
@ -271,7 +272,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
return p;
}
class FileComboListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
@ -292,12 +293,12 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
checkFileHeaders();
}
}
/**
* Checks file length matched actual file data length and repairs if necessary.
* Checks file length matched actual file data length and repairs if necessary.
*/
public void checkFileHeaders() {
CheckWavFileHeaders.showDialog(acquisitionDialog, this);
@ -306,13 +307,14 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
class FindAudioFolder implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
selectFolder();
}
}
}
@Override
public void setSelected(boolean select) {
@ -323,15 +325,15 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
/**
* Make a list of wav files within a folder. In some circumstances this can be a list
* of actual files in a folder. Also needs to handle the possibility of it using
* a globally set folder name.
* Make a list of wav files within a folder. In some circumstances this can be a list
* of actual files in a folder. Also needs to handle the possibility of it using
* a globally set folder name.
* @return flag to indicate...nothing?
*/
public int makeSelFileList() {
String[] selection = checkComandLineFolder();
if (selection == null) {
if (fileInputParameters.recentFiles == null || fileInputParameters.recentFiles.size() < 1) {
return 0;
@ -346,9 +348,9 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
return makeSelFileList(selection);
}
/**
* Make a list of wav files within a folder.
* Make a list of wav files within a folder.
* @param rootList
* @return
*/
@ -356,22 +358,22 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
// File[] selectedFiles = folderInputParameters.getSelectedFiles();
// if (selectedFiles.length == 1 && selectedFiles[0].isDirectory()) {
// String folderName = fileInputParameters.recentFiles.get(0);
//Swing calls a dialog with progress bar from the wavListWorker
wavListStart = System.currentTimeMillis();
if (folderInputPane==null) {
//Swing way
wavListWorker.startFileListProcess(PamController.getMainFrame(), rootList,
wavListWorker.startFileListProcess(PamController.getMainFrame(), rootList,
folderInputParameters.subFolders, true);
}
else {
//FX system
PamWorker<FileListData<WavFileType>> worker = wavListWorker.makeFileListProcess(rootList, folderInputParameters.subFolders, true);
folderInputPane.setFileWorker(worker);
if (worker!=null) worker.start();
PamWorker<FileListData<WavFileType>> worker = wavListWorker.makeFileListProcess(rootList, folderInputParameters.subFolders, true);
folderInputPane.setFileWorker(worker);
if (worker!=null) worker.start();
}
return 0;
}
@ -413,7 +415,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
// folderProgress.setValue(0);
//
// Collections.sort(allFiles);
//
//
// return allFiles.size();
//
// }
@ -463,9 +465,9 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
if (ans == JFileChooser.APPROVE_OPTION) {
/*
* if it's a single directory that's been selected, then
* if it's a single directory that's been selected, then
* set that with setNewFile. If multiple files and directories
* are accepted, select the parent directory of all of them.
* are accepted, select the parent directory of all of them.
*/
File[] files = fc.getSelectedFiles();
if (files.length <= 0) return;
@ -477,12 +479,12 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
File aFile = files[0];
setNewFile(aFile.getAbsolutePath());
}
/*
* The file chooser is returning sub classes of File which are not
* serialisable, so we can't use them. We need to convert their
* names to strings, which can be safely serialized. This will
* serialisable, so we can't use them. We need to convert their
* names to strings, which can be safely serialized. This will
* all happen in FolderInputParameters.
*/
folderInputParameters.setSelectedFiles(fc.getSelectedFiles());
@ -500,12 +502,12 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
long wavListStart;
/**
* Creates a list of wav files.
* Creates a list of wav files.
*/
WavListWorker wavListWorker = new WavListWorker(new WavListReceiver());
private class WavListReceiver implements WavListUser {
@Override
@ -522,8 +524,8 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
/*
* don't actually need to do anything ? Could make a new list, but do it from what's in the
* folder parameters, not the file parameters. do nothing here, or it gets too complicated.
* Call the search function from the file select part of the dialot.
* folder parameters, not the file parameters. do nothing here, or it gets too complicated.
* Call the search function from the file select part of the dialot.
*/
// test the new Wav list worker ...
@ -533,31 +535,31 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
/**
* Callback when the file list has completed it's background task.
* Callback when the file list has completed it's background task.
* @param fileListData
*/
public void newFileList(FileListData<WavFileType> fileListData) {
// System.out.printf("Wav list recieved with %d files after %d millis\n",
// System.out.printf("Wav list recieved with %d files after %d millis\n",
// fileListData.getFileCount(), System.currentTimeMillis() - wavListStart);
allFiles = fileListData.getListCopy();
List<WavFileType> asList = allFiles;
setSelectedFileTypes(acquisitionControl.soundFileTypes.getUsedTypes(allFiles));
//set the date of the first file.
//set the date of the first file.
setFileDateText();
//set any bespoke options for the files to be laoded.
//set any bespoke options for the files to be laoded.
setFileOptionPanel();
// also open up the first file and get the sample rate and number of channels from it
// and set these
File file = getCurrentFile();
if (file == null) return;
AudioInputStream audioStream;
AudioInputStream audioStream;
/****Swing GUI stuff****/
if (file.isFile() && !file.isHidden() && acquisitionDialog != null) {
//Hidden files should not be used in analysis...
@ -574,31 +576,31 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
System.err.println("Error in file " + file.getAbsolutePath() + " " + Ex.getLocalizedMessage());
}
}
// set the min and max of the folder progress bar
folderProgress.setMinimum(0);
folderProgress.setMaximum(allFiles.size());
/****FX GUI stuff****/
if (folderInputPane!=null) {
Platform.runLater(()->{
folderInputPane.newFileList(fileListData);
folderInputPane.newFileList(fileListData);
});
}
}
/**
* Fudge function so that the RonaInputsystem can always fudge the number
* of channels to be 7.
* of channels to be 7.
* @param nChannels
* @return
*/
protected int fudgeNumChannels(int nChannels) {
return nChannels;
}
/**
* Set bespoke options for certain file types.
* Set bespoke options for certain file types.
*/
public void setFileOptionPanel() {
getDialogPanel(); // make sure panel is created
@ -606,8 +608,8 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
audioLoaderHolder.removeAll();
if (allFiles.size() > 0) {
//Get all the audio file laoders that will be used for this list of files. Usually
//just one but possible that there can be mixed files.
//Get all the audio file laoders that will be used for this list of files. Usually
//just one but possible that there can be mixed files.
ArrayList<PamAudioFileLoader> loaders = PamAudioFileManager.getInstance().getAudioFileLoaders(allFiles);
GridBagConstraints constraints = new GridBagConstraints();
@ -627,7 +629,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
/**
* Show the date of the first file in the dialog.
* Show the date of the first file in the dialog.
*/
public void setFileDateText() {
if (allFiles.size() > 0) {
@ -670,9 +672,9 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
@Override
protected boolean openNextFile(long totalSamples) {
boolean ans = false;
if (folderInputParameters.mergeFiles == false) return false;
if (!folderInputParameters.mergeFiles) return false;
long currFileStart = 0;
long currFileLength = 0;
long currFileEnd = 0;
@ -692,7 +694,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
if (currFileEnd == 0) {
// System.out.println("OpenNextfile " + currentFile + " " + allFiles.get(currentFile).getName());
// also check to see if the start time of the next file is the same as the
// also check to see if the start time of the next file is the same as the
// end time of the current file.
currFileEnd = PamCalendar.getTimeInMillis();
long lastBit = (long) ((blockSamples * 1000L) / getSampleRate());
@ -705,22 +707,22 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
currentFile--;
return false;
/*
* Return since it's not possible to merge this file into the
* Return since it's not possible to merge this file into the
* next one. In this instance, DAQ will restart, and the currentfile
* counter will increment elsewhere.
* counter will increment elsewhere.
*/
}
setFolderProgress();
// sayEta();
/*
* I think that here, we just need a check of the file. the prepareInputFile in
* this class will (on failure) move straight to the next file and also issue a
* I think that here, we just need a check of the file. the prepareInputFile in
* this class will (on failure) move straight to the next file and also issue a
* stop/start, which is not good if it's trying a continuous file, where this is
* being called, if false is returned it should manage moving onto the next file by
* itself if we use the super.prep ....
* being called, if false is returned it should manage moving onto the next file by
* itself if we use the super.prep ....
*/
ans = super.prepareInputFile();
if (ans == false) {
if (!ans) {
return false;
}
currentFileStart = System.currentTimeMillis();
@ -728,11 +730,11 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
// acquisitionControl.getDaqProcess().setSampleRate(currentSampleRate = audioFormat.getSampleRate(), true);
// }
/**
* Send a dataunit to the database to mark the file changeover.
* Send a dataunit to the database to mark the file changeover.
*/
DaqStatusDataUnit daqStatusDataUnit = new DaqStatusDataUnit(currentFileStart, currentFileStart, currentFileStart,
totalSamples, null, "NextFile", "File End",
acquisitionControl.acquisitionParameters, getSystemName(), totalSamples/getSampleRate(), 0);
DaqStatusDataUnit daqStatusDataUnit = new DaqStatusDataUnit(currentFileStart, currentFileStart, currentFileStart,
totalSamples, null, "NextFile", "File End",
acquisitionControl.acquisitionParameters, getSystemName(), totalSamples/getSampleRate(), 0);
acquisitionControl.getAcquisitionProcess().getDaqStatusDataBlock().addPamData(daqStatusDataUnit);
}
return ans;
@ -746,14 +748,14 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
if (currentFile < allFiles.size()) {
// only restart if the file ended - not if it stopped
if (getStreamStatus() == STREAM_ENDED && PamController.getInstance().isManualStop() == false) {
if (getStreamStatus() == STREAM_ENDED && !PamController.getInstance().isManualStop()) {
// System.out.println(String.format("Start new file timer (file %d/%d)",currentFile+1,allFiles.size()));
newFileTimer.start();
}
}
calculateETA();
setFolderProgress();
if (currentFile > 0 && currentFile >= allFiles.size()) {
fileListComplete();
}
@ -776,7 +778,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
PamProgressBar folderProgress = new PamProgressBar(PamProgressBar.defaultColor);
private FolderInputPane folderInputPane;
@Override
public Component getStatusBarComponent() {
@ -817,24 +819,24 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
currentFile = 0;
if (skipSecondsField!=null) {
try {
Double skipSeconds = Double.valueOf(skipSecondsField.getText())*1000.; // saved in millis.
Double skipSeconds = Double.valueOf(skipSecondsField.getText())*1000.; // saved in millis.
folderInputParameters.skipStartFileTime = skipSeconds.longValue();
}
catch (Exception e) {
return false;
return false;
}
}
//get bespoke paramters from selected audio loaders.
//get bespoke paramters from selected audio loaders.
ArrayList<PamAudioFileLoader> loaders = PamAudioFileManager.getInstance().getAudioFileLoaders(allFiles);
for (PamAudioFileLoader loader : loaders) {
if (loader.getSettingsPane()!=null) {
loader.getSettingsPane().getParams();
}
}
return super.dialogGetParams();
}
@ -845,7 +847,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
// would hold a null. The system type is used by the getParameterSet method to decide
// whether or not to include the parameters in the XML output
if (fileInputParameters.systemType==null) fileInputParameters.systemType=getSystemType();
super.dialogSetParams();
subFolders.setSelected(folderInputParameters.subFolders);
mergeFiles.setSelected(folderInputParameters.mergeFiles);
@ -853,7 +855,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
if (skipSecondsField!=null) {
skipSecondsField.setText(String.format("%.1f", fileInputParameters.skipStartFileTime/1000.));
}
}
@Override
@ -918,14 +920,15 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
/****JavaFX bits***/
@Override
public DAQSettingsPane getDAQSpecificPane(AcquisitionPaneFX acquisitionPaneFX) {
if (folderInputPane==null) this.folderInputPane = new FolderInputPane(this, acquisitionPaneFX);
if (folderInputPane==null) this.folderInputPane = new FolderInputPane(this, acquisitionPaneFX);
return folderInputPane;
}
/**
* Called by AcquisitionDialog.SetParams so that the dialog node can update it's
* fields.
* fields.
*/
public void dialogFXSetParams() {
folderInputPane.setParams(folderInputParameters);
@ -933,7 +936,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
@Override
public InputStoreInfo getStoreInfo(boolean detail) {
System.out.println("FolderInputSystem: Get store info start:");
System.out.println("FolderInputSystem: Get store info start:");
if (allFiles == null || allFiles.size() == 0) {
return null;
}
@ -963,12 +966,12 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
lastFileEnd = allFileStarts[i] + (long) (lastFile.getDurationInSeconds()*1000.);
}
}
storeInfo.setFirstFileStart(firstFileStart); // just incase changed.
storeInfo.setFirstFileStart(firstFileStart); // just incase changed.
storeInfo.setLastFileEnd(lastFileEnd); // just incase changed
storeInfo.setFileStartTimes(allFileStarts);
storeInfo.setFileEndTimes(allFileEnds);
}
System.out.println("FolderInputSystem: Get store info complete:");
System.out.println("FolderInputSystem: Get store info complete:");
return storeInfo;
}
@ -977,8 +980,8 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
/**
* Called from the reprocess manager just before PAMGuard starts with a time
* we want to process from. This should be equal to the start of one of the files
* so all we have to do (in principle) is to set the currentfile to that index and
* processing will continue from there.
* so all we have to do (in principle) is to set the currentfile to that index and
* processing will continue from there.
*/
if (allFiles == null || allFiles.size() == 0) {
System.out.println("Daq setanal start time: no files to check against");
@ -987,7 +990,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
System.out.printf("setAnalysisStarttTime: checking %d files for start time of %s\n", allFiles.size(), PamCalendar.formatDBDateTime(startTime));
/*
* If the starttime is maxint then there is nothing to do, but we do need to set the file index
* correctly to not over confuse the batch processing system.
* correctly to not over confuse the batch processing system.
*/
long lastFileTime = getFileStartTime(allFiles.get(allFiles.size()-1).getAbsoluteFile());
if (startTime > lastFileTime) {
@ -1008,13 +1011,14 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
return true;
}
}
return false;
}
/**
* Get a status update for batch processing.
* Get a status update for batch processing.
*/
@Override
public String getBatchStatus() {
int nFiles = 0;
if (allFiles != null) {
@ -1025,8 +1029,8 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
String bs = String.format("%d,%d,%d,%s", nFiles,currentFile,generalStatus,currFile);
return bs;
}
}

View File

@ -10,18 +10,18 @@ public class KETime {
/**
* Unpack the KE buoy data format. This has a decimal number of
* seconds, but is otherwise quite rational.
* Unpack the KE buoy data format. This has a decimal number of
* seconds, but is otherwise quite rational.
* @param numPart - the date string
* @return time in millis
*/
public static long getKEBuoyTime(String numPart) {
int dotPos = numPart.indexOf('.', 0);
if (dotPos < 0) {
return Long.MIN_VALUE;
}
String mainBit = numPart.substring(0, dotPos);
String fracPart = numPart.substring(dotPos);
String fmt = "yyyyMMdd_HHmmss";
@ -42,32 +42,32 @@ public class KETime {
cl.setTimeZone(TimeZone.getTimeZone("GMT"));
cl.setTime(d);
long millis = cl.getTimeInMillis();
try {
double fracBit = Double.valueOf(fracPart);
millis += (long) (fracBit*1000.);
}
catch (NumberFormatException e) {
}
return millis;
}
/**
* Unpack the PLA buoy data format (superseeds KE Buoy). This has a nanosecond value after the seconds
* e.g. would be ddmmyyyy_HHMMSS_FFFFF in MATLAB format.
* e.g. would be ddmmyyyy_HHMMSS_FFFFF in MATLAB format.
* @param numPart - the date string
* @return time in millis
*/
public static long getPLABuoyTime(String numPart) {
String[] timeSections=numPart.split("_");
//got have a data section, time section and then nanosecond section
//got have a data section, time section and then nanosecond section
if (timeSections.length!=3 || timeSections[2].length()!=6){
return Long.MIN_VALUE;
}
String mainBit = timeSections[0]+timeSections[1];
String fracPart = timeSections[2];
String fmt = "yyyyMMddHHmmss";
@ -88,13 +88,13 @@ public class KETime {
cl.setTimeZone(TimeZone.getTimeZone("GMT"));
cl.setTime(d);
long millis = cl.getTimeInMillis();
try {
double fracBit = Double.valueOf(fracPart);
millis += (long) (fracBit/1000.);
}
catch (NumberFormatException e) {
}
return millis;

View File

@ -8,24 +8,21 @@ import java.io.File;
import java.io.IOException;
import PamDetection.RawDataUnit;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import PamguardMVC.PamRawDataBlock;
import binaryFileStorage.BinaryDataSource;
import binaryFileStorage.BinaryHeader;
import binaryFileStorage.BinaryObjectData;
import binaryFileStorage.BinaryOutputStream;
import binaryFileStorage.ModuleFooter;
import binaryFileStorage.ModuleHeader;
import binaryFileStorage.PackedBinaryObject;
/**
* Data source for Raw acoustic data. This is set up to NEVER
* Data source for Raw acoustic data. This is set up to NEVER
* be written to binary storage files - WAV files are way better
* for that. The purpose of this class is to enable sending of
* raw audio data over the network. Currently assumes 16 bit audio,
* but may make this more flexible in the future is higher res ADC's
* are in use within PAMGUARD.
* for that. The purpose of this class is to enable sending of
* raw audio data over the network. Currently assumes 16 bit audio,
* but may make this more flexible in the future is higher res ADC's
* are in use within PAMGUARD.
* @author Doug Gillespie
*
*/
@ -35,7 +32,7 @@ public class RawDataBinaryDataSource extends BinaryDataSource {
private ByteArrayOutputStream bos;
private DataOutputStream dos;
private long offsetSamples;
public RawDataBinaryDataSource(PamRawDataBlock sisterDataBlock) {
super(sisterDataBlock);
setDoBinaryStore(false);
@ -72,8 +69,8 @@ public class RawDataBinaryDataSource extends BinaryDataSource {
@Override
public BinaryObjectData getPackedData(PamDataUnit pamDataUnit) {
/**
* Pack a raw data unit. N.B. Raw data units in PAMGAURD only contain a single
* channel of data. The channel number will need to be packed into the header.
* Pack a raw data unit. N.B. Raw data units in PAMGAURD only contain a single
* channel of data. The channel number will need to be packed into the header.
*/
RawDataUnit rawDataUnit = (RawDataUnit) pamDataUnit;
int duration = rawDataUnit.getSampleDuration().intValue();
@ -98,14 +95,14 @@ public class RawDataBinaryDataSource extends BinaryDataSource {
} catch (IOException e) {
e.printStackTrace();
}
return new BinaryObjectData(0, bos.toByteArray());
}
@Override
public PamDataUnit sinkData(BinaryObjectData binaryObjectData,
BinaryHeader bh, int moduleVersion) {
ByteArrayInputStream bis = new ByteArrayInputStream(binaryObjectData.getData(),
ByteArrayInputStream bis = new ByteArrayInputStream(binaryObjectData.getData(),
0, binaryObjectData.getDataLength());
DataInputStream dis = new DataInputStream(bis);
long startSample;
@ -117,15 +114,15 @@ public class RawDataBinaryDataSource extends BinaryDataSource {
try {
startSample = dis.readLong();
/*
* Muck a bit with the timing so that within this network received
* data, sample counts get restarted at 0. This will ensure that
* millisecond and ADC count timings end up about right for the data.
* Muck a bit with the timing so that within this network received
* data, sample counts get restarted at 0. This will ensure that
* millisecond and ADC count timings end up about right for the data.
*/
if (offsetSamples == 0) {
offsetSamples = startSample;
}
startSample -= offsetSamples; // subtract off the offset from the sample number.
startSample -= offsetSamples; // subtract off the offset from the sample number.
channelMap = dis.readInt();
duration = dis.readInt();
nBytes = dis.readByte();
@ -142,8 +139,8 @@ public class RawDataBinaryDataSource extends BinaryDataSource {
}
RawDataUnit rawDataUnit = new RawDataUnit(binaryObjectData.getTimeMilliseconds(), channelMap, startSample, duration);
rawDataUnit.setRawData(rawData, true);
// System.out.println("raw data arrived to unpack on channels " +
rawDataUnit.setRawData(rawData, true);
// System.out.println("raw data arrived to unpack on channels " +
// channelMap + " sample " + startSample);
return rawDataUnit;
}

View File

@ -10,11 +10,9 @@ import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.sound.sampled.AudioFormat.Encoding;
import javax.swing.filechooser.FileFilter;
//import org.kc7bfi.jflac.FLACDecoder;
//import org.kc7bfi.jflac.PCMProcessor;
@ -25,27 +23,26 @@ import org.jflac.PCMProcessor;
import org.jflac.metadata.StreamInfo;
import org.jflac.util.ByteData;
import wavFiles.ByteConverter;
import Acquisition.pamAudio.PamAudioFileManager;
import Acquisition.pamAudio.PamAudioFileFilter;
import Acquisition.pamAudio.PamAudioSystem;
import Acquisition.pamAudio.PamAudioFileManager;
import PamDetection.RawDataUnit;
import PamUtils.FileParts;
import PamUtils.PamCalendar;
import PamUtils.PamFileFilter;
import PamUtils.PamUtils;
import wavFiles.ByteConverter;
/**
* Bespoke system for handling data from the Rona hydrophone array which
* consists of sets of seven files, each with different ends in th ename.
* Bespoke system for handling data from the Rona hydrophone array which
* consists of sets of seven files, each with different ends in th ename.
* @author Doug
*
*/
public class RonaInputSystem extends FolderInputSystem {
private static final int RONACHANNELS = 0x21; // channels 5 and 0
private static final int NCHANNELS = PamUtils.getNumChannels(RONACHANNELS);
private static final int NCHANNELS = PamUtils.getNumChannels(RONACHANNELS);
private AudioInputStream[] audioStreams = new AudioInputStream[NCHANNELS];
@ -58,9 +55,9 @@ public class RonaInputSystem extends FolderInputSystem {
private int readyMask = PamUtils.makeChannelMap(NCHANNELS);
private int runningChannels;
private long lastFileTime = 0;
public static final String systemType = "Rona File Folders";
public RonaInputSystem(AcquisitionControl acquisitionControl) {
@ -98,7 +95,7 @@ public class RonaInputSystem extends FolderInputSystem {
@Override
public boolean accept(File f) {
if (super.accept(f) == false) {
if (!super.accept(f)) {
return false;
}
if (f.isDirectory()) {
@ -108,11 +105,11 @@ public class RonaInputSystem extends FolderInputSystem {
String name = f.getName();
int lastDot = name.lastIndexOf('.');
if (lastDot < 0) return false;
char ch = name.charAt(lastDot-1);
char ch = name.charAt(lastDot-1);
if ('1' != ch) {
return false;
}
// now check all other files in the set exist.
// now check all other files in the set exist.
for (int i = 1; i < NCHANNELS; i++) {
File chanFile = findChannelFile(f, i, 2);
if (chanFile == null) {
@ -177,14 +174,14 @@ public class RonaInputSystem extends FolderInputSystem {
} catch (IOException ex) {
ex.printStackTrace();
return false;
}
}
return true;
}
/**
* swap the last digit in a file name for the higher channel
* number - rememebr the channels are one indexed.
* swap the last digit in a file name for the higher channel
* number - rememebr the channels are one indexed.
* @param baseFile base file
* @param index 0 based file index
* @return new file with the 1 replaced by another number
@ -199,7 +196,7 @@ public class RonaInputSystem extends FolderInputSystem {
}
/**
* Search for a nearby file with the same name, but secondds may differ
* Search for a nearby file with the same name, but secondds may differ
* by one or two secs - may need to generate complete new file names !
* @param baseFile
* @param index
@ -214,7 +211,7 @@ public class RonaInputSystem extends FolderInputSystem {
index = PamUtils.getNthChannel(index, RONACHANNELS);
/*
* files are in the format 20051209-185714-02.flac
* so get the time and add an offset to make a new file name.
* so get the time and add an offset to make a new file name.
*/
long fileTime = getFileStartTime(baseFile);
if (fileTime <= 0) {
@ -245,7 +242,7 @@ public class RonaInputSystem extends FolderInputSystem {
@Override
public boolean prepareSystem(AcquisitionControl daqControl) {
this.acquisitionControl = daqControl;
if (prepareInputFile() == false) {
if (!prepareInputFile()) {
return false;
}
this.newDataUnits = acquisitionControl.getDaqProcess().getNewDataQueue();
@ -285,7 +282,7 @@ public class RonaInputSystem extends FolderInputSystem {
currentFileStart = System.currentTimeMillis();
fileStartTime = currentFileStart;
for (int i = 0; i < NCHANNELS; i++) {
Thread thread = new Thread(flacThreads[i]);
thread.start();
@ -304,7 +301,7 @@ public class RonaInputSystem extends FolderInputSystem {
else {
runningChannels &= ~(1<<channel);
}
System.out.println(String.format("Set channel %d run status to %s overall status was %d, is now %d (%s)", channel, new Boolean(running).toString(),
was, runningChannels, PamUtils.getChannelList(runningChannels)));
@ -332,7 +329,7 @@ public class RonaInputSystem extends FolderInputSystem {
calculateETA();
systemHasStopped(runningChannels > 0);
}
@Override
protected void calculateETA() {
long now = System.currentTimeMillis();
@ -359,8 +356,8 @@ public class RonaInputSystem extends FolderInputSystem {
double[] newRaw = Arrays.copyOf(readyDataUnits[i].getRawData(), (int) firstDataLen);
readyDataUnits[i].setRawData(newRaw);
/**
* Will also need to stop the run at this point since it's evident that one file is longer than others
* and will now go into a wait state while it tries to match it's data with other channels.
* Will also need to stop the run at this point since it's evident that one file is longer than others
* and will now go into a wait state while it tries to match it's data with other channels.
*/
dontStop = false;
}
@ -368,7 +365,7 @@ public class RonaInputSystem extends FolderInputSystem {
newDataUnits.addNewData(readyDataUnits[i]);
}
while (newDataUnits.getQueueSize() > NCHANNELS) {
if (dontStop == false) break;
if (!dontStop) break;
try {
Thread.sleep(2);
} catch (Exception ex) {
@ -403,7 +400,7 @@ public class RonaInputSystem extends FolderInputSystem {
@Override
public void processPCM(ByteData byteData) {
if (dontStop == false) {
if (!dontStop) {
try {
fileStream.close(); // will make the flac reader bomb out !
}
@ -443,12 +440,12 @@ public class RonaInputSystem extends FolderInputSystem {
// newDataUnit.timeMilliseconds = blockMillis;
PamCalendar.setSoundFileTimeInMillis(blockMillis);
if (fileSamples > 0 && totalSamples - lastProgressUpdate >= getSampleRate()*2) {
int progress = (int) (1000. * (float)theseFileSamples / (float) fileSamples);
int progress = (int) (1000. * theseFileSamples / fileSamples);
fileProgress.setValue(progress);
sayEta();
long now = System.currentTimeMillis();
if (lastProgressTime > 0 && totalSamples > lastProgressUpdate) {
double speed = (double) (totalSamples - lastProgressUpdate) /
double speed = (double) (totalSamples - lastProgressUpdate) /
getSampleRate() / ((now-lastProgressTime)/1000.);
speedLabel.setText(String.format(" (%3.1f X RT)", speed));
}
@ -458,18 +455,18 @@ public class RonaInputSystem extends FolderInputSystem {
}
/**
* Sit and wait until all threads have put there data units into the
* Sit and wait until all threads have put there data units into the
* ready array, then they will release at the same time and this thread
* can continue round.
* can continue round.
*/
for (int ichan = 0; ichan < 1; ichan++) {
while (waitingDataUnit(ichan+channelOffset)) {
if (dontStop == false) break;
if (!dontStop) break;
try {
Thread.sleep(2);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
@ -522,7 +519,7 @@ public class RonaInputSystem extends FolderInputSystem {
// byteData = flacDecoder.decodeFrame(flacFrame, byteData);
// }
} catch (IOException e) {
// don't print this since it happens naturally when we press the stop button.
// don't print this since it happens naturally when we press the stop button.
// e.printStackTrace();
}
try {

View File

@ -5,7 +5,6 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import simulatedAcquisition.SimProcess;
/**
* Used by SoundCardSystem
@ -16,12 +15,12 @@ import simulatedAcquisition.SimProcess;
public class SoundCardParameters implements Serializable, Cloneable, ManagedParameters {
public static final long serialVersionUID = 1;
public int deviceNumber;
public String systemType;
/**
* @param systemType
*/

View File

@ -8,6 +8,7 @@ import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.Mixer.Info;
import javax.sound.sampled.TargetDataLine;
import javax.swing.JComboBox;
import javax.swing.JPanel;
@ -16,19 +17,18 @@ import javax.swing.border.TitledBorder;
import Acquisition.layoutFX.AcquisitionPaneFX;
import Acquisition.layoutFX.DAQSettingsPane;
import Acquisition.layoutFX.SoundCardDAQPane;
import soundPlayback.PlaybackControl;
import soundPlayback.PlaybackSystem;
import soundPlayback.SoundCardPlayback;
import wavFiles.ByteConverter;
import PamController.PamControlledUnitSettings;
import PamController.PamSettingManager;
import PamController.PamSettings;
import PamDetection.RawDataUnit;
import PamguardMVC.debug.Debug;
import soundPlayback.PlaybackControl;
import soundPlayback.PlaybackSystem;
import soundPlayback.SoundCardPlayback;
import wavFiles.ByteConverter;
/**
* Everything and everything to do with controlling and reading sound cards.
*
*
* @author Doug Gillespie
* @see Acquisition.DaqSystem
* @see Acquisition.AcquisitionProcess
@ -39,26 +39,26 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
public static final String sysType = "Sound Card";
JPanel daqDialog;
JComboBox audioDevices;
SoundCardParameters soundCardParameters = new SoundCardParameters(sysType);
private AudioFormat audioFormat;
private AudioDataQueue newDataList;
private volatile boolean stopCapture;
private AcquisitionControl acquisitionControl;
private int rawBufferSizeInBytes;
// Might need this to be more flexible
private int sampleSizeInBytes = 2;
private double sampleMax = 32768;
private int daqChannels;
private TargetDataLine targetDataLine;
private PlaybackSystem soundCardPlayback;
@ -66,34 +66,34 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
private int dataUnitSamples;
private ByteConverter byteConverter;
/**
* JavaFX settings pane for sound card settings
*/
private SoundCardDAQPane soundCardSettingsPane;
public SoundCardSystem (AcquisitionControl daqControl) {
this.acquisitionControl = daqControl;
PamSettingManager.getInstance().registerSettings(this);
soundCardPlayback = new SoundCardPlayback(this);
}
@Override
public boolean prepareSystem(AcquisitionControl daqControl) {
this.acquisitionControl = daqControl;
// keep a reference to where data will be put.
this.newDataList = daqControl.getDaqProcess().getNewDataQueue();
if (this.newDataList == null) return false;
daqChannels = daqControl.acquisitionParameters.nChannels;
float sampleRate = daqControl.acquisitionParameters.sampleRate;
audioFormat = new AudioFormat(sampleRate, 16, daqChannels, true, true);
dataUnitSamples = (int) (acquisitionControl.acquisitionParameters.sampleRate / 10);
dataUnitSamples = Math.max(dataUnitSamples, 1000);
ArrayList<Mixer.Info> mixerinfos = getInputMixerList();
//System.out.println("soundCardParameters.deviceNumber:"+soundCardParameters.deviceNumber);
if (soundCardParameters.deviceNumber < 0 || soundCardParameters.deviceNumber >= mixerinfos.size()) {
@ -106,7 +106,7 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
thisMixer.getLineInfo();
return false;
}
try {
// try to get the device of choice ...
targetDataLine = (TargetDataLine) thisMixer.getLine(thisMixer.getTargetLineInfo()[0]);
@ -118,7 +118,7 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
boolean lineOk = false;
// audioFormat = new AudioFormat(sampleRate, 24, daqChannels, true, true);
// // first try to open input for 24 bit recording,
// // first try to open input for 24 bit recording,
// try {
// targetDataLine.open(audioFormat);
// sampleSizeInBytes = 3;
@ -128,8 +128,8 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
// } catch (LineUnavailableException Ex) {
// lineOk = false;
// }
// if the 24 bit recording failed, then try to open for 16 bit recording.
if (lineOk == false) {
// if the 24 bit recording failed, then try to open for 16 bit recording.
if (!lineOk) {
audioFormat = new AudioFormat(sampleRate, 16, daqChannels, true, true);
try {
targetDataLine.open(audioFormat);
@ -142,14 +142,14 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
}
byteConverter = ByteConverter.createByteConverter(audioFormat);
// Buffer size to hold 1/10th of a second
rawBufferSizeInBytes = dataUnitSamples * daqChannels * sampleSizeInBytes;
return true;
}
/* (non-Javadoc)
* @see Acquisition.DaqSystem#getDataUnitSamples()
@ -161,20 +161,20 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
@Override
public boolean startSystem(AcquisitionControl daqControl) {
if (targetDataLine == null) return false;
// Create a thread to capture the sound card input
// and start it running.
Thread captureThread = new Thread(new CaptureThread());
captureThread.start();
// then start the device
targetDataLine.start();
setStreamStatus(STREAM_RUNNING);
return true;
}
@Override
@ -207,70 +207,70 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
if (daqDialog == null) {
daqDialog = createDaqDialogPanel();
}
return daqDialog;
}
private JPanel createDaqDialogPanel() {
JPanel p = new JPanel();
p.setBorder(new TitledBorder("Select audio line"));
p.setLayout(new BorderLayout());
p.add(BorderLayout.CENTER, audioDevices = new JComboBox());
return p;
}
public static ArrayList<Mixer.Info> getInputMixerList() {
ArrayList<Mixer.Info> mixers = new ArrayList<Mixer.Info>();
ArrayList<Mixer.Info> mixers = new ArrayList<>();
AudioSystem.getMixerInfo();
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
Mixer mixer;
for (int i = 0; i < mixerInfo.length; i++) {
mixer = AudioSystem.getMixer(mixerInfo[i]);
for (Info element : mixerInfo) {
mixer = AudioSystem.getMixer(element);
//System.out.println("mixer:"+mixer);
//System.out.println(mixer.getClass().getName());
//System.out.println("mixer info:"+mixerInfo[i]);
//extra bit for Mac's where "Line In" is under mixer "Built-in Line Input"
//extra bit for Mac's where "Line In" is under mixer "Built-in Line Input"
//which is com.sun.media.sound.SimpleInputDevice
//cjb 2009-01-05
if (mixer.getTargetLineInfo().length > 0){
if ( (mixer.getClass().getName().equals("com.sun.media.sound.DirectAudioDevice")) ||
(mixer.getClass().getName().equals("com.sun.media.sound.SimpleInputDevice"))) {
//System.out.println("Adding to input mixer list:"+mixer.getClass().getName());
mixers.add(mixerInfo[i]);
mixers.add(element);
}
}
}
return mixers;
}
public static ArrayList<Mixer.Info> getOutputMixerList() {
ArrayList<Mixer.Info> mixers = new ArrayList<Mixer.Info>();
ArrayList<Mixer.Info> mixers = new ArrayList<>();
AudioSystem.getMixerInfo();
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
Mixer mixer;
for (int i = 0; i < mixerInfo.length; i++) {
for (Info element : mixerInfo) {
try {
mixer = AudioSystem.getMixer(mixerInfo[i]);
mixer = AudioSystem.getMixer(element);
}
catch (Exception e) {
continue;
}
//System.out.println("Output mixer list:" + mixer);
//System.out.println("Output mixer list:" + mixer.getClass().getName());
//extra bit for Mac's where "Line Out" is under mixer "Built-in Line Input"
//which gives 0 length array for getSourceLineInfo()
//extra bit for Mac's where "Line Out" is under mixer "Built-in Line Input"
//which gives 0 length array for getSourceLineInfo()
//cjb 2009-01-05
if (mixer.getSourceLineInfo().length > 0){
if ((mixer.getClass().getName().equals("com.sun.media.sound.DirectAudioDevice")) ||
(mixer.getClass().getName().equals("com.sun.media.sound.HeadspaceMixer"))) {
//System.out.println(mixer.getClass().getName());
mixers.add(mixerInfo[i]);
mixers.add(element);
// Debug.out.printf("Use mixer %d, %s\n", i, mixerInfo[i].getName());
}
}
// else {
// Debug.out.printf("Don't Use mixer %d, %s\n", i, mixerInfo[i].getName());
// }
@ -281,9 +281,9 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
}
return mixers;
}
public static ArrayList<String> getDevicesList() {
ArrayList<String> devices = new ArrayList<String>();
ArrayList<String> devices = new ArrayList<>();
ArrayList<Mixer.Info> mixers = getInputMixerList();
for (int i = 0; i < mixers.size(); i++) {
//System.out.println("Adding Device:"+mixers.get(i).getName());
@ -291,9 +291,9 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
}
return devices;
}
@Override
public void dialogSetParams() {
// do a quick check to see if the system type is stored in the parameters. This field was added
@ -304,32 +304,32 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
ArrayList<String> devices = getDevicesList();
audioDevices.removeAllItems();
for (int i = 0; i < devices.size(); i++) {
for (String element : devices) {
//System.out.println("Adding to audio device:"+devices.get(i));
audioDevices.addItem(devices.get(i));
audioDevices.addItem(element);
}
soundCardParameters.deviceNumber = Math.max(Math.min(devices.size()-1, soundCardParameters.deviceNumber), 0);
if (devices.size() > 0) {
audioDevices.setSelectedIndex(soundCardParameters.deviceNumber);
}
}
@Override
public boolean dialogGetParams() {
//System.out.println("soundCardParameters: " + soundCardParameters + "audioDevices: " + audioDevices);
if (audioDevices!=null) soundCardParameters.deviceNumber = audioDevices.getSelectedIndex();
return true;
}
@Override
public String getSystemType() {
return sysType;
}
@Override
public String getSystemName() {
// return the name of the sound card.
@ -356,7 +356,7 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
//javax.sound only seems to support upto 2 channels
//i.e. option of 1 or 2 - mono or stereo
//even though API reading API can make one think
//could have more... cjb 2010-04-28
//could have more... cjb 2010-04-28
return 2;
}
@ -364,7 +364,7 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
public int getMaxSampleRate() {
return PARAMETER_UNKNOWN;
}
/* (non-Javadoc)
* @see Acquisition.DaqSystem#getPeak2PeakVoltage()
*/
@ -396,24 +396,29 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
return PARAMETER_UNKNOWN;
}
@Override
public Serializable getSettingsReference() {
return soundCardParameters;
}
@Override
public long getSettingsVersion() {
return SoundCardParameters.serialVersionUID;
}
@Override
public String getUnitName() {
// return "Sound Card System";
return acquisitionControl.getUnitName();
}
@Override
public String getUnitType() {
// return "Acquisition System";
return "Sound Card System";
}
@Override
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
// if (PamSettingManager.getInstance().isSettingsUnit(this, pamControlledUnitSettings)) {
try {
@ -428,7 +433,7 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
private volatile boolean captureRunning;
// /**
// * Unpack the byte data into a sensible number.
// * @param buffer
@ -446,7 +451,8 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
// }
class CaptureThread implements Runnable {
@Override
public void run() {
stopCapture = false;
captureRunning = true;
@ -472,10 +478,10 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
count++;
// Read data from the internal
// buffer of the data line.
int bytesRead = targetDataLine.read(tempBuffer, 0,
tempBuffer.length);
// System.out.println("Read in :" + bytesRead + " bytes");
/*
* Much better to create the PamDataUnits here, since the
@ -483,11 +489,11 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
* this. The main thread then just has to add the references
* to the PamDataBlocks to theoutput data block.
*/
if (bytesRead > 0) {
// convert byte array to set of double arrays, one per
// channel e.g. framesize = 1 for 8 bit sound
// Framesize is bytecost per Sample in time. ie chanels x sampledepth in bygtes
newSamplesPerChannel = bytesRead / audioFormat.getFrameSize();
double[][] doubleData = new double[daqChannels][newSamplesPerChannel];
@ -519,7 +525,7 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
} catch (Exception ex) {
ex.printStackTrace();
}
}// end while
} catch (Exception e) {
System.out.println(e);
@ -529,30 +535,30 @@ public class SoundCardSystem extends DaqSystem implements PamSettings {
stopCapture = false;
captureRunning = false;
setStreamStatus(STREAM_ENDED);
}// end run
}// end inner class CaptureThread
@Override
public void daqHasEnded() {
// TODO Auto-generated method stub
}
@Override
public String getDeviceName() {
return String.format("%d", soundCardParameters.deviceNumber);
}
@Override
public DAQSettingsPane getDAQSpecificPane(AcquisitionPaneFX acquisitionPaneFX) {
if (soundCardSettingsPane==null) {
soundCardSettingsPane = new SoundCardDAQPane(this);
soundCardSettingsPane = new SoundCardDAQPane(this);
}
return soundCardSettingsPane;
}
/**
* Get the parameters for the sound card system.
* Get the parameters for the sound card system.
* @return the parameters for the sound card system
*/
public SoundCardParameters getSoundCardParameters() {

View File

@ -18,10 +18,10 @@ public class StandardChannelListPanel implements ChannelListPanel {
// public int channelList[] = new int[PamConstants.MAX_CHANNELS];
private JLabel panelChannelLabel[] = new JLabel[PamConstants.MAX_CHANNELS];
private JComboBox panelChannelList[] = new JComboBox[PamConstants.MAX_CHANNELS];
private JPanel panel;
int nChannels = 0;
public StandardChannelListPanel() {
super();
panel = createStandardChannelListPanel();
@ -47,23 +47,23 @@ public class StandardChannelListPanel implements ChannelListPanel {
@Override
public void setNumChannels(int nChannels) {
nChannels = Math.min(nChannels, panelChannelList.length);
this.nChannels = nChannels;
this.nChannels = nChannels;
for (int i = 0; i < PamConstants.MAX_CHANNELS; i++) {
panelChannelLabel[i].setVisible(i < nChannels);
panelChannelList[i].setVisible(i < nChannels);
}
//
//
// for (int iL = 0; iL < nChannels; iL++) {
// panelChannelList[iL].removeAllItems();
// for (int i = 0; i < PamConstants.MAX_CHANNELS; i++) {
// panelChannelList[iL].addItem(i);
// }
//
//
// }
}
@ -75,23 +75,23 @@ public class StandardChannelListPanel implements ChannelListPanel {
}
for (int i = 0; i < Math.min(panelChannelList.length, channelList.length); i++){
panelChannelList[i].setSelectedIndex(channelList[i]);
// System.out.println(String.format("%s Set box %d to item %d and get %d",
// System.out.println(String.format("%s Set box %d to item %d and get %d",
// this.toString(), i, channelList[i], panelChannelList[i].getSelectedItem()));
}
}
@Override
public boolean isDataOk() {
// now check for repeat combinations.
// now check for repeat combinations.
for (int i = 0; i < nChannels-1; i++) {
for (int j = i+1; j < nChannels; j++) {
if (panelChannelList[i].getSelectedIndex() == panelChannelList[j].getSelectedIndex()) {
String w = String.format("Channel %d is used twice\n"+
"only use each channel once on each device",
panelChannelList[i].getSelectedIndex());
JOptionPane.showConfirmDialog(null, w,
JOptionPane.showConfirmDialog(null, w,
"Error", JOptionPane.OK_OPTION, JOptionPane.ERROR_MESSAGE);
return false;
return false;
}
}
}
@ -103,9 +103,9 @@ public class StandardChannelListPanel implements ChannelListPanel {
/* code for select channel */
/*
* put this in a separate panel so it can be hidden if
* it's not possible to change these parameters.
*
* put this in a separate panel so it can be hidden if
* it's not possible to change these parameters.
*
* Text information updated DG & JG 12/8/08
*/
JPanel cP;
@ -125,7 +125,7 @@ public class StandardChannelListPanel implements ChannelListPanel {
s += "<br>So be aware. If you've put a plug into socket 1, <br>you probably want to select channel 0, etc.</html>";
for (int i = 0; i < PamConstants.MAX_CHANNELS; i++){ //Xiao Yan Deng
//for (int i = 0; i < getNumChannels(); i++){
if (i%2 ==0){
c2.gridx = 0;
c2.gridy ++;
@ -140,19 +140,19 @@ public class StandardChannelListPanel implements ChannelListPanel {
else {
spaceStr = "";
}
PamDialog.addComponent(cP, panelChannelLabel[i] =
PamDialog.addComponent(cP, panelChannelLabel[i] =
new JLabel(spaceStr + " SW Ch " + i + " = HW Ch "), c2);
c2.gridx ++;
//constraints.gridwidth = 2;
PamDialog.addComponent(cP, panelChannelList[i] = new JComboBox(), c2);
panelChannelLabel[i].setToolTipText(s);
panelChannelList[i].setToolTipText(s);
// System.out.println(String.format("Fill channel list %d", i));
for (int iC = 0; iC < PamConstants.MAX_CHANNELS; iC++) {
panelChannelList[i].addItem(iC);
}
}
return cP;
}
@ -162,6 +162,6 @@ public class StandardChannelListPanel implements ChannelListPanel {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -1,7 +1,7 @@
package Acquisition;
public class WavChunkData {
static final byte RIFF[] = {'R','I','F','F'};
static final byte WAVE[] = {'W','A','V','E'};
static final byte FMT[] = {'f','m','t',' '};
@ -10,7 +10,7 @@ public class WavChunkData {
static final byte ICOP[] = {'I','C','O','P'};
static final byte ICRD[] = {'I','C','R','D'};
static final byte DATA[] = {'d','a','t','a'};
static public final int CHUNK_OTHER = 0;
static public final int CHUNK_RIFF = 1;
static public final int CHUNK_WAVE = 2;
@ -19,7 +19,7 @@ public class WavChunkData {
static public final int CHUNK_INFO = 5;
static public final int CHUNK_ICOP = 6;
static public final int CHUNK_ICRD = 7;
int chunkSize;
long fileOffset;
byte[] chunkId;
@ -36,7 +36,7 @@ public class WavChunkData {
// String str = new String(chunkData);
// System.out.println(new String(chunkId) + " " + str);
}
public int getType() {
return chunkType;
}

View File

@ -24,7 +24,7 @@ public class WavFileFuncs extends AudioFileFuncs {
e.printStackTrace();
}
if (wavHead.checkSizes(aFile.length()) == false) {
if (!wavHead.checkSizes(aFile.length())) {
wavHead.repairSizes(aFile.length());
return writeNewSizes(wavHead, aFile);
}
@ -106,7 +106,7 @@ public class WavFileFuncs extends AudioFileFuncs {
private static byte[] readChunkId(WindowsFile file) {
byte[] chunkId = new byte[4];
byte[] chunkId = new byte[4];
try {
for (int i = 0; i < 4; i++) {
chunkId[i] = file.readByte();

View File

@ -28,7 +28,7 @@ public class WavHeader {
public void addChunkData(WavChunkData chunkData) {
if (otherChunks == null) {
otherChunks = new ArrayList<WavChunkData>();
otherChunks = new ArrayList<>();
}
otherChunks.add(chunkData);
int t = chunkData.getType();
@ -39,12 +39,12 @@ public class WavHeader {
}
private boolean unpackFmtData(WavChunkData chunkData) {
// read the 12 bytes of data from the byte array.
// read the 12 bytes of data from the byte array.
if (chunkData.chunkSize < 12) {
return false;
}
WindowsBuffer winBuff = new WindowsBuffer(chunkData.chunkData);
try {
this.audioformat = winBuff.readWinShort();
this.nChannels = winBuff.readWinShort();
@ -61,11 +61,11 @@ public class WavHeader {
}
/**
* Check the two size informations in the wav file.
* Check the two size informations in the wav file.
* The first in the second 4 bytes in the RIFF chunk
* which should be equal to the number of bytes in the file - 4
* The second is the data length, which should be equal to the
* length of the file - the data start point.
* The second is the data length, which should be equal to the
* length of the file - the data start point.
* @param length
*/
public boolean checkSizes(long length) {
@ -80,10 +80,10 @@ public class WavHeader {
}
return ok;
}
/**
* Write the correct sizes into the file data.
* @param length total length of file in bytes.
/**
* Write the correct sizes into the file data.
* @param length total length of file in bytes.
*/
public void repairSizes(long length) {
riffChunkSize = length - 8;

File diff suppressed because it is too large Load Diff

View File

@ -19,32 +19,35 @@ import PamController.positionreference.PositionReference;
public class AirgunControl extends PamControlledUnit implements PamSettings, PositionReference {
AirgunParameters airgunParameters;
AirgunProcess airgunProcess;
protected boolean initialisationComplete;
public AirgunControl(String unitName) {
super("Airgun Display", unitName);
airgunParameters = new AirgunParameters();
addPamProcess(airgunProcess = new AirgunProcess(this));
PamSettingManager.getInstance().registerSettings(this);
airgunProcess.findSourceData();
}
@Override
public Serializable getSettingsReference() {
return airgunParameters;
}
@Override
public long getSettingsVersion() {
return AirgunParameters.serialVersionUID;
}
@Override
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
if (pamControlledUnitSettings.getVersionNo() != AirgunParameters.serialVersionUID) {
return false;
@ -60,15 +63,16 @@ public class AirgunControl extends PamControlledUnit implements PamSettings, Pos
menuItem.addActionListener(new AirgunDisplayOptions(parentFrame));
return menuItem;
}
private class AirgunDisplayOptions implements ActionListener {
Frame frame;
public AirgunDisplayOptions(Frame frame) {
this.frame = frame;
}
@Override
public void actionPerformed(ActionEvent e) {
AirgunParameters newParams = AirgunParametersDialog.showDialog(frame, airgunParameters);
@ -76,8 +80,8 @@ public class AirgunControl extends PamControlledUnit implements PamSettings, Pos
airgunParameters = newParams.clone();
airgunProcess.findSourceData();
}
}
}
}
@Override
@ -87,11 +91,11 @@ public class AirgunControl extends PamControlledUnit implements PamSettings, Pos
switch (changeType) {
case PamControllerInterface.INITIALIZATION_COMPLETE:
initialisationComplete = true;
airgunProcess.findSourceData();
airgunProcess.findSourceData();
break;
case PamControllerInterface.ADD_CONTROLLEDUNIT:
if (initialisationComplete) {
airgunProcess.findSourceData();
airgunProcess.findSourceData();
}
break;
case PamControllerInterface.NEW_SCROLL_TIME:

View File

@ -13,9 +13,9 @@ public class AirgunDimensionsDrawing extends ShipDimensionsDrawing {
private double dimE = 0.1;
static private double dimF = 0.5;
PamSymbol airgunSymbol;
public AirgunDimensionsDrawing() throws HeadlessException {
super();
airgunSymbol = new PamSymbol(PamSymbolType.SYMBOL_HEXAGRAM, 10, 10, false, Color.BLUE, Color.BLUE);

View File

@ -14,21 +14,21 @@ import PamUtils.Coordinate3d;
import PamUtils.LatLong;
import PamView.BasicKeyItem;
import PamView.GeneralProjector;
import PamView.GeneralProjector.ParameterType;
import PamView.GeneralProjector.ParameterUnits;
import PamView.PamKeyItem;
import PamView.PamSymbol;
import PamView.PamSymbolType;
import PamView.PanelOverlayDraw;
import PamView.GeneralProjector.ParameterType;
import PamView.GeneralProjector.ParameterUnits;
import PamView.symbol.SymbolData;
import PamguardMVC.PamDataUnit;
public class AirgunGraphics extends PanelOverlayDraw {
AirgunControl airgunControl;
// PamSymbol gunsSymbol;
public static final SymbolData defaultSymbol = new SymbolData(PamSymbolType.SYMBOL_CIRCLE, 6, 6, true, Color.RED, Color.RED);
public AirgunGraphics(AirgunControl airgunControl) {
@ -39,18 +39,20 @@ public class AirgunGraphics extends PanelOverlayDraw {
@Override
public boolean canDraw(ParameterType[] parameterTypes, ParameterUnits[] parameterUnits) {
return (parameterTypes[0] == GeneralProjector.ParameterType.LATITUDE &&
return (parameterTypes[0] == GeneralProjector.ParameterType.LATITUDE &&
parameterTypes[1] == GeneralProjector.ParameterType.LONGITUDE);
}
@Override
public PamKeyItem createKeyItem(GeneralProjector generalProjector,int keyType) {
return new BasicKeyItem(getPamSymbol(null, generalProjector), airgunControl.getUnitName());
}
@Override
public Rectangle drawDataUnit(Graphics g, PamDataUnit pamDataUnit, GeneralProjector generalProjector) {
AirgunDataUnit airgunDataUnit = (AirgunDataUnit) pamDataUnit;
double verticalRotation = 0.;
@ -66,7 +68,7 @@ public class AirgunGraphics extends PanelOverlayDraw {
return drawRotatedMap(g, airgunDataUnit, generalProjector);
// }
}
public Rectangle drawRotatedMap(Graphics g, AirgunDataUnit airgunDataUnit, GeneralProjector generalProjector) {
GpsData gpsData = airgunDataUnit.getGpsData();
MapRectProjector mapProj = (MapRectProjector) generalProjector;
@ -74,156 +76,157 @@ public class AirgunGraphics extends PanelOverlayDraw {
double yScale = Math.cos(Math.toRadians(verticalRotation));
double radiusX = mapProj.getPixelsPerMetre()*airgunControl.airgunParameters.exclusionRadius;
double radiusY = Math.max(radiusX * yScale, 0);
double gunZ = -airgunControl.airgunParameters.gunDepth;
// need to move from the gps position to the gund position.
LatLong gunsGps = gpsData.travelDistanceMeters(gpsData.getCourseOverGround() + 90,
airgunControl.airgunParameters.dimF);
gunsGps = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround() + 180,
airgunControl.airgunParameters.dimE);
// need to move from the gps position to the gund position.
LatLong gunsGps = gpsData.travelDistanceMeters(gpsData.getCourseOverGround() + 90,
airgunControl.airgunParameters.dimF);
gunsGps = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround() + 180,
airgunControl.airgunParameters.dimE);
// int mitigationRadius = airgunControl.airgunParameters.exclusionRadius;
Coordinate3d gunsCentre = generalProjector.getCoord3d(gunsGps.getLatitude(), gunsGps.getLongitude(), gunZ);
// draw the guns
Point gc = gunsCentre.getXYPoint();
Point gc = gunsCentre.getXYPoint();
PamSymbol gunsSymbol = getPamSymbol(airgunDataUnit, generalProjector);
gunsSymbol.setFillColor(airgunControl.airgunParameters.exclusionColor);
gunsSymbol.setLineColor(airgunControl.airgunParameters.exclusionColor);
gunsSymbol.draw(g, gc);
generalProjector.addHoverData(gunsCentre, airgunDataUnit);
if (airgunControl.airgunParameters.showExclusionZone) {
// LatLong rEnd = gunsGps.addDistanceMeters(mitigationRadius, 0);
//
//
// Coordinate3d gunsCirc = generalProjector.getCoord3d(rEnd.getLatitude(), rEnd.getLongitude(), 0);
// double radius = Math.pow(gunsCentre.x-gunsCirc.x, 2) +
// double radius = Math.pow(gunsCentre.x-gunsCirc.x, 2) +
// Math.pow(gunsCentre.y-gunsCirc.y, 2);
if (radiusX > 5) {
g.drawOval((int) (gunsCentre.x - radiusX), (int) (gunsCentre.y - radiusY),
g.drawOval((int) (gunsCentre.x - radiusX), (int) (gunsCentre.y - radiusY),
(int) (2*radiusX), (int) (2*radiusY));
}
if (airgunControl.airgunParameters.predictAhead) {
double mapAngle = (int) (90 - gpsData.getCourseOverGround() - 90) - mapProj.getMapRotationDegrees();
double predictionLengthMiles = airgunControl.airgunParameters.secondsAhead *
double predictionLengthMiles = airgunControl.airgunParameters.secondsAhead *
gpsData.getSpeed() / 3600;
LatLong predictedPos = gunsGps.TravelDistanceMiles(gpsData.getCourseOverGround(), predictionLengthMiles);
Coordinate3d pCirc = generalProjector.getCoord3d(predictedPos.getLatitude(), predictedPos.getLongitude(), gunZ);
// int a1 = 90 - gpsData.getTrueCourse() + 90;
// g.drawArc((int) (pCirc.x - radius), (int) (pCirc.y - radius), (int) radius*2, (int) radius*2,
// g.drawArc((int) (pCirc.x - radius), (int) (pCirc.y - radius), (int) radius*2, (int) radius*2,
// 50, 180);
float[] dashes = {2, 6};
((Graphics2D) g).setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1, dashes, 0));
g.drawOval((int) (pCirc.x - radiusX), (int) (pCirc.y - radiusY),
g.drawOval((int) (pCirc.x - radiusX), (int) (pCirc.y - radiusY),
(int) (2*radiusX), (int) (2*radiusY));
// g.drawArc((int) (pCirc.x - radiusX), (int) (pCirc.y - radiusY), (int) radiusX*2, (int) ((int) 2*radiusY),
// g.drawArc((int) (pCirc.x - radiusX), (int) (pCirc.y - radiusY), (int) radiusX*2, (int) ((int) 2*radiusY),
// (int) mapAngle, 180);
// now need to find the edge points of all this to link up to other circle
LatLong ll1, ll2;
Coordinate3d p1, p2;
ll1 = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround()+90,
ll1 = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround()+90,
airgunControl.airgunParameters.exclusionRadius);
ll2 = predictedPos.travelDistanceMeters(gpsData.getCourseOverGround()+90,
ll2 = predictedPos.travelDistanceMeters(gpsData.getCourseOverGround()+90,
airgunControl.airgunParameters.exclusionRadius);
p1 = generalProjector.getCoord3d(ll1.getLatitude(), ll1.getLongitude(), gunZ);
p2 = generalProjector.getCoord3d(ll2.getLatitude(), ll2.getLongitude(), gunZ);
g.drawLine((int) p1.x, (int) p1.y, (int) p2.x, (int) p2.y);
ll1 = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround()-90,
ll1 = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround()-90,
airgunControl.airgunParameters.exclusionRadius);
ll2 = predictedPos.travelDistanceMeters(gpsData.getCourseOverGround()-90,
ll2 = predictedPos.travelDistanceMeters(gpsData.getCourseOverGround()-90,
airgunControl.airgunParameters.exclusionRadius);
p1 = generalProjector.getCoord3d(ll1.getLatitude(), ll1.getLongitude(), gunZ);
p2 = generalProjector.getCoord3d(ll2.getLatitude(), ll2.getLongitude(), gunZ);
g.drawLine((int) p1.x, (int) p1.y, (int) p2.x, (int) p2.y);
// g.setColor(Color.RED);
// g.drawOval((int) (pCirc.x - radius), (int) (pCirc.y - radius),
// g.drawOval((int) (pCirc.x - radius), (int) (pCirc.y - radius),
// (int) (2*radius), (int) (2*radius));
// put it back to a solid line, otherwise the next drawn object will be dashed !
((Graphics2D) g).setStroke(new BasicStroke(1));
}
}
return null;
}
public Rectangle drawFlatMap(Graphics g, AirgunDataUnit airgunDataUnit, GeneralProjector generalProjector) {
GpsData gpsData = airgunDataUnit.getGpsData();
// need to move from the gps position to the gund position.
LatLong gunsGps = gpsData.travelDistanceMeters(gpsData.getCourseOverGround() + 90,
airgunControl.airgunParameters.dimF);
gunsGps = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround() + 180,
airgunControl.airgunParameters.dimE);
// need to move from the gps position to the gund position.
LatLong gunsGps = gpsData.travelDistanceMeters(gpsData.getCourseOverGround() + 90,
airgunControl.airgunParameters.dimF);
gunsGps = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround() + 180,
airgunControl.airgunParameters.dimE);
int mitigationRadius = airgunControl.airgunParameters.exclusionRadius;
Coordinate3d gunsCentre = generalProjector.getCoord3d(gunsGps.getLatitude(), gunsGps.getLongitude(), 0);
// draw the guns
Point gc = gunsCentre.getXYPoint();
Point gc = gunsCentre.getXYPoint();
PamSymbol gunsSymbol = getPamSymbol(airgunDataUnit, generalProjector);
gunsSymbol.setFillColor(airgunControl.airgunParameters.exclusionColor);
gunsSymbol.setLineColor(airgunControl.airgunParameters.exclusionColor);
gunsSymbol.draw(g, gc);
generalProjector.addHoverData(gunsCentre, airgunDataUnit);
if (airgunControl.airgunParameters.showExclusionZone) {
LatLong rEnd = gunsGps.addDistanceMeters(mitigationRadius, 0);
Coordinate3d gunsCirc = generalProjector.getCoord3d(rEnd.getLatitude(), rEnd.getLongitude(), 0);
double radius = Math.pow(gunsCentre.x-gunsCirc.x, 2) +
double radius = Math.pow(gunsCentre.x-gunsCirc.x, 2) +
Math.pow(gunsCentre.y-gunsCirc.y, 2);
if (radius > 25) {
radius = Math.sqrt(radius);
g.drawOval((int) (gunsCentre.x - radius), (int) (gunsCentre.y - radius),
g.drawOval((int) (gunsCentre.x - radius), (int) (gunsCentre.y - radius),
(int) (2*radius), (int) (2*radius));
}
if (airgunControl.airgunParameters.predictAhead) {
double predictionLengthMiles = airgunControl.airgunParameters.secondsAhead *
double predictionLengthMiles = airgunControl.airgunParameters.secondsAhead *
gpsData.getSpeed() / 3600;
LatLong predictedPos = gunsGps.TravelDistanceMiles(gpsData.getCourseOverGround(), predictionLengthMiles);
Coordinate3d pCirc = generalProjector.getCoord3d(predictedPos.getLatitude(), predictedPos.getLongitude(), 0);
// int a1 = 90 - gpsData.getTrueCourse() + 90;
// g.drawArc((int) (pCirc.x - radius), (int) (pCirc.y - radius), (int) radius*2, (int) radius*2,
// g.drawArc((int) (pCirc.x - radius), (int) (pCirc.y - radius), (int) radius*2, (int) radius*2,
// 50, 180);
float[] dashes = {2, 6};
((Graphics2D) g).setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1, dashes, 0));
g.drawArc((int) (pCirc.x - radius), (int) (pCirc.y - radius), (int) radius*2, (int) radius*2,
g.drawArc((int) (pCirc.x - radius), (int) (pCirc.y - radius), (int) radius*2, (int) radius*2,
(int) (90 - gpsData.getCourseOverGround() - 90),
180);
// now need to find the edge points of all this to link up to other circle
LatLong ll1, ll2;
Coordinate3d p1, p2;
ll1 = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround()+90,
ll1 = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround()+90,
airgunControl.airgunParameters.exclusionRadius);
ll2 = predictedPos.travelDistanceMeters(gpsData.getCourseOverGround()+90,
ll2 = predictedPos.travelDistanceMeters(gpsData.getCourseOverGround()+90,
airgunControl.airgunParameters.exclusionRadius);
p1 = generalProjector.getCoord3d(ll1.getLatitude(), ll1.getLongitude(), 0);
p2 = generalProjector.getCoord3d(ll2.getLatitude(), ll2.getLongitude(), 0);
g.drawLine((int) p1.x, (int) p1.y, (int) p2.x, (int) p2.y);
ll1 = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround()-90,
ll1 = gunsGps.travelDistanceMeters(gpsData.getCourseOverGround()-90,
airgunControl.airgunParameters.exclusionRadius);
ll2 = predictedPos.travelDistanceMeters(gpsData.getCourseOverGround()-90,
ll2 = predictedPos.travelDistanceMeters(gpsData.getCourseOverGround()-90,
airgunControl.airgunParameters.exclusionRadius);
p1 = generalProjector.getCoord3d(ll1.getLatitude(), ll1.getLongitude(), 0);
p2 = generalProjector.getCoord3d(ll2.getLatitude(), ll2.getLongitude(), 0);
g.drawLine((int) p1.x, (int) p1.y, (int) p2.x, (int) p2.y);
// g.setColor(Color.RED);
// g.drawOval((int) (pCirc.x - radius), (int) (pCirc.y - radius),
// g.drawOval((int) (pCirc.x - radius), (int) (pCirc.y - radius),
// (int) (2*radius), (int) (2*radius));
// put it back to a solid line, otherwise the next drawn object will be dashed !
((Graphics2D) g).setStroke(new BasicStroke(1));
}
}
return null;
}
@Override
public String getHoverText(GeneralProjector generalProjector, PamDataUnit dataUnit, int iSide) {
String str = "<html>" + airgunControl.getUnitName();
if (airgunControl.airgunParameters.showExclusionZone) {
@ -242,5 +245,5 @@ public class AirgunGraphics extends PanelOverlayDraw {
public boolean showOptions(Window parentWindow,
GeneralProjector generalProjector) {
return false;
}
}
}

View File

@ -17,15 +17,15 @@ public class AirgunParameters implements Serializable, Cloneable, ManagedParamet
public static final int GUNS_FIXEDPOSITION = 2;
static public final long serialVersionUID = 1;
/**
* True if guns are on this vessel
*/
private boolean gunsThisVessel = true;
public int gunsReferencePosition = GUNS_THIS_VESSEL;
private boolean hasGunsReferencePosition = false;
/**
* mmsi number of vessel if guns are on another vessel
*/
@ -35,54 +35,54 @@ public class AirgunParameters implements Serializable, Cloneable, ManagedParamet
* distance in m towards the stern from the vessels GPS receiver
*/
double dimE = 20;
/**
* distance in m towards the starboard side from the vessels GPS receiver
*/
double dimF = 0;
/**
* Gun depth in metres.
* Gun depth in metres.
*/
double gunDepth = 0;
/**
* Show exclusion zone on the map
*/
boolean showExclusionZone = true;
/**
* radius of exclusion xone in m
*/
int exclusionRadius = 500;
/**
* Colour for exclusion zone on map.
*/
Color exclusionColor = Color.RED;
/**
* predict where we'll be in a certain time
*/
boolean predictAhead = false;
/**
* prediction time in seconds
*/
int secondsAhead = 600;
public LatLong fixedPosition;
@Override
public AirgunParameters clone() {
try {
AirgunParameters np = (AirgunParameters) super.clone();
if (np.hasGunsReferencePosition == false) {
if (!np.hasGunsReferencePosition) {
// sort out what happens if old boolean ref was used
// instead of new int type.
// instead of new int type.
np.hasGunsReferencePosition = true;
if (np.gunsThisVessel == false) {
if (!np.gunsThisVessel) {
np.gunsReferencePosition = GUNS_AIS_VESSEL;
}
}
@ -93,7 +93,7 @@ public class AirgunParameters implements Serializable, Cloneable, ManagedParamet
}
return null;
}
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);

View File

@ -17,6 +17,7 @@ import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.TitledBorder;
@ -29,19 +30,19 @@ import PamView.dialog.PamDialog;
public class AirgunParametersDialog extends PamDialog {
private static AirgunParametersDialog airgunParametersDialog;
private AirgunParameters airgunParameters;
private ShipDimensionsPanel shipDrawing;
private ShipDimensionsFields shipDimensionsFields;
private ShipIDPanel shipIDPanel;
private ExclusionPanel exclusionPanel;
private String[] fieldNames = {"E","F","Depth"};
public AirgunParametersDialog(Frame parentFrame) {
super(parentFrame, "Airgun display parameters", false);
JPanel p = new JPanel();
@ -49,7 +50,7 @@ public class AirgunParametersDialog extends PamDialog {
AirgunDimensionsDrawing ad = new AirgunDimensionsDrawing();
p.add(shipDrawing = new ShipDimensionsPanel(ad,
shipDimensionsFields = new ShipDimensionsFields(fieldNames)));
JPanel q = new JPanel();
q.setLayout(new BoxLayout(q, BoxLayout.Y_AXIS));
q.add(shipIDPanel = new ShipIDPanel());
@ -58,7 +59,7 @@ public class AirgunParametersDialog extends PamDialog {
setDialogComponent(p);
// setModal(true);
}
public static AirgunParameters showDialog(Frame parentFrame, AirgunParameters airgunParameters) {
if (airgunParametersDialog == null || airgunParametersDialog.getParent() != parentFrame) {
airgunParametersDialog = new AirgunParametersDialog(parentFrame);
@ -66,16 +67,16 @@ public class AirgunParametersDialog extends PamDialog {
airgunParametersDialog.airgunParameters = airgunParameters.clone();
airgunParametersDialog.setParams();
airgunParametersDialog.setVisible(true);
return airgunParametersDialog.airgunParameters;
}
@Override
public void cancelButtonPressed() {
// TODO Auto-generated method stub
}
public void setParams() {
double[] dim = new double[3];
dim[0] = airgunParameters.dimE;
@ -84,9 +85,9 @@ public class AirgunParametersDialog extends PamDialog {
shipDimensionsFields.setDimensions(dim);
shipIDPanel.setParams();
exclusionPanel.setParams();
}
@Override
public boolean getParams() {
double[] dim = shipDimensionsFields.getDimensions();
@ -94,23 +95,22 @@ public class AirgunParametersDialog extends PamDialog {
airgunParameters.dimE = dim[0];
airgunParameters.dimF = dim[1];
airgunParameters.gunDepth = dim[2];
if (shipIDPanel.getParams() == false) return false;
if (exclusionPanel.getParams() == false) return false;
if (!shipIDPanel.getParams() || !exclusionPanel.getParams()) return false;
return true;
}
@Override
public void restoreDefaultSettings() {
// TODO Auto-generated method stub
}
class ShipIDPanel extends JPanel implements ActionListener {
private JRadioButton thisVessel, otherVessel, fixedLocation;
private JTextField mmsiNumber;
private LatLongEditableDialogStrip llStrip;
public ShipIDPanel() {
super();
setBorder(new TitledBorder("Source Vessel Identification"));
@ -131,7 +131,7 @@ public class AirgunParametersDialog extends PamDialog {
c.gridy++;
c.gridx = 0;
c.gridwidth = 1;
addComponent(this, new JLabel("Source vessel mmsi number ", JLabel.RIGHT), c);
addComponent(this, new JLabel("Source vessel mmsi number ", SwingConstants.RIGHT), c);
c.gridx++;
addComponent(this, mmsiNumber = new JTextField(7), c);
c.gridx = 0;
@ -144,18 +144,19 @@ public class AirgunParametersDialog extends PamDialog {
addComponent(this, llStrip.getDialogComponent(), c);
bg.add(fixedLocation);
fixedLocation.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
enableControls();
}
public void enableControls() {
mmsiNumber.setEnabled(otherVessel.isSelected());
llStrip.enableControls(fixedLocation.isSelected());
}
public void setParams() {
thisVessel.setSelected(airgunParameters.gunsReferencePosition == AirgunParameters.GUNS_THIS_VESSEL);
otherVessel.setSelected(airgunParameters.gunsReferencePosition == AirgunParameters.GUNS_AIS_VESSEL);
@ -164,7 +165,7 @@ public class AirgunParametersDialog extends PamDialog {
llStrip.setLatLong(airgunParameters.fixedPosition);
enableControls();
}
public boolean getParams() {
if (thisVessel.isSelected()) {
airgunParameters.gunsReferencePosition = AirgunParameters.GUNS_THIS_VESSEL;
@ -192,22 +193,22 @@ public class AirgunParametersDialog extends PamDialog {
}
return true;
}
}
class ExclusionPanel extends JPanel implements ActionListener {
JTextField exRadius;
JCheckBox showExclusion;
JPanel exPanel;
JButton exButton;
JCheckBox predictAhead;
JTextField predictionTime;
public ExclusionPanel() {
super();
setBorder(new TitledBorder("Guns mitigation zone"));
@ -229,7 +230,7 @@ public class AirgunParametersDialog extends PamDialog {
addComponent(this, exRadius = new JTextField(6), c);
c.gridx++;
addComponent(this, new JLabel(" m"), c);
c.gridwidth = 1;
c.gridy++;
c.gridx = 0;
@ -239,7 +240,7 @@ public class AirgunParametersDialog extends PamDialog {
c.gridx++;
addComponent(this, exButton = new JButton("Colour"), c);
exButton.addActionListener(this);
c.gridx = 0;
c.gridy ++;
c.gridwidth = 3;
@ -248,13 +249,13 @@ public class AirgunParametersDialog extends PamDialog {
c.gridx = 0;
c.gridy ++;
c.gridwidth = 1;
addComponent(this, new JLabel("Predict ahead for ", JLabel.RIGHT), c);
addComponent(this, new JLabel("Predict ahead for ", SwingConstants.RIGHT), c);
c.gridx++;
addComponent(this, predictionTime = new JTextField(6), c);
c.gridx++;
addComponent(this, new JLabel(" seconds ", JLabel.LEFT), c);
addComponent(this, new JLabel(" seconds ", SwingConstants.LEFT), c);
}
public void setParams() {
showExclusion.setSelected(airgunParameters.showExclusionZone);
@ -282,9 +283,10 @@ public class AirgunParametersDialog extends PamDialog {
}
return true;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == exButton) {
Color newColor = JColorChooser.showDialog(this, "Mitigation zone colour",
Color newColor = JColorChooser.showDialog(this, "Mitigation zone colour",
airgunParameters.exclusionColor);
if (newColor != null) {
setColour(newColor);
@ -296,7 +298,7 @@ public class AirgunParametersDialog extends PamDialog {
else if (e.getSource() == predictAhead) {
enableControls();
}
}
private void enableControls() {
predictAhead.setEnabled(showExclusion.isSelected());
@ -305,5 +307,5 @@ public class AirgunParametersDialog extends PamDialog {
predictionTime.setEnabled(predictAhead.isSelected() && showExclusion.isSelected());
}
}
}

View File

@ -7,11 +7,9 @@ import AIS.AISDataUnit;
import AIS.AISPositionReport;
import GPS.GpsData;
import GPS.GpsDataUnit;
import Map.MapCommentOverlayGraphics;
import PamController.PamController;
import PamUtils.LatLong;
import PamUtils.PamCalendar;
import PamView.symbol.PamSymbolManager;
import PamView.symbol.StandardSymbolManager;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
@ -22,11 +20,11 @@ import PamguardMVC.SingletonDataBlock;
public class AirgunProcess extends PamProcess {
AirgunControl airgunControl;
PamDataBlock<GpsDataUnit> gpsDataBlock;
AISDataBlock aisDataBlock;
PamDataBlock<AirgunDataUnit> outputDataBlock;
public AirgunProcess(AirgunControl airgunControl) {
super(airgunControl, null);
this.airgunControl = airgunControl;
@ -53,10 +51,10 @@ public class AirgunProcess extends PamProcess {
public void newData(PamObservable o, PamDataUnit arg) {
useData(o, arg);
}
/**
* AIS data are generally updated rather than created new, so
* use newData and updateData in the same way,
* AIS data are generally updated rather than created new, so
* use newData and updateData in the same way,
* @param o PamObservable sent to updateData or newData
* @param arg PamDataUnit sent to updateData or newData
*/
@ -72,7 +70,7 @@ public class AirgunProcess extends PamProcess {
useAisData((PamDataBlock) o, (AISDataUnit) arg);
}
}
private void useGpsData(PamDataBlock dataBlock, GpsDataUnit gpsDataUnit) {
if (gpsDataUnit == null) {
return;
@ -80,7 +78,7 @@ public class AirgunProcess extends PamProcess {
GpsData gpsData = gpsDataUnit.getGpsData();
createAirgunData(gpsData);
}
private void useAisData(PamDataBlock dataBlock, AISDataUnit aisDataUnit) {
if (aisDataUnit.mmsiNumber != airgunControl.airgunParameters.gunsMMSIVessel) return;
// if (aisDataUnit.isComplete() == false) {
@ -104,29 +102,29 @@ public class AirgunProcess extends PamProcess {
gpsData.setTimeInMillis(aisDataUnit.getTimeMilliseconds());
createAirgunData(gpsData);
}
private void createAirgunData(GpsData gpsData) {
// PamDataUnit nU = outputDataBlock.getNewUnit(0,0,0);
AirgunDataUnit nU = new AirgunDataUnit(PamCalendar.getTimeInMillis(), gpsData);
outputDataBlock.addPamData(nU);
}
@Override
public void noteNewSettings() {
// super.noteNewSettings();
findSourceData();
}
synchronized public void findSourceData(){
PamDataBlock newDataBlock = null;
if (airgunControl.airgunParameters.gunsReferencePosition == AirgunParameters.GUNS_THIS_VESSEL) {
aisDataBlock = null;
// find and subscribe to the GPS data block
/*
* 4/3/13 Change this to ensure it get's the correct GPS data block. In past it was picking up itself if the
* airgun unit was before the GPS unit since the airgun data unit is a subclass of GPSDataUnit. Should now get
* the correct GPS data.
* airgun unit was before the GPS unit since the airgun data unit is a subclass of GPSDataUnit. Should now get
* the correct GPS data.
*/
// newDataBlock = PamController.getInstance().getDataBlock(GpsDataUnit.class, 0);
ArrayList<PamDataBlock> gpsBlocks = PamController.getInstance().getDataBlocks(GpsDataUnit.class, false);
@ -149,7 +147,7 @@ public class AirgunProcess extends PamProcess {
setParentDataBlock(aisDataBlock);
}
else {
System.out.println("Unable to find AIS data block for airgun display");
}
}
@ -158,10 +156,10 @@ public class AirgunProcess extends PamProcess {
}
}
/**
* Called when view times change so that the display can update it's
* location based on the new time.
* Called when view times change so that the display can update it's
* location based on the new time.
*/
protected void newViewTime(){
if (airgunControl.airgunParameters.gunsReferencePosition == AirgunParameters.GUNS_THIS_VESSEL) {
@ -195,18 +193,18 @@ public class AirgunProcess extends PamProcess {
@Override
public void pamStart() {
// TODO Auto-generated method stub
}
@Override
public void pamStop() {
// TODO Auto-generated method stub
}
/**
* Implementation of PositionReference. Will try to return a ref position
* for a given time.
* Implementation of PositionReference. Will try to return a ref position
* for a given time.
* @param timeMillis
* @return
*/
@ -220,7 +218,7 @@ public class AirgunProcess extends PamProcess {
if (airgunControl.airgunParameters.gunsReferencePosition == AirgunParameters.GUNS_FIXEDPOSITION){
return getFixedPosition(timeMillis);
}
return null;
}
@ -237,9 +235,9 @@ public class AirgunProcess extends PamProcess {
return null;
}
GpsData gpsData = gpsDataUnit.getGpsData();
LatLong gunPos = gpsData.travelDistanceMeters(gpsData.getHeading() + 180,
LatLong gunPos = gpsData.travelDistanceMeters(gpsData.getHeading() + 180,
airgunControl.airgunParameters.dimE);
gunPos = gunPos.travelDistanceMeters(gpsData.getHeading() + 90,
gunPos = gunPos.travelDistanceMeters(gpsData.getHeading() + 90,
airgunControl.airgunParameters.dimF);
GpsData gunGPS = gpsData.clone();
gunGPS.setLatitude(gunPos.getLatitude());
@ -247,7 +245,7 @@ public class AirgunProcess extends PamProcess {
return gunGPS;
}
private GpsData getAISBasedPosition(long timeMillis) {
private GpsData getAISBasedPosition(long timeMillis) {
if (aisDataBlock == null) {
return null;
}
@ -260,9 +258,9 @@ public class AirgunProcess extends PamProcess {
return null;
}
LatLong gunPos = aisPositionReport.latLong;
gunPos = gunPos.travelDistanceMeters(aisPositionReport.courseOverGround + 180,
gunPos = gunPos.travelDistanceMeters(aisPositionReport.courseOverGround + 180,
airgunControl.airgunParameters.dimE);
gunPos = gunPos.travelDistanceMeters(aisPositionReport.courseOverGround + 90,
gunPos = gunPos.travelDistanceMeters(aisPositionReport.courseOverGround + 90,
airgunControl.airgunParameters.dimF);
GpsData gunGPS = new GpsData(gunPos);
gunGPS.setCourseOverGround(aisPositionReport.courseOverGround);

View File

@ -8,6 +8,7 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
@ -16,6 +17,7 @@ import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileFilter;
import Acquisition.AcquisitionControl;
import Acquisition.AcquisitionParameters;
import PamController.PamController;
@ -170,7 +172,7 @@ public class ArrayDialog extends PamDialog implements ActionListener {
public boolean getParams() {
// all OK, so
// move the selected array to the top of the list in the ArrayManager
if (okOK(true) == false) return false;
if (!okOK(true)) return false;
PamArray array = hydrophoneDialogPanel.getDialogSelectedArray();
ArrayManager.getArrayManager().setCurrentArray(array);
@ -179,7 +181,7 @@ public class ArrayDialog extends PamDialog implements ActionListener {
hydrophoneDialogPanel.getParams();
instrumentIdentityPanel.getParams(array);
if (checkDaqChannels(array) == false) {
if (!checkDaqChannels(array)) {
return false;
}
@ -198,7 +200,7 @@ public class ArrayDialog extends PamDialog implements ActionListener {
ArrayList<AcquisitionControl> daqControllers = AcquisitionControl.getControllers();
boolean allOk = true;
for (int i = 0; i < daqControllers.size(); i++) {
if (checkDaqChannels(daqControllers.get(i), array) == false) {
if (!checkDaqChannels(daqControllers.get(i), array)) {
allOk = false;
}
}
@ -238,7 +240,7 @@ public class ArrayDialog extends PamDialog implements ActionListener {
}
return false;
}
else if (environmentPanel.getParams() == false) {
else if (!environmentPanel.getParams()) {
return false;
}
@ -274,6 +276,7 @@ public class ArrayDialog extends PamDialog implements ActionListener {
deleteArrayButton.setEnabled(ArrayManager.getArrayManager().getArrayCount() > 1);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == cancelButton) {
this.setVisible(false);

View File

@ -8,11 +8,9 @@ import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.JFrame;
import pamMaths.PamQuaternion;
import pamMaths.PamVector;
import userDisplay.UserDisplayControl;
import Array.importHydrophoneData.HydrophoneImport;
import Array.importHydrophoneData.StreamerImport;
import Array.layoutFX.ArrayGUIFX;
@ -26,6 +24,7 @@ import PamController.PamControlledUnit;
import PamController.PamControlledUnitGUI;
import PamController.PamControlledUnitSettings;
import PamController.PamController;
import PamController.PamControllerInterface;
import PamController.PamGUIManager;
import PamController.PamSettingManager;
import PamController.PamSettings;
@ -40,6 +39,9 @@ import PamguardMVC.PamDataUnit;
import PamguardMVC.PamObservable;
import PamguardMVC.PamObserver;
import dataPlotsFX.data.TDDataProviderRegisterFX;
import pamMaths.PamQuaternion;
import pamMaths.PamVector;
import userDisplay.UserDisplayControl;
/**
* Manager for different array configurations. Each array configuration is
@ -169,32 +171,33 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
}
private boolean initComplete = false;
@Override
public void notifyModelChanged(int changeType) {
if (changeType == PamController.INITIALIZATION_COMPLETE) {
if (changeType == PamControllerInterface.INITIALIZATION_COMPLETE) {
initComplete = true;
}
getCurrentArray().notifyModelChanged(changeType, initComplete);
if (changeType == PamController.INITIALIZATION_COMPLETE) {
if (changeType == PamControllerInterface.INITIALIZATION_COMPLETE) {
// create data units and save - is this needed in the viewer ?
// if (PamController.getInstance().getRunMode() == PamController.RUN_NORMAL) {
hydrophonesProcess.createArrayData();
// }
}
if (changeType == PamController.OFFLINE_DATA_LOADED){
if (changeType == PamControllerInterface.OFFLINE_DATA_LOADED){
if (isViewer) {
getHydrophoneDataBlock().clearChannelIterators();
}
}
if (changeType == PamController.HYDROPHONE_ARRAY_CHANGED){
if (changeType == PamControllerInterface.HYDROPHONE_ARRAY_CHANGED){
if (isViewer) {
getHydrophoneDataBlock().clearChannelIterators();
}
}
if (changeType == PamController.GLOBAL_MEDIUM_UPDATE){
if (changeType == PamControllerInterface.GLOBAL_MEDIUM_UPDATE){
this.getCurrentArray().setSpeedOfSound(this.getPamController().getGlobalMediumManager().getDefaultSoundSpeed());
this.getCurrentArray().setDefaultSensitivity(this.getPamController().getGlobalMediumManager().getDefaultRecieverSens());
}
@ -229,7 +232,7 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
if (selectedArray != null) {
hydrophonesProcess.createArrayData();
// need to tell all modules that the array may have changed.
PamController.getInstance().notifyModelChanged(PamController.HYDROPHONE_ARRAY_CHANGED);
PamController.getInstance().notifyModelChanged(PamControllerInterface.HYDROPHONE_ARRAY_CHANGED);
}
}
@ -257,6 +260,7 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
/* (non-Javadoc)
* @see PamController.PamSettings#GetSettingsReference()
*/
@Override
public Serializable getSettingsReference() {
/*
* Save the entire array classes in the serialised file
@ -275,6 +279,7 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
/* (non-Javadoc)
* @see PamController.PamSettings#GetSettingsVersion()
*/
@Override
public long getSettingsVersion() {
return ArrayParameters.serialVersionUID;
}
@ -282,6 +287,7 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
/* (non-Javadoc)
* @see PamController.PamSettings#GetUnitName()
*/
@Override
public String getUnitName() {
return "Array Manager";
}
@ -289,6 +295,7 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
/* (non-Javadoc)
* @see PamController.PamSettings#getUnitType()
*/
@Override
public String getUnitType() {
return "Array Manager";
}
@ -296,6 +303,7 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
/* (non-Javadoc)
* @see PamController.PamSettings#RestoreSettings(PamController.PamControlledUnitSettings)
*/
@Override
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
try {
if (pamControlledUnitSettings.getSettings() != null) {
@ -385,23 +393,28 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
// }
// }
@Override
public String getObserverName() {
return "Array Manager";
}
@Override
public long getRequiredDataHistory(PamObservable o, Object arg) {
// would be better to work out how long the Gps data are being kept for and do the same
return 3600*1000;
}
@Override
public void noteNewSettings() {
}
@Override
public void removeObservable(PamObservable o) {
}
@Override
public void setSampleRate(float sampleRate, boolean notify) {
// TODO Auto-generated method stub
@ -659,10 +672,10 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
}
// need to find the direction vector for the plane.
// can do this by finding any non zero vector product.
PamVector planePerpendicular = null;;
PamVector planePerpendicular = null;
for (int i = 0; i < nPairs; i++) {
for (int j = (i+1); j < nPairs; j++) {
if (vectorPairs[i].isParallel(vectorPairs[j]) == false) {
if (!vectorPairs[i].isParallel(vectorPairs[j])) {
planePerpendicular = vectorPairs[i].vecProd(vectorPairs[j]);
break;
}
@ -771,7 +784,7 @@ public class ArrayManager extends PamControlledUnit implements PamSettings, PamO
int nPairs = pvs.length;
for (int i = 0; i < nPairs; i++) {
for (int j = i+1; j < nPairs; j++) {
if (pvs[i].isInLine(pvs[j]) == false) {
if (!pvs[i].isInLine(pvs[j])) {
return false;
}
}

View File

@ -1,7 +1,6 @@
package Array;
import java.io.Serializable;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import PamModel.parametermanager.ManagedParameters;

View File

@ -9,7 +9,7 @@ import Array.sensors.swing.ArrayDisplayParamsDialog;
import Array.swing.sidepanel.ArraySidePanel;
import PamController.PamControlledUnit;
import PamController.PamControlledUnitSettings;
import PamController.PamController;
import PamController.PamControllerInterface;
import PamController.PamSettingManager;
import PamController.PamSettings;
import PamUtils.PamCalendar;
@ -45,13 +45,13 @@ public class ArraySidePanelControl extends PamControlledUnit implements ArrayDis
public void notifyModelChanged(int changeType) {
super.notifyModelChanged(changeType);
switch (changeType) {
case PamController.INITIALIZATION_COMPLETE:
case PamController.HYDROPHONE_ARRAY_CHANGED:
case PamControllerInterface.INITIALIZATION_COMPLETE:
case PamControllerInterface.HYDROPHONE_ARRAY_CHANGED:
if (arraySidePanel != null) {
arraySidePanel.update();
}
break;
case PamController.NEW_SCROLL_TIME:
case PamControllerInterface.NEW_SCROLL_TIME:
if (isViewer()) {
arraySidePanel.updateViewerTime(PamCalendar.getTimeInMillis());
}

View File

@ -59,6 +59,7 @@ public class ChannelPanel implements ActionListener, ListSelectionListener {
channelTableData.fireTableDataChanged();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == daqControllerList) {
selectDaqController();
@ -167,10 +168,12 @@ public class ChannelPanel implements ActionListener, ListSelectionListener {
class ChannelTableData extends AbstractTableModel {
@Override
public int getColumnCount() {
return channelColumns.length;
}
@Override
public int getRowCount() {
if (acquisitionControl == null) return 0;
return (acquisitionControl.acquisitionParameters.nChannels);
@ -181,6 +184,7 @@ public class ChannelPanel implements ActionListener, ListSelectionListener {
return channelColumns[column];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (acquisitionControl == null) return null;
// see if the controller has a hydrophone list
@ -247,6 +251,7 @@ public class ChannelPanel implements ActionListener, ListSelectionListener {
/* (non-Javadoc)
* @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
*/
@Override
public void valueChanged(ListSelectionEvent e) {
enableButtons();
}

View File

@ -1,7 +1,5 @@
package Array;
import GPS.GpsData;
public class EmptyLocatorSettings extends LocatorSettings {
public EmptyLocatorSettings(Class locatorClass) {

View File

@ -30,9 +30,9 @@ import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import pamMaths.PamVector;
import PamView.PamSymbol;
import PamView.PamSymbolType;
import pamMaths.PamVector;
/**
*

View File

@ -3,12 +3,11 @@ package Array;
import java.util.ListIterator;
import GPS.NavDataSynchronisation;
import pamScrollSystem.ViewLoadObserver;
import PamController.PamController;
import PamUtils.PamCalendar;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import PamguardMVC.dataOffline.OfflineDataLoadInfo;
import pamScrollSystem.ViewLoadObserver;
public class HydrophoneDataBlock extends PamDataBlock<HydrophoneDataUnit> {
@ -104,7 +103,7 @@ public class HydrophoneDataBlock extends PamDataBlock<HydrophoneDataUnit> {
long difference;
ListIterator<HydrophoneDataUnit> listIterator = getListIterator(ITERATOR_END);
if (listIterator.hasPrevious() == false) {
if (!listIterator.hasPrevious()) {
return null;
}
unit = listIterator.previous();

View File

@ -9,17 +9,19 @@ import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;
import java.util.Arrays;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
import Acquisition.AcquisitionControl;
import GPS.GpsData;
import Layout.PamAxis;
import Layout.PamAxisPanel;
import PamController.PamController;
import PamUtils.LatLong;
import PamView.PamColors.PamColor;
import PamView.PamSymbol;
import PamView.PamSymbolType;
import PamView.PamColors.PamColor;
import PamView.panel.PamBorder;
import pamMaths.PamVector;

View File

@ -25,8 +25,6 @@ import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import Array.streamerOrigin.HydrophoneOriginMethod;
import PamController.PamController;
@ -219,6 +217,7 @@ public class HydrophoneDialogPanel implements ActionListener, ListSelectionListe
hydrophoneTableData.fireTableDataChanged();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == recentArrays) {
arrayDialog.newArraySelection();
@ -573,7 +572,7 @@ public class HydrophoneDialogPanel implements ActionListener, ListSelectionListe
/**
* and the hydrophones ...
*/
if (phonesToo == false) {
if (!phonesToo) {
return;
}
int nPhones = currentArray.getHydrophoneCount();
@ -694,11 +693,13 @@ public class HydrophoneDialogPanel implements ActionListener, ListSelectionListe
class HydrophoneTableData extends AbstractTableModel {
@Override
public int getColumnCount() {
return hydrophoneColumns.length;
}
@Override
public int getRowCount() {
PamArray currentArray = getDialogSelectedArray();
if (currentArray == null) return 0;
@ -710,6 +711,7 @@ public class HydrophoneDialogPanel implements ActionListener, ListSelectionListe
return hydrophoneColumns[column];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
PamArray array = getDialogSelectedArray();
Hydrophone hydrophone = array.getHydrophone(rowIndex);
@ -750,6 +752,7 @@ public class HydrophoneDialogPanel implements ActionListener, ListSelectionListe
/* (non-Javadoc)
* @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
*/
@Override
public void valueChanged(ListSelectionEvent e) {
enableButtons();
}

View File

@ -110,8 +110,8 @@ public class HydrophoneElementDialog extends PamDialog {
@Override
public boolean getParams() {
if (generalPanel.getParams() == false) return false;
if (coordinatePanel.getParams() == false) return false;
if (!generalPanel.getParams()) return false;
if (!coordinatePanel.getParams()) return false;
// if (sensitivityPanel.getParams() == false) return false;
int hi = interpolationDialogPanel.getSelection();
if (hi >= 0) {
@ -158,7 +158,7 @@ public class HydrophoneElementDialog extends PamDialog {
constraints.gridwidth = 1;
constraints.gridx = 0;
constraints.gridy++;
addComponent(this, recieverTypeLabel = new JLabel("", JLabel.RIGHT), constraints);
addComponent(this, recieverTypeLabel = new JLabel("", SwingConstants.RIGHT), constraints);
constraints.gridx++;
constraints.gridwidth = 2;
addComponent(this, type = new JTextField(12), constraints);
@ -169,7 +169,7 @@ public class HydrophoneElementDialog extends PamDialog {
constraints.gridx = 0;
constraints.gridy++;
constraints.anchor = GridBagConstraints.EAST;
addComponent(this, recieverSensLabel = new JLabel("", JLabel.RIGHT), constraints);
addComponent(this, recieverSensLabel = new JLabel("", SwingConstants.RIGHT), constraints);
constraints.gridx++;
constraints.anchor = GridBagConstraints.WEST;
addComponent(this, hSens = new JTextField(5), constraints);
@ -181,7 +181,7 @@ public class HydrophoneElementDialog extends PamDialog {
constraints.gridx = 0;
constraints.gridy++;
constraints.anchor = GridBagConstraints.EAST;
addComponent(this, new JLabel("Preamplifier gain ", JLabel.RIGHT), constraints);
addComponent(this, new JLabel("Preamplifier gain ", SwingConstants.RIGHT), constraints);
constraints.gridx++;
constraints.anchor = GridBagConstraints.WEST;
addComponent(this, preampGain = new JTextField(5), constraints);
@ -380,7 +380,7 @@ public class HydrophoneElementDialog extends PamDialog {
double zCoeff = PamController.getInstance().getGlobalMediumManager().getZCoeff();
setRecieverLabelText();
if (newHydrophone == false) {
if (!newHydrophone) {
x.setText(formatDouble(hydrophone.getX()));
y.setText(formatDouble(hydrophone.getY()));
depth.setText(formatDouble(zCoeff*hydrophone.getZ()));

View File

@ -3,14 +3,12 @@ package Array;
import java.io.Serializable;
import java.lang.reflect.Field;
import Array.streamerOrigin.StreamerDataIterator;
import GPS.GpsData;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamUtils.LatLong;
import PamguardMVC.PamDataBlock;
import pamMaths.PamQuaternion;
import pamMaths.PamVector;

View File

@ -3,7 +3,6 @@ package Array;
import java.util.ArrayList;
import PamController.PamController;
import PamController.PamguardVersionInfo;
public class HydrophoneLocators {

View File

@ -1,11 +1,10 @@
package Array;
import pamScrollSystem.AbstractScrollManager;
import PamUtils.PamCalendar;
import PamView.symbol.StandardSymbolManager;
import PamguardMVC.PamConstants;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamProcess;
import pamScrollSystem.AbstractScrollManager;
public class HydrophoneProcess extends PamProcess{

View File

@ -1,9 +1,9 @@
package Array;
import generalDatabase.SQLLogging;
import generalDatabase.SQLTypes;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import generalDatabase.SQLLogging;
import generalDatabase.SQLTypes;
public class HydrophoneSQLLogging extends SQLLogging {

View File

@ -7,6 +7,7 @@ import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import PamView.dialog.PamGridBagContraints;
@ -30,12 +31,12 @@ public class InstrumentIdentityPanel {
mainPanel.setBorder(new TitledBorder("Instrument information"));
mainPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new PamGridBagContraints();
mainPanel.add(new JLabel("Instrument Type ", JLabel.RIGHT), c);
mainPanel.add(new JLabel("Instrument Type ", SwingConstants.RIGHT), c);
c.gridx++;
mainPanel.add(instrumentType = new JTextField(20), c);
c.gridx = 0;
c.gridy++;
mainPanel.add(new JLabel("Instrument Id ", JLabel.RIGHT), c);
mainPanel.add(new JLabel("Instrument Id ", SwingConstants.RIGHT), c);
c.gridx++;
mainPanel.add(instrumentId = new JTextField(20), c);

View File

@ -2,23 +2,12 @@ package Array;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import Array.streamerOrigin.OriginSettings;
import GPS.GPSControl;
import GPS.GpsData;
import GPS.GpsDataUnit;
import PamController.PamController;
import PamController.PamSettingsSource;
import PamController.SettingsObject;
import PamController.masterReference.MasterReferencePoint;
import PamController.PamControllerInterface;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PrivatePamParameterData;
import PamUtils.LatLong;
import PamUtils.PamCalendar;
import PamguardMVC.PamDataBlock;
/**
* Master PAMGuard array localiser. There is now one of these and
@ -192,8 +181,8 @@ public class MasterLocator extends HydrophoneLocator implements Serializable, Cl
// streamerLocators[i].notifyModelChanged(changeType);
// }
if (initComplete) switch (changeType) {
case PamController.HYDROPHONE_ARRAY_CHANGED:
case PamController.INITIALIZATION_COMPLETE:
case PamControllerInterface.HYDROPHONE_ARRAY_CHANGED:
case PamControllerInterface.INITIALIZATION_COMPLETE:
setupLocators(ArrayManager.getArrayManager().getCurrentArray());
}
}
@ -238,7 +227,7 @@ public class MasterLocator extends HydrophoneLocator implements Serializable, Cl
boolean isStat = true;
for (int i = 0; i < n; i++) {
Streamer streamer = pamArray.getStreamer(i);
if (streamer.getHydrophoneLocator().isStatic() == false) {
if (!streamer.getHydrophoneLocator().isStatic()) {
isStat = false;
}
}

View File

@ -1,10 +1,5 @@
package Array;
import GPS.GpsData;
import GPS.GpsDataUnit;
import PamUtils.LatLong;
import PamguardMVC.PamDataBlock;
abstract public class MovingHydrophoneLocator extends SimpleHydrophoneLocator {
/**

View File

@ -23,27 +23,21 @@ package Array;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import Acquisition.AcquisitionControl;
import pamMaths.PamVector;
import Array.streamerOrigin.HydrophoneOriginMethod;
import Array.streamerOrigin.OriginSettings;
import Array.streamerOrigin.StreamerDataIterator;
import GPS.GpsData;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamUtils.LatLong;
import PamUtils.PamArrayUtils;
import PamUtils.PamCalendar;
import PamView.PamSymbol;
import PamguardMVC.ChannelIterator;
import PamguardMVC.PamConstants;
import PamguardMVC.PamDataBlock;
import pamMaths.PamVector;
/**
*
@ -1281,7 +1275,7 @@ public class PamArray implements Serializable, Cloneable, ManagedParameters {
return preceeding.getStreamerData();
}
// otherwise, we also want the next one ...
if (streamerIterator.hasNext() == false) {
if (!streamerIterator.hasNext()) {
return preceeding.getStreamerData();
}
nextUnit = streamerIterator.next();
@ -1293,7 +1287,7 @@ public class PamArray implements Serializable, Cloneable, ManagedParameters {
double w1 = nextUnit.getTimeMilliseconds()-timeMilliseconds;
double w2 = timeMilliseconds-preceeding.getTimeMilliseconds();
double wTot = w1+w2;
if (wTot == 0 || Double.isFinite(wTot) == false) {
if (wTot == 0 || !Double.isFinite(wTot)) {
w1 = w2 = 0.5;
}
else {

View File

@ -73,7 +73,7 @@ public class Preamplifier implements Serializable, Cloneable, ManagedParameters
return (Preamplifier) super.clone();
}
catch (CloneNotSupportedException Ex) {
Ex.printStackTrace();;
Ex.printStackTrace();
return null;
}
}

View File

@ -2,11 +2,6 @@ package Array;
import java.util.ArrayList;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import GPS.GpsData;
import pamMaths.PamVector;
/**

View File

@ -1,21 +1,13 @@
package Array;
import java.lang.reflect.Field;
import java.util.ListIterator;
import depthReadout.DepthControl;
import depthReadout.DepthDataBlock;
import depthReadout.DepthDataUnit;
import Array.streamerOrigin.HydrophoneOriginMethod;
import GPS.GpsData;
import GPS.GpsDataUnit;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PrivatePamParameterData;
import PamUtils.LatLong;
import PamUtils.PamUtils;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamObservable;
/**
* Straight Hydrophone Locator, uses GPS heading information from

View File

@ -13,7 +13,7 @@ import Array.streamerOrigin.GPSOriginSettings;
import Array.streamerOrigin.HydrophoneOriginMethod;
import Array.streamerOrigin.HydrophoneOriginMethods;
import Array.streamerOrigin.OriginSettings;
import PamController.PamController;
import PamController.PamControllerInterface;
import PamController.masterReference.MasterReferencePoint;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
@ -560,7 +560,7 @@ public class Streamer implements Serializable, Cloneable, ManagedParameters {
hydrophoneOrigin.prepare();
}
switch (changeType) {
case PamController.INITIALIZATION_COMPLETE:
case PamControllerInterface.INITIALIZATION_COMPLETE:
// if (PamController.getInstance().getRunMode() == PamController.RUN_NORMAL) {
// makeStreamerDataUnit();
// }
@ -886,7 +886,7 @@ public class Streamer implements Serializable, Cloneable, ManagedParameters {
break;
case HEIGHT:
if (value != null) {
setZ(value);;
setZ(value);
}
break;
case PITCH:

View File

@ -94,6 +94,7 @@ public class StreamerDataBlock extends PamDataBlock<StreamerDataUnit>{
}
}
@Override
public boolean loadViewerData(OfflineDataLoadInfo offlineDataLoadInfo, ViewLoadObserver loadObserver) {
return super.loadViewerData(offlineDataLoadInfo, loadObserver);
}

View File

@ -2,9 +2,7 @@ package Array;
import Array.sensors.ArrayParameterType;
import Array.sensors.ArraySensorFieldType;
import Array.streamerOrigin.HydrophoneOriginMethod;
import Array.streamerOrigin.OriginSettings;
import Array.streamerOrigin.StaticOriginMethod;
import Array.streamerOrigin.StaticOriginSettings;
import GPS.GpsData;
import GPS.GpsDataUnit;

View File

@ -7,16 +7,15 @@ import java.awt.Insets;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ListIterator;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
@ -123,7 +122,7 @@ public class StreamerDialog extends PamDialog {
addComponent(p, new JLabel("Error"), c);
c.gridx = 0;
c.gridy ++;
addComponent(p, new JLabel("x ", JLabel.RIGHT), c);
addComponent(p, new JLabel("x ", SwingConstants.RIGHT), c);
c.gridx++;
addComponent(p, x = new JTextField(textLength), c);
c.gridx++;
@ -133,7 +132,7 @@ public class StreamerDialog extends PamDialog {
c.gridx = 0;
c.gridy ++;
addComponent(p, new JLabel("y ", JLabel.RIGHT), c);
addComponent(p, new JLabel("y ", SwingConstants.RIGHT), c);
c.gridx++;
addComponent(p, y = new JTextField(textLength), c);
c.gridx++;
@ -143,7 +142,7 @@ public class StreamerDialog extends PamDialog {
c.gridx = 0;
c.gridy ++;
addComponent(p, streamerHeightLabel = new JLabel(" ", JLabel.RIGHT), c); // set in setStreamerLabels
addComponent(p, streamerHeightLabel = new JLabel(" ", SwingConstants.RIGHT), c); // set in setStreamerLabels
c.gridx++;
addComponent(p, z = new JTextField(textLength), c);
c.gridx++;
@ -196,29 +195,29 @@ public class StreamerDialog extends PamDialog {
String degsLab = LatLong.deg + " ";
c.gridx = 0;
c.gridy++;
addComponent(headPanel, new JLabel("Heading ", JLabel.RIGHT), c);
addComponent(headPanel, new JLabel("Heading ", SwingConstants.RIGHT), c);
c.gridx++;
addComponent(headPanel, heading = new JTextField(orWidth), c);
c.gridx++;
addComponent(headPanel, new JLabel(degsLab, JLabel.LEFT), c);
addComponent(headPanel, new JLabel(degsLab, SwingConstants.LEFT), c);
c.gridx++;
addComponent(headPanel, sensorComponents[ArraySensorFieldType.HEADING.ordinal()].getComponent(), c);
c.gridx = 0;
c.gridy++;
addComponent(headPanel, new JLabel("Pitch ", JLabel.RIGHT), c);
addComponent(headPanel, new JLabel("Pitch ", SwingConstants.RIGHT), c);
c.gridx++;
addComponent(headPanel, pitch = new JTextField(orWidth), c);
c.gridx++;
addComponent(headPanel, new JLabel(degsLab, JLabel.LEFT), c);
addComponent(headPanel, new JLabel(degsLab, SwingConstants.LEFT), c);
c.gridx++;
addComponent(headPanel, sensorComponents[ArraySensorFieldType.PITCH.ordinal()].getComponent(), c);
c.gridx = 0;
c.gridy++;
addComponent(headPanel, new JLabel("Roll ", JLabel.RIGHT), c);
addComponent(headPanel, new JLabel("Roll ", SwingConstants.RIGHT), c);
c.gridx++;
addComponent(headPanel, roll = new JTextField(orWidth), c);
c.gridx++;
addComponent(headPanel, new JLabel(degsLab, JLabel.LEFT), c);
addComponent(headPanel, new JLabel(degsLab, SwingConstants.LEFT), c);
c.gridx++;
addComponent(headPanel, sensorComponents[ArraySensorFieldType.ROLL.ordinal()].getComponent(), c);
@ -240,7 +239,7 @@ public class StreamerDialog extends PamDialog {
locPanel.setLayout(new BorderLayout());
locPanel.setBorder(locateRecieverBorder = new TitledBorder("")); //set by steStreamerLabels
locPanel.add(BorderLayout.WEST, relPanel);
locPanel.add(BorderLayout.CENTER, new JSeparator(JSeparator.VERTICAL));
locPanel.add(BorderLayout.CENTER, new JSeparator(SwingConstants.VERTICAL));
locPanel.add(BorderLayout.EAST, headPanel);
getMainPanel().add(locPanel);
getMainPanel().add(interpolationPanel.getComponent(getOwner()));
@ -403,7 +402,7 @@ public class StreamerDialog extends PamDialog {
}
OriginDialogComponent mthDialogComponent = currentOriginMethod.getDialogComponent();
if (mthDialogComponent != null) {
if (mthDialogComponent.getParams() == false) {
if (!mthDialogComponent.getParams()) {
return false;
}
}
@ -517,7 +516,7 @@ public class StreamerDialog extends PamDialog {
}
public void newOriginMethod() {
if (constructed == false) {
if (!constructed) {
return;
}
int methInd = originMethod.getSelectedIndex();

View File

@ -1,6 +1,5 @@
package Array;
import java.sql.Connection;
import java.sql.Types;
import Array.sensors.ArrayParameterType;
@ -8,11 +7,6 @@ import Array.sensors.ArraySensorFieldType;
import Array.streamerOrigin.HydrophoneOriginMethod;
import Array.streamerOrigin.HydrophoneOriginMethods;
import Array.streamerOrigin.HydrophoneOriginSystem;
import Array.streamerOrigin.OriginSettings;
import Array.streamerOrigin.StaticOriginSettings;
import GPS.GPSDataBlock;
import GPS.GpsData;
import GPS.GpsDataUnit;
import PamUtils.PamCalendar;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;

View File

@ -5,18 +5,16 @@ import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Window;
import Array.streamerOrigin.HydrophoneOriginMethod;
import GPS.GpsData;
import GPS.GpsDataUnit;
import PamUtils.Coordinate3d;
import PamUtils.PamCalendar;
import PamView.GeneralProjector;
import PamView.GeneralProjector.ParameterType;
import PamView.GeneralProjector.ParameterUnits;
import PamView.PamKeyItem;
import PamView.PamSymbol;
import PamView.PamSymbolType;
import PamView.PanelOverlayDraw;
import PamView.GeneralProjector.ParameterType;
import PamView.GeneralProjector.ParameterUnits;
import PamView.symbol.SymbolData;
import PamguardMVC.PamDataUnit;

View File

@ -1,15 +1,10 @@
package Array;
import java.lang.reflect.Field;
import java.util.ListIterator;
import pamMaths.PamVector;
import Array.sensors.StreamerSensorManager;
import Array.streamerOrigin.HydrophoneOriginMethod;
import Array.streamerOrigin.OriginIterator;
import GPS.GPSControl;
import GPS.GPSDataBlock;
import GPS.GpsData;
import GPS.GpsDataUnit;
import GPS.NavDataSynchronisation;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
@ -92,7 +87,7 @@ public class ThreadingHydrophoneLocator extends StraightHydrophoneLocator implem
*/
gpsUnit = gpsIt.previous();
}
if (gpsIt.hasPrevious() == false) {
if (!gpsIt.hasPrevious()) {
/**
* We're off the start of the available track, so can do nothing except use the stright model to
* interpolate backwards.

View File

@ -7,13 +7,13 @@ import java.io.Serializable;
import javax.swing.JMenuItem;
import mcc.MccJniInterface;
import PamController.PamControlledUnit;
import PamController.PamControlledUnitSettings;
import PamController.PamSettingManager;
import PamController.PamSettings;
import PamView.PamSidePanel;
import PamView.dialog.warn.WarnOnce;
import mcc.MccJniInterface;
public class ArrayAccelControl extends PamControlledUnit implements PamSettings {

View File

@ -1,10 +1,10 @@
package ArrayAccelerometer;
import pamMaths.PamVector;
import Array.sensors.ArraySensorDataUnit;
import Array.sensors.ArraySensorFieldType;
import PamUtils.PamUtils;
import PamguardMVC.PamDataUnit;
import pamMaths.PamVector;
public class ArrayAccelDataUnit extends PamDataUnit implements ArraySensorDataUnit {

View File

@ -9,18 +9,18 @@ import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import PamView.dialog.PamDialog;
import PamView.dialog.PamGridBagContraints;
import mcc.MccJniInterface;
import mcc.MccPanel;
import mcc.mccjna.MCCException;
import mcc.mccjna.MCCUtils;
import PamView.dialog.PamDialog;
import PamView.dialog.PamGridBagContraints;
public class ArrayAccelDialog extends PamDialog {
@ -52,17 +52,17 @@ public class ArrayAccelDialog extends PamDialog {
JPanel rPanel = new JPanel(new GridBagLayout());
rPanel.setBorder(new TitledBorder("Readout"));
GridBagConstraints c = new PamGridBagContraints();
rPanel.add(new JLabel("Read interval ", JLabel.RIGHT), c);
rPanel.add(new JLabel("Read interval ", SwingConstants.RIGHT), c);
c.gridx++;
rPanel.add(readInterval = new JTextField(5), c);
readInterval.setToolTipText("Readout interval in seconds");
c.gridx++;
rPanel.add(new JLabel(" s", JLabel.LEFT), c);
rPanel.add(new JLabel(" s", SwingConstants.LEFT), c);
for (int i = 0; i < ArrayAccelParams.NDIMENSIONS; i++) {
c.gridx = 0;
c.gridy++;
c.fill = GridBagConstraints.HORIZONTAL;
rPanel.add(new JLabel("Channel " + ArrayAccelParams.DIMENSIONNAME[i] + " ", JLabel.RIGHT), c);
rPanel.add(new JLabel("Channel " + ArrayAccelParams.DIMENSIONNAME[i] + " ", SwingConstants.RIGHT), c);
c.gridx++;
c.fill = GridBagConstraints.NONE;
rPanel.add(dimChannel[i] = new JTextField(3), c);
@ -75,23 +75,23 @@ public class ArrayAccelDialog extends PamDialog {
calPanel.setBorder(new TitledBorder("Calibration"));
c = new PamGridBagContraints();
c.gridx = 1;
calPanel.add(new JLabel("Zero", JLabel.CENTER), c);
calPanel.add(new JLabel("Zero", SwingConstants.CENTER), c);
c.gridx += 2;
calPanel.add(new JLabel("Scale", JLabel.CENTER), c);
calPanel.add(new JLabel("Scale", SwingConstants.CENTER), c);
for (int i = 0; i < ArrayAccelParams.NDIMENSIONS; i++) {
c.gridy ++;
c.gridx = 0;
calPanel.add(new JLabel(ArrayAccelParams.DIMENSIONNAME[i] + " ", JLabel.RIGHT), c);
calPanel.add(new JLabel(ArrayAccelParams.DIMENSIONNAME[i] + " ", SwingConstants.RIGHT), c);
c.gridx++;
calPanel.add(zeroVolts[i] = new JTextField(5), c);
zeroVolts[i].setToolTipText(String.format("Offset voltage for %s coordinate", ArrayAccelParams.DIMENSIONNAME[i]));
c.gridx++;
calPanel.add(new JLabel(" V, ", JLabel.LEFT), c);
calPanel.add(new JLabel(" V, ", SwingConstants.LEFT), c);
c.gridx++;
calPanel.add(voltsPerG[i] = new JTextField(5), c);
voltsPerG[i].setToolTipText(String.format("Voltage scale for %s coordinate", ArrayAccelParams.DIMENSIONNAME[i]));
c.gridx++;
calPanel.add(new JLabel(" V/g ", JLabel.LEFT), c);
calPanel.add(new JLabel(" V/g ", SwingConstants.LEFT), c);
}
c.gridx = 0;
c.gridwidth = 3;
@ -103,23 +103,23 @@ public class ArrayAccelDialog extends PamDialog {
c.gridy++;
c.gridx = 0;
c.gridwidth = 3;
calPanel.add(new JLabel("Roll offset ", JLabel.RIGHT), c);
calPanel.add(new JLabel("Roll offset ", SwingConstants.RIGHT), c);
c.gridx += c.gridwidth;
c.gridwidth = 1;
calPanel.add(rollOffset = new JTextField(5), c);
rollOffset.setToolTipText("This value gets ADDED to the measured roll");
c.gridx++;
calPanel.add(new JLabel(" deg.", JLabel.LEFT), c);
calPanel.add(new JLabel(" deg.", SwingConstants.LEFT), c);
c.gridy++;
c.gridx = 0;
c.gridwidth = 3;
calPanel.add(new JLabel("Pitch offset ", JLabel.RIGHT), c);
calPanel.add(new JLabel("Pitch offset ", SwingConstants.RIGHT), c);
c.gridx += c.gridwidth;
c.gridwidth = 1;
calPanel.add(pitchOffset = new JTextField(5), c);
pitchOffset.setToolTipText("This value gets ADDED to the measured pitch");
c.gridx++;
calPanel.add(new JLabel(" deg.", JLabel.LEFT), c);
calPanel.add(new JLabel(" deg.", SwingConstants.LEFT), c);
@ -226,7 +226,7 @@ public class ArrayAccelDialog extends PamDialog {
* Set the zero voltage for each channel.
*/
public void findZero() {
if (getParams() == false) {
if (!getParams()) {
return;
}
// read the voltages from the three channels and set as

View File

@ -15,12 +15,10 @@ import PamUtils.LatLong;
import PamView.PamColors;
import PamView.PamColors.PamColor;
import PamView.panel.PamBorder;
import PamView.panel.PamBorderPanel;
import PamView.panel.PamPanel;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import PamguardMVC.PamObservable;
import PamguardMVC.PamObserver;
import PamguardMVC.PamObserverAdapter;
/*
@ -36,7 +34,7 @@ public class ArrayAccelPanel {
private long zeroGraphTime;
private ArrayAccelDataBlock accelDataBlock;
private int panelDurationSecs = 300;
private double timeScale = 1;;
private double timeScale = 1;
public ArrayAccelPanel(ArrayAccelControl accelControl) {

View File

@ -1,12 +1,10 @@
package ArrayAccelerometer;
import java.io.Serializable;
import java.util.Arrays;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import mcc.MccJniInterface;
import mcc.mccjna.MCCConstants;
public class ArrayAccelParams implements Serializable, Cloneable, ManagedParameters {

View File

@ -5,17 +5,12 @@ import java.awt.event.ActionListener;
import javax.swing.Timer;
import PamController.PamController;
import PamUtils.PamCalendar;
import PamguardMVC.PamProcess;
import mcc.MccJniInterface;
import mcc.mccjna.MCCException;
import mcc.mccjna.MCCUtils;
import Array.ArrayManager;
import Array.PamArray;
import Array.Streamer;
import PamController.PamControlledUnit;
import PamController.PamController;
import PamUtils.PamCalendar;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamProcess;
public class ArrayAccelProcess extends PamProcess {

View File

@ -1,11 +1,8 @@
package ArrayAccelerometer;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
import PamView.PamColors.PamColor;
import PamView.panel.PamPanel;
import PamView.PamSidePanel;
public class ArrayAccelSidePanel implements PamSidePanel {

View File

@ -2,8 +2,6 @@ package Azigram;
import java.util.Arrays;
import Acquisition.AcquisitionProcess;
import PamUtils.PamUtils;
import PamUtils.complex.ComplexArray;
import fftManager.FFTDataUnit;

View File

@ -8,8 +8,6 @@ import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamView.GroupedSourceParameters;
import PamguardMVC.PamConstants;
import whistlesAndMoans.WhistleToneParameters;
public class AzigramParameters implements Serializable, ManagedParameters, Cloneable {

View File

@ -8,19 +8,14 @@ import java.io.Serializable;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import Filters.layoutFX.FilterGUIFX;
import PamController.PamControlledUnit;
import PamController.PamControlledUnitGUI;
import PamController.PamControlledUnitSettings;
import PamController.PamController;
import PamController.PamControllerInterface;
import PamController.PamGUIManager;
import PamController.PamSettingManager;
import PamController.PamSettings;
import fftManager.layoutFX.FFTGuiFX;
/**
* Filters raw data using a specified filter.
@ -71,6 +66,7 @@ public class FilterControl extends PamControlledUnit implements PamSettings {
this.parentFrame = parentFrame;
}
@Override
public void actionPerformed(ActionEvent e) {
FilterParameters_2 newParams = FilterDataSourceDialog.showDialog(filterParams, parentFrame, filterProcess.outputData);
@ -90,6 +86,7 @@ public class FilterControl extends PamControlledUnit implements PamSettings {
super();
this.parentFrame = parentFrame;
}
@Override
public void actionPerformed(ActionEvent e) {
FilterParams newParams = FilterDialog.showDialog(parentFrame,
@ -109,7 +106,7 @@ public class FilterControl extends PamControlledUnit implements PamSettings {
public void notifyModelChanged(int changeType) {
//System.out.println("FFTControl: notifyModelChanged : " +changeType);
super.notifyModelChanged(changeType);
if (changeType == PamController.INITIALIZATION_COMPLETE) {
if (changeType == PamControllerInterface.INITIALIZATION_COMPLETE) {
filterProcess.setupProcess();
}
if (filterGUIFX!=null) {
@ -117,14 +114,17 @@ public class FilterControl extends PamControlledUnit implements PamSettings {
}
}
@Override
public Serializable getSettingsReference() {
return filterParams;
}
@Override
public long getSettingsVersion() {
return FilterParams.serialVersionUID;
}
@Override
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
filterParams = ((FilterParameters_2) pamControlledUnitSettings.getSettings()).clone();
return true;

View File

@ -1,6 +1,7 @@
package Filters;
import java.awt.Frame;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

View File

@ -21,6 +21,7 @@
package Filters;
import java.awt.Window;
import PamView.dialog.PamDialog;
public class FilterDialog extends PamDialog {

View File

@ -37,10 +37,14 @@ import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.AbstractTableModel;
import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvException;
import Layout.PamAxis;
import PamUtils.PamFileChooser;
import PamUtils.PamFileFilter;
@ -49,9 +53,6 @@ import PamView.PamColors.PamColor;
import PamView.dialog.PamDialog;
import PamView.dialog.PamGridBagContraints;
import PamView.panel.PamPanel;
import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvException;
import fftManager.Complex;
/**
@ -188,8 +189,9 @@ public class FilterDialogPanel implements ActionListener {
repaintAll();
}
@Override
public void actionPerformed(ActionEvent e) {
if (isSetup == false) {
if (!isSetup) {
return;
}
if (e.getSource() == filterTypes) {
@ -235,7 +237,7 @@ public class FilterDialogPanel implements ActionListener {
break;
}
boolean isArb = filterType == 4;
normalPanel.setVisible(isArb == false);
normalPanel.setVisible(!isArb);
arbPanel.setVisible(isArb);
}
@ -321,14 +323,14 @@ public class FilterDialogPanel implements ActionListener {
c.gridwidth = 1;
c.gridy++;
c.gridx = xc;
normalPanel.add(new JLabel(" High Pass", JLabel.RIGHT), c);
normalPanel.add(new JLabel(" High Pass", SwingConstants.RIGHT), c);
c.gridx++;
normalPanel.add(highCut, c);
c.gridx++;
normalPanel.add(new JLabel(" Hz"), c);
c.gridy++;
c.gridx = xc;
normalPanel.add(new JLabel(" Low Pass", JLabel.RIGHT), c);
normalPanel.add(new JLabel(" Low Pass", SwingConstants.RIGHT), c);
c.gridx++;
normalPanel.add(lowCut, c);
c.gridx++;
@ -702,10 +704,10 @@ public class FilterDialogPanel implements ActionListener {
if (filterMethod == null) {
return;
}
if (IIRFilterMethod.class.isAssignableFrom(filterMethod.getClass()) == true) {
if (IIRFilterMethod.class.isAssignableFrom(filterMethod.getClass())) {
paintPoleZeros(g);
}
else if (FIRFilterMethod.class.isAssignableFrom(filterMethod.getClass()) == true) {
else if (FIRFilterMethod.class.isAssignableFrom(filterMethod.getClass())) {
paintImpulseResponse(g);
}
}

View File

@ -20,8 +20,6 @@
*/
package Filters;
import fftManager.Complex;
/**
* @author Doug Gillespie
* <p>

View File

@ -2,9 +2,6 @@ package Filters;
import java.io.Serializable;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;

View File

@ -22,12 +22,7 @@ package Filters;
import java.io.File;
import java.io.Serializable;
import java.util.Arrays;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import PamController.PamControlledUnit;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;

View File

@ -28,7 +28,7 @@ public class FilterSpeed {
data[i] = r.nextGaussian();
}
testData = data.clone();
long sn, en, mn = 0;;
long sn, en, mn = 0;
double a;
long startTime = System.currentTimeMillis();
for (int i = 0; i < nTrials; i++) {

View File

@ -229,6 +229,7 @@ public abstract class IIRFilterMethod extends FilterMethod {
* Get coefficients from poles and zeros for fast filter computations.
* @return
*/
@Override
public double[] getFastFilterCoefficients() {
Complex[] poles = getPoles(filterParams);
Complex[] zeros = getZeros(filterParams);

View File

@ -195,6 +195,7 @@ public class IirfFilter implements Filter {
/* (non-Javadoc)
* @see Filters.Filter#runFilter(double[])
*/
@Override
synchronized public void runFilter(double[] inputData) {
int f;
for (int i = 0; i < inputData.length; i++) {
@ -208,6 +209,7 @@ public class IirfFilter implements Filter {
/* (non-Javadoc)
* @see Filters.Filter#runFilter(double[], double[])
*/
@Override
synchronized public void runFilter(double[] inputData, double[] outputData) {
int f;
if (outputData == null || outputData.length != inputData.length) {
@ -225,6 +227,7 @@ public class IirfFilter implements Filter {
/* (non-Javadoc)
* @see Filters.Filter#runFilter(double)
*/
@Override
synchronized public double runFilter(double aData) {
double newData = aData;
for (int f = 0; f < nFilterUnits; f++) {

View File

@ -52,14 +52,14 @@ public class FormatGpsData {
Date dateO;
FormatGpsData() {
};
}
FormatGpsData(StringBuffer nmeaString) {
/*
* Unpack the string buffer to populate the above datas
*/
};
}
public static String formatTime(int intTime) {
SimpleDateFormat gpsTimeFormat = new SimpleDateFormat("HHmmss");

View File

@ -9,11 +9,6 @@ import java.util.ListIterator;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import warnings.PamWarning;
import warnings.WarningSystem;
import NMEA.NMEADataBlock;
import PamController.PamControlledUnit;
import PamController.PamControlledUnitSettings;
@ -21,9 +16,10 @@ import PamController.PamController;
import PamController.PamSettingManager;
import PamController.PamSettings;
import PamController.positionreference.PositionReference;
import PamUtils.PamCalendar;
import PamView.dialog.warn.WarnOnce;
import PamguardMVC.PamDataBlock;
import warnings.PamWarning;
import warnings.WarningSystem;
public class GPSControl extends PamControlledUnit implements PamSettings, PositionReference {
@ -144,7 +140,9 @@ public class GPSControl extends PamControlledUnit implements PamSettings, Positi
@Override
public void actionPerformed(ActionEvent arg0) {
String currentPath;
ImportGPSParams newParams=ImportGPSDialog.showDialog(PamController.getInstance().getMainFrame(), PamController.getInstance().getMainFrame().getMousePosition(),gpsImportParams, importGPSData);
PamController.getInstance();
PamController.getInstance();
ImportGPSParams newParams=ImportGPSDialog.showDialog(PamController.getMainFrame(), PamController.getMainFrame().getMousePosition(),gpsImportParams, importGPSData);
if (newParams!=null) gpsImportParams=newParams.clone();
@ -168,6 +166,7 @@ public class GPSControl extends PamControlledUnit implements PamSettings, Positi
this.parentFrame = parentFrame;
}
@Override
public void actionPerformed(ActionEvent e) {
GPSParameters newP = GPSParametersDialog.showDialog(parentFrame, gpsParameters);
if (newP != null) {
@ -184,6 +183,7 @@ public class GPSControl extends PamControlledUnit implements PamSettings, Positi
this.parentFrame = parentFrame;
}
@Override
public void actionPerformed(ActionEvent e) {
String message = "<html>Clock management is now controlled from the \"File/Global time settings\" menu<p>" +
"The Global time settings do not require administrator privilidges<p><p>" +
@ -195,13 +195,16 @@ public class GPSControl extends PamControlledUnit implements PamSettings, Positi
}
}
}
@Override
public Serializable getSettingsReference() {
return gpsParameters;
}
@Override
public long getSettingsVersion() {
return GPSParameters.serialVersionUID;
}
@Override
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
if (pamControlledUnitSettings.getUnitType().equals(this.getUnitType())
@ -260,7 +263,7 @@ public class GPSControl extends PamControlledUnit implements PamSettings, Positi
* @return interpolated gps position.
*/
public GpsDataUnit getShipPosition(long timeMilliseconds, boolean interpolate) {
if (interpolate == false) {
if (!interpolate) {
return getGpsDataBlock().getClosestUnitMillis(timeMilliseconds);
}
// otherwise try to fine a point either side and weighted mean them or extrapolate.

Some files were not shown because too many files have changed in this diff Show More