mirror of
https://github.com/thelsing/knx.git
synced 2025-01-21 00:05:43 +01:00
54 lines
931 B
C++
54 lines
931 B
C++
#include "apdu.h"
|
|
#include "cemi_frame.h"
|
|
#include "bits.h"
|
|
|
|
APDU::APDU(uint8_t* data, CemiFrame& frame): _data(data), _frame(frame)
|
|
{
|
|
}
|
|
|
|
ApduType APDU::type()
|
|
{
|
|
uint16_t apci;
|
|
apci = getWord(_data);
|
|
popWord(apci, _data);
|
|
apci &= 0x3ff;
|
|
if ((apci >> 6) < 11) //short apci
|
|
apci &= 0x3c0;
|
|
return (ApduType)apci;
|
|
}
|
|
|
|
void APDU::type(ApduType atype)
|
|
{
|
|
// ApduType is in big endian so convert to host first, pushWord converts back
|
|
pushWord((uint16_t)atype, _data);
|
|
}
|
|
|
|
uint8_t* APDU::data()
|
|
{
|
|
return _data + 1;
|
|
}
|
|
|
|
CemiFrame& APDU::frame()
|
|
{
|
|
return _frame;
|
|
}
|
|
|
|
uint8_t APDU::length() const
|
|
{
|
|
return _frame.npdu().octetCount();
|
|
}
|
|
|
|
void APDU::printPDU()
|
|
{
|
|
_print("APDU: ");
|
|
_print(type(), HEX);
|
|
_print(" ");
|
|
_print(_data[0] & 0x3, HEX);
|
|
for (uint8_t i = 1; i < length() + 1; ++i)
|
|
{
|
|
if (i) _print(" ");
|
|
_print(_data[i], HEX);
|
|
}
|
|
_println();
|
|
}
|