ESPHome 2026.6.0-dev
Loading...
Searching...
No Matches
ndef_record.cpp
Go to the documentation of this file.
1#include "ndef_record.h"
2
3namespace esphome::nfc {
4
5static const char *const TAG = "nfc.ndef_record";
6
7NdefRecord::NdefRecord(std::vector<uint8_t> payload_data) {
8 this->payload_ = std::string(payload_data.begin(), payload_data.end());
9}
10
11std::vector<uint8_t> NdefRecord::encode(bool first, bool last) {
12 std::vector<uint8_t> data;
13
14 // Get encoded payload, this is overridden by more specific record classes
15 std::vector<uint8_t> payload_data = get_encoded_payload();
16
17 size_t payload_length = payload_data.size();
18
19 data.push_back(this->create_flag_byte(first, last, payload_length));
20
21 data.push_back(this->type_.length());
22
23 if (payload_length <= 255) {
24 data.push_back(payload_length);
25 } else {
26 data.push_back(0);
27 data.push_back(0);
28 data.push_back((payload_length >> 8) & 0xFF);
29 data.push_back(payload_length & 0xFF);
30 }
31
32 if (!this->id_.empty()) {
33 data.push_back(this->id_.length());
34 }
35
36 data.insert(data.end(), this->type_.begin(), this->type_.end());
37
38 if (!this->id_.empty()) {
39 data.insert(data.end(), this->id_.begin(), this->id_.end());
40 }
41
42 data.insert(data.end(), payload_data.begin(), payload_data.end());
43 return data;
44}
45
46uint8_t NdefRecord::create_flag_byte(bool first, bool last, size_t payload_size) {
47 uint8_t value = this->tnf_ & 0b00000111;
48 if (first) {
49 value = value | 0x80; // Set MB bit
50 }
51 if (last) {
52 value = value | 0x40; // Set ME bit
53 }
54 if (payload_size <= 255) {
55 value = value | 0x10; // Set SR bit
56 }
57 if (!this->id_.empty()) {
58 value = value | 0x08; // Set IL bit
59 }
60 return value;
61};
62
63} // namespace esphome::nfc
std::vector< uint8_t > encode(bool first, bool last)
virtual std::vector< uint8_t > get_encoded_payload()
Definition ndef_record.h:43
uint8_t create_flag_byte(bool first, bool last, size_t payload_size)
uint32_t payload_size()