From c28cf1910469b5df686185fee21857e879bec907 Mon Sep 17 00:00:00 2001 From: "dennis.sheirer" Date: Fri, 26 Dec 2014 14:32:32 +0000 Subject: [PATCH] Adds new LJ1200 transponder message parsing to the LJ1200 auxiliary decoder. --- src/bits/SyncPattern.java | 12 +- src/crc/CRCLJ.java | 9 + src/decode/lj1200/LJ1200ChannelState.java | 4 + src/decode/lj1200/LJ1200Decoder.java | 20 +- src/decode/lj1200/LJ1200Message.java | 2 +- src/decode/lj1200/LJ1200MessageFilter.java | 3 +- src/decode/lj1200/LJ1200MessageProcessor.java | 27 ++- .../lj1200/LJ1200TransponderMessage.java | 195 ++++++++++++++++++ 8 files changed, 260 insertions(+), 12 deletions(-) create mode 100644 src/decode/lj1200/LJ1200TransponderMessage.java diff --git a/src/bits/SyncPattern.java b/src/bits/SyncPattern.java index aee63926..7ad876a6 100644 --- a/src/bits/SyncPattern.java +++ b/src/bits/SyncPattern.java @@ -38,7 +38,8 @@ public enum SyncPattern true, true, true, false, //1110 0xE true, false, true, true //1011 0xB } ), - + + /* 0x550F */ LJ1200( new boolean[] { false, true, false,true, @@ -47,6 +48,15 @@ public enum SyncPattern true, true, true, true }), + /* 0x2AD5 */ + LJ1200_TRANSPONDER( new boolean[] + { + false, false, true, false, + true, false, true, false, + true, true, false, true, + false, true, false, true + }), + /** * Note: we use a truncated portion of the NRZ-I encoded sync pattern. * The truncated version seems to work well enough for detecting the burst, diff --git a/src/crc/CRCLJ.java b/src/crc/CRCLJ.java index 328caaa6..ece41bea 100644 --- a/src/crc/CRCLJ.java +++ b/src/crc/CRCLJ.java @@ -200,4 +200,13 @@ public class CRCLJ return null; } + + public static void main( String[] args ) + { + BitSetBuffer msg = BitSetBuffer.load( "01010101101010101010000100011000000000100001000110000000001000010001100000000010" ); + + CRC crc = checkAndCorrect( msg ); + + mLog.debug( "CRC:" + crc.getDisplayText() ); + } } diff --git a/src/decode/lj1200/LJ1200ChannelState.java b/src/decode/lj1200/LJ1200ChannelState.java index 880c15fe..8bd626dc 100644 --- a/src/decode/lj1200/LJ1200ChannelState.java +++ b/src/decode/lj1200/LJ1200ChannelState.java @@ -53,6 +53,10 @@ public class LJ1200ChannelState extends AuxChannelState mParentChannelState.receiveCallEvent( LJ1200CallEvent.getLJ1200Event( (LJ1200Message)message ) ); } + else if( message instanceof LJ1200TransponderMessage ) + { + mActivitySummary.receive( message ); + } } @Override diff --git a/src/decode/lj1200/LJ1200Decoder.java b/src/decode/lj1200/LJ1200Decoder.java index 9fd541e4..c8f0cd9e 100644 --- a/src/decode/lj1200/LJ1200Decoder.java +++ b/src/decode/lj1200/LJ1200Decoder.java @@ -64,7 +64,8 @@ public class LJ1200Decoder extends Decoder implements Instrumentable private FSK2Decoder mFSKDecoder; private FloatHalfBandFilter mDecimationFilter; private FloatFIRFilter mBandPassFilter; - private MessageFramer mMessageFramer; + private MessageFramer mTowerMessageFramer; + private MessageFramer mTransponderMessageFramer; private LJ1200MessageProcessor mMessageProcessor; public LJ1200Decoder( AliasList aliasList ) @@ -83,12 +84,17 @@ public class LJ1200Decoder extends Decoder implements Instrumentable SYMBOL_RATE, Output.INVERTED ); mBandPassFilter.setListener( mFSKDecoder ); - mMessageFramer = new MessageFramer( + mTowerMessageFramer = new MessageFramer( SyncPattern.LJ1200.getPattern(), MESSAGE_LENGTH ); - mFSKDecoder.setListener( mMessageFramer ); + mFSKDecoder.setListener( mTowerMessageFramer ); + + mTransponderMessageFramer = new MessageFramer( + SyncPattern.LJ1200_TRANSPONDER.getPattern(), MESSAGE_LENGTH ); + mFSKDecoder.setListener( mTransponderMessageFramer ); mMessageProcessor = new LJ1200MessageProcessor( aliasList ); - mMessageFramer.addMessageListener( mMessageProcessor ); + mTowerMessageFramer.addMessageListener( mMessageProcessor ); + mTransponderMessageFramer.addMessageListener( mMessageProcessor ); mMessageProcessor.addMessageListener( this ); } @@ -99,7 +105,7 @@ public class LJ1200Decoder extends Decoder implements Instrumentable mDecimationFilter.dispose(); mBandPassFilter.dispose(); mFSKDecoder.dispose(); - mMessageFramer.dispose(); + mTowerMessageFramer.dispose(); mMessageProcessor.dispose(); } @@ -155,7 +161,7 @@ public class LJ1200Decoder extends Decoder implements Instrumentable case INSTRUMENT_FSK2_DECODER_TO_MESSAGE_FRAMER: BinaryTap decoderTap = (BinaryTap)tap; mFSKDecoder.setListener( decoderTap ); - decoderTap.setListener( mMessageFramer ); + decoderTap.setListener( mTowerMessageFramer ); break; } } @@ -175,7 +181,7 @@ public class LJ1200Decoder extends Decoder implements Instrumentable mBandPassFilter.setListener( mFSKDecoder ); break; case INSTRUMENT_FSK2_DECODER_TO_MESSAGE_FRAMER: - mFSKDecoder.setListener( mMessageFramer ); + mFSKDecoder.setListener( mTowerMessageFramer ); break; } } diff --git a/src/decode/lj1200/LJ1200Message.java b/src/decode/lj1200/LJ1200Message.java index 96a55a49..7a10784b 100644 --- a/src/decode/lj1200/LJ1200Message.java +++ b/src/decode/lj1200/LJ1200Message.java @@ -227,7 +227,7 @@ public class LJ1200Message extends Message @Override public String getEventType() { - return "MESSAGE"; + return "TOWER"; } @Override diff --git a/src/decode/lj1200/LJ1200MessageFilter.java b/src/decode/lj1200/LJ1200MessageFilter.java index bd71f5ec..0c9a313e 100644 --- a/src/decode/lj1200/LJ1200MessageFilter.java +++ b/src/decode/lj1200/LJ1200MessageFilter.java @@ -24,7 +24,8 @@ public class LJ1200MessageFilter extends Filter @Override public boolean canProcess( Message message ) { - return message instanceof LJ1200Message; + return message instanceof LJ1200Message || + message instanceof LJ1200TransponderMessage; } @Override diff --git a/src/decode/lj1200/LJ1200MessageProcessor.java b/src/decode/lj1200/LJ1200MessageProcessor.java index 5d5b73e6..ef865e40 100644 --- a/src/decode/lj1200/LJ1200MessageProcessor.java +++ b/src/decode/lj1200/LJ1200MessageProcessor.java @@ -18,6 +18,10 @@ package decode.lj1200; import message.Message; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import sample.Broadcaster; import sample.Listener; import alias.AliasList; @@ -25,6 +29,14 @@ import bits.BitSetBuffer; public class LJ1200MessageProcessor implements Listener { + private final static Logger mLog = + LoggerFactory.getLogger( LJ1200MessageProcessor.class ); + + public static int[] SYNC = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }; + + public static int SYNC_TOWER = 0x550F; + public static int SYNC_TRANSPONDER = 0x2AD5; + private Broadcaster mBroadcaster = new Broadcaster(); private AliasList mAliasList; @@ -42,9 +54,20 @@ public class LJ1200MessageProcessor implements Listener @Override public void receive( BitSetBuffer buffer ) { - LJ1200Message message = new LJ1200Message( buffer, mAliasList ); + int sync = buffer.getInt( SYNC ); - mBroadcaster.receive( message ); + if( sync == SYNC_TOWER ) + { + LJ1200Message towerMessage = new LJ1200Message( buffer, mAliasList ); + mBroadcaster.receive( towerMessage ); + } + else if( sync == SYNC_TRANSPONDER ) + { + LJ1200TransponderMessage transponderMessage = + new LJ1200TransponderMessage( buffer, mAliasList ); + + mBroadcaster.receive( transponderMessage ); + } } public void addMessageListener( Listener listener ) diff --git a/src/decode/lj1200/LJ1200TransponderMessage.java b/src/decode/lj1200/LJ1200TransponderMessage.java new file mode 100644 index 00000000..5d14ec29 --- /dev/null +++ b/src/decode/lj1200/LJ1200TransponderMessage.java @@ -0,0 +1,195 @@ +/******************************************************************************* + * 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 decode.lj1200; + +import java.text.SimpleDateFormat; + +import map.Plottable; +import message.Message; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import alias.Alias; +import alias.AliasList; +import bits.BitSetBuffer; +import crc.CRC; +import crc.CRCLJ; + +public class LJ1200TransponderMessage extends Message +{ + private final static Logger mLog = LoggerFactory.getLogger( LJ1200TransponderMessage.class ); + + public static int[] SYNC = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }; + + public static int[] MESSAGE_CRC = { 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 }; + + private static SimpleDateFormat mSDF = new SimpleDateFormat( "yyyyMMdd HHmmss" ); + + private BitSetBuffer mMessage; + private AliasList mAliasList; + private CRC mCRC; + + public LJ1200TransponderMessage( BitSetBuffer message, AliasList list ) + { + mMessage = message; + mAliasList = list; + + checkCRC(); + + switch( mCRC ) + { + case CORRECTED: + mLog.debug( "CORR:" + message.toString() ); + break; + case FAILED_CRC: + mLog.debug( "FAIL:" + message.toString() ); + break; + case PASSED: + mLog.debug( "PASS:" + message.toString() ); + break; + case UNKNOWN: + mLog.debug( "UNKNOWN:" + message.toString() ); + break; + } + } + + private void checkCRC() + { + mCRC = CRC.UNKNOWN; + } + + public boolean isValid() + { +// return mCRC == CRC.PASSED || mCRC == CRC.CORRECTED; + + /* Override validity check until proper CRC is implemented */ + return true; + } + + public String getCRC() + { + return mMessage.getHex( MESSAGE_CRC, 4 ); + } + + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + + sb.append( "TRANSPONDER TEST" ); + + return sb.toString(); + } + + /** + * Pads spaces onto the end of the value to make it 'places' long + */ + public String pad( String value, int places, String padCharacter ) + { + StringBuilder sb = new StringBuilder(); + + sb.append( value ); + + while( sb.length() < places ) + { + sb.append( padCharacter ); + } + + return sb.toString(); + } + + /** + * Pads an integer value with additional zeroes to make it decimalPlaces long + */ + public String format( int number, int decimalPlaces ) + { + StringBuilder sb = new StringBuilder(); + + int paddingRequired = decimalPlaces - ( String.valueOf( number ).length() ); + + for( int x = 0; x < paddingRequired; x++) + { + sb.append( "0" ); + } + + sb.append( number ); + + return sb.toString(); + } + + @Override + public String getBinaryMessage() + { + return mMessage.toString(); + } + + @Override + public String getProtocol() + { + return "LJ-1200"; + } + + @Override + public String getEventType() + { + return "TRANSPONDER"; + } + + @Override + public String getFromID() + { + return null; + } + + @Override + public Alias getFromIDAlias() + { + return null; + } + + @Override + public String getToID() + { + return null; + } + + @Override + public Alias getToIDAlias() + { + return null; + } + + @Override + public String getMessage() + { + return toString(); + } + + @Override + public String getErrorStatus() + { + return mCRC.getDisplayText(); + } + + @Override + public Plottable getPlottable() + { + return null; + } +}