fw: robust HTTP body reads, CORS preflight, LED off at boot; update docs
- app_net.c: replace bare httpd_req_recv with recv_body_capped/alloc helpers (TCP-safe, full-body reads); add OPTIONS/* CORS preflight handler; bump WS broadcast buffer to 2048; add CORS Allow-Methods - CMakeLists (net_service): add http_parser dep for HTTP_OPTIONS - nfc_engine/pn532_core: add nfc_access_lock/unlock mutex, board-RGB quiet helper, UL type detection, general-status improvements - pn532_transport: minor cleanup - main.c: call board_rgb_led_quiet() at boot to kill onboard LED - sdkconfig.defaults: add board RGB Kconfig defaults - README, docs/LIMITATIONS, docs/PINOUT: expand and correct Made-with: Cursor
This commit is contained in:
@@ -57,6 +57,20 @@ esp_err_t pn532_in_communicate_thru(const uint8_t *data, size_t data_len,
|
||||
uint8_t *response, size_t response_max,
|
||||
size_t *response_len);
|
||||
|
||||
/** Enter PN532 target mode using TgInitAsTarget parameters (mode + target descriptors + optional GT). */
|
||||
esp_err_t pn532_tg_init_as_target(const uint8_t *params, size_t params_len,
|
||||
uint8_t *response, size_t response_max,
|
||||
size_t *response_len, int timeout_ms);
|
||||
|
||||
/** Receive bytes from the initiator while PN532 is in target mode. */
|
||||
esp_err_t pn532_tg_get_data(uint8_t *response, size_t response_max,
|
||||
size_t *response_len, int timeout_ms);
|
||||
|
||||
/** Send bytes back to the initiator while PN532 is in target mode. */
|
||||
esp_err_t pn532_tg_set_data(const uint8_t *data, size_t data_len,
|
||||
uint8_t *response, size_t response_max,
|
||||
size_t *response_len, int timeout_ms);
|
||||
|
||||
/** RF field on/off via RFConfiguration (0x32) item 0x01, RF field */
|
||||
esp_err_t pn532_rf_field(bool on);
|
||||
|
||||
|
||||
@@ -190,3 +190,81 @@ esp_err_t pn532_in_communicate_thru(const uint8_t *data, size_t data_len, uint8_
|
||||
*response_len = payload_len;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t pn532_tg_init_as_target(const uint8_t *params, size_t params_len, uint8_t *response,
|
||||
size_t response_max, size_t *response_len, int timeout_ms)
|
||||
{
|
||||
if (!params || !response || !response_len || params_len == 0 || params_len > PN532_EEPROM_MAX_CMD_PAYLOAD - 1) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
uint8_t buf[PN532_EEPROM_MAX_CMD_PAYLOAD];
|
||||
buf[0] = PN532_CMD_TGINITASTARGET;
|
||||
memcpy(buf + 1, params, params_len);
|
||||
uint8_t raw[PN532_EEPROM_MAX_CMD_PAYLOAD];
|
||||
size_t raw_len = 0;
|
||||
esp_err_t e = pn532_send_cmd(buf, 1 + params_len, raw, sizeof(raw), &raw_len, timeout_ms);
|
||||
if (e != ESP_OK) {
|
||||
return e;
|
||||
}
|
||||
if (raw_len < 2 || raw[0] != (uint8_t)(PN532_CMD_TGINITASTARGET + 1)) {
|
||||
return ESP_ERR_INVALID_RESPONSE;
|
||||
}
|
||||
size_t payload_len = raw_len - 1;
|
||||
if (payload_len > response_max) {
|
||||
return ESP_ERR_INVALID_SIZE;
|
||||
}
|
||||
memcpy(response, raw + 1, payload_len);
|
||||
*response_len = payload_len;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t pn532_tg_get_data(uint8_t *response, size_t response_max, size_t *response_len, int timeout_ms)
|
||||
{
|
||||
if (!response || !response_len) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
uint8_t cmd = PN532_CMD_TGGETDATA;
|
||||
uint8_t raw[PN532_EEPROM_MAX_CMD_PAYLOAD];
|
||||
size_t raw_len = 0;
|
||||
esp_err_t e = pn532_send_cmd(&cmd, 1, raw, sizeof(raw), &raw_len, timeout_ms);
|
||||
if (e != ESP_OK) {
|
||||
return e;
|
||||
}
|
||||
if (raw_len < 2 || raw[0] != (uint8_t)(PN532_CMD_TGGETDATA + 1)) {
|
||||
return ESP_ERR_INVALID_RESPONSE;
|
||||
}
|
||||
size_t payload_len = raw_len - 1;
|
||||
if (payload_len > response_max) {
|
||||
return ESP_ERR_INVALID_SIZE;
|
||||
}
|
||||
memcpy(response, raw + 1, payload_len);
|
||||
*response_len = payload_len;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t pn532_tg_set_data(const uint8_t *data, size_t data_len, uint8_t *response, size_t response_max,
|
||||
size_t *response_len, int timeout_ms)
|
||||
{
|
||||
if (!data || !response || !response_len || data_len == 0 || data_len > PN532_EEPROM_MAX_CMD_PAYLOAD - 1) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
uint8_t buf[PN532_EEPROM_MAX_CMD_PAYLOAD];
|
||||
buf[0] = PN532_CMD_TGSETDATA;
|
||||
memcpy(buf + 1, data, data_len);
|
||||
uint8_t raw[PN532_EEPROM_MAX_CMD_PAYLOAD];
|
||||
size_t raw_len = 0;
|
||||
esp_err_t e = pn532_send_cmd(buf, 1 + data_len, raw, sizeof(raw), &raw_len, timeout_ms);
|
||||
if (e != ESP_OK) {
|
||||
return e;
|
||||
}
|
||||
if (raw_len < 2 || raw[0] != (uint8_t)(PN532_CMD_TGSETDATA + 1)) {
|
||||
return ESP_ERR_INVALID_RESPONSE;
|
||||
}
|
||||
size_t payload_len = raw_len - 1;
|
||||
if (payload_len > response_max) {
|
||||
return ESP_ERR_INVALID_SIZE;
|
||||
}
|
||||
memcpy(response, raw + 1, payload_len);
|
||||
*response_len = payload_len;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
@@ -352,7 +352,7 @@ esp_err_t pn532_transport_exchange(const uint8_t *tx_body, size_t tx_body_len, u
|
||||
#if defined(CONFIG_PN532_TRANSPORT_SPI)
|
||||
ESP_RETURN_ON_ERROR(spi_write_frame(frame, pos), TAG, "spi wr");
|
||||
#elif defined(CONFIG_PN532_TRANSPORT_I2C)
|
||||
i2c_wakeup();
|
||||
ESP_RETURN_ON_ERROR(i2c_wakeup(), TAG, "i2c wake");
|
||||
ESP_RETURN_ON_ERROR(i2c_write_raw(frame, pos), TAG, "i2c wr");
|
||||
#elif defined(CONFIG_PN532_TRANSPORT_HSU)
|
||||
ESP_RETURN_ON_ERROR(hsu_write_raw(frame, pos), TAG, "hsu wr");
|
||||
|
||||
Reference in New Issue
Block a user