10#ifndef M5_UNIT_UNIFIED_NFC_NFC_ISODEP_ISODEP_HPP
11#define M5_UNIT_UNIFIED_NFC_NFC_ISODEP_ISODEP_HPP
17class NFCLayerInterface;
30uint32_t
fwi_to_ms(
const uint8_t fwi,
const float fc);
32constexpr uint16_t MAX_FRAME_SIZE{256};
37inline bool is_i_block(uint8_t pcb)
39 return (pcb & 0xC0) == 0x00;
42inline bool is_r_block(uint8_t pcb)
44 return (pcb & 0xC0) == 0x80;
47inline bool is_s_block(uint8_t pcb)
49 return (pcb & 0xC0) == 0xC0;
52inline bool i_has_more(uint8_t pcb)
54 return (pcb & 0x10) != 0;
57inline uint8_t i_bn(uint8_t pcb)
59 return (pcb >> 0) & 0x01;
62inline bool is_s_wtx(uint8_t pcb)
64 return (pcb & 0xC0) == 0xC0 && (pcb & 0x30) == 0x30;
67inline bool is_valid_rblock(uint8_t pcb)
70 return ((pcb & 0xC0) == 0x80) && ((pcb & 0x26) == 0x22);
73inline bool r_is_nak(uint8_t pcb)
75 return (pcb & 0x10) != 0;
78inline bool r_is_ack(uint8_t pcb)
80 return !r_is_nak(pcb);
83inline uint8_t get_wtxm(uint8_t inf)
88inline bool is_valid_wtxm(uint8_t wtxm)
90 return (wtxm >= 1) && (wtxm <= 59);
93inline uint32_t mul_clamp_u32(uint32_t
a, uint32_t
b, uint32_t maxv)
102 return (
v > maxv) ? maxv :
v;
106inline uint8_t make_i_pcb(uint8_t bn,
bool more,
bool has_cid,
bool has_nad)
111 pcb |= more ? 0x10 : 0x00;
112 pcb |= has_cid ? 0x08 : 0x00;
113 pcb |= has_nad ? 0x04 : 0x00;
118inline uint8_t make_r_ack(uint8_t bn,
bool has_cid)
123 pcb |= has_cid ? 0x08 : 0x00;
128inline uint8_t make_s_wtx_ack(
bool has_cid)
131 pcb |= has_cid ? 0x08 : 0x00;
145 static constexpr uint16_t table[] = {16, 24, 32, 40, 48, 64, 96, 128, 256};
146 return (fsci < (
sizeof(table) /
sizeof(table[0]))) ? table[fsci] : 0;
155 uint16_t pcd_max_frame_tx{};
156 uint16_t pcd_max_frame_rx{};
157 uint32_t fwt_ms{100};
158 uint32_t wtx_max_ms{5000};
166 uint8_t max_retries{2};
175 const auto max_frame = std::min<uint16_t>(pcd_max_frame_tx, fsc);
184 return std::min<uint16_t>(pcd_max_frame_rx, fsc);
200 return 1 + (use_cid ? 1 : 0) + (use_nad ? 1 : 0);
221 policy_t(
const uint32_t fwt,
const uint32_t wtx,
const uint8_t retries)
288 bool transceiveINF(uint8_t* rx_inf, uint16_t& rx_inf_len,
const uint8_t* tx_inf,
const uint16_t tx_inf_len,
289 RxInfo* info =
nullptr,
const policy_t* override_policy =
nullptr);
300 bool transceiveAPDU(uint8_t* rx, uint16_t& rx_len,
const uint8_t* cmd,
const uint16_t cmd_len,
301 const policy_t* override_policy =
nullptr);
311 bool transceive(uint8_t* rx, uint16_t& rx_len,
const uint8_t* tx,
const uint16_t tx_len,
const uint32_t timeout_ms);
316 uint8_t _block_num{};
Common interface for NFC layer.
Definition nfc_layer.hpp:26
ISO Data Exchange Protocol.
Definition isoDEP.hpp:240
void config(const config_t &cfg)
Set configuration.
Definition isoDEP.hpp:271
IsoDEP(NFCLayerInterface &layer, const config_t &c)
Constructor with NFC layer and configuration.
Definition isoDEP.hpp:254
bool transceiveAPDU(uint8_t *rx, uint16_t &rx_len, const uint8_t *cmd, const uint16_t cmd_len, const policy_t *override_policy=nullptr)
Transceive APDU.
Definition isoDEP.cpp:442
IsoDEP(NFCLayerInterface &layer)
Constructor with NFC layer.
Definition isoDEP.hpp:246
bool transceive(uint8_t *rx, uint16_t &rx_len, const uint8_t *tx, const uint16_t tx_len, const uint32_t timeout_ms)
Transceive normal.
Definition isoDEP.cpp:535
config_t config() const
Get configuration.
Definition isoDEP.hpp:262
bool transceiveINF(uint8_t *rx_inf, uint16_t &rx_inf_len, const uint8_t *tx_inf, const uint16_t tx_inf_len, RxInfo *info=nullptr, const policy_t *override_policy=nullptr)
Transceive INF.
Definition isoDEP.cpp:111
uint32_t fwi_to_ms(const uint8_t fwi, const float fc)
Calculate waiting time(ms) by fwi and fc.
Definition isoDEP.cpp:92
uint16_t fsci_to_fsc(const uint8_t fsci)
Convert FSCI to FSC (ISO/IEC 14443-4)
Definition isoDEP.hpp:143
Top level namespace of M5Stack.
RX information.
Definition isoDEP.hpp:231
ISO-DEP configuration.
Definition isoDEP.hpp:153
uint16_t max_frame_size_rx() const
Maximum receive frame size.
Definition isoDEP.hpp:182
uint16_t overhead() const
ISO-DEP frame overhead.
Definition isoDEP.hpp:198
uint16_t fsc_inf_cap() const
Maximum INF capacity allowed by FSC.
Definition isoDEP.hpp:190
uint16_t max_frame_cap_tx() const
Maximum INF payload capacity for transmission.
Definition isoDEP.hpp:173
Per-exchange timeout/retry override for transceiveINF/transceiveAPDU.
Definition isoDEP.hpp:209
uint32_t fwt_ms
Frame waiting time (ms). 0 is clamped to 1 internally.
Definition isoDEP.hpp:210
policy_t(const uint32_t fwt, const uint32_t wtx, const uint8_t retries)
Construct with explicit values (enables positional brace-init under C++11)
Definition isoDEP.hpp:221
uint32_t wtx_max_ms
Upper bound for WTX extension (ms)
Definition isoDEP.hpp:211
uint8_t max_retries
Number of resends (0 = no resend)
Definition isoDEP.hpp:212