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(); + } }