mirror of
https://github.com/esphome/esphome.git
synced 2024-12-03 12:14:13 +01:00
4c390d9f9f
Co-authored-by: Oxan van Leeuwen <oxan@oxanvanleeuwen.nl>
65 lines
1.6 KiB
C++
65 lines
1.6 KiB
C++
#include "ndef_record.h"
|
|
|
|
namespace esphome {
|
|
namespace nfc {
|
|
|
|
static const char *const TAG = "nfc.ndef_record";
|
|
|
|
NdefRecord::NdefRecord(std::vector<uint8_t> payload_data) {
|
|
this->payload_ = std::string(payload_data.begin(), payload_data.end());
|
|
}
|
|
|
|
std::vector<uint8_t> NdefRecord::encode(bool first, bool last) {
|
|
std::vector<uint8_t> data;
|
|
|
|
// Get encoded payload, this is overriden by more specific record classes
|
|
std::vector<uint8_t> payload_data = get_encoded_payload();
|
|
|
|
size_t payload_length = payload_data.size();
|
|
|
|
data.push_back(this->create_flag_byte(first, last, payload_length));
|
|
|
|
data.push_back(this->type_.length());
|
|
|
|
if (payload_length <= 255) {
|
|
data.push_back(payload_length);
|
|
} else {
|
|
data.push_back(0);
|
|
data.push_back(0);
|
|
data.push_back((payload_length >> 8) & 0xFF);
|
|
data.push_back(payload_length & 0xFF);
|
|
}
|
|
|
|
if (this->id_.length()) {
|
|
data.push_back(this->id_.length());
|
|
}
|
|
|
|
data.insert(data.end(), this->type_.begin(), this->type_.end());
|
|
|
|
if (this->id_.length()) {
|
|
data.insert(data.end(), this->id_.begin(), this->id_.end());
|
|
}
|
|
|
|
data.insert(data.end(), payload_data.begin(), payload_data.end());
|
|
return data;
|
|
}
|
|
|
|
uint8_t NdefRecord::create_flag_byte(bool first, bool last, size_t payload_size) {
|
|
uint8_t value = this->tnf_ & 0b00000111;
|
|
if (first) {
|
|
value = value | 0x80; // Set MB bit
|
|
}
|
|
if (last) {
|
|
value = value | 0x40; // Set ME bit
|
|
}
|
|
if (payload_size <= 255) {
|
|
value = value | 0x10; // Set SR bit
|
|
}
|
|
if (this->id_.length()) {
|
|
value = value | 0x08; // Set IL bit
|
|
}
|
|
return value;
|
|
};
|
|
|
|
} // namespace nfc
|
|
} // namespace esphome
|