satengine/satserver/Engine/src/TSatBitOP.cpp
changeset 33 8d5d7fcf9b59
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/satengine/satserver/Engine/src/TSatBitOP.cpp	Wed Jul 21 18:26:52 2010 +0300
@@ -0,0 +1,142 @@
+/*
+* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Bit manipulator.
+*
+*/
+
+
+#include    "TSatBitOP.h"
+#include    "SatLog.h"
+
+const TUint8 KBitsInByte( 8 );
+const TUint8 KBitsInWord( 16 );
+const TUint8 KHighBitInByte( 7 );
+const TUint8 KHighBitInWord( 15 );
+
+// -----------------------------------------------------------------------------
+// Extracts bits from bit sequence. First bit is 0 index.
+// The lsb of extracted bits is set to 0 bit.
+// -----------------------------------------------------------------------------
+//
+TUint8 TSatBitOP::ExtractBits(
+    TInt aBitIndex,
+    TUint8 aBitCount,
+    const TDesC8& aBytes )
+    {
+    LOG( DETAILED, "SATENGINE: TSatBitOP::ExtractBits calling" )
+
+    // Calculate the byte where aBitIndex is pointing.
+    const TInt byteIndex( static_cast<TInt>( aBitIndex / KBitsInByte ) );
+    if ( byteIndex > 0 ) // aBitIndex is pointing other than first byte.
+        {
+        LOG( DETAILED, "SATENGINE: TSatBitOP::ExtractBits byteIndex > 0" )
+        // Change the aBitIndex to point the bits 0 to 7, because
+        // we know which byte it is indexing.
+        aBitIndex -= byteIndex * KBitsInByte;
+        }
+
+    TUint8 result( 0 );
+    // Check if the bits to be extracted is in two bytes.
+    // ie. Part of the bits is in one byte and another
+    // part is in the following byte.
+    const TUint8 lastBit( static_cast<TUint8>( aBitIndex + aBitCount ) );
+    LOG2( DETAILED, "SATENGINE: TSatBitOP::ExtractBits lastBit: %i", lastBit )
+    if ( lastBit > KBitsInByte )
+        {
+        // The bits to be extracted reside in two bytes.
+
+        // Take the bytes.
+        const TUint16 word( static_cast<TUint16>(
+            ( aBytes[byteIndex] << KBitsInByte ) + aBytes[byteIndex + 1] ) );
+
+        // Create the mask, which extracts the bits.
+        const TUint16 mask(
+            CreateMask16Bit( static_cast<TUint8>( aBitIndex ), aBitCount ) );
+
+        // Extract the bits from the word.
+        // Result will be shifted so that the lsb bit of the extracted bits
+        // will be in bit 0.
+        result =
+            static_cast<TUint8>( ( word & mask ) >> ( KBitsInWord - lastBit ) );
+        }
+    else
+        {
+        // Bits can be extracted from single byte.
+
+        // Create the mask.
+        const TUint8 mask(
+            CreateMask8Bit( static_cast<TUint8>( aBitIndex ), aBitCount ) );
+
+        const TUint8 byte( aBytes[byteIndex] );
+
+        // Mask the bits and move the lsb of the extracted bits to 0 bit.
+        // Result will be shifted so that the lsb bit of the extracted bits
+        // will be in bit 0.
+        result =
+            static_cast<TUint8>( ( byte & mask ) >> ( KBitsInByte - lastBit ) );
+        }
+
+    LOG( DETAILED, "SATENGINE: TSatBitOP::ExtractBits exiting" )
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// Creates a 8-bit mask of ones.
+// -----------------------------------------------------------------------------
+//
+TUint8 TSatBitOP::CreateMask8Bit( TUint8 aBitIndex, TUint8 aCount )
+    {
+    LOG( DETAILED, "SATENGINE: TSatBitOP::CreateMask8Bit calling" )
+
+    // Change aBitIndex to use normal indexing of bits, because
+    // 0 in aBitIndex means MSB.
+    aBitIndex = static_cast<TUint8>( KHighBitInByte - aBitIndex );
+
+    TUint8 result( 0 );
+    TInt i ( 0 );
+    for ( i = 0; i < aCount; i++ )
+        {
+        result |= static_cast<TUint8>( 1 << aBitIndex );
+        aBitIndex--;
+        }
+    LOG2( DETAILED, "SATENGINE: TSatBitOP::CreateMask8Bit i: %i", i )
+    LOG2( DETAILED, "SATENGINE: TSatBitOP::CreateMask8Bit exiting, \
+          result: %i", result )
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// Creates a 16-bit mask of ones.
+// -----------------------------------------------------------------------------
+//
+TUint16 TSatBitOP::CreateMask16Bit( TUint8 aBitIndex, TUint8 aCount )
+    {
+    LOG( DETAILED, "SATENGINE: TSatBitOP::CreateMask16Bit calling" )
+
+    // Change aBitIndex to use normal indexing of bits, because
+    // 0 in aBitIndex means MSB.
+    aBitIndex = static_cast<TUint8>( KHighBitInWord - aBitIndex );
+
+    TUint16 result( 0 );
+    TInt i ( 0 );
+    for ( i = 0;  i < aCount; i++ )
+        {
+        result |= static_cast<TUint16>( 1 << aBitIndex );
+        aBitIndex--;
+        }
+    LOG2( DETAILED, "SATENGINE: TSatBitOP::CreateMask16Bit i: %i", i )
+    LOG2( DETAILED, "SATENGINE: TSatBitOP::CreateMask16Bit exiting, \
+          result: %i", result )
+    return result;
+    }