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; };
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()); } }