diff --git a/src/PamguardMVC/PamDataBlock.java b/src/PamguardMVC/PamDataBlock.java index 2ad1d09e..97bd709c 100644 --- a/src/PamguardMVC/PamDataBlock.java +++ b/src/PamguardMVC/PamDataBlock.java @@ -843,6 +843,30 @@ public class PamDataBlock extends PamObservable { return unitsInInterval; } + + /** + * Do data exist which cover the given time range ? + * @param startMillis + * @param endMillis + * @return true if data exist covering that time range. + */ + public boolean hasDataRange(long startMillis, long endMillis) { + PamDataUnit first = null, last = null; + synchronized (synchronizationLock) { + first = getFirstUnit(); + last = getLastUnit(); + } + if (first == null || last == null) { + return false; + } + if (first.getTimeMilliseconds() > startMillis) { + return false; + } + if (last.getEndTimeInMilliseconds() < endMillis) { + return false; + } + return true; + } // recursive search for the correct unit // private Tunit searchFirstUnitAfter(int i1, int i2, long timems) { @@ -1014,6 +1038,9 @@ public class PamDataBlock extends PamObservable { * @return true if we need to reload offline data. */ public boolean needViewerDataLoad(OfflineDataLoadInfo offlineDataLoadInfo) { + if (pamDataUnits.size() == 0) { + return true; + } if (offlineDataLoadInfo.getStartMillis() == currentViewDataStart && offlineDataLoadInfo.getEndMillis() == currentViewDataEnd) { return false; diff --git a/src/PamguardMVC/dataOffline/OfflineDataLoading.java b/src/PamguardMVC/dataOffline/OfflineDataLoading.java index a342f357..c10a716c 100644 --- a/src/PamguardMVC/dataOffline/OfflineDataLoading.java +++ b/src/PamguardMVC/dataOffline/OfflineDataLoading.java @@ -527,7 +527,10 @@ public class OfflineDataLoading { public void notifyOfflineObservers(T pamDataUnit) { if (requestingObservers != null) { for (int i = 0; i < requestingObservers.size(); i++) { - requestingObservers.get(i).addData(pamDataBlock, pamDataUnit); + PamObserver obs = requestingObservers.get(i); + if (obs != null) { + obs.addData(pamDataBlock, pamDataUnit); + } } } diff --git a/src/bearinglocaliser/offline/BLOfflineTask.java b/src/bearinglocaliser/offline/BLOfflineTask.java index 2e0061f2..3f98c031 100644 --- a/src/bearinglocaliser/offline/BLOfflineTask.java +++ b/src/bearinglocaliser/offline/BLOfflineTask.java @@ -4,6 +4,7 @@ import java.util.ListIterator; import PamguardMVC.PamDataBlock; import PamguardMVC.PamDataUnit; +import PamguardMVC.dataOffline.OfflineDataLoadInfo; import bearinglocaliser.BearingLocaliserControl; import bearinglocaliser.BearingProcess; import dataMap.OfflineDataMapPoint; @@ -28,6 +29,9 @@ public class BLOfflineTask extends OfflineTask { @Override public String getName() { + if (bearingLocaliserControl == null) { + return null; + } return bearingLocaliserControl.getUnitName(); } @@ -67,15 +71,21 @@ public class BLOfflineTask extends OfflineTask { if (rawOrFFTBlock == null) { return; } - ListIterator it = rawOrFFTBlock.getListIterator(dataUnit.getTimeMilliseconds(), rawOrFFTBlock.getChannelMap(), - PamDataBlock.MATCH_BEFORE, PamDataBlock.POSITION_BEFORE); - if (it == null || it.hasNext() == false) { - long dataStart = dataUnit.getTimeMilliseconds(); - long dataEnd = dataUnit.getEndTimeInMilliseconds(); - if (dataEnd-dataStart <= 0) { - dataEnd = dataStart + 1000; - } - rawOrFFTBlock.loadViewerData(dataStart, dataEnd, null); + long dataStart = dataUnit.getTimeMilliseconds(); + long dataEnd = dataUnit.getEndTimeInMilliseconds(); + boolean haveData = rawOrFFTBlock.hasDataRange(dataStart, dataEnd); + if (haveData == false) { +// ListIterator it = rawOrFFTBlock.getListIterator(dataUnit.getTimeMilliseconds(), rawOrFFTBlock.getChannelMap(), +// PamDataBlock.MATCH_BEFORE, PamDataBlock.POSITION_BEFORE); +// if (it == null || it.hasNext() == false) { +// if (dataEnd-dataStart <= 0) { +// dataEnd = dataStart + 1000; +// } + OfflineDataLoadInfo offlineLoadInfo = new OfflineDataLoadInfo(dataStart, dataEnd); + offlineLoadInfo.setLoadKeepLayers(2); + rawOrFFTBlock.getOfflineData(offlineLoadInfo); +// System.out.printf("Loaded some FFT data I hope\n"); +// rawOrFFTBlock.loadViewerData(dataStart, dataEnd, null); } } diff --git a/src/dataMap/ScrollingDataPanel.java b/src/dataMap/ScrollingDataPanel.java index bf60c164..04b42aa8 100644 --- a/src/dataMap/ScrollingDataPanel.java +++ b/src/dataMap/ScrollingDataPanel.java @@ -391,6 +391,9 @@ public class ScrollingDataPanel extends PamBorderPanel { public void scrollToData(PamDataBlock dataBlock) { long startTime = dataBlock.getCurrentViewDataStart(); int val = (int) ((startTime - getScreenStartMillis())/1000 - getScreenSeconds()/5) ; + val += hScrollBar.getValue(); +// System.out.printf("Scroll bar %d to %d set %d\n", hScrollBar.getMinimum(), +// hScrollBar.getMaximum(), val); hScrollBar.setValue(val); } diff --git a/src/fftManager/fftorganiser/FFTDataOrganiser.java b/src/fftManager/fftorganiser/FFTDataOrganiser.java index f32d6c8e..093f6f4f 100644 --- a/src/fftManager/fftorganiser/FFTDataOrganiser.java +++ b/src/fftManager/fftorganiser/FFTDataOrganiser.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.List; import java.util.ListIterator; +import PamController.PamController; import PamController.SettingsNameProvider; import PamDetection.RawDataUnit; import PamUtils.PamUtils; @@ -143,6 +144,11 @@ public class FFTDataOrganiser { if (rawOrFFTData == null) { return null; } + +// if (PamController.getInstance().getRunMode() == PamController.RUN_PAMVIEW) { +// checkOfflineDataLoad(rawOrFFTData, pamDataUnit.getTimeMilliseconds(), pamDataUnit.getEndTimeInMilliseconds()); +// } + switch (inputType) { case FFTData: return createFromFFTData(pamDataUnit, sampleRate, channelMap); @@ -157,6 +163,52 @@ public class FFTDataOrganiser { } } + /** + * Called when running offline to try to ensure required raw or fft data are in memory. + * @param sourceData + * @param timeMilliseconds + * @param endTimeInMilliseconds + */ + private boolean checkOfflineDataLoad(PamDataBlock sourceData, long startMilliseconds, long endMilliseconds) { + if (sourceData == null) { + return false; + } + boolean needData = needOfflineDataLoad(sourceData, startMilliseconds, endMilliseconds); + if (needData) { + sourceData.loadViewerData(startMilliseconds, endMilliseconds, null); + } + return needOfflineDataLoad(sourceData, startMilliseconds, endMilliseconds); + } + + /** + * Test to see if we still need to load offline data. + * @param sourceData + * @param startMilliseconds + * @param endMilliseconds + * @return + */ + private boolean needOfflineDataLoad(PamDataBlock sourceData, long startMilliseconds, long endMilliseconds) { + if (sourceData == null) { + return false; + } + synchronized (sourceData.getSynchLock()) { + PamDataUnit first = sourceData.getFirstUnit(); + PamDataUnit last = sourceData.getLastUnit(); + if (first == null || last == null) { + return true; + } + if (first.getTimeMilliseconds() > startMilliseconds) { + return true; + } + if (last.getEndTimeInMilliseconds() < endMilliseconds) { + return true; + } + } + return false; + } + + + /** * Get FFT data units matching in time from the source * @param pamDataUnit data unit we need FFT data for (can be anything, just needs it's times) diff --git a/src/fileOfflineData/OfflineFileList.java b/src/fileOfflineData/OfflineFileList.java index 5395c230..cece0092 100644 --- a/src/fileOfflineData/OfflineFileList.java +++ b/src/fileOfflineData/OfflineFileList.java @@ -3,6 +3,8 @@ package fileOfflineData; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; /** * Make a list of files with the given file filter. @@ -29,6 +31,21 @@ public class OfflineFileList { addFiles(current); return files.size(); } + + public void sortByFileName() { + if (files == null || files.size() == 0) { + return; + } + Collections.sort(files, new Comparator() { + + @Override + public int compare(File file1, File file2) { + String n1 = file1.getName(); + String n2 = file2.getName(); + return n1.compareTo(n2); + } + }); + } private void addFiles(File current) { if (current.exists() == false) {