mirror of
https://github.com/PAMGuard/PAMGuard.git
synced 2024-11-21 22:52:22 +00:00
Remove ALFA module
This commit is contained in:
parent
ace7132184
commit
a6e3a36a37
@ -63,7 +63,6 @@ import PamController.PamSettings;
|
|||||||
import PamDetection.RawDataUnit;
|
import PamDetection.RawDataUnit;
|
||||||
import PamView.dialog.warn.WarnOnce;
|
import PamView.dialog.warn.WarnOnce;
|
||||||
import PamguardMVC.PamDataBlock;
|
import PamguardMVC.PamDataBlock;
|
||||||
import alfa.ALFAControl;
|
|
||||||
import analogarraysensor.ArraySensorControl;
|
import analogarraysensor.ArraySensorControl;
|
||||||
import backupmanager.BackupManager;
|
import backupmanager.BackupManager;
|
||||||
import beamformer.continuous.BeamFormerControl;
|
import beamformer.continuous.BeamFormerControl;
|
||||||
@ -419,10 +418,11 @@ final public class PamModel implements PamModelInterface, PamSettings {
|
|||||||
mi.setModulesMenuGroup(utilitiesGroup);
|
mi.setModulesMenuGroup(utilitiesGroup);
|
||||||
mi.setHidden(SMRUEnable.isEnable() == false);
|
mi.setHidden(SMRUEnable.isEnable() == false);
|
||||||
|
|
||||||
mi = PamModuleInfo.registerControlledUnit(ALFAControl.class.getName(), "Master Controller");
|
// now releagate to a plugin module.
|
||||||
mi.setToolTipText("Big brother - will keep an eye on you and look after you");
|
// mi = PamModuleInfo.registerControlledUnit(ALFAControl.class.getName(), "Master Controller");
|
||||||
mi.setModulesMenuGroup(utilitiesGroup);
|
// mi.setToolTipText("Big brother - will keep an eye on you and look after you");
|
||||||
mi.setHidden(SMRUEnable.isEnable() == false);
|
// mi.setModulesMenuGroup(utilitiesGroup);
|
||||||
|
// mi.setHidden(SMRUEnable.isEnable() == false);
|
||||||
|
|
||||||
mi = PamModuleInfo.registerControlledUnit(PrintScreenControl.class.getName(), "Print Screen");
|
mi = PamModuleInfo.registerControlledUnit(PrintScreenControl.class.getName(), "Print Screen");
|
||||||
mi.setToolTipText(PrintScreenControl.getToolTip());
|
mi.setToolTipText(PrintScreenControl.getToolTip());
|
||||||
|
@ -1,338 +0,0 @@
|
|||||||
package alfa;
|
|
||||||
|
|
||||||
import java.awt.Frame;
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import javax.swing.JMenu;
|
|
||||||
import javax.swing.JMenuItem;
|
|
||||||
import Acquisition.AcquisitionControl;
|
|
||||||
import GPS.GPSControl;
|
|
||||||
import Map.MapController;
|
|
||||||
import NMEA.NMEAControl;
|
|
||||||
import PamController.PamControlledUnit;
|
|
||||||
import PamController.PamControlledUnitSettings;
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamController.PamSettingManager;
|
|
||||||
import PamController.PamSettings;
|
|
||||||
import PamController.status.ModuleStatus;
|
|
||||||
import PamView.PamSidePanel;
|
|
||||||
import PamView.PamTabPanel;
|
|
||||||
import alfa.clickmonitor.ClickMonitorProcess;
|
|
||||||
import alfa.clickmonitor.eventaggregator.ClickEventAggregate;
|
|
||||||
import alfa.comms.MessageProcess;
|
|
||||||
import alfa.effortmonitor.AngleHistogram;
|
|
||||||
import alfa.effortmonitor.EffortMonitor;
|
|
||||||
import alfa.logger.LoggerMonitor;
|
|
||||||
import alfa.status.StatusMonitor;
|
|
||||||
import alfa.status.StatusObserver;
|
|
||||||
import alfa.swinggui.ALFADialog;
|
|
||||||
import alfa.swinggui.ALFAGUITransformer;
|
|
||||||
import alfa.swinggui.ALFASidePanel;
|
|
||||||
import alfa.swinggui.BBSwingTabPanel;
|
|
||||||
import alfa.utils.MiraScreen;
|
|
||||||
import binaryFileStorage.BinaryStore;
|
|
||||||
import clickDetector.ClickControl;
|
|
||||||
import clickTrainDetector.ClickTrainControl;
|
|
||||||
import detectiongrouplocaliser.DetectionGroupDataUnit;
|
|
||||||
import generalDatabase.DBControlUnit;
|
|
||||||
import rockBlock.RockBlockControl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ALFA module shows status of various modules in PAMGuard for real time operation detecting
|
|
||||||
* sperm whales for the Alaska Fishermen's Association.
|
|
||||||
*
|
|
||||||
* @author Doug Gillespie
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ALFAControl extends PamControlledUnit implements PamSettings {
|
|
||||||
|
|
||||||
private static String unitType = "ALFA Sperm Tracker";
|
|
||||||
|
|
||||||
private StatusMonitor statusMonitor;
|
|
||||||
|
|
||||||
private BBSwingTabPanel bbSwingTabPanel;
|
|
||||||
|
|
||||||
private boolean initialisationComplete;
|
|
||||||
|
|
||||||
private ClickMonitorProcess clickMonitorProcess;
|
|
||||||
|
|
||||||
private EffortMonitor effortMonitor;
|
|
||||||
|
|
||||||
private LoggerMonitor loggerMonitor;
|
|
||||||
|
|
||||||
private MessageProcess messageProcess;
|
|
||||||
|
|
||||||
private ALFAParameters alfaParameters = new ALFAParameters();
|
|
||||||
|
|
||||||
private ALFASidePanel alfaSidePanel;
|
|
||||||
|
|
||||||
private ALFAGUITransformer alfaGuiTransformer;
|
|
||||||
|
|
||||||
public ALFAControl(String unitName) {
|
|
||||||
super(unitType, unitName);
|
|
||||||
ArrayList<ControlledModuleInfo> controlledModulesList = new ArrayList<>();
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(DBControlUnit.class));
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(BinaryStore.class));
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(NMEAControl.class));
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(GPSControl.class));
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(MapController.class));
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(AcquisitionControl.class));
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(ClickControl.class));
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(ClickTrainControl.class));
|
|
||||||
// controlledModulesList.add(new ControlledModuleInfo(FormsControl.class));
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(RockBlockControl.class, "Sat Comms"));
|
|
||||||
controlledModulesList.add(new ControlledModuleInfo(ALFAControl.class));
|
|
||||||
statusMonitor = new StatusMonitor(false, controlledModulesList);
|
|
||||||
|
|
||||||
statusMonitor.addObserver(new StatusObserver() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void newStatus() {
|
|
||||||
statusUpdated();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void newModuleList() {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
clickMonitorProcess = new ClickMonitorProcess(this);
|
|
||||||
addPamProcess(clickMonitorProcess);
|
|
||||||
effortMonitor = new EffortMonitor(this);
|
|
||||||
addPamProcess(effortMonitor);
|
|
||||||
messageProcess = new MessageProcess(this);
|
|
||||||
addPamProcess(messageProcess);
|
|
||||||
addPamProcess(loggerMonitor = new LoggerMonitor(this));
|
|
||||||
|
|
||||||
PamSettingManager.getInstance().registerSettings(this);
|
|
||||||
|
|
||||||
if (alfaParameters.autoScreenMirror) {
|
|
||||||
MiraScreen.startMirror();
|
|
||||||
}
|
|
||||||
|
|
||||||
alfaSidePanel = new ALFASidePanel(this);
|
|
||||||
|
|
||||||
if (!this.isViewer()) {
|
|
||||||
//GUI alterations for real time mode.
|
|
||||||
alfaGuiTransformer = new ALFAGUITransformer(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void statusUpdated() {
|
|
||||||
if (alfaSidePanel != null) {
|
|
||||||
alfaSidePanel.statusUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see PamController.PamControlledUnit#getTabPanel()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public PamTabPanel getTabPanel() {
|
|
||||||
if (bbSwingTabPanel == null) {
|
|
||||||
bbSwingTabPanel = new BBSwingTabPanel(this);
|
|
||||||
}
|
|
||||||
return bbSwingTabPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MapController findMapController() {
|
|
||||||
return (MapController) PamController.getInstance().findControlledUnit(MapController.unitType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the statusMonitor
|
|
||||||
*/
|
|
||||||
public StatusMonitor getStatusMonitor() {
|
|
||||||
return statusMonitor;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see PamController.PamControlledUnit#notifyModelChanged(int)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void notifyModelChanged(int changeType) {
|
|
||||||
super.notifyModelChanged(changeType);
|
|
||||||
if (changeType == PamController.INITIALIZATION_COMPLETE) {
|
|
||||||
// probably need to do something ?
|
|
||||||
initialisationComplete = true;
|
|
||||||
bbSwingTabPanel.updateUnits();
|
|
||||||
findClickTrainDetector();
|
|
||||||
}
|
|
||||||
if (initialisationComplete) {
|
|
||||||
switch (changeType) {
|
|
||||||
case PamController.ADD_CONTROLLEDUNIT:
|
|
||||||
case PamController.REMOVE_CONTROLLEDUNIT:
|
|
||||||
bbSwingTabPanel.updateUnits();
|
|
||||||
findClickTrainDetector();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (alfaGuiTransformer!=null) this.alfaGuiTransformer.notifyModelChanged(changeType);
|
|
||||||
//this.alfaSidePanel.notifyModelChanged(changeType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the model changes.
|
|
||||||
*/
|
|
||||||
private void findClickTrainDetector() {
|
|
||||||
ClickTrainControl clickControl = (ClickTrainControl) PamController.getInstance().findControlledUnit(ClickTrainControl.class, null);
|
|
||||||
clickMonitorProcess.setClickTrainDetector(clickControl);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the clickMonitorProcess
|
|
||||||
*/
|
|
||||||
public ClickMonitorProcess getClickMonitorProcess() {
|
|
||||||
return clickMonitorProcess;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the effortMonitor
|
|
||||||
*/
|
|
||||||
public EffortMonitor getEffortMonitor() {
|
|
||||||
return effortMonitor;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the messageProcess
|
|
||||||
*/
|
|
||||||
public MessageProcess getMessageProcess() {
|
|
||||||
return messageProcess;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generic updated information from the click monitor and aggregator which can
|
|
||||||
* be used to update the effort data.
|
|
||||||
* @param aggregateEvent
|
|
||||||
* @param detectionGroupDataUnit
|
|
||||||
*/
|
|
||||||
public void updateClickInformation(ClickEventAggregate aggregateEvent,
|
|
||||||
DetectionGroupDataUnit detectionGroupDataUnit) {
|
|
||||||
effortMonitor.updateClickInformation(aggregateEvent, detectionGroupDataUnit);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JMenuItem createDetectionMenu(Frame parentFrame) {
|
|
||||||
JMenu menu = new JMenu(getUnitName() + " options ...");
|
|
||||||
// menu.add(loggerMonitor.getMenuItem(parentFrame));
|
|
||||||
JMenuItem menuItem = new JMenuItem(getUnitName() + " Options ...");
|
|
||||||
menuItem.addActionListener(new ActionListener() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
showAlfaDialog(parentFrame);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
menu.add(menuItem);
|
|
||||||
return menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void showAlfaDialog() {
|
|
||||||
showAlfaDialog(getGuiFrame());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void showAlfaDialog(Frame parentFrame) {
|
|
||||||
ALFAParameters newParams = ALFADialog.showDialog(parentFrame, this);
|
|
||||||
if (newParams != null) {
|
|
||||||
setAlfaParameters(newParams);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the alfaParameters
|
|
||||||
*/
|
|
||||||
public ALFAParameters getAlfaParameters() {
|
|
||||||
return alfaParameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param alfaParameters the alfaParameters to set
|
|
||||||
*/
|
|
||||||
public void setAlfaParameters(ALFAParameters alfaParameters) {
|
|
||||||
this.alfaParameters = alfaParameters;
|
|
||||||
if (alfaParameters.autoScreenMirror) {
|
|
||||||
MiraScreen.startMirror();
|
|
||||||
}
|
|
||||||
this.setupControlledUnit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the loggerMonitor
|
|
||||||
*/
|
|
||||||
public LoggerMonitor getLoggerMonitor() {
|
|
||||||
return loggerMonitor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Serializable getSettingsReference() {
|
|
||||||
return alfaParameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getSettingsVersion() {
|
|
||||||
return ALFAParameters.serialVersionUID;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) {
|
|
||||||
alfaParameters = ((ALFAParameters) pamControlledUnitSettings.getSettings()).clone();
|
|
||||||
return alfaParameters != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ModuleStatus getModuleStatus() {
|
|
||||||
return statusMonitor.getSummaryStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PamSidePanel getSidePanel() {
|
|
||||||
return alfaSidePanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a status object (for display in the side panel) which
|
|
||||||
* summarises the number of whales recently detected.
|
|
||||||
* @return whale summary.
|
|
||||||
*/
|
|
||||||
public ModuleStatus getWhaleStatus() {
|
|
||||||
return effortMonitor.getWhaleStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
public AngleHistogram getStatusAngleHistogram() {
|
|
||||||
return effortMonitor.getAveragedAngleHistogram();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* called just before data acquisition starts. Note that
|
|
||||||
* PamObservers get a call to setSampleRate anyway so this mainly needs
|
|
||||||
* to be used for display elements that may need their scales
|
|
||||||
* adjusted before startup.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void pamToStart() {
|
|
||||||
// SwingUtilities.invokeLater(new Runnable() {
|
|
||||||
// @Override
|
|
||||||
// public void run() {
|
|
||||||
alfaSidePanel.notifyModelChanged(PamController.PAM_RUNNING);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called for all controlled units after Pam acquisition has stopped
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void pamHasStopped() {
|
|
||||||
// SwingUtilities.invokeLater(new Runnable() {
|
|
||||||
// @Override
|
|
||||||
// public void run() {
|
|
||||||
alfaSidePanel.notifyModelChanged(PamController.PAM_IDLE);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
package alfa;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
import PamModel.parametermanager.ManagedParameters;
|
|
||||||
import PamModel.parametermanager.PamParameterSet;
|
|
||||||
import loggerForms.FormDescription;
|
|
||||||
|
|
||||||
public class ALFAParameters implements Serializable, Cloneable, ManagedParameters {
|
|
||||||
|
|
||||||
public static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* interval for sending effort data when no
|
|
||||||
* whales are present in SECONDS
|
|
||||||
*/
|
|
||||||
public int effortMsgIntervalNoWhales = 3600;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* interval for sending effort data when
|
|
||||||
* whales are present in SECONDS
|
|
||||||
*/
|
|
||||||
// public int effortMsgIntervalWhales = 900;
|
|
||||||
public int histosPerReportInterval = 4;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The histogram bin interval for a 0-180 degree bearing.
|
|
||||||
*/
|
|
||||||
private int binsPerhistogram = 5;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* True to use click train median angle for angle histogram.
|
|
||||||
* False to use clicks in angle histogram.
|
|
||||||
*/
|
|
||||||
public boolean useClkTrains = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reload old reports at startup. This is important if
|
|
||||||
* the system crashes to reload old data and continue histogram.
|
|
||||||
*/
|
|
||||||
public boolean reloadOldReports = true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Automatically launch the screen mirror service
|
|
||||||
*/
|
|
||||||
public boolean autoScreenMirror = true;
|
|
||||||
|
|
||||||
public int loggerFormFormat = FormDescription.LOGGER_FORMS_JSON;
|
|
||||||
|
|
||||||
public boolean followOffline = false;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ALFAParameters clone() {
|
|
||||||
try {
|
|
||||||
return (ALFAParameters) super.clone();
|
|
||||||
} catch (CloneNotSupportedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the binsPerhistogram
|
|
||||||
*/
|
|
||||||
public int getBinsPerhistogram() {
|
|
||||||
if (binsPerhistogram <= 0) {
|
|
||||||
binsPerhistogram = 4;
|
|
||||||
}
|
|
||||||
return binsPerhistogram;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param binsPerhistogram the binsPerhistogram to set
|
|
||||||
*/
|
|
||||||
public void setBinsPerhistogram(int binsPerhistogram) {
|
|
||||||
this.binsPerhistogram = binsPerhistogram;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PamParameterSet getParameterSet() {
|
|
||||||
PamParameterSet ps = PamParameterSet.autoGenerate(this);
|
|
||||||
return ps;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,93 +0,0 @@
|
|||||||
package alfa;
|
|
||||||
|
|
||||||
import PamModel.PamModuleInfo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Information about a module that needs to be monitored for status. <br>
|
|
||||||
* Wraps around and extends PamModuleInfo to give extra functionality for
|
|
||||||
* advanced status monitoring.
|
|
||||||
* @author dg50
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ControlledModuleInfo {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Standard PAMGuard module info for the class, tells
|
|
||||||
* PAMGuard how to construct it, a default name, etc.
|
|
||||||
*/
|
|
||||||
private PamModuleInfo pamModuleInfo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A fixed module name. Can be used to force a particular name rather
|
|
||||||
* than just using the default value.
|
|
||||||
*/
|
|
||||||
private String fixedModuleName;
|
|
||||||
|
|
||||||
public ControlledModuleInfo(PamModuleInfo pamModuleInfo) {
|
|
||||||
this.pamModuleInfo = pamModuleInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param pamModuleInfo
|
|
||||||
* @param fixedModuleName
|
|
||||||
*/
|
|
||||||
public ControlledModuleInfo(PamModuleInfo pamModuleInfo, String fixedModuleName) {
|
|
||||||
super();
|
|
||||||
this.pamModuleInfo = pamModuleInfo;
|
|
||||||
this.fixedModuleName = fixedModuleName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param className
|
|
||||||
* @param fixedModuleName
|
|
||||||
*/
|
|
||||||
public ControlledModuleInfo(Class className, String fixedModuleName) {
|
|
||||||
this(PamModuleInfo.findModuleInfo(className.getName()), fixedModuleName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param className
|
|
||||||
*/
|
|
||||||
public ControlledModuleInfo(Class className) {
|
|
||||||
this(PamModuleInfo.findModuleInfo(className.getName()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the pamModuleInfo
|
|
||||||
*/
|
|
||||||
public PamModuleInfo getPamModuleInfo() {
|
|
||||||
return pamModuleInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param pamModuleInfo the pamModuleInfo to set
|
|
||||||
*/
|
|
||||||
public void setPamModuleInfo(PamModuleInfo pamModuleInfo) {
|
|
||||||
this.pamModuleInfo = pamModuleInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the fixedModuleName
|
|
||||||
*/
|
|
||||||
public String getFixedModuleName() {
|
|
||||||
return fixedModuleName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param fixedModuleName the fixedModuleName to set
|
|
||||||
*/
|
|
||||||
public void setFixedModuleName(String fixedModuleName) {
|
|
||||||
this.fixedModuleName = fixedModuleName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDefaultName() {
|
|
||||||
if (fixedModuleName != null) {
|
|
||||||
return fixedModuleName;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return pamModuleInfo.getDefaultName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,148 +0,0 @@
|
|||||||
package alfa.clickmonitor;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
|
|
||||||
import PamController.PamControlledUnit;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import PamguardMVC.PamObservable;
|
|
||||||
import PamguardMVC.PamProcess;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import alfa.clickmonitor.eventaggregator.ClickAggregateDataBlock;
|
|
||||||
import alfa.clickmonitor.eventaggregator.ClickEventAggregate;
|
|
||||||
import alfa.clickmonitor.swing.ClickAggregatOverlayGraphics;
|
|
||||||
import alfa.clickmonitor.swing.ClickMonitorComponent;
|
|
||||||
import clickDetector.ClickControl;
|
|
||||||
import clickDetector.offlineFuncs.OfflineEventDataUnit;
|
|
||||||
import clickTrainDetector.ClickTrainControl;
|
|
||||||
import detectiongrouplocaliser.DetectionGroupDataUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PAM Process which will automatically subscribe to the click train detector output and prepare status messages for display and transmission
|
|
||||||
* @author dg50
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ClickMonitorProcess extends PamProcess {
|
|
||||||
|
|
||||||
private ALFAControl bigBrotherControl;
|
|
||||||
// private ClickControl clickControl;
|
|
||||||
private ClickTrainControl clickTrainControl;
|
|
||||||
|
|
||||||
private SimpleClickEventAggregator clickEventAggregator;
|
|
||||||
|
|
||||||
private ClickAggregateDataBlock clickAggregateDataBlock;
|
|
||||||
private ClickMonitorComponent clickMonitorComponent;
|
|
||||||
|
|
||||||
public ClickMonitorProcess(ALFAControl bigBrotherControl) {
|
|
||||||
super(bigBrotherControl, null);
|
|
||||||
this.bigBrotherControl = bigBrotherControl;
|
|
||||||
clickEventAggregator = new SimpleClickEventAggregator(1000e6);
|
|
||||||
clickAggregateDataBlock = new ClickAggregateDataBlock("Sperm Whale Groups", this, 0);
|
|
||||||
clickAggregateDataBlock.setNaturalLifetime(3600);
|
|
||||||
clickAggregateDataBlock.setOverlayDraw(new ClickAggregatOverlayGraphics(clickAggregateDataBlock));
|
|
||||||
addOutputDataBlock(clickAggregateDataBlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pamStart() {
|
|
||||||
clickEventAggregator.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pamStop() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setClickTrainDetector(ClickTrainControl clickTrainControl) {
|
|
||||||
if (this.clickTrainControl != clickTrainControl) {
|
|
||||||
this.clickTrainControl = clickTrainControl;
|
|
||||||
if (clickTrainControl != null) {
|
|
||||||
setParentDataBlock(clickTrainControl.getClssfdClickTrainDataBlock());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see PamguardMVC.PamProcess#setupProcess()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setupProcess() {
|
|
||||||
super.setupProcess();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see PamguardMVC.PamProcess#newData(PamguardMVC.PamObservable, PamguardMVC.PamDataUnit)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void newData(PamObservable o, PamDataUnit arg) {
|
|
||||||
if (arg instanceof DetectionGroupDataUnit) {
|
|
||||||
newClickEvent((DetectionGroupDataUnit) arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see PamguardMVC.PamProcess#updateData(PamguardMVC.PamObservable, PamguardMVC.PamDataUnit)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void updateData(PamObservable o, PamDataUnit arg) {
|
|
||||||
if (arg instanceof DetectionGroupDataUnit) {
|
|
||||||
newClickEvent((DetectionGroupDataUnit) arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void newClickEvent(DetectionGroupDataUnit detectionGroupDataUnit) {
|
|
||||||
aggregateEvent(detectionGroupDataUnit);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bring click events together into larger aggregations to avoid transmitting to0 much stuff
|
|
||||||
* @param detectionGroupDataUnit.
|
|
||||||
*/
|
|
||||||
private void aggregateEvent(DetectionGroupDataUnit detectionGroupDataUnit) {
|
|
||||||
ClickEventAggregate aggregateEvent = clickEventAggregator.aggregateData(detectionGroupDataUnit);
|
|
||||||
if (aggregateEvent == null) {
|
|
||||||
bigBrotherControl.updateClickInformation(null, detectionGroupDataUnit);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (aggregateEvent.getParentDataBlock() == null) {
|
|
||||||
clickAggregateDataBlock.addPamData(aggregateEvent);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
clickAggregateDataBlock.updatePamData(aggregateEvent, aggregateEvent.getLastUpdateTime());
|
|
||||||
}
|
|
||||||
bigBrotherControl.updateClickInformation(aggregateEvent, detectionGroupDataUnit);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getRequiredDataHistory(PamObservable o, Object arg) {
|
|
||||||
return 1000*3600;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JComponent getSwingComponent() {
|
|
||||||
if (clickMonitorComponent == null) {
|
|
||||||
clickMonitorComponent = new ClickMonitorComponent(this);
|
|
||||||
}
|
|
||||||
return clickMonitorComponent.getComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the clickControl
|
|
||||||
*/
|
|
||||||
public ClickTrainControl getClickTrainControl() {
|
|
||||||
return clickTrainControl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the clickEventAggregator
|
|
||||||
*/
|
|
||||||
public SimpleClickEventAggregator getClickEventAggregator() {
|
|
||||||
return clickEventAggregator;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the clickAggregateDataBlock
|
|
||||||
*/
|
|
||||||
public ClickAggregateDataBlock getClickAggregateDataBlock() {
|
|
||||||
return clickAggregateDataBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,155 +0,0 @@
|
|||||||
package alfa.clickmonitor;
|
|
||||||
/*
|
|
||||||
* Adapted from the following by Doug Gillespie. November 2018
|
|
||||||
*
|
|
||||||
* Convex hull algorithm - Library (Java)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2017 Project Nayuki
|
|
||||||
* https://www.nayuki.io/page/convex-hull-algorithm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with this program (see COPYING.txt and COPYING.LESSER.txt).
|
|
||||||
* If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import PamUtils.LatLong;
|
|
||||||
|
|
||||||
|
|
||||||
public final class LatLongHull {
|
|
||||||
|
|
||||||
private static LatLongCamparator latLongCamparator = new LatLongCamparator();
|
|
||||||
|
|
||||||
// Returns a new list of points representing the convex hull of
|
|
||||||
// the given set of points. The convex hull excludes collinear points.
|
|
||||||
// This algorithm runs in O(n log n) time.
|
|
||||||
public static List<LatLong> makeHull(List<LatLong> points) {
|
|
||||||
List<LatLong> newPoints = new ArrayList<>(points);
|
|
||||||
Collections.sort(newPoints, latLongCamparator);
|
|
||||||
return makeHullPresorted(newPoints);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Returns the convex hull, assuming that each points[i] <= points[i + 1]. Runs in O(n) time.
|
|
||||||
public static List<LatLong> makeHullPresorted(List<LatLong> points) {
|
|
||||||
if (points.size() <= 1)
|
|
||||||
return new ArrayList<>(points);
|
|
||||||
|
|
||||||
// Andrew's monotone chain algorithm. Positive y coordinates correspond to "up"
|
|
||||||
// as per the mathematical convention, instead of "down" as per the computer
|
|
||||||
// graphics convention. This doesn't affect the correctness of the result.
|
|
||||||
|
|
||||||
List<LatLong> upperHull = new ArrayList<>();
|
|
||||||
for (LatLong p : points) {
|
|
||||||
while (upperHull.size() >= 2) {
|
|
||||||
LatLong q = upperHull.get(upperHull.size() - 1);
|
|
||||||
LatLong r = upperHull.get(upperHull.size() - 2);
|
|
||||||
if ((q.getLongitude() - r.getLongitude()) * (p.getLatitude() - r.getLatitude()) >=
|
|
||||||
(q.getLatitude() - r.getLatitude()) * (p.getLongitude() - r.getLongitude()))
|
|
||||||
upperHull.remove(upperHull.size() - 1);
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
upperHull.add(p);
|
|
||||||
}
|
|
||||||
upperHull.remove(upperHull.size() - 1);
|
|
||||||
|
|
||||||
List<LatLong> lowerHull = new ArrayList<>();
|
|
||||||
for (int i = points.size() - 1; i >= 0; i--) {
|
|
||||||
LatLong p = points.get(i);
|
|
||||||
while (lowerHull.size() >= 2) {
|
|
||||||
LatLong q = lowerHull.get(lowerHull.size() - 1);
|
|
||||||
LatLong r = lowerHull.get(lowerHull.size() - 2);
|
|
||||||
if ((q.getLongitude() - r.getLongitude()) * (p.getLatitude() - r.getLatitude()) >=
|
|
||||||
(q.getLatitude() - r.getLatitude()) * (p.getLongitude() - r.getLongitude()))
|
|
||||||
lowerHull.remove(lowerHull.size() - 1);
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lowerHull.add(p);
|
|
||||||
}
|
|
||||||
lowerHull.remove(lowerHull.size() - 1);
|
|
||||||
|
|
||||||
if (!(upperHull.size() == 1 && upperHull.equals(lowerHull)))
|
|
||||||
upperHull.addAll(lowerHull);
|
|
||||||
return upperHull;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class LatLongCamparator implements Comparator<LatLong> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compare(LatLong ll1, LatLong ll2) {
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
if (x != other.x)
|
|
||||||
return Double.compare(x, other.x);
|
|
||||||
else
|
|
||||||
return Double.compare(y, other.y);
|
|
||||||
*/
|
|
||||||
if (ll1.getLongitude() != ll2.getLongitude()) {
|
|
||||||
return Double.compare(ll1.getLongitude(), ll2.getLongitude());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return Double.compare(ll1.getLatitude(), ll2.getLatitude());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
final class LatLongPoint implements Comparable<LatLongPoint> {
|
|
||||||
|
|
||||||
public final double x;
|
|
||||||
public final double y;
|
|
||||||
|
|
||||||
|
|
||||||
public LatLongPoint(double x, double y) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String toString() {
|
|
||||||
return String.format("Point(%g, %g)", x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (!(obj instanceof LatLongPoint))
|
|
||||||
return false;
|
|
||||||
else {
|
|
||||||
LatLongPoint other = (LatLongPoint)obj;
|
|
||||||
return x == other.x && y == other.y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public int compareTo(LatLongPoint other) {
|
|
||||||
if (x != other.x)
|
|
||||||
return Double.compare(x, other.x);
|
|
||||||
else
|
|
||||||
return Double.compare(y, other.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,154 +0,0 @@
|
|||||||
package alfa.clickmonitor;
|
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import PamDetection.AbstractLocalisation;
|
|
||||||
import PamDetection.LocContents;
|
|
||||||
import PamUtils.LatLong;
|
|
||||||
import alfa.clickmonitor.eventaggregator.ClickEventAggregate;
|
|
||||||
import alfa.clickmonitor.eventaggregator.EventAggregator;
|
|
||||||
import clickDetector.offlineFuncs.OfflineEventDataUnit;
|
|
||||||
import detectiongrouplocaliser.DetectionGroupDataUnit;
|
|
||||||
|
|
||||||
public class SimpleClickEventAggregator implements EventAggregator<DetectionGroupDataUnit, ClickEventAggregate> {
|
|
||||||
|
|
||||||
private List<ClickEventAggregate> growingList = new LinkedList<>();
|
|
||||||
|
|
||||||
private double minSeparationMetres;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param minSeparationMetres
|
|
||||||
*/
|
|
||||||
public SimpleClickEventAggregator(double minSeparationMetres) {
|
|
||||||
super();
|
|
||||||
this.minSeparationMetres = minSeparationMetres;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ClickEventAggregate aggregateData(DetectionGroupDataUnit detectionGroupDataUnit) {
|
|
||||||
if (wantDataUnit(detectionGroupDataUnit) == false) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
ClickEventAggregate currentAggregate = findInCurrent(detectionGroupDataUnit);
|
|
||||||
if (currentAggregate != null) {
|
|
||||||
/**
|
|
||||||
* Data is already part of an aggregate event, so no need to do anything at all.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/*
|
|
||||||
* Try to match into existing developing aggregations.
|
|
||||||
*/
|
|
||||||
currentAggregate = matchToAggregate(detectionGroupDataUnit);
|
|
||||||
if (currentAggregate != null) {
|
|
||||||
currentAggregate.addSubDetection(detectionGroupDataUnit);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (currentAggregate == null) {
|
|
||||||
currentAggregate = new ClickEventAggregate(detectionGroupDataUnit);
|
|
||||||
growingList.add(currentAggregate);
|
|
||||||
}
|
|
||||||
|
|
||||||
currentAggregate.setLastUpdateTime(detectionGroupDataUnit.getLastUpdateTime());
|
|
||||||
|
|
||||||
if (wantAggregate(currentAggregate)) {
|
|
||||||
return currentAggregate;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean wantAggregate(ClickEventAggregate currentAggregate) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ClickEventAggregate matchToAggregate(DetectionGroupDataUnit detectionGroupDataUnit) {
|
|
||||||
ClickEventAggregate bestAggregate = null;
|
|
||||||
double bestRange = Double.MAX_VALUE;
|
|
||||||
Iterator<ClickEventAggregate> it = growingList.iterator();
|
|
||||||
while (it.hasNext()) {
|
|
||||||
ClickEventAggregate agg = it.next();
|
|
||||||
Double d = minRangeToAggregate(detectionGroupDataUnit, agg);
|
|
||||||
if (d == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (d < bestRange) {
|
|
||||||
bestRange = d;
|
|
||||||
bestAggregate = agg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (bestRange < minSeparationMetres) {
|
|
||||||
return bestAggregate;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Double minRangeToAggregate(DetectionGroupDataUnit detectionGroupDataUnit, ClickEventAggregate agg) {
|
|
||||||
AbstractLocalisation dLoc = detectionGroupDataUnit.getLocalisation();
|
|
||||||
if (dLoc == null || dLoc.hasLocContent(LocContents.HAS_LATLONG) == false) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
int nLL = dLoc.getAmbiguityCount();
|
|
||||||
double closestOther = Double.MAX_VALUE;
|
|
||||||
int nSub = agg.getSubDetectionsCount();
|
|
||||||
for (int i = 0; i < nSub; i++) {
|
|
||||||
AbstractLocalisation aggLoc = agg.getSubDetection(i).getLocalisation();
|
|
||||||
int nALL = aggLoc.getAmbiguityCount();
|
|
||||||
for (int is = 0; is < Math.min(nLL,nALL); is++) {
|
|
||||||
LatLong uLL = dLoc.getLatLong(is);
|
|
||||||
LatLong aLL = aggLoc.getLatLong(is);
|
|
||||||
if (aLL == null || uLL == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
double d = aLL.distanceToMetres(uLL);
|
|
||||||
closestOther = Math.min(closestOther, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return closestOther;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Do we want this data unit ?
|
|
||||||
* Only if it's got a lat long already.
|
|
||||||
* @param detectionGroupDataUnit
|
|
||||||
* @return true if we want to use this in the aggregator.
|
|
||||||
*/
|
|
||||||
private boolean wantDataUnit(DetectionGroupDataUnit detectionGroupDataUnit) {
|
|
||||||
AbstractLocalisation localisation = detectionGroupDataUnit.getLocalisation();
|
|
||||||
if (localisation == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (localisation.getLocContents().hasLocContent(LocContents.HAS_LATLONG)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find the current data unit in any of the currently growing aggregate lists.
|
|
||||||
* @param dataUnit
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private ClickEventAggregate findInCurrent(DetectionGroupDataUnit dataUnit) {
|
|
||||||
synchronized (growingList) {
|
|
||||||
Iterator<ClickEventAggregate> it = growingList.iterator();
|
|
||||||
while (it.hasNext()) {
|
|
||||||
ClickEventAggregate agg = it.next();
|
|
||||||
int foundUnit = agg.findSubdetectionInfo(dataUnit);
|
|
||||||
if (foundUnit >= 0) {
|
|
||||||
return agg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reset() {
|
|
||||||
growingList.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
package alfa.clickmonitor.eventaggregator;
|
|
||||||
|
|
||||||
import PamguardMVC.DataUnitBaseData;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import PamguardMVC.superdet.SuperDetection;;
|
|
||||||
|
|
||||||
public abstract class AggregateDataUnit<T extends PamDataUnit> extends SuperDetection<T> {
|
|
||||||
|
|
||||||
public AggregateDataUnit(DataUnitBaseData basicData) {
|
|
||||||
super(basicData);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param timeMilliseconds
|
|
||||||
*/
|
|
||||||
public AggregateDataUnit(long timeMilliseconds, T firstSubDetection) {
|
|
||||||
super(timeMilliseconds);
|
|
||||||
if (firstSubDetection != null) {
|
|
||||||
setChannelBitmap(firstSubDetection.getChannelBitmap());
|
|
||||||
addSubDetection(firstSubDetection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,108 +0,0 @@
|
|||||||
package alfa.clickmonitor.eventaggregator;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.commons.math3.geometry.euclidean.twod.Vector2D;
|
|
||||||
import org.apache.commons.math3.geometry.euclidean.twod.hull.ConvexHull2D;
|
|
||||||
|
|
||||||
import com.sun.javafx.geom.Area;
|
|
||||||
import com.sun.javafx.geom.PathIterator;
|
|
||||||
import com.sun.javafx.geom.Rectangle;
|
|
||||||
import com.sun.javafx.geom.Shape;
|
|
||||||
|
|
||||||
import PamDetection.AbstractLocalisation;
|
|
||||||
import PamDetection.LocContents;
|
|
||||||
import PamUtils.LatLong;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import alfa.clickmonitor.LatLongHull;
|
|
||||||
import javafx.geometry.Rectangle2D;
|
|
||||||
import pamMaths.PamVector;
|
|
||||||
|
|
||||||
public class AggregateLocalisation extends AbstractLocalisation {
|
|
||||||
|
|
||||||
private AggLatLong[] sideLatLongs = new AggLatLong[2];
|
|
||||||
|
|
||||||
public AggregateLocalisation(PamDataUnit pamDataUnit) {
|
|
||||||
super(pamDataUnit, LocContents.HAS_LATLONG, pamDataUnit.getChannelBitmap());
|
|
||||||
addLocalisation(pamDataUnit.getLocalisation());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addLocalisation(AbstractLocalisation localisation) {
|
|
||||||
if (localisation == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int nLL = localisation.getAmbiguityCount();
|
|
||||||
for (int i = 0; i < nLL; i++) {
|
|
||||||
LatLong latLong = localisation.getLatLong(i);
|
|
||||||
if (latLong != null) {
|
|
||||||
if (sideLatLongs[i] == null) {
|
|
||||||
sideLatLongs[i] = new AggLatLong(latLong);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sideLatLongs[i].add(latLong);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class AggLatLong {
|
|
||||||
|
|
||||||
private ArrayList<LatLong> latLongList = new ArrayList<>();
|
|
||||||
|
|
||||||
public AggLatLong(LatLong latLong) {
|
|
||||||
latLongList.add(latLong);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void add(LatLong latLong) {
|
|
||||||
latLongList.add(latLong);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Rectangle2D getOuterRectangle() {
|
|
||||||
if (latLongList.size() == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
double minX, maxX, minY, maxY;
|
|
||||||
minX = maxX = latLongList.get(0).getLongitude();
|
|
||||||
minY = maxY = latLongList.get(0).getLatitude();
|
|
||||||
for (int i = 0; i < latLongList.size(); i++) {
|
|
||||||
LatLong ll = latLongList.get(i);
|
|
||||||
minX = Math.min(minX, ll.getLongitude());
|
|
||||||
maxX = Math.max(maxX, ll.getLongitude());
|
|
||||||
minY = Math.min(minY, ll.getLatitude());
|
|
||||||
maxY = Math.max(maxY, ll.getLatitude());
|
|
||||||
}
|
|
||||||
return new Rectangle2D(minX, minY, maxX-minX, maxY-minY);
|
|
||||||
}
|
|
||||||
|
|
||||||
// public ConvexHull2D getOuterHull() {
|
|
||||||
// if (latLongList.size() == 0) {
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// Vector2D[] v2ds = new Vector2D[latLongList.size()];
|
|
||||||
// for (int i = 0; i < latLongList.size(); i++) {
|
|
||||||
// LatLong ll = latLongList.get(i);
|
|
||||||
// v2ds[i] = new Vector2D(ll.getLongitude(), ll.getLatitude());
|
|
||||||
// }
|
|
||||||
// try {
|
|
||||||
// ConvexHull2D ch2d = new ConvexHull2D(v2ds, 0);
|
|
||||||
// return ch2d;
|
|
||||||
// }
|
|
||||||
// catch (Exception e) {
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
public List<LatLong> getOuterHull() {
|
|
||||||
return LatLongHull.makeHull(latLongList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the sideLatLongs
|
|
||||||
*/
|
|
||||||
public AggLatLong[] getSideLatLongs() {
|
|
||||||
return sideLatLongs;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package alfa.clickmonitor.eventaggregator;
|
|
||||||
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import PamguardMVC.PamProcess;
|
|
||||||
import clickDetector.offlineFuncs.OfflineClickLogging;
|
|
||||||
import clickDetector.offlineFuncs.OfflineEventDataUnit;
|
|
||||||
|
|
||||||
public class ClickAggregateDataBlock extends PamDataBlock<ClickEventAggregate> {
|
|
||||||
|
|
||||||
public ClickAggregateDataBlock(String dataName, PamProcess parentProcess, int channelMap) {
|
|
||||||
super(ClickEventAggregate.class, dataName, parentProcess, channelMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
package alfa.clickmonitor.eventaggregator;
|
|
||||||
|
|
||||||
import PamguardMVC.DataUnitBaseData;
|
|
||||||
import detectiongrouplocaliser.DetectionGroupDataUnit;
|
|
||||||
|
|
||||||
public class ClickEventAggregate extends AggregateDataUnit<DetectionGroupDataUnit> {
|
|
||||||
|
|
||||||
public ClickEventAggregate(DataUnitBaseData basicData) {
|
|
||||||
super(basicData);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ClickEventAggregate(long timeMilliseconds, DetectionGroupDataUnit firstSubDetection) {
|
|
||||||
super(timeMilliseconds, firstSubDetection);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ClickEventAggregate(DetectionGroupDataUnit dataUnit) {
|
|
||||||
this(dataUnit.getTimeMilliseconds(), dataUnit);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package alfa.clickmonitor.eventaggregator;
|
|
||||||
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
|
|
||||||
public interface EventAggregator<T extends PamDataUnit, U extends AggregateDataUnit<T>> {
|
|
||||||
|
|
||||||
public U aggregateData(T dataUnit);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call when PAMguard starts.
|
|
||||||
*/
|
|
||||||
public void reset();
|
|
||||||
|
|
||||||
}
|
|
@ -1,95 +0,0 @@
|
|||||||
package alfa.clickmonitor.swing;
|
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Graphics;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.Rectangle;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.commons.math3.geometry.euclidean.twod.Vector2D;
|
|
||||||
import org.apache.commons.math3.geometry.euclidean.twod.hull.ConvexHull2D;
|
|
||||||
|
|
||||||
import PamUtils.Coordinate3d;
|
|
||||||
import PamUtils.LatLong;
|
|
||||||
import PamView.GeneralProjector;
|
|
||||||
import PamView.PamDetectionOverlayGraphics;
|
|
||||||
import PamView.PamSymbol;
|
|
||||||
import PamView.PamSymbolType;
|
|
||||||
import PamView.GeneralProjector.ParameterType;
|
|
||||||
import PamView.GeneralProjector.ParameterUnits;
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import alfa.clickmonitor.eventaggregator.AggregateLocalisation;
|
|
||||||
import alfa.clickmonitor.eventaggregator.ClickEventAggregate;
|
|
||||||
import alfa.clickmonitor.eventaggregator.AggregateLocalisation.AggLatLong;
|
|
||||||
|
|
||||||
public class ClickAggregatOverlayGraphics extends PamDetectionOverlayGraphics {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default symbol for click aggregate overalays
|
|
||||||
*/
|
|
||||||
private static PamSymbol defaultSymbol = new PamSymbol(PamSymbolType.SYMBOL_CIRCLE, 9, 9, true, Color.BLACK, Color.RED);
|
|
||||||
|
|
||||||
|
|
||||||
public ClickAggregatOverlayGraphics(PamDataBlock parentDataBlock) {
|
|
||||||
super(parentDataBlock, defaultSymbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see PamView.PamDetectionOverlayGraphics#canDraw(PamView.GeneralProjector)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean canDraw(ParameterType[] parameterTypes, ParameterUnits[] parameterUnits) {
|
|
||||||
if (parameterTypes[0] == ParameterType.LATITUDE
|
|
||||||
&& parameterTypes[1] == ParameterType.LONGITUDE) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see PamView.PamDetectionOverlayGraphics#drawOnMap(java.awt.Graphics, PamguardMVC.PamDataUnit, PamView.GeneralProjector)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected Rectangle drawOnMap(Graphics g, PamDataUnit pamDetection, GeneralProjector generalProjector) {
|
|
||||||
ClickEventAggregate agg = (ClickEventAggregate) pamDetection;
|
|
||||||
if (agg.getSubDetectionsCount() < 3) {
|
|
||||||
return null;
|
|
||||||
// return super.drawOnMap(g, pamDetection, generalProjector);
|
|
||||||
}
|
|
||||||
Graphics2D g2d = (Graphics2D) g;
|
|
||||||
/*
|
|
||||||
* need to make a complex hull for each side and try to draw them.
|
|
||||||
* Started coding a localisation - but probably don't want it as such.
|
|
||||||
*/
|
|
||||||
AggregateLocalisation aggLoc = new AggregateLocalisation(agg.getSubDetection(0));
|
|
||||||
for (int i = 1; i < agg.getSubDetectionsCount(); i++) {
|
|
||||||
aggLoc.addLocalisation(agg.getSubDetection(i).getLocalisation());
|
|
||||||
}
|
|
||||||
AggLatLong[] aggShapes = aggLoc.getSideLatLongs();
|
|
||||||
PamSymbol symbol = getPamSymbol(pamDetection, generalProjector);
|
|
||||||
for (int i = 0; i < Math.min(1, aggShapes.length); i++) {
|
|
||||||
AggLatLong all = aggShapes[i];
|
|
||||||
if (all == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
List<LatLong> outline = all.getOuterHull();
|
|
||||||
int[] xPoints = new int[outline.size()];
|
|
||||||
int[] yPoints = new int[outline.size()];
|
|
||||||
for (int p = 0; p < outline.size(); p++) {
|
|
||||||
LatLong ll = outline.get(p);
|
|
||||||
Coordinate3d pt3 = generalProjector.getCoord3d(ll.getLatitude(), ll.getLongitude(), 0);
|
|
||||||
xPoints[p] = (int) pt3.x;
|
|
||||||
yPoints[p] = (int) pt3.y;
|
|
||||||
}
|
|
||||||
g.setColor(symbol.getLineColor());
|
|
||||||
g.drawPolygon(xPoints, yPoints, yPoints.length);
|
|
||||||
Color fillCol = new Color(0.2f, .2f, 0.2f, 0.5f);//.getFillColor()
|
|
||||||
g.setColor(fillCol);
|
|
||||||
g2d.fillPolygon(xPoints, yPoints, yPoints.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
package alfa.clickmonitor.swing;
|
|
||||||
|
|
||||||
import PamUtils.PamCalendar;
|
|
||||||
import PamView.component.DataBlockTableView;
|
|
||||||
import alfa.clickmonitor.ClickMonitorProcess;
|
|
||||||
import alfa.clickmonitor.eventaggregator.ClickEventAggregate;
|
|
||||||
|
|
||||||
public class ClickAggregateTable extends DataBlockTableView<ClickEventAggregate>{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Seem to have to make this static so it get's made before the super class
|
|
||||||
* constructor is called, otherwise the calls to getColumnNames will return
|
|
||||||
* null on the first couple of calls while the table is being constructed
|
|
||||||
* and will mess everything up.
|
|
||||||
*/
|
|
||||||
private String[] colNames = {"UID", "Date Time", "N", "TX"};
|
|
||||||
|
|
||||||
public ClickAggregateTable(ClickMonitorProcess clickMonitorProcess) {
|
|
||||||
super(clickMonitorProcess.getClickAggregateDataBlock(), clickMonitorProcess.getProcessName() + " Data table");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] getColumnNames() {
|
|
||||||
return colNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getColumnData(ClickEventAggregate dataUnit, int columnIndex) {
|
|
||||||
if (dataUnit == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
switch (columnIndex) {
|
|
||||||
case 0:
|
|
||||||
return dataUnit.getUID();
|
|
||||||
case 1:
|
|
||||||
return PamCalendar.formatTodaysTime(dataUnit.getTimeMilliseconds());
|
|
||||||
case 2:
|
|
||||||
return dataUnit.getSubDetectionsCount();
|
|
||||||
case 3:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
package alfa.clickmonitor.swing;
|
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.border.TitledBorder;
|
|
||||||
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
import alfa.clickmonitor.ClickMonitorProcess;
|
|
||||||
|
|
||||||
public class ClickMonitorComponent {
|
|
||||||
|
|
||||||
private ClickMonitorProcess clickMonitorProcess;
|
|
||||||
|
|
||||||
private PamPanel mainPanel;
|
|
||||||
|
|
||||||
private ClickAggregateTable clickAggregateTable;
|
|
||||||
|
|
||||||
public ClickMonitorComponent(ClickMonitorProcess clickMonitorProcess) {
|
|
||||||
this.clickMonitorProcess = clickMonitorProcess;
|
|
||||||
clickAggregateTable = new ClickAggregateTable(clickMonitorProcess);
|
|
||||||
mainPanel = new PamPanel(new BorderLayout());
|
|
||||||
mainPanel.setBorder(new TitledBorder("Sperm whale detection results"));
|
|
||||||
mainPanel.add(clickAggregateTable.getComponent(), BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
|
|
||||||
public JComponent getComponent() {
|
|
||||||
return mainPanel;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,63 +0,0 @@
|
|||||||
package alfa.comms;
|
|
||||||
|
|
||||||
import PamguardMVC.DataUnitBaseData;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract data unit class that will be used by anything that's going to produce
|
|
||||||
* data that will ultimately get sent through the messaging interface.
|
|
||||||
* @author dg50
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
abstract public class ALFACommsDataUnit extends PamDataUnit {
|
|
||||||
|
|
||||||
private boolean readyToSend;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param basicData
|
|
||||||
*/
|
|
||||||
public ALFACommsDataUnit(DataUnitBaseData basicData) {
|
|
||||||
super(basicData);
|
|
||||||
// TODO Auto-generated constructor stub
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param timeMilliseconds
|
|
||||||
* @param channelBitmap
|
|
||||||
* @param startSample
|
|
||||||
* @param durationSamples
|
|
||||||
*/
|
|
||||||
public ALFACommsDataUnit(long timeMilliseconds, int channelBitmap, long startSample, long durationSamples) {
|
|
||||||
super(timeMilliseconds, channelBitmap, startSample, durationSamples);
|
|
||||||
// TODO Auto-generated constructor stub
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param timeMilliseconds
|
|
||||||
*/
|
|
||||||
public ALFACommsDataUnit(long timeMilliseconds) {
|
|
||||||
super(timeMilliseconds);
|
|
||||||
// TODO Auto-generated constructor stub
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return A summary String to send via satellite.
|
|
||||||
*/
|
|
||||||
abstract public String getCommsString();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the readyToSend
|
|
||||||
*/
|
|
||||||
public boolean isReadyToSend() {
|
|
||||||
return readyToSend;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param readyToSend the readyToSend to set
|
|
||||||
*/
|
|
||||||
public void setReadyToSend(boolean readyToSend) {
|
|
||||||
this.readyToSend = readyToSend;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,91 +0,0 @@
|
|||||||
package alfa.comms;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import PamguardMVC.PamObservable;
|
|
||||||
import PamguardMVC.PamProcess;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import alfa.swinggui.SwingMessagePanel;
|
|
||||||
import rockBlock.RockBlockControl;
|
|
||||||
|
|
||||||
public class MessageProcess extends PamProcess {
|
|
||||||
|
|
||||||
private RockBlockControl rockBlockControl;
|
|
||||||
|
|
||||||
public MessageProcess(ALFAControl alfaControl) {
|
|
||||||
super(alfaControl, null);
|
|
||||||
setParentDataBlock(alfaControl.getEffortMonitor().getIntervalDataBlock());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pamStart() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pamStop() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void newData(PamObservable o, PamDataUnit arg) {
|
|
||||||
updateData(o, arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateData(PamObservable o, PamDataUnit arg) {
|
|
||||||
if (arg instanceof ALFACommsDataUnit) {
|
|
||||||
newALFAComms((ALFACommsDataUnit) arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void newALFAComms(ALFACommsDataUnit alfaCommsDataUnit) {
|
|
||||||
if (alfaCommsDataUnit.isReadyToSend() == false) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (rockBlockControl == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String txt = alfaCommsDataUnit.getCommsString();
|
|
||||||
System.out.println(txt);
|
|
||||||
rockBlockControl.sendText(txt);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void notifyModelChanged(int changeType) {
|
|
||||||
super.notifyModelChanged(changeType);
|
|
||||||
switch (changeType) {
|
|
||||||
case PamController.INITIALIZATION_COMPLETE:
|
|
||||||
case PamController.ADD_CONTROLLEDUNIT:
|
|
||||||
case PamController.REMOVE_CONTROLLEDUNIT:
|
|
||||||
if (PamController.getInstance().isInitializationComplete()) {
|
|
||||||
findRockBlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RockBlockControl findRockBlock() {
|
|
||||||
if (rockBlockControl == null) {
|
|
||||||
rockBlockControl = (RockBlockControl) PamController.getInstance().findControlledUnit(RockBlockControl.class, null);
|
|
||||||
}
|
|
||||||
return rockBlockControl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a panel with tables for incoming and outgoing messages
|
|
||||||
* @param showWhat 1 = outgoing, 2 = incoming 3 = both
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public JComponent getSwingCommsPanel(int showWhat) {
|
|
||||||
SwingMessagePanel swingMessagePanel = new SwingMessagePanel(this, showWhat);
|
|
||||||
return swingMessagePanel.getComponent();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
package alfa.effortmonitor;
|
|
||||||
|
|
||||||
import pamMaths.PamHistogram;
|
|
||||||
|
|
||||||
public class AngleHistogram extends PamHistogram implements Cloneable {
|
|
||||||
|
|
||||||
private long startTime;
|
|
||||||
|
|
||||||
public AngleHistogram(long startTime, double minVal, double maxVal, int nBins) {
|
|
||||||
super(minVal, maxVal, nBins);
|
|
||||||
this.startTime = startTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the startTime
|
|
||||||
*/
|
|
||||||
public long getStartTime() {
|
|
||||||
return startTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param startTime the startTime to set
|
|
||||||
*/
|
|
||||||
public void setStartTime(long startTime) {
|
|
||||||
this.startTime = startTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected AngleHistogram clone() {
|
|
||||||
AngleHistogram angleHist = (AngleHistogram) super.clone();
|
|
||||||
return angleHist;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,388 +0,0 @@
|
|||||||
package alfa.effortmonitor;
|
|
||||||
|
|
||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.ListIterator;
|
|
||||||
|
|
||||||
import javax.swing.Timer;
|
|
||||||
|
|
||||||
import GPS.GPSControl;
|
|
||||||
import GPS.GPSDataBlock;
|
|
||||||
import GPS.GpsData;
|
|
||||||
import GPS.GpsDataUnit;
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamController.status.ModuleStatus;
|
|
||||||
import PamDetection.AbstractLocalisation;
|
|
||||||
import PamUtils.PamCalendar;
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import PamguardMVC.PamProcess;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import alfa.ALFAParameters;
|
|
||||||
import alfa.clickmonitor.eventaggregator.ClickEventAggregate;
|
|
||||||
import alfa.server.ServerIntervalDataBlock;
|
|
||||||
import alfa.swinggui.IntervalOverlayDraw;
|
|
||||||
import clickDetector.ClickTrainDetector;
|
|
||||||
import detectiongrouplocaliser.DetectionGroupDataUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Monitors incoming data from the click train detector, summarises angles into a histogram, monitors
|
|
||||||
* total effort within an interval (usually around an hour), keeps summary of the GPS track lines and handles
|
|
||||||
* making summary satellite messgaes.
|
|
||||||
*
|
|
||||||
* @author Doug Gillespie
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class EffortMonitor extends PamProcess {
|
|
||||||
|
|
||||||
private GPSDataBlock gpsDataBlock;
|
|
||||||
|
|
||||||
private ClickTrainDetector clickTrainDetector;
|
|
||||||
|
|
||||||
private Timer effortTimer;
|
|
||||||
|
|
||||||
private IntervalDataBlock intervalDataBlock;
|
|
||||||
|
|
||||||
private ServerIntervalDataBlock serverIntervalData;
|
|
||||||
|
|
||||||
private IntervalDataLogging intervalLogging;
|
|
||||||
|
|
||||||
private long effortStartTime;
|
|
||||||
|
|
||||||
private long timerStartTime;
|
|
||||||
|
|
||||||
private ALFAControl alfaControl;
|
|
||||||
|
|
||||||
private AngleHistogram currentHistogram, prevHistogram;
|
|
||||||
|
|
||||||
private IntervalDataUnit currentDataUnit;
|
|
||||||
|
|
||||||
|
|
||||||
public EffortMonitor(ALFAControl alfaControl) {
|
|
||||||
super(alfaControl, null, "Effort Monitor");
|
|
||||||
this.alfaControl = alfaControl;
|
|
||||||
effortTimer = new Timer(2000, new ActionListener() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
timerAction();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
intervalDataBlock = new IntervalDataBlock(this, "ALFA Track Summary");
|
|
||||||
intervalDataBlock.SetLogging(intervalLogging = new IntervalDataLogging(intervalDataBlock));
|
|
||||||
intervalDataBlock.setOverlayDraw(new IntervalOverlayDraw(alfaControl));
|
|
||||||
addOutputDataBlock(intervalDataBlock);
|
|
||||||
|
|
||||||
if (alfaControl.isViewer()) {
|
|
||||||
serverIntervalData = new ServerIntervalDataBlock(this, "ALFA Server Data");
|
|
||||||
serverIntervalData.setOverlayDraw(new IntervalOverlayDraw(alfaControl));
|
|
||||||
// serverIntervalData.SetLogging(new ALFAServerLoader(serverIntervalData));
|
|
||||||
addOutputDataBlock(serverIntervalData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see PamguardMVC.PamProcess#notifyModelChanged(int)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void notifyModelChanged(int changeType) {
|
|
||||||
super.notifyModelChanged(changeType);
|
|
||||||
switch (changeType) {
|
|
||||||
case PamController.INITIALIZATION_COMPLETE:
|
|
||||||
loadOldData();
|
|
||||||
case PamController.ADD_CONTROLLEDUNIT:
|
|
||||||
case PamController.REMOVE_CONTROLLEDUNIT:
|
|
||||||
findGpsDataBlock();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void timerAction() {
|
|
||||||
long now = PamCalendar.getTimeInMillis();
|
|
||||||
long newEffort = now-timerStartTime;
|
|
||||||
currentDataUnit.addActualEffort(newEffort);
|
|
||||||
currentDataUnit.setDurationInMilliseconds(now-currentDataUnit.getTimeMilliseconds());
|
|
||||||
GpsData gpsData = getLatestGPS();
|
|
||||||
if (gpsData != null) {
|
|
||||||
currentDataUnit.setLastGPSData(gpsData);
|
|
||||||
}
|
|
||||||
if (readyToSend(currentDataUnit)) {
|
|
||||||
currentDataUnit.setReadyToSend(true);
|
|
||||||
intervalDataBlock.updatePamData(currentDataUnit, now);
|
|
||||||
currentDataUnit = createNewData(now);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
checkAngleHistogram(now);
|
|
||||||
}
|
|
||||||
timerStartTime = now;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void checkAngleHistogram(long now) {
|
|
||||||
if (currentHistogram == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ALFAParameters params = alfaControl.getAlfaParameters();
|
|
||||||
long histoInterval = params.effortMsgIntervalNoWhales / Math.max(params.histosPerReportInterval,1);
|
|
||||||
histoInterval = Math.max(120, histoInterval);
|
|
||||||
long histoEndTime = currentHistogram.getStartTime() + histoInterval * 1000;
|
|
||||||
if (now >= histoEndTime) {
|
|
||||||
currentHistogram = makeAngleHistogram(now);
|
|
||||||
currentDataUnit.addAngleHistogram(currentHistogram);
|
|
||||||
intervalDataBlock.updatePamData(currentDataUnit, now);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private boolean endDataUnit(IntervalDataUnit intervalDataUnit, long timeMilliseconds) {
|
|
||||||
if (intervalDataUnit == null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return intervalDataUnit.getTimeMilliseconds() + alfaControl.getAlfaParameters().effortMsgIntervalNoWhales*1000 < timeMilliseconds;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Called on initialisation complete to reload old data.
|
|
||||||
*/
|
|
||||||
private void loadOldData() {
|
|
||||||
if (alfaControl.getAlfaParameters().reloadOldReports) {
|
|
||||||
intervalLogging.loadDataFrom(PamCalendar.getTimeInMillis() - 2*1000*alfaControl.getAlfaParameters().effortMsgIntervalNoWhales);
|
|
||||||
currentDataUnit = intervalDataBlock.getLastUnit();
|
|
||||||
if (currentDataUnit != null) {
|
|
||||||
currentHistogram = currentDataUnit.getLastHistrogram();
|
|
||||||
}
|
|
||||||
// if (currentDataUnit != null && currentDataUnit.getTimeMilliseconds() < PamCa)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// *
|
|
||||||
// * @return the current latest data unit, or create one.
|
|
||||||
// */
|
|
||||||
// private IntervalDataUnit findDataUnit(long currentTime) {
|
|
||||||
// IntervalDataUnit dataunit = intervalDataBlock.getLastUnit();
|
|
||||||
// if (dataunit == null) {
|
|
||||||
// dataunit = createNewData(currentTime);
|
|
||||||
// }
|
|
||||||
// if (currentHistogram == null) {
|
|
||||||
// currentHistogram = makeAngleHistogram(currentTime);
|
|
||||||
// dataunit.addAngleHistogram(currentHistogram);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return dataunit;
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new data unit, add current GPS data and
|
|
||||||
* add it to the data block. Also add it's first angle histogram.
|
|
||||||
* @param timeMilliseconds
|
|
||||||
* @return data unit
|
|
||||||
*/
|
|
||||||
private IntervalDataUnit createNewData(long timeMilliseconds) {
|
|
||||||
IntervalDataUnit dataUnit = new IntervalDataUnit(timeMilliseconds, getLatestGPS());
|
|
||||||
currentHistogram = makeAngleHistogram(timeMilliseconds);
|
|
||||||
dataUnit.addAngleHistogram(currentHistogram);
|
|
||||||
intervalDataBlock.addPamData(dataUnit);
|
|
||||||
|
|
||||||
return dataUnit;
|
|
||||||
}
|
|
||||||
|
|
||||||
private AngleHistogram makeAngleHistogram(long timeMilliseconds) {
|
|
||||||
prevHistogram = currentHistogram;
|
|
||||||
return new AngleHistogram(timeMilliseconds, 0, Math.PI, alfaControl.getAlfaParameters().getBinsPerhistogram());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pamStart() {
|
|
||||||
if (alfaControl.getAlfaParameters().reloadOldReports == false) {
|
|
||||||
intervalDataBlock.clearAll();
|
|
||||||
}
|
|
||||||
effortTimer.start();
|
|
||||||
timerStartTime = effortStartTime = PamCalendar.getTimeInMillis();
|
|
||||||
if (currentDataUnit != null && endDataUnit(currentDataUnit, effortStartTime)) {
|
|
||||||
currentDataUnit = null;
|
|
||||||
}
|
|
||||||
if (currentDataUnit == null) {
|
|
||||||
currentDataUnit = createNewData(effortStartTime);
|
|
||||||
}
|
|
||||||
if (currentHistogram == null) {
|
|
||||||
currentHistogram = makeAngleHistogram(effortStartTime);
|
|
||||||
currentDataUnit.addAngleHistogram(currentHistogram);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pamStop() {
|
|
||||||
effortTimer.stop();
|
|
||||||
// timerAction();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See if it's time to send the current data unit.
|
|
||||||
* @param dataUnit data unit
|
|
||||||
* @return true if it's time to send it.
|
|
||||||
*/
|
|
||||||
private boolean readyToSend(IntervalDataUnit dataUnit) {
|
|
||||||
if (dataUnit == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
double durationSecs = dataUnit.getDurationInMilliseconds() / 1000.;
|
|
||||||
ALFAParameters params = alfaControl.getAlfaParameters();
|
|
||||||
return durationSecs >= params.effortMsgIntervalNoWhales;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return the latest GPS data
|
|
||||||
*/
|
|
||||||
private GpsData getLatestGPS() {
|
|
||||||
if (gpsDataBlock == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
GpsDataUnit lastGPSUnit = gpsDataBlock.getLastUnit();
|
|
||||||
if (lastGPSUnit == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return lastGPSUnit.getGpsData();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean findGpsDataBlock() {
|
|
||||||
GPSControl gpsControl = GPSControl.getGpsControl();
|
|
||||||
if (gpsControl == null) {
|
|
||||||
gpsDataBlock = null;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
gpsDataBlock = gpsControl.getGpsDataBlock();
|
|
||||||
}
|
|
||||||
setParentDataBlock(gpsDataBlock);
|
|
||||||
return gpsDataBlock != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the intervalDataBlock
|
|
||||||
*/
|
|
||||||
public IntervalDataBlock getIntervalDataBlock() {
|
|
||||||
return intervalDataBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update the click historgram information.
|
|
||||||
* @param aggregateEvent - the event.
|
|
||||||
* @param detectionGroupDataUnit - the detection group data unit.
|
|
||||||
*/
|
|
||||||
public void updateClickInformation(ClickEventAggregate aggregateEvent,
|
|
||||||
DetectionGroupDataUnit detectionGroupDataUnit) {
|
|
||||||
currentDataUnit.addClickTrain(detectionGroupDataUnit);
|
|
||||||
double medAngle = getMedianAngle(detectionGroupDataUnit);
|
|
||||||
|
|
||||||
if (this.alfaControl.getAlfaParameters().useClkTrains) {
|
|
||||||
currentHistogram.addData(medAngle);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (int i=0; i<detectionGroupDataUnit.getSubDetectionsCount(); i++) {
|
|
||||||
if (detectionGroupDataUnit.getSubDetection(i).getLocalisation()!=null) {
|
|
||||||
currentHistogram.addData(Math.abs(detectionGroupDataUnit.getSubDetection(i).getLocalisation().getAngles()[0]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the median angle from the detectionGroupDataUnit.
|
|
||||||
* @param detectionGroupDataUnit
|
|
||||||
* @return median angle in radians.
|
|
||||||
*/
|
|
||||||
public double getMedianAngle(DetectionGroupDataUnit detectionGroupDataUnit) {
|
|
||||||
int nSub = detectionGroupDataUnit.getSubDetectionsCount();
|
|
||||||
if (nSub<=0) return Double.NaN;
|
|
||||||
int nLoc = 0;
|
|
||||||
double[] angleList = new double[nSub];
|
|
||||||
for (int i =0; i < nSub; i++) {
|
|
||||||
PamDataUnit subDet = detectionGroupDataUnit.getSubDetection(i);
|
|
||||||
if (subDet == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
AbstractLocalisation subLoc = subDet.getLocalisation();
|
|
||||||
if (subLoc == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
double[] angles = subLoc.getAngles();
|
|
||||||
if (angles == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
angleList[nLoc++] = Math.abs(angles[0]);
|
|
||||||
}
|
|
||||||
if (nLoc < nSub) {
|
|
||||||
angleList = Arrays.copyOf(angleList, nLoc);
|
|
||||||
}
|
|
||||||
Arrays.sort(angleList);
|
|
||||||
int medInd = nLoc/2;
|
|
||||||
|
|
||||||
if (angleList.length==0) return Double.NaN;
|
|
||||||
|
|
||||||
return angleList[medInd];
|
|
||||||
}
|
|
||||||
|
|
||||||
public ModuleStatus getWhaleStatus() {
|
|
||||||
long timeSpan = 15*60*1000;
|
|
||||||
int nWhales;
|
|
||||||
synchronized (intervalDataBlock.getSynchLock()) {
|
|
||||||
ListIterator<IntervalDataUnit> intIt = intervalDataBlock.getListIterator(PamDataBlock.ITERATOR_END);
|
|
||||||
}
|
|
||||||
if (currentHistogram == null) {
|
|
||||||
return new ModuleStatus(ModuleStatus.STATUS_WARNING, "No data");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
double n = currentHistogram.getTotalContent();
|
|
||||||
if (n == 0) {
|
|
||||||
return new ModuleStatus(ModuleStatus.STATUS_OK, "No Whales");
|
|
||||||
}
|
|
||||||
else if (n == 1) {
|
|
||||||
return new ModuleStatus(ModuleStatus.STATUS_WARNING, "One whale detection");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return new ModuleStatus(ModuleStatus.STATUS_ERROR, String.format("%d whales detected", (int) n));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setupProcess() {
|
|
||||||
super.setupProcess();
|
|
||||||
intervalLogging.checkHistogramColumns(alfaControl.getAlfaParameters().histosPerReportInterval);
|
|
||||||
if (serverIntervalData != null) {
|
|
||||||
serverIntervalData.getAlfaServerLoader().runAutoUpdates(alfaControl.getAlfaParameters().followOffline);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a slightly averaged angle histogram for status display.
|
|
||||||
* @return averaged angle histogram.
|
|
||||||
*/
|
|
||||||
public AngleHistogram getAveragedAngleHistogram() {
|
|
||||||
if (currentHistogram == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
AngleHistogram angleHist = currentHistogram.clone();
|
|
||||||
if (prevHistogram != null) {
|
|
||||||
double[] data = angleHist.getData();
|
|
||||||
double[] data2 = prevHistogram.getData();
|
|
||||||
int n = Math.min(data.length, data2.length);
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
data[i] = (data[i] + data2[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return angleHist;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
package alfa.effortmonitor;
|
|
||||||
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import PamguardMVC.PamProcess;
|
|
||||||
import PamguardMVC.dataOffline.OfflineDataLoadInfo;
|
|
||||||
import alfa.server.ALFAServerLoader;
|
|
||||||
import pamScrollSystem.ViewLoadObserver;
|
|
||||||
|
|
||||||
public class IntervalDataBlock extends PamDataBlock<IntervalDataUnit> {
|
|
||||||
|
|
||||||
|
|
||||||
public IntervalDataBlock(PamProcess parentProcess, String name) {
|
|
||||||
super(IntervalDataUnit.class, name, parentProcess, 0);
|
|
||||||
setNaturalLifetime(3600*10); // 10 hours worth.
|
|
||||||
// setClearAtStart(PamController.getInstance().getRunMode() == PamController.RUN_NORMAL);
|
|
||||||
/**
|
|
||||||
* Will call explicitly from start() if we want to depending on delected options.
|
|
||||||
*/
|
|
||||||
setClearAtStart(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getNumRequiredBeforeLoadTime() {
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getShouldLog(PamDataUnit pamDataUnit) {
|
|
||||||
IntervalDataUnit idu = (IntervalDataUnit) pamDataUnit;
|
|
||||||
return super.getShouldLog(pamDataUnit) & idu.getDurationInMilliseconds() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,196 +0,0 @@
|
|||||||
package alfa.effortmonitor;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.sql.Types;
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import javax.swing.JTree;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonEncoding;
|
|
||||||
import com.fasterxml.jackson.core.JsonFactory;
|
|
||||||
import com.fasterxml.jackson.core.JsonGenerator;
|
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
|
||||||
import com.fasterxml.jackson.core.JsonParser;
|
|
||||||
//import org.codehaus.jackson.JsonToken;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
|
||||||
|
|
||||||
import GPS.GpsData;
|
|
||||||
import PamUtils.LatLong;
|
|
||||||
import PamUtils.LatLongDatabaseSet;
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import PamguardMVC.debug.Debug;
|
|
||||||
import generalDatabase.DBControlUnit;
|
|
||||||
import generalDatabase.DBProcess;
|
|
||||||
import generalDatabase.PamConnection;
|
|
||||||
import generalDatabase.PamTableDefinition;
|
|
||||||
import generalDatabase.PamTableItem;
|
|
||||||
import generalDatabase.SQLLogging;
|
|
||||||
import generalDatabase.SQLTypes;
|
|
||||||
|
|
||||||
public class IntervalDataLogging extends SQLLogging {
|
|
||||||
|
|
||||||
private PamTableItem secondsMonitored, endTime;
|
|
||||||
private LatLongDatabaseSet startGPS, endGPS;
|
|
||||||
private PamTableItem clickTrains, clicks;
|
|
||||||
private PamTableItem[] histogramColumns;
|
|
||||||
private PamTableDefinition tableDefinition;
|
|
||||||
|
|
||||||
private static final int HISTO_TEXT_LENGTH = 30;
|
|
||||||
|
|
||||||
public IntervalDataLogging(PamDataBlock pamDataBlock) {
|
|
||||||
super(pamDataBlock);
|
|
||||||
tableDefinition = new PamTableDefinition("Sperm Whale Intervals");
|
|
||||||
tableDefinition.addTableItem(endTime = new PamTableItem("End Time", Types.TIMESTAMP));
|
|
||||||
tableDefinition.addTableItem(secondsMonitored = new PamTableItem("Monitored Seconds", Types.INTEGER));
|
|
||||||
startGPS = new LatLongDatabaseSet("Start", LatLongDatabaseSet.VERTICAL_NONE, true, true);
|
|
||||||
endGPS = new LatLongDatabaseSet("End", LatLongDatabaseSet.VERTICAL_NONE, true, true);
|
|
||||||
startGPS.addTableItems(tableDefinition);
|
|
||||||
endGPS.addTableItems(tableDefinition);
|
|
||||||
tableDefinition.addTableItem(clickTrains = new PamTableItem("Click Trains", Types.INTEGER));
|
|
||||||
tableDefinition.addTableItem(clicks = new PamTableItem("Clicks", Types.INTEGER));
|
|
||||||
tableDefinition.setUpdatePolicy(SQLLogging.UPDATE_POLICY_OVERWRITE);
|
|
||||||
setTableDefinition(tableDefinition);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean checkHistogramColumns(int nColumns) {
|
|
||||||
PamConnection con = DBControlUnit.findConnection();
|
|
||||||
if (con == null || con.getConnection() == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (histogramColumns == null) {
|
|
||||||
histogramColumns = new PamTableItem[nColumns];
|
|
||||||
}
|
|
||||||
else if (histogramColumns.length < nColumns) {
|
|
||||||
histogramColumns = Arrays.copyOf(histogramColumns, nColumns);
|
|
||||||
}
|
|
||||||
boolean ok = true;
|
|
||||||
for (int i = 0; i < nColumns; i++) {
|
|
||||||
ok |= checkHistogramColumn(con, i);
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean checkHistogramColumn(PamConnection con, int iColumn) {
|
|
||||||
DBProcess dbProc = DBControlUnit.findDatabaseControl().getDbProcess();
|
|
||||||
String columnName = "AngleHistogram_"+iColumn;
|
|
||||||
histogramColumns[iColumn] = tableDefinition.findTableItem(columnName);
|
|
||||||
if (histogramColumns[iColumn] == null) {
|
|
||||||
histogramColumns[iColumn] = new PamTableItem(columnName, Types.CHAR, HISTO_TEXT_LENGTH);
|
|
||||||
tableDefinition.addTableItem(histogramColumns[iColumn]);
|
|
||||||
}
|
|
||||||
return dbProc.checkColumn(tableDefinition, histogramColumns[iColumn]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setTableData(SQLTypes sqlTypes, PamDataUnit pamDataUnit) {
|
|
||||||
IntervalDataUnit intervalDataUnit = (IntervalDataUnit) pamDataUnit;
|
|
||||||
endTime.setValue(sqlTypes.getTimeStamp(intervalDataUnit.getEndTimeInMilliseconds()));
|
|
||||||
secondsMonitored.setValue((int) intervalDataUnit.getActualEffort()/1000);
|
|
||||||
startGPS.setLatLongData(intervalDataUnit.getFirstGPSData());
|
|
||||||
endGPS.setLatLongData(intervalDataUnit.getLastGPSData());
|
|
||||||
clickTrains.setValue(intervalDataUnit.getnClickTrains());
|
|
||||||
clicks.setValue(intervalDataUnit.getnClicks());
|
|
||||||
if (histogramColumns != null) for (int i = 0; i < histogramColumns.length; i++) {
|
|
||||||
writeAngleHistogram(sqlTypes, intervalDataUnit, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void writeAngleHistogram(SQLTypes sqlTypes, IntervalDataUnit intervalDataUnit, int iAngleHist) {
|
|
||||||
AngleHistogram angleHist = intervalDataUnit.getAngleHistogram(iAngleHist);
|
|
||||||
if (angleHist == null) {
|
|
||||||
histogramColumns[iAngleHist].setValue(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
JsonFactory jf = new JsonFactory();
|
|
||||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
|
||||||
String str = null;
|
|
||||||
try {
|
|
||||||
JsonGenerator jg = jf.createJsonGenerator(os, JsonEncoding.UTF8);
|
|
||||||
jg.writeStartObject();
|
|
||||||
// jg.writeNumberField("NCOL", angleHist.getNBins());
|
|
||||||
jg.writeArrayFieldStart("NW");
|
|
||||||
double[] data = angleHist.getData();
|
|
||||||
for (int i = 0; i < data.length; i++) {
|
|
||||||
jg.writeNumber((int) data[i]);
|
|
||||||
}
|
|
||||||
jg.writeEndArray();
|
|
||||||
jg.writeEndObject();
|
|
||||||
jg.close();
|
|
||||||
String jsonString = os.toString();
|
|
||||||
histogramColumns[iAngleHist].setValue(jsonString);
|
|
||||||
}catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected PamDataUnit createDataUnit(SQLTypes sqlTypes, long timeMilliseconds, int databaseIndex) {
|
|
||||||
LatLong startLL = startGPS.getLatLongData(sqlTypes);
|
|
||||||
LatLong endLL = endGPS.getLatLongData(sqlTypes);
|
|
||||||
|
|
||||||
if (startLL==null || endLL==null) return null; //for corrupt entries.
|
|
||||||
|
|
||||||
long monTime = secondsMonitored.getIntegerValue()*1000;
|
|
||||||
long endTimeMillis = SQLTypes.millisFromTimeStamp(endTime.getValue());
|
|
||||||
int nClickTrains = clickTrains.getIntegerValue();
|
|
||||||
int nClicks = clickTrains.getIntegerValue();
|
|
||||||
GpsData sGPS = new GpsData(timeMilliseconds, startLL);
|
|
||||||
GpsData eGPS = new GpsData(endTimeMillis, endLL);
|
|
||||||
IntervalDataUnit du = new IntervalDataUnit(timeMilliseconds, sGPS);
|
|
||||||
du.setDurationInMilliseconds(endTimeMillis-timeMilliseconds);
|
|
||||||
du.setActualEffort(monTime);
|
|
||||||
du.setLastGPSData(eGPS);
|
|
||||||
du.setnClickTrains(nClickTrains);
|
|
||||||
du.setnClicks(nClicks);
|
|
||||||
if (histogramColumns != null) {
|
|
||||||
long histInterval = (endTimeMillis-timeMilliseconds) / histogramColumns.length;
|
|
||||||
for (int i = 0; i < histogramColumns.length; i++) {
|
|
||||||
AngleHistogram angleHist = readAngleHistogram(i);
|
|
||||||
if (angleHist != null) {
|
|
||||||
long histTime = timeMilliseconds + histInterval*i;
|
|
||||||
angleHist.setStartTime(histTime);
|
|
||||||
du.addAngleHistogram(angleHist);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return du;
|
|
||||||
}
|
|
||||||
|
|
||||||
private AngleHistogram readAngleHistogram(int iHist) {
|
|
||||||
String jString = histogramColumns[iHist].getDeblankedStringValue();
|
|
||||||
if (jString == null || jString.length() == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
JsonFactory jf = new JsonFactory();
|
|
||||||
int[] data = null;
|
|
||||||
try {
|
|
||||||
ObjectMapper om = new ObjectMapper();
|
|
||||||
JsonNode jTree = om.readTree(new ByteArrayInputStream(jString.getBytes()));
|
|
||||||
JsonNode jNode = jTree.findValue("NW");
|
|
||||||
if (jNode.isArray()) {
|
|
||||||
ArrayNode an = (ArrayNode) jNode;
|
|
||||||
int n = an.size();
|
|
||||||
data = new int[n];
|
|
||||||
int i = 0;
|
|
||||||
for (JsonNode jn : an) {
|
|
||||||
data[i++] = jn.intValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
Debug.out.printf("Interval data logging unable to interpret histogram string: %s", jString);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (data == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
AngleHistogram angleHist = new AngleHistogram(0, 0, Math.PI, data.length);
|
|
||||||
angleHist.setData(data);
|
|
||||||
return angleHist;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,298 +0,0 @@
|
|||||||
package alfa.effortmonitor;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import GPS.GpsData;
|
|
||||||
import PamUtils.LatLong;
|
|
||||||
import PamUtils.PamCalendar;
|
|
||||||
import PamUtils.time.CalendarControl;
|
|
||||||
import alfa.comms.ALFACommsDataUnit;
|
|
||||||
import alfa.server.ServerRawData;
|
|
||||||
import detectiongrouplocaliser.DetectionGroupDataUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Data unit to summarise what's been going on in some defined time interval (e.g. an hour)
|
|
||||||
* @author Doug Gillespie
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class IntervalDataUnit extends ALFACommsDataUnit {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Actual effort in milliseconds.
|
|
||||||
*/
|
|
||||||
private long actualEffort;
|
|
||||||
|
|
||||||
private GpsData firstGPSData, lastGPSData;
|
|
||||||
|
|
||||||
private int nClickTrains, nClicks;
|
|
||||||
|
|
||||||
private ArrayList<AngleHistogram> angleHistograms = new ArrayList<>();
|
|
||||||
|
|
||||||
private Long imeiNumber;
|
|
||||||
|
|
||||||
private ServerRawData serverRawData;
|
|
||||||
|
|
||||||
public IntervalDataUnit(long timeMilliseconds, GpsData gpsData) {
|
|
||||||
super(timeMilliseconds);
|
|
||||||
getBasicData().setEndTime(timeMilliseconds);
|
|
||||||
firstGPSData = lastGPSData = gpsData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a period of effort to the data unit.
|
|
||||||
* @param effort active time in milliseconds.
|
|
||||||
* @return new total effort.
|
|
||||||
*/
|
|
||||||
public long addActualEffort(long effort) {
|
|
||||||
actualEffort += effort;
|
|
||||||
return actualEffort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the actualEffort
|
|
||||||
*/
|
|
||||||
public long getActualEffort() {
|
|
||||||
return actualEffort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param actualEffort the actualEffort to set
|
|
||||||
*/
|
|
||||||
public void setActualEffort(long actualEffort) {
|
|
||||||
this.actualEffort = actualEffort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return percentage of up time of PAMguard.
|
|
||||||
*/
|
|
||||||
public double getPercentEffort() {
|
|
||||||
double duration = getDurationInMilliseconds();
|
|
||||||
if (duration == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return (double) actualEffort / duration * 100.;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the firstGPSData
|
|
||||||
*/
|
|
||||||
public GpsData getFirstGPSData() {
|
|
||||||
return firstGPSData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param firstGPSData the firstGPSData to set
|
|
||||||
*/
|
|
||||||
public void setFirstGPSData(GpsData firstGPSData) {
|
|
||||||
this.firstGPSData = firstGPSData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the lastGPSData
|
|
||||||
*/
|
|
||||||
public GpsData getLastGPSData() {
|
|
||||||
return lastGPSData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param lastGPSData the lastGPSData to set
|
|
||||||
*/
|
|
||||||
public void setLastGPSData(GpsData lastGPSData) {
|
|
||||||
this.lastGPSData = lastGPSData;
|
|
||||||
if (firstGPSData == null) {
|
|
||||||
firstGPSData = lastGPSData;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return straight line track length between start and end in metres
|
|
||||||
*/
|
|
||||||
public Double getTrackLengthMetres() {
|
|
||||||
if (firstGPSData == null || lastGPSData == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return firstGPSData.distanceToMetres(lastGPSData);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return straight line track length between start and end in miles
|
|
||||||
*/
|
|
||||||
public Double getTrackLengthMiles() {
|
|
||||||
Double m = getTrackLengthMetres();
|
|
||||||
if (m == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return m / LatLong.MetersPerMile;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getCommsString() {
|
|
||||||
double duration = Math.max(0, getDurationInMilliseconds() / 1000. / 60);
|
|
||||||
LatLong startLat = firstGPSData;
|
|
||||||
if (startLat == null) {
|
|
||||||
startLat = new LatLong();
|
|
||||||
}
|
|
||||||
LatLong endLat = lastGPSData;
|
|
||||||
if (endLat == null) {
|
|
||||||
endLat = new LatLong();
|
|
||||||
}
|
|
||||||
String str = String.format("$PGSTA,1,%s,%s,%4.4f,%4.4f,%d,%d,%4.4f,%4.4f,%d,%d",
|
|
||||||
PamCalendar.formatDate2(getTimeMilliseconds(),false), PamCalendar.formatTime2(getTimeMilliseconds(), 0, false),
|
|
||||||
startLat.getLatitude(), startLat.getLongitude(),
|
|
||||||
(int) duration, (int) getPercentEffort(),
|
|
||||||
endLat.getLatitude(), endLat.getLongitude(),
|
|
||||||
nClickTrains, nClicks);
|
|
||||||
synchronized (angleHistograms) {
|
|
||||||
int nHist = angleHistograms.size();
|
|
||||||
for (int i = 0; i < nHist; i++) {
|
|
||||||
AngleHistogram angleHistogram = angleHistograms.get(i);
|
|
||||||
int nBins = angleHistogram.getNBins();
|
|
||||||
String hStr = String.format(",H,%d",nBins);
|
|
||||||
double[] data = angleHistogram.getData();
|
|
||||||
for (int b = 0; b < nBins; b++) {
|
|
||||||
hStr += String.format(",%d", (int) data[b]);
|
|
||||||
}
|
|
||||||
str += hStr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSummaryString() {
|
|
||||||
String str = "<html>";
|
|
||||||
str += "UID: " + getUID() + "<p>";
|
|
||||||
if (getParentDataBlock() != null) {
|
|
||||||
str += getParentDataBlock().getDataName() + "<p>";
|
|
||||||
}
|
|
||||||
if (imeiNumber != null) {
|
|
||||||
str += String.format("imei: %d<p>", imeiNumber);
|
|
||||||
}
|
|
||||||
Integer momsn = getMOMSN();
|
|
||||||
if (momsn != null) {
|
|
||||||
str += String.format("momsn: %d<p>", momsn);
|
|
||||||
}
|
|
||||||
str += String.format("%s %s %s<p>", PamCalendar.formatDate(getTimeMilliseconds(), true),
|
|
||||||
PamCalendar.formatTime(getTimeMilliseconds(), 3, true),
|
|
||||||
CalendarControl.getInstance().getTZCode(true));
|
|
||||||
if (CalendarControl.getInstance().isUTC() == false) {
|
|
||||||
str += String.format("(%s %s %s)<p>", PamCalendar.formatDate(getTimeMilliseconds(), false),
|
|
||||||
PamCalendar.formatTime(getTimeMilliseconds(), 3, false),
|
|
||||||
"UTC");
|
|
||||||
}
|
|
||||||
double duration = Math.max(0, getDurationInMilliseconds() / 1000.);
|
|
||||||
LatLong startLat = firstGPSData;
|
|
||||||
if (startLat == null) {
|
|
||||||
startLat = new LatLong();
|
|
||||||
}
|
|
||||||
LatLong endLat = lastGPSData;
|
|
||||||
if (endLat == null) {
|
|
||||||
endLat = new LatLong();
|
|
||||||
}
|
|
||||||
str += String.format("Start %s<p>End %s<p>Click Trains: %d<p>Clicks %d</html>",
|
|
||||||
startLat.toString(), endLat.toString(), nClickTrains, nClicks);
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double getDurationInMilliseconds() {
|
|
||||||
return Math.max(0,super.getDurationInMilliseconds());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addClickTrain(DetectionGroupDataUnit detectionGroupDataUnit) {
|
|
||||||
nClickTrains++;
|
|
||||||
nClicks += detectionGroupDataUnit.getSubDetectionsCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the nClickTrains
|
|
||||||
*/
|
|
||||||
public int getnClickTrains() {
|
|
||||||
return nClickTrains;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param nClickTrains the nClickTrains to set
|
|
||||||
*/
|
|
||||||
public void setnClickTrains(int nClickTrains) {
|
|
||||||
this.nClickTrains = nClickTrains;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the nClicks
|
|
||||||
*/
|
|
||||||
public int getnClicks() {
|
|
||||||
return nClicks;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param nClicks the nClicks to set
|
|
||||||
*/
|
|
||||||
public void setnClicks(int nClicks) {
|
|
||||||
this.nClicks = nClicks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addAngleHistogram(AngleHistogram angleHistogram) {
|
|
||||||
synchronized (angleHistograms) {
|
|
||||||
angleHistograms.add(angleHistogram);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public AngleHistogram getAngleHistogram(int iHist) {
|
|
||||||
synchronized (angleHistograms) {
|
|
||||||
if (angleHistograms == null || angleHistograms.size() <= iHist) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return angleHistograms.get(iHist);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the angleHistograms
|
|
||||||
*/
|
|
||||||
public ArrayList<AngleHistogram> getAngleHistograms() {
|
|
||||||
return angleHistograms;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AngleHistogram getLastHistrogram() {
|
|
||||||
if (angleHistograms == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return angleHistograms.get(angleHistograms.size()-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the imeiNumber
|
|
||||||
*/
|
|
||||||
public Long getImeiNumber() {
|
|
||||||
return imeiNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param imeiNumber the imeiNumber to set
|
|
||||||
*/
|
|
||||||
public void setImeiNumber(Long imeiNumber) {
|
|
||||||
this.imeiNumber = imeiNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setServerRawData(ServerRawData serverRaw) {
|
|
||||||
this.serverRawData = serverRaw;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getMOMSN() {
|
|
||||||
if (serverRawData == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return serverRawData.getMOMSN();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="ISO-8859-1">
|
|
||||||
<title>ALFA Help Page</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<p>this is a page of help text</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,53 +0,0 @@
|
|||||||
package alfa.help.gui;
|
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.awt.Component;
|
|
||||||
import java.net.URL;
|
|
||||||
|
|
||||||
import javax.help.JHelpContentViewer;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JEditorPane;
|
|
||||||
import javax.swing.JScrollPane;
|
|
||||||
import javax.swing.JTextPane;
|
|
||||||
import javax.swing.ScrollPaneConstants;
|
|
||||||
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
|
|
||||||
public class ALFAHelpPanel {
|
|
||||||
|
|
||||||
private ALFAControl alfaControl;
|
|
||||||
|
|
||||||
private PamPanel mainPanel;
|
|
||||||
|
|
||||||
private JEditorPane htmlPane;
|
|
||||||
|
|
||||||
private static final String helpFile = "alfa/help/doc/ALFAOnePageHelp.html";
|
|
||||||
// private static final String helpFile = "alfa/help/doc/TestRTF.rtf";
|
|
||||||
|
|
||||||
public ALFAHelpPanel(ALFAControl alfaControl) {
|
|
||||||
this.alfaControl = alfaControl;
|
|
||||||
mainPanel = new PamPanel(new BorderLayout());
|
|
||||||
htmlPane = new JEditorPane();
|
|
||||||
// htmlPane.setEditable(false);
|
|
||||||
JScrollPane scrollPane = new JScrollPane(htmlPane);
|
|
||||||
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
|
|
||||||
mainPanel.add(BorderLayout.CENTER, scrollPane);
|
|
||||||
/*
|
|
||||||
* Stick the single html file into it ...
|
|
||||||
*/
|
|
||||||
try {
|
|
||||||
URL help = ClassLoader.getSystemResource(helpFile);
|
|
||||||
htmlPane.setPage(help);
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public JComponent getComponent() {
|
|
||||||
return mainPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
package alfa.logger;
|
|
||||||
|
|
||||||
import PamUtils.PamCalendar;
|
|
||||||
import alfa.comms.ALFACommsDataUnit;
|
|
||||||
|
|
||||||
public class LoggerCommsDataUnit extends ALFACommsDataUnit {
|
|
||||||
|
|
||||||
// public static final int CURRENT_VERSION = 1;
|
|
||||||
|
|
||||||
private String jsonString;
|
|
||||||
|
|
||||||
private int loggerFormFormat;
|
|
||||||
|
|
||||||
public LoggerCommsDataUnit(long timeMilliseconds, String jsonString, int loggerFormFormat) {
|
|
||||||
super(timeMilliseconds);
|
|
||||||
this.jsonString = jsonString;
|
|
||||||
this.loggerFormFormat = loggerFormFormat;
|
|
||||||
setReadyToSend(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getCommsString() {
|
|
||||||
return String.format("$PGLGR,%d,%s,%s,%s", loggerFormFormat,
|
|
||||||
PamCalendar.formatDate2(getTimeMilliseconds(),false), PamCalendar.formatTime2(getTimeMilliseconds(), 0, false),
|
|
||||||
jsonString);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,116 +0,0 @@
|
|||||||
package alfa.logger;
|
|
||||||
|
|
||||||
import java.awt.Frame;
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
|
|
||||||
import javax.swing.JMenuItem;
|
|
||||||
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamUtils.PamCalendar;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import PamguardMVC.PamObservable;
|
|
||||||
import PamguardMVC.PamProcess;
|
|
||||||
import PamguardMVC.dataSelector.DataSelector;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import loggerForms.FormDescription;
|
|
||||||
import loggerForms.FormsControl;
|
|
||||||
import loggerForms.FormsDataUnit;
|
|
||||||
|
|
||||||
public class LoggerMonitor extends PamProcess {
|
|
||||||
|
|
||||||
|
|
||||||
private ALFAControl alfaControl;
|
|
||||||
private DataSelector formsSelector;
|
|
||||||
private FormsControl loggerControl;
|
|
||||||
|
|
||||||
public LoggerMonitor(ALFAControl alfaControl) {
|
|
||||||
super(alfaControl, null);
|
|
||||||
this.alfaControl = alfaControl;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean linkLogger() {
|
|
||||||
loggerControl = (FormsControl) PamController.getInstance().findControlledUnit(FormsControl.class, null);
|
|
||||||
if (loggerControl == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
loggerControl.getFormsMonitor().addObserver(this, true);
|
|
||||||
formsSelector = loggerControl.getFormsMonitor().getDataSelector(alfaControl.getUnitName());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pamStart() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void pamStop() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void notifyModelChanged(int changeType) {
|
|
||||||
super.notifyModelChanged(changeType);
|
|
||||||
if (changeType == PamController.INITIALIZATION_COMPLETE) {
|
|
||||||
linkLogger();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public JMenuItem getMenuItem(Frame parentFrame) {
|
|
||||||
JMenuItem menuItem = new JMenuItem("Logger forms ...");
|
|
||||||
menuItem.addActionListener(new ActionListener() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
showOptionsMenu(parentFrame);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (loggerControl == null) {
|
|
||||||
menuItem.setEnabled(false);
|
|
||||||
menuItem.setToolTipText("No logger forms available");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
menuItem.setToolTipText("Select logger forms for satellite messaging");
|
|
||||||
}
|
|
||||||
return menuItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean showOptionsMenu(Frame frame) {
|
|
||||||
if (formsSelector == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return formsSelector.showSelectDialog(frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void newData(PamObservable o, PamDataUnit arg) {
|
|
||||||
FormsDataUnit formsUnit = (FormsDataUnit) arg;
|
|
||||||
if (formsSelector.scoreData(formsUnit) > 0) {
|
|
||||||
newFormsData(formsUnit);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void newFormsData(FormsDataUnit formsUnit) {
|
|
||||||
// Debug.out.println(formsUnit.getSummaryString());
|
|
||||||
FormDescription desc = formsUnit.getLoggerForm().getFormDescription();
|
|
||||||
// Debug.out.println(desc.getXMLData(formsUnit));
|
|
||||||
// Debug.out.println(desc.getJSONData(formsUnit));
|
|
||||||
String jsonString = desc.getStringData(formsUnit, alfaControl.getAlfaParameters().loggerFormFormat);
|
|
||||||
if (jsonString != null) {
|
|
||||||
LoggerCommsDataUnit lcdu = new LoggerCommsDataUnit(formsUnit.getTimeMilliseconds(), jsonString, alfaControl.getAlfaParameters().loggerFormFormat);
|
|
||||||
alfaControl.getMessageProcess().newData(null, lcdu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the formsSelector
|
|
||||||
*/
|
|
||||||
public DataSelector getFormsSelector() {
|
|
||||||
return formsSelector;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import PamModel.parametermanager.ManagedParameters;
|
|
||||||
import PamModel.parametermanager.PamParameterSet;
|
|
||||||
import PamModel.parametermanager.PrivatePamParameterData;
|
|
||||||
import dataMap.OfflineDataMapPoint;
|
|
||||||
|
|
||||||
public class ALFADataMapPoint extends OfflineDataMapPoint implements ManagedParameters {
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
public static final String name = "ALFA Server";
|
|
||||||
private Long lowUID, highUID;
|
|
||||||
public ALFADataMapPoint(long startTime, long endTime, int nDatas, long missingUIDs) {
|
|
||||||
super(startTime, endTime, nDatas, missingUIDs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getLowestUID() {
|
|
||||||
return lowUID;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setLowestUID(Long uid) {
|
|
||||||
lowUID = uid;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getHighestUID() {
|
|
||||||
return highUID;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setHighestUID(Long uid) {
|
|
||||||
highUID = uid;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PamParameterSet getParameterSet() {
|
|
||||||
PamParameterSet ps = super.getParameterSet();
|
|
||||||
try {
|
|
||||||
Field field = this.getClass().getDeclaredField("highUID");
|
|
||||||
ps.put(new PrivatePamParameterData(this, field) {
|
|
||||||
@Override
|
|
||||||
public Object getData() throws IllegalArgumentException, IllegalAccessException {
|
|
||||||
return highUID;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (NoSuchFieldException | SecurityException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Field field = this.getClass().getDeclaredField("lowUID");
|
|
||||||
ps.put(new PrivatePamParameterData(this, field) {
|
|
||||||
@Override
|
|
||||||
public Object getData() throws IllegalArgumentException, IllegalAccessException {
|
|
||||||
return lowUID;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (NoSuchFieldException | SecurityException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return ps;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import dataMap.OfflineDataMap;
|
|
||||||
|
|
||||||
public class ALFAOfflineDataMap extends OfflineDataMap<ALFADataMapPoint>{
|
|
||||||
|
|
||||||
public ALFAOfflineDataMap(ALFAServerLoader alfaServerLoader, PamDataBlock parentDataBlock) {
|
|
||||||
super(alfaServerLoader, parentDataBlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,452 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import java.awt.Window;
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.sql.DriverManager;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Timestamp;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
import javax.swing.JOptionPane;
|
|
||||||
import javax.swing.JPasswordField;
|
|
||||||
import javax.swing.Timer;
|
|
||||||
|
|
||||||
import org.postgresql.jdbc.PgConnection;
|
|
||||||
|
|
||||||
import GPS.GpsData;
|
|
||||||
import PamController.OfflineDataStore;
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamUtils.LatLong;
|
|
||||||
import PamUtils.PamCalendar;
|
|
||||||
import PamView.dialog.warn.WarnOnce;
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import PamguardMVC.dataOffline.OfflineDataLoadInfo;
|
|
||||||
import PamguardMVC.debug.Debug;
|
|
||||||
import alfa.effortmonitor.AngleHistogram;
|
|
||||||
import alfa.effortmonitor.IntervalDataBlock;
|
|
||||||
import alfa.effortmonitor.IntervalDataUnit;
|
|
||||||
import dataGram.DatagramManager;
|
|
||||||
import dataMap.OfflineDataMapPoint;
|
|
||||||
import generalDatabase.SQLLogging;
|
|
||||||
import generalDatabase.SQLTypes;
|
|
||||||
import pamScrollSystem.AbstractScrollManager;
|
|
||||||
import pamScrollSystem.PamScroller;
|
|
||||||
import pamScrollSystem.ViewLoadObserver;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connect to the web server hosting satellite messages
|
|
||||||
* @author Jamie Macaulay
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class ALFAServerLoader extends SQLLogging implements OfflineDataStore{
|
|
||||||
|
|
||||||
private IntervalDataBlock intervalDataBlock;
|
|
||||||
|
|
||||||
private static String password = "notneeded";
|
|
||||||
|
|
||||||
private ArrayList<Long> imeiNumbers;
|
|
||||||
|
|
||||||
private int errorCount;
|
|
||||||
|
|
||||||
private int highestId;
|
|
||||||
|
|
||||||
private ALFAOfflineDataMap dataMap;
|
|
||||||
|
|
||||||
private static final String dataTable = "data_manager_rawposteddata";
|
|
||||||
|
|
||||||
private javax.swing.Timer autoUpdateTimer;
|
|
||||||
|
|
||||||
private PgConnection currentConnection;
|
|
||||||
|
|
||||||
public ALFAServerLoader(IntervalDataBlock intervalDataBlock) {
|
|
||||||
super(intervalDataBlock);
|
|
||||||
this.intervalDataBlock = intervalDataBlock;
|
|
||||||
autoUpdateTimer = new Timer(15*60*1000, new ActionListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
autoUpdateAction();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private PgConnection makeConnection() {
|
|
||||||
if (currentConnection != null) {
|
|
||||||
return currentConnection;
|
|
||||||
}
|
|
||||||
if (checkPassword() == false) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
String db_user = "alfa_db_user";
|
|
||||||
String db_pw = "spermwhale";
|
|
||||||
String dbName = "alfa_sw_db";
|
|
||||||
// String conStr = "http://157.230.166.95:8000/api/raw_data_string/";
|
|
||||||
|
|
||||||
String driverClass = "org.postgresql.Driver";
|
|
||||||
try {
|
|
||||||
Class.forName(driverClass);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// try {
|
|
||||||
String url = "jdbc:postgresql://157.230.166.95:5432/"+dbName;
|
|
||||||
// System.out.println("Open connection " + url);
|
|
||||||
PgConnection conn = null;
|
|
||||||
try {
|
|
||||||
conn = (PgConnection) DriverManager.getConnection(url, db_user, db_pw);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
WarnOnce.showWarning(PamController.getMainFrame(), "Server Error", "Unable to Connect to ALFA sperm whale database", WarnOnce.WARNING_MESSAGE);
|
|
||||||
currentConnection = null;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// Debug.out.println("server connection open");
|
|
||||||
// DatabaseMetaData dbm = conn.getMetaData();
|
|
||||||
// ResultSet tables = dbm.getTables(null, null, null, null);
|
|
||||||
return currentConnection = conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void closeConnection( ) {
|
|
||||||
if (currentConnection != null) {
|
|
||||||
try {
|
|
||||||
currentConnection.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
}
|
|
||||||
currentConnection = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called from controller to set up or disable auto updates.
|
|
||||||
* @param autoUpdates
|
|
||||||
*/
|
|
||||||
public void runAutoUpdates(boolean autoUpdates) {
|
|
||||||
autoUpdateTimer.stop();
|
|
||||||
if (autoUpdates) {
|
|
||||||
autoUpdateTimer.start();
|
|
||||||
checkForUpdates(true); // check immediately.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized boolean checkForUpdates(boolean scrollAnyway) {
|
|
||||||
int newHighestId = getHighestId();
|
|
||||||
boolean needUpdate = (newHighestId > highestId);
|
|
||||||
Debug.out.printf("Current ALFA server map highest id = %d, new highest id = %d\n", highestId, newHighestId);
|
|
||||||
if (needUpdate) {
|
|
||||||
if (dataMap != null) {
|
|
||||||
// clear existing data map
|
|
||||||
dataMap.clear();
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* make new data map - just do the entire thing from scratch
|
|
||||||
* since there is so little data.
|
|
||||||
*/
|
|
||||||
createOfflineDataMap(PamController.getMainFrame());
|
|
||||||
}
|
|
||||||
if (needUpdate || scrollAnyway) {
|
|
||||||
AbstractScrollManager scrollManager = AbstractScrollManager.getScrollManager();
|
|
||||||
long lastTime = dataMap.getLastDataTime();
|
|
||||||
if (lastTime > 0) {
|
|
||||||
Debug.out.printf("Moving ALFA display to center at %s\n", PamCalendar.formatDateTime(lastTime, true));
|
|
||||||
// just call the center function - it will auto adjust to this becomes the last time.
|
|
||||||
scrollManager.centreDataAt(intervalDataBlock, lastTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return needUpdate;
|
|
||||||
}
|
|
||||||
protected void autoUpdateAction() {
|
|
||||||
checkForUpdates(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check the highest id in the database
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public int getHighestId() {
|
|
||||||
PgConnection conn = makeConnection();
|
|
||||||
if (conn == null) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int id = 0;
|
|
||||||
String qStr = "SELECT id FROM data_manager_rawposteddata WHERE decoded_message LIKE '%%$PGSTA%%' ORDER By Id DESC";
|
|
||||||
try {
|
|
||||||
ResultSet dResult = conn.execSQLQuery(qStr);
|
|
||||||
if (dResult.next()) {
|
|
||||||
id = dResult.getInt(1);
|
|
||||||
}
|
|
||||||
dResult.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
closeConnection();
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean loadALFAServerData(long startMillis, long endMillis) {
|
|
||||||
|
|
||||||
|
|
||||||
String clause = String.format("WHERE decoded_message LIKE '%%$PGSTA%%' AND datetime_sent BETWEEN '%s' AND '%s'",
|
|
||||||
PamCalendar.formatDBDateTime(startMillis, false), PamCalendar.formatDBDateTime(endMillis+5000*3600L, false));
|
|
||||||
|
|
||||||
String qStr = String.format("SELECT id, imei, date_received, decoded_message, raw_posted_data FROM data_manager_rawposteddata %s ORDER BY datetime_sent", clause);
|
|
||||||
|
|
||||||
Debug.out.println(qStr);
|
|
||||||
PgConnection conn = makeConnection();
|
|
||||||
if (conn == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
ResultSet dResult = conn.execSQLQuery(qStr);
|
|
||||||
while (dResult.next()) {
|
|
||||||
int id = dResult.getInt(1);
|
|
||||||
long imei = dResult.getLong(2);
|
|
||||||
String date = dResult.getString(3);
|
|
||||||
Object dateObject = dResult.getObject(3);
|
|
||||||
String strData = dResult.getString(4);
|
|
||||||
String rawData = dResult.getString(5);
|
|
||||||
// Debug.out.printf("%d %d %s \"%s\" %s\n", id, imei, date, dateObject.toString(), strData);
|
|
||||||
IntervalDataUnit intervalDataUnit = parseDataString(strData);
|
|
||||||
if (intervalDataUnit != null) {
|
|
||||||
intervalDataUnit.setImeiNumber(imei);
|
|
||||||
intervalDataUnit.setUID(id);
|
|
||||||
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Try to unpack the rawPostedData to get additional information such as the
|
|
||||||
* message number.
|
|
||||||
*/
|
|
||||||
ServerRawData serverRaw = ServerRawData.unpackRawJson(rawData);
|
|
||||||
if (serverRaw != null) {
|
|
||||||
intervalDataUnit.setServerRawData(serverRaw);
|
|
||||||
}
|
|
||||||
intervalDataBlock.addPamData(intervalDataUnit);
|
|
||||||
}
|
|
||||||
dResult.close();
|
|
||||||
// System.out.println(conn);
|
|
||||||
// conn.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
closeConnection();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
intervalDataBlock.sortData();
|
|
||||||
// Debug.out.printf("%d data units loaded for ALFA intervals", intervalDataBlock.getUnitsCount());
|
|
||||||
IntervalDataUnit idu = intervalDataBlock.getFirstUnit();
|
|
||||||
if (idu != null) {
|
|
||||||
// MasterReferencePoint.
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private IntervalDataUnit parseDataString(String strData) {
|
|
||||||
String[] parts = strData.split(",");
|
|
||||||
String stringId = parts[0];
|
|
||||||
int version = Integer.valueOf(parts[1]);
|
|
||||||
String date = parts[2];
|
|
||||||
String time = parts[3];
|
|
||||||
long startMillis = parseDateTime(date, time);
|
|
||||||
double lat1 = Double.valueOf(parts[4]);
|
|
||||||
double lon1 = Double.valueOf(parts[5]);
|
|
||||||
int minutes = Integer.valueOf(parts[6]);
|
|
||||||
long endMillis = startMillis + minutes*60000;
|
|
||||||
int percActive = Integer.valueOf(parts[7]);
|
|
||||||
double lat2 = Double.valueOf(parts[8]);
|
|
||||||
double lon2 = Double.valueOf(parts[9]);
|
|
||||||
int nClickTrains = Integer.valueOf(parts[10]);
|
|
||||||
int nClicks = Integer.valueOf(parts[11]);
|
|
||||||
LatLong ll1 = new LatLong(lat1, lon1);
|
|
||||||
LatLong ll2 = new LatLong(lat2, lon2);
|
|
||||||
GpsData gps1 = new GpsData(startMillis, ll1);
|
|
||||||
GpsData gps2 = new GpsData(endMillis, ll2);
|
|
||||||
IntervalDataUnit idu = new IntervalDataUnit(startMillis, gps1);
|
|
||||||
idu.setDurationInMilliseconds(endMillis-startMillis);
|
|
||||||
idu.setActualEffort(minutes*60000);
|
|
||||||
idu.setLastGPSData(gps2);
|
|
||||||
idu.setnClickTrains(nClickTrains);
|
|
||||||
idu.setnClicks(nClicks);
|
|
||||||
int iCol = 12;
|
|
||||||
while (iCol < parts.length) {
|
|
||||||
String h = parts[iCol++];
|
|
||||||
if (h.equals("H") == false) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
int nH = Integer.valueOf(parts[iCol++]);
|
|
||||||
int[] hDat = new int[nH];
|
|
||||||
for (int i = 0; i < nH; i++) {
|
|
||||||
hDat[i] = Integer.valueOf(parts[iCol++]);
|
|
||||||
}
|
|
||||||
AngleHistogram angleHist = new AngleHistogram(0, 0, Math.PI, nH);
|
|
||||||
angleHist.setData(hDat);
|
|
||||||
idu.addAngleHistogram(angleHist);
|
|
||||||
}
|
|
||||||
int nhists = idu.getAngleHistograms().size();
|
|
||||||
if (nhists > 0) {
|
|
||||||
long histInterval = minutes / nhists * 60*1000;
|
|
||||||
for (int i = 0; i < nhists; i++) {
|
|
||||||
AngleHistogram angleHist = idu.getAngleHistogram(i);
|
|
||||||
long histStart = startMillis + i*histInterval;
|
|
||||||
angleHist.setStartTime(histStart);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return idu;
|
|
||||||
}
|
|
||||||
|
|
||||||
private long parseDateTime(String date, String time) {try {
|
|
||||||
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd_hhmmss");
|
|
||||||
df.setTimeZone(TimeZone.getTimeZone("UTC"));
|
|
||||||
Date d = df.parse("20"+date+"_"+time); //throws ParseException if no match
|
|
||||||
long millis = d.getTime();
|
|
||||||
// Debug.out.printf("%s %s parses as %s\n", date, time, PamCalendar.formatDateTime(millis));
|
|
||||||
return millis;
|
|
||||||
}
|
|
||||||
catch (java.text.ParseException ex) {
|
|
||||||
//No problem, just go on to next format to try.
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean checkPassword() {
|
|
||||||
if (password != null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
JPasswordField pwd = new JPasswordField(10);
|
|
||||||
int action = JOptionPane.showConfirmDialog(null, pwd,"Enter server Password",JOptionPane.OK_CANCEL_OPTION);
|
|
||||||
if(action < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
char[] pw = pwd.getPassword();
|
|
||||||
if (pw == null || pw.length == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
password = new String(pw);
|
|
||||||
// System.out.println(password);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Long> getImeiList() {
|
|
||||||
if (imeiNumbers == null) {
|
|
||||||
imeiNumbers = makeImeiList();
|
|
||||||
}
|
|
||||||
return imeiNumbers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ArrayList<Long> makeImeiList() {
|
|
||||||
PgConnection conn = makeConnection();
|
|
||||||
if (conn == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
imeiNumbers = new ArrayList<>();
|
|
||||||
String qStr = "SELECT DISTINCT imei FROM data_manager_rawposteddata";
|
|
||||||
try {
|
|
||||||
ResultSet dResult = conn.execSQLQuery(qStr);
|
|
||||||
while (dResult.next()) {
|
|
||||||
Long id = dResult.getLong(1);
|
|
||||||
imeiNumbers.add(id);
|
|
||||||
}
|
|
||||||
// conn.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return imeiNumbers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setTableData(SQLTypes sqlTypes, PamDataUnit pamDataUnit) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public synchronized void createOfflineDataMap(Window parentFrame) {
|
|
||||||
PgConnection conn = makeConnection();
|
|
||||||
if (dataMap == null) {
|
|
||||||
dataMap = new ALFAOfflineDataMap(this, intervalDataBlock);
|
|
||||||
intervalDataBlock.addOfflineDataMap(dataMap);
|
|
||||||
}
|
|
||||||
ALFADataMapPoint admp = null;
|
|
||||||
long mapInterval = 3600L*1L*1000L;
|
|
||||||
if (conn == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
long wantedIMEI = 300234068339920L;
|
|
||||||
String selStr = String.format("Select id, datetime_sent, imei FROM %s WHERE decoded_message LIKE '%%$PGSTA%%' ORDER BY datetime_sent", dataTable);
|
|
||||||
// String selStr = String.format("Select id, utc, imei FROM %s WHERE decoded_message LIKE '%%$PGSTA%%' ORDER BY datetime_sent", dataTable);
|
|
||||||
// String selStr = String.format("Select id, datetime_sent FROM %s ORDER BY datetime_sent", dataTable);
|
|
||||||
// Debug.out.println(selStr);
|
|
||||||
highestId = 0;
|
|
||||||
try {
|
|
||||||
ResultSet dResult = conn.execSQLQuery(selStr);
|
|
||||||
while (dResult.next()) {
|
|
||||||
int id = dResult.getInt(1);
|
|
||||||
highestId = Math.max(id, highestId);
|
|
||||||
Timestamp dateObject = (Timestamp) dResult.getObject(2);
|
|
||||||
// long millis = SQLTypes.millisFromTimeStamp(dateObject);
|
|
||||||
long millis = dateObject.getTime()+3600000L;
|
|
||||||
long imei = dResult.getLong(3);
|
|
||||||
if (imei != wantedIMEI) continue;
|
|
||||||
// PamCalendar.
|
|
||||||
// System.out.println(dateObject + " " + PamCalendar.formatDateTime(millis));
|
|
||||||
if (admp == null || millis-admp.getStartTime() > mapInterval) {
|
|
||||||
admp = new ALFADataMapPoint(millis, millis, 1, 0);
|
|
||||||
admp.setLowestUID((long) id);
|
|
||||||
dataMap.addDataPoint(admp);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
admp.setNDatas(admp.getNDatas()+1);
|
|
||||||
admp.setHighestUID((long) id);
|
|
||||||
admp.setEndTime(millis);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dResult.close();
|
|
||||||
// conn.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
dataMap.sortRanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDataSourceName() {
|
|
||||||
return "ALFA Server";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean loadData(PamDataBlock dataBlock, OfflineDataLoadInfo offlineDataLoadInfo,
|
|
||||||
ViewLoadObserver loadObserver) {
|
|
||||||
return loadALFAServerData(offlineDataLoadInfo.getStartMillis(), offlineDataLoadInfo.getEndMillis());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean saveData(PamDataBlock dataBlock) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean rewriteIndexFile(PamDataBlock dataBlock, OfflineDataMapPoint dmp) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DatagramManager getDatagramManager() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import PamguardMVC.dataSelector.DataSelectParams;
|
|
||||||
import PamguardMVC.dataSelector.DataSelector;
|
|
||||||
import PamguardMVC.dataSelector.DataSelectorCreator;
|
|
||||||
|
|
||||||
public class SIDSCreator extends DataSelectorCreator {
|
|
||||||
|
|
||||||
private ServerIntervalDataBlock serverIntervalDataBlock;
|
|
||||||
|
|
||||||
public SIDSCreator(ServerIntervalDataBlock serverIntervalDataBlock) {
|
|
||||||
super(serverIntervalDataBlock);
|
|
||||||
this.serverIntervalDataBlock = serverIntervalDataBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DataSelector createDataSelector(String selectorName, boolean allowScores, String selectorType) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return new ServerIntervalDataSelector(serverIntervalDataBlock, selectorName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DataSelectParams createNewParams(String name) {
|
|
||||||
return new SIDSParams();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import java.awt.GridBagConstraints;
|
|
||||||
import java.awt.GridBagLayout;
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.swing.ButtonGroup;
|
|
||||||
import javax.swing.JComboBox;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.JRadioButton;
|
|
||||||
import javax.swing.border.TitledBorder;
|
|
||||||
|
|
||||||
import PamView.dialog.PamDialog;
|
|
||||||
import PamView.dialog.PamDialogPanel;
|
|
||||||
import PamView.dialog.PamGridBagContraints;
|
|
||||||
|
|
||||||
public class SIDSDialogPanel implements PamDialogPanel {
|
|
||||||
|
|
||||||
private ServerIntervalDataSelector sids;
|
|
||||||
|
|
||||||
private JPanel mainPanel;
|
|
||||||
|
|
||||||
private JRadioButton showAll, showSystem;
|
|
||||||
private JComboBox<Long> systemList;
|
|
||||||
|
|
||||||
private List<Long> imeiList;
|
|
||||||
|
|
||||||
public SIDSDialogPanel(ServerIntervalDataSelector sids) {
|
|
||||||
this.sids = sids;
|
|
||||||
mainPanel = new JPanel(new GridBagLayout());
|
|
||||||
GridBagConstraints c = new PamGridBagContraints();
|
|
||||||
mainPanel.setBorder(new TitledBorder("Online ALFA data selection"));
|
|
||||||
showAll = new JRadioButton("Show all systems");
|
|
||||||
showSystem = new JRadioButton("Show only the selected system data");
|
|
||||||
systemList = new JComboBox<>();
|
|
||||||
ButtonGroup bg = new ButtonGroup();
|
|
||||||
bg.add(showAll);
|
|
||||||
bg.add(showSystem);
|
|
||||||
mainPanel.add(showAll, c);
|
|
||||||
c.gridy++;
|
|
||||||
mainPanel.add(showSystem, c);
|
|
||||||
c.gridy++;
|
|
||||||
mainPanel.add(systemList, c);
|
|
||||||
showAll.addActionListener(new ActionListener() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
enableControls();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
showSystem.addActionListener(new ActionListener() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
enableControls();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
imeiList = sids.getServerDataBlock().getImeiList();
|
|
||||||
if (imeiList != null) {
|
|
||||||
for (Long imei : imeiList) {
|
|
||||||
systemList.addItem(imei);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void enableControls() {
|
|
||||||
systemList.setEnabled(showSystem.isSelected());
|
|
||||||
if (imeiList == null || imeiList.size() == 0) {
|
|
||||||
systemList.setEnabled(false);
|
|
||||||
showSystem.setEnabled(false);
|
|
||||||
systemList.setToolTipText("No system data available from online database");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JComponent getDialogComponent() {
|
|
||||||
return mainPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setParams() {
|
|
||||||
SIDSParams params = sids.getParams();
|
|
||||||
showAll.setSelected(params.showAll);
|
|
||||||
showSystem.setSelected(params.showAll == false);
|
|
||||||
if (params.selectedSystemId != null) {
|
|
||||||
systemList.setSelectedItem(params.selectedSystemId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getParams() {
|
|
||||||
SIDSParams params = sids.getParams();
|
|
||||||
params.showAll = showAll.isSelected();
|
|
||||||
if (!params.showAll) {
|
|
||||||
Long selVal = (Long) systemList.getSelectedItem();
|
|
||||||
if (selVal == null) {
|
|
||||||
return PamDialog.showWarning(null, "Error", "You must select a valid system from the drop down list");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
params.selectedSystemId = selVal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import PamModel.parametermanager.ManagedParameters;
|
|
||||||
import PamModel.parametermanager.PamParameterSet;
|
|
||||||
import PamModel.parametermanager.PrivatePamParameterData;
|
|
||||||
import PamguardMVC.dataSelector.DataSelectParams;
|
|
||||||
|
|
||||||
public class SIDSParams extends DataSelectParams implements Serializable, Cloneable, ManagedParameters {
|
|
||||||
|
|
||||||
public static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
protected boolean showAll = true;
|
|
||||||
|
|
||||||
protected Long selectedSystemId = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PamParameterSet getParameterSet() {
|
|
||||||
PamParameterSet ps = PamParameterSet.autoGenerate(this);
|
|
||||||
try {
|
|
||||||
Field field = this.getClass().getDeclaredField("showAll");
|
|
||||||
ps.put(new PrivatePamParameterData(this, field) {
|
|
||||||
@Override
|
|
||||||
public Object getData() throws IllegalArgumentException, IllegalAccessException {
|
|
||||||
return showAll;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (NoSuchFieldException | SecurityException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Field field = this.getClass().getDeclaredField("selectedSystemId");
|
|
||||||
ps.put(new PrivatePamParameterData(this, field) {
|
|
||||||
@Override
|
|
||||||
public Object getData() throws IllegalArgumentException, IllegalAccessException {
|
|
||||||
return selectedSystemId;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (NoSuchFieldException | SecurityException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return ps;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,56 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamguardMVC.PamProcess;
|
|
||||||
import PamguardMVC.dataOffline.OfflineDataLoadInfo;
|
|
||||||
import PamguardMVC.dataSelector.DataSelectorCreator;
|
|
||||||
import alfa.effortmonitor.IntervalDataBlock;
|
|
||||||
import pamScrollSystem.ViewLoadObserver;
|
|
||||||
|
|
||||||
public class ServerIntervalDataBlock extends IntervalDataBlock {
|
|
||||||
|
|
||||||
private ALFAServerLoader alfaServerLoader;
|
|
||||||
|
|
||||||
private SIDSCreator sidsCreator;
|
|
||||||
|
|
||||||
public ServerIntervalDataBlock(PamProcess parentProcess, String name) {
|
|
||||||
super(parentProcess, name);
|
|
||||||
alfaServerLoader = new ALFAServerLoader(this);
|
|
||||||
sidsCreator = new SIDSCreator(this);
|
|
||||||
alfaServerLoader.createOfflineDataMap(PamController.getMainFrame());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean loadViewerData(OfflineDataLoadInfo offlineDataLoadInfo, ViewLoadObserver loadObserver) {
|
|
||||||
this.setCurrentViewDataStart(offlineDataLoadInfo.getStartMillis());
|
|
||||||
this.setCurrentViewDataEnd(offlineDataLoadInfo.getEndMillis());
|
|
||||||
return loadOnlineDatabaseData(offlineDataLoadInfo, loadObserver);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean loadOnlineDatabaseData(OfflineDataLoadInfo offlineDataLoadInfo, ViewLoadObserver loadObserver) {
|
|
||||||
// if (needViewerDataLoad(offlineDataLoadInfo) == false) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
clearAll();
|
|
||||||
return alfaServerLoader.loadALFAServerData(offlineDataLoadInfo.getStartMillis(), offlineDataLoadInfo.getEndMillis());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the alfaServerLoader
|
|
||||||
*/
|
|
||||||
public ALFAServerLoader getAlfaServerLoader() {
|
|
||||||
return alfaServerLoader;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Long> getImeiList() {
|
|
||||||
return alfaServerLoader.getImeiList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DataSelectorCreator getDataSelectCreator() {
|
|
||||||
return sidsCreator;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,68 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import PamView.dialog.PamDialogPanel;
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import PamguardMVC.dataSelector.DataSelectParams;
|
|
||||||
import PamguardMVC.dataSelector.DataSelector;
|
|
||||||
import alfa.effortmonitor.IntervalDataUnit;
|
|
||||||
import pamViewFX.fxSettingsPanes.DynamicSettingsPane;
|
|
||||||
|
|
||||||
public class ServerIntervalDataSelector extends DataSelector {
|
|
||||||
|
|
||||||
private ServerIntervalDataBlock serverDataBlock;
|
|
||||||
|
|
||||||
private SIDSParams sidsParams = new SIDSParams();
|
|
||||||
|
|
||||||
public ServerIntervalDataSelector(ServerIntervalDataBlock serverDataBlock, String selectorName) {
|
|
||||||
super(serverDataBlock, selectorName, false);
|
|
||||||
this.serverDataBlock = serverDataBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setParams(DataSelectParams dataSelectParams) {
|
|
||||||
if (dataSelectParams instanceof SIDSParams) {
|
|
||||||
this.sidsParams = (SIDSParams) dataSelectParams;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SIDSParams getParams() {
|
|
||||||
return sidsParams;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PamDialogPanel getDialogPanel() {
|
|
||||||
return new SIDSDialogPanel(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DynamicSettingsPane<Boolean> getDialogPaneFX() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double scoreData(PamDataUnit pamDataUnit) {
|
|
||||||
if (sidsParams.showAll) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
IntervalDataUnit idu = (IntervalDataUnit) pamDataUnit;
|
|
||||||
Long imei = idu.getImeiNumber();
|
|
||||||
if (imei == null) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return imei.equals(sidsParams.selectedSystemId) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the serverDataBlock
|
|
||||||
*/
|
|
||||||
protected ServerIntervalDataBlock getServerDataBlock() {
|
|
||||||
return serverDataBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonFactory;
|
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
|
||||||
|
|
||||||
import PamguardMVC.debug.Debug;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class to handle the raw data string from the server, which contains EVERYTHING as json.
|
|
||||||
* Example string is {"imei": "300234068339920", "device_type": "ROCKBLOCK", "serial": "16945", "momsn": "27", "transmit_time": "19-06-21 19:28:40", "iridium_latitude": "57.9165",
|
|
||||||
* "iridium_longitude": "-148.9899", "iridium_cep": "4.0", "iridium_session_status": "0", "data":
|
|
||||||
* "2450475354412c312c3139303632312c3138323833332c35372e383838332c2d3134392e323034342c36302c3130302c35372e383936362c2d3134392e303136342c312c31302c482c342c302c302c302c312c482c342c302c302c302c302c482c342c302c302c302c302c482c342c302c302c302c30"}
|
|
||||||
* @author dg50
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ServerRawData {
|
|
||||||
|
|
||||||
private Integer momsn;
|
|
||||||
|
|
||||||
private ServerRawData(Integer momsn) {
|
|
||||||
this.momsn = momsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ServerRawData unpackRawJson(String jString) {
|
|
||||||
|
|
||||||
JsonFactory jf = new JsonFactory();
|
|
||||||
Integer momsn;
|
|
||||||
try {
|
|
||||||
ObjectMapper om = new ObjectMapper();
|
|
||||||
JsonNode jTree = om.readTree(new ByteArrayInputStream(jString.getBytes()));
|
|
||||||
JsonNode jNode = jTree.findValue("momsn");
|
|
||||||
momsn = jNode.asInt();
|
|
||||||
} catch (IOException e) {
|
|
||||||
Debug.out.printf("Interval data logging unable to interpret histogram string: %s", jString);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ServerRawData(momsn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the momsn
|
|
||||||
*/
|
|
||||||
public Integer getMOMSN() {
|
|
||||||
return momsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,119 +0,0 @@
|
|||||||
package alfa.server;
|
|
||||||
|
|
||||||
import java.sql.DatabaseMetaData;
|
|
||||||
import java.sql.DriverManager;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
|
|
||||||
import org.postgresql.jdbc.PgConnection;
|
|
||||||
|
|
||||||
public class ServerTest {
|
|
||||||
|
|
||||||
public ServerTest() {
|
|
||||||
// TODO Auto-generated constructor stub
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
ServerTest st = new ServerTest();
|
|
||||||
st.run();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void run() {
|
|
||||||
/*
|
|
||||||
* https://jdbc.postgresql.org/documentation/head/connect.html
|
|
||||||
*/
|
|
||||||
// String ip_address = "157.230.166.95";
|
|
||||||
String db_user = "alfa_db_user";
|
|
||||||
String db_pw = "spermwhale";
|
|
||||||
String dbName = "alfa_sw_db";
|
|
||||||
// String conStr = "http://157.230.166.95:8000/api/raw_data_string/";
|
|
||||||
|
|
||||||
String driverClass = "org.postgresql.Driver";
|
|
||||||
try {
|
|
||||||
Class.forName(driverClass);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
String url = "jdbc:postgresql://157.230.166.95:5432/"+dbName;
|
|
||||||
System.out.println("Open connection " + url);
|
|
||||||
PgConnection conn = (PgConnection) DriverManager.getConnection(url, db_user, db_pw);
|
|
||||||
System.out.println("connection open");
|
|
||||||
DatabaseMetaData dbm = conn.getMetaData();
|
|
||||||
ResultSet tables = dbm.getTables(null, null, null, null);
|
|
||||||
|
|
||||||
// if (tables.next()){
|
|
||||||
// haveTable = true;
|
|
||||||
// }
|
|
||||||
// if (databaseControll.databaseSystem.getSystemName().equals(OOoDBSystem.SYSTEMNAME)){
|
|
||||||
String dataTable = "data_manager_rawposteddata";
|
|
||||||
ResultSet oodbTables = dbm.getTables(null, null, dataTable, null);
|
|
||||||
|
|
||||||
while (oodbTables.next()){
|
|
||||||
String tableName = oodbTables.getString(3).trim();
|
|
||||||
// if (tableName.startsWith("pg_")) {
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
// System.out.println("Found table named " + oodbTables.getString(3).trim());
|
|
||||||
|
|
||||||
// if (oodbTables.getString(3).trim().equalsIgnoreCase(tableDef.getTableName())){
|
|
||||||
// // System.out.println("Table Found: "+oodbTables.getString(3));
|
|
||||||
// tableDef.setTableName(oodbTables.getString(3).trim().toUpperCase());
|
|
||||||
// haveTable = true;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// try the table data_manager_rawposteddata_id_seq to see what's in it ...
|
|
||||||
ResultSet columns = dbm.getColumns(null, null, tableName, null);
|
|
||||||
int ncol = 0;
|
|
||||||
boolean interesting = false;
|
|
||||||
while (columns.next()) {
|
|
||||||
|
|
||||||
// now check the format
|
|
||||||
String colName = columns.getString(4);
|
|
||||||
int colType = columns.getInt(5);
|
|
||||||
// if (colName.toLowerCase().contains("iridium_latitude")) {
|
|
||||||
System.out.printf("Table %s has column %s type %d\n",tableName, colName, colType);
|
|
||||||
interesting = true;
|
|
||||||
// }
|
|
||||||
// // if (colType == tableItem.getSqlType()) return true;
|
|
||||||
// // //String strColType = columns.getString(6);
|
|
||||||
// if (columnName.equalsIgnoreCase(colName)) {
|
|
||||||
// haveColumn = true;
|
|
||||||
// }
|
|
||||||
ncol++;
|
|
||||||
}
|
|
||||||
if (interesting)
|
|
||||||
System.out.printf("found %d columns in table %s\n", ncol, tableName);
|
|
||||||
|
|
||||||
// System.out.println("Table Not Found: "+tableDef.getTableName().toUpperCase());
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
tables.close();
|
|
||||||
|
|
||||||
// ResultSet dResult = conn.execSQLQuery("SELECT id, imei, date_received, decoded_message, datetime_sent, raw_posted_data, hist_string FROM data_manager_rawposteddata WHERE decoded_message LIKE '%$PGSTA%' ORDER BY id");
|
|
||||||
ResultSet dResult = conn.execSQLQuery("SELECT id, imei, date_received, decoded_message, datetime_sent, raw_posted_data, "
|
|
||||||
+ "hist_string FROM data_manager_rawposteddata ORDER BY raw_posted_data");
|
|
||||||
while (dResult.next()) {
|
|
||||||
int id = dResult.getInt(1);
|
|
||||||
long imei = dResult.getLong(2);
|
|
||||||
String date = dResult.getString(3);
|
|
||||||
Object dateObject = dResult.getObject(5);
|
|
||||||
String strData = dResult.getString(4);
|
|
||||||
String rawData = dResult.getString(6);
|
|
||||||
String histString = dResult.getString(7);
|
|
||||||
if (dateObject == null) dateObject = "no Date";
|
|
||||||
System.out.println(rawData);
|
|
||||||
System.out.printf("%d %d %s \"%s\" %s\n", id, imei, date, dateObject.toString(), strData);
|
|
||||||
}
|
|
||||||
dResult.close();
|
|
||||||
System.out.println(conn);
|
|
||||||
conn.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
package alfa.status;
|
|
||||||
|
|
||||||
import PamController.PamControlledUnit;
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamController.status.ModuleStatus;
|
|
||||||
import PamController.status.RemedialAction;
|
|
||||||
import PamModel.PamModuleInfo;
|
|
||||||
import PamView.PamGui;
|
|
||||||
import alfa.ControlledModuleInfo;
|
|
||||||
|
|
||||||
public class CreateModuleAction implements RemedialAction {
|
|
||||||
|
|
||||||
private ControlledModuleInfo moduleInfo;
|
|
||||||
|
|
||||||
public CreateModuleAction(ControlledModuleInfo moduleInfo) {
|
|
||||||
this.moduleInfo = moduleInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getInfo() {
|
|
||||||
String info = "Create module " + moduleInfo.getDefaultName();
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ModuleStatus takeAction(ModuleStatus currentStatus) {
|
|
||||||
PamController pamController = PamController.getInstance();
|
|
||||||
PamControlledUnit newUnit = pamController.addModule(moduleInfo.getPamModuleInfo(), moduleInfo.getDefaultName());
|
|
||||||
if (newUnit == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return newUnit.getModuleStatus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,252 +0,0 @@
|
|||||||
package alfa.status;
|
|
||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import javax.swing.Timer;
|
|
||||||
|
|
||||||
import PamController.PamControlledUnit;
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamController.status.ModuleStatus;
|
|
||||||
import PamModel.PamModuleInfo;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import alfa.ControlledModuleInfo;
|
|
||||||
import alfa.clickmonitor.eventaggregator.ClickEventAggregate;
|
|
||||||
import detectiongrouplocaliser.DetectionGroupDataUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Status monitor, will scan a list of modules for
|
|
||||||
* @author dg50
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class StatusMonitor {
|
|
||||||
|
|
||||||
private boolean monitorAll;
|
|
||||||
|
|
||||||
private ArrayList<ControlledModuleInfo> modulesList;
|
|
||||||
|
|
||||||
private int monitorInterval = 2; // monitor interval in seconds.
|
|
||||||
|
|
||||||
private Timer checkTimer;
|
|
||||||
|
|
||||||
private ModuleStatus[] moduleStatus;
|
|
||||||
|
|
||||||
private boolean[] moduleExists;
|
|
||||||
|
|
||||||
private ArrayList<StatusObserver> statusObservers = new ArrayList<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param monitorAll
|
|
||||||
*/
|
|
||||||
public StatusMonitor(boolean monitorAll) {
|
|
||||||
this(monitorAll, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param monitorAll
|
|
||||||
* @param essentialModulesList
|
|
||||||
*/
|
|
||||||
public StatusMonitor(boolean monitorAll, ArrayList<ControlledModuleInfo> essentialModulesList) {
|
|
||||||
super();
|
|
||||||
this.monitorAll = monitorAll;
|
|
||||||
this.modulesList = essentialModulesList;
|
|
||||||
|
|
||||||
checkTimer = new Timer(2000, new ActionListener() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
checkTimerActions();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
checkTimer.start();
|
|
||||||
}
|
|
||||||
protected void checkTimerActions() {
|
|
||||||
checkAllModules();
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void checkAllModules() {
|
|
||||||
/**
|
|
||||||
* Get some single status object array for all of the modules.
|
|
||||||
*/
|
|
||||||
checkStatusAllocation();
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
for (ControlledModuleInfo moduleInfo:modulesList) {
|
|
||||||
checkModule(moduleInfo, index++);
|
|
||||||
}
|
|
||||||
|
|
||||||
notifyStatusUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void checkStatusAllocation() {
|
|
||||||
int n = modulesList.size();
|
|
||||||
if (moduleStatus == null || moduleStatus.length != n) {
|
|
||||||
moduleStatus = new ModuleStatus[n];
|
|
||||||
}
|
|
||||||
if (moduleExists == null || moduleExists.length != n) {
|
|
||||||
moduleExists = new boolean[n];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Integer checkModule(ControlledModuleInfo moduleInfo, int index) {
|
|
||||||
PamController pamController = PamController.getInstance();
|
|
||||||
if (pamController == null) return null;
|
|
||||||
PamControlledUnit pamControlledUnit = pamController.findControlledUnit(moduleInfo.getPamModuleInfo().getModuleClass(), moduleInfo.getFixedModuleName());
|
|
||||||
moduleExists[index] = (pamControlledUnit != null);
|
|
||||||
if (moduleExists[index]) {
|
|
||||||
moduleStatus[index] = pamControlledUnit.getModuleStatus();
|
|
||||||
if (moduleStatus[index] != null) {
|
|
||||||
moduleStatus[index].setName(pamControlledUnit.getUnitName());
|
|
||||||
return moduleStatus[index].getStatus();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
moduleStatus[index] = new ModuleStatus(ModuleStatus.STATUS_ERROR, "Module not present");
|
|
||||||
moduleStatus[index].setRemedialAction(new CreateModuleAction(moduleInfo));
|
|
||||||
return moduleStatus[index].getStatus();
|
|
||||||
}
|
|
||||||
// sayModuleStatus(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sayModuleStatus(int index) {
|
|
||||||
ControlledModuleInfo moduleInfo = modulesList.get(index);
|
|
||||||
if (moduleExists[index]) {
|
|
||||||
System.out.printf("Module %s Status %s\n", moduleInfo.getDefaultName(), moduleStatus[index]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
System.out.printf("Module %s is not present\n", moduleInfo.getDefaultName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add an observer to get status updates.
|
|
||||||
* @param statusObserver Status observer
|
|
||||||
*/
|
|
||||||
public void addObserver(StatusObserver statusObserver) {
|
|
||||||
if (statusObservers.contains(statusObserver) == false) {
|
|
||||||
statusObservers.add(statusObserver);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a status update observer
|
|
||||||
* @param statusObserver to remove
|
|
||||||
* @return true if the observer existed in the list
|
|
||||||
*/
|
|
||||||
public boolean removeObserver(StatusObserver statusObserver) {
|
|
||||||
return statusObservers.remove(statusObserver);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notify all observers that the status has changed.
|
|
||||||
*/
|
|
||||||
private void notifyStatusUpdate() {
|
|
||||||
for (StatusObserver obs:statusObservers) {
|
|
||||||
obs.newStatus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @return monitorAll flag to monitor all Modules in PAMGuard.
|
|
||||||
*/
|
|
||||||
public boolean isMonitorAll() {
|
|
||||||
return monitorAll;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param monitorAll set flag to monitor all Modules in PAMGuard
|
|
||||||
*/
|
|
||||||
public void setMonitorAll(boolean monitorAll) {
|
|
||||||
this.monitorAll = monitorAll;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set list of modules to monitor
|
|
||||||
* @return the modulesList
|
|
||||||
*/
|
|
||||||
public ArrayList<ControlledModuleInfo> getModulesList() {
|
|
||||||
return modulesList;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* List of modules to monitor
|
|
||||||
* @param modulesList the modulesList to set
|
|
||||||
*/
|
|
||||||
public void setModulesList(ArrayList<ControlledModuleInfo> modulesList) {
|
|
||||||
this.modulesList = modulesList;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Monitor interval in seconds.
|
|
||||||
* @return the monitorInterval
|
|
||||||
*/
|
|
||||||
public int getMonitorInterval() {
|
|
||||||
return monitorInterval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* interval in seconds, set to zero for no timed monitoring
|
|
||||||
* @param monitorInterval the monitorInterval to set
|
|
||||||
*/
|
|
||||||
public void setMonitorInterval(int monitorInterval) {
|
|
||||||
this.monitorInterval = monitorInterval;
|
|
||||||
if (monitorInterval <= 0) {
|
|
||||||
checkTimer.stop();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
checkTimer.setDelay(monitorInterval*1000);
|
|
||||||
checkTimer.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the moduleStatus of all modules monitored
|
|
||||||
*/
|
|
||||||
public ModuleStatus[] getModuleStatus() {
|
|
||||||
return moduleStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the moduleExists existence of all modules monitored
|
|
||||||
*/
|
|
||||||
public boolean[] getModuleExists() {
|
|
||||||
return moduleExists;
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized ModuleStatus getSummaryStatus() {
|
|
||||||
if (moduleStatus == null || moduleStatus.length == 0) {
|
|
||||||
return new ModuleStatus(ModuleStatus.STATUS_ERROR, "No PAM modules present");
|
|
||||||
}
|
|
||||||
int maxStatus = 0;
|
|
||||||
String statusString = null;
|
|
||||||
int n = Math.min(moduleStatus.length, modulesList.size());
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
if (modulesList.get(i).getPamModuleInfo().getClassName().equals(ALFAControl.class.getName())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
ModuleStatus ms = moduleStatus[i];
|
|
||||||
if (ms == null) continue;
|
|
||||||
maxStatus = Math.max(maxStatus, ms.getStatus());
|
|
||||||
if (ms.getStatus() > 0) {
|
|
||||||
String sBit = String.format("%s: %s %s", ModuleStatus.getStatusString(ms.getStatus()),
|
|
||||||
modulesList.get(i).getDefaultName(), ms.getMessage());
|
|
||||||
|
|
||||||
if (statusString == null) {
|
|
||||||
statusString = "<p>" + sBit;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
statusString += "<p>" + sBit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// if (statusString != null) {
|
|
||||||
// statusString += "</html>";
|
|
||||||
// }
|
|
||||||
return new ModuleStatus(maxStatus, statusString);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
package alfa.status;
|
|
||||||
|
|
||||||
public interface StatusObserver {
|
|
||||||
|
|
||||||
public void newModuleList();
|
|
||||||
|
|
||||||
public void newStatus();
|
|
||||||
|
|
||||||
}
|
|
@ -1,235 +0,0 @@
|
|||||||
package alfa.status.swing;
|
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.FlowLayout;
|
|
||||||
import java.awt.Graphics;
|
|
||||||
import java.awt.Point;
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.awt.event.MouseAdapter;
|
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JLabel;
|
|
||||||
import javax.swing.JMenuItem;
|
|
||||||
import javax.swing.JPopupMenu;
|
|
||||||
import javax.swing.border.TitledBorder;
|
|
||||||
|
|
||||||
|
|
||||||
import PamController.status.ModuleStatus;
|
|
||||||
import PamController.status.RemedialAction;
|
|
||||||
import PamView.PamColors;
|
|
||||||
import PamView.PamColors.PamColor;
|
|
||||||
import PamView.PamSymbol;
|
|
||||||
import PamView.PamSymbolType;
|
|
||||||
import PamView.dialog.PamLabel;
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
|
|
||||||
public class StatusButton {
|
|
||||||
|
|
||||||
protected JLabel textOutput;
|
|
||||||
|
|
||||||
private DIYButton diyButton;
|
|
||||||
|
|
||||||
protected PamPanel mainPanel;
|
|
||||||
|
|
||||||
private static final int DEFULATSIZE = 30;
|
|
||||||
|
|
||||||
private PamSymbol colouredIcon = new PamSymbol(PamSymbolType.SYMBOL_CIRCLE, 20, 20, true, Color.BLUE, Color.BLUE);
|
|
||||||
|
|
||||||
protected PamLabel nameLabel;
|
|
||||||
|
|
||||||
protected ModuleStatus latestStatus;
|
|
||||||
|
|
||||||
protected Color[] buttonColours = {Color.GREEN, Color.ORANGE, Color.RED};
|
|
||||||
|
|
||||||
public StatusButton(String name) {
|
|
||||||
this(name, new Dimension(DEFULATSIZE, DEFULATSIZE));
|
|
||||||
}
|
|
||||||
|
|
||||||
public StatusButton(String name, Dimension size) {
|
|
||||||
this.mainPanel = createButton(name, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected PamPanel createButton(String name, Dimension size) {
|
|
||||||
mainPanel = new PamPanel(PamColor.BORDER);
|
|
||||||
// simpleButton = new JButton(colouredIcon);
|
|
||||||
// Border bb = simpleButton.getBorder();
|
|
||||||
// System.out.println(bb);
|
|
||||||
textOutput = new PamLabel("Status information");
|
|
||||||
diyButton = new DIYButton(size);
|
|
||||||
nameLabel = new PamLabel(name + " ", JLabel.RIGHT);
|
|
||||||
// if (false) {
|
|
||||||
// mainPanel.setBorder(new TitledBorder(name));
|
|
||||||
// mainPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
|
|
||||||
// mainPanel.add(diyButton);
|
|
||||||
// mainPanel.add(textOutput);
|
|
||||||
// }
|
|
||||||
// else {
|
|
||||||
mainPanel.setLayout(new BorderLayout());
|
|
||||||
mainPanel.add(nameLabel);
|
|
||||||
mainPanel.add(diyButton, BorderLayout.EAST);
|
|
||||||
// mainPanel.add(textOutput);
|
|
||||||
// }
|
|
||||||
diyButton.addMouseListener(new StatusMouse());
|
|
||||||
|
|
||||||
return mainPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the main component.
|
|
||||||
* @return the main component.
|
|
||||||
*/
|
|
||||||
public JComponent getComponent() {
|
|
||||||
return mainPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the colour for a particular state
|
|
||||||
* @param state 0 1 or 2
|
|
||||||
* @param color colour to display.
|
|
||||||
*/
|
|
||||||
public void setColor(int state, Color color) {
|
|
||||||
if (state >= buttonColours.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
buttonColours[state] = color;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DIYButton extends PamPanel {
|
|
||||||
|
|
||||||
public DIYButton(Dimension d) {
|
|
||||||
super(PamColor.BORDER);
|
|
||||||
setPreferredSize(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public DIYButton() {
|
|
||||||
this(new Dimension(DEFULATSIZE, DEFULATSIZE));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void paintComponent(Graphics g) {
|
|
||||||
super.paintComponent(g);
|
|
||||||
double h = g.getClipBounds().getHeight();
|
|
||||||
double w = g.getClipBounds().getWidth();
|
|
||||||
int h2 = getHeight();
|
|
||||||
int sz = (int) Math.min(h, getWidth());
|
|
||||||
int ww = sz - 6;
|
|
||||||
colouredIcon.draw(g, new Point(getWidth()/2-1, getHeight()/2-1), ww, ww);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
nameLabel.setText(name + " ");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update the status of this control, tooltips, colour, etc
|
|
||||||
* all depend on the status
|
|
||||||
* @param b
|
|
||||||
* @param moduleStatus
|
|
||||||
*/
|
|
||||||
public synchronized void setStatus(boolean exists, ModuleStatus moduleStatus) {
|
|
||||||
String txt;
|
|
||||||
Color col = null;
|
|
||||||
if (moduleStatus != null) {
|
|
||||||
txt = moduleStatus.toString();
|
|
||||||
int stat = Math.max(0, Math.min(moduleStatus.getStatus(), buttonColours.length-1));
|
|
||||||
col = buttonColours[stat];
|
|
||||||
// switch (moduleStatus.getStatus()) {
|
|
||||||
// case 0:
|
|
||||||
// col = Color.GREEN;
|
|
||||||
// break;
|
|
||||||
// case 1:
|
|
||||||
// col = Color.ORANGE;
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// col = Color.RED;
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
if (moduleStatus.getName() != null) {
|
|
||||||
nameLabel.setText(moduleStatus.getName() + " ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (exists == false) {
|
|
||||||
txt = "not present\n";
|
|
||||||
col = Color.RED;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
txt = "No status data";
|
|
||||||
col = Color.ORANGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
latestStatus = moduleStatus;
|
|
||||||
|
|
||||||
textOutput.setText(txt);
|
|
||||||
diyButton.setToolTipText("<html>"+txt);
|
|
||||||
if (col == null) {
|
|
||||||
// simpleButton.setIcon(null);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
colouredIcon.setFillColor(col);
|
|
||||||
colouredIcon.setLineThickness(1);
|
|
||||||
colouredIcon.setLineColor(PamColors.getInstance().getForegroudColor(PamColor.AXIS));
|
|
||||||
// simpleButton.setIcon(colouredIcon);
|
|
||||||
}
|
|
||||||
diyButton.repaint();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class StatusMouse extends MouseAdapter {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mousePressed(MouseEvent e) {
|
|
||||||
if (e.getButton() == MouseEvent.BUTTON1) {
|
|
||||||
showRemedialMenu(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized void showRemedialMenu(MouseEvent e) {
|
|
||||||
if (latestStatus == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
RemedialAction remedialAction = latestStatus.getRemedialAction();
|
|
||||||
if (remedialAction == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
JPopupMenu popMenu = new JPopupMenu(remedialAction.getInfo());
|
|
||||||
JMenuItem menuItem = new JMenuItem("Fix problem: " + remedialAction.getInfo());
|
|
||||||
menuItem.addActionListener(new RemedialActionListener(latestStatus, remedialAction));
|
|
||||||
popMenu.add(menuItem);
|
|
||||||
|
|
||||||
popMenu.show(e.getComponent(), e.getX(), e.getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
private class RemedialActionListener implements ActionListener {
|
|
||||||
|
|
||||||
private RemedialAction RemedialAction;
|
|
||||||
private ModuleStatus currentStatus;
|
|
||||||
|
|
||||||
public RemedialActionListener(ModuleStatus currentStatus, RemedialAction remedialAction) {
|
|
||||||
super();
|
|
||||||
this.currentStatus = currentStatus;
|
|
||||||
RemedialAction = remedialAction;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
RemedialAction.takeAction(currentStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,133 +0,0 @@
|
|||||||
package alfa.status.swing;
|
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Font;
|
|
||||||
|
|
||||||
import javax.swing.SwingConstants;
|
|
||||||
|
|
||||||
import PamController.status.ModuleStatus;
|
|
||||||
import PamView.dialog.PamLabel;
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a square status button.
|
|
||||||
*
|
|
||||||
* @author Jamie Macaulay
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class StatusButtonSquare extends StatusButton {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Label for the panel
|
|
||||||
*/
|
|
||||||
private PamLabel label;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holder panel.
|
|
||||||
*/
|
|
||||||
private PamPanel holder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name text.
|
|
||||||
*/
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
private Dimension prefDim;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor for the status button
|
|
||||||
* @param name - the name of the button
|
|
||||||
* @param buttonsize
|
|
||||||
*/
|
|
||||||
public StatusButtonSquare(String name, Dimension size) {
|
|
||||||
super(name);
|
|
||||||
this.name=name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected PamPanel createButton(String name, Dimension size) {
|
|
||||||
|
|
||||||
label = new PamLabel(name, SwingConstants.CENTER);
|
|
||||||
label.setSize(size);
|
|
||||||
label.setFont(new Font(null, Font.BOLD, 16));
|
|
||||||
label.setOpaque(true);
|
|
||||||
|
|
||||||
holder = new PamPanel(new BorderLayout());
|
|
||||||
holder.add(label, BorderLayout.CENTER);
|
|
||||||
holder.setPreferredSize(size);
|
|
||||||
holder.setOpaque(true);
|
|
||||||
|
|
||||||
return holder;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void setStatus(boolean exists, ModuleStatus moduleStatus) {
|
|
||||||
String txt;
|
|
||||||
Color col = null;
|
|
||||||
// Debug.out.println("Hello STATUS BUTTON I am: " +moduleStatus.getStatus());
|
|
||||||
if (moduleStatus != null) {
|
|
||||||
txt = moduleStatus.toString();
|
|
||||||
int stat = Math.max(0, Math.min(moduleStatus.getStatus(), buttonColours.length-1));
|
|
||||||
col = buttonColours[stat];
|
|
||||||
// Debug.out.println("Hello STATUS BUTTON Col: " +col + " stat: " +stat);
|
|
||||||
|
|
||||||
// switch (moduleStatus.getStatus()) {
|
|
||||||
// case 0:
|
|
||||||
// col = Color.GREEN;
|
|
||||||
// break;
|
|
||||||
// case 1:
|
|
||||||
// col = Color.ORANGE;
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// col = Color.RED;
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
if (moduleStatus.getName() != null) {
|
|
||||||
nameLabel.setText(moduleStatus.getName() + " ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (exists == false) {
|
|
||||||
txt = "not present\n";
|
|
||||||
col = Color.RED;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
txt = "No status data";
|
|
||||||
col = Color.ORANGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
latestStatus = moduleStatus;
|
|
||||||
|
|
||||||
switch (moduleStatus.getStatus()) {
|
|
||||||
case ModuleStatus.STATUS_OK:
|
|
||||||
label.setText(name +" OK");
|
|
||||||
break;
|
|
||||||
case ModuleStatus.STATUS_WARNING :
|
|
||||||
label.setText(name +" WARNING");
|
|
||||||
break;
|
|
||||||
case ModuleStatus.STATUS_ERROR :
|
|
||||||
label.setText(name +" ERROR");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
label.setToolTipText("<html>"+txt);
|
|
||||||
if (col == null) {
|
|
||||||
// simpleButton.setIcon(null);
|
|
||||||
label.setBackground(Color.RED);
|
|
||||||
holder.setBackground(Color.RED);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
label.setText(txt);
|
|
||||||
label.setBackground(col);
|
|
||||||
holder.setBackground(col);
|
|
||||||
}
|
|
||||||
|
|
||||||
label.setOpaque(true);
|
|
||||||
holder.setOpaque(true);
|
|
||||||
label.validate();
|
|
||||||
label.repaint();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
package alfa.status.swing;
|
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import javax.swing.BoxLayout;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.border.TitledBorder;
|
|
||||||
|
|
||||||
import PamController.status.ModuleStatus;
|
|
||||||
import PamModel.PamModuleInfo;
|
|
||||||
import PamView.PamColors.PamColor;
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
import alfa.ControlledModuleInfo;
|
|
||||||
import alfa.status.StatusMonitor;
|
|
||||||
import alfa.status.StatusObserver;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Swing status display panel to go with the status monitor.
|
|
||||||
* @author Doug Gillespie
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class StatusPanel implements StatusObserver {
|
|
||||||
|
|
||||||
private StatusMonitor statusMonitor;
|
|
||||||
|
|
||||||
private PamPanel statusPanel;
|
|
||||||
|
|
||||||
private PamPanel buttonPanel;
|
|
||||||
|
|
||||||
private StatusButton[] statusButtons;
|
|
||||||
|
|
||||||
public StatusPanel(StatusMonitor statusMonitor) {
|
|
||||||
this.statusMonitor = statusMonitor;
|
|
||||||
statusPanel = new PamPanel(PamColor.BORDER);
|
|
||||||
statusPanel.setBorder(new TitledBorder("Module Status"));
|
|
||||||
buttonPanel = new PamPanel(PamColor.BORDER);
|
|
||||||
statusPanel.setLayout(new BorderLayout());
|
|
||||||
statusPanel.add(buttonPanel, BorderLayout.NORTH);
|
|
||||||
refillButtonPanel();
|
|
||||||
statusMonitor.addObserver(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public JComponent getPanel() {
|
|
||||||
return statusPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void refillButtonPanel() {
|
|
||||||
buttonPanel.removeAll();
|
|
||||||
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
|
|
||||||
ArrayList<ControlledModuleInfo> list = statusMonitor.getModulesList();
|
|
||||||
if (list == null) {
|
|
||||||
statusButtons = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
statusButtons = new StatusButton[list.size()];
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
statusButtons[i] = new StatusButton(list.get(i).getDefaultName());
|
|
||||||
buttonPanel.add(statusButtons[i].getComponent());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void newModuleList() {
|
|
||||||
refillButtonPanel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void newStatus() {
|
|
||||||
updateAllStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateAllStatus() {
|
|
||||||
if (statusButtons == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ModuleStatus[] statuss = statusMonitor.getModuleStatus();
|
|
||||||
if (statuss == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (statuss.length != statusButtons.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
boolean[] existss = statusMonitor.getModuleExists();
|
|
||||||
for (int i = 0; i < statuss.length; i++) {
|
|
||||||
statusButtons[i].setStatus(existss[i], statuss[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,243 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import java.awt.GridBagConstraints;
|
|
||||||
import java.awt.GridBagLayout;
|
|
||||||
import java.awt.Window;
|
|
||||||
|
|
||||||
import javax.swing.BoxLayout;
|
|
||||||
import javax.swing.ButtonGroup;
|
|
||||||
import javax.swing.JCheckBox;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JLabel;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.JRadioButton;
|
|
||||||
import javax.swing.JTabbedPane;
|
|
||||||
import javax.swing.JTextField;
|
|
||||||
import javax.swing.border.TitledBorder;
|
|
||||||
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamView.dialog.PamDialog;
|
|
||||||
import PamView.dialog.PamDialogPanel;
|
|
||||||
import PamView.dialog.PamGridBagContraints;
|
|
||||||
import PamView.panel.WestAlignedPanel;
|
|
||||||
import PamguardMVC.dataSelector.DataSelector;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import alfa.ALFAParameters;
|
|
||||||
import loggerForms.FormDescription;
|
|
||||||
|
|
||||||
public class ALFADialog extends PamDialog {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
private static ALFADialog singleInstance;
|
|
||||||
|
|
||||||
private ALFAControl alfaControl;
|
|
||||||
|
|
||||||
private ALFAParameters alfaParameters;
|
|
||||||
|
|
||||||
private JTextField effIntNoWhales;
|
|
||||||
|
|
||||||
// private JTextField effIntWhales;
|
|
||||||
private JTextField histosPerInterval, binsPerHisto;
|
|
||||||
|
|
||||||
private JCheckBox reloadOldReports;
|
|
||||||
|
|
||||||
private JCheckBox launchScreenMirror;
|
|
||||||
|
|
||||||
private PamDialogPanel loggerPanel;
|
|
||||||
|
|
||||||
private PamDialogPanel loggerDialogPanel;
|
|
||||||
|
|
||||||
private JRadioButton loggerComma, loggerJson, loggerXML;
|
|
||||||
|
|
||||||
private JRadioButton jRadioButtonClks;
|
|
||||||
|
|
||||||
private JRadioButton jRadioButtonTrns;
|
|
||||||
|
|
||||||
private JCheckBox followOffline;
|
|
||||||
|
|
||||||
private static final int TSCALE = 60;
|
|
||||||
|
|
||||||
private ALFADialog(Window parentFrame, ALFAControl alfaControl) {
|
|
||||||
super(parentFrame, alfaControl.getUnitName() + " options", true);
|
|
||||||
this.alfaControl = alfaControl;
|
|
||||||
JTabbedPane tabPane = new JTabbedPane();
|
|
||||||
JPanel reportPanel = new JPanel(new GridBagLayout());
|
|
||||||
GridBagConstraints c = new PamGridBagContraints();
|
|
||||||
reportPanel.setBorder(new TitledBorder("Effort Intervals"));
|
|
||||||
|
|
||||||
c.gridwidth = 3;
|
|
||||||
reportPanel.add(new JLabel("DataType ", JLabel.LEFT), c);
|
|
||||||
c.gridy++;
|
|
||||||
jRadioButtonClks = new JRadioButton("No. Clicks in Trains");
|
|
||||||
reportPanel.add(jRadioButtonClks, c);
|
|
||||||
c.gridy++;
|
|
||||||
jRadioButtonTrns= new JRadioButton("Click Trains");
|
|
||||||
reportPanel.add(jRadioButtonTrns, c);
|
|
||||||
c.gridy++;
|
|
||||||
|
|
||||||
ButtonGroup group = new ButtonGroup();
|
|
||||||
group.add(jRadioButtonClks);
|
|
||||||
group.add(jRadioButtonTrns);
|
|
||||||
|
|
||||||
c.gridwidth = 3;
|
|
||||||
reportPanel.add(new JLabel("Standard Reporting Intervals ", JLabel.LEFT), c);
|
|
||||||
c.gridwidth = 1;
|
|
||||||
c.gridy++;
|
|
||||||
reportPanel.add(new JLabel("Reporting interval ", JLabel.RIGHT), c);
|
|
||||||
c.gridx++;
|
|
||||||
reportPanel.add(effIntNoWhales = new JTextField(5), c);
|
|
||||||
c.gridx++;
|
|
||||||
reportPanel.add(new JLabel( "(minutes)"), c);
|
|
||||||
c.gridx = 0;
|
|
||||||
c.gridy++;
|
|
||||||
reportPanel.add(new JLabel("Angle Histograms ", JLabel.RIGHT), c);
|
|
||||||
c.gridx++;
|
|
||||||
reportPanel.add(histosPerInterval = new JTextField(5), c);
|
|
||||||
c.gridx++;
|
|
||||||
reportPanel.add(new JLabel( "(per report)"), c);
|
|
||||||
c.gridx = 0;
|
|
||||||
c.gridy++;
|
|
||||||
reportPanel.add(new JLabel("Bins per Histogram ", JLabel.RIGHT), c);
|
|
||||||
c.gridx++;
|
|
||||||
reportPanel.add(binsPerHisto = new JTextField(5), c);
|
|
||||||
c.gridy++;
|
|
||||||
c.gridx = 0;
|
|
||||||
c.gridwidth = 3;
|
|
||||||
reportPanel.add(reloadOldReports = new JCheckBox("Reload old reports at start up"), c);
|
|
||||||
tabPane.add("Messaging", reportPanel);
|
|
||||||
|
|
||||||
DataSelector loggerformsSelector = alfaControl.getLoggerMonitor().getFormsSelector();
|
|
||||||
JPanel logStPanel = new JPanel(new GridBagLayout());
|
|
||||||
GridBagConstraints lc = new PamGridBagContraints();
|
|
||||||
loggerComma = new JRadioButton("Comma separated");
|
|
||||||
loggerJson = new JRadioButton("JSON String");
|
|
||||||
loggerXML = new JRadioButton("XML");
|
|
||||||
ButtonGroup bg = new ButtonGroup();
|
|
||||||
bg.add(loggerComma);
|
|
||||||
bg.add(loggerJson);
|
|
||||||
bg.add(loggerXML);
|
|
||||||
logStPanel.setBorder(new TitledBorder("Message Style"));
|
|
||||||
logStPanel.add(loggerComma, c);
|
|
||||||
c.gridy++;
|
|
||||||
logStPanel.add(loggerJson,c);
|
|
||||||
// c.gridy++;
|
|
||||||
// logStPanel.add(loggerXML,c);
|
|
||||||
if (loggerformsSelector != null) {
|
|
||||||
loggerDialogPanel = loggerformsSelector.getDialogPanel();
|
|
||||||
JPanel lp = new JPanel();
|
|
||||||
lp.setLayout(new BoxLayout(lp, BoxLayout.Y_AXIS));
|
|
||||||
lp.add(logStPanel);
|
|
||||||
lp.add(loggerDialogPanel.getDialogComponent());
|
|
||||||
tabPane.addTab("Logger Forms", lp);
|
|
||||||
}
|
|
||||||
|
|
||||||
JPanel dispPanel = new JPanel(new GridBagLayout());
|
|
||||||
dispPanel.setBorder(new TitledBorder("Display Options"));
|
|
||||||
c = new PamGridBagContraints();
|
|
||||||
dispPanel.add(launchScreenMirror = new JCheckBox("Launch Screen Mirror"), c);
|
|
||||||
tabPane.add("Display", dispPanel);
|
|
||||||
|
|
||||||
followOffline = new JCheckBox("Follow data offline");
|
|
||||||
followOffline.setToolTipText("Automaticlly check server for new data arrival, update data map and display");
|
|
||||||
if (PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW) {
|
|
||||||
JPanel offlinePanel = new JPanel(new GridBagLayout());
|
|
||||||
offlinePanel.setBorder(new TitledBorder("Offline"));
|
|
||||||
c = new PamGridBagContraints();
|
|
||||||
offlinePanel.add(followOffline, c);
|
|
||||||
tabPane.add("Offline", offlinePanel);
|
|
||||||
}
|
|
||||||
|
|
||||||
effIntNoWhales.setToolTipText("Interval for sending ship track data ");
|
|
||||||
// effIntWhales.setToolTipText("Interval for sending data when whale have been detected");
|
|
||||||
histosPerInterval.setToolTipText("Number of angle histograms per reporting interval");
|
|
||||||
binsPerHisto.setToolTipText("Number of angle bins per histogram");
|
|
||||||
reloadOldReports.setToolTipText("Reload old reports when the system restarts");
|
|
||||||
|
|
||||||
setDialogComponent(tabPane);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ALFAParameters showDialog(Window parentFrame, ALFAControl alfaControl) {
|
|
||||||
// if (singleInstance == null || singleInstance.getOwner() != parentFrame || singleInstance.alfaControl != alfaControl) {
|
|
||||||
singleInstance = new ALFADialog(parentFrame, alfaControl);
|
|
||||||
// }
|
|
||||||
singleInstance.setParams(alfaControl.getAlfaParameters().clone());
|
|
||||||
singleInstance.setVisible(true);
|
|
||||||
return singleInstance.alfaParameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setParams(ALFAParameters alfaParameters) {
|
|
||||||
this.alfaParameters = alfaParameters;
|
|
||||||
|
|
||||||
effIntNoWhales.setText(String.format("%d", alfaParameters.effortMsgIntervalNoWhales/TSCALE));
|
|
||||||
histosPerInterval.setText(String.format("%d", alfaParameters.histosPerReportInterval));
|
|
||||||
binsPerHisto.setText(String.format("%d", alfaParameters.getBinsPerhistogram()));
|
|
||||||
reloadOldReports.setSelected(alfaParameters.reloadOldReports);
|
|
||||||
|
|
||||||
loggerComma.setSelected(alfaParameters.loggerFormFormat == FormDescription.LOGGER_FORMS_COMMA);
|
|
||||||
loggerJson.setSelected(alfaParameters.loggerFormFormat == FormDescription.LOGGER_FORMS_JSON);
|
|
||||||
loggerXML.setSelected(alfaParameters.loggerFormFormat == FormDescription.LOGGER_FORMS_XML);
|
|
||||||
|
|
||||||
if (loggerDialogPanel != null) {
|
|
||||||
loggerDialogPanel.setParams();
|
|
||||||
}
|
|
||||||
|
|
||||||
jRadioButtonClks.setSelected(!alfaParameters.useClkTrains);
|
|
||||||
|
|
||||||
launchScreenMirror.setSelected(alfaParameters.autoScreenMirror);
|
|
||||||
followOffline.setSelected(alfaParameters.followOffline);
|
|
||||||
|
|
||||||
this.pack();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getParams() {
|
|
||||||
try {
|
|
||||||
int inval = Integer.valueOf(effIntNoWhales.getText());
|
|
||||||
alfaParameters.effortMsgIntervalNoWhales = inval*TSCALE;
|
|
||||||
inval = Integer.valueOf(histosPerInterval.getText());
|
|
||||||
alfaParameters.histosPerReportInterval = inval;
|
|
||||||
int bins = Integer.valueOf(binsPerHisto.getText());
|
|
||||||
alfaParameters.setBinsPerhistogram(bins);
|
|
||||||
}
|
|
||||||
catch (NumberFormatException e) {
|
|
||||||
return showWarning("Invalid interval data, must be an Integer (whole) number");
|
|
||||||
}
|
|
||||||
if (loggerDialogPanel != null) {
|
|
||||||
if (loggerDialogPanel.getParams() == false) {
|
|
||||||
return showWarning("Error in logger forms selection");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
alfaParameters.reloadOldReports = reloadOldReports.isSelected();
|
|
||||||
alfaParameters.autoScreenMirror = launchScreenMirror.isSelected();
|
|
||||||
|
|
||||||
if (loggerJson.isSelected()) {
|
|
||||||
alfaParameters.loggerFormFormat = FormDescription.LOGGER_FORMS_JSON;
|
|
||||||
}
|
|
||||||
else if (loggerComma.isSelected()) {
|
|
||||||
alfaParameters.loggerFormFormat = FormDescription.LOGGER_FORMS_COMMA;
|
|
||||||
}
|
|
||||||
else if (loggerXML.isSelected()) {
|
|
||||||
alfaParameters.loggerFormFormat = FormDescription.LOGGER_FORMS_XML;
|
|
||||||
}
|
|
||||||
alfaParameters.followOffline = followOffline.isSelected();
|
|
||||||
|
|
||||||
|
|
||||||
if (this.jRadioButtonClks.isSelected()) alfaParameters.useClkTrains = false;
|
|
||||||
else alfaParameters.useClkTrains = true;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void cancelButtonPressed() {
|
|
||||||
alfaParameters = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void restoreDefaultSettings() {
|
|
||||||
setParams(new ALFAParameters());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,189 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import java.awt.ComponentOrientation;
|
|
||||||
import java.awt.Container;
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Font;
|
|
||||||
import java.awt.GridBagConstraints;
|
|
||||||
import java.awt.GridBagLayout;
|
|
||||||
import java.awt.Insets;
|
|
||||||
import java.awt.Rectangle;
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import javax.swing.ImageIcon;
|
|
||||||
import javax.swing.JButton;
|
|
||||||
import javax.swing.JMenu;
|
|
||||||
import javax.swing.JMenuBar;
|
|
||||||
import javax.swing.JMenuItem;
|
|
||||||
import javax.swing.JPopupMenu;
|
|
||||||
import javax.swing.JTabbedPane;
|
|
||||||
import javax.swing.SwingUtilities;
|
|
||||||
import javax.swing.event.ChangeEvent;
|
|
||||||
import javax.swing.event.ChangeListener;
|
|
||||||
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamView.FullScreen;
|
|
||||||
import PamView.GuiFrameManager;
|
|
||||||
import PamView.PamGui;
|
|
||||||
import PamView.panel.PamTabbedPane;
|
|
||||||
import PamguardMVC.debug.Debug;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the PAMGuard <i>Swing<i> GUI to make it more touch friendly and remove some clutter so that
|
|
||||||
* the UI is a little easier to use on tablets.
|
|
||||||
*
|
|
||||||
* @author Jamie Macaulay
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ALFAGUITransformer {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The height of the main tabs
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static final int TABHEIGHT = 65;
|
|
||||||
|
|
||||||
public static final int TABWIDTH = 90;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The main menu
|
|
||||||
*/
|
|
||||||
private JPopupMenu menu;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reference ot hte GUI frame manager.
|
|
||||||
*/
|
|
||||||
private GuiFrameManager guiFrameManager;
|
|
||||||
|
|
||||||
private Container glassPane;
|
|
||||||
|
|
||||||
public static ImageIcon settings = new ImageIcon(ClassLoader
|
|
||||||
.getSystemResource("Resources/MenuButton.png"));
|
|
||||||
|
|
||||||
public ALFAGUITransformer(ALFAControl alfaControl) {
|
|
||||||
|
|
||||||
this.guiFrameManager = PamController.getInstance().getGuiFrameManager();
|
|
||||||
|
|
||||||
//set the tab size.
|
|
||||||
|
|
||||||
guiFrameManager.getFrameGui(0).setTabsSize(new Dimension(TABWIDTH, TABHEIGHT));
|
|
||||||
|
|
||||||
//guiFrameManager.getFrameGui(0).setTabFont(new Font(null, Font.BOLD, 16));
|
|
||||||
|
|
||||||
//get rid of the top tool bar
|
|
||||||
guiFrameManager.getFrameGui(0).setToolBarVisible(false);
|
|
||||||
|
|
||||||
|
|
||||||
guiFrameManager.getFrameGui(0).getSidePanel().showPanel(true);
|
|
||||||
guiFrameManager.getFrameGui(0).getSidePanel().disableShowButton(true);
|
|
||||||
|
|
||||||
|
|
||||||
//total HACK to add button to tab pane
|
|
||||||
SwingUtilities.invokeLater(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
addButtonToPane(guiFrameManager.getFrameGui(0));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
//get rid of all those menus that are going to confuse folk.
|
|
||||||
guiFrameManager.getFrameGui(0).getGuiFrame().setJMenuBar(null);
|
|
||||||
setMenuItems();
|
|
||||||
FullScreen.setGoFullScreen(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the menu items
|
|
||||||
*/
|
|
||||||
private synchronized void setMenuItems() {
|
|
||||||
|
|
||||||
guiFrameManager.getFrameGui(0).getGuiFrame().setJMenuBar(null);
|
|
||||||
|
|
||||||
if (menu!=null) {
|
|
||||||
menu.removeAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
JMenuBar menuBar = guiFrameManager.getFrameGui(0).makeGuiMenu();
|
|
||||||
|
|
||||||
// for (int i=0; i<menuBar.getMenuCount(); i++) {
|
|
||||||
// Debug.out.println("ALFA 2: MenuBar: " + menuBar.getMenu(i).getText() + " N: " + menuBar.getMenuCount());
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (menu!=null && menuBar!=null) {
|
|
||||||
final int count = menuBar.getMenuCount();
|
|
||||||
ArrayList<JMenu> newMenuItems = new ArrayList<JMenu>();
|
|
||||||
for (int i=0; i<count; i++) {
|
|
||||||
//Debug.out.println("MenuBar: " + menuBar.getMenu(i).getText()+ " N: " + menuBar.getMenuCount() );
|
|
||||||
|
|
||||||
newMenuItems.add(menuBar.getMenu(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
//another total HACK. Don;t know why but simply adding one menu item from another cause all sorts of issues...
|
|
||||||
//maybe should replace with while loops
|
|
||||||
for (int i=0; i<count; i++) {
|
|
||||||
menu.add(newMenuItems.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add button to the tab pane with all menus etc. Again, pretty HACKY with a glass pane to put button on.
|
|
||||||
* @param gui -the gui frame to add the button to.
|
|
||||||
*/
|
|
||||||
private void addButtonToPane(PamGui gui) {
|
|
||||||
|
|
||||||
PamTabbedPane tabbedPane = gui.getTabbedPane();
|
|
||||||
tabbedPane.setTabsDrag(false);
|
|
||||||
// Rectangle tabBounds = tabbedPane.getBoundsAt(0);
|
|
||||||
|
|
||||||
glassPane = (Container) gui.getGuiFrame().getGlassPane();
|
|
||||||
glassPane.setVisible(true);
|
|
||||||
glassPane.setLayout(new GridBagLayout());
|
|
||||||
GridBagConstraints gbc = new GridBagConstraints();
|
|
||||||
gbc.weightx = 1.0;
|
|
||||||
gbc.weighty = 1.0;
|
|
||||||
gbc.fill = GridBagConstraints.NONE;
|
|
||||||
gbc.insets = new Insets(0, 0, 0, 0);
|
|
||||||
gbc.anchor = GridBagConstraints.NORTHEAST;
|
|
||||||
|
|
||||||
JButton button = new JButton(settings);
|
|
||||||
//navigation menu
|
|
||||||
|
|
||||||
button.setPreferredSize(new Dimension(button.getPreferredSize().width,
|
|
||||||
(int) TABHEIGHT+5));
|
|
||||||
glassPane.add(button, gbc);
|
|
||||||
|
|
||||||
menu = new JPopupMenu();
|
|
||||||
menu.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
|
|
||||||
|
|
||||||
button.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent ev) {
|
|
||||||
menu.show(button, 0, button.getBounds().height);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
ChangeListener changeListener = new ChangeListener() {
|
|
||||||
public void stateChanged(ChangeEvent changeEvent) {
|
|
||||||
glassPane.setVisible(true); //HACK
|
|
||||||
setMenuItems();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
tabbedPane.addChangeListener(changeListener);
|
|
||||||
// button.setPreferredSize(new Dimension(button.getPreferredSize().width,
|
|
||||||
// (int) tabBounds.getHeight() - 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notification passed from controller to the GUI transformer
|
|
||||||
* @param changeType - the change type flag.
|
|
||||||
*/
|
|
||||||
public synchronized void notifyModelChanged(int changeType) {
|
|
||||||
setMenuItems();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Layout options for ALFA data display.
|
|
||||||
* Made interface so can play with a few different ideas.
|
|
||||||
* @author Doug
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public interface ALFALayout {
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return component to slot into CENTER of main display area.
|
|
||||||
*/
|
|
||||||
public JComponent getComponent();
|
|
||||||
|
|
||||||
public void setOptionsComponent(JComponent optionsComponent);
|
|
||||||
|
|
||||||
public void setWestStatusComponent(JComponent statusComponent);
|
|
||||||
|
|
||||||
public void setMapComponent(JComponent mapComponent);
|
|
||||||
|
|
||||||
public void setSpermSummaryComponents(JComponent spermSummary);
|
|
||||||
|
|
||||||
public void setCommsComponent(JComponent commsComponent);
|
|
||||||
|
|
||||||
public void setNorthStatusComponents(JComponent northComponent);
|
|
||||||
|
|
||||||
public void setHelpcomponent(JComponent helpComponent);
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.awt.GridLayout;
|
|
||||||
|
|
||||||
import javax.swing.BoxLayout;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JTabbedPane;
|
|
||||||
import javax.swing.border.TitledBorder;
|
|
||||||
|
|
||||||
import PamView.PamColors.PamColor;
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
|
|
||||||
public class ALFALayout1 implements ALFALayout {
|
|
||||||
|
|
||||||
private PamPanel alfaPanel;
|
|
||||||
|
|
||||||
private PamPanel mainCentral, mainNorth, mainSplit, mainWest;
|
|
||||||
private PamPanel splitWestNorth, splitWestSouth, splitWest, splitEast, helpPane;
|
|
||||||
|
|
||||||
public ALFALayout1() {
|
|
||||||
|
|
||||||
alfaPanel = new PamPanel(new BorderLayout());
|
|
||||||
mainCentral = new PamPanel(new BorderLayout());
|
|
||||||
mainWest = new PamPanel(new BorderLayout());
|
|
||||||
mainNorth = new PamPanel();
|
|
||||||
mainSplit = new PamPanel();
|
|
||||||
splitWest = new PamPanel();
|
|
||||||
splitEast = new PamPanel(new BorderLayout());
|
|
||||||
splitWestNorth = new PamPanel();
|
|
||||||
splitWestSouth = new PamPanel();
|
|
||||||
helpPane = new PamPanel(new BorderLayout());
|
|
||||||
|
|
||||||
JTabbedPane tabbedPane = new JTabbedPane();
|
|
||||||
tabbedPane.addTab("Messaging", mainCentral);
|
|
||||||
tabbedPane.addTab("HELP", helpPane);
|
|
||||||
|
|
||||||
alfaPanel.setLayout(new BorderLayout());
|
|
||||||
alfaPanel.add(BorderLayout.CENTER, tabbedPane);
|
|
||||||
alfaPanel.add(BorderLayout.WEST, mainWest);
|
|
||||||
|
|
||||||
mainCentral.setLayout(new BorderLayout());
|
|
||||||
mainCentral.add(BorderLayout.NORTH, mainNorth);
|
|
||||||
mainCentral.add(BorderLayout.CENTER, mainSplit);
|
|
||||||
// mainSplit.setLayout(new BoxLayout(mainSplit, BoxLayout.X_AXIS));
|
|
||||||
mainSplit.setLayout(new GridLayout(1, 1));
|
|
||||||
mainSplit.add(splitWest);
|
|
||||||
// mainSplit.add(splitEast);
|
|
||||||
// splitWest.setLayout(new BoxLayout(splitWest, BoxLayout.Y_AXIS));
|
|
||||||
splitWest.setLayout(new GridLayout(2, 1));
|
|
||||||
splitWest.add(splitWestNorth);
|
|
||||||
splitWest.add(splitWestSouth);
|
|
||||||
|
|
||||||
// splitEast.setBorder(new TitledBorder("Map"));
|
|
||||||
splitWestNorth.setBorder(new TitledBorder("Sperm Whales"));
|
|
||||||
splitWestSouth.setBorder(new TitledBorder("Comms"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JComponent getComponent() {
|
|
||||||
return alfaPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setOptionsComponent(JComponent optionsComponent) {
|
|
||||||
mainWest.add(optionsComponent, BorderLayout.NORTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setWestStatusComponent(JComponent statusComponent) {
|
|
||||||
// mainWest.removeAll();
|
|
||||||
mainWest.add(statusComponent, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setMapComponent(JComponent mapComponent) {
|
|
||||||
splitEast.removeAll();
|
|
||||||
splitEast.add(mapComponent);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setSpermSummaryComponents(JComponent spermSummary) {
|
|
||||||
splitWestNorth.setLayout(new BorderLayout());
|
|
||||||
splitWestNorth.setBorder(null);
|
|
||||||
splitWestNorth.removeAll();
|
|
||||||
splitWestNorth.add(spermSummary, BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setCommsComponent(JComponent commsComponent) {
|
|
||||||
splitWestSouth.setLayout(new BorderLayout());
|
|
||||||
splitWestSouth.add(BorderLayout.CENTER, commsComponent);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setNorthStatusComponents(JComponent northComponent) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setHelpcomponent(JComponent helpComponent) {
|
|
||||||
helpPane.setLayout(new BorderLayout());
|
|
||||||
helpPane.add(BorderLayout.CENTER, helpComponent);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
|
|
||||||
import javax.swing.JButton;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.border.TitledBorder;
|
|
||||||
|
|
||||||
import PamView.dialog.PamButton;
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
|
|
||||||
public class ALFAOptionsPanel {
|
|
||||||
|
|
||||||
private ALFAControl alfaControl;
|
|
||||||
|
|
||||||
private JPanel mainPanel;
|
|
||||||
|
|
||||||
private JButton optsButton;
|
|
||||||
|
|
||||||
public ALFAOptionsPanel(ALFAControl alfaControl) {
|
|
||||||
this.alfaControl = alfaControl;
|
|
||||||
mainPanel = new PamPanel();
|
|
||||||
mainPanel.setBorder(new TitledBorder("Options"));
|
|
||||||
optsButton = new PamButton("Settings...");
|
|
||||||
optsButton.addActionListener(new ActionListener() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
optionsButton();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
mainPanel.add(optsButton);
|
|
||||||
}
|
|
||||||
|
|
||||||
public JComponent getComponent() {
|
|
||||||
return mainPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void optionsButton() {
|
|
||||||
alfaControl.showAlfaDialog();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,243 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Font;
|
|
||||||
import java.awt.GridBagConstraints;
|
|
||||||
import java.awt.GridBagLayout;
|
|
||||||
import java.awt.Label;
|
|
||||||
|
|
||||||
import javax.swing.BorderFactory;
|
|
||||||
import javax.swing.ImageIcon;
|
|
||||||
import javax.swing.JButton;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JLabel;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.JSeparator;
|
|
||||||
import javax.swing.SwingConstants;
|
|
||||||
import javax.swing.border.TitledBorder;
|
|
||||||
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamController.status.ModuleStatus;
|
|
||||||
import PamView.PamSidePanel;
|
|
||||||
import PamView.PamSymbol;
|
|
||||||
import PamView.PamSymbolType;
|
|
||||||
import PamView.dialog.PamButton;
|
|
||||||
import PamView.dialog.PamGridBagContraints;
|
|
||||||
import PamView.dialog.PamLabel;
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
import PamguardMVC.debug.Debug;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import alfa.effortmonitor.AngleHistogram;
|
|
||||||
import alfa.status.swing.StatusButton;
|
|
||||||
import alfa.status.swing.StatusButtonSquare;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The side pane holds status info and a big button to start and stop PAMGuard.
|
|
||||||
* @author Jamie Macaulay
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ALFASidePanel implements PamSidePanel {
|
|
||||||
|
|
||||||
private ALFAControl alfaControl;
|
|
||||||
|
|
||||||
private JPanel mainPanel;
|
|
||||||
|
|
||||||
private static String[] whaleButtonNames = {"Ahead", "Abeam", "Astern"};
|
|
||||||
private StatusButton[] whaleStatus = new StatusButton[whaleButtonNames.length];
|
|
||||||
private StatusButton systemStatus;
|
|
||||||
|
|
||||||
private PamPanel mainHolder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The button to start and stop PAMGuard.
|
|
||||||
*/
|
|
||||||
private JButton startStopButton;
|
|
||||||
|
|
||||||
private static final int BUTTONSIZE = 40;
|
|
||||||
|
|
||||||
private static final int BUTTONWIDTH = 220;
|
|
||||||
|
|
||||||
|
|
||||||
public ALFASidePanel(ALFAControl alfaControl) {
|
|
||||||
|
|
||||||
|
|
||||||
this.alfaControl = alfaControl;
|
|
||||||
|
|
||||||
//button
|
|
||||||
mainHolder = new PamPanel(new BorderLayout());
|
|
||||||
startStopButton = new JButton();
|
|
||||||
startStopButton.setPreferredSize(new Dimension(BUTTONWIDTH, ALFAGUITransformer.TABHEIGHT));
|
|
||||||
startStopButton.setHorizontalAlignment(SwingConstants.CENTER);
|
|
||||||
|
|
||||||
startStopButton.addActionListener((action )->{
|
|
||||||
if (PamController.getInstance().getPamStatus() == PamController.PAM_RUNNING) {
|
|
||||||
// Debug.out.println("ALFA: PAMStop Pressed!!!--------------------");
|
|
||||||
PamController.getInstance().toolBarStopButton(null);
|
|
||||||
}
|
|
||||||
else if (PamController.getInstance().getPamStatus() == PamController.PAM_IDLE) {
|
|
||||||
// Debug.out.println("ALFA: PAMStart Pressed!!!--------------------");
|
|
||||||
PamController.getInstance().pamStart();
|
|
||||||
}
|
|
||||||
//button decoration occurs on notification
|
|
||||||
});
|
|
||||||
|
|
||||||
setStartStopStatus(false);
|
|
||||||
|
|
||||||
//the status pane
|
|
||||||
Color clearColour = new Color(0,0,0,0);
|
|
||||||
for (int i = 0; i < whaleButtonNames.length; i++) {
|
|
||||||
whaleStatus[i] = new StatusButton(whaleButtonNames[i], new Dimension(BUTTONWIDTH, ALFAGUITransformer.TABHEIGHT/2));
|
|
||||||
whaleStatus[i].setColor(0, clearColour);
|
|
||||||
whaleStatus[i].setStatus(true, new ModuleStatus(ModuleStatus.STATUS_OK));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// whaleStatus = new StatusButton(" Whales");
|
|
||||||
systemStatus = new StatusButtonSquare("System Diagnostics",new Dimension(BUTTONWIDTH, ALFAGUITransformer.TABHEIGHT));
|
|
||||||
|
|
||||||
mainPanel = new PamPanel();
|
|
||||||
mainPanel.setLayout(new GridBagLayout());
|
|
||||||
//mainPanel.setBorder(new TitledBorder("Status"));
|
|
||||||
GridBagConstraints c = new PamGridBagContraints();
|
|
||||||
|
|
||||||
// mainPanel.add(new PamView.dialog.PamLabel("System", JLabel.CENTER),c);
|
|
||||||
// c.gridx++;
|
|
||||||
// mainPanel.add(new PamView.dialog.PamLabel("Whales", JLabel.CENTER),c);
|
|
||||||
// c.gridx = 0;
|
|
||||||
// c.gridy++;
|
|
||||||
c.gridx = 0;
|
|
||||||
c.gridwidth=3;
|
|
||||||
c.gridheight=3;
|
|
||||||
if (!alfaControl.isViewer()) mainPanel.add(systemStatus.getComponent(),c);
|
|
||||||
|
|
||||||
c.gridwidth=1;
|
|
||||||
c.gridheight=1;
|
|
||||||
c.gridx = 2;
|
|
||||||
c.gridy ++;
|
|
||||||
c.gridy ++;
|
|
||||||
mainPanel.add(new JLabel("Sperm Whale Detections"),c);
|
|
||||||
c.gridy ++;
|
|
||||||
mainPanel.add(whaleStatus[0].getComponent(),c);
|
|
||||||
c.gridy ++;
|
|
||||||
mainPanel.add(whaleStatus[1].getComponent(),c);
|
|
||||||
c.gridy ++;
|
|
||||||
mainPanel.add(whaleStatus[2].getComponent(),c);
|
|
||||||
|
|
||||||
//advanced label
|
|
||||||
c.gridy ++;
|
|
||||||
c.gridwidth=3;
|
|
||||||
mainPanel.add(new JSeparator(),c);
|
|
||||||
|
|
||||||
PamLabel advLabel = new PamLabel("System Details", SwingConstants.CENTER);
|
|
||||||
//advLabel.setPreferredSize(new Dimension(BUTTONWIDTH, 2*BUTTONSIZE));
|
|
||||||
advLabel.setFont(new Font(null, Font.BOLD, 20));
|
|
||||||
advLabel.setVerticalTextPosition(JLabel.BOTTOM);
|
|
||||||
|
|
||||||
if (!alfaControl.isViewer()) mainHolder.add(BorderLayout.NORTH, startStopButton);
|
|
||||||
mainHolder.add(BorderLayout.CENTER, mainPanel);
|
|
||||||
if (!alfaControl.isViewer()) mainHolder.add(BorderLayout.SOUTH, advLabel);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the status of the go button.
|
|
||||||
* @param running
|
|
||||||
*/
|
|
||||||
public synchronized void setStartStopStatus(boolean running) {
|
|
||||||
//Debug.out.println("ALFA:p Run: !!" + running);
|
|
||||||
startStopButton.setFont(new Font(null, Font.BOLD, 20));
|
|
||||||
if (!running) {
|
|
||||||
startStopButton.setText("Press to Start");
|
|
||||||
// startStopButton.setBackground(Color.GREEN);
|
|
||||||
// startStopButton.setOpaque(true);
|
|
||||||
//startStopButton.setBorderPainted(false);
|
|
||||||
// startStopButton.setIcon( new PamSymbol(PamSymbolType.SYMBOL_TRIANGLER, 25, 25, true,
|
|
||||||
// Color.BLACK, Color.BLACK));
|
|
||||||
|
|
||||||
startStopButton.setBorder(BorderFactory.createLineBorder(Color.GREEN, 5)); // Line Border + Thickness of the Border }
|
|
||||||
startStopButton.setIconTextGap(1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
startStopButton.setText("Press to Stop");
|
|
||||||
// startStopButton.setOpaque(true);
|
|
||||||
// startStopButton.setBackground(Color.GRAY);
|
|
||||||
// startStopButton.setIcon( new PamSymbol(PamSymbolType.SYMBOL_SQUARE, 25, 25, true,
|
|
||||||
// Color.BLACK, Color.BLACK));
|
|
||||||
startStopButton.setBorder(BorderFactory.createLineBorder(Color.GRAY, 5)); // Line Border + Thickness of the Border }
|
|
||||||
|
|
||||||
}
|
|
||||||
startStopButton.repaint();
|
|
||||||
startStopButton.validate();
|
|
||||||
startStopButton.repaint();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JComponent getPanel() {
|
|
||||||
return mainHolder;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void rename(String newName) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void statusUpdate() {
|
|
||||||
systemStatus.setStatus(true, alfaControl.getModuleStatus());
|
|
||||||
|
|
||||||
AngleHistogram aHist = alfaControl.getStatusAngleHistogram();
|
|
||||||
if (aHist != null) {
|
|
||||||
double[] data = aHist.getData();
|
|
||||||
double front = data[0];
|
|
||||||
double aft = data[data.length-1];
|
|
||||||
double abeam = aHist.getTotalContent()-front-aft;
|
|
||||||
setButtonState(0, front);
|
|
||||||
setButtonState(1, abeam);
|
|
||||||
setButtonState(2, aft);
|
|
||||||
}
|
|
||||||
// whaleStatus[0].setStatus(true, alfaControl.getWhaleStatus());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the state of the button.
|
|
||||||
* @param i - the state of the button.
|
|
||||||
* @param nClickTrains - the number of click trains.
|
|
||||||
*/
|
|
||||||
private void setButtonState(int i, double nClickTrains) {
|
|
||||||
StatusButton button = whaleStatus[i];
|
|
||||||
int state = ModuleStatus.STATUS_OK;
|
|
||||||
String msg;
|
|
||||||
if (nClickTrains >= 1) {
|
|
||||||
state = ModuleStatus.STATUS_WARNING;
|
|
||||||
}
|
|
||||||
if (nClickTrains >= 3) {
|
|
||||||
state = ModuleStatus.STATUS_ERROR;
|
|
||||||
}
|
|
||||||
msg = String.format("%d click trains detected %s", (int)nClickTrains, whaleButtonNames[i].toLowerCase());
|
|
||||||
|
|
||||||
button.setStatus(true, new ModuleStatus(state, msg));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notification passed from controller to side panel
|
|
||||||
* @param changeType - the change type flag.
|
|
||||||
*/
|
|
||||||
public synchronized void notifyModelChanged(int changeType) {
|
|
||||||
//Debug.out.println("ALFA SIDE PANE: " + changeType);
|
|
||||||
switch (changeType) {
|
|
||||||
case PamController.PAM_RUNNING:
|
|
||||||
setStartStopStatus(true);
|
|
||||||
break;
|
|
||||||
case PamController.PAM_IDLE:
|
|
||||||
setStartStopStatus(false);
|
|
||||||
break;
|
|
||||||
case PamController.PAM_STALLED:
|
|
||||||
setStartStopStatus(false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,83 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import java.awt.Frame;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JMenu;
|
|
||||||
import javax.swing.JToolBar;
|
|
||||||
|
|
||||||
import Map.MapController;
|
|
||||||
import Map.SimpleMap;
|
|
||||||
import PamView.PamTabPanel;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import alfa.help.gui.ALFAHelpPanel;
|
|
||||||
import alfa.status.swing.StatusPanel;
|
|
||||||
|
|
||||||
public class BBSwingTabPanel implements PamTabPanel {
|
|
||||||
|
|
||||||
private ALFAControl alfaControl;
|
|
||||||
|
|
||||||
// private PamPanel mainPanel;
|
|
||||||
|
|
||||||
private StatusPanel statusPanel;
|
|
||||||
|
|
||||||
// private PamPanel mapSpace;
|
|
||||||
|
|
||||||
// private SimpleMap simpleMap;
|
|
||||||
|
|
||||||
private ALFALayout alfaLayout;
|
|
||||||
|
|
||||||
public BBSwingTabPanel(ALFAControl alfaControl) {
|
|
||||||
this.alfaControl = alfaControl;
|
|
||||||
alfaLayout = new ALFALayout1();
|
|
||||||
statusPanel = new StatusPanel(alfaControl.getStatusMonitor());
|
|
||||||
alfaLayout.setWestStatusComponent(statusPanel.getPanel());
|
|
||||||
ALFAOptionsPanel alfaOptionsPanel = new ALFAOptionsPanel(alfaControl);
|
|
||||||
alfaLayout.setOptionsComponent(alfaOptionsPanel.getComponent());
|
|
||||||
alfaLayout.setHelpcomponent(new ALFAHelpPanel(alfaControl).getComponent());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JMenu createMenu(Frame parentFrame) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JComponent getPanel() {
|
|
||||||
return alfaLayout.getComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JToolBar getToolBar() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when units are added or removed.
|
|
||||||
*/
|
|
||||||
public void updateUnits() {
|
|
||||||
// if (mapSpace.getComponentCount() == 0) {
|
|
||||||
// MapController mapCon = bigBrotherControl.findMapController();
|
|
||||||
// if (mapCon != null) {
|
|
||||||
// simpleMap = new SimpleMap(mapCon, false);
|
|
||||||
// mapSpace.setLayout(new BorderLayout());
|
|
||||||
// mapSpace.add(simpleMap, BorderLayout.CENTER);
|
|
||||||
// }
|
|
||||||
//// mapCon.
|
|
||||||
|
|
||||||
// MapController mapCon = alfaControl.findMapController();
|
|
||||||
// if (mapCon != null) {
|
|
||||||
// simpleMap = new SimpleMap(mapCon, false);
|
|
||||||
// alfaLayout.setMapComponent(simpleMap);
|
|
||||||
// }
|
|
||||||
// alfaLayout.setSpermSummaryComponents(bigBrotherControl.getClickMonitorProcess().getSwingComponent());
|
|
||||||
IntervalTablePanel intervalTablePanel = new IntervalTablePanel(alfaControl,alfaControl.getEffortMonitor().getIntervalDataBlock());
|
|
||||||
alfaLayout.setSpermSummaryComponents(intervalTablePanel.getComponent());
|
|
||||||
|
|
||||||
JComponent commsPanel = alfaControl.getMessageProcess().getSwingCommsPanel(SwingMessagePanel.SHOW_OUTGOING);
|
|
||||||
alfaLayout.setCommsComponent(commsPanel);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,423 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import java.awt.BasicStroke;
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Graphics;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.Point;
|
|
||||||
import java.awt.Rectangle;
|
|
||||||
import java.awt.Stroke;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.ListIterator;
|
|
||||||
|
|
||||||
import GPS.GPSControl;
|
|
||||||
import GPS.GPSDataBlock;
|
|
||||||
import GPS.GpsDataUnit;
|
|
||||||
import PamController.PamController;
|
|
||||||
import PamUtils.Coordinate3d;
|
|
||||||
import PamUtils.LatLong;
|
|
||||||
import PamView.ColourArray;
|
|
||||||
import PamView.GeneralProjector;
|
|
||||||
import PamView.GeneralProjector.ParameterType;
|
|
||||||
import PamView.GeneralProjector.ParameterUnits;
|
|
||||||
import PamView.PamColors;
|
|
||||||
import PamView.PamColors.PamColor;
|
|
||||||
import PamView.PamKeyItem;
|
|
||||||
import PamView.PamSymbol;
|
|
||||||
import PamView.PamSymbolType;
|
|
||||||
import PamView.PanelOverlayDraw;
|
|
||||||
import PamguardMVC.PamDataBlock;
|
|
||||||
import PamguardMVC.PamDataUnit;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import alfa.effortmonitor.AngleHistogram;
|
|
||||||
import alfa.effortmonitor.IntervalDataUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws the satellite summary data on the map for the summary module. This shows a ships
|
|
||||||
* track line and the summary localisation data.
|
|
||||||
*
|
|
||||||
* @author Doug Gillespie
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class IntervalOverlayDraw extends PanelOverlayDraw {
|
|
||||||
|
|
||||||
private static PamSymbol defaultSymbol = new PamSymbol();
|
|
||||||
private ALFAControl alfaControl;
|
|
||||||
|
|
||||||
private double[] colourLims = new double[] {0, 400};
|
|
||||||
|
|
||||||
private ColourArray colourArray;
|
|
||||||
private boolean isViewer;
|
|
||||||
|
|
||||||
int DRAW_SEGMENTS = 1;
|
|
||||||
int DRAW_ARROWS = 2;
|
|
||||||
int drawType = DRAW_ARROWS;
|
|
||||||
|
|
||||||
PamSymbol nullSymbol = new PamSymbol(PamSymbolType.SYMBOL_CIRCLE, 5, 5, true, Color.RED, Color.RED);
|
|
||||||
|
|
||||||
public IntervalOverlayDraw(ALFAControl alfaControl) {
|
|
||||||
super(defaultSymbol );
|
|
||||||
this.alfaControl = alfaControl;
|
|
||||||
|
|
||||||
//dodger blue, green, yellow, orange, red.
|
|
||||||
// colourArray = ColourArray.createMultiColouredArray(100, new Color(30, 144, 255), Color.YELLOW, Color.ORANGE, Color.RED);
|
|
||||||
colourArray = ColourArray.createMultiColouredArray(100, Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW, Color.ORANGE, Color.RED);
|
|
||||||
|
|
||||||
// colourArray.setAlpha(255);
|
|
||||||
// colourArray.setAlpha(128);
|
|
||||||
isViewer = PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW;
|
|
||||||
|
|
||||||
checkColorLims();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check the colour limits for click trains.
|
|
||||||
*/
|
|
||||||
private void checkColorLims() {
|
|
||||||
if (this.alfaControl.getAlfaParameters().useClkTrains) {
|
|
||||||
colourLims[0] = 0;
|
|
||||||
colourLims[1] = 10;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
colourLims[0] = 0;
|
|
||||||
colourLims[1] = 400;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canDraw(ParameterType[] parameterTypes, ParameterUnits[] parameterUnits) {
|
|
||||||
if (parameterTypes[0] == ParameterType.LATITUDE
|
|
||||||
&& parameterTypes[1] == ParameterType.LONGITUDE) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Rectangle drawDataUnit(Graphics g, PamDataUnit pamDataUnit, GeneralProjector generalProjector) {
|
|
||||||
Rectangle r = null;
|
|
||||||
if (generalProjector.getParmeterType(0) == ParameterType.LATITUDE
|
|
||||||
&& generalProjector.getParmeterType(1) == ParameterType.LONGITUDE) {
|
|
||||||
r = drawOnMap(g, pamDataUnit, generalProjector);
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Rectangle drawOnMap(Graphics g, PamDataUnit pamDataUnit, GeneralProjector generalProjector) {
|
|
||||||
|
|
||||||
IntervalDataUnit idu = (IntervalDataUnit) pamDataUnit;
|
|
||||||
if (idu.getnClickTrains() == 0) {
|
|
||||||
// return null;
|
|
||||||
}
|
|
||||||
Rectangle r = drawGPSLine(g, idu, generalProjector);
|
|
||||||
if (r == null) {
|
|
||||||
// r = drawEndPoints(g, idu, generalProjector);
|
|
||||||
}
|
|
||||||
ArrayList<AngleHistogram> angleHists = idu.getAngleHistograms();
|
|
||||||
long defHistLength = alfaControl.getAlfaParameters().effortMsgIntervalNoWhales /
|
|
||||||
alfaControl.getAlfaParameters().histosPerReportInterval * 1000;
|
|
||||||
synchronized (angleHists) {
|
|
||||||
int iHist = 0;
|
|
||||||
long histStart, histEnd;
|
|
||||||
for (AngleHistogram angleHist : angleHists) {
|
|
||||||
if (isViewer) {
|
|
||||||
histStart = (long) (idu.getTimeMilliseconds() + idu.getDurationInMilliseconds() / angleHists.size() * iHist);
|
|
||||||
histEnd = (long) (idu.getTimeMilliseconds() + idu.getDurationInMilliseconds() / angleHists.size() * (iHist+1));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
histStart = idu.getTimeMilliseconds() + (iHist*defHistLength);
|
|
||||||
histEnd = histStart+defHistLength;
|
|
||||||
}
|
|
||||||
drawAngleHistogram(g, idu, generalProjector, angleHist, iHist, histStart, histEnd);
|
|
||||||
iHist++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void drawAngleHistogram(Graphics g, IntervalDataUnit pamDataUnit, GeneralProjector generalProjector,
|
|
||||||
AngleHistogram angleHist, int iAngleHist, long histStart, long histEnd) {
|
|
||||||
|
|
||||||
|
|
||||||
Graphics2D g2d = (Graphics2D) g;
|
|
||||||
|
|
||||||
//check colour limits.
|
|
||||||
checkColorLims();
|
|
||||||
|
|
||||||
double[] data = angleHist.getData();
|
|
||||||
|
|
||||||
if (data == null || data.length == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
double angStep = 180/data.length;
|
|
||||||
int[] polyX = new int[4];
|
|
||||||
int[] polyY = new int[4];
|
|
||||||
LatLong ll1 = findGpsPos(histStart, pamDataUnit);
|
|
||||||
LatLong ll2 = findGpsPos(histEnd, pamDataUnit);
|
|
||||||
Point coord1 = generalProjector.getCoord3d(ll1).getXYPoint();
|
|
||||||
Point coord2 = generalProjector.getCoord3d(ll2).getXYPoint();
|
|
||||||
LatLong lll = findGpsPos((histStart+histEnd)/2, pamDataUnit);
|
|
||||||
Coordinate3d c3d0 = generalProjector.getCoord3d(lll);
|
|
||||||
|
|
||||||
if (ll1 == null || ll2 == null || lll == null) return;
|
|
||||||
double angPM = 6;
|
|
||||||
double r = 5000;
|
|
||||||
r = ll1.distanceToMetres(ll2)/2.;
|
|
||||||
if (r == 0) {
|
|
||||||
r = 1000;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Draw the trackline segment coloured by status.
|
|
||||||
*/
|
|
||||||
int nWhale = 0;
|
|
||||||
Color lineCol = PamColors.getInstance().getColor(PamColor.GPSTRACK);
|
|
||||||
for (int i = 0; i < data.length; i++) {
|
|
||||||
nWhale += data[i];
|
|
||||||
}
|
|
||||||
if (nWhale == 1) {
|
|
||||||
lineCol = Color.ORANGE;
|
|
||||||
}
|
|
||||||
else if (nWhale >= 2) {
|
|
||||||
lineCol = Color.RED;
|
|
||||||
}
|
|
||||||
g.setColor(lineCol);
|
|
||||||
Stroke stroke = g2d.getStroke();
|
|
||||||
g2d.setStroke(new BasicStroke(3));
|
|
||||||
g.drawLine(coord1.x, coord1.y, coord2.x, coord2.y);
|
|
||||||
// if (data[i] == 0) {
|
|
||||||
// nullSymbol.setFillColor(lineCol);
|
|
||||||
nullSymbol.setLineColor(lineCol);
|
|
||||||
nullSymbol.draw(g, c3d0.getXYPoint());
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
|
|
||||||
g2d.setStroke(new BasicStroke(5));
|
|
||||||
|
|
||||||
generalProjector.addHoverData(c3d0, pamDataUnit);
|
|
||||||
|
|
||||||
for (int i = 0; i < data.length; i++) {
|
|
||||||
// data[i] = i+1;
|
|
||||||
if (data[i] == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// if (ll1 == null || ll2 == null) {
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
double[] angles;
|
|
||||||
if (i == 0) {
|
|
||||||
double[] aa = {0};
|
|
||||||
angles = aa;
|
|
||||||
// ll2 = ll1;
|
|
||||||
lll = ll2;
|
|
||||||
angPM = angStep;
|
|
||||||
}
|
|
||||||
else if (i == data.length-1) {
|
|
||||||
double[] aa = {180};
|
|
||||||
angles = aa;
|
|
||||||
// ll1 = ll2;
|
|
||||||
lll = ll1;
|
|
||||||
angPM = angStep;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
double ang = ((double) i + 0.5) * angStep;
|
|
||||||
double[] aa = {-ang, ang};
|
|
||||||
angles = aa;
|
|
||||||
angPM = angStep/2;
|
|
||||||
}
|
|
||||||
angPM = 20;
|
|
||||||
// g.drawString("h", (int) c3d0.x, (int) c3d0.y);
|
|
||||||
polyX[0] = (int) c3d0.x;
|
|
||||||
polyY[0] = (int) c3d0.y;
|
|
||||||
// Coordinate3d c3d1 = generalProjector.getCoord3d(ll2);
|
|
||||||
// polyX[1] = (int) c3d1.x;
|
|
||||||
// polyY[1] = (int) c3d1.y;
|
|
||||||
double shipHead = ll1.bearingTo(ll2);
|
|
||||||
for (int s = 0; s < angles.length; s++) {
|
|
||||||
double ang = shipHead + angles[s]-angPM;
|
|
||||||
LatLong ll = lll.travelDistanceMeters(ang, r*.8);
|
|
||||||
Coordinate3d c3d = generalProjector.getCoord3d(ll);
|
|
||||||
polyX[1] = (int) c3d.x;
|
|
||||||
polyY[1] = (int) c3d.y;
|
|
||||||
|
|
||||||
ang = shipHead + angles[s];
|
|
||||||
ll = lll.travelDistanceMeters(ang, r);
|
|
||||||
c3d = generalProjector.getCoord3d(ll);
|
|
||||||
polyX[2] = (int) c3d.x;
|
|
||||||
polyY[2] = (int) c3d.y;
|
|
||||||
|
|
||||||
ang = shipHead + angles[s]+angPM;
|
|
||||||
ll = lll.travelDistanceMeters(ang, r*.8);
|
|
||||||
c3d = generalProjector.getCoord3d(ll);
|
|
||||||
polyX[3] = (int) c3d.x;
|
|
||||||
polyY[3] = (int) c3d.y;
|
|
||||||
|
|
||||||
// Color col = colourArray.checkColour((int) data[i]*2);
|
|
||||||
Color col = colourArray.getColour(data[i], colourLims[0], colourLims[1]);
|
|
||||||
g.setColor(col);
|
|
||||||
|
|
||||||
if (drawType == DRAW_SEGMENTS) {
|
|
||||||
g.fillPolygon(polyX, polyY, 4);
|
|
||||||
int xT = (polyX[2]+polyX[3])/2;
|
|
||||||
int yT = (polyY[2]+polyY[3])/2;
|
|
||||||
g.setColor(Color.black);
|
|
||||||
g.drawString(String.format("%.0f", data[i]), xT, yT);
|
|
||||||
}
|
|
||||||
else if (drawType == DRAW_ARROWS) {
|
|
||||||
g2d.drawLine(polyX[0], polyY[0], polyX[2], polyY[2]);
|
|
||||||
g2d.drawLine(polyX[1], polyY[1], polyX[2], polyY[2]);
|
|
||||||
g2d.drawLine(polyX[3], polyY[3], polyX[2], polyY[2]);
|
|
||||||
int xT = (polyX[2]+polyX[3])/2;
|
|
||||||
int yT = (polyY[2]+polyY[3])/2;
|
|
||||||
g.setColor(Color.black);
|
|
||||||
g.drawString(String.format("%.0f", data[i]), xT, yT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g2d.setStroke(stroke);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* find lat long either from striahg tline in data unit or from tru gps data.
|
|
||||||
* @param histStart
|
|
||||||
* @param pamDataUnit
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private LatLong findGpsPos(long time, IntervalDataUnit pamDataUnit) {
|
|
||||||
// LatLong ll = findRealGPS(time);
|
|
||||||
// if (ll != null) {
|
|
||||||
// return ll;
|
|
||||||
// }
|
|
||||||
double interpFac = (time - pamDataUnit.getTimeMilliseconds()) / pamDataUnit.getDurationInMilliseconds();
|
|
||||||
interpFac = Math.max(0, Math.min(interpFac, 1.));
|
|
||||||
LatLong ll1 = pamDataUnit.getFirstGPSData();
|
|
||||||
LatLong ll2 = pamDataUnit.getLastGPSData();
|
|
||||||
if (ll1 == null || ll2 == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
LatLong ll = new LatLong(ll1.getLatitude() + (ll2.getLatitude()-ll1.getLatitude())*interpFac,
|
|
||||||
ll1.getLongitude() + (ll2.getLongitude()-ll1.getLongitude())*interpFac);
|
|
||||||
return ll;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LatLong findRealGPS(long time) {
|
|
||||||
GPSControl gpsControl = GPSControl.getGpsControl();
|
|
||||||
if (gpsControl == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
GPSDataBlock gpsDataBlock = gpsControl.getGpsDataBlock();
|
|
||||||
if (gpsDataBlock == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
GpsDataUnit gpsDataUnit = gpsDataBlock.getClosestUnitMillis(time);
|
|
||||||
if (gpsDataUnit != null) {
|
|
||||||
return gpsDataUnit.getGpsData();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Rectangle drawGPSLine(Graphics g, IntervalDataUnit idu, GeneralProjector generalProjector) {
|
|
||||||
GPSControl gpsControl = GPSControl.getGpsControl();
|
|
||||||
if (gpsControl == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
GPSDataBlock gpsDataBlock = gpsControl.getGpsDataBlock();
|
|
||||||
if (gpsDataBlock == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// see if we can find some GPS points in this range of track, if so draw a line between them.
|
|
||||||
List<Point> points = new LinkedList<>();
|
|
||||||
Point lastPoint = new Point(-1000, -1000);
|
|
||||||
synchronized (gpsDataBlock.getSynchLock()) {
|
|
||||||
ListIterator<GpsDataUnit> iter = gpsDataBlock.getListIterator(idu.getTimeMilliseconds(), 0, PamDataBlock.MATCH_BEFORE, PamDataBlock.MATCH_BEFORE);
|
|
||||||
if (iter == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
GpsDataUnit gpsDataUnit = iter.next();
|
|
||||||
if (gpsDataUnit.getTimeMilliseconds() > idu.getEndTimeInMilliseconds()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Point p = generalProjector.getCoord3d(gpsDataUnit.getGpsData()).getXYPoint();
|
|
||||||
if (p.equals(lastPoint)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
points.add(p);
|
|
||||||
lastPoint = p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (points.isEmpty()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
lastPoint = points.get(0);
|
|
||||||
g.setColor(Color.RED);
|
|
||||||
ListIterator<Point> pIter = points.listIterator(1);
|
|
||||||
int meanX = lastPoint.x, meanY = lastPoint.y;
|
|
||||||
int minX, maxX, minY, maxY;
|
|
||||||
minX = maxX = meanX;
|
|
||||||
minY = maxY = meanY;
|
|
||||||
while (pIter.hasNext()) {
|
|
||||||
Point p = pIter.next();
|
|
||||||
g.drawLine(lastPoint.x, lastPoint.y, p.x, p.y);
|
|
||||||
lastPoint = p;
|
|
||||||
meanX += p.x;
|
|
||||||
meanY += p.y;
|
|
||||||
minX = Math.min(minX, p.x);
|
|
||||||
maxX = Math.max(maxX, p.x);
|
|
||||||
minY = Math.min(minY, p.y);
|
|
||||||
maxY = Math.max(maxY, p.y);
|
|
||||||
}
|
|
||||||
Coordinate3d meanPt = new Coordinate3d(meanX/points.size(), meanY/points.size());
|
|
||||||
generalProjector.addHoverData(meanPt, idu);
|
|
||||||
|
|
||||||
return new Rectangle(minX, minY, maxX-minX, maxY-minY);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Just draw a straight line between the end points of the segment.
|
|
||||||
* @param g
|
|
||||||
* @param pamDataUnit
|
|
||||||
* @param generalProjector
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private Rectangle drawEndPoints(Graphics g, IntervalDataUnit idu, GeneralProjector generalProjector) {
|
|
||||||
int nTrains = idu.getnClickTrains();
|
|
||||||
if (nTrains == 0) {
|
|
||||||
// return null;
|
|
||||||
}
|
|
||||||
LatLong ll1 = idu.getFirstGPSData();
|
|
||||||
LatLong ll2 = idu.getLastGPSData();
|
|
||||||
if (ll1 == null || ll2 == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
Coordinate3d c3d1 = generalProjector.getCoord3d(ll1);
|
|
||||||
Coordinate3d c3d2 = generalProjector.getCoord3d(ll2);
|
|
||||||
Point pt1 = c3d1.getXYPoint();
|
|
||||||
Point pt2 = c3d2.getXYPoint();
|
|
||||||
g.setColor(Color.RED);
|
|
||||||
g.drawLine(pt1.x, pt1.y, pt2.x, pt2.y);
|
|
||||||
Rectangle r = new Rectangle(Math.min(pt1.y, pt2.x), Math.min(pt1.y, pt2.y),
|
|
||||||
Math.abs(pt1.y-pt2.x), Math.abs(pt1.y-pt2.y));
|
|
||||||
generalProjector.addHoverData(c3d1, idu);
|
|
||||||
generalProjector.addHoverData(c3d2, idu);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PamKeyItem createKeyItem(GeneralProjector generalProjector, int keyType) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHoverText(GeneralProjector generalProjector, PamDataUnit dataUnit, int iSide) {
|
|
||||||
return dataUnit.getSummaryString();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,117 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
|
|
||||||
import GPS.GpsData;
|
|
||||||
import PamUtils.PamCalendar;
|
|
||||||
import PamView.component.DataBlockTableView;
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
import alfa.ALFAControl;
|
|
||||||
import alfa.effortmonitor.AngleHistogram;
|
|
||||||
import alfa.effortmonitor.IntervalDataBlock;
|
|
||||||
import alfa.effortmonitor.IntervalDataUnit;
|
|
||||||
|
|
||||||
public class IntervalTablePanel {
|
|
||||||
|
|
||||||
private IntervalDataBlock intervalDataBlock;
|
|
||||||
|
|
||||||
private IntervalTable intervalTable;
|
|
||||||
|
|
||||||
private PamPanel mainPanel;
|
|
||||||
|
|
||||||
private ALFAControl alfaControl;
|
|
||||||
|
|
||||||
private final String[] baseColumnNames = {"Start", "Position", "End", "Postion", "% Effort", "Trains", "Clicks"};
|
|
||||||
|
|
||||||
public IntervalTablePanel(ALFAControl alfaControl, IntervalDataBlock intervalDataBlock) {
|
|
||||||
this.alfaControl = alfaControl;
|
|
||||||
intervalTable = new IntervalTable(intervalDataBlock);
|
|
||||||
mainPanel = new PamPanel();
|
|
||||||
mainPanel.setLayout(new BorderLayout());
|
|
||||||
mainPanel.add(BorderLayout.CENTER, intervalTable.getComponent());
|
|
||||||
}
|
|
||||||
|
|
||||||
public JComponent getComponent() {
|
|
||||||
return mainPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private class IntervalTable extends DataBlockTableView<IntervalDataUnit>{
|
|
||||||
public IntervalTable(IntervalDataBlock intervalDataBlock) {
|
|
||||||
super(intervalDataBlock, "Monitor intervals");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] getColumnNames() {
|
|
||||||
int nHistos = alfaControl.getAlfaParameters().histosPerReportInterval;
|
|
||||||
String[] columnNames = Arrays.copyOf(baseColumnNames, baseColumnNames.length +nHistos);
|
|
||||||
for (int i = 0; i < nHistos; i++) {
|
|
||||||
columnNames[i+baseColumnNames.length] = "Interval_" + (i+1);
|
|
||||||
}
|
|
||||||
return columnNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getColumnData(IntervalDataUnit dataUnit, int column) {
|
|
||||||
if (dataUnit == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
switch (column) {
|
|
||||||
case 0:
|
|
||||||
return formatTime(dataUnit.getTimeMilliseconds());
|
|
||||||
case 1:
|
|
||||||
GpsData gpsData = dataUnit.getFirstGPSData();
|
|
||||||
if (gpsData == null) {
|
|
||||||
return "no GPS";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return gpsData.formatLatitude() + ", " + gpsData.formatLongitude();
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
return formatTime(dataUnit.getEndTimeInMilliseconds());
|
|
||||||
case 3:
|
|
||||||
GpsData endGpsData = dataUnit.getFirstGPSData();
|
|
||||||
if (endGpsData == null) {
|
|
||||||
return "no GPS";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return endGpsData.formatLatitude() + ", " + endGpsData.formatLongitude();
|
|
||||||
}
|
|
||||||
case 4:
|
|
||||||
double duration = dataUnit.getDurationInMilliseconds();
|
|
||||||
return String.format("%3.0f %% of %s", dataUnit.getPercentEffort(), PamCalendar.formatTime((long) duration));
|
|
||||||
case 5:
|
|
||||||
return dataUnit.getnClickTrains();
|
|
||||||
case 6:
|
|
||||||
return dataUnit.getnClicks();
|
|
||||||
}
|
|
||||||
int iHist = column-baseColumnNames.length;
|
|
||||||
if (iHist < 0) return null;
|
|
||||||
AngleHistogram angleHist = dataUnit.getAngleHistogram(iHist);
|
|
||||||
if (angleHist == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
double[] data = angleHist.getData();
|
|
||||||
if (data == null || data.length == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
String str = String.format("(%.0f",data[0]);
|
|
||||||
for (int i = 1; i < data.length; i++) {
|
|
||||||
str += String.format(",%.0f", data[i]);
|
|
||||||
}
|
|
||||||
str += ")";
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String formatTime(long timeMilliseconds) {
|
|
||||||
return PamCalendar.formatTodaysTime(timeMilliseconds, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
package alfa.swinggui;
|
|
||||||
|
|
||||||
import javax.swing.BoxLayout;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
|
|
||||||
import PamView.panel.PamPanel;
|
|
||||||
import alfa.comms.MessageProcess;
|
|
||||||
import rockBlock.RockBlockControl;
|
|
||||||
import rockBlock.swing.RockBlockMessageInTable;
|
|
||||||
import rockBlock.swing.RockBlockMessageOutTable;
|
|
||||||
|
|
||||||
public class SwingMessagePanel {
|
|
||||||
|
|
||||||
private MessageProcess messageProcess;
|
|
||||||
|
|
||||||
private RockBlockMessageOutTable rockBlockMessageTable;
|
|
||||||
|
|
||||||
private RockBlockMessageInTable messageInTable;
|
|
||||||
|
|
||||||
private PamPanel mainPanel;
|
|
||||||
|
|
||||||
public static final int SHOW_OUTGOING = 0x1;
|
|
||||||
public static final int SHOW_INCOMING = 0x2;
|
|
||||||
public static final int SHOW_BOTH = 0x3;
|
|
||||||
|
|
||||||
public SwingMessagePanel(MessageProcess messageProcess, int showWhat) {
|
|
||||||
this.messageProcess = messageProcess;
|
|
||||||
mainPanel = new PamPanel();
|
|
||||||
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
|
|
||||||
RockBlockControl rockBlockControl = messageProcess.findRockBlock();
|
|
||||||
if (rockBlockControl != null) {
|
|
||||||
rockBlockMessageTable = new RockBlockMessageOutTable(rockBlockControl);
|
|
||||||
if ((showWhat & SHOW_OUTGOING) != 0) {
|
|
||||||
mainPanel.add(rockBlockMessageTable.getComponent());
|
|
||||||
}
|
|
||||||
messageInTable = new RockBlockMessageInTable(rockBlockControl);
|
|
||||||
if ((showWhat & SHOW_INCOMING) != 0) {
|
|
||||||
mainPanel.add(messageInTable.getComponent());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public JComponent getComponent() {
|
|
||||||
return mainPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,82 +0,0 @@
|
|||||||
package alfa.utils;
|
|
||||||
|
|
||||||
import java.awt.AWTException;
|
|
||||||
import java.awt.Robot;
|
|
||||||
import java.awt.event.KeyEvent;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Functions to launch Microsoft Screen mirror service.
|
|
||||||
* We've been unable to work out a way of calling these functions
|
|
||||||
* directly so have instead implemented a system of key strokes.
|
|
||||||
* <p>May end up being very fragile !
|
|
||||||
* @author MER Torp
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class MiraScreen {
|
|
||||||
|
|
||||||
// public static void main(String[] args) {
|
|
||||||
//
|
|
||||||
//// new Stage();
|
|
||||||
// new JFXPanel();
|
|
||||||
//
|
|
||||||
// ObservableList<Screen> screens = Screen.getScreens();
|
|
||||||
// for (Screen s:screens) {
|
|
||||||
// System.out.println(s);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// startMirror();
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
private static volatile boolean running = false;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static boolean startMirror() {
|
|
||||||
if (running) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Thread t = new Thread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
startMirrorFunc();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
t.start();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static synchronized void startMirrorFunc() {
|
|
||||||
Robot robot;
|
|
||||||
running = true;
|
|
||||||
try {
|
|
||||||
robot = new Robot();
|
|
||||||
robot.keyPress(KeyEvent.VK_WINDOWS);
|
|
||||||
robot.keyPress(KeyEvent.VK_K);
|
|
||||||
robot.keyRelease(KeyEvent.VK_WINDOWS);
|
|
||||||
robot.keyRelease(KeyEvent.VK_K);
|
|
||||||
pause(5000);
|
|
||||||
robot.keyPress(KeyEvent.VK_TAB);
|
|
||||||
robot.keyRelease(KeyEvent.VK_TAB);
|
|
||||||
robot.keyPress(KeyEvent.VK_ENTER);
|
|
||||||
robot.keyRelease(KeyEvent.VK_ENTER);
|
|
||||||
robot.keyPress(KeyEvent.VK_ESCAPE);
|
|
||||||
robot.keyRelease(KeyEvent.VK_ESCAPE);
|
|
||||||
} catch (AWTException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
running = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void pause(long millis) {
|
|
||||||
try {
|
|
||||||
Thread.sleep(millis);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -8,6 +8,7 @@ public class BeamFormerLocalisation extends AbstractLocalisation implements Clon
|
|||||||
double[] angles = new double[1];
|
double[] angles = new double[1];
|
||||||
double[] angleErrors = new double[1];
|
double[] angleErrors = new double[1];
|
||||||
|
|
||||||
|
|
||||||
public BeamFormerLocalisation(PamDataUnit pamDataUnit, int locContents, int referenceHydrophones, double[] angles, double angleError) {
|
public BeamFormerLocalisation(PamDataUnit pamDataUnit, int locContents, int referenceHydrophones, double[] angles, double angleError) {
|
||||||
super(pamDataUnit, locContents, referenceHydrophones);
|
super(pamDataUnit, locContents, referenceHydrophones);
|
||||||
this.angles = angles;
|
this.angles = angles;
|
||||||
|
@ -23,6 +23,7 @@ public class OneBandAlarmCounter extends AlarmDecibelCounter implements PamSetti
|
|||||||
this.oneBandControl = oneBandControl;
|
this.oneBandControl = oneBandControl;
|
||||||
PamSettingManager.getInstance().registerSettings(this);
|
PamSettingManager.getInstance().registerSettings(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getValue(int countType, PamDataUnit dataUnit) {
|
public double getValue(int countType, PamDataUnit dataUnit) {
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="ISO-8859-1">
|
|
||||||
<title>ALFA Help Page</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<p>this is a page of help text</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Loading…
Reference in New Issue
Block a user