ESPHome 2026.5.0
Loading...
Searching...
No Matches
pn532.h
Go to the documentation of this file.
1#pragma once
2
9
10#include <cinttypes>
11#include <vector>
12
13namespace esphome::pn532 {
14
15static const uint8_t PN532_COMMAND_VERSION_DATA = 0x02;
16static const uint8_t PN532_COMMAND_SAMCONFIGURATION = 0x14;
17static const uint8_t PN532_COMMAND_RFCONFIGURATION = 0x32;
18static const uint8_t PN532_COMMAND_INDATAEXCHANGE = 0x40;
19static const uint8_t PN532_COMMAND_INLISTPASSIVETARGET = 0x4A;
20static const uint8_t PN532_COMMAND_POWERDOWN = 0x16;
21
27
28class PN532BinarySensor;
29
30class PN532 : public PollingComponent {
31 public:
32 void setup() override;
33
34 void dump_config() override;
35
36 void update() override;
37
38 void loop() override;
39 void on_powerdown() override { powerdown(); }
40
41 void register_tag(PN532BinarySensor *tag) { this->binary_sensors_.push_back(tag); }
42 void register_ontag_trigger(nfc::NfcOnTagTrigger *trig) { this->triggers_ontag_.push_back(trig); }
44
45 template<typename F> void add_on_finished_write_callback(F &&callback) {
46 this->on_finished_write_callback_.add(std::forward<F>(callback));
47 }
48
49 bool is_writing() { return this->next_task_ != READ; };
50
51 void read_mode();
52 void clean_mode();
53 void format_mode();
55 bool powerdown();
56
57 protected:
58 void turn_off_rf_();
59 bool write_command_(const std::vector<uint8_t> &data);
60 bool read_ack_();
61 void send_ack_();
62 void send_nack_();
63
64 enum PN532ReadReady read_ready_(bool block);
65 virtual bool is_read_ready() = 0;
66 virtual bool write_data(const std::vector<uint8_t> &data) = 0;
67 virtual bool read_data(std::vector<uint8_t> &data, uint8_t len) = 0;
68 virtual bool read_response(uint8_t command, std::vector<uint8_t> &data) = 0;
69
70 std::unique_ptr<nfc::NfcTag> read_tag_(nfc::NfcTagUid &uid);
71
72 bool format_tag_(nfc::NfcTagUid &uid);
73 bool clean_tag_(nfc::NfcTagUid &uid);
75
76 std::unique_ptr<nfc::NfcTag> read_mifare_classic_tag_(nfc::NfcTagUid &uid);
77 bool read_mifare_classic_block_(uint8_t block_num, std::vector<uint8_t> &data);
78 bool write_mifare_classic_block_(uint8_t block_num, const uint8_t *data, size_t len);
79 bool auth_mifare_classic_block_(nfc::NfcTagUid &uid, uint8_t block_num, uint8_t key_num, const uint8_t *key);
83
84 std::unique_ptr<nfc::NfcTag> read_mifare_ultralight_tag_(nfc::NfcTagUid &uid);
85 bool read_mifare_ultralight_bytes_(uint8_t start_page, uint16_t num_bytes, std::vector<uint8_t> &data);
86 bool is_mifare_ultralight_formatted_(const std::vector<uint8_t> &page_3_to_6);
88 bool find_mifare_ultralight_ndef_(const std::vector<uint8_t> &page_3_to_6, uint8_t &message_length,
89 uint8_t &message_start_index);
90 bool write_mifare_ultralight_page_(uint8_t page_num, const uint8_t *write_data, size_t len);
93
94 bool updates_enabled_{true};
95 bool requested_read_{false};
96 std::vector<PN532BinarySensor *> binary_sensors_;
97 std::vector<nfc::NfcOnTagTrigger *> triggers_ontag_;
98 std::vector<nfc::NfcOnTagTrigger *> triggers_ontagremoved_;
101 optional<uint32_t> rd_start_time_{};
102 enum PN532ReadReady rd_ready_ { WOULDBLOCK };
103 enum NfcTask {
104 READ = 0,
108 } next_task_{READ};
115};
116
118 public:
119 void set_uid(const nfc::NfcTagUid &uid) { uid_ = uid; }
120
121 bool process(const nfc::NfcTagUid &data);
122
123 void on_scan_end() {
124 if (!this->found_) {
125 this->publish_state(false);
126 }
127 this->found_ = false;
128 }
129
130 protected:
132 bool found_{false};
133};
134
135template<typename... Ts> class PN532IsWritingCondition : public Condition<Ts...>, public Parented<PN532> {
136 public:
137 bool check(const Ts &...x) override { return this->parent_->is_writing(); }
138};
139
140} // namespace esphome::pn532
Base class for all automation conditions.
Definition automation.h:459
Helper class to easily give an object a parent of type T.
Definition helpers.h:1861
This class simplifies creating components that periodically check a state.
Definition component.h:602
Base class for all binary_sensor-type classes.
void publish_state(bool new_state)
Publish a new state to the front-end.
bool process(const nfc::NfcTagUid &data)
Definition pn532.cpp:446
void set_uid(const nfc::NfcTagUid &uid)
Definition pn532.h:119
virtual bool write_data(const std::vector< uint8_t > &data)=0
nfc::NfcTagUid current_uid_
Definition pn532.h:99
void add_on_finished_write_callback(F &&callback)
Definition pn532.h:45
enum PN532ReadReady read_ready_(bool block)
Definition pn532.cpp:307
bool auth_mifare_classic_block_(nfc::NfcTagUid &uid, uint8_t block_num, uint8_t key_num, const uint8_t *key)
virtual bool is_read_ready()=0
optional< uint32_t > rd_start_time_
Definition pn532.h:101
bool format_mifare_classic_mifare_(nfc::NfcTagUid &uid)
std::unique_ptr< nfc::NfcTag > read_mifare_ultralight_tag_(nfc::NfcTagUid &uid)
virtual bool read_response(uint8_t command, std::vector< uint8_t > &data)=0
bool write_mifare_ultralight_page_(uint8_t page_num, const uint8_t *write_data, size_t len)
virtual bool read_data(std::vector< uint8_t > &data, uint8_t len)=0
std::vector< PN532BinarySensor * > binary_sensors_
Definition pn532.h:96
bool format_mifare_classic_ndef_(nfc::NfcTagUid &uid)
void dump_config() override
Definition pn532.cpp:426
void setup() override
Definition pn532.cpp:16
bool write_mifare_classic_tag_(nfc::NfcTagUid &uid, nfc::NdefMessage *message)
bool find_mifare_ultralight_ndef_(const std::vector< uint8_t > &page_3_to_6, uint8_t &message_length, uint8_t &message_start_index)
std::unique_ptr< nfc::NfcTag > read_mifare_classic_tag_(nfc::NfcTagUid &uid)
void register_ontagremoved_trigger(nfc::NfcOnTagTrigger *trig)
Definition pn532.h:43
enum esphome::pn532::PN532::NfcTask READ
void register_tag(PN532BinarySensor *tag)
Definition pn532.h:41
std::vector< nfc::NfcOnTagTrigger * > triggers_ontagremoved_
Definition pn532.h:98
void on_powerdown() override
Definition pn532.h:39
bool is_mifare_ultralight_formatted_(const std::vector< uint8_t > &page_3_to_6)
bool read_mifare_classic_block_(uint8_t block_num, std::vector< uint8_t > &data)
CallbackManager< void()> on_finished_write_callback_
Definition pn532.h:114
void write_mode(nfc::NdefMessage *message)
Definition pn532.cpp:387
void update() override
Definition pn532.cpp:102
std::vector< nfc::NfcOnTagTrigger * > triggers_ontag_
Definition pn532.h:97
bool read_mifare_ultralight_bytes_(uint8_t start_page, uint16_t num_bytes, std::vector< uint8_t > &data)
bool write_mifare_ultralight_tag_(nfc::NfcTagUid &uid, nfc::NdefMessage *message)
enum esphome::pn532::PN532::PN532Error NONE
bool clean_tag_(nfc::NfcTagUid &uid)
Definition pn532.cpp:393
bool write_command_(const std::vector< uint8_t > &data)
Definition pn532.cpp:243
bool format_tag_(nfc::NfcTagUid &uid)
Definition pn532.cpp:404
bool write_mifare_classic_block_(uint8_t block_num, const uint8_t *data, size_t len)
nfc::NdefMessage * next_task_message_to_write_
Definition pn532.h:100
void register_ontag_trigger(nfc::NfcOnTagTrigger *trig)
Definition pn532.h:42
bool write_tag_(nfc::NfcTagUid &uid, nfc::NdefMessage *message)
Definition pn532.cpp:415
std::unique_ptr< nfc::NfcTag > read_tag_(nfc::NfcTagUid &uid)
Definition pn532.cpp:358
void loop() override
Definition pn532.cpp:122
bool check(const Ts &...x) override
Definition pn532.h:137
const char * message
Definition component.cpp:35
const char * tag
Definition log.h:74
std::string size_t len
uint16_t x
Definition tt21100.cpp:5