17static const uint16_t NFCC_DEFAULT_TIMEOUT = 10;
18static const uint16_t NFCC_INIT_TIMEOUT = 50;
19static const uint16_t NFCC_TAG_WRITE_TIMEOUT = 15;
21static const uint8_t NFCC_MAX_COMM_FAILS = 3;
22static const uint8_t NFCC_MAX_ERROR_COUNT = 10;
24static const uint8_t XCHG_DATA_OID = 0x10;
25static const uint8_t MF_SECTORSEL_OID = 0x32;
26static const uint8_t MFC_AUTHENTICATE_OID = 0x40;
27static const uint8_t TEST_PRBS_OID = 0x30;
28static const uint8_t TEST_ANTENNA_OID = 0x3D;
29static const uint8_t TEST_GET_REGISTER_OID = 0x33;
31static const uint8_t MFC_AUTHENTICATE_PARAM_KS_A = 0x00;
32static const uint8_t MFC_AUTHENTICATE_PARAM_KS_B = 0x80;
33static const uint8_t MFC_AUTHENTICATE_PARAM_EMBED_KEY = 0x10;
35static const uint8_t CARD_EMU_T4T_APP_SELECT[] = {0x00, 0xA4, 0x04, 0x00, 0x07, 0xD2, 0x76,
36 0x00, 0x00, 0x85, 0x01, 0x01, 0x00};
37static const uint8_t CARD_EMU_T4T_CC[] = {0x00, 0x0F, 0x20, 0x00, 0xFF, 0x00, 0xFF, 0x04,
38 0x06, 0xE1, 0x04, 0x00, 0xFF, 0x00, 0x00};
39static const uint8_t CARD_EMU_T4T_CC_SELECT[] = {0x00, 0xA4, 0x00, 0x0C, 0x02, 0xE1, 0x03};
40static const uint8_t CARD_EMU_T4T_NDEF_SELECT[] = {0x00, 0xA4, 0x00, 0x0C, 0x02, 0xE1, 0x04};
41static const uint8_t CARD_EMU_T4T_READ[] = {0x00, 0xB0};
42static const uint8_t CARD_EMU_T4T_WRITE[] = {0x00, 0xD6};
43static const uint8_t CARD_EMU_T4T_OK[] = {0x90, 0x00};
44static const uint8_t CARD_EMU_T4T_NOK[] = {0x6A, 0x82};
46static const uint8_t CORE_CONFIG_SOLO[] = {0x01,
52static const uint8_t CORE_CONFIG_RW_CE[] = {0x01,
58static const uint8_t PMU_CFG[] = {
67static const uint8_t RF_DISCOVER_MAP_CONFIG[] = {
68 nfc::PROT_T1T, nfc::RF_DISCOVER_MAP_MODE_POLL,
70 nfc::PROT_T2T, nfc::RF_DISCOVER_MAP_MODE_POLL,
72 nfc::PROT_T3T, nfc::RF_DISCOVER_MAP_MODE_POLL,
74 nfc::PROT_ISODEP, nfc::RF_DISCOVER_MAP_MODE_POLL | nfc::RF_DISCOVER_MAP_MODE_LISTEN,
76 nfc::PROT_MIFARE, nfc::RF_DISCOVER_MAP_MODE_POLL,
79static const uint8_t RF_DISCOVERY_LISTEN_CONFIG[] = {nfc::MODE_LISTEN_MASK | nfc::TECH_PASSIVE_NFCA,
80 nfc::MODE_LISTEN_MASK | nfc::TECH_PASSIVE_NFCB,
81 nfc::MODE_LISTEN_MASK | nfc::TECH_PASSIVE_NFCF};
83static const uint8_t RF_DISCOVERY_POLL_CONFIG[] = {nfc::MODE_POLL | nfc::TECH_PASSIVE_NFCA,
84 nfc::MODE_POLL | nfc::TECH_PASSIVE_NFCB,
85 nfc::MODE_POLL | nfc::TECH_PASSIVE_NFCF};
87static const uint8_t RF_DISCOVERY_CONFIG[] = {nfc::MODE_POLL | nfc::TECH_PASSIVE_NFCA,
88 nfc::MODE_POLL | nfc::TECH_PASSIVE_NFCB,
89 nfc::MODE_POLL | nfc::TECH_PASSIVE_NFCF,
90 nfc::MODE_LISTEN_MASK | nfc::TECH_PASSIVE_NFCA,
91 nfc::MODE_LISTEN_MASK | nfc::TECH_PASSIVE_NFCB,
92 nfc::MODE_LISTEN_MASK | nfc::TECH_PASSIVE_NFCF};
94static const uint8_t RF_LISTEN_MODE_ROUTING_CONFIG[] = {0x00,
141 std::unique_ptr<nfc::NfcTag>
tag;
147 void setup()
override;
150 void loop()
override;
187 uint8_t
set_test_mode(
TestMode test_mode,
const std::vector<uint8_t> &data, std::vector<uint8_t> &result);
190 uint8_t
reset_core_(
bool reset_config,
bool power);
202 uint8_t
deactivate_(uint8_t
type, uint16_t timeout = NFCC_DEFAULT_TIMEOUT);
209 uint8_t
write_endpoint_(std::vector<uint8_t> &uid, std::shared_ptr<nfc::NdefMessage> &message);
211 std::unique_ptr<nfc::NfcTag>
build_tag_(uint8_t mode_tech,
const std::vector<uint8_t> &data);
232 bool expect_notification =
true);
236 uint8_t
wait_for_irq_(uint16_t timeout = NFCC_DEFAULT_TIMEOUT,
bool pin_state =
true);
253 uint8_t &message_start_index);
void process_message_()
parse & process incoming messages from the NFCC
uint8_t wait_for_irq_(uint16_t timeout=NFCC_DEFAULT_TIMEOUT, bool pin_state=true)
std::vector< nfc::NfcOnTagTrigger * > triggers_ontagremoved_
void register_ontagremoved_trigger(nfc::NfcOnTagTrigger *trig)
bool core_config_is_solo_
std::shared_ptr< nfc::NdefMessage > next_task_message_to_write_
uint8_t write_mifare_classic_tag_(const std::shared_ptr< nfc::NdefMessage > &message)
uint8_t transceive_(nfc::NciMessage &tx, nfc::NciMessage &rx, uint16_t timeout=NFCC_DEFAULT_TIMEOUT, bool expect_notification=true)
std::unique_ptr< nfc::NfcTag > build_tag_(uint8_t mode_tech, const std::vector< uint8_t > &data)
void nci_fsm_transition_()
advance controller state as required
uint8_t read_mifare_ultralight_tag_(nfc::NfcTag &tag)
uint8_t read_mifare_ultralight_bytes_(uint8_t start_page, uint16_t num_bytes, std::vector< uint8_t > &data)
CardEmulationState ce_state_
uint8_t find_mifare_ultralight_ndef_(const std::vector< uint8_t > &page_3_to_6, uint8_t &message_length, uint8_t &message_start_index)
void set_irq_pin(GPIOPin *irq_pin)
std::vector< DiscoveredEndpoint > discovered_endpoint_
void process_rf_intf_activated_oid_(nfc::NciMessage &rx)
uint8_t format_mifare_classic_mifare_()
void card_emu_t4t_get_response_(std::vector< uint8_t > &response, std::vector< uint8_t > &ndef_response)
uint8_t deactivate_(uint8_t type, uint16_t timeout=NFCC_DEFAULT_TIMEOUT)
uint8_t halt_mifare_classic_tag_()
void process_data_message_(nfc::NciMessage &rx)
void set_ven_pin(GPIOPin *ven_pin)
virtual uint8_t read_nfcc(nfc::NciMessage &rx, uint16_t timeout)=0
bool nci_fsm_set_error_state_(NCIState new_state)
setting controller to this state caused an error; returns true if too many errors/failures
uint8_t write_mifare_ultralight_page_(uint8_t page_num, std::vector< uint8_t > &write_data)
uint8_t clean_endpoint_(std::vector< uint8_t > &uid)
uint8_t write_mifare_ultralight_tag_(std::vector< uint8_t > &uid, const std::shared_ptr< nfc::NdefMessage > &message)
void set_tag_ttl(uint32_t ttl)
void set_tag_emulation_message(std::shared_ptr< nfc::NdefMessage > message)
void set_tag_write_message(std::shared_ptr< nfc::NdefMessage > message)
float get_setup_priority() const override
uint8_t read_mifare_classic_block_(uint8_t block_num, std::vector< uint8_t > &data)
void set_tag_emulation_on()
uint8_t set_listen_mode_routing_()
NCIState nci_state_error_
uint16_t read_mifare_ultralight_capacity_()
uint8_t format_endpoint_(std::vector< uint8_t > &uid)
void process_rf_deactivate_oid_(nfc::NciMessage &rx)
void add_on_emulated_tag_scan_callback(std::function< void()> callback)
uint8_t refresh_core_config_()
uint8_t write_mifare_classic_block_(uint8_t block_num, std::vector< uint8_t > &data)
bool is_mifare_ultralight_formatted_(const std::vector< uint8_t > &page_3_to_6)
uint8_t write_endpoint_(std::vector< uint8_t > &uid, std::shared_ptr< nfc::NdefMessage > &message)
uint8_t selecting_endpoint_
bool tag_emulation_enabled()
void register_ontag_trigger(nfc::NfcOnTagTrigger *trig)
uint8_t send_init_config_()
void erase_tag_(uint8_t tag_index)
uint8_t clean_mifare_ultralight_()
void add_on_finished_write_callback(std::function< void()> callback)
uint8_t set_test_mode(TestMode test_mode, const std::vector< uint8_t > &data, std::vector< uint8_t > &result)
CallbackManager< void()> on_finished_write_callback_
uint8_t format_mifare_classic_ndef_()
bool config_refresh_pending_
uint8_t read_mifare_classic_tag_(nfc::NfcTag &tag)
uint8_t reset_core_(bool reset_config, bool power)
uint8_t send_core_config_()
optional< size_t > find_tag_uid_(const std::vector< uint8_t > &uid)
void set_tag_emulation_off()
void nci_fsm_set_state_(NCIState new_state)
set new controller state
uint8_t stop_discovery_()
uint8_t read_endpoint_data_(nfc::NfcTag &tag)
std::vector< nfc::NfcOnTagTrigger * > triggers_ontag_
void dump_config() override
uint8_t auth_mifare_classic_block_(uint8_t block_num, uint8_t key_num, const uint8_t *key)
uint8_t set_discover_map_()
CallbackManager< void()> on_emulated_tag_scan_callback_
uint32_t last_nci_state_change_
uint8_t start_discovery_()
void process_rf_discover_oid_(nfc::NciMessage &rx)
std::shared_ptr< nfc::NdefMessage > card_emulation_message_
uint8_t sect_to_auth_(uint8_t block_num)
enum esphome::pn7150::PN7150::NfcTask EP_READ
virtual uint8_t write_nfcc(nfc::NciMessage &tx)=0
@ CARD_EMU_NDEF_APP_SELECTED
@ RFST_W4_ALL_DISCOVERIES
@ NFCC_SET_LISTEN_MODE_ROUTING
const float DATA
For components that import data from directly connected sensors like DHT.
Providing packet encoding functions for exchanging data with a remote host.
std::unique_ptr< nfc::NfcTag > tag