From e4209c8e4fee926d688839940c4ae43c4b9de10e Mon Sep 17 00:00:00 2001 From: Denny Date: Sat, 2 Jun 2018 09:31:49 -0400 Subject: [PATCH] [WIP] Updates the passport decoder to use the new LTRDecoder. Deprecates the Listener interface method in the MessageFramer to optimize for primitive booleans and reduce impact on memory. Will remove this interface once the AFSK1200 decoders are updated. --- .../github/dsheirer/bits/MessageFramer.java | 10 +- .../github/dsheirer/dsp/fsk/LTRDecoder.java | 15 +- .../dsheirer/dsp/fsk/LTRFSKDecoderLegacy.java | 253 ------------------ .../module/decode/ltrnet/LTRNetDecoder.java | 2 +- .../ltrstandard/LTRStandardDecoder.java | 2 +- .../decode/passport/PassportDecoder.java | 127 ++++----- 6 files changed, 65 insertions(+), 344 deletions(-) delete mode 100644 src/main/java/io/github/dsheirer/dsp/fsk/LTRFSKDecoderLegacy.java diff --git a/src/main/java/io/github/dsheirer/bits/MessageFramer.java b/src/main/java/io/github/dsheirer/bits/MessageFramer.java index 591858c5..3a3acc64 100644 --- a/src/main/java/io/github/dsheirer/bits/MessageFramer.java +++ b/src/main/java/io/github/dsheirer/bits/MessageFramer.java @@ -66,8 +66,7 @@ public class MessageFramer implements Listener, SyncDetectProvider mMessageAssemblers.clear(); } - @Override - public void receive(Boolean bit) + public void receive(boolean bit) { mMatcher.receive(bit); @@ -105,6 +104,13 @@ public class MessageFramer implements Listener, SyncDetectProvider } } + @Deprecated //Legacy support ... remove once all producers are converted to use receive(boolean bit) method + @Override + public void receive(Boolean bit) + { + receive(bit); + } + /** * Causes all messages currently under assembly to be forcibly * sent (ie flushed) to all registered message listeners, and diff --git a/src/main/java/io/github/dsheirer/dsp/fsk/LTRDecoder.java b/src/main/java/io/github/dsheirer/dsp/fsk/LTRDecoder.java index b4a48545..2317af18 100644 --- a/src/main/java/io/github/dsheirer/dsp/fsk/LTRDecoder.java +++ b/src/main/java/io/github/dsheirer/dsp/fsk/LTRDecoder.java @@ -15,6 +15,7 @@ ******************************************************************************/ package io.github.dsheirer.dsp.fsk; +import io.github.dsheirer.bits.MessageFramer; import io.github.dsheirer.dsp.filter.dc.IIRSinglePoleDCRemovalFilter; import io.github.dsheirer.dsp.filter.design.FilterDesignException; import io.github.dsheirer.dsp.filter.fir.FIRFilterSpecification; @@ -89,7 +90,7 @@ public class LTRDecoder implements Listener, ISyncDetectListener protected SynchronizationMonitor mSynchronizationMonitor; private IIRSinglePoleDCRemovalFilter mDCFilter = new IIRSinglePoleDCRemovalFilter(0.99999f); private RealFIRFilter2 mLowPassFilter = new RealFIRFilter2(sLowPassFilterCoefficients); - private Listener mSymbolDecisionListener; + private MessageFramer mMessageFramer; private boolean mSampleDecision; @@ -155,9 +156,9 @@ public class LTRDecoder implements Listener, ISyncDetectListener if(mSampleBuffer.hasSymbol()) { - if(mSymbolDecisionListener != null) + if(mMessageFramer != null) { - mSymbolDecisionListener.receive(mSampleBuffer.getSymbol()); + mMessageFramer.receive(mSampleBuffer.getSymbol()); } mSampleBuffer.resetAndAdjust(-mTimingErrorDetector.getError()); @@ -172,11 +173,11 @@ public class LTRDecoder implements Listener, ISyncDetectListener /** * Registers a listener to receive decoded LTR symbols. * - * @param listener to receive symbols. + * @param messageFramer to receive symbols. */ - public void setListener(Listener listener) + public void setMessageFramer(MessageFramer messageFramer) { - mSymbolDecisionListener = listener; + mMessageFramer = messageFramer; } /** @@ -184,7 +185,7 @@ public class LTRDecoder implements Listener, ISyncDetectListener */ public void removeListener() { - mSymbolDecisionListener = null; + mMessageFramer = null; } diff --git a/src/main/java/io/github/dsheirer/dsp/fsk/LTRFSKDecoderLegacy.java b/src/main/java/io/github/dsheirer/dsp/fsk/LTRFSKDecoderLegacy.java deleted file mode 100644 index 34812d2e..00000000 --- a/src/main/java/io/github/dsheirer/dsp/fsk/LTRFSKDecoderLegacy.java +++ /dev/null @@ -1,253 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package io.github.dsheirer.dsp.fsk; - -import io.github.dsheirer.dsp.filter.Filters; -import io.github.dsheirer.dsp.filter.FloatHalfBandFilter; -import io.github.dsheirer.dsp.filter.FloatHalfBandNoDecimateFilter; -import io.github.dsheirer.dsp.filter.LTRPulseShapingFilter; -import io.github.dsheirer.dsp.filter.SquaringFilter; -import io.github.dsheirer.dsp.filter.Window.WindowType; -import io.github.dsheirer.dsp.filter.cic.RealPrimeCICDecimate; -import io.github.dsheirer.dsp.filter.dc.IIRSinglePoleDCRemovalFilter; -import io.github.dsheirer.dsp.symbol.Slicer; -import io.github.dsheirer.dsp.symbol.Slicer.Output; -import io.github.dsheirer.instrument.Instrumentable; -import io.github.dsheirer.instrument.tap.Tap; -import io.github.dsheirer.instrument.tap.TapGroup; -import io.github.dsheirer.instrument.tap.stream.BinaryTap; -import io.github.dsheirer.instrument.tap.stream.FloatBufferTap; -import io.github.dsheirer.instrument.tap.stream.FloatTap; -import io.github.dsheirer.instrument.tap.stream.SymbolEventTap; -import io.github.dsheirer.sample.Listener; -import io.github.dsheirer.sample.real.RealBuffer; - -import java.util.ArrayList; -import java.util.List; - -public class LTRFSKDecoderLegacy implements Listener, Instrumentable -{ - private RealPrimeCICDecimate mCICDecimator; - - private FloatHalfBandFilter mHBFilter1; - private FloatHalfBandFilter mHBFilter2; - private FloatHalfBandFilter mHBFilter3; - private FloatHalfBandFilter mHBFilter4; - private FloatHalfBandFilter mHBFilter5; - private FloatHalfBandNoDecimateFilter mHBFilter6; - private IIRSinglePoleDCRemovalFilter mDCFilter; - private SquaringFilter mSquaringFilter; - private LTRPulseShapingFilter mPulseShaper; - private Slicer mSlicer; - - private List mAvailableTaps; - private final String TAP_F1_F2 = "LTR FSK Demod Filter1 >< Filter2"; - private final String TAP_F2_F3 = "LTR FSK Demod Filter2 >< Filter3"; - private final String TAP_F3_F4 = "LTR FSK Demod Filter3 >< Filter4"; - private final String TAP_F4_F5 = "LTR FSK Demod Filter4 >< Filter5"; - private final String TAP_F5_F6 = "LTR FSK Demod Filter5 >< Filter6"; - private final String TAP_F6_DT = "LTR FSK Demod Filter6 >< DC Filter"; - private final String TAP_CIC = "LTR FSK Demod CIC Decimator"; - private final String TAP_DT_SF1 = "LTR FSK Demod DC Filter >< Squaring Filter"; - private final String TAP_SF1_PS = "LTR FSK Demod Squaring Filter >< Pulse Shaper"; - private final String TAP_PS_SLICER = "LTR FSK Demod Pulse Shaper >< Slicer"; - private final String TAP_SYMBOL_EVENT = "LTR FSK Demod Symbol Event"; - - /** - * Implements a Logic Trunked Radio sub-audible 300 baud FSK signaling - * decoder. Expects a 48000 sample rate input. - */ - public LTRFSKDecoderLegacy() - { - mCICDecimator = new RealPrimeCICDecimate( 32, 1, 375, 60, WindowType.HAMMING, 2 ); - - mHBFilter1 = new FloatHalfBandFilter( - Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.1002f ); - - mHBFilter2 = new FloatHalfBandFilter( - Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.1002f ); - mHBFilter1.setListener( mHBFilter2 ); - - mHBFilter3 = new FloatHalfBandFilter( - Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.1002f ); - mHBFilter2.setListener( mHBFilter3 ); - - mHBFilter4 = new FloatHalfBandFilter( - Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.1002f ); - mHBFilter3.setListener( mHBFilter4 ); - - mHBFilter5 = new FloatHalfBandFilter( - Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.1002f ); - mHBFilter4.setListener( mHBFilter5 ); - - mHBFilter6 = new FloatHalfBandNoDecimateFilter( - Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.1002f ); - mHBFilter5.setListener( mHBFilter6 ); - - mDCFilter = new IIRSinglePoleDCRemovalFilter( 0.9946f ); - mHBFilter6.setListener( mDCFilter ); - - mSquaringFilter = new SquaringFilter(); - mDCFilter.setListener( mSquaringFilter ); - - mPulseShaper = new LTRPulseShapingFilter(); - mSquaringFilter.setListener( mPulseShaper ); - - mSlicer = new Slicer( Output.NORMAL, 5 ); - mPulseShaper.setListener( mSlicer ); - } - - @Override - public void receive( RealBuffer buffer ) - { - for( float sample: buffer.getSamples() ) - { - mHBFilter1.receive( sample ); - } - - mCICDecimator.receive(buffer); - } - - public void addListener( Listener listener ) - { - mSlicer.setListener( listener ); - } - - public void removeListener( Listener listener ) - { - mSlicer.removeListener( listener ); - } - - @Override - public List getTapGroups() - { - if( mAvailableTaps == null ) - { - mAvailableTaps = new ArrayList(); - - TapGroup group = new TapGroup( "LTR FSK Decoder" ); - - group.add( new FloatTap( TAP_F1_F2, 0, 1.0f ) ); - group.add( new FloatTap( TAP_F2_F3, 8, 0.5f ) ); - group.add( new FloatTap( TAP_F3_F4, 12, 0.25f ) ); - group.add( new FloatTap( TAP_F4_F5, 14, 0.125f ) ); - group.add( new FloatTap( TAP_F5_F6, 15, 0.0625f ) ); - group.add( new FloatTap( TAP_F6_DT, 31, 0.0625f ) ); - group.add( new FloatBufferTap( TAP_CIC, 31, 0.0625f ) ); - group.add( new FloatTap( TAP_DT_SF1, 31, 0.0625f ) ); - group.add( new BinaryTap( TAP_SF1_PS, 33, 0.0625f ) ); - group.add( new BinaryTap( TAP_PS_SLICER, 33, 0.0625f ) ); - group.add( new SymbolEventTap( TAP_SYMBOL_EVENT, 7, 0.0125f ) ); - - mAvailableTaps.add( group ); - } - - return mAvailableTaps; - } - - @Override - public void registerTap( Tap tap ) - { - switch( tap.getName() ) - { - case TAP_CIC: - mCICDecimator.setListener( (FloatBufferTap)tap ); - break; - case TAP_F1_F2: - mHBFilter1.setListener( (FloatTap)tap ); - ((FloatTap)tap).setListener( mHBFilter2 ); - break; - case TAP_F2_F3: - mHBFilter2.setListener( (FloatTap)tap ); - ((FloatTap)tap).setListener( mHBFilter3 ); - break; - case TAP_F3_F4: - mHBFilter3.setListener( (FloatTap)tap ); - ((FloatTap)tap).setListener( mHBFilter4 ); - break; - case TAP_F4_F5: - mHBFilter4.setListener( (FloatTap)tap ); - ((FloatTap)tap).setListener( mHBFilter5 ); - break; - case TAP_F5_F6: - mHBFilter5.setListener( (FloatTap)tap ); - ((FloatTap)tap).setListener( mHBFilter6 ); - break; - case TAP_F6_DT: - mHBFilter6.setListener( (FloatTap)tap ); - ((FloatTap)tap).setListener( mDCFilter ); - break; - case TAP_DT_SF1: - mDCFilter.setListener( (FloatTap)tap ); - ((FloatTap)tap).setListener( mSquaringFilter ); - break; - case TAP_SF1_PS: - mSquaringFilter.setListener( (BinaryTap)tap ); - ((BinaryTap)tap).setListener( mPulseShaper ); - break; - case TAP_PS_SLICER: - mPulseShaper.setListener( (BinaryTap)tap ); - ((BinaryTap)tap).setListener( mSlicer ); - break; - case TAP_SYMBOL_EVENT: - mSlicer.addTap( (SymbolEventTap)tap ); - break; - } - } - - @Override - public void unregisterTap( Tap tap ) - { - switch( tap.getName() ) - { - case TAP_CIC: - mCICDecimator.removeListener(); - break; - case TAP_F1_F2: - mHBFilter1.setListener( mHBFilter2 ); - break; - case TAP_F2_F3: - mHBFilter2.setListener( mHBFilter3 ); - break; - case TAP_F3_F4: - mHBFilter3.setListener( mHBFilter4 ); - break; - case TAP_F4_F5: - mHBFilter4.setListener( mHBFilter5 ); - break; - case TAP_F5_F6: - mHBFilter5.setListener( mHBFilter6 ); - break; - case TAP_F6_DT: - mHBFilter6.setListener( mDCFilter ); - break; - case TAP_DT_SF1: - mDCFilter.setListener( mSquaringFilter ); - break; - case TAP_SF1_PS: - mSquaringFilter.setListener( mPulseShaper ); - break; - case TAP_PS_SLICER: - mPulseShaper.setListener( mSlicer ); - break; - case TAP_SYMBOL_EVENT: - mSlicer.removeTap(); - break; - } - } -} diff --git a/src/main/java/io/github/dsheirer/module/decode/ltrnet/LTRNetDecoder.java b/src/main/java/io/github/dsheirer/module/decode/ltrnet/LTRNetDecoder.java index fa21ad92..b1d35001 100644 --- a/src/main/java/io/github/dsheirer/module/decode/ltrnet/LTRNetDecoder.java +++ b/src/main/java/io/github/dsheirer/module/decode/ltrnet/LTRNetDecoder.java @@ -50,7 +50,7 @@ public class LTRNetDecoder extends Decoder implements IReusableBufferListener, L mLTRMessageFramer = new MessageFramer(SyncPattern.LTR_STANDARD_ISW.getPattern(), LTR_NET_MESSAGE_LENGTH); } - mLTRDecoder.setListener(mLTRMessageFramer); + mLTRDecoder.setMessageFramer(mLTRMessageFramer); mLTRMessageFramer.setSyncDetectListener(mLTRDecoder); mLTRMessageProcessor = new LTRNetMessageProcessor(config.getMessageDirection(), aliasList); mLTRMessageFramer.addMessageListener(mLTRMessageProcessor); diff --git a/src/main/java/io/github/dsheirer/module/decode/ltrstandard/LTRStandardDecoder.java b/src/main/java/io/github/dsheirer/module/decode/ltrstandard/LTRStandardDecoder.java index 1f2ba7db..89043350 100644 --- a/src/main/java/io/github/dsheirer/module/decode/ltrstandard/LTRStandardDecoder.java +++ b/src/main/java/io/github/dsheirer/module/decode/ltrstandard/LTRStandardDecoder.java @@ -51,7 +51,7 @@ public class LTRStandardDecoder extends Decoder implements IReusableBufferListen mLTRMessageFramer = new MessageFramer(SyncPattern.LTR_STANDARD_ISW.getPattern(), LTR_STANDARD_MESSAGE_LENGTH); } - mLTRDecoder.setListener(mLTRMessageFramer); + mLTRDecoder.setMessageFramer(mLTRMessageFramer); mLTRMessageFramer.setSyncDetectListener(mLTRDecoder); mLTRMessageProcessor = new LTRStandardMessageProcessor(direction, aliasList); mLTRMessageFramer.addMessageListener(mLTRMessageProcessor); diff --git a/src/main/java/io/github/dsheirer/module/decode/passport/PassportDecoder.java b/src/main/java/io/github/dsheirer/module/decode/passport/PassportDecoder.java index 131d0a69..cc30e36b 100644 --- a/src/main/java/io/github/dsheirer/module/decode/passport/PassportDecoder.java +++ b/src/main/java/io/github/dsheirer/module/decode/passport/PassportDecoder.java @@ -1,110 +1,77 @@ /******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see + * sdr-trunk + * Copyright (C) 2014-2018 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see + * ******************************************************************************/ package io.github.dsheirer.module.decode.passport; import io.github.dsheirer.alias.AliasList; import io.github.dsheirer.bits.MessageFramer; import io.github.dsheirer.bits.SyncPattern; -import io.github.dsheirer.dsp.fsk.LTRFSKDecoderLegacy; -import io.github.dsheirer.instrument.Instrumentable; -import io.github.dsheirer.instrument.tap.Tap; -import io.github.dsheirer.instrument.tap.TapGroup; +import io.github.dsheirer.dsp.fsk.LTRDecoder; import io.github.dsheirer.module.decode.Decoder; import io.github.dsheirer.module.decode.DecoderType; import io.github.dsheirer.module.decode.config.DecodeConfiguration; import io.github.dsheirer.sample.Listener; -import io.github.dsheirer.sample.real.IUnFilteredRealBufferListener; -import io.github.dsheirer.sample.real.RealBuffer; +import io.github.dsheirer.sample.buffer.IReusableBufferListener; +import io.github.dsheirer.sample.buffer.ReusableBuffer; -import java.util.ArrayList; -import java.util.List; - -public class PassportDecoder extends Decoder - implements IUnFilteredRealBufferListener, Instrumentable +public class PassportDecoder extends Decoder implements IReusableBufferListener, Listener { - public static final int PASSPORT_MESSAGE_LENGTH = 68; - public static final int PASSPORT_SYNC_LENGTH = 9; + public static final int PASSPORT_MESSAGE_LENGTH = 68; - private LTRFSKDecoderLegacy mPassportFSKDecoder; - private MessageFramer mPassportMessageFramer; - private PassportMessageProcessor mPassportMessageProcessor; - - private List mAvailableTaps; + private LTRDecoder mLTRDecoder; + private MessageFramer mPassportMessageFramer; + private PassportMessageProcessor mPassportMessageProcessor; /** * Passport Decoder. Decodes unfiltered (e.g. demodulated but with no DC or * audio filtering) samples and produces Passport messages. */ - public PassportDecoder(DecodeConfiguration config, AliasList aliasList ) - { - mPassportFSKDecoder = new LTRFSKDecoderLegacy(); - - mPassportMessageFramer = - new MessageFramer( SyncPattern.PASSPORT.getPattern(), - PASSPORT_MESSAGE_LENGTH ); - - mPassportFSKDecoder.addListener( mPassportMessageFramer ); - - mPassportMessageProcessor = new PassportMessageProcessor( aliasList ); - mPassportMessageFramer.addMessageListener( mPassportMessageProcessor ); - mPassportMessageProcessor.setMessageListener( getMessageListener() ); - } - - @Override - public Listener getUnFilteredRealBufferListener() - { - return mPassportFSKDecoder; - } - - @Override - public DecoderType getDecoderType() - { - return DecoderType.PASSPORT; - } - - @Override - public List getTapGroups() + public PassportDecoder(DecodeConfiguration config, AliasList aliasList) { - if( mAvailableTaps == null ) - { - mAvailableTaps = new ArrayList<>(); - - mAvailableTaps.addAll( mPassportFSKDecoder.getTapGroups() ); - } + mLTRDecoder = new LTRDecoder(PASSPORT_MESSAGE_LENGTH); - return mAvailableTaps; + mPassportMessageFramer = new MessageFramer(SyncPattern.PASSPORT.getPattern(), PASSPORT_MESSAGE_LENGTH); + + mLTRDecoder.setMessageFramer(mPassportMessageFramer); + mPassportMessageFramer.setSyncDetectListener(mLTRDecoder); + mPassportMessageProcessor = new PassportMessageProcessor(aliasList); + mPassportMessageFramer.addMessageListener(mPassportMessageProcessor); + mPassportMessageProcessor.setMessageListener(getMessageListener()); } - @Override - public void registerTap( Tap tap ) + @Override + public Listener getReusableBufferListener() { - mPassportFSKDecoder.registerTap( tap ); + return mLTRDecoder; } - @Override - public void unregisterTap( Tap tap ) + @Override + public void receive(ReusableBuffer reusableBuffer) { - mPassportFSKDecoder.unregisterTap( tap ); + mLTRDecoder.receive(reusableBuffer); } - @Override - public void reset() - { - mPassportMessageFramer.reset(); - } + @Override + public DecoderType getDecoderType() + { + return DecoderType.PASSPORT; + } + + @Override + public void reset() + { + mPassportMessageFramer.reset(); + } }