ESPHome 2025.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 {
14namespace pn532 {
15
16static const uint8_t PN532_COMMAND_VERSION_DATA = 0x02;
17static const uint8_t PN532_COMMAND_SAMCONFIGURATION = 0x14;
18static const uint8_t PN532_COMMAND_RFCONFIGURATION = 0x32;
19static const uint8_t PN532_COMMAND_INDATAEXCHANGE = 0x40;
20static const uint8_t PN532_COMMAND_INLISTPASSIVETARGET = 0x4A;
21static const uint8_t PN532_COMMAND_POWERDOWN = 0x16;
22
28
29class PN532BinarySensor;
30
31class PN532 : public PollingComponent {
32 public:
33 void setup() override;
34
35 void dump_config() override;
36
37 void update() override;
38 float get_setup_priority() const override;
39
40 void loop() override;
41 void on_shutdown() override { powerdown(); }
42
43 void register_tag(PN532BinarySensor *tag) { this->binary_sensors_.push_back(tag); }
44 void register_ontag_trigger(nfc::NfcOnTagTrigger *trig) { this->triggers_ontag_.push_back(trig); }
46
47 void add_on_finished_write_callback(std::function<void()> callback) {
48 this->on_finished_write_callback_.add(std::move(callback));
49 }
50
51 bool is_writing() { return this->next_task_ != READ; };
52
53 void read_mode();
54 void clean_mode();
55 void format_mode();
56 void write_mode(nfc::NdefMessage *message);
57 bool powerdown();
58
59 protected:
60 void turn_off_rf_();
61 bool write_command_(const std::vector<uint8_t> &data);
62 bool read_ack_();
63 void send_ack_();
64 void send_nack_();
65
66 enum PN532ReadReady read_ready_(bool block);
67 virtual bool is_read_ready() = 0;
68 virtual bool write_data(const std::vector<uint8_t> &data) = 0;
69 virtual bool read_data(std::vector<uint8_t> &data, uint8_t len) = 0;
70 virtual bool read_response(uint8_t command, std::vector<uint8_t> &data) = 0;
71
72 std::unique_ptr<nfc::NfcTag> read_tag_(std::vector<uint8_t> &uid);
73
74 bool format_tag_(std::vector<uint8_t> &uid);
75 bool clean_tag_(std::vector<uint8_t> &uid);
76 bool write_tag_(std::vector<uint8_t> &uid, nfc::NdefMessage *message);
77
78 std::unique_ptr<nfc::NfcTag> read_mifare_classic_tag_(std::vector<uint8_t> &uid);
79 bool read_mifare_classic_block_(uint8_t block_num, std::vector<uint8_t> &data);
80 bool write_mifare_classic_block_(uint8_t block_num, std::vector<uint8_t> &data);
81 bool auth_mifare_classic_block_(std::vector<uint8_t> &uid, uint8_t block_num, uint8_t key_num, const uint8_t *key);
82 bool format_mifare_classic_mifare_(std::vector<uint8_t> &uid);
83 bool format_mifare_classic_ndef_(std::vector<uint8_t> &uid);
84 bool write_mifare_classic_tag_(std::vector<uint8_t> &uid, nfc::NdefMessage *message);
85
86 std::unique_ptr<nfc::NfcTag> read_mifare_ultralight_tag_(std::vector<uint8_t> &uid);
87 bool read_mifare_ultralight_bytes_(uint8_t start_page, uint16_t num_bytes, std::vector<uint8_t> &data);
88 bool is_mifare_ultralight_formatted_(const std::vector<uint8_t> &page_3_to_6);
90 bool find_mifare_ultralight_ndef_(const std::vector<uint8_t> &page_3_to_6, uint8_t &message_length,
91 uint8_t &message_start_index);
92 bool write_mifare_ultralight_page_(uint8_t page_num, std::vector<uint8_t> &write_data);
93 bool write_mifare_ultralight_tag_(std::vector<uint8_t> &uid, nfc::NdefMessage *message);
95
96 bool updates_enabled_{true};
97 bool requested_read_{false};
98 std::vector<PN532BinarySensor *> binary_sensors_;
99 std::vector<nfc::NfcOnTagTrigger *> triggers_ontag_;
100 std::vector<nfc::NfcOnTagTrigger *> triggers_ontagremoved_;
101 std::vector<uint8_t> current_uid_;
103 uint32_t rd_start_time_{0};
104 enum PN532ReadReady rd_ready_ { WOULDBLOCK };
105 enum NfcTask {
106 READ = 0,
110 } next_task_{READ};
117};
118
120 public:
121 void set_uid(const std::vector<uint8_t> &uid) { uid_ = uid; }
122
123 bool process(std::vector<uint8_t> &data);
124
125 void on_scan_end() {
126 if (!this->found_) {
127 this->publish_state(false);
128 }
129 this->found_ = false;
130 }
131
132 protected:
133 std::vector<uint8_t> uid_;
134 bool found_{false};
135};
136
138 public:
140 parent->add_on_finished_write_callback([this]() { this->trigger(); });
141 }
142};
143
144template<typename... Ts> class PN532IsWritingCondition : public Condition<Ts...>, public Parented<PN532> {
145 public:
146 bool check(Ts... x) override { return this->parent_->is_writing(); }
147};
148
149} // namespace pn532
150} // namespace esphome
Base class for all automation conditions.
Definition automation.h:75
Helper class to easily give an object a parent of type T.
Definition helpers.h:538
This class simplifies creating components that periodically check a state.
Definition component.h:301
void trigger(Ts... x)
Definition automation.h:96
Base class for all binary_sensor-type classes.
void publish_state(bool state)
Publish a new state to the front-end.
void set_uid(const std::vector< uint8_t > &uid)
Definition pn532.h:121
std::vector< uint8_t > uid_
Definition pn532.h:133
bool process(std::vector< uint8_t > &data)
Definition pn532.cpp:450
virtual bool write_data(const std::vector< uint8_t > &data)=0
void add_on_finished_write_callback(std::function< void()> callback)
Definition pn532.h:47
bool write_mifare_classic_block_(uint8_t block_num, std::vector< uint8_t > &data)
enum PN532ReadReady read_ready_(bool block)
Definition pn532.cpp:310
virtual bool is_read_ready()=0
bool format_mifare_classic_ndef_(std::vector< uint8_t > &uid)
bool format_mifare_classic_mifare_(std::vector< uint8_t > &uid)
bool write_tag_(std::vector< uint8_t > &uid, nfc::NdefMessage *message)
Definition pn532.cpp:417
virtual bool read_response(uint8_t command, std::vector< uint8_t > &data)=0
virtual bool read_data(std::vector< uint8_t > &data, uint8_t len)=0
std::vector< PN532BinarySensor * > binary_sensors_
Definition pn532.h:98
void dump_config() override
Definition pn532.cpp:430
void setup() override
Definition pn532.cpp:17
std::unique_ptr< nfc::NfcTag > read_mifare_classic_tag_(std::vector< uint8_t > &uid)
bool find_mifare_ultralight_ndef_(const std::vector< uint8_t > &page_3_to_6, uint8_t &message_length, uint8_t &message_start_index)
void register_ontagremoved_trigger(nfc::NfcOnTagTrigger *trig)
Definition pn532.h:45
enum esphome::pn532::PN532::NfcTask READ
void register_tag(PN532BinarySensor *tag)
Definition pn532.h:43
std::vector< nfc::NfcOnTagTrigger * > triggers_ontagremoved_
Definition pn532.h:100
bool format_tag_(std::vector< uint8_t > &uid)
Definition pn532.cpp:406
float get_setup_priority() const override
Definition pn532.cpp:428
std::unique_ptr< nfc::NfcTag > read_tag_(std::vector< uint8_t > &uid)
Definition pn532.cpp:360
void on_shutdown() override
Definition pn532.h:41
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)
bool write_mifare_ultralight_tag_(std::vector< uint8_t > &uid, nfc::NdefMessage *message)
CallbackManager< void()> on_finished_write_callback_
Definition pn532.h:116
void write_mode(nfc::NdefMessage *message)
Definition pn532.cpp:389
void update() override
Definition pn532.cpp:106
std::vector< nfc::NfcOnTagTrigger * > triggers_ontag_
Definition pn532.h:99
bool read_mifare_ultralight_bytes_(uint8_t start_page, uint16_t num_bytes, std::vector< uint8_t > &data)
enum esphome::pn532::PN532::PN532Error NONE
bool clean_tag_(std::vector< uint8_t > &uid)
Definition pn532.cpp:395
std::unique_ptr< nfc::NfcTag > read_mifare_ultralight_tag_(std::vector< uint8_t > &uid)
bool write_mifare_classic_tag_(std::vector< uint8_t > &uid, nfc::NdefMessage *message)
bool write_mifare_ultralight_page_(uint8_t page_num, std::vector< uint8_t > &write_data)
bool write_command_(const std::vector< uint8_t > &data)
Definition pn532.cpp:246
bool auth_mifare_classic_block_(std::vector< uint8_t > &uid, uint8_t block_num, uint8_t key_num, const uint8_t *key)
nfc::NdefMessage * next_task_message_to_write_
Definition pn532.h:102
void register_ontag_trigger(nfc::NfcOnTagTrigger *trig)
Definition pn532.h:44
std::vector< uint8_t > current_uid_
Definition pn532.h:101
uint32_t rd_start_time_
Definition pn532.h:103
void loop() override
Definition pn532.cpp:126
bool check(Ts... x) override
Definition pn532.h:146
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string size_t len
Definition helpers.h:301
uint16_t x
Definition tt21100.cpp:5