78 : _npdu(data + data[1] + NPDU_LPDU_DIFF, *this),
79 _tpdu(data + data[1] + TPDU_LPDU_DIFF, *this),
80 _apdu(data + data[1] + APDU_LPDU_DIFF, *this)
83 _ctrl1 =
data +
data[1] + CEMI_HEADER_SIZE;
89 _npdu(_data + NPDU_LPDU_DIFF, *this),
90 _tpdu(_data + TPDU_LPDU_DIFF, *this),
91 _apdu(_data + APDU_LPDU_DIFF, *this)
93 _ctrl1 = _data + CEMI_HEADER_SIZE;
95 memset(_data, 0, apduLength + APDU_LPDU_DIFF);
98 _length = _npdu.
length() + NPDU_LPDU_DIFF;
103 _npdu(_data + NPDU_LPDU_DIFF, *this),
104 _tpdu(_data + TPDU_LPDU_DIFF, *this),
105 _apdu(_data + APDU_LPDU_DIFF, *this)
107 _ctrl1 = _data + CEMI_HEADER_SIZE;
108 _length = other._length;
115 _length = other._length;
117 _ctrl1 = _data + CEMI_HEADER_SIZE;
119 _npdu._data = _data + NPDU_LPDU_DIFF;
120 _tpdu._data = _data + TPDU_LPDU_DIFF;
121 _apdu._data = _data + APDU_LPDU_DIFF;
155 uint8_t octet5 = (_ctrl1[1] & 0xF0) | (_ctrl1[6] & 0x0F);
157 memcpy(
data + 1, _ctrl1 + 2, 4);
159 memcpy(
data + 6, _ctrl1 + 7, len - 7);
163 memcpy(
data, _ctrl1, len - 1);
187 data[0] = _ctrl1[1] & 0x0F;
188 memcpy(
data + 1, _ctrl1 + 2, 4);
189 data[5] = (_ctrl1[1] & 0xF0) | ((_rfLfn & 0x7) << 1) | ((_ctrl1[0] & 0x10) >> 4);
190 memcpy(
data + 6, _ctrl1 + 7, len - 6);
209 for (uint16_t i = 0; i < len; i++)
294 return ((_ctrl1[1] >> 4) & 0x7);
299 _ctrl1[1] &= ~(0x7 << 4);
300 _ctrl1[1] |= ((value & 0x7) << 4);
329 return _rfSerialOrDoA;
374 uint8_t addInfoLen = _data[1];
375 uint8_t apduLen = _data[_data[1] + NPDU_LPDU_DIFF];
377 if (_length != 0 && _length != (addInfoLen + apduLen + NPDU_LPDU_DIFF + 2))
379 print(
"length issue, length: ");
381 print(
" addInfoLen: ");
385 print(
" expected length: ");
386 println(addInfoLen + apduLen + NPDU_LPDU_DIFF + 2);
387 printHex(
"Frame: ", _data, _length,
true);
392 if ((_ctrl1[0] & 0x40) > 0
393 || (_ctrl1[1] & 0xF) > 0
398 print(
"Other issue");
void printHex(const char *suffix, const uint8_t *data, size_t length, bool newline)
uint8_t * pushWord(uint16_t w, uint8_t *data)
const uint8_t * popWord(uint16_t &w, const uint8_t *data)
This class represents an Application Protocol Data Unit.
void fillTelegramRF(uint8_t *data)
CemiFrame & operator=(CemiFrame other)
SystemBroadcast systemBroadcast() const
uint16_t sourceAddress() const
uint8_t * rfSerialOrDoA() const
void fillTelegramTP(uint8_t *data)
CemiFrame(uint8_t *data, uint16_t length)
Repetition repetition() const
uint16_t destinationAddress() const
MessageCode messageCode() const
AddressType addressType() const
uint16_t telegramLengthtTP() const
FrameFormat frameType() const
uint8_t calcCrcTP(uint8_t *buffer, uint16_t len)
Priority priority() const
uint16_t telegramLengthtRF() const
uint16_t totalLenght() const
uint8_t octetCount() const
@ LowPriority
Normal priority of group communication.
@ AckRequested
We want a DataLinkLayer acknowledgement.