void KnxTelegram::UpdateChecksum(void)
{
  byte indexChecksum, xorSum=0; 
  indexChecksum = KNX_TELEGRAM_HEADER_SIZE + GetPayloadLength() + 1;
  for (byte i = 0; i < indexChecksum ; i++)   xorSum ^= _telegram[i]; // XOR Sum of all the databytes
  _telegram[indexChecksum] = ~xorSum; // Checksum equals 1's complement of databytes XOR sum
}
byte KnxTelegram::CalculateChecksum(void) const
{
  byte indexChecksum, xorSum=0;  
  indexChecksum = KNX_TELEGRAM_HEADER_SIZE + GetPayloadLength() + 1;
  for (byte i = 0; i < indexChecksum ; i++)   xorSum ^= _telegram[i]; // XOR Sum of all the databytes
  return (byte)(~xorSum); // Checksum equals 1's complement of databytes XOR sum
}
e_KnxTelegramValidity KnxTelegram::GetValidity(void) const
{
  if ((_controlField & CONTROL_FIELD_PATTERN_MASK) != CONTROL_FIELD_VALID_PATTERN) return KNX_TELEGRAM_INVALID_CONTROL_FIELD; 
  if ((_controlField & CONTROL_FIELD_FRAME_FORMAT_MASK) != CONTROL_FIELD_STANDARD_FRAME_FORMAT) return KNX_TELEGRAM_UNSUPPORTED_FRAME_FORMAT; 
  if (!GetPayloadLength()) return KNX_TELEGRAM_INCORRECT_PAYLOAD_LENGTH ;
  if ((_commandH & COMMAND_FIELD_PATTERN_MASK) != COMMAND_FIELD_VALID_PATTERN) return KNX_TELEGRAM_INVALID_COMMAND_FIELD;
  if ( GetChecksum() != CalculateChecksum()) return KNX_TELEGRAM_INCORRECT_CHECKSUM ;
  byte cmd=GetCommand();
  if  (    (cmd!=KNX_COMMAND_VALUE_READ) && (cmd!=KNX_COMMAND_VALUE_RESPONSE) 
       && (cmd!=KNX_COMMAND_VALUE_WRITE) && (cmd!=KNX_COMMAND_MEMORY_WRITE)) return KNX_TELEGRAM_UNKNOWN_COMMAND;
  return  KNX_TELEGRAM_VALID;
};
예제 #4
0
 uint64_t GetMessageLength() const {
   uint64_t r = GetPayloadLength();
   r += 2;
   if (UsesExtendedPayload()) {
     r += 2;
   }
   if (UsesExtendedExtendedPayloadLength()) {
     r += 8;
   }
   if (IsMasked()) {
     r += 4;
   }
   return r;
 }
void KnxTelegram::InfoVerbose(String& str) const
{
  byte payloadLength = GetPayloadLength();
  str+= "Repeat="; str+= IsRepeated() ? "YES" : "NO";
  str+="\nPrio=";
  switch(GetPriority())
  {
    case KNX_PRIORITY_SYSTEM_VALUE : str+="SYSTEM"; break;
    case KNX_PRIORITY_ALARM_VALUE : str+="ALARM"; break;
    case KNX_PRIORITY_HIGH_VALUE : str+="HIGH"; break;
    case KNX_PRIORITY_NORMAL_VALUE : str+="NORMAL"; break;
    default : str+="ERR_VAL!"; break;
  }
  str+="\nSrcAddr=" + String(GetSourceAddress(),HEX);
  str+="\nTargetAddr=" + String(GetTargetAddress(),HEX);
  str+="\nGroupAddr="; if (IsMulticast()) str+= "YES"; else str+="NO";
  str+="\nRout.Counter=" + String(GetRoutingCounter(),DEC);
  str+="\nPayloadLgth=" + String(payloadLength,DEC);
  str+="\nTelegramLength=" + String(GetTelegramLength(),DEC);
  str+="\nCommand=";
  switch(GetCommand())
  {
    case KNX_COMMAND_VALUE_READ : str+="VAL_READ"; break;
    case KNX_COMMAND_VALUE_RESPONSE : str+="VAL_RESP"; break;
    case KNX_COMMAND_VALUE_WRITE : str+="VAL_WRITE"; break;
    case KNX_COMMAND_MEMORY_WRITE : str+="MEM_WRITE"; break;
    default : str+="ERR_VAL!"; break;
  }
  str+="\nPayload=" + String(GetFirstPayloadByte(),HEX)+' ';
  for (byte i = 0; i < payloadLength-1; i++) str+=String(_payloadChecksum[i], HEX)+' ';
  str+="\nValidity=";
   switch(GetValidity())
  {
    case KNX_TELEGRAM_VALID : str+="VALID"; break;
    case KNX_TELEGRAM_INVALID_CONTROL_FIELD : str+="INVALID_CTRL_FIELD"; break;
    case KNX_TELEGRAM_UNSUPPORTED_FRAME_FORMAT : str+="UNSUPPORTED_FRAME_FORMAT"; break;
    case KNX_TELEGRAM_INCORRECT_PAYLOAD_LENGTH : str+="INCORRECT_PAYLOAD_LGTH"; break;
    case KNX_TELEGRAM_INVALID_COMMAND_FIELD : str+="INVALID_CMD_FIELD"; break;
    case KNX_TELEGRAM_UNKNOWN_COMMAND : str+="UNKNOWN_CMD"; break;
    case KNX_TELEGRAM_INCORRECT_CHECKSUM : str+="INCORRECT_CHKSUM"; break;
    default : str+="ERR_VAL!"; break;
  }
  str+='\n';
}
void KnxTelegram::Info(String& str) const
{
  byte payloadLength = GetPayloadLength();

  str+="SrcAddr=" + String(GetSourceAddress(),HEX);
  str+="\nTargetAddr=" + String(GetTargetAddress(),HEX);
  str+="\nPayloadLgth=" + String(payloadLength,DEC);
  str+="\nCommand=";
  switch(GetCommand())
  {
    case KNX_COMMAND_VALUE_READ : str+="VAL_READ"; break;
    case KNX_COMMAND_VALUE_RESPONSE : str+="VAL_RESP"; break;
    case KNX_COMMAND_VALUE_WRITE : str+="VAL_WRITE"; break;
    case KNX_COMMAND_MEMORY_WRITE : str+="MEM_WRITE"; break;
    default : str+="ERR_VAL!"; break;
  }
  str+="\nPayload=" + String(GetFirstPayloadByte(),HEX)+' ';
  for (byte i = 0; i < payloadLength-1; i++) str+=String(_payloadChecksum[i], HEX)+' ';
  str+='\n';
}
void RTPPacket::Dump()
{
	int i;
	
	printf("Payload type:                %d\n",(int)GetPayloadType());
	printf("Extended sequence number:    0x%08x\n",GetExtendedSequenceNumber());
	printf("Timestamp:                   0x%08x\n",GetTimestamp());
	printf("SSRC:                        0x%08x\n",GetSSRC());
	printf("Marker:                      %s\n",HasMarker()?"yes":"no");
	printf("CSRC count:                  %d\n",GetCSRCCount());
	for (i = 0 ; i < GetCSRCCount() ; i++)
		printf("    CSRC[%02d]:                0x%08x\n",i,GetCSRC(i));
	printf("Payload:                     %s\n",GetPayloadData());
	printf("Payload length:              %d\n",GetPayloadLength());
	printf("Packet length:               %d\n",GetPacketLength());
	printf("Extension:                   %s\n",HasExtension()?"yes":"no");
	if (HasExtension())
	{
		printf("    Extension ID:            0x%04x\n",GetExtensionID());
		printf("    Extension data:          %s\n",GetExtensionData());
		printf("    Extension length:        %d\n",GetExtensionLength());
	}
}