public TS_POINTER_PDU ParseTsPointerPdu(
byte[] updateData,
TS_SHAREDATAHEADER shareDataHeader)
{
// index of update data
int index = 0;
TS_POINTER_PDU pdu = new TS_POINTER_PDU();
// TS_POINTER_PDU: shareDataHeader
pdu.shareDataHeader = shareDataHeader;
// TS_POINTER_PDU: messageType
pdu.messageType = ParseUInt16(updateData, ref index, false);
// TS_POINTER_PDU: pad2Octets
pdu.pad2Octets = ParseUInt16(updateData, ref index, false);
// TS_POINTER_PDU: pointerAttributeData
int remainLength = updateData.Length - index;
switch (pdu.messageType)
{
// TS_PTRMSGTYPE_SYSTEM: 4 bytes
case (ushort)TS_POINTER_PDU_messageType_Values.TS_PTRMSGTYPE_SYSTEM:
pdu.pointerAttributeData = GetBytes(updateData, ref index,
ConstValue.TS_PTRMSGTYPE_SYSTEM_DATA_LENGTH);
break;
// TS_PTRMSGTYPE_POSITION: 4 bytes
case (ushort)TS_POINTER_PDU_messageType_Values.TS_PTRMSGTYPE_POSITION:
pdu.pointerAttributeData = GetBytes(updateData, ref index,
ConstValue.TS_PTRMSGTYPE_POSITION_DATA_LENGTH);
break;
// TS_PTRMSGTYPE_COLOR: variable number of bytes
case (ushort)TS_POINTER_PDU_messageType_Values.TS_PTRMSGTYPE_COLOR:
pdu.pointerAttributeData = GetBytes(updateData, ref index, remainLength);
break;
// TS_PTRMSGTYPE_CACHED: 2 bytes
case (ushort)TS_POINTER_PDU_messageType_Values.TS_PTRMSGTYPE_CACHED:
pdu.pointerAttributeData = GetBytes(updateData, ref index,
ConstValue.TS_PTRMSGTYPE_CACHED_DATA_LENGTH);
break;
// TS_PTRMSGTYPE_POINTER: variable number of bytes
case (ushort)TS_POINTER_PDU_messageType_Values.TS_PTRMSGTYPE_POINTER:
pdu.pointerAttributeData = GetBytes(updateData, ref index, remainLength);
break;
default:
throw new FormatException(ConstValue.ERROR_MESSAGE_ENUM_UNRECOGNIZED);
}
// Check if data length exceeded expectation
VerifyDataLength(updateData.Length, index, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED);
return pdu;
}