📄 dabmot.cpp
字号:
incremented each time a MSC data group of a particular type, with a
content different from that of the immediately preceding data group of
the same type, is transmitted */
if (bHeader == TRUE)
{
vecbiData.Enqueue((uint32_t) iContIndexHeader, 4);
/* Increment modulo 16 */
iContIndexHeader++;
if (iContIndexHeader == 16)
iContIndexHeader = 0;
}
else
{
vecbiData.Enqueue((uint32_t) iContIndexBody, 4);
/* Increment modulo 16 */
iContIndexBody++;
if (iContIndexBody == 16)
iContIndexBody = 0;
}
/* Repetition index: the binary value of this 4-bit field shall signal the
remaining number of repetitions of a MSC data group with the same data
content, occurring in successive MSC data groups of the same type.
No repetition used in this implementation right now -> 0, TODO */
vecbiData.Enqueue((uint32_t) 0, 4);
/* Extension field: this 16-bit field shall be used to carry the Data Group
Conditional Access (DGCA) when general data or MOT data uses conditional
access (Data group types 0010 and 0101, respectively). The DGCA contains
the Initialization Modifier (IM) and additional Conditional Access (CA)
information. For other Data group types, the Extension field is reserved
for future additions to the Data group header.
Extension field is not used in this implementation! */
/* Session header ------------------------------------------------------- */
/* Segment field */
if (bSegFieldUsed == TRUE)
{
/* Last: this 1-bit flag shall indicate whether the segment number field
is the last or whether there are more to be transmitted */
if (bLastSeg == TRUE)
vecbiData.Enqueue((uint32_t) 1, 1);
else
vecbiData.Enqueue((uint32_t) 0, 1);
/* Segment number: this 15-bit field, coded as an unsigned binary number
(in the range 0 to 32767), shall indicate the segment number.
NOTE: The first segment is numbered 0 and the segment number is
incremented by one at each new segment */
vecbiData.Enqueue((uint32_t) iSegNum, 15);
}
/* User access field */
if (bUsAccFieldUsed == TRUE)
{
/* Rfa (Reserved for future addition): this 3-bit field shall be
reserved for future additions */
vecbiData.Enqueue((uint32_t) 0, 3);
/* Transport Id flag: this 1-bit flag shall indicate whether the
Transport Id field is present, or not */
if (bTransIDFieldUsed == TRUE)
vecbiData.Enqueue((uint32_t) 1, 1);
else
vecbiData.Enqueue((uint32_t) 0, 1);
/* Length indicator: this 4-bit field, coded as an unsigned binary
number (in the range 0 to 15), shall indicate the length n in bytes
of the Transport Id and End user address fields.
We do not use end user address field, only transport ID -> 2 */
if (bTransIDFieldUsed == TRUE)
vecbiData.Enqueue((uint32_t) 2, 4);
else
vecbiData.Enqueue((uint32_t) 0, 4);
/* Transport Id (Identifier): this 16-bit field shall uniquely identify
one data object (file and header information) from a stream of such
objects, It may be used to indicate the object to which the
information carried in the data group belongs or relates */
if (bTransIDFieldUsed == TRUE)
vecbiData.Enqueue((uint32_t) iTranspID, 16);
}
/* MSC data group data field -------------------------------------------- */
vecbiSeg.ResetBitAccess();
for (i = 0; i < vecbiSeg.Size(); i++)
vecbiData.Enqueue(vecbiSeg.Separate(1), 1);
/* MSC data group CRC --------------------------------------------------- */
/* The data group CRC shall be a 16-bit CRC word calculated on the data
group header, the session header and the data group data field. The
generation shall be based on the ITU-T Recommendation X.25.
At the beginning of each CRC word calculation, all shift register stage
contents shall be initialized to "1". The CRC word shall be complemented
(1's complement) prior to transmission */
if (bCRCUsed == TRUE)
{
/* Reset bit access */
vecbiData.ResetBitAccess();
/* Calculate the CRC and put it at the end of the segment */
CRCObject.Reset(16);
/* "byLengthBody" was defined in the header */
for (i = 0; i < iTotLenMOTObj / SIZEOF__BYTE - 2 /* CRC */; i++)
CRCObject.AddByte((_BYTE) vecbiData.Separate(SIZEOF__BYTE));
/* Now, pointer in "enqueue"-function is back at the same place,
add CRC */
vecbiData.Enqueue(CRCObject.GetCRC(), 16);
}
}
_BOOLEAN CMOTDABEnc::GetDataGroup(CVector<_BINARY>& vecbiNewData)
{
_BOOLEAN bLastSegment;
/* Init return value. Is overwritten in case the object is ready */
_BOOLEAN bObjectDone = FALSE;
if (bCurSegHeader == TRUE)
{
/* Check if this is last segment */
if (iSegmCntHeader == MOTObjSegments.vvbiHeader.Size() - 1)
bLastSegment = TRUE;
else
bLastSegment = FALSE;
/* Generate MOT object for header */
GenMOTObj(vecbiNewData, MOTObjSegments.vvbiHeader[iSegmCntHeader],
TRUE, iSegmCntHeader, iTransportID, bLastSegment);
iSegmCntHeader++;
if (iSegmCntHeader == MOTObjSegments.vvbiHeader.Size())
{
/* Reset counter for body */
iSegmCntBody = 0;
/* Header is ready, transmit body now */
bCurSegHeader = FALSE;
}
}
else
{
/* Check that body size is not zero */
if (iSegmCntBody < MOTObjSegments.vvbiBody.Size())
{
/* Check if this is last segment */
if (iSegmCntBody == MOTObjSegments.vvbiBody.Size() - 1)
bLastSegment = TRUE;
else
bLastSegment = FALSE;
/* Generate MOT object for Body */
GenMOTObj(vecbiNewData, MOTObjSegments.vvbiBody[iSegmCntBody],
FALSE, iSegmCntBody, iTransportID, bLastSegment);
iSegmCntBody++;
}
if (iSegmCntBody == MOTObjSegments.vvbiBody.Size())
{
/* Reset counter for header */
iSegmCntHeader = 0;
/* Body is ready, transmit header from next object */
bCurSegHeader = TRUE;
iTransportID++;
/* Signal that old object is done */
bObjectDone = TRUE;
}
}
/* Return status of object transmission */
return bObjectDone;
}
_REAL CMOTDABEnc::GetProgPerc() const
{
/*
Get percentage of processed data of current object.
*/
const int iTotNumSeg =
MOTObjSegments.vvbiHeader.Size() + MOTObjSegments.vvbiBody.Size();
return ((_REAL) iSegmCntBody + (_REAL) iSegmCntHeader) / iTotNumSeg;
}
void CMOTDABEnc::Reset()
{
/* Reset continuity indices */
iContIndexHeader = 0;
iContIndexBody = 0;
iTransportID = 0;
/* Init counter for segments */
iSegmCntHeader = 0;
iSegmCntBody = 0;
/* Init flag which shows what is currently generated, header or body */
bCurSegHeader = TRUE; /* Start with header */
/* Add a "null object" so that at least one valid object can be processed */
CMOTObject NullObject;
SetMOTObject(NullObject);
}
/******************************************************************************\
* Decoder *
\******************************************************************************/
_BOOLEAN CMOTDABDec::AddDataGroup(CVector<_BINARY>& vecbiNewData)
{
int i;
int iSegmentNum;
int iLenIndicat;
int iLenGroupDataField;
int iSegmentSize;
int iTransportID;
_BINARY biLastFlag;
_BINARY biTransportIDFlag;
CCRC CRCObject;
FILE* pFiBody;
_BOOLEAN bCRCOk;
/* Init return value with "not ready". If not MOT object is ready after
adding this new data group, this flag is overwritten with "TRUE" */
_BOOLEAN bMOTObjectReady = FALSE;
/* Get length of data unit */
iLenGroupDataField = vecbiNewData.Size();
/* CRC check ------------------------------------------------------------ */
/* We do the CRC check at the beginning no matter if it is used or not
since we have to reset bit access for that */
/* Reset bit extraction access */
vecbiNewData.ResetBitAccess();
/* Check the CRC of this packet */
CRCObject.Reset(16);
/* "- 2": 16 bits for CRC at the end */
for (i = 0; i < iLenGroupDataField / SIZEOF__BYTE - 2; i++)
CRCObject.AddByte((_BYTE) vecbiNewData.Separate(SIZEOF__BYTE));
bCRCOk = CRCObject.CheckCRC(vecbiNewData.Separate(16));
/* MSC data group header ------------------------------------------------ */
/* Reset bit extraction access */
vecbiNewData.ResetBitAccess();
/* Extension flag */
const _BINARY biExtensionFlag = (_BINARY) vecbiNewData.Separate(1);
/* CRC flag */
const _BINARY biCRCFlag = (_BINARY) vecbiNewData.Separate(1);
/* Segment flag */
const _BINARY biSegmentFlag = (_BINARY) vecbiNewData.Separate(1);
/* User access flag */
const _BINARY biUserAccFlag = (_BINARY) vecbiNewData.Separate(1);
/* Data group type */
const int iDataGroupType = (int) vecbiNewData.Separate(4);
/* Continuity index (not yet used) */
vecbiNewData.Separate(4);
/* Repetition index (not yet used) */
vecbiNewData.Separate(4);
/* Extension field (not used) */
if (biExtensionFlag == TRUE)
vecbiNewData.Separate(16);
/* Session header ------------------------------------------------------- */
/* Segment field */
if (biSegmentFlag == TRUE)
{
/* Last */
biLastFlag = (_BINARY) vecbiNewData.Separate(1);
/* Segment number */
iSegmentNum = (int) vecbiNewData.Separate(15);
}
/* User access field */
if (biUserAccFlag == TRUE)
{
/* Rfa (Reserved for future addition) */
vecbiNewData.Separate(3);
/* Transport Id flag */
biTransportIDFlag = (_BINARY) vecbiNewData.Separate(1);
/* Length indicator */
iLenIndicat = (int) vecbiNewData.Separate(4);
/* Transport Id */
if (biTransportIDFlag == 1)
iTransportID = (int) vecbiNewData.Separate(16);
/* End user address field (not used) */
int iLenEndUserAddress;
if (biTransportIDFlag == 1)
iLenEndUserAddress = (iLenIndicat - 2) * SIZEOF__BYTE;
else
iLenEndUserAddress = iLenIndicat * SIZEOF__BYTE;
vecbiNewData.Separate(iLenEndUserAddress);
}
/* MSC data group data field -------------------------------------------- */
/* If CRC is not used enter if-block, if CRC flag is used, it must be ok to
enter the if-block */
if ((biCRCFlag == FALSE) || ((biCRCFlag == TRUE) && (bCRCOk == TRUE)))
{
/* Segmentation header ---------------------------------------------- */
/* Repetition count (not used) */
vecbiNewData.Separate(3);
/* Segment size */
iSegmentSize = (int) vecbiNewData.Separate(13);
/* Get MOT data ----------------------------------------------------- */
/* Segment number and user access data is needed */
if ((biSegmentFlag == TRUE) && (biUserAccFlag == TRUE) &&
(biTransportIDFlag == 1))
{
/* Distinguish between header and body */
/* Header information, i.e. the header core and the header
extension, are transferred in Data Group type 3 */
if (iDataGroupType == 3)
{
/* Header --------------------------------------------------- */
if (iSegmentNum == 0)
{
/* Header */
/* The first segment was received, reset header */
MOTObjectRaw.Header.Reset();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -