Adds CRC checksum validation to LJ1200 messages (using Eric Cottrell's CRC polynomial)

This commit is contained in:
dennis.sheirer
2014-12-05 12:59:16 +00:00
parent 11c52cbe19
commit 412f1ac9f7
3 changed files with 240 additions and 39 deletions

View File

@@ -18,18 +18,23 @@
package decode.lj1200;
import java.text.SimpleDateFormat;
import java.util.BitSet;
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.CRCFleetsync;
import crc.CRCLJ;
public class LJ1200Message extends Message
{
private final static Logger mLog = LoggerFactory.getLogger( LJ1200Message.class );
public static int[] SYNC = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
public static int[] VRC = { 23,22,21,20,19,18,17,16 };
@@ -41,7 +46,7 @@ public class LJ1200Message extends Message
public static int[] ADDRESS = { 63,62,61,60,59,58,57,56,55,54,53,52,51,50,
49,48,47,46,45,44,43,42,41,40,39,38,37,36 };
public static int[] CRC = { 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 };
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" );
@@ -51,42 +56,33 @@ public class LJ1200Message extends Message
public LJ1200Message( BitSetBuffer message, AliasList list )
{
mMessage = message;
mMessage = message;
mAliasList = list;
checkParity();
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;
}
}
private void checkParity()
private void checkCRC()
{
mCRC = detectAndCorrect( 16, 79 );
}
private CRC detectAndCorrect( int start, int end )
{
BitSet original = mMessage.get( start, end );
CRC crc = CRCFleetsync.check( original );
if( crc == crc.FAILED_PARITY )
{
int[] errorBitPositions = CRCFleetsync.findBitErrors( original );
if( errorBitPositions != null )
{
for( int errorBitPosition: errorBitPositions )
{
mMessage.flip( start + errorBitPosition );
}
crc = crc.CORRECTED;
}
}
return crc;
mCRC = CRCLJ.checkAndCorrect( mMessage );
}
public boolean isValid()
{
// return mCRC == CRC.PASSED || mCRC == CRC.CORRECTED;
return true;
}
@@ -102,7 +98,7 @@ public class LJ1200Message extends Message
public String getCRC()
{
return mMessage.getHex( CRC, 4 );
return mMessage.getHex( MESSAGE_CRC, 4 );
}
public String getFunction()
@@ -217,7 +213,7 @@ public class LJ1200Message extends Message
@Override
public String getErrorStatus()
{
return "UNKNOWN";
return mCRC.getDisplayText();
}
@Override